drm/vmwgfx: Make surfaces prime-aware
authorThomas Hellstrom <thellstrom@vmware.com>
Fri, 8 Nov 2013 10:12:51 +0000 (02:12 -0800)
committerThomas Hellstrom <thellstrom@vmware.com>
Mon, 18 Nov 2013 12:12:19 +0000 (04:12 -0800)
Add prime exporting and imporing operations to surfaces

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
drivers/gpu/drm/vmwgfx/vmwgfx_surface.c

index 5aace80..83be709 100644 (file)
@@ -297,7 +297,7 @@ int vmw_user_resource_lookup_handle(struct vmw_private *dev_priv,
        if (unlikely(base == NULL))
                return -EINVAL;
 
-       if (unlikely(base->object_type != converter->object_type))
+       if (unlikely(ttm_base_object_type(base) != converter->object_type))
                goto out_bad_resource;
 
        res = converter->base_obj_to_res(base);
index 5828143..7de2ea8 100644 (file)
@@ -38,7 +38,7 @@
  * @size:           TTM accounting size for the surface.
  */
 struct vmw_user_surface {
-       struct ttm_base_object base;
+       struct ttm_prime_object prime;
        struct vmw_surface srf;
        uint32_t size;
        uint32_t backup_handle;
@@ -580,7 +580,8 @@ static int vmw_surface_init(struct vmw_private *dev_priv,
 static struct vmw_resource *
 vmw_user_surface_base_to_res(struct ttm_base_object *base)
 {
-       return &(container_of(base, struct vmw_user_surface, base)->srf.res);
+       return &(container_of(base, struct vmw_user_surface,
+                             prime.base)->srf.res);
 }
 
 /**
@@ -599,7 +600,7 @@ static void vmw_user_surface_free(struct vmw_resource *res)
        kfree(srf->offsets);
        kfree(srf->sizes);
        kfree(srf->snooper.image);
-       ttm_base_object_kfree(user_srf, base);
+       ttm_prime_object_kfree(user_srf, prime);
        ttm_mem_global_free(vmw_mem_glob(dev_priv), size);
 }
 
@@ -616,7 +617,7 @@ static void vmw_user_surface_base_release(struct ttm_base_object **p_base)
 {
        struct ttm_base_object *base = *p_base;
        struct vmw_user_surface *user_srf =
-           container_of(base, struct vmw_user_surface, base);
+           container_of(base, struct vmw_user_surface, prime.base);
        struct vmw_resource *res = &user_srf->srf.res;
 
        *p_base = NULL;
@@ -790,8 +791,8 @@ int vmw_surface_define_ioctl(struct drm_device *dev, void *data,
        }
        srf->snooper.crtc = NULL;
 
-       user_srf->base.shareable = false;
-       user_srf->base.tfile = NULL;
+       user_srf->prime.base.shareable = false;
+       user_srf->prime.base.tfile = NULL;
 
        /**
         * From this point, the generic resource management functions
@@ -803,9 +804,9 @@ int vmw_surface_define_ioctl(struct drm_device *dev, void *data,
                goto out_unlock;
 
        tmp = vmw_resource_reference(&srf->res);
-       ret = ttm_base_object_init(tfile, &user_srf->base,
-                                  req->shareable, VMW_RES_SURFACE,
-                                  &vmw_user_surface_base_release, NULL);
+       ret = ttm_prime_object_init(tfile, res->backup_size, &user_srf->prime,
+                                   req->shareable, VMW_RES_SURFACE,
+                                   &vmw_user_surface_base_release, NULL);
 
        if (unlikely(ret != 0)) {
                vmw_resource_unreference(&tmp);
@@ -813,7 +814,7 @@ int vmw_surface_define_ioctl(struct drm_device *dev, void *data,
                goto out_unlock;
        }
 
-       rep->sid = user_srf->base.hash.key;
+       rep->sid = user_srf->prime.base.hash.key;
        vmw_resource_unreference(&res);
 
        ttm_read_unlock(&vmaster->lock);
@@ -823,7 +824,7 @@ out_no_copy:
 out_no_offsets:
        kfree(srf->sizes);
 out_no_sizes:
-       ttm_base_object_kfree(user_srf, base);
+       ttm_prime_object_kfree(user_srf, prime);
 out_no_user_srf:
        ttm_mem_global_free(vmw_mem_glob(dev_priv), size);
 out_unlock:
@@ -859,13 +860,14 @@ int vmw_surface_reference_ioctl(struct drm_device *dev, void *data,
                return -EINVAL;
        }
 
-       if (unlikely(base->object_type != VMW_RES_SURFACE))
+       if (unlikely(ttm_base_object_type(base) != VMW_RES_SURFACE))
                goto out_bad_resource;
 
-       user_srf = container_of(base, struct vmw_user_surface, base);
+       user_srf = container_of(base, struct vmw_user_surface, prime.base);
        srf = &user_srf->srf;
 
-       ret = ttm_ref_object_add(tfile, &user_srf->base, TTM_REF_USAGE, NULL);
+       ret = ttm_ref_object_add(tfile, &user_srf->prime.base,
+                                TTM_REF_USAGE, NULL);
        if (unlikely(ret != 0)) {
                DRM_ERROR("Could not add a reference to a surface.\n");
                goto out_no_reference;