[Intel-gfx] [PATCH v2 2/3] dma-buf: Use struct dma_buf_map in dma_buf_vmap() interfaces
Daniel Vetter
daniel at ffwll.ch
Wed Sep 23 15:39:08 UTC 2020
On Wed, Sep 23, 2020 at 02:32:04PM +0200, Thomas Zimmermann wrote:
> This patch updates dma_buf_vmap() and dma-buf's vmap callback to use
> struct dma_buf_map.
>
> The interfaces used to return a buffer address. This address now gets
> stored in an instance of the structure that is given as an additional
> argument. The functions return an errno code on errors.
>
> Users of the functions are updated accordingly. This is only an interface
> change. It is currently expected that dma-buf memory can be accessed with
> system memory load/store operations.
>
> v2:
> * always clear map parameter in dma_buf_vmap() (Daniel)
> * include dma-buf-heaps and i915 selftests (kernel test robot)
>
> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
> Acked-by: Sumit Semwal <sumit.semwal at linaro.org>
Too lazy to check for all possible conversion issues, but I think I've
done a close look last time around. As long as this is build tested across
all drivers and architectures we care about we should be fine.
Acked-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
> drivers/dma-buf/dma-buf.c | 28 +++++++++++--------
> drivers/dma-buf/heaps/heap-helpers.c | 8 ++++--
> drivers/gpu/drm/drm_gem_cma_helper.c | 13 +++++----
> drivers/gpu/drm/drm_gem_shmem_helper.c | 14 ++++++----
> drivers/gpu/drm/drm_prime.c | 8 ++++--
> drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c | 8 +++++-
> drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c | 11 ++++++--
> .../drm/i915/gem/selftests/i915_gem_dmabuf.c | 12 ++++++--
> .../gpu/drm/i915/gem/selftests/mock_dmabuf.c | 10 +++++--
> drivers/gpu/drm/tegra/gem.c | 18 ++++++++----
> .../common/videobuf2/videobuf2-dma-contig.c | 14 +++++++---
> .../media/common/videobuf2/videobuf2-dma-sg.c | 16 +++++++----
> .../common/videobuf2/videobuf2-vmalloc.c | 15 +++++++---
> include/drm/drm_prime.h | 3 +-
> include/linux/dma-buf-map.h | 13 +++++++++
> include/linux/dma-buf.h | 6 ++--
> 16 files changed, 138 insertions(+), 59 deletions(-)
>
> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
> index 5e849ca241a0..61bd24d21b38 100644
> --- a/drivers/dma-buf/dma-buf.c
> +++ b/drivers/dma-buf/dma-buf.c
> @@ -1186,46 +1186,50 @@ EXPORT_SYMBOL_GPL(dma_buf_mmap);
> * dma_buf_vmap - Create virtual mapping for the buffer object into kernel
> * address space. Same restrictions as for vmap and friends apply.
> * @dmabuf: [in] buffer to vmap
> + * @map: [out] returns the vmap pointer
> *
> * This call may fail due to lack of virtual mapping address space.
> * These calls are optional in drivers. The intended use for them
> * is for mapping objects linear in kernel space for high use objects.
> * Please attempt to use kmap/kunmap before thinking about these interfaces.
> *
> - * Returns NULL on error.
> + * Returns 0 on success, or a negative errno code otherwise.
> */
> -void *dma_buf_vmap(struct dma_buf *dmabuf)
> +int dma_buf_vmap(struct dma_buf *dmabuf, struct dma_buf_map *map)
> {
> - void *ptr;
> + struct dma_buf_map ptr;
> + int ret = 0;
> +
> + dma_buf_map_clear(map);
>
> if (WARN_ON(!dmabuf))
> - return NULL;
> + return -EINVAL;
>
> if (!dmabuf->ops->vmap)
> - return NULL;
> + return -EINVAL;
>
> mutex_lock(&dmabuf->lock);
> if (dmabuf->vmapping_counter) {
> dmabuf->vmapping_counter++;
> BUG_ON(dma_buf_map_is_null(&dmabuf->vmap_ptr));
> - ptr = dmabuf->vmap_ptr.vaddr;
> + *map = dmabuf->vmap_ptr;
> goto out_unlock;
> }
>
> BUG_ON(dma_buf_map_is_set(&dmabuf->vmap_ptr));
>
> - ptr = dmabuf->ops->vmap(dmabuf);
> - if (WARN_ON_ONCE(IS_ERR(ptr)))
> - ptr = NULL;
> - if (!ptr)
> + ret = dmabuf->ops->vmap(dmabuf, &ptr);
> + if (WARN_ON_ONCE(ret))
> goto out_unlock;
>
> - dmabuf->vmap_ptr.vaddr = ptr;
> + dmabuf->vmap_ptr = ptr;
> dmabuf->vmapping_counter = 1;
>
> + *map = dmabuf->vmap_ptr;
> +
> out_unlock:
> mutex_unlock(&dmabuf->lock);
> - return ptr;
> + return ret;
> }
> EXPORT_SYMBOL_GPL(dma_buf_vmap);
>
> diff --git a/drivers/dma-buf/heaps/heap-helpers.c b/drivers/dma-buf/heaps/heap-helpers.c
> index d0696cf937af..aeb9e100f339 100644
> --- a/drivers/dma-buf/heaps/heap-helpers.c
> +++ b/drivers/dma-buf/heaps/heap-helpers.c
> @@ -235,7 +235,7 @@ static int dma_heap_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
> return 0;
> }
>
> -static void *dma_heap_dma_buf_vmap(struct dma_buf *dmabuf)
> +static int dma_heap_dma_buf_vmap(struct dma_buf *dmabuf, struct dma_buf_map *map)
> {
> struct heap_helper_buffer *buffer = dmabuf->priv;
> void *vaddr;
> @@ -244,7 +244,11 @@ static void *dma_heap_dma_buf_vmap(struct dma_buf *dmabuf)
> vaddr = dma_heap_buffer_vmap_get(buffer);
> mutex_unlock(&buffer->lock);
>
> - return vaddr;
> + if (!vaddr)
> + return -ENOMEM;
> + dma_buf_map_set_vaddr(map, vaddr);
> +
> + return 0;
> }
>
> static void dma_heap_dma_buf_vunmap(struct dma_buf *dmabuf, void *vaddr)
> diff --git a/drivers/gpu/drm/drm_gem_cma_helper.c b/drivers/gpu/drm/drm_gem_cma_helper.c
> index 59b9ca207b42..1ece73fd3fe9 100644
> --- a/drivers/gpu/drm/drm_gem_cma_helper.c
> +++ b/drivers/gpu/drm/drm_gem_cma_helper.c
> @@ -617,22 +617,23 @@ drm_gem_cma_prime_import_sg_table_vmap(struct drm_device *dev,
> {
> struct drm_gem_cma_object *cma_obj;
> struct drm_gem_object *obj;
> - void *vaddr;
> + struct dma_buf_map map;
> + int ret;
>
> - vaddr = dma_buf_vmap(attach->dmabuf);
> - if (!vaddr) {
> + ret = dma_buf_vmap(attach->dmabuf, &map);
> + if (ret) {
> DRM_ERROR("Failed to vmap PRIME buffer\n");
> - return ERR_PTR(-ENOMEM);
> + return ERR_PTR(ret);
> }
>
> obj = drm_gem_cma_prime_import_sg_table(dev, attach, sgt);
> if (IS_ERR(obj)) {
> - dma_buf_vunmap(attach->dmabuf, vaddr);
> + dma_buf_vunmap(attach->dmabuf, map.vaddr);
> return obj;
> }
>
> cma_obj = to_drm_gem_cma_obj(obj);
> - cma_obj->vaddr = vaddr;
> + cma_obj->vaddr = map.vaddr;
>
> return obj;
> }
> diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c
> index d77c9f8ff26c..6328cfbb828e 100644
> --- a/drivers/gpu/drm/drm_gem_shmem_helper.c
> +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
> @@ -261,13 +261,16 @@ EXPORT_SYMBOL(drm_gem_shmem_unpin);
> static void *drm_gem_shmem_vmap_locked(struct drm_gem_shmem_object *shmem)
> {
> struct drm_gem_object *obj = &shmem->base;
> - int ret;
> + struct dma_buf_map map;
> + int ret = 0;
>
> if (shmem->vmap_use_count++ > 0)
> return shmem->vaddr;
>
> if (obj->import_attach) {
> - shmem->vaddr = dma_buf_vmap(obj->import_attach->dmabuf);
> + ret = dma_buf_vmap(obj->import_attach->dmabuf, &map);
> + if (!ret)
> + shmem->vaddr = map.vaddr;
> } else {
> pgprot_t prot = PAGE_KERNEL;
>
> @@ -279,11 +282,12 @@ static void *drm_gem_shmem_vmap_locked(struct drm_gem_shmem_object *shmem)
> prot = pgprot_writecombine(prot);
> shmem->vaddr = vmap(shmem->pages, obj->size >> PAGE_SHIFT,
> VM_MAP, prot);
> + if (!shmem->vaddr)
> + ret = -ENOMEM;
> }
>
> - if (!shmem->vaddr) {
> - DRM_DEBUG_KMS("Failed to vmap pages\n");
> - ret = -ENOMEM;
> + if (ret) {
> + DRM_DEBUG_KMS("Failed to vmap pages, error %d\n", ret);
> goto err_put_pages;
> }
>
> diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
> index 11fe9ff76fd5..2b3fd01867e4 100644
> --- a/drivers/gpu/drm/drm_prime.c
> +++ b/drivers/gpu/drm/drm_prime.c
> @@ -669,16 +669,18 @@ EXPORT_SYMBOL(drm_gem_unmap_dma_buf);
> *
> * Returns the kernel virtual address or NULL on failure.
> */
> -void *drm_gem_dmabuf_vmap(struct dma_buf *dma_buf)
> +int drm_gem_dmabuf_vmap(struct dma_buf *dma_buf, struct dma_buf_map *map)
> {
> struct drm_gem_object *obj = dma_buf->priv;
> void *vaddr;
>
> vaddr = drm_gem_vmap(obj);
> if (IS_ERR(vaddr))
> - vaddr = NULL;
> + return PTR_ERR(vaddr);
>
> - return vaddr;
> + dma_buf_map_set_vaddr(map, vaddr);
> +
> + return 0;
> }
> EXPORT_SYMBOL(drm_gem_dmabuf_vmap);
>
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> index 4aa3426a9ba4..80a9fc143bbb 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
> @@ -85,9 +85,15 @@ static void etnaviv_gem_prime_release(struct etnaviv_gem_object *etnaviv_obj)
>
> static void *etnaviv_gem_prime_vmap_impl(struct etnaviv_gem_object *etnaviv_obj)
> {
> + struct dma_buf_map map;
> + int ret;
> +
> lockdep_assert_held(&etnaviv_obj->lock);
>
> - return dma_buf_vmap(etnaviv_obj->base.import_attach->dmabuf);
> + ret = dma_buf_vmap(etnaviv_obj->base.import_attach->dmabuf, &map);
> + if (ret)
> + return NULL;
> + return map.vaddr;
> }
>
> static int etnaviv_gem_prime_mmap_obj(struct etnaviv_gem_object *etnaviv_obj,
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
> index 8dd295dbe241..6ee8f2cfd8c1 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
> @@ -77,11 +77,18 @@ static void i915_gem_unmap_dma_buf(struct dma_buf_attachment *attachment,
> i915_gem_object_unpin_pages(obj);
> }
>
> -static void *i915_gem_dmabuf_vmap(struct dma_buf *dma_buf)
> +static int i915_gem_dmabuf_vmap(struct dma_buf *dma_buf, struct dma_buf_map *map)
> {
> struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
> + void *vaddr;
>
> - return i915_gem_object_pin_map(obj, I915_MAP_WB);
> + vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
> + if (IS_ERR(vaddr))
> + return PTR_ERR(vaddr);
> +
> + dma_buf_map_set_vaddr(map, vaddr);
> +
> + return 0;
> }
>
> static void i915_gem_dmabuf_vunmap(struct dma_buf *dma_buf, void *vaddr)
> diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
> index 2a52b92586b9..f79ebc5329b7 100644
> --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
> +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
> @@ -82,6 +82,7 @@ static int igt_dmabuf_import(void *arg)
> struct drm_i915_gem_object *obj;
> struct dma_buf *dmabuf;
> void *obj_map, *dma_map;
> + struct dma_buf_map map;
> u32 pattern[] = { 0, 0xaa, 0xcc, 0x55, 0xff };
> int err, i;
>
> @@ -110,7 +111,8 @@ static int igt_dmabuf_import(void *arg)
> goto out_obj;
> }
>
> - dma_map = dma_buf_vmap(dmabuf);
> + err = dma_buf_vmap(dmabuf, &map);
> + dma_map = err ? NULL : map.vaddr;
> if (!dma_map) {
> pr_err("dma_buf_vmap failed\n");
> err = -ENOMEM;
> @@ -163,6 +165,7 @@ static int igt_dmabuf_import_ownership(void *arg)
> struct drm_i915_private *i915 = arg;
> struct drm_i915_gem_object *obj;
> struct dma_buf *dmabuf;
> + struct dma_buf_map map;
> void *ptr;
> int err;
>
> @@ -170,7 +173,8 @@ static int igt_dmabuf_import_ownership(void *arg)
> if (IS_ERR(dmabuf))
> return PTR_ERR(dmabuf);
>
> - ptr = dma_buf_vmap(dmabuf);
> + err = dma_buf_vmap(dmabuf, &map);
> + ptr = err ? NULL : map.vaddr;
> if (!ptr) {
> pr_err("dma_buf_vmap failed\n");
> err = -ENOMEM;
> @@ -212,6 +216,7 @@ static int igt_dmabuf_export_vmap(void *arg)
> struct drm_i915_private *i915 = arg;
> struct drm_i915_gem_object *obj;
> struct dma_buf *dmabuf;
> + struct dma_buf_map map;
> void *ptr;
> int err;
>
> @@ -228,7 +233,8 @@ static int igt_dmabuf_export_vmap(void *arg)
> }
> i915_gem_object_put(obj);
>
> - ptr = dma_buf_vmap(dmabuf);
> + err = dma_buf_vmap(dmabuf, &map);
> + ptr = err ? NULL : map.vaddr;
> if (!ptr) {
> pr_err("dma_buf_vmap failed\n");
> err = -ENOMEM;
> diff --git a/drivers/gpu/drm/i915/gem/selftests/mock_dmabuf.c b/drivers/gpu/drm/i915/gem/selftests/mock_dmabuf.c
> index be30b27e2926..becd9fb95d58 100644
> --- a/drivers/gpu/drm/i915/gem/selftests/mock_dmabuf.c
> +++ b/drivers/gpu/drm/i915/gem/selftests/mock_dmabuf.c
> @@ -61,11 +61,17 @@ static void mock_dmabuf_release(struct dma_buf *dma_buf)
> kfree(mock);
> }
>
> -static void *mock_dmabuf_vmap(struct dma_buf *dma_buf)
> +static int mock_dmabuf_vmap(struct dma_buf *dma_buf, struct dma_buf_map *map)
> {
> struct mock_dmabuf *mock = to_mock(dma_buf);
> + void *vaddr;
>
> - return vm_map_ram(mock->pages, mock->npages, 0);
> + vaddr = vm_map_ram(mock->pages, mock->npages, 0);
> + if (!vaddr)
> + return -ENOMEM;
> + dma_buf_map_set_vaddr(map, vaddr);
> +
> + return 0;
> }
>
> static void mock_dmabuf_vunmap(struct dma_buf *dma_buf, void *vaddr)
> diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c
> index a2bac20ff19d..6f04d7855f95 100644
> --- a/drivers/gpu/drm/tegra/gem.c
> +++ b/drivers/gpu/drm/tegra/gem.c
> @@ -132,14 +132,18 @@ static void tegra_bo_unpin(struct device *dev, struct sg_table *sgt)
> static void *tegra_bo_mmap(struct host1x_bo *bo)
> {
> struct tegra_bo *obj = host1x_to_tegra_bo(bo);
> + struct dma_buf_map map;
> + int ret;
>
> - if (obj->vaddr)
> + if (obj->vaddr) {
> return obj->vaddr;
> - else if (obj->gem.import_attach)
> - return dma_buf_vmap(obj->gem.import_attach->dmabuf);
> - else
> + } else if (obj->gem.import_attach) {
> + ret = dma_buf_vmap(obj->gem.import_attach->dmabuf, &map);
> + return ret ? NULL : map.vaddr;
> + } else {
> return vmap(obj->pages, obj->num_pages, VM_MAP,
> pgprot_writecombine(PAGE_KERNEL));
> + }
> }
>
> static void tegra_bo_munmap(struct host1x_bo *bo, void *addr)
> @@ -634,12 +638,14 @@ static int tegra_gem_prime_mmap(struct dma_buf *buf, struct vm_area_struct *vma)
> return __tegra_gem_mmap(gem, vma);
> }
>
> -static void *tegra_gem_prime_vmap(struct dma_buf *buf)
> +static int tegra_gem_prime_vmap(struct dma_buf *buf, struct dma_buf_map *map)
> {
> struct drm_gem_object *gem = buf->priv;
> struct tegra_bo *bo = to_tegra_bo(gem);
>
> - return bo->vaddr;
> + dma_buf_map_set_vaddr(map, bo->vaddr);
> +
> + return 0;
> }
>
> static void tegra_gem_prime_vunmap(struct dma_buf *buf, void *vaddr)
> diff --git a/drivers/media/common/videobuf2/videobuf2-dma-contig.c b/drivers/media/common/videobuf2/videobuf2-dma-contig.c
> index ec3446cc45b8..11428287bdf3 100644
> --- a/drivers/media/common/videobuf2/videobuf2-dma-contig.c
> +++ b/drivers/media/common/videobuf2/videobuf2-dma-contig.c
> @@ -81,9 +81,13 @@ static void *vb2_dc_cookie(void *buf_priv)
> static void *vb2_dc_vaddr(void *buf_priv)
> {
> struct vb2_dc_buf *buf = buf_priv;
> + struct dma_buf_map map;
> + int ret;
>
> - if (!buf->vaddr && buf->db_attach)
> - buf->vaddr = dma_buf_vmap(buf->db_attach->dmabuf);
> + if (!buf->vaddr && buf->db_attach) {
> + ret = dma_buf_vmap(buf->db_attach->dmabuf, &map);
> + buf->vaddr = ret ? NULL : map.vaddr;
> + }
>
> return buf->vaddr;
> }
> @@ -365,11 +369,13 @@ vb2_dc_dmabuf_ops_end_cpu_access(struct dma_buf *dbuf,
> return 0;
> }
>
> -static void *vb2_dc_dmabuf_ops_vmap(struct dma_buf *dbuf)
> +static int vb2_dc_dmabuf_ops_vmap(struct dma_buf *dbuf, struct dma_buf_map *map)
> {
> struct vb2_dc_buf *buf = dbuf->priv;
>
> - return buf->vaddr;
> + dma_buf_map_set_vaddr(map, buf->vaddr);
> +
> + return 0;
> }
>
> static int vb2_dc_dmabuf_ops_mmap(struct dma_buf *dbuf,
> diff --git a/drivers/media/common/videobuf2/videobuf2-dma-sg.c b/drivers/media/common/videobuf2/videobuf2-dma-sg.c
> index 0a40e00f0d7e..c51170e9c1b9 100644
> --- a/drivers/media/common/videobuf2/videobuf2-dma-sg.c
> +++ b/drivers/media/common/videobuf2/videobuf2-dma-sg.c
> @@ -300,14 +300,18 @@ static void vb2_dma_sg_put_userptr(void *buf_priv)
> static void *vb2_dma_sg_vaddr(void *buf_priv)
> {
> struct vb2_dma_sg_buf *buf = buf_priv;
> + struct dma_buf_map map;
> + int ret;
>
> BUG_ON(!buf);
>
> if (!buf->vaddr) {
> - if (buf->db_attach)
> - buf->vaddr = dma_buf_vmap(buf->db_attach->dmabuf);
> - else
> + if (buf->db_attach) {
> + ret = dma_buf_vmap(buf->db_attach->dmabuf, &map);
> + buf->vaddr = ret ? NULL : map.vaddr;
> + } else {
> buf->vaddr = vm_map_ram(buf->pages, buf->num_pages, -1);
> + }
> }
>
> /* add offset in case userptr is not page-aligned */
> @@ -489,11 +493,13 @@ vb2_dma_sg_dmabuf_ops_end_cpu_access(struct dma_buf *dbuf,
> return 0;
> }
>
> -static void *vb2_dma_sg_dmabuf_ops_vmap(struct dma_buf *dbuf)
> +static int vb2_dma_sg_dmabuf_ops_vmap(struct dma_buf *dbuf, struct dma_buf_map *map)
> {
> struct vb2_dma_sg_buf *buf = dbuf->priv;
>
> - return vb2_dma_sg_vaddr(buf);
> + dma_buf_map_set_vaddr(map, buf->vaddr);
> +
> + return 0;
> }
>
> static int vb2_dma_sg_dmabuf_ops_mmap(struct dma_buf *dbuf,
> diff --git a/drivers/media/common/videobuf2/videobuf2-vmalloc.c b/drivers/media/common/videobuf2/videobuf2-vmalloc.c
> index c66fda4a65e4..7b68e2379c65 100644
> --- a/drivers/media/common/videobuf2/videobuf2-vmalloc.c
> +++ b/drivers/media/common/videobuf2/videobuf2-vmalloc.c
> @@ -318,11 +318,13 @@ static void vb2_vmalloc_dmabuf_ops_release(struct dma_buf *dbuf)
> vb2_vmalloc_put(dbuf->priv);
> }
>
> -static void *vb2_vmalloc_dmabuf_ops_vmap(struct dma_buf *dbuf)
> +static int vb2_vmalloc_dmabuf_ops_vmap(struct dma_buf *dbuf, struct dma_buf_map *map)
> {
> struct vb2_vmalloc_buf *buf = dbuf->priv;
>
> - return buf->vaddr;
> + dma_buf_map_set_vaddr(map, buf->vaddr);
> +
> + return 0;
> }
>
> static int vb2_vmalloc_dmabuf_ops_mmap(struct dma_buf *dbuf,
> @@ -374,10 +376,15 @@ static struct dma_buf *vb2_vmalloc_get_dmabuf(void *buf_priv, unsigned long flag
> static int vb2_vmalloc_map_dmabuf(void *mem_priv)
> {
> struct vb2_vmalloc_buf *buf = mem_priv;
> + struct dma_buf_map map;
> + int ret;
>
> - buf->vaddr = dma_buf_vmap(buf->dbuf);
> + ret = dma_buf_vmap(buf->dbuf, &map);
> + if (ret)
> + return -EFAULT;
> + buf->vaddr = map.vaddr;
>
> - return buf->vaddr ? 0 : -EFAULT;
> + return 0;
> }
>
> static void vb2_vmalloc_unmap_dmabuf(void *mem_priv)
> diff --git a/include/drm/drm_prime.h b/include/drm/drm_prime.h
> index 0f69f9fbf12c..5125f84c28f6 100644
> --- a/include/drm/drm_prime.h
> +++ b/include/drm/drm_prime.h
> @@ -54,6 +54,7 @@ struct device;
> struct dma_buf_export_info;
> struct dma_buf;
> struct dma_buf_attachment;
> +struct dma_buf_map;
>
> enum dma_data_direction;
>
> @@ -82,7 +83,7 @@ struct sg_table *drm_gem_map_dma_buf(struct dma_buf_attachment *attach,
> void drm_gem_unmap_dma_buf(struct dma_buf_attachment *attach,
> struct sg_table *sgt,
> enum dma_data_direction dir);
> -void *drm_gem_dmabuf_vmap(struct dma_buf *dma_buf);
> +int drm_gem_dmabuf_vmap(struct dma_buf *dma_buf, struct dma_buf_map *map);
> void drm_gem_dmabuf_vunmap(struct dma_buf *dma_buf, void *vaddr);
>
> int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
> diff --git a/include/linux/dma-buf-map.h b/include/linux/dma-buf-map.h
> index d4b1bb3cc4b0..6b4f6e0e8b5d 100644
> --- a/include/linux/dma-buf-map.h
> +++ b/include/linux/dma-buf-map.h
> @@ -28,6 +28,19 @@ struct dma_buf_map {
> bool is_iomem;
> };
>
> +/**
> + * dma_buf_map_set_vaddr - Sets a dma-buf mapping structure to an address in system memory
> + * @map: The dma-buf mapping structure
> + * @vaddr: A system-memory address
> + *
> + * Sets the address and clears the I/O-memory flag.
> + */
> +static inline void dma_buf_map_set_vaddr(struct dma_buf_map *map, void *vaddr)
> +{
> + map->vaddr = vaddr;
> + map->is_iomem = false;
> +}
> +
> /* API transition helper */
> static inline bool dma_buf_map_is_vaddr(const struct dma_buf_map *map, const void *vaddr)
> {
> diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h
> index fcc2ddfb6d18..7237997cfa38 100644
> --- a/include/linux/dma-buf.h
> +++ b/include/linux/dma-buf.h
> @@ -266,7 +266,7 @@ struct dma_buf_ops {
> */
> int (*mmap)(struct dma_buf *, struct vm_area_struct *vma);
>
> - void *(*vmap)(struct dma_buf *);
> + int (*vmap)(struct dma_buf *dmabuf, struct dma_buf_map *map);
> void (*vunmap)(struct dma_buf *, void *vaddr);
> };
>
> @@ -503,6 +503,6 @@ int dma_buf_end_cpu_access(struct dma_buf *dma_buf,
>
> int dma_buf_mmap(struct dma_buf *, struct vm_area_struct *,
> unsigned long);
> -void *dma_buf_vmap(struct dma_buf *);
> -void dma_buf_vunmap(struct dma_buf *, void *vaddr);
> +int dma_buf_vmap(struct dma_buf *dmabuf, struct dma_buf_map *map);
> +void dma_buf_vunmap(struct dma_buf *dmabuf, void *vaddr);
> #endif /* __DMA_BUF_H__ */
> --
> 2.28.0
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
More information about the Intel-gfx
mailing list