VirtualBox

Changeset 59236 in vbox


Ignore:
Timestamp:
Dec 31, 2015 10:50:20 AM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
104864
Message:

bugref:8087: Additions/x11: support non-root X server: in the kernel driver, read video mode hints (virtual monitor hot-plug events) from the new interface in the virtual graphics card instead of relying on user space to relay them. We still do not handle the (still untested!) hot-plug interrupts which the host sends.

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

Legend:

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

    r59222 r59236  
    102102    /** Amount of available VRAM, not including space used for buffers. */
    103103    uint32_t vram_size;
     104    /** Array of structures for receiving mode hints. */
     105    VBVAMODEHINT *paVBVAModeHints;
    104106
    105107    struct vbox_fbdev *fbdev;
     
    127129    struct drm_connector base;
    128130    char szName[32];
     131    unsigned iCrtc;
    129132    /** Device attribute for sysfs file used for receiving mode hints from user
    130133     * space. */
  • trunk/src/VBox/Additions/linux/drm/vbox_fb.c

    r58129 r59236  
    7474 * We re-enable VBVA if necessary when we get dirty rectangle information, as
    7575 * the owner should not be sending that if they plan to programme the card
    76  * themselves. */
     76 * themselves.  Update: we also do the same for reporting hot-plug support. I
     77 * wonder whether we should allow it at all on the console. */
    7778static int VBoxSetPar(struct fb_info *pInfo)
    7879{
     
    8889    for (i = 0; i < pVBox->cCrtcs; ++i)
    8990        VBoxVBVADisable(&pVBox->paVBVACtx[i], &pVBox->Ctx, i);
     91    VBoxHGSMISendCapsInfo(&pVBox->Ctx, 0);
    9092    return drm_fb_helper_set_par(pInfo);
    9193}
  • trunk/src/VBox/Additions/linux/drm/vbox_main.c

    r58129 r59236  
    103103                if (!VBoxVBVAEnable(&vbox->paVBVACtx[iCrtc], &vbox->Ctx, pVBVA, iCrtc))
    104104                    AssertReleaseMsgFailed(("VBoxVBVAEnable failed - heap allocation error, very old host or driver error.\n"));
     105                /* Assume that if the user knows to send dirty rectangle information
     106                 * they can also handle hot-plug events. */
     107                VBoxHGSMISendCapsInfo(&vbox->Ctx, VBVACAPS_VIDEO_MODE_HINTS | VBVACAPS_DISABLE_CURSOR_INTEGRATION);
    105108            }
    106109            if (   CRTC_FB(crtc) != fb
     
    271274
    272275
     276/** Do we support the 4.3 plus mode hint reporting interface? */
     277static bool haveHGSMIModeHintAndCursorReportingInterface(struct vbox_private *pVBox)
     278{
     279    uint32_t fModeHintReporting, fCursorReporting;
     280
     281    return    RT_SUCCESS(VBoxQueryConfHGSMI(&pVBox->Ctx, VBOX_VBVA_CONF32_MODE_HINT_REPORTING, &fModeHintReporting))
     282           && RT_SUCCESS(VBoxQueryConfHGSMI(&pVBox->Ctx, VBOX_VBVA_CONF32_GUEST_CURSOR_REPORTING, &fCursorReporting))
     283           && fModeHintReporting == VINF_SUCCESS
     284           && fCursorReporting == VINF_SUCCESS;
     285}
     286
     287
    273288/** Set up our heaps and data exchange buffers in VRAM before handing the rest
    274289 *  to the memory manager. */
     
    292307    /* Linux drm represents monitors as a 32-bit array. */
    293308    pVBox->cCrtcs = RT_MIN(VBoxHGSMIGetMonitorCount(&pVBox->Ctx), 32);
     309    if (!haveHGSMIModeHintAndCursorReportingInterface(pVBox))
     310        return -ENOTSUPP;
     311    pVBox->paVBVAModeHints = kzalloc(sizeof(VBVAMODEHINT) * pVBox->cCrtcs, GFP_KERNEL);
     312    if (!pVBox->paVBVAModeHints)
     313        return -ENOMEM;
    294314    return vbox_vbva_init(pVBox);
    295315}
  • trunk/src/VBox/Additions/linux/drm/vbox_mode.c

    r59226 r59236  
    9898                                pitch, width, height,
    9999                                vbox_crtc->fBlanked ? 0 : cBPP, fFlags);
     100    VBoxHGSMISendCapsInfo(&vbox->Ctx, VBVACAPS_VIDEO_MODE_HINTS | VBVACAPS_DISABLE_CURSOR_INTEGRATION);
    100101    LogFunc(("vboxvideo: %d\n", __LINE__));
    101102}
     
    409410}
    410411
     412static void vboxUpdateHints(struct vbox_connector *pVBoxConnector)
     413{
     414    struct vbox_private *pVBox;
     415    int rc;
     416
     417    LogFunc(("vboxvideo: %d: pVBoxConnector=%p\n", __LINE__, pVBoxConnector));
     418    pVBox = pVBoxConnector->base.dev->dev_private;
     419    rc = VBoxHGSMIGetModeHints(&pVBox->Ctx, pVBox->cCrtcs, pVBox->paVBVAModeHints);
     420    AssertMsgRCReturnVoid(rc, ("VBoxHGSMIGetModeHints failed, rc=%Rrc.\n", rc));
     421    if (pVBox->paVBVAModeHints[pVBoxConnector->iCrtc].magic == VBVAMODEHINT_MAGIC)
     422    {
     423        pVBoxConnector->modeHint.cX = pVBox->paVBVAModeHints[pVBoxConnector->iCrtc].cx & 0x8fff;
     424        pVBoxConnector->modeHint.cY = pVBox->paVBVAModeHints[pVBoxConnector->iCrtc].cy & 0x8fff;
     425        pVBoxConnector->modeHint.fDisconnected = !(pVBox->paVBVAModeHints[pVBoxConnector->iCrtc].fEnabled);
     426        LogFunc(("vboxvideo: %d: cX=%u, cY=%u, fDisconnected=%RTbool\n", __LINE__,
     427                 (unsigned)pVBoxConnector->modeHint.cX, (unsigned)pVBoxConnector->modeHint.cY,
     428                 pVBoxConnector->modeHint.fDisconnected));
     429    }
     430}
     431
    411432static int vbox_get_modes(struct drm_connector *pConnector)
    412433{
     
    418439    LogFunc(("vboxvideo: %d: pConnector=%p\n", __LINE__, pConnector));
    419440    pVBoxConnector = to_vbox_connector(pConnector);
     441    vboxUpdateHints(pVBoxConnector);
    420442    cModes = drm_add_modes_noedid(pConnector, 2560, 1600);
    421443    cxPreferred = pVBoxConnector->modeHint.cX ? pVBoxConnector->modeHint.cX : 1024;
     
    462484    LogFunc(("vboxvideo: %d: connector=%p\n", __LINE__, pConnector));
    463485    pVBoxConnector = to_vbox_connector(pConnector);
     486    vboxUpdateHints(pVBoxConnector);
    464487    return !pVBoxConnector->modeHint.fDisconnected;
    465488}
     
    503526{
    504527    struct vbox_connector *pVBoxConnector;
    505     struct drm_device *pDrmDev;
    506528    struct vbox_private *pVBox;
    507     int cX, cY;
    508     char ch;
    509529
    510530    LogFunc(("vboxvideo: %d: pDev=%p, pAttr=%p, psz=%s, cch=%llu\n", __LINE__,
     
    512532    pVBoxConnector = container_of(pAttr, struct vbox_connector,
    513533                                  deviceAttribute);
    514     pDrmDev = pVBoxConnector->base.dev;
    515     pVBox = pDrmDev->dev_private;
    516     if (sscanf(psz, "%5dx%5d\n%c", &cX, &cY, &ch) != 2)
    517         return -EINVAL;
    518     if (cX == -1 && cY == -1)
    519     {
    520         pVBoxConnector->modeHint.fDisconnected = true;
    521         pVBoxConnector->modeHint.cX = 0;
    522         pVBoxConnector->modeHint.cY = 0;
    523     }
    524     else
    525     {
    526         if (   cX < 64 || cX > VBE_DISPI_MAX_XRES
    527             || cY < 64 || cY > VBE_DISPI_MAX_YRES)
    528             return -EINVAL;
    529         pVBoxConnector->modeHint.fDisconnected = false;
    530         pVBoxConnector->modeHint.cX = (uint16_t)cX;
    531         pVBoxConnector->modeHint.cY = (uint16_t)cY;
    532     }
     534    pVBox = pVBoxConnector->base.dev->dev_private;
    533535    drm_kms_helper_hotplug_event(pVBoxConnector->base.dev);
    534536    if (pVBox->fbdev)
    535537        drm_fb_helper_hotplug_event(&pVBox->fbdev->helper);
    536     LogFunc(("vboxvideo: %d\n", __LINE__));
    537538    return cch;
    538539}
     
    552553
    553554    pConnector = &pVBoxConnector->base;
     555    pVBoxConnector->iCrtc = cScreen;
    554556
    555557    /*
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