[PATCH RESEND 2/4] drm/gem-dma: Support dedicated DMA device for allocation and mapping
Thomas Zimmermann
tzimmermann at suse.de
Tue Mar 10 01:02:57 PDT 2026
Am 10.03.26 um 04:25 schrieb Chen-Yu Tsai:
> Support for a dedicated DMA device for prime imports was added in commit
> 143ec8d3f939 ("drm/prime: Support dedicated DMA device for dma-buf imports").
> This allowed the DRM driver to provide a dedicated DMA device when its
> own underlying device was not capable of DMA, for example when it is a
> USB device (the original target) or a virtual device. The latter case is
> common on embedded SoCs, on which the display pipeline is composed of
> various fixed function blocks, and the DRM device is simply a made-up
> device, an address space managing the routing between the blocks, or
> whichever block the implementor thought made sense at the time. The
> point is that the chosen device is often not the actual device doing
> the DMA. Various drivers have used workarounds or reimplemented the
> GEM DMA helpers to get the DMA addresses and IOMMUs to work correctly.
>
> Add support for the dedicated DMA device to the GEM DMA helpers.
>
> No existing driver currently uses the GEM DMA helpers and calls
> drm_dev_set_dma_dev() to set a dedicated DMA device, so no existing
> users should be affected.
In these patches (or at least the series' cover letter) you should
mention that drm_dev_dma_dev() returns the regular device if no DMA
device has been set.
>
> Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
Reviewed-by: Thomas Zimmermann <tzimmermann at suse.de>
> ---
> drivers/gpu/drm/drm_gem_dma_helper.c | 21 ++++++++++++---------
> 1 file changed, 12 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_gem_dma_helper.c b/drivers/gpu/drm/drm_gem_dma_helper.c
> index ecb9746f4da8..70f83e464476 100644
> --- a/drivers/gpu/drm/drm_gem_dma_helper.c
> +++ b/drivers/gpu/drm/drm_gem_dma_helper.c
> @@ -146,12 +146,13 @@ struct drm_gem_dma_object *drm_gem_dma_create(struct drm_device *drm,
> return dma_obj;
>
> if (dma_obj->map_noncoherent) {
> - dma_obj->vaddr = dma_alloc_noncoherent(drm->dev, size,
> + dma_obj->vaddr = dma_alloc_noncoherent(drm_dev_dma_dev(drm),
> + size,
> &dma_obj->dma_addr,
> DMA_TO_DEVICE,
> GFP_KERNEL | __GFP_NOWARN);
> } else {
> - dma_obj->vaddr = dma_alloc_wc(drm->dev, size,
> + dma_obj->vaddr = dma_alloc_wc(drm_dev_dma_dev(drm), size,
> &dma_obj->dma_addr,
> GFP_KERNEL | __GFP_NOWARN);
> }
> @@ -236,12 +237,14 @@ void drm_gem_dma_free(struct drm_gem_dma_object *dma_obj)
> drm_prime_gem_destroy(gem_obj, dma_obj->sgt);
> } else if (dma_obj->vaddr) {
> if (dma_obj->map_noncoherent)
> - dma_free_noncoherent(gem_obj->dev->dev, dma_obj->base.size,
> + dma_free_noncoherent(drm_dev_dma_dev(gem_obj->dev),
> + dma_obj->base.size,
> dma_obj->vaddr, dma_obj->dma_addr,
> DMA_TO_DEVICE);
> else
> - dma_free_wc(gem_obj->dev->dev, dma_obj->base.size,
> - dma_obj->vaddr, dma_obj->dma_addr);
> + dma_free_wc(drm_dev_dma_dev(gem_obj->dev),
> + dma_obj->base.size, dma_obj->vaddr,
> + dma_obj->dma_addr);
> }
>
> drm_gem_object_release(gem_obj);
> @@ -432,7 +435,7 @@ struct sg_table *drm_gem_dma_get_sg_table(struct drm_gem_dma_object *dma_obj)
> if (!sgt)
> return ERR_PTR(-ENOMEM);
>
> - ret = dma_get_sgtable(obj->dev->dev, sgt, dma_obj->vaddr,
> + ret = dma_get_sgtable(drm_dev_dma_dev(obj->dev), sgt, dma_obj->vaddr,
> dma_obj->dma_addr, obj->size);
> if (ret < 0)
> goto out;
> @@ -539,12 +542,12 @@ int drm_gem_dma_mmap(struct drm_gem_dma_object *dma_obj, struct vm_area_struct *
> if (dma_obj->map_noncoherent) {
> vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
>
> - ret = dma_mmap_pages(dma_obj->base.dev->dev,
> + ret = dma_mmap_pages(drm_dev_dma_dev(dma_obj->base.dev),
> vma, vma->vm_end - vma->vm_start,
> virt_to_page(dma_obj->vaddr));
> } else {
> - ret = dma_mmap_wc(dma_obj->base.dev->dev, vma, dma_obj->vaddr,
> - dma_obj->dma_addr,
> + ret = dma_mmap_wc(drm_dev_dma_dev(dma_obj->base.dev), vma,
> + dma_obj->vaddr, dma_obj->dma_addr,
> vma->vm_end - vma->vm_start);
> }
> if (ret)
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich, (HRB 36809, AG Nürnberg)
More information about the Linux-mediatek
mailing list