diff options
Diffstat (limited to 'drivers/gpu/drm/lima/lima_gem_prime.c')
| -rw-r--r-- | drivers/gpu/drm/lima/lima_gem_prime.c | 47 | 
1 files changed, 47 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/lima/lima_gem_prime.c b/drivers/gpu/drm/lima/lima_gem_prime.c new file mode 100644 index 000000000000..9c6d9f1dba55 --- /dev/null +++ b/drivers/gpu/drm/lima/lima_gem_prime.c @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: GPL-2.0 OR MIT +/* Copyright 2018-2019 Qiang Yu <[email protected]> */ + +#include <linux/dma-buf.h> +#include <drm/drm_prime.h> +#include <drm/drm_drv.h> +#include <drm/drm_file.h> + +#include "lima_device.h" +#include "lima_object.h" +#include "lima_gem.h" +#include "lima_gem_prime.h" + +struct drm_gem_object *lima_gem_prime_import_sg_table( +	struct drm_device *dev, struct dma_buf_attachment *attach, +	struct sg_table *sgt) +{ +	struct lima_device *ldev = to_lima_dev(dev); +	struct lima_bo *bo; + +	bo = lima_bo_create(ldev, attach->dmabuf->size, 0, sgt, +			    attach->dmabuf->resv); +	if (IS_ERR(bo)) +		return ERR_CAST(bo); + +	return &bo->gem; +} + +struct sg_table *lima_gem_prime_get_sg_table(struct drm_gem_object *obj) +{ +	struct lima_bo *bo = to_lima_bo(obj); +	int npages = obj->size >> PAGE_SHIFT; + +	return drm_prime_pages_to_sg(bo->pages, npages); +} + +int lima_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma) +{ +	int ret; + +	ret = drm_gem_mmap_obj(obj, obj->size, vma); +	if (ret) +		return ret; + +	lima_set_vma_flags(vma); +	return 0; +} |