On Mon, 3 Nov 2025 20:34:39 +0000 Akash Goel <[email protected]> wrote:
> On 10/30/25 14:05, Boris Brezillon wrote: > > The default implementation simply takes care of invalidating/flushing > > caches around CPU accesses. It takes care of both the exporter and > > the importers, which forces us to overload the default > > ::[un]map_dma_buf() implementation provided by drm_gem.c to store the > > sgt. > > > > v5: > > - New patch > > > > Signed-off-by: Boris Brezillon <[email protected]> > > --- > > drivers/gpu/drm/drm_gem_shmem_helper.c | 114 +++++++++++++++++++++++++ > > include/drm/drm_gem_shmem_helper.h | 10 +++ > > 2 files changed, 124 insertions(+) > > > > diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c > > b/drivers/gpu/drm/drm_gem_shmem_helper.c > > index dc94a27710e5..e49c75739c20 100644 > > --- a/drivers/gpu/drm/drm_gem_shmem_helper.c > > +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c > > @@ -893,6 +893,120 @@ struct drm_gem_object > > *drm_gem_shmem_prime_import_no_map(struct drm_device *dev, > > } > > EXPORT_SYMBOL_GPL(drm_gem_shmem_prime_import_no_map); > > > > +/** > > + * drm_gem_shmem_prime_unmap_dma_buf - Default unmap_dma_buf() for > > exported buffers > > + * @attach: attachment > > + * @sgt: SG table to unmap > > + * @dir: type of access done by this attachment > > + * > > + * Default implementation for dma_buf_ops::map_dma_buf(). This is just a > > wrapper > > + * around drm_gem_map_dma_buf() that lets us set the > > dma_buf_attachment::priv > > + * to the sgt so that drm_gem_shmem_prime_{begin,end}_cpu_access() can sync > > + * around CPU accesses. > > + */ > > +struct sg_table * > > +drm_gem_shmem_prime_map_dma_buf(struct dma_buf_attachment *attach, > > + enum dma_data_direction dir) > > +{ > > + struct sg_table *sgt = drm_gem_map_dma_buf(attach, dir); > > + > > + if (!IS_ERR(sgt)) > > + attach->priv = sgt; > > + > > + return sgt; > > +} > > +EXPORT_SYMBOL_GPL(drm_gem_shmem_prime_map_dma_buf); > > + > > +/** > > + * drm_gem_shmem_prime_unmap_dma_buf - Default unmap_dma_buf() for > > exported buffers > > + * @attach: attachment > > + * @sgt: SG table to unmap > > + * @dir: type of access done by this attachment > > + * > > + * Default implementation for dma_buf_ops::unmap_dma_buf(). This is just a > > wrapper > > + * around drm_gem_unmap_dma_buf() that lets us reset the > > dma_buf_attachment::priv > > + * field so that drm_gem_shmem_prime_{begin,end}_cpu_access() don't > > consider it > > + * as a mapped attachment to sync against. > > + */ > > +void drm_gem_shmem_prime_unmap_dma_buf(struct dma_buf_attachment *attach, > > + struct sg_table *sgt, > > + enum dma_data_direction dir) > > +{ > > + attach->priv = NULL; > > + drm_gem_unmap_dma_buf(attach, sgt, dir); > > +} > > +EXPORT_SYMBOL_GPL(drm_gem_shmem_prime_unmap_dma_buf); > > + > > +/** > > + * drm_gem_shmem_prime_begin_cpu_access - Default end_cpu_access() for > > exported buffers > > > Sorry nitpick. There is a typo here. Should be 'Default begin_cpu_access()`. Nice catch. Will fix in v6.
