Changeset 59640 in vbox for trunk/src/VBox/Additions
- Timestamp:
- Feb 12, 2016 8:29:09 AM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 105490
- 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 196 196 #endif 197 197 198 void vbox_enable_ vbva(struct vbox_private *vbox, unsigned crtc_id);198 void vbox_enable_accel(struct vbox_private *vbox, unsigned crtc_id); 199 199 void vbox_enable_caps(struct vbox_private *vbox); 200 200 -
trunk/src/VBox/Additions/linux/drm/vbox_fb.c
r59568 r59640 77 77 * themselves. Update: we also do the same for reporting hot-plug support. I 78 78 * 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;79 static int vbox_set_par(struct fb_info *info) 80 { 81 struct vbox_fbdev *fbdev = info->par; 82 82 struct drm_device *dev; 83 struct vbox_private * pVBox;83 struct vbox_private *vbox; 84 84 unsigned i; 85 85 86 86 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; 89 89 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); 94 94 } 95 95 … … 97 97 * Tell the host about dirty rectangles to update. 98 98 */ 99 static void vbox_dirty_update(struct vbox_fbdev * afbdev,99 static void vbox_dirty_update(struct vbox_fbdev *fbdev, 100 100 int x, int y, int width, int height) 101 101 { 102 struct drm_device *dev = afbdev->helper.dev;102 struct drm_device *dev = fbdev->helper.dev; 103 103 struct vbox_private *vbox = dev->dev_private; 104 104 int i; … … 107 107 struct vbox_bo *bo; 108 108 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; 110 110 int ret = -EBUSY; 111 111 bool unmap = false; … … 116 116 117 117 LogFunc(("vboxvideo: %d\n", __LINE__)); 118 obj = afbdev->afb.obj;118 obj = fbdev->afb.obj; 119 119 bo = gem_to_vbox_bo(obj); 120 120 … … 137 137 spin_lock_irqsave(&vbox->dev_lock, flags); 138 138 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; 147 147 148 148 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; 153 153 spin_unlock_irqrestore(&vbox->dev_lock, flags); 154 154 LogFunc(("vboxvideo: %d\n", __LINE__)); … … 156 156 } 157 157 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; 160 160 spin_unlock_irqrestore(&vbox->dev_lock, flags); 161 161 … … 171 171 for (i = y; i <= y2; i++) { 172 172 /* 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); 175 175 } 176 176 /* Not sure why the original code subtracted 1 here, but I will keep it that … … 180 180 rect.y1 = y; 181 181 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)); 185 185 if (unmap) 186 186 ttm_bo_kunmap(&bo->kmap); … … 192 192 const struct fb_fillrect *rect) 193 193 { 194 struct vbox_fbdev * afbdev = info->par;194 struct vbox_fbdev *fbdev = info->par; 195 195 LogFunc(("vboxvideo: %d\n", __LINE__)); 196 196 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, 198 198 rect->height); 199 199 } … … 202 202 const struct fb_copyarea *area) 203 203 { 204 struct vbox_fbdev * afbdev = info->par;204 struct vbox_fbdev *fbdev = info->par; 205 205 LogFunc(("vboxvideo: %d\n", __LINE__)); 206 206 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, 208 208 area->height); 209 209 } … … 212 212 const struct fb_image *image) 213 213 { 214 struct vbox_fbdev * afbdev = info->par;214 struct vbox_fbdev *fbdev = info->par; 215 215 LogFunc(("vboxvideo: %d\n", __LINE__)); 216 216 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, 218 218 image->height); 219 219 } … … 222 222 .owner = THIS_MODULE, 223 223 .fb_check_var = drm_fb_helper_check_var, 224 .fb_set_par = VBoxSetPar,224 .fb_set_par = vbox_set_par, 225 225 .fb_fillrect = vbox_fillrect, 226 226 .fb_copyarea = vbox_copyarea, … … 233 233 }; 234 234 235 static int vboxfb_create_object(struct vbox_fbdev * afbdev,235 static int vboxfb_create_object(struct vbox_fbdev *fbdev, 236 236 struct DRM_MODE_FB_CMD *mode_cmd, 237 237 struct drm_gem_object **gobj_p) 238 238 { 239 struct drm_device *dev = afbdev->helper.dev;239 struct drm_device *dev = fbdev->helper.dev; 240 240 u32 bpp, depth; 241 241 u32 size; … … 264 264 struct drm_fb_helper_surface_size *sizes) 265 265 { 266 struct vbox_fbdev * afbdev =266 struct vbox_fbdev *fbdev = 267 267 container_of(helper, struct vbox_fbdev, helper); 268 struct drm_device *dev = afbdev->helper.dev;268 struct drm_device *dev = fbdev->helper.dev; 269 269 struct DRM_MODE_FB_CMD mode_cmd; 270 270 struct drm_framebuffer *fb; … … 293 293 size = pitch * mode_cmd.height; 294 294 295 ret = vboxfb_create_object( afbdev, &mode_cmd, &gobj);295 ret = vboxfb_create_object(fbdev, &mode_cmd, &gobj); 296 296 if (ret) { 297 297 DRM_ERROR("failed to create fbcon backing object %d\n", ret); … … 309 309 goto out; 310 310 } 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); 314 314 if (ret) 315 315 goto out; 316 316 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; 323 323 324 324 strcpy(info->fix.id, "vboxdrmfb"); … … 347 347 348 348 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); 350 350 351 351 info->screen_base = sysram; … … 385 385 386 386 static void vbox_fbdev_destroy(struct drm_device *dev, 387 struct vbox_fbdev * afbdev)387 struct vbox_fbdev *fbdev) 388 388 { 389 389 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; 394 394 unregister_framebuffer(info); 395 395 if (info->cmap.len) … … 402 402 afb->obj = NULL; 403 403 } 404 drm_fb_helper_fini(& afbdev->helper);405 406 vfree( afbdev->sysram);404 drm_fb_helper_fini(&fbdev->helper); 405 406 vfree(fbdev->sysram); 407 407 drm_framebuffer_unregister_private(&afb->base); 408 408 drm_framebuffer_cleanup(&afb->base); … … 413 413 { 414 414 struct vbox_private *vbox = dev->dev_private; 415 struct vbox_fbdev * afbdev;415 struct vbox_fbdev *fbdev; 416 416 int ret; 417 417 418 418 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) 421 421 return -ENOMEM; 422 422 423 vbox->fbdev = afbdev;423 vbox->fbdev = fbdev; 424 424 #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; 426 426 #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); 428 428 #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); 430 430 if (ret) 431 431 goto free; 432 432 433 ret = drm_fb_helper_single_add_all_connectors(& afbdev->helper);433 ret = drm_fb_helper_single_add_all_connectors(&fbdev->helper); 434 434 if (ret) 435 435 goto fini; … … 438 438 drm_helper_disable_unused_functions(dev); 439 439 440 ret = drm_fb_helper_initial_config(& afbdev->helper, 32);440 ret = drm_fb_helper_initial_config(&fbdev->helper, 32); 441 441 if (ret) 442 442 goto fini; … … 445 445 return 0; 446 446 fini: 447 drm_fb_helper_fini(& afbdev->helper);447 drm_fb_helper_fini(&fbdev->helper); 448 448 free: 449 kfree( afbdev);449 kfree(fbdev); 450 450 LogFunc(("vboxvideo: %d, ret=%d\n", __LINE__, ret)); 451 451 return ret; -
trunk/src/VBox/Additions/linux/drm/vbox_main.c
r59635 r59640 66 66 } 67 67 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){68 void 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) { 73 73 LogFunc(("vboxvideo: enabling VBVA.\n")); 74 pVBVA= (struct VBVABUFFER *) ( ((uint8_t *)vbox->vram)74 vbva = (struct VBVABUFFER *) ( ((uint8_t *)vbox->vram) 75 75 + vbox->vram_size 76 76 + 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)) 78 78 AssertReleaseMsgFailed(("VBoxVBVAEnable failed - heap allocation error, very old host or driver error.\n")); 79 79 } … … 101 101 if (vbox->vbva_info[0].pVBVA == NULL) { 102 102 for (i = 0; i < vbox->num_crtcs; ++i) 103 vbox_enable_ vbva(vbox, i);103 vbox_enable_accel(vbox, i); 104 104 /* Assume that if the user knows to send dirty rectangle information 105 105 * they can also handle hot-plug events. */ … … 113 113 { 114 114 unsigned crtc_id = to_vbox_crtc(crtc)->crtc_id; 115 VBVACMDHDR cmd Hdr;115 VBVACMDHDR cmd_hdr; 116 116 117 117 if ( CRTC_FB(crtc) != fb … … 123 123 || rects[i].y2 < crtc->y) 124 124 continue; 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;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; 129 129 if (VBoxVBVABufferBeginUpdate(&vbox->vbva_info[crtc_id], 130 130 &vbox->submit_info)) 131 131 { 132 VBoxVBVAWrite(&vbox->vbva_info[crtc_id], &vbox->submit_info, &cmd Hdr,133 sizeof(cmd Hdr));132 VBoxVBVAWrite(&vbox->vbva_info[crtc_id], &vbox->submit_info, &cmd_hdr, 133 sizeof(cmd_hdr)); 134 134 VBoxVBVABufferEndUpdate(&vbox->vbva_info[crtc_id]); 135 135 } … … 212 212 }; 213 213 214 static void disableVBVA(struct vbox_private *pVBox)214 static void vbox_accel_fini(struct vbox_private *vbox) 215 215 { 216 216 unsigned i; 217 217 218 if ( pVBox->vbva_info)218 if (vbox->vbva_info) 219 219 { 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 227 static int vbox_accel_init(struct vbox_private *vbox) 228 228 { 229 229 unsigned i; 230 bool fRC = true;231 230 LogFunc(("vboxvideo: %d: vbox=%p, vbox->num_crtcs=%u, vbox->vbva_info=%p\n", 232 231 __LINE__, vbox, (unsigned)vbox->num_crtcs, vbox->vbva_info)); … … 250 249 } 251 250 252 253 251 /** 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);252 static DECLCALLBACK(void *) alloc_hgsmi_environ(void *environ, HGSMISIZE size) 253 { 254 NOREF(environ); 255 return kmalloc(size, GFP_KERNEL); 258 256 } 259 257 260 258 261 259 /** Free function for the HGSMI heap and data. */ 262 static DECLCALLBACK(void) hgsmiEnvFree(void *pvEnv, void *pv)263 { 264 NOREF( pvEnv);265 kfree(p v);260 static DECLCALLBACK(void) free_hgsmi_environ(void *environ, void *ptr) 261 { 262 NOREF(environ); 263 kfree(ptr); 266 264 } 267 265 268 266 269 267 /** Pointers to the HGSMI heap and data manipulation functions. */ 270 static HGSMIENV g_hgsmiEnv=268 static HGSMIENV hgsmi_environ = 271 269 { 272 270 NULL, 273 hgsmiEnvAlloc,274 hgsmiEnvFree271 alloc_hgsmi_environ, 272 free_hgsmi_environ 275 273 }; 276 274 277 275 278 276 /** Do we support the 4.3 plus mode hint reporting interface? */ 279 static bool have HGSMImode_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_SUCCESS286 && fCursorReporting== VINF_SUCCESS;277 static 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; 287 285 } 288 286 … … 290 288 /** Set up our heaps and data exchange buffers in VRAM before handing the rest 291 289 * 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)))290 static 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))) 305 303 return -ENOMEM; 306 304 /* Reduce available VRAM size to reflect the guest heap. */ 307 pVBox->vram_size = offBase;305 vbox->vram_size = base_offset; 308 306 /* Linux drm represents monitors as a 32-bit array. */ 309 pVBox->num_crtcs = RT_MIN(VBoxHGSMIGetMonitorCount(&pVBox->submit_info), 32);310 if (!have HGSMImode_hintAndCursorReportingInterface(pVBox))307 vbox->num_crtcs = RT_MIN(VBoxHGSMIGetMonitorCount(&vbox->submit_info), 32); 308 if (!have_hgsmi_mode_hints(vbox)) 311 309 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) 314 312 return -ENOMEM; 315 return vbox_ vbva_init(pVBox);313 return vbox_accel_init(vbox); 316 314 } 317 315 … … 343 341 DRM_INFO("VRAM %08x\n", vbox->full_vram_size); 344 342 345 ret = setupAcceleration(vbox);343 ret = vbox_hw_init(vbox); 346 344 if (ret) 347 345 goto out_free; … … 394 392 drm_mode_config_cleanup(dev); 395 393 396 disableVBVA(vbox);394 vbox_accel_fini(vbox); 397 395 vbox_mm_fini(vbox); 398 396 pci_iounmap(dev->pdev, vbox->vram); -
trunk/src/VBox/Additions/linux/drm/vbox_mode.c
r59634 r59640 71 71 struct vbox_crtc *vbox_crtc = to_vbox_crtc(crtc); 72 72 struct vbox_private *vbox; 73 int width, height, cBPP, pitch;73 int width, height, bpp, pitch; 74 74 unsigned crtc_id; 75 uint16_t f Flags;75 uint16_t flags; 76 76 77 77 LogFunc(("vboxvideo: %d: vbox_crtc=%p, CRTC_FB(crtc)=%p\n", __LINE__, … … 81 81 height = mode->vdisplay ? mode->vdisplay : 480; 82 82 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; 84 84 #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; 86 86 #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; 88 88 #endif 89 89 /* if (vbox_crtc->crtc_id == 0 && crtc->enabled) 90 VBoxVideoSetModeRegisters(width, height, pitch * 8 / cBPP,90 VBoxVideoSetModeRegisters(width, height, pitch * 8 / bpp, 91 91 CRTC_FB(crtc)->bits_per_pixel, 0, 92 92 crtc->x, crtc->y); */ 93 f Flags = VBVA_SCREEN_F_ACTIVE;94 f Flags |= (crtc->enabled ? 0 : VBVA_SCREEN_F_DISABLED);93 flags = VBVA_SCREEN_F_ACTIVE; 94 flags |= (crtc->enabled ? 0 : VBVA_SCREEN_F_DISABLED); 95 95 VBoxHGSMIProcessDisplayInfo(&vbox->submit_info, vbox_crtc->crtc_id, 96 96 crtc->x, crtc->y, 97 crtc->x * cBPP/ 8 + crtc->y * pitch,97 crtc->x * bpp / 8 + crtc->y * pitch, 98 98 pitch, width, height, 99 vbox_crtc->blanked ? 0 : cBPP, fFlags);99 vbox_crtc->blanked ? 0 : bpp, flags); 100 100 VBoxHGSMIReportFlagsLocation(&vbox->submit_info, vbox->host_flags_offset); 101 101 vbox_enable_caps(vbox); … … 223 223 224 224 for (i = 0; i < vbox->num_crtcs; ++i) 225 vbox_enable_ vbva(vbox, i);225 vbox_enable_accel(vbox, i); 226 226 } 227 227 vbox_bo_unreserve(bo); … … 415 415 { 416 416 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; 420 420 421 421 LogFunc(("vboxvideo: %d: connector=%p\n", __LINE__, connector)); 422 422 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, 427 427 false, false); 428 if ( pMode)428 if (mode) 429 429 { 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; 435 435 } 436 436 … … 468 468 } 469 469 470 static int vbox_fill_modes(struct drm_connector *connector, uint32_t xMax, uint32_t yMax)470 static int vbox_fill_modes(struct drm_connector *connector, uint32_t max_x, uint32_t max_y) 471 471 { 472 472 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)); 478 478 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) 481 481 { 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); 486 486 } 487 487 … … 504 504 { 505 505 struct vbox_connector *vbox_connector; 506 struct vbox_private * pVBox;506 struct vbox_private *vbox; 507 507 508 508 LogFunc(("vboxvideo: %d: dev=%p, pAttr=%p, psz=%s, cch=%llu\n", __LINE__, … … 510 510 vbox_connector = container_of(pAttr, struct vbox_connector, 511 511 sysfs_node); 512 pVBox = vbox_connector->base.dev->dev_private;512 vbox = vbox_connector->base.dev->dev_private; 513 513 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); 516 516 return cch; 517 517 } … … 575 575 } 576 576 577 #if 0 578 /* allocate cursor cache and pin at start of VRAM */ 579 int vbox_cursor_init(struct drm_device *dev) 577 int vbox_mode_init(struct drm_device *dev) 580 578 { 581 579 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 #endif623 624 int vbox_mode_init(struct drm_device *dev)625 {626 struct vbox_private *pVBox = dev->dev_private;627 580 struct drm_encoder *encoder; 628 581 unsigned i; 629 582 /* vbox_cursor_init(dev); */ 630 583 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) 632 585 { 633 586 vbox_crtc_init(dev, i); … … 720 673 if (!src_isiomem) 721 674 { 722 uint32_t f Flags = VBOX_MOUSE_POINTER_VISIBLE675 uint32_t flags = VBOX_MOUSE_POINTER_VISIBLE 723 676 | VBOX_MOUSE_POINTER_SHAPE 724 677 | VBOX_MOUSE_POINTER_ALPHA; 725 678 copy_cursor_image(src, dst, width, height, cbMask); 726 rc = VBoxHGSMIUpdatePointerShape(&vbox->submit_info, f Flags,679 rc = VBoxHGSMIUpdatePointerShape(&vbox->submit_info, flags, 727 680 hot_x, hot_y, width, 728 681 height, dst, cbData);
Note:
See TracChangeset
for help on using the changeset viewer.