Changeset 59236 in vbox
- Timestamp:
- Dec 31, 2015 10:50:20 AM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 104864
- 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 102 102 /** Amount of available VRAM, not including space used for buffers. */ 103 103 uint32_t vram_size; 104 /** Array of structures for receiving mode hints. */ 105 VBVAMODEHINT *paVBVAModeHints; 104 106 105 107 struct vbox_fbdev *fbdev; … … 127 129 struct drm_connector base; 128 130 char szName[32]; 131 unsigned iCrtc; 129 132 /** Device attribute for sysfs file used for receiving mode hints from user 130 133 * space. */ -
trunk/src/VBox/Additions/linux/drm/vbox_fb.c
r58129 r59236 74 74 * We re-enable VBVA if necessary when we get dirty rectangle information, as 75 75 * 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. */ 77 78 static int VBoxSetPar(struct fb_info *pInfo) 78 79 { … … 88 89 for (i = 0; i < pVBox->cCrtcs; ++i) 89 90 VBoxVBVADisable(&pVBox->paVBVACtx[i], &pVBox->Ctx, i); 91 VBoxHGSMISendCapsInfo(&pVBox->Ctx, 0); 90 92 return drm_fb_helper_set_par(pInfo); 91 93 } -
trunk/src/VBox/Additions/linux/drm/vbox_main.c
r58129 r59236 103 103 if (!VBoxVBVAEnable(&vbox->paVBVACtx[iCrtc], &vbox->Ctx, pVBVA, iCrtc)) 104 104 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); 105 108 } 106 109 if ( CRTC_FB(crtc) != fb … … 271 274 272 275 276 /** Do we support the 4.3 plus mode hint reporting interface? */ 277 static 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 273 288 /** Set up our heaps and data exchange buffers in VRAM before handing the rest 274 289 * to the memory manager. */ … … 292 307 /* Linux drm represents monitors as a 32-bit array. */ 293 308 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; 294 314 return vbox_vbva_init(pVBox); 295 315 } -
trunk/src/VBox/Additions/linux/drm/vbox_mode.c
r59226 r59236 98 98 pitch, width, height, 99 99 vbox_crtc->fBlanked ? 0 : cBPP, fFlags); 100 VBoxHGSMISendCapsInfo(&vbox->Ctx, VBVACAPS_VIDEO_MODE_HINTS | VBVACAPS_DISABLE_CURSOR_INTEGRATION); 100 101 LogFunc(("vboxvideo: %d\n", __LINE__)); 101 102 } … … 409 410 } 410 411 412 static 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 411 432 static int vbox_get_modes(struct drm_connector *pConnector) 412 433 { … … 418 439 LogFunc(("vboxvideo: %d: pConnector=%p\n", __LINE__, pConnector)); 419 440 pVBoxConnector = to_vbox_connector(pConnector); 441 vboxUpdateHints(pVBoxConnector); 420 442 cModes = drm_add_modes_noedid(pConnector, 2560, 1600); 421 443 cxPreferred = pVBoxConnector->modeHint.cX ? pVBoxConnector->modeHint.cX : 1024; … … 462 484 LogFunc(("vboxvideo: %d: connector=%p\n", __LINE__, pConnector)); 463 485 pVBoxConnector = to_vbox_connector(pConnector); 486 vboxUpdateHints(pVBoxConnector); 464 487 return !pVBoxConnector->modeHint.fDisconnected; 465 488 } … … 503 526 { 504 527 struct vbox_connector *pVBoxConnector; 505 struct drm_device *pDrmDev;506 528 struct vbox_private *pVBox; 507 int cX, cY;508 char ch;509 529 510 530 LogFunc(("vboxvideo: %d: pDev=%p, pAttr=%p, psz=%s, cch=%llu\n", __LINE__, … … 512 532 pVBoxConnector = container_of(pAttr, struct vbox_connector, 513 533 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; 533 535 drm_kms_helper_hotplug_event(pVBoxConnector->base.dev); 534 536 if (pVBox->fbdev) 535 537 drm_fb_helper_hotplug_event(&pVBox->fbdev->helper); 536 LogFunc(("vboxvideo: %d\n", __LINE__));537 538 return cch; 538 539 } … … 552 553 553 554 pConnector = &pVBoxConnector->base; 555 pVBoxConnector->iCrtc = cScreen; 554 556 555 557 /*
Note:
See TracChangeset
for help on using the changeset viewer.