Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c486d4f8 authored by Thomas Hellstrom's avatar Thomas Hellstrom
Browse files

drm/vmwgfx: Make vmwgfx dma buffers prime aware



Should we need to share dma buffers using prime, let's make them prime
aware.

Signed-off-by: default avatarThomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: default avatarJakob Bornecrantz <jakob@vmware.com>
parent 79e5f810
Loading
Loading
Loading
Loading
+25 −20
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@
#define VMW_RES_EVICT_ERR_COUNT 10

struct vmw_user_dma_buffer {
	struct ttm_base_object base;
	struct ttm_prime_object prime;
	struct vmw_dma_buffer dma;
};

@@ -387,7 +387,7 @@ static void vmw_user_dmabuf_destroy(struct ttm_buffer_object *bo)
{
	struct vmw_user_dma_buffer *vmw_user_bo = vmw_user_dma_buffer(bo);

	ttm_base_object_kfree(vmw_user_bo, base);
	ttm_prime_object_kfree(vmw_user_bo, prime);
}

static void vmw_user_dmabuf_release(struct ttm_base_object **p_base)
@@ -401,7 +401,8 @@ static void vmw_user_dmabuf_release(struct ttm_base_object **p_base)
	if (unlikely(base == NULL))
		return;

	vmw_user_bo = container_of(base, struct vmw_user_dma_buffer, base);
	vmw_user_bo = container_of(base, struct vmw_user_dma_buffer,
				   prime.base);
	bo = &vmw_user_bo->dma.base;
	ttm_bo_unref(&bo);
}
@@ -442,8 +443,9 @@ int vmw_user_dmabuf_alloc(struct vmw_private *dev_priv,
		return ret;

	tmp = ttm_bo_reference(&user_bo->dma.base);
	ret = ttm_base_object_init(tfile,
				   &user_bo->base,
	ret = ttm_prime_object_init(tfile,
				    size,
				    &user_bo->prime,
				    shareable,
				    ttm_buffer_type,
				    &vmw_user_dmabuf_release, NULL);
@@ -453,7 +455,7 @@ int vmw_user_dmabuf_alloc(struct vmw_private *dev_priv,
	}

	*p_dma_buf = &user_bo->dma;
	*handle = user_bo->base.hash.key;
	*handle = user_bo->prime.base.hash.key;

out_no_base_object:
	return ret;
@@ -475,8 +477,8 @@ int vmw_user_dmabuf_verify_access(struct ttm_buffer_object *bo,
		return -EPERM;

	vmw_user_bo = vmw_user_dma_buffer(bo);
	return (vmw_user_bo->base.tfile == tfile ||
	vmw_user_bo->base.shareable) ? 0 : -EPERM;
	return (vmw_user_bo->prime.base.tfile == tfile ||
		vmw_user_bo->prime.base.shareable) ? 0 : -EPERM;
}

int vmw_dmabuf_alloc_ioctl(struct drm_device *dev, void *data,
@@ -538,14 +540,15 @@ int vmw_user_dmabuf_lookup(struct ttm_object_file *tfile,
		return -ESRCH;
	}

	if (unlikely(base->object_type != ttm_buffer_type)) {
	if (unlikely(ttm_base_object_type(base) != ttm_buffer_type)) {
		ttm_base_object_unref(&base);
		printk(KERN_ERR "Invalid buffer object handle 0x%08lx.\n",
		       (unsigned long)handle);
		return -EINVAL;
	}

	vmw_user_bo = container_of(base, struct vmw_user_dma_buffer, base);
	vmw_user_bo = container_of(base, struct vmw_user_dma_buffer,
				   prime.base);
	(void)ttm_bo_reference(&vmw_user_bo->dma.base);
	ttm_base_object_unref(&base);
	*out = &vmw_user_bo->dma;
@@ -562,7 +565,8 @@ int vmw_user_dmabuf_reference(struct ttm_object_file *tfile,
		return -EINVAL;

	user_bo = container_of(dma_buf, struct vmw_user_dma_buffer, dma);
	return ttm_ref_object_add(tfile, &user_bo->base, TTM_REF_USAGE, NULL);
	return ttm_ref_object_add(tfile, &user_bo->prime.base,
				  TTM_REF_USAGE, NULL);
}

/*
@@ -807,15 +811,16 @@ int vmw_dumb_create(struct drm_file *file_priv,
		goto out_no_dmabuf;

	tmp = ttm_bo_reference(&vmw_user_bo->dma.base);
	ret = ttm_base_object_init(vmw_fpriv(file_priv)->tfile,
				   &vmw_user_bo->base,
	ret = ttm_prime_object_init(vmw_fpriv(file_priv)->tfile,
				    args->size,
				    &vmw_user_bo->prime,
				    false,
				    ttm_buffer_type,
				    &vmw_user_dmabuf_release, NULL);
	if (unlikely(ret != 0))
		goto out_no_base_object;

	args->handle = vmw_user_bo->base.hash.key;
	args->handle = vmw_user_bo->prime.base.hash.key;

out_no_base_object:
	ttm_bo_unref(&tmp);