diff options
| author | Thomas Hellstrom <thellstrom@vmware.com> | 2010-01-13 16:28:39 -0500 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2010-01-13 21:18:43 -0500 |
| commit | effe1105bef07f42366c20eac41b80ff9fcf675e (patch) | |
| tree | d4341a955614b8be1732f4ffc37f39016dffa61d | |
| parent | 7704befbd599e9c9524f640e14658ca8ed9d8717 (diff) | |
drm/vmwgfx: Use bo_driver::move_notify to unbind GMRs.
This was previously done explicitly for overlay- and fb buffers.
Now it's done for any buffer leaving the SYSTEM memory region.
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_fb.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | 23 |
5 files changed, 22 insertions, 29 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c index d6f2d2b882e9..4be47d84077f 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c | |||
| @@ -172,6 +172,13 @@ static int vmw_verify_access(struct ttm_buffer_object *bo, struct file *filp) | |||
| 172 | return 0; | 172 | return 0; |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | static void vmw_move_notify(struct ttm_buffer_object *bo, | ||
| 176 | struct ttm_mem_reg *new_mem) | ||
| 177 | { | ||
| 178 | if (new_mem->mem_type != TTM_PL_SYSTEM) | ||
| 179 | vmw_dmabuf_gmr_unbind(bo); | ||
| 180 | } | ||
| 181 | |||
| 175 | /** | 182 | /** |
| 176 | * FIXME: We're using the old vmware polling method to sync. | 183 | * FIXME: We're using the old vmware polling method to sync. |
| 177 | * Do this with fences instead. | 184 | * Do this with fences instead. |
| @@ -225,5 +232,6 @@ struct ttm_bo_driver vmw_bo_driver = { | |||
| 225 | .sync_obj_wait = vmw_sync_obj_wait, | 232 | .sync_obj_wait = vmw_sync_obj_wait, |
| 226 | .sync_obj_flush = vmw_sync_obj_flush, | 233 | .sync_obj_flush = vmw_sync_obj_flush, |
| 227 | .sync_obj_unref = vmw_sync_obj_unref, | 234 | .sync_obj_unref = vmw_sync_obj_unref, |
| 228 | .sync_obj_ref = vmw_sync_obj_ref | 235 | .sync_obj_ref = vmw_sync_obj_ref, |
| 236 | .move_notify = vmw_move_notify | ||
| 229 | }; | 237 | }; |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h index e61bd85b6975..4c9d6b2b9958 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | |||
| @@ -353,6 +353,7 @@ extern int vmw_dmabuf_to_start_of_vram(struct vmw_private *vmw_priv, | |||
| 353 | struct vmw_dma_buffer *bo); | 353 | struct vmw_dma_buffer *bo); |
| 354 | extern int vmw_dmabuf_from_vram(struct vmw_private *vmw_priv, | 354 | extern int vmw_dmabuf_from_vram(struct vmw_private *vmw_priv, |
| 355 | struct vmw_dma_buffer *bo); | 355 | struct vmw_dma_buffer *bo); |
| 356 | extern void vmw_dmabuf_gmr_unbind(struct ttm_buffer_object *bo); | ||
| 356 | extern int vmw_stream_claim_ioctl(struct drm_device *dev, void *data, | 357 | extern int vmw_stream_claim_ioctl(struct drm_device *dev, void *data, |
| 357 | struct drm_file *file_priv); | 358 | struct drm_file *file_priv); |
| 358 | extern int vmw_stream_unref_ioctl(struct drm_device *dev, void *data, | 359 | extern int vmw_stream_unref_ioctl(struct drm_device *dev, void *data, |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c index 641dde76ada1..4f4f6432be8b 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c | |||
| @@ -649,14 +649,6 @@ int vmw_dmabuf_to_start_of_vram(struct vmw_private *vmw_priv, | |||
| 649 | if (unlikely(ret != 0)) | 649 | if (unlikely(ret != 0)) |
| 650 | goto err_unlock; | 650 | goto err_unlock; |
| 651 | 651 | ||
| 652 | if (vmw_bo->gmr_bound) { | ||
| 653 | vmw_gmr_unbind(vmw_priv, vmw_bo->gmr_id); | ||
| 654 | spin_lock(&bo->glob->lru_lock); | ||
| 655 | ida_remove(&vmw_priv->gmr_ida, vmw_bo->gmr_id); | ||
| 656 | spin_unlock(&bo->glob->lru_lock); | ||
| 657 | vmw_bo->gmr_bound = NULL; | ||
| 658 | } | ||
| 659 | |||
| 660 | ret = ttm_bo_validate(bo, &ne_placement, false, false); | 652 | ret = ttm_bo_validate(bo, &ne_placement, false, false); |
| 661 | ttm_bo_unreserve(bo); | 653 | ttm_bo_unreserve(bo); |
| 662 | err_unlock: | 654 | err_unlock: |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c b/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c index bb6e6a096d25..5b6eabeb7f51 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c | |||
| @@ -104,7 +104,6 @@ static int vmw_dmabuf_pin_in_vram(struct vmw_private *dev_priv, | |||
| 104 | bool pin, bool interruptible) | 104 | bool pin, bool interruptible) |
| 105 | { | 105 | { |
| 106 | struct ttm_buffer_object *bo = &buf->base; | 106 | struct ttm_buffer_object *bo = &buf->base; |
| 107 | struct ttm_bo_global *glob = bo->glob; | ||
| 108 | struct ttm_placement *overlay_placement = &vmw_vram_placement; | 107 | struct ttm_placement *overlay_placement = &vmw_vram_placement; |
| 109 | int ret; | 108 | int ret; |
| 110 | 109 | ||
| @@ -116,14 +115,6 @@ static int vmw_dmabuf_pin_in_vram(struct vmw_private *dev_priv, | |||
| 116 | if (unlikely(ret != 0)) | 115 | if (unlikely(ret != 0)) |
| 117 | goto err; | 116 | goto err; |
| 118 | 117 | ||
| 119 | if (buf->gmr_bound) { | ||
| 120 | vmw_gmr_unbind(dev_priv, buf->gmr_id); | ||
| 121 | spin_lock(&glob->lru_lock); | ||
| 122 | ida_remove(&dev_priv->gmr_ida, buf->gmr_id); | ||
| 123 | spin_unlock(&glob->lru_lock); | ||
| 124 | buf->gmr_bound = NULL; | ||
| 125 | } | ||
| 126 | |||
| 127 | if (pin) | 118 | if (pin) |
| 128 | overlay_placement = &vmw_vram_ne_placement; | 119 | overlay_placement = &vmw_vram_ne_placement; |
| 129 | 120 | ||
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c index 125c2f44f98c..e0878077e8aa 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | |||
| @@ -757,20 +757,29 @@ static size_t vmw_dmabuf_acc_size(struct ttm_bo_global *glob, | |||
| 757 | return bo_user_size + page_array_size; | 757 | return bo_user_size + page_array_size; |
| 758 | } | 758 | } |
| 759 | 759 | ||
| 760 | void vmw_dmabuf_bo_free(struct ttm_buffer_object *bo) | 760 | void vmw_dmabuf_gmr_unbind(struct ttm_buffer_object *bo) |
| 761 | { | 761 | { |
| 762 | struct vmw_dma_buffer *vmw_bo = vmw_dma_buffer(bo); | 762 | struct vmw_dma_buffer *vmw_bo = vmw_dma_buffer(bo); |
| 763 | struct ttm_bo_global *glob = bo->glob; | 763 | struct ttm_bo_global *glob = bo->glob; |
| 764 | struct vmw_private *dev_priv = | 764 | struct vmw_private *dev_priv = |
| 765 | container_of(bo->bdev, struct vmw_private, bdev); | 765 | container_of(bo->bdev, struct vmw_private, bdev); |
| 766 | 766 | ||
| 767 | ttm_mem_global_free(glob->mem_glob, bo->acc_size); | ||
| 768 | if (vmw_bo->gmr_bound) { | 767 | if (vmw_bo->gmr_bound) { |
| 769 | vmw_gmr_unbind(dev_priv, vmw_bo->gmr_id); | 768 | vmw_gmr_unbind(dev_priv, vmw_bo->gmr_id); |
| 770 | spin_lock(&glob->lru_lock); | 769 | spin_lock(&glob->lru_lock); |
| 771 | ida_remove(&dev_priv->gmr_ida, vmw_bo->gmr_id); | 770 | ida_remove(&dev_priv->gmr_ida, vmw_bo->gmr_id); |
| 772 | spin_unlock(&glob->lru_lock); | 771 | spin_unlock(&glob->lru_lock); |
| 772 | vmw_bo->gmr_bound = false; | ||
| 773 | } | 773 | } |
| 774 | } | ||
| 775 | |||
| 776 | void vmw_dmabuf_bo_free(struct ttm_buffer_object *bo) | ||
| 777 | { | ||
| 778 | struct vmw_dma_buffer *vmw_bo = vmw_dma_buffer(bo); | ||
| 779 | struct ttm_bo_global *glob = bo->glob; | ||
| 780 | |||
| 781 | vmw_dmabuf_gmr_unbind(bo); | ||
| 782 | ttm_mem_global_free(glob->mem_glob, bo->acc_size); | ||
| 774 | kfree(vmw_bo); | 783 | kfree(vmw_bo); |
| 775 | } | 784 | } |
| 776 | 785 | ||
| @@ -816,18 +825,10 @@ int vmw_dmabuf_init(struct vmw_private *dev_priv, | |||
| 816 | static void vmw_user_dmabuf_destroy(struct ttm_buffer_object *bo) | 825 | static void vmw_user_dmabuf_destroy(struct ttm_buffer_object *bo) |
| 817 | { | 826 | { |
| 818 | struct vmw_user_dma_buffer *vmw_user_bo = vmw_user_dma_buffer(bo); | 827 | struct vmw_user_dma_buffer *vmw_user_bo = vmw_user_dma_buffer(bo); |
| 819 | struct vmw_dma_buffer *vmw_bo = &vmw_user_bo->dma; | ||
| 820 | struct ttm_bo_global *glob = bo->glob; | 828 | struct ttm_bo_global *glob = bo->glob; |
| 821 | struct vmw_private *dev_priv = | ||
| 822 | container_of(bo->bdev, struct vmw_private, bdev); | ||
| 823 | 829 | ||
| 830 | vmw_dmabuf_gmr_unbind(bo); | ||
| 824 | ttm_mem_global_free(glob->mem_glob, bo->acc_size); | 831 | ttm_mem_global_free(glob->mem_glob, bo->acc_size); |
| 825 | if (vmw_bo->gmr_bound) { | ||
| 826 | vmw_gmr_unbind(dev_priv, vmw_bo->gmr_id); | ||
| 827 | spin_lock(&glob->lru_lock); | ||
| 828 | ida_remove(&dev_priv->gmr_ida, vmw_bo->gmr_id); | ||
| 829 | spin_unlock(&glob->lru_lock); | ||
| 830 | } | ||
| 831 | kfree(vmw_user_bo); | 832 | kfree(vmw_user_bo); |
| 832 | } | 833 | } |
| 833 | 834 | ||
