Re: [PATCH 2/4] drm/exynos: Use DRM core dedicated DMA device tracking facility
From: Inki Dae
Date: Tue Apr 07 2026 - 10:51:02 EST
2026년 3월 26일 (목) 오후 6:51, Chen-Yu Tsai <wenst@xxxxxxxxxxxx>님이 작성:
>
> The exynos driver tracks a dedicated DMA device in its private data.
> The DRM core already has facilities to do this, and it is integrated
> into DRM PRIME imports and GEM DMA helpers.
>
> Convert the exynos driver to use the core's dedicated DMA device
> tracking facility. Also get rid of exynos_drm_gem_prime_import() as
> it is identical to drm_gem_prime_import() after the conversion.
>
> Signed-off-by: Chen-Yu Tsai <wenst@xxxxxxxxxxxx>
> ---
> drivers/gpu/drm/exynos/exynos_drm_dma.c | 11 +++++-----
> drivers/gpu/drm/exynos/exynos_drm_drv.c | 1 -
> drivers/gpu/drm/exynos/exynos_drm_drv.h | 8 --------
> drivers/gpu/drm/exynos/exynos_drm_g2d.c | 11 +++++-----
> drivers/gpu/drm/exynos/exynos_drm_gem.c | 27 ++++++++++---------------
> drivers/gpu/drm/exynos/exynos_drm_gem.h | 2 --
> 6 files changed, 23 insertions(+), 37 deletions(-)
>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_dma.c b/drivers/gpu/drm/exynos/exynos_drm_dma.c
> index ccc6b852ee7d..734741c80cbe 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_dma.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_dma.c
> @@ -8,6 +8,7 @@
> #include <linux/iommu.h>
> #include <linux/platform_device.h>
>
> +#include <drm/drm_device.h>
> #include <drm/drm_print.h>
> #include <drm/exynos_drm.h>
>
> @@ -41,7 +42,7 @@ static int drm_iommu_attach_device(struct drm_device *drm_dev,
> struct exynos_drm_private *priv = drm_dev->dev_private;
> int ret = 0;
>
> - if (get_dma_ops(priv->dma_dev) != get_dma_ops(subdrv_dev)) {
> + if (get_dma_ops(drm_dev_dma_dev(drm_dev)) != get_dma_ops(subdrv_dev)) {
> DRM_DEV_ERROR(subdrv_dev, "Device %s lacks support for IOMMU\n",
> dev_name(subdrv_dev));
> return -EINVAL;
> @@ -93,8 +94,8 @@ int exynos_drm_register_dma(struct drm_device *drm, struct device *dev,
> {
> struct exynos_drm_private *priv = drm->dev_private;
>
> - if (!priv->dma_dev) {
> - priv->dma_dev = dev;
> + if (drm_dev_dma_dev(drm) == drm->dev) {
> + drm_dev_set_dma_dev(drm, dev);
> DRM_INFO("Exynos DRM: using %s device for DMA mapping operations\n",
> dev_name(dev));
> }
> @@ -109,7 +110,7 @@ int exynos_drm_register_dma(struct drm_device *drm, struct device *dev,
> mapping = arm_iommu_create_mapping(dev,
> EXYNOS_DEV_ADDR_START, EXYNOS_DEV_ADDR_SIZE);
> else if (IS_ENABLED(CONFIG_IOMMU_DMA))
> - mapping = iommu_get_domain_for_dev(priv->dma_dev);
> + mapping = iommu_get_domain_for_dev(dev);
>
> if (!mapping)
> return -ENODEV;
> @@ -135,5 +136,5 @@ void exynos_drm_cleanup_dma(struct drm_device *drm)
>
> arm_iommu_release_mapping(priv->mapping);
> priv->mapping = NULL;
> - priv->dma_dev = NULL;
> + drm_dev_set_dma_dev(drm, NULL);
> }
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c
> index 2101a74dc1ed..9ee30086879f 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
> @@ -109,7 +109,6 @@ static const struct drm_driver exynos_drm_driver = {
> .open = exynos_drm_open,
> .postclose = exynos_drm_postclose,
> .dumb_create = exynos_drm_gem_dumb_create,
> - .gem_prime_import = exynos_drm_gem_prime_import,
> .gem_prime_import_sg_table = exynos_drm_gem_prime_import_sg_table,
> EXYNOS_DRM_FBDEV_DRIVER_OPS,
> .ioctls = exynos_ioctls,
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
> index 06c29ff2aac0..1ab7195d09ae 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
> +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
> @@ -198,7 +198,6 @@ struct drm_exynos_file_private {
> */
> struct exynos_drm_private {
> struct device *g2d_dev;
> - struct device *dma_dev;
> struct device *vidi_dev;
> void *mapping;
>
> @@ -208,13 +207,6 @@ struct exynos_drm_private {
> wait_queue_head_t wait;
> };
>
> -static inline struct device *to_dma_dev(struct drm_device *dev)
> -{
> - struct exynos_drm_private *priv = dev->dev_private;
> -
> - return priv->dma_dev;
> -}
> -
> static inline bool is_drm_iommu_supported(struct drm_device *drm_dev)
> {
> struct exynos_drm_private *priv = drm_dev->dev_private;
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c
> index 348603262af0..85a3a247dfca 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c
> @@ -20,6 +20,7 @@
> #include <linux/uaccess.h>
> #include <linux/workqueue.h>
>
> +#include <drm/drm_device.h>
> #include <drm/drm_file.h>
> #include <drm/drm_print.h>
> #include <drm/exynos_drm.h>
> @@ -278,7 +279,7 @@ static int g2d_init_cmdlist(struct g2d_data *g2d)
>
> g2d->cmdlist_dma_attrs = DMA_ATTR_WRITE_COMBINE;
>
> - g2d->cmdlist_pool_virt = dma_alloc_attrs(to_dma_dev(g2d->drm_dev),
> + g2d->cmdlist_pool_virt = dma_alloc_attrs(drm_dev_dma_dev(g2d->drm_dev),
> G2D_CMDLIST_POOL_SIZE,
> &g2d->cmdlist_pool, GFP_KERNEL,
> g2d->cmdlist_dma_attrs);
> @@ -311,7 +312,7 @@ static int g2d_init_cmdlist(struct g2d_data *g2d)
> return 0;
>
> err:
> - dma_free_attrs(to_dma_dev(g2d->drm_dev), G2D_CMDLIST_POOL_SIZE,
> + dma_free_attrs(drm_dev_dma_dev(g2d->drm_dev), G2D_CMDLIST_POOL_SIZE,
to_dma_dev returns only the dedicated DMA device explicitly stored by
the Exynos driver, whereas drm_dev_dma_dev falls back to the DRM
master device when no dedicated DMA device has been set. So this does
change the existing behavior, but it does not look problematic to me.
Thanks,
Inki Dae