mirror of
https://github.com/torvalds/linux.git
synced 2024-12-21 10:31:54 +00:00
drm/vmwgfx: Make surfaces prime-aware
Add prime exporting and imporing operations to surfaces Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
This commit is contained in:
parent
69977ff55e
commit
79e5f81003
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user