diff options
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 19 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | 2 |
4 files changed, 30 insertions, 1 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c index 37a81925b158..825ebe3d89d5 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c | |||
| @@ -48,6 +48,15 @@ struct ttm_placement vmw_vram_placement = { | |||
| 48 | .busy_placement = &vram_placement_flags | 48 | .busy_placement = &vram_placement_flags |
| 49 | }; | 49 | }; |
| 50 | 50 | ||
| 51 | struct ttm_placement vmw_vram_sys_placement = { | ||
| 52 | .fpfn = 0, | ||
| 53 | .lpfn = 0, | ||
| 54 | .num_placement = 1, | ||
| 55 | .placement = &vram_placement_flags, | ||
| 56 | .num_busy_placement = 1, | ||
| 57 | .busy_placement = &sys_placement_flags | ||
| 58 | }; | ||
| 59 | |||
| 51 | struct ttm_placement vmw_vram_ne_placement = { | 60 | struct ttm_placement vmw_vram_ne_placement = { |
| 52 | .fpfn = 0, | 61 | .fpfn = 0, |
| 53 | .lpfn = 0, | 62 | .lpfn = 0, |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h index 7532b9b47eec..50529a7f06fb 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | |||
| @@ -404,6 +404,7 @@ extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma); | |||
| 404 | 404 | ||
| 405 | extern struct ttm_placement vmw_vram_placement; | 405 | extern struct ttm_placement vmw_vram_placement; |
| 406 | extern struct ttm_placement vmw_vram_ne_placement; | 406 | extern struct ttm_placement vmw_vram_ne_placement; |
| 407 | extern struct ttm_placement vmw_vram_sys_placement; | ||
| 407 | extern struct ttm_placement vmw_sys_placement; | 408 | extern struct ttm_placement vmw_sys_placement; |
| 408 | extern struct ttm_bo_driver vmw_bo_driver; | 409 | extern struct ttm_bo_driver vmw_bo_driver; |
| 409 | extern int vmw_dma_quiescent(struct drm_device *dev); | 410 | extern int vmw_dma_quiescent(struct drm_device *dev); |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c index 2e92da567403..d69caf92ffe7 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | |||
| @@ -490,10 +490,29 @@ static int vmw_validate_single_buffer(struct vmw_private *dev_priv, | |||
| 490 | if (vmw_dmabuf_gmr(bo) != SVGA_GMR_NULL) | 490 | if (vmw_dmabuf_gmr(bo) != SVGA_GMR_NULL) |
| 491 | return 0; | 491 | return 0; |
| 492 | 492 | ||
| 493 | /** | ||
| 494 | * Put BO in VRAM, only if there is space. | ||
| 495 | */ | ||
| 496 | |||
| 497 | ret = ttm_bo_validate(bo, &vmw_vram_sys_placement, true, false); | ||
| 498 | if (unlikely(ret == -ERESTARTSYS)) | ||
| 499 | return ret; | ||
| 500 | |||
| 501 | /** | ||
| 502 | * Otherwise, set it up as GMR. | ||
| 503 | */ | ||
| 504 | |||
| 505 | if (vmw_dmabuf_gmr(bo) != SVGA_GMR_NULL) | ||
| 506 | return 0; | ||
| 507 | |||
| 493 | ret = vmw_gmr_bind(dev_priv, bo); | 508 | ret = vmw_gmr_bind(dev_priv, bo); |
| 494 | if (likely(ret == 0 || ret == -ERESTARTSYS)) | 509 | if (likely(ret == 0 || ret == -ERESTARTSYS)) |
| 495 | return ret; | 510 | return ret; |
| 496 | 511 | ||
| 512 | /** | ||
| 513 | * If that failed, try VRAM again, this time evicting | ||
| 514 | * previous contents. | ||
| 515 | */ | ||
| 497 | 516 | ||
| 498 | ret = ttm_bo_validate(bo, &vmw_vram_placement, true, false); | 517 | ret = ttm_bo_validate(bo, &vmw_vram_placement, true, false); |
| 499 | return ret; | 518 | return ret; |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c index e0878077e8aa..e01db120efff 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | |||
| @@ -872,7 +872,7 @@ int vmw_dmabuf_alloc_ioctl(struct drm_device *dev, void *data, | |||
| 872 | } | 872 | } |
| 873 | 873 | ||
| 874 | ret = vmw_dmabuf_init(dev_priv, &vmw_user_bo->dma, req->size, | 874 | ret = vmw_dmabuf_init(dev_priv, &vmw_user_bo->dma, req->size, |
| 875 | &vmw_vram_placement, true, | 875 | &vmw_vram_sys_placement, true, |
| 876 | &vmw_user_dmabuf_destroy); | 876 | &vmw_user_dmabuf_destroy); |
| 877 | if (unlikely(ret != 0)) | 877 | if (unlikely(ret != 0)) |
| 878 | return ret; | 878 | return ret; |
