VirtualBox

Changeset 59640 in vbox for trunk/src/VBox/Additions


Ignore:
Timestamp:
Feb 12, 2016 8:29:09 AM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
105490
Message:

bugref:8087: Additions/x11: support non-root X server: more adjustment of the DRM driver back to kernel coding style and removal of some dead code.

Location:
trunk/src/VBox/Additions/linux/drm
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/linux/drm/vbox_drv.h

    r59635 r59640  
    196196#endif
    197197
    198 void vbox_enable_vbva(struct vbox_private *vbox, unsigned crtc_id);
     198void vbox_enable_accel(struct vbox_private *vbox, unsigned crtc_id);
    199199void vbox_enable_caps(struct vbox_private *vbox);
    200200
  • trunk/src/VBox/Additions/linux/drm/vbox_fb.c

    r59568 r59640  
    7777 * themselves.  Update: we also do the same for reporting hot-plug support. I
    7878 * wonder whether we should allow it at all on the console. */
    79 static int VBoxSetPar(struct fb_info *pInfo)
    80 {
    81     struct vbox_fbdev *pVFBDev = pInfo->par;
     79static int vbox_set_par(struct fb_info *info)
     80{
     81    struct vbox_fbdev *fbdev = info->par;
    8282    struct drm_device *dev;
    83     struct vbox_private *pVBox;
     83    struct vbox_private *vbox;
    8484    unsigned i;
    8585
    8686    LogFunc(("vboxvideo: %d\n", __LINE__));
    87     dev = pVFBDev->helper.dev;
    88     pVBox = dev->dev_private;
     87    dev = fbdev->helper.dev;
     88    vbox = dev->dev_private;
    8989    vbox_refresh_modes(dev);
    90     for (i = 0; i < pVBox->num_crtcs; ++i)
    91         VBoxVBVADisable(&pVBox->vbva_info[i], &pVBox->submit_info, i);
    92     VBoxHGSMISendCapsInfo(&pVBox->submit_info, 0);
    93     return drm_fb_helper_set_par(pInfo);
     90    for (i = 0; i < vbox->num_crtcs; ++i)
     91        VBoxVBVADisable(&vbox->vbva_info[i], &vbox->submit_info, i);
     92    VBoxHGSMISendCapsInfo(&vbox->submit_info, 0);
     93    return drm_fb_helper_set_par(info);
    9494}
    9595
     
    9797 * Tell the host about dirty rectangles to update.
    9898 */
    99 static void vbox_dirty_update(struct vbox_fbdev *afbdev,
     99static void vbox_dirty_update(struct vbox_fbdev *fbdev,
    100100                 int x, int y, int width, int height)
    101101{
    102     struct drm_device *dev = afbdev->helper.dev;
     102    struct drm_device *dev = fbdev->helper.dev;
    103103    struct vbox_private *vbox = dev->dev_private;
    104104    int i;
     
    107107    struct vbox_bo *bo;
    108108    int src_offset, dst_offset;
    109     int bpp = (afbdev->afb.base.bits_per_pixel + 7)/8;
     109    int bpp = (fbdev->afb.base.bits_per_pixel + 7)/8;
    110110    int ret = -EBUSY;
    111111    bool unmap = false;
     
    116116
    117117    LogFunc(("vboxvideo: %d\n", __LINE__));
    118     obj = afbdev->afb.obj;
     118    obj = fbdev->afb.obj;
    119119    bo = gem_to_vbox_bo(obj);
    120120
     
    137137    spin_lock_irqsave(&vbox->dev_lock, flags);
    138138
    139     if (afbdev->y1 < y)
    140         y = afbdev->y1;
    141     if (afbdev->y2 > y2)
    142         y2 = afbdev->y2;
    143     if (afbdev->x1 < x)
    144         x = afbdev->x1;
    145     if (afbdev->x2 > x2)
    146         x2 = afbdev->x2;
     139    if (fbdev->y1 < y)
     140        y = fbdev->y1;
     141    if (fbdev->y2 > y2)
     142        y2 = fbdev->y2;
     143    if (fbdev->x1 < x)
     144        x = fbdev->x1;
     145    if (fbdev->x2 > x2)
     146        x2 = fbdev->x2;
    147147
    148148    if (store_for_later) {
    149         afbdev->x1 = x;
    150         afbdev->x2 = x2;
    151         afbdev->y1 = y;
    152         afbdev->y2 = y2;
     149        fbdev->x1 = x;
     150        fbdev->x2 = x2;
     151        fbdev->y1 = y;
     152        fbdev->y2 = y2;
    153153        spin_unlock_irqrestore(&vbox->dev_lock, flags);
    154154        LogFunc(("vboxvideo: %d\n", __LINE__));
     
    156156    }
    157157
    158     afbdev->x1 = afbdev->y1 = INT_MAX;
    159     afbdev->x2 = afbdev->y2 = 0;
     158    fbdev->x1 = fbdev->y1 = INT_MAX;
     159    fbdev->x2 = fbdev->y2 = 0;
    160160    spin_unlock_irqrestore(&vbox->dev_lock, flags);
    161161
     
    171171    for (i = y; i <= y2; i++) {
    172172        /* assume equal stride for now */
    173         src_offset = dst_offset = i * afbdev->afb.base.pitches[0] + (x * bpp);
    174         memcpy_toio(bo->kmap.virtual + src_offset, (char *)afbdev->sysram + src_offset, (x2 - x + 1) * bpp);
     173        src_offset = dst_offset = i * fbdev->afb.base.pitches[0] + (x * bpp);
     174        memcpy_toio(bo->kmap.virtual + src_offset, (char *)fbdev->sysram + src_offset, (x2 - x + 1) * bpp);
    175175    }
    176176    /* Not sure why the original code subtracted 1 here, but I will keep it that
     
    180180    rect.y1 = y;
    181181    rect.y2 = y2 + 1;
    182     vbox_framebuffer_dirty_rectangles(&afbdev->afb.base, &rect, 1);
    183     LogFunc(("vboxvideo: %d, bo->kmap.virtual=%p, afbdev->sysram=%p, x=%d, y=%d, x2=%d, y2=%d, unmap=%RTbool\n",
    184              __LINE__, bo->kmap.virtual, afbdev->sysram, (int)x, (int)y, (int)x2, (int)y2, unmap));
     182    vbox_framebuffer_dirty_rectangles(&fbdev->afb.base, &rect, 1);
     183    LogFunc(("vboxvideo: %d, bo->kmap.virtual=%p, fbdev->sysram=%p, x=%d, y=%d, x2=%d, y2=%d, unmap=%RTbool\n",
     184             __LINE__, bo->kmap.virtual, fbdev->sysram, (int)x, (int)y, (int)x2, (int)y2, unmap));
    185185    if (unmap)
    186186        ttm_bo_kunmap(&bo->kmap);
     
    192192             const struct fb_fillrect *rect)
    193193{
    194     struct vbox_fbdev *afbdev = info->par;
     194    struct vbox_fbdev *fbdev = info->par;
    195195    LogFunc(("vboxvideo: %d\n", __LINE__));
    196196    sys_fillrect(info, rect);
    197     vbox_dirty_update(afbdev, rect->dx, rect->dy, rect->width,
     197    vbox_dirty_update(fbdev, rect->dx, rect->dy, rect->width,
    198198             rect->height);
    199199}
     
    202202             const struct fb_copyarea *area)
    203203{
    204     struct vbox_fbdev *afbdev = info->par;
     204    struct vbox_fbdev *fbdev = info->par;
    205205    LogFunc(("vboxvideo: %d\n", __LINE__));
    206206    sys_copyarea(info, area);
    207     vbox_dirty_update(afbdev, area->dx, area->dy, area->width,
     207    vbox_dirty_update(fbdev, area->dx, area->dy, area->width,
    208208             area->height);
    209209}
     
    212212              const struct fb_image *image)
    213213{
    214     struct vbox_fbdev *afbdev = info->par;
     214    struct vbox_fbdev *fbdev = info->par;
    215215    LogFunc(("vboxvideo: %d\n", __LINE__));
    216216    sys_imageblit(info, image);
    217     vbox_dirty_update(afbdev, image->dx, image->dy, image->width,
     217    vbox_dirty_update(fbdev, image->dx, image->dy, image->width,
    218218             image->height);
    219219}
     
    222222    .owner = THIS_MODULE,
    223223    .fb_check_var = drm_fb_helper_check_var,
    224     .fb_set_par = VBoxSetPar,
     224    .fb_set_par = vbox_set_par,
    225225    .fb_fillrect = vbox_fillrect,
    226226    .fb_copyarea = vbox_copyarea,
     
    233233};
    234234
    235 static int vboxfb_create_object(struct vbox_fbdev *afbdev,
     235static int vboxfb_create_object(struct vbox_fbdev *fbdev,
    236236                   struct DRM_MODE_FB_CMD *mode_cmd,
    237237                   struct drm_gem_object **gobj_p)
    238238{
    239     struct drm_device *dev = afbdev->helper.dev;
     239    struct drm_device *dev = fbdev->helper.dev;
    240240    u32 bpp, depth;
    241241    u32 size;
     
    264264            struct drm_fb_helper_surface_size *sizes)
    265265{
    266     struct vbox_fbdev *afbdev =
     266    struct vbox_fbdev *fbdev =
    267267            container_of(helper, struct vbox_fbdev, helper);
    268     struct drm_device *dev = afbdev->helper.dev;
     268    struct drm_device *dev = fbdev->helper.dev;
    269269    struct DRM_MODE_FB_CMD mode_cmd;
    270270    struct drm_framebuffer *fb;
     
    293293    size = pitch * mode_cmd.height;
    294294
    295     ret = vboxfb_create_object(afbdev, &mode_cmd, &gobj);
     295    ret = vboxfb_create_object(fbdev, &mode_cmd, &gobj);
    296296    if (ret) {
    297297        DRM_ERROR("failed to create fbcon backing object %d\n", ret);
     
    309309        goto out;
    310310    }
    311     info->par = afbdev;
    312 
    313     ret = vbox_framebuffer_init(dev, &afbdev->afb, &mode_cmd, gobj);
     311    info->par = fbdev;
     312
     313    ret = vbox_framebuffer_init(dev, &fbdev->afb, &mode_cmd, gobj);
    314314    if (ret)
    315315        goto out;
    316316
    317     afbdev->sysram = sysram;
    318     afbdev->size = size;
    319 
    320     fb = &afbdev->afb.base;
    321     afbdev->helper.fb = fb;
    322     afbdev->helper.fbdev = info;
     317    fbdev->sysram = sysram;
     318    fbdev->size = size;
     319
     320    fb = &fbdev->afb.base;
     321    fbdev->helper.fb = fb;
     322    fbdev->helper.fbdev = info;
    323323
    324324    strcpy(info->fix.id, "vboxdrmfb");
     
    347347
    348348    drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth);
    349     drm_fb_helper_fill_var(info, &afbdev->helper, sizes->fb_width, sizes->fb_height);
     349    drm_fb_helper_fill_var(info, &fbdev->helper, sizes->fb_width, sizes->fb_height);
    350350
    351351    info->screen_base = sysram;
     
    385385
    386386static void vbox_fbdev_destroy(struct drm_device *dev,
    387                   struct vbox_fbdev *afbdev)
     387                  struct vbox_fbdev *fbdev)
    388388{
    389389    struct fb_info *info;
    390     struct vbox_framebuffer *afb = &afbdev->afb;
    391     LogFunc(("vboxvideo: %d\n", __LINE__));
    392     if (afbdev->helper.fbdev) {
    393         info = afbdev->helper.fbdev;
     390    struct vbox_framebuffer *afb = &fbdev->afb;
     391    LogFunc(("vboxvideo: %d\n", __LINE__));
     392    if (fbdev->helper.fbdev) {
     393        info = fbdev->helper.fbdev;
    394394        unregister_framebuffer(info);
    395395        if (info->cmap.len)
     
    402402        afb->obj = NULL;
    403403    }
    404     drm_fb_helper_fini(&afbdev->helper);
    405 
    406     vfree(afbdev->sysram);
     404    drm_fb_helper_fini(&fbdev->helper);
     405
     406    vfree(fbdev->sysram);
    407407    drm_framebuffer_unregister_private(&afb->base);
    408408    drm_framebuffer_cleanup(&afb->base);
     
    413413{
    414414    struct vbox_private *vbox = dev->dev_private;
    415     struct vbox_fbdev *afbdev;
     415    struct vbox_fbdev *fbdev;
    416416    int ret;
    417417
    418418    LogFunc(("vboxvideo: %d\n", __LINE__));
    419     afbdev = kzalloc(sizeof(struct vbox_fbdev), GFP_KERNEL);
    420     if (!afbdev)
     419    fbdev = kzalloc(sizeof(struct vbox_fbdev), GFP_KERNEL);
     420    if (!fbdev)
    421421        return -ENOMEM;
    422422
    423     vbox->fbdev = afbdev;
     423    vbox->fbdev = fbdev;
    424424#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
    425     afbdev->helper.funcs = &vbox_fb_helper_funcs;
     425    fbdev->helper.funcs = &vbox_fb_helper_funcs;
    426426#else
    427     drm_fb_helper_prepare(dev, &afbdev->helper, &vbox_fb_helper_funcs);
     427    drm_fb_helper_prepare(dev, &fbdev->helper, &vbox_fb_helper_funcs);
    428428#endif
    429     ret = drm_fb_helper_init(dev, &afbdev->helper, vbox->num_crtcs, vbox->num_crtcs);
     429    ret = drm_fb_helper_init(dev, &fbdev->helper, vbox->num_crtcs, vbox->num_crtcs);
    430430    if (ret)
    431431        goto free;
    432432
    433     ret = drm_fb_helper_single_add_all_connectors(&afbdev->helper);
     433    ret = drm_fb_helper_single_add_all_connectors(&fbdev->helper);
    434434    if (ret)
    435435        goto fini;
     
    438438    drm_helper_disable_unused_functions(dev);
    439439
    440     ret = drm_fb_helper_initial_config(&afbdev->helper, 32);
     440    ret = drm_fb_helper_initial_config(&fbdev->helper, 32);
    441441    if (ret)
    442442        goto fini;
     
    445445    return 0;
    446446fini:
    447     drm_fb_helper_fini(&afbdev->helper);
     447    drm_fb_helper_fini(&fbdev->helper);
    448448free:
    449     kfree(afbdev);
     449    kfree(fbdev);
    450450    LogFunc(("vboxvideo: %d, ret=%d\n", __LINE__, ret));
    451451    return ret;
  • trunk/src/VBox/Additions/linux/drm/vbox_main.c

    r59635 r59640  
    6666}
    6767
    68 void vbox_enable_vbva(struct vbox_private *vbox, unsigned crtc_id)
    69 {
    70     struct VBVABUFFER *pVBVA = vbox->vbva_info[crtc_id].pVBVA;
    71 
    72     if (pVBVA == NULL)    {
     68void vbox_enable_accel(struct vbox_private *vbox, unsigned crtc_id)
     69{
     70    struct VBVABUFFER *vbva = vbox->vbva_info[crtc_id].pVBVA;
     71
     72    if (vbva == NULL) {
    7373        LogFunc(("vboxvideo: enabling VBVA.\n"));
    74         pVBVA = (struct VBVABUFFER *) (  ((uint8_t *)vbox->vram)
     74        vbva = (struct VBVABUFFER *) (  ((uint8_t *)vbox->vram)
    7575                                       + vbox->vram_size
    7676                                       + crtc_id * VBVA_MIN_BUFFER_SIZE);
    77         if (!VBoxVBVAEnable(&vbox->vbva_info[crtc_id], &vbox->submit_info, pVBVA, crtc_id))
     77        if (!VBoxVBVAEnable(&vbox->vbva_info[crtc_id], &vbox->submit_info, vbva, crtc_id))
    7878            AssertReleaseMsgFailed(("VBoxVBVAEnable failed - heap allocation error, very old host or driver error.\n"));
    7979    }
     
    101101    if (vbox->vbva_info[0].pVBVA == NULL) {
    102102        for (i = 0; i < vbox->num_crtcs; ++i)
    103             vbox_enable_vbva(vbox, i);
     103            vbox_enable_accel(vbox, i);
    104104        /* Assume that if the user knows to send dirty rectangle information
    105105         * they can also handle hot-plug events. */
     
    113113        {
    114114            unsigned crtc_id = to_vbox_crtc(crtc)->crtc_id;
    115             VBVACMDHDR cmdHdr;
     115            VBVACMDHDR cmd_hdr;
    116116
    117117            if (   CRTC_FB(crtc) != fb
     
    123123                || rects[i].y2 < crtc->y)
    124124                continue;
    125             cmdHdr.x = (int16_t)rects[i].x1;
    126             cmdHdr.y = (int16_t)rects[i].y1;
    127             cmdHdr.w = (uint16_t)rects[i].x2 - rects[i].x1;
    128             cmdHdr.h = (uint16_t)rects[i].y2 - rects[i].y1;
     125            cmd_hdr.x = (int16_t)rects[i].x1;
     126            cmd_hdr.y = (int16_t)rects[i].y1;
     127            cmd_hdr.w = (uint16_t)rects[i].x2 - rects[i].x1;
     128            cmd_hdr.h = (uint16_t)rects[i].y2 - rects[i].y1;
    129129            if (VBoxVBVABufferBeginUpdate(&vbox->vbva_info[crtc_id],
    130130                                          &vbox->submit_info))
    131131            {
    132                 VBoxVBVAWrite(&vbox->vbva_info[crtc_id], &vbox->submit_info, &cmdHdr,
    133                               sizeof(cmdHdr));
     132                VBoxVBVAWrite(&vbox->vbva_info[crtc_id], &vbox->submit_info, &cmd_hdr,
     133                              sizeof(cmd_hdr));
    134134                VBoxVBVABufferEndUpdate(&vbox->vbva_info[crtc_id]);
    135135            }
     
    212212};
    213213
    214 static void disableVBVA(struct vbox_private *pVBox)
     214static void vbox_accel_fini(struct vbox_private *vbox)
    215215{
    216216    unsigned i;
    217217
    218     if (pVBox->vbva_info)
     218    if (vbox->vbva_info)
    219219    {
    220         for (i = 0; i < pVBox->num_crtcs; ++i)
    221             VBoxVBVADisable(&pVBox->vbva_info[i], &pVBox->submit_info, i);
    222         kfree(pVBox->vbva_info);
    223         pVBox->vbva_info = NULL;
    224     }
    225 }
    226 
    227 static int vbox_vbva_init(struct vbox_private *vbox)
     220        for (i = 0; i < vbox->num_crtcs; ++i)
     221            VBoxVBVADisable(&vbox->vbva_info[i], &vbox->submit_info, i);
     222        kfree(vbox->vbva_info);
     223        vbox->vbva_info = NULL;
     224    }
     225}
     226
     227static int vbox_accel_init(struct vbox_private *vbox)
    228228{
    229229    unsigned i;
    230     bool fRC = true;
    231230    LogFunc(("vboxvideo: %d: vbox=%p, vbox->num_crtcs=%u, vbox->vbva_info=%p\n",
    232231             __LINE__, vbox, (unsigned)vbox->num_crtcs, vbox->vbva_info));
     
    250249}
    251250
    252 
    253251/** Allocation function for the HGSMI heap and data. */
    254 static DECLCALLBACK(void *) hgsmiEnvAlloc(void *pvEnv, HGSMISIZE cb)
    255 {
    256     NOREF(pvEnv);
    257     return kmalloc(cb, GFP_KERNEL);
     252static DECLCALLBACK(void *) alloc_hgsmi_environ(void *environ, HGSMISIZE size)
     253{
     254    NOREF(environ);
     255    return kmalloc(size, GFP_KERNEL);
    258256}
    259257
    260258
    261259/** Free function for the HGSMI heap and data. */
    262 static DECLCALLBACK(void) hgsmiEnvFree(void *pvEnv, void *pv)
    263 {
    264     NOREF(pvEnv);
    265     kfree(pv);
     260static DECLCALLBACK(void) free_hgsmi_environ(void *environ, void *ptr)
     261{
     262    NOREF(environ);
     263    kfree(ptr);
    266264}
    267265
    268266
    269267/** Pointers to the HGSMI heap and data manipulation functions. */
    270 static HGSMIENV g_hgsmiEnv =
     268static HGSMIENV hgsmi_environ =
    271269{
    272270    NULL,
    273     hgsmiEnvAlloc,
    274     hgsmiEnvFree
     271    alloc_hgsmi_environ,
     272    free_hgsmi_environ
    275273};
    276274
    277275
    278276/** Do we support the 4.3 plus mode hint reporting interface? */
    279 static bool haveHGSMImode_hintAndCursorReportingInterface(struct vbox_private *pVBox)
    280 {
    281     uint32_t fmode_hintReporting, fCursorReporting;
    282 
    283     return    RT_SUCCESS(VBoxQueryConfHGSMI(&pVBox->submit_info, VBOX_VBVA_CONF32_MODE_HINT_REPORTING, &fmode_hintReporting))
    284            && RT_SUCCESS(VBoxQueryConfHGSMI(&pVBox->submit_info, VBOX_VBVA_CONF32_GUEST_CURSOR_REPORTING, &fCursorReporting))
    285            && fmode_hintReporting == VINF_SUCCESS
    286            && fCursorReporting == VINF_SUCCESS;
     277static bool have_hgsmi_mode_hints(struct vbox_private *vbox)
     278{
     279    uint32_t have_hints, have_cursor;
     280
     281    return    RT_SUCCESS(VBoxQueryConfHGSMI(&vbox->submit_info, VBOX_VBVA_CONF32_MODE_HINT_REPORTING, &have_hints))
     282           && RT_SUCCESS(VBoxQueryConfHGSMI(&vbox->submit_info, VBOX_VBVA_CONF32_GUEST_CURSOR_REPORTING, &have_cursor))
     283           && have_hints == VINF_SUCCESS
     284           && have_cursor == VINF_SUCCESS;
    287285}
    288286
     
    290288/** Set up our heaps and data exchange buffers in VRAM before handing the rest
    291289 *  to the memory manager. */
    292 static int setupAcceleration(struct vbox_private *pVBox)
    293 {
    294     uint32_t offBase, offGuestHeap, cbGuestHeap, host_flags_offset;
    295     void *pvGuestHeap;
    296 
    297     VBoxHGSMIGetBaseMappingInfo(pVBox->full_vram_size, &offBase, NULL,
    298                                 &offGuestHeap, &cbGuestHeap, &host_flags_offset);
    299     pvGuestHeap =   ((uint8_t *)pVBox->vram) + offBase + offGuestHeap;
    300     pVBox->host_flags_offset = offBase + host_flags_offset;
    301     if (RT_FAILURE(VBoxHGSMISetupGuestContext(&pVBox->submit_info, pvGuestHeap,
    302                                               cbGuestHeap,
    303                                               offBase + offGuestHeap,
    304                                               &g_hgsmiEnv)))
     290static int vbox_hw_init(struct vbox_private *vbox)
     291{
     292    uint32_t base_offset, guest_heap_offset, guest_heap_size, host_flags_offset;
     293    void *guest_heap;
     294
     295    VBoxHGSMIGetBaseMappingInfo(vbox->full_vram_size, &base_offset, NULL,
     296                                &guest_heap_offset, &guest_heap_size, &host_flags_offset);
     297    guest_heap =   ((uint8_t *)vbox->vram) + base_offset + guest_heap_offset;
     298    vbox->host_flags_offset = base_offset + host_flags_offset;
     299    if (RT_FAILURE(VBoxHGSMISetupGuestContext(&vbox->submit_info, guest_heap,
     300                                              guest_heap_size,
     301                                              base_offset + guest_heap_offset,
     302                                              &hgsmi_environ)))
    305303        return -ENOMEM;
    306304    /* Reduce available VRAM size to reflect the guest heap. */
    307     pVBox->vram_size = offBase;
     305    vbox->vram_size = base_offset;
    308306    /* Linux drm represents monitors as a 32-bit array. */
    309     pVBox->num_crtcs = RT_MIN(VBoxHGSMIGetMonitorCount(&pVBox->submit_info), 32);
    310     if (!haveHGSMImode_hintAndCursorReportingInterface(pVBox))
     307    vbox->num_crtcs = RT_MIN(VBoxHGSMIGetMonitorCount(&vbox->submit_info), 32);
     308    if (!have_hgsmi_mode_hints(vbox))
    311309        return -ENOTSUPP;
    312     pVBox->last_mode_hints = kzalloc(sizeof(VBVAMODEHINT) * pVBox->num_crtcs, GFP_KERNEL);
    313     if (!pVBox->last_mode_hints)
     310    vbox->last_mode_hints = kzalloc(sizeof(VBVAMODEHINT) * vbox->num_crtcs, GFP_KERNEL);
     311    if (!vbox->last_mode_hints)
    314312        return -ENOMEM;
    315     return vbox_vbva_init(pVBox);
     313    return vbox_accel_init(vbox);
    316314}
    317315
     
    343341    DRM_INFO("VRAM %08x\n", vbox->full_vram_size);
    344342
    345     ret = setupAcceleration(vbox);
     343    ret = vbox_hw_init(vbox);
    346344    if (ret)
    347345        goto out_free;
     
    394392    drm_mode_config_cleanup(dev);
    395393
    396     disableVBVA(vbox);
     394    vbox_accel_fini(vbox);
    397395    vbox_mm_fini(vbox);
    398396    pci_iounmap(dev->pdev, vbox->vram);
  • trunk/src/VBox/Additions/linux/drm/vbox_mode.c

    r59634 r59640  
    7171    struct vbox_crtc   *vbox_crtc = to_vbox_crtc(crtc);
    7272    struct vbox_private *vbox;
    73     int width, height, cBPP, pitch;
     73    int width, height, bpp, pitch;
    7474    unsigned crtc_id;
    75     uint16_t fFlags;
     75    uint16_t flags;
    7676
    7777    LogFunc(("vboxvideo: %d: vbox_crtc=%p, CRTC_FB(crtc)=%p\n", __LINE__,
     
    8181    height = mode->vdisplay ? mode->vdisplay : 480;
    8282    crtc_id = vbox_crtc->crtc_id;
    83     cBPP = crtc->enabled ? CRTC_FB(crtc)->bits_per_pixel : 32;
     83    bpp = crtc->enabled ? CRTC_FB(crtc)->bits_per_pixel : 32;
    8484#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0)
    85     pitch = crtc->enabled ? CRTC_FB(crtc)->pitch : width * cBPP / 8;
     85    pitch = crtc->enabled ? CRTC_FB(crtc)->pitch : width * bpp / 8;
    8686#else
    87     pitch = crtc->enabled ? CRTC_FB(crtc)->pitches[0] : width * cBPP / 8;
     87    pitch = crtc->enabled ? CRTC_FB(crtc)->pitches[0] : width * bpp / 8;
    8888#endif
    8989    /* if (vbox_crtc->crtc_id == 0 && crtc->enabled)
    90         VBoxVideoSetModeRegisters(width, height, pitch * 8 / cBPP,
     90        VBoxVideoSetModeRegisters(width, height, pitch * 8 / bpp,
    9191                                  CRTC_FB(crtc)->bits_per_pixel, 0,
    9292                                  crtc->x, crtc->y); */
    93     fFlags = VBVA_SCREEN_F_ACTIVE;
    94     fFlags |= (crtc->enabled ? 0 : VBVA_SCREEN_F_DISABLED);
     93    flags = VBVA_SCREEN_F_ACTIVE;
     94    flags |= (crtc->enabled ? 0 : VBVA_SCREEN_F_DISABLED);
    9595    VBoxHGSMIProcessDisplayInfo(&vbox->submit_info, vbox_crtc->crtc_id,
    9696                                crtc->x, crtc->y,
    97                                 crtc->x * cBPP / 8 + crtc->y * pitch,
     97                                crtc->x * bpp / 8 + crtc->y * pitch,
    9898                                pitch, width, height,
    99                                 vbox_crtc->blanked ? 0 : cBPP, fFlags);
     99                                vbox_crtc->blanked ? 0 : bpp, flags);
    100100    VBoxHGSMIReportFlagsLocation(&vbox->submit_info, vbox->host_flags_offset);
    101101    vbox_enable_caps(vbox);
     
    223223
    224224        for (i = 0; i < vbox->num_crtcs; ++i)
    225             vbox_enable_vbva(vbox, i);
     225            vbox_enable_accel(vbox, i);
    226226    }
    227227    vbox_bo_unreserve(bo);
     
    415415{
    416416    struct vbox_connector *vbox_connector = NULL;
    417     struct drm_display_mode *pMode = NULL;
    418     unsigned cModes = 0;
    419     int widthPreferred, heightPreferred;
     417    struct drm_display_mode *mode = NULL;
     418    unsigned num_modes = 0;
     419    int preferred_width, preferred_height;
    420420
    421421    LogFunc(("vboxvideo: %d: connector=%p\n", __LINE__, connector));
    422422    vbox_connector = to_vbox_connector(connector);
    423     cModes = drm_add_modes_noedid(connector, 2560, 1600);
    424     widthPreferred = vbox_connector->mode_hint.width ? vbox_connector->mode_hint.width : 1024;
    425     heightPreferred = vbox_connector->mode_hint.height ? vbox_connector->mode_hint.height : 768;
    426     pMode = drm_cvt_mode(connector->dev, widthPreferred, heightPreferred, 60, false,
     423    num_modes = drm_add_modes_noedid(connector, 2560, 1600);
     424    preferred_width = vbox_connector->mode_hint.width ? vbox_connector->mode_hint.width : 1024;
     425    preferred_height = vbox_connector->mode_hint.height ? vbox_connector->mode_hint.height : 768;
     426    mode = drm_cvt_mode(connector->dev, preferred_width, preferred_height, 60, false,
    427427                         false, false);
    428     if (pMode)
     428    if (mode)
    429429    {
    430         pMode->type |= DRM_MODE_TYPE_PREFERRED;
    431         drm_mode_probed_add(connector, pMode);
    432         ++cModes;
    433     }
    434     return cModes;
     430        mode->type |= DRM_MODE_TYPE_PREFERRED;
     431        drm_mode_probed_add(connector, mode);
     432        ++num_modes;
     433    }
     434    return num_modes;
    435435}
    436436
     
    468468}
    469469
    470 static int vbox_fill_modes(struct drm_connector *connector, uint32_t xMax, uint32_t yMax)
     470static int vbox_fill_modes(struct drm_connector *connector, uint32_t max_x, uint32_t max_y)
    471471{
    472472    struct vbox_connector *vbox_connector;
    473     struct drm_device *pDrmDev;
    474     struct drm_display_mode *pMode, *pIter;
    475 
    476     LogFunc(("vboxvideo: %d: connector=%p, xMax=%lu, yMax = %lu\n", __LINE__,
    477              connector, (unsigned long)xMax, (unsigned long)yMax));
     473    struct drm_device *dev;
     474    struct drm_display_mode *mode, *iterator;
     475
     476    LogFunc(("vboxvideo: %d: connector=%p, max_x=%lu, max_y = %lu\n", __LINE__,
     477             connector, (unsigned long)max_x, (unsigned long)max_y));
    478478    vbox_connector = to_vbox_connector(connector);
    479     pDrmDev = vbox_connector->base.dev;
    480     list_for_each_entry_safe(pMode, pIter, &connector->modes, head)
     479    dev = vbox_connector->base.dev;
     480    list_for_each_entry_safe(mode, iterator, &connector->modes, head)
    481481    {
    482         list_del(&pMode->head);
    483         drm_mode_destroy(pDrmDev, pMode);
    484     }
    485     return drm_helper_probe_single_connector_modes(connector, xMax, yMax);
     482        list_del(&mode->head);
     483        drm_mode_destroy(dev, mode);
     484    }
     485    return drm_helper_probe_single_connector_modes(connector, max_x, max_y);
    486486}
    487487
     
    504504{
    505505    struct vbox_connector *vbox_connector;
    506     struct vbox_private *pVBox;
     506    struct vbox_private *vbox;
    507507
    508508    LogFunc(("vboxvideo: %d: dev=%p, pAttr=%p, psz=%s, cch=%llu\n", __LINE__,
     
    510510    vbox_connector = container_of(pAttr, struct vbox_connector,
    511511                                  sysfs_node);
    512     pVBox = vbox_connector->base.dev->dev_private;
     512    vbox = vbox_connector->base.dev->dev_private;
    513513    drm_kms_helper_hotplug_event(vbox_connector->base.dev);
    514     if (pVBox->fbdev)
    515         drm_fb_helper_hotplug_event(&pVBox->fbdev->helper);
     514    if (vbox->fbdev)
     515        drm_fb_helper_hotplug_event(&vbox->fbdev->helper);
    516516    return cch;
    517517}
     
    575575}
    576576
    577 #if 0
    578 /* allocate cursor cache and pin at start of VRAM */
    579 int vbox_cursor_init(struct drm_device *dev)
     577int vbox_mode_init(struct drm_device *dev)
    580578{
    581579    struct vbox_private *vbox = dev->dev_private;
    582     int size;
    583     int ret;
    584     struct drm_gem_object *obj;
    585     struct vbox_bo *bo;
    586     uint64_t gpu_addr;
    587 
    588     size = (AST_HWC_SIZE + AST_HWC_SIGNATURE_SIZE) * AST_DEFAULT_HWC_NUM;
    589 
    590     ret = vbox_gem_create(dev, size, true, &obj);
    591     if (ret)
    592         return ret;
    593     bo = gem_to_vbox_bo(obj);
    594     ret = vbox_bo_reserve(bo, false);
    595     if (unlikely(ret != 0))
    596         goto fail;
    597 
    598     ret = vbox_bo_pin(bo, TTM_PL_FLAG_VRAM, &gpu_addr);
    599     vbox_bo_unreserve(bo);
    600     if (ret)
    601         goto fail;
    602 
    603     /* kmap the object */
    604     ret = ttm_bo_kmap(&bo->bo, 0, bo->bo.num_pages, &vbox->cache_kmap);
    605     if (ret)
    606         goto fail;
    607 
    608     vbox->cursor_cache = obj;
    609     vbox->cursor_cache_gpu_addr = gpu_addr;
    610     DRM_DEBUG_KMS("pinned cursor cache at %llx\n", vbox->cursor_cache_gpu_addr);
    611     return 0;
    612 fail:
    613     return ret;
    614 }
    615 
    616 void vbox_cursor_fini(struct drm_device *dev)
    617 {
    618     struct vbox_private *vbox = dev->dev_private;
    619     ttm_bo_kunmap(&vbox->cache_kmap);
    620     drm_gem_object_unreference_unlocked(vbox->cursor_cache);
    621 }
    622 #endif
    623 
    624 int vbox_mode_init(struct drm_device *dev)
    625 {
    626     struct vbox_private *pVBox = dev->dev_private;
    627580    struct drm_encoder *encoder;
    628581    unsigned i;
    629582    /* vbox_cursor_init(dev); */
    630583    LogFunc(("vboxvideo: %d: dev=%p\n", __LINE__, dev));
    631     for (i = 0; i < pVBox->num_crtcs; ++i)
     584    for (i = 0; i < vbox->num_crtcs; ++i)
    632585    {
    633586        vbox_crtc_init(dev, i);
     
    720673                    if (!src_isiomem)
    721674                    {
    722                         uint32_t fFlags =   VBOX_MOUSE_POINTER_VISIBLE
     675                        uint32_t flags =   VBOX_MOUSE_POINTER_VISIBLE
    723676                                          | VBOX_MOUSE_POINTER_SHAPE
    724677                                          | VBOX_MOUSE_POINTER_ALPHA;
    725678                        copy_cursor_image(src, dst, width, height, cbMask);
    726                         rc = VBoxHGSMIUpdatePointerShape(&vbox->submit_info, fFlags,
     679                        rc = VBoxHGSMIUpdatePointerShape(&vbox->submit_info, flags,
    727680                                                         hot_x, hot_y, width,
    728681                                                         height, dst, cbData);
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette