Changeset 62550 in vbox
- Timestamp:
- Jul 25, 2016 6:32:58 PM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 109119
- Location:
- trunk/src/VBox/Additions/linux/drm
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/linux/drm/vbox_drv.h
r62527 r62550 88 88 #define CURSOR_DATA_SIZE CURSOR_PIXEL_COUNT * 4 + CURSOR_PIXEL_COUNT / 8 89 89 90 #define VBOX_MAX_SCREENS 32 91 90 92 struct vbox_fbdev; 91 93 … … 93 95 struct drm_device *dev; 94 96 95 uint8_t __iomem * vram;97 uint8_t __iomem *mapped_vram; 96 98 HGSMIGUESTCOMMANDCONTEXT submit_info; 97 99 struct VBVABUFFERCONTEXT *vbva_info; … … 102 104 uint32_t full_vram_size; 103 105 /** Amount of available VRAM, not including space used for buffers. */ 104 uint32_t vram_size; 106 uint32_t available_vram_size; 107 /** Offset of host communication area in mapped VRAM. */ 108 uint32_t vram_host_offset; 105 109 /** Offset to the host flags in the VRAM. */ 106 110 uint32_t host_flags_offset; -
trunk/src/VBox/Additions/linux/drm/vbox_fb.c
r62527 r62550 498 498 vbox->fbdev->helper.fbdev->apertures->ranges[0].base + 499 499 gpu_addr; 500 vbox->fbdev->helper.fbdev->fix.smem_len = vbox-> vram_size - gpu_addr;501 } 500 vbox->fbdev->helper.fbdev->fix.smem_len = vbox->available_vram_size - gpu_addr; 501 } -
trunk/src/VBox/Additions/linux/drm/vbox_irq.c
r62470 r62550 57 57 static uint32_t vbox_get_flags(struct vbox_private *vbox) 58 58 { 59 return (uint32_t)readl(vbox-> vram + vbox->host_flags_offset);59 return (uint32_t)readl(vbox->mapped_vram + vbox->host_flags_offset); 60 60 } 61 61 -
trunk/src/VBox/Additions/linux/drm/vbox_main.c
r62527 r62550 75 75 if (vbox->vbva_info[i].pVBVA == NULL) { 76 76 LogFunc(("vboxvideo: enabling VBVA.\n")); 77 vbva = (struct VBVABUFFER *) ( ((uint8_t *)vbox-> vram)78 + vbox->vram_ size77 vbva = (struct VBVABUFFER *) ( ((uint8_t *)vbox->mapped_vram) 78 + vbox->vram_host_offset 79 79 + i * VBVA_MIN_BUFFER_SIZE); 80 80 if (!VBoxVBVAEnable(&vbox->vbva_info[i], &vbox->submit_info, vbva, i)) … … 255 255 } 256 256 /* Take a command buffer for each screen from the end of usable VRAM. */ 257 vbox->vram_size -= vbox->num_crtcs * VBVA_MIN_BUFFER_SIZE; 257 vbox->vram_host_offset = (VBOX_MAX_SCREENS - vbox->num_crtcs) * VBVA_MIN_BUFFER_SIZE; 258 vbox->available_vram_size -= vbox->num_crtcs * VBVA_MIN_BUFFER_SIZE; 258 259 for (i = 0; i < vbox->num_crtcs; ++i) 259 260 VBoxVBVASetupBufferContext(&vbox->vbva_info[i], 260 vbox-> vram_size + i * VBVA_MIN_BUFFER_SIZE,261 vbox->available_vram_size + i * VBVA_MIN_BUFFER_SIZE, 261 262 VBVA_MIN_BUFFER_SIZE); 262 LogFunc(("vboxvideo: %d: vbox->vbva_info=%p, vbox-> vram_size=%u\n",263 __LINE__, vbox->vbva_info, (unsigned)vbox-> vram_size));263 LogFunc(("vboxvideo: %d: vbox->vbva_info=%p, vbox->available_vram_size=%u\n", 264 __LINE__, vbox->vbva_info, (unsigned)vbox->available_vram_size)); 264 265 return 0; 265 266 } … … 301 302 } 302 303 304 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0) 305 # define pci_iomap_range(dev, bar, offset, maxlen) \ 306 ioremap(pci_resource_start(dev, bar) + offset, maxlen) 307 #endif 303 308 304 309 /** Set up our heaps and data exchange buffers in VRAM before handing the rest … … 306 311 static int vbox_hw_init(struct vbox_private *vbox) 307 312 { 308 uint32_t base_offset, guest_heap_offset, guest_heap_size, host_flags_offset;313 uint32_t base_offset, map_start, guest_heap_offset, guest_heap_size, host_flags_offset; 309 314 void *guest_heap; 310 315 … … 314 319 VBoxHGSMIGetBaseMappingInfo(vbox->full_vram_size, &base_offset, NULL, 315 320 &guest_heap_offset, &guest_heap_size, &host_flags_offset); 316 guest_heap = ((uint8_t *)vbox->vram) + base_offset + guest_heap_offset; 317 vbox->host_flags_offset = base_offset + host_flags_offset; 321 map_start = (uint32_t)max((int)base_offset 322 - VBOX_MAX_SCREENS * VBVA_MIN_BUFFER_SIZE, 0); 323 vbox->mapped_vram = pci_iomap_range(vbox->dev->pdev, 0, map_start, 324 vbox->full_vram_size - map_start); 325 if (!vbox->mapped_vram) 326 return -ENOMEM; 327 guest_heap = ((uint8_t *)vbox->mapped_vram) + base_offset - map_start 328 + guest_heap_offset; 329 vbox->host_flags_offset = base_offset - map_start + host_flags_offset; 318 330 if (RT_FAILURE(VBoxHGSMISetupGuestContext(&vbox->submit_info, guest_heap, 319 331 guest_heap_size, … … 322 334 return -ENOMEM; 323 335 /* Reduce available VRAM size to reflect the guest heap. */ 324 vbox-> vram_size = base_offset;336 vbox->available_vram_size = base_offset; 325 337 /* Linux drm represents monitors as a 32-bit array. */ 326 vbox->num_crtcs = RT_MIN(VBoxHGSMIGetMonitorCount(&vbox->submit_info), 32); 338 vbox->num_crtcs = min(VBoxHGSMIGetMonitorCount(&vbox->submit_info), 339 (uint32_t)VBOX_MAX_SCREENS); 327 340 if (!have_hgsmi_mode_hints(vbox)) 328 341 return -ENOTSUPP; … … 357 370 358 371 mutex_init(&vbox->hw_mutex); 359 /* I hope this won't interfere with the memory manager. */360 vbox->vram = pci_iomap(dev->pdev, 0, 0);361 if (!vbox->vram) {362 ret = -EIO;363 goto out_free;364 }365 372 366 373 ret = vbox_hw_init(vbox); … … 392 399 if (ret) 393 400 goto out_free; 394 LogFunc(("vboxvideo: %d: vbox=%p, vbox-> vram=%p, vbox->full_vram_size=%u\n",395 __LINE__, vbox, vbox-> vram, (unsigned)vbox->full_vram_size));401 LogFunc(("vboxvideo: %d: vbox=%p, vbox->mapped_vram=%p, vbox->full_vram_size=%u\n", 402 __LINE__, vbox, vbox->mapped_vram, (unsigned)vbox->full_vram_size)); 396 403 return 0; 397 404 out_free: … … 414 421 vbox_hw_fini(vbox); 415 422 vbox_mm_fini(vbox); 416 if (vbox-> vram)417 pci_iounmap(dev->pdev, vbox-> vram);423 if (vbox->mapped_vram) 424 pci_iounmap(dev->pdev, vbox->mapped_vram); 418 425 kfree(vbox); 419 426 dev->dev_private = NULL; -
trunk/src/VBox/Additions/linux/drm/vbox_mode.c
r62527 r62550 133 133 pInfo->u32ViewIndex = vbox_crtc->crtc_id; 134 134 pInfo->u32ViewOffset = vbox_crtc->fb_offset; 135 pInfo->u32ViewSize = vbox-> vram_size - vbox_crtc->fb_offset135 pInfo->u32ViewSize = vbox->available_vram_size - vbox_crtc->fb_offset 136 136 + vbox_crtc->crtc_id * VBVA_MIN_BUFFER_SIZE; 137 pInfo->u32MaxScreenSize = vbox-> vram_size - vbox_crtc->fb_offset;137 pInfo->u32MaxScreenSize = vbox->available_vram_size - vbox_crtc->fb_offset; 138 138 VBoxHGSMIBufferSubmit(&vbox->submit_info, p); 139 139 VBoxHGSMIBufferFree(&vbox->submit_info, p); -
trunk/src/VBox/Additions/linux/drm/vbox_ttm.c
r62527 r62550 301 301 302 302 ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM, 303 vbox-> vram_size >> PAGE_SHIFT);303 vbox->available_vram_size >> PAGE_SHIFT); 304 304 if (ret) { 305 305 DRM_ERROR("Failed ttm VRAM init: %d\n", ret);
Note:
See TracChangeset
for help on using the changeset viewer.