Before introducing cached CPU mappings, V3D needs a dma_buf implementation that satisfies synchronization requests around CPU accesses coming from a DMA-BUF exported by the driver. Use the generic shmem PRIME helpers for that.
Signed-off-by: Maíra Canal <[email protected]> --- drivers/gpu/drm/v3d/v3d_bo.c | 26 ++++++++++++++++++++++++++ drivers/gpu/drm/v3d/v3d_drv.c | 1 + drivers/gpu/drm/v3d/v3d_drv.h | 1 + 3 files changed, 28 insertions(+) diff --git a/drivers/gpu/drm/v3d/v3d_bo.c b/drivers/gpu/drm/v3d/v3d_bo.c index db95a2fac5d0..803f3bbb7144 100644 --- a/drivers/gpu/drm/v3d/v3d_bo.c +++ b/drivers/gpu/drm/v3d/v3d_bo.c @@ -63,12 +63,38 @@ void v3d_free_object(struct drm_gem_object *obj) drm_gem_shmem_free(&bo->base); } +static const struct dma_buf_ops v3d_dma_buf_ops = { + .attach = drm_gem_map_attach, + .detach = drm_gem_map_detach, + .map_dma_buf = drm_gem_shmem_prime_map_dma_buf, + .unmap_dma_buf = drm_gem_shmem_prime_unmap_dma_buf, + .release = drm_gem_dmabuf_release, + .mmap = drm_gem_dmabuf_mmap, + .vmap = drm_gem_dmabuf_vmap, + .vunmap = drm_gem_dmabuf_vunmap, + .begin_cpu_access = drm_gem_shmem_prime_begin_cpu_access, + .end_cpu_access = drm_gem_shmem_prime_end_cpu_access, +}; + +static struct dma_buf *v3d_prime_export(struct drm_gem_object *obj, int flags) +{ + return drm_gem_prime_export_with_ops(obj, &v3d_dma_buf_ops, flags); +} + +bool v3d_prime_is_exporter(struct drm_device *dev, struct dma_buf *dma_buf) +{ + struct drm_gem_object *obj = dma_buf->priv; + + return dma_buf->ops == &v3d_dma_buf_ops && obj->dev == dev; +} + static const struct drm_gem_object_funcs v3d_gem_funcs = { .free = v3d_free_object, .print_info = drm_gem_shmem_object_print_info, .pin = drm_gem_shmem_object_pin, .unpin = drm_gem_shmem_object_unpin, .get_sg_table = drm_gem_shmem_object_get_sg_table, + .export = v3d_prime_export, .vmap = drm_gem_shmem_object_vmap, .vunmap = drm_gem_shmem_object_vunmap, .mmap = drm_gem_shmem_object_mmap, diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c index b790be8a7fac..7d91c528c1e9 100644 --- a/drivers/gpu/drm/v3d/v3d_drv.c +++ b/drivers/gpu/drm/v3d/v3d_drv.c @@ -283,6 +283,7 @@ static const struct drm_driver v3d_drm_driver = { .gem_create_object = v3d_create_object, .gem_prime_import_sg_table = v3d_prime_import_sg_table, + .gem_prime_is_exporter = v3d_prime_is_exporter, .ioctls = v3d_drm_ioctls, .num_ioctls = ARRAY_SIZE(v3d_drm_ioctls), diff --git a/drivers/gpu/drm/v3d/v3d_drv.h b/drivers/gpu/drm/v3d/v3d_drv.h index 7c7bdf6e51a5..e0eed4cfef61 100644 --- a/drivers/gpu/drm/v3d/v3d_drv.h +++ b/drivers/gpu/drm/v3d/v3d_drv.h @@ -606,6 +606,7 @@ int v3d_wait_bo_ioctl(struct drm_device *dev, void *data, struct drm_gem_object *v3d_prime_import_sg_table(struct drm_device *dev, struct dma_buf_attachment *attach, struct sg_table *sgt); +bool v3d_prime_is_exporter(struct drm_device *dev, struct dma_buf *dma_buf); /* v3d_debugfs.c */ void v3d_debugfs_init(struct drm_minor *minor); -- 2.56.0
