diff options
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_surface.c')
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_surface.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c index 979da1c246a5..e7af580ab977 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c | |||
@@ -830,6 +830,24 @@ int vmw_surface_define_ioctl(struct drm_device *dev, void *data, | |||
830 | if (unlikely(ret != 0)) | 830 | if (unlikely(ret != 0)) |
831 | goto out_unlock; | 831 | goto out_unlock; |
832 | 832 | ||
833 | /* | ||
834 | * A gb-aware client referencing a shared surface will | ||
835 | * expect a backup buffer to be present. | ||
836 | */ | ||
837 | if (dev_priv->has_mob && req->shareable) { | ||
838 | uint32_t backup_handle; | ||
839 | |||
840 | ret = vmw_user_dmabuf_alloc(dev_priv, tfile, | ||
841 | res->backup_size, | ||
842 | true, | ||
843 | &backup_handle, | ||
844 | &res->backup); | ||
845 | if (unlikely(ret != 0)) { | ||
846 | vmw_resource_unreference(&res); | ||
847 | goto out_unlock; | ||
848 | } | ||
849 | } | ||
850 | |||
833 | tmp = vmw_resource_reference(&srf->res); | 851 | tmp = vmw_resource_reference(&srf->res); |
834 | ret = ttm_prime_object_init(tfile, res->backup_size, &user_srf->prime, | 852 | ret = ttm_prime_object_init(tfile, res->backup_size, &user_srf->prime, |
835 | req->shareable, VMW_RES_SURFACE, | 853 | req->shareable, VMW_RES_SURFACE, |
@@ -908,8 +926,8 @@ int vmw_surface_reference_ioctl(struct drm_device *dev, void *data, | |||
908 | rep->size_addr; | 926 | rep->size_addr; |
909 | 927 | ||
910 | if (user_sizes) | 928 | if (user_sizes) |
911 | ret = copy_to_user(user_sizes, srf->sizes, | 929 | ret = copy_to_user(user_sizes, &srf->base_size, |
912 | srf->num_sizes * sizeof(*srf->sizes)); | 930 | sizeof(srf->base_size)); |
913 | if (unlikely(ret != 0)) { | 931 | if (unlikely(ret != 0)) { |
914 | DRM_ERROR("copy_to_user failed %p %u\n", | 932 | DRM_ERROR("copy_to_user failed %p %u\n", |
915 | user_sizes, srf->num_sizes); | 933 | user_sizes, srf->num_sizes); |
@@ -1111,7 +1129,7 @@ static int vmw_gb_surface_destroy(struct vmw_resource *res) | |||
1111 | return 0; | 1129 | return 0; |
1112 | 1130 | ||
1113 | mutex_lock(&dev_priv->binding_mutex); | 1131 | mutex_lock(&dev_priv->binding_mutex); |
1114 | vmw_context_binding_res_list_kill(&res->binding_head); | 1132 | vmw_context_binding_res_list_scrub(&res->binding_head); |
1115 | 1133 | ||
1116 | cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); | 1134 | cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd)); |
1117 | if (unlikely(cmd == NULL)) { | 1135 | if (unlikely(cmd == NULL)) { |