From: Jani Nikula <jani.nikula@intel.com>
To: Thomas Zimmermann <tzimmermann@suse.de>,
simona@ffwll.ch, javierm@redhat.com, airlied@gmail.com,
maarten.lankhorst@linux.intel.com, mripard@kernel.org,
hdegoede@redhat.com, airlied@redhat.com, sean@poorly.run,
sumit.semwal@linaro.org, christian.koenig@amd.com,
admin@kodeit.net, gargaditya08@live.com
Cc: dri-devel@lists.freedesktop.org, Thomas Zimmermann <tzimmermann@suse.de>
Subject: Re: [PATCH v2 1/5] drm/prime: Support dedicated DMA device for dma-buf imports
Date: Fri, 07 Mar 2025 14:45:44 +0200 [thread overview]
Message-ID: <87y0xhggav.fsf@intel.com> (raw)
In-Reply-To: <20250307080836.42848-2-tzimmermann@suse.de>
On Fri, 07 Mar 2025, Thomas Zimmermann <tzimmermann@suse.de> wrote:
> Importing dma-bufs via PRIME requires a DMA-capable device. Devices on
> peripheral busses, such as USB, often cannot perform DMA by themselves.
> Without DMA-capable device PRIME import fails. DRM drivers for USB
> devices already use a separate DMA device for dma-buf imports. Make the
> mechanism generally available.
>
> Besides the case of USB, there are embedded DRM devices without DMA
> capability. DMA is performed by a separate controller. DRM drivers should
> set this accordingly.
>
> Add the field dma_dev to struct drm_device to refer to the device's DMA
> device. For USB this should be the USB controller. Use dma_dev in the
> PRIME import helpers, if set.
>
> v2:
> - acquire internal reference on dma_dev (Jani)
> - add DMA-controller usecase to docs (Maxime)
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
> ---
> drivers/gpu/drm/drm_drv.c | 21 +++++++++++++++++++
> drivers/gpu/drm/drm_prime.c | 2 +-
> include/drm/drm_device.h | 41 +++++++++++++++++++++++++++++++++++++
> 3 files changed, 63 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
> index 17fc5dc708f4..c9487bc88624 100644
> --- a/drivers/gpu/drm/drm_drv.c
> +++ b/drivers/gpu/drm/drm_drv.c
> @@ -500,6 +500,25 @@ void drm_dev_unplug(struct drm_device *dev)
> }
> EXPORT_SYMBOL(drm_dev_unplug);
>
> +/**
> + * drm_dev_set_dma_dev - set the DMA device for a DRM device
> + * @dev: DRM device
> + * @dma_dev: DMA device or NULL
> + *
> + * Sets the DMA device of the given DRM device. Only required if
> + * the DMA device is different from the DRM device's parent. After
> + * calling this function, the DRM device holds a reference on
> + * @dma_dev. Pass NULL to clear the DMA device.
> + */
> +void drm_dev_set_dma_dev(struct drm_device *dev, struct device *dma_dev)
> +{
> + dma_dev = get_device(dma_dev);
> +
> + put_device(dev->dma_dev);
> + dev->dma_dev = dma_dev;
> +}
> +EXPORT_SYMBOL(drm_dev_set_dma_dev);
> +
> /*
> * Available recovery methods for wedged device. To be sent along with device
> * wedged uevent.
> @@ -654,6 +673,8 @@ static void drm_dev_init_release(struct drm_device *dev, void *res)
> {
> drm_fs_inode_free(dev->anon_inode);
>
> + put_device(dev->dma_dev);
> + dev->dma_dev = NULL;
> put_device(dev->dev);
> /* Prevent use-after-free in drm_managed_release when debugging is
> * enabled. Slightly awkward, but can't really be helped. */
> diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
> index bdb51c8f262e..ed4e5f06b79d 100644
> --- a/drivers/gpu/drm/drm_prime.c
> +++ b/drivers/gpu/drm/drm_prime.c
> @@ -998,7 +998,7 @@ EXPORT_SYMBOL(drm_gem_prime_import_dev);
> struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
> struct dma_buf *dma_buf)
> {
> - return drm_gem_prime_import_dev(dev, dma_buf, dev->dev);
> + return drm_gem_prime_import_dev(dev, dma_buf, drm_dev_dma_dev(dev));
> }
> EXPORT_SYMBOL(drm_gem_prime_import);
>
> diff --git a/include/drm/drm_device.h b/include/drm/drm_device.h
> index 6ea54a578cda..e2f894f1b90a 100644
> --- a/include/drm/drm_device.h
> +++ b/include/drm/drm_device.h
> @@ -64,6 +64,28 @@ struct drm_device {
> /** @dev: Device structure of bus-device */
> struct device *dev;
>
> + /**
> + * @dma_dev:
> + *
> + * Device for DMA operations. Only required if the device @dev
> + * cannot perform DMA by itself. Should be NULL otherwise. Call
> + * drm_dev_dma_dev() to get the DMA device instead of using this
> + * field directly. Call drm_dev_set_dma_dev() to set this field.
> + *
> + * DRM devices are sometimes bound to virtual devices that cannot
> + * perform DMA by themselves. Drivers should set this field to the
> + * respective DMA controller.
> + *
> + * Devices on USB and other peripheral busses also cannot perform
> + * DMA by themselves. The @dma_dev field should point the bus
> + * controller that does DMA on behalve of such a device. Required
> + * for importing buffers via dma-buf.
> + *
> + * If set, the DRM core automatically releases the reference on the
> + * device.
> + */
> + struct device *dma_dev;
> +
> /**
> * @managed:
> *
> @@ -327,4 +349,23 @@ struct drm_device {
> struct dentry *debugfs_root;
> };
>
> +void drm_dev_set_dma_dev(struct drm_device *dev, struct device *dma_dev);
> +
> +/**
> + * drm_dev_dma_dev - returns the DMA device for a DRM device
> + * @dev: DRM device
> + *
> + * Returns the DMA device of the given DRM device. By default, this
> + * the DRM device's parent. See drm_dev_set_dma_dev().
> + *
> + * Returns:
> + * A DMA-capable device for the DRM device.
> + */
> +static inline struct device *drm_dev_dma_dev(struct drm_device *dev)
> +{
> + if (dev->dma_dev)
> + return dev->dma_dev;
> + return dev->dev;
> +}
> +
> #endif
--
Jani Nikula, Intel
next prev parent reply other threads:[~2025-03-07 12:45 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-07 8:03 [PATCH v2 0/5] drm: Provide a dedicated DMA device for PRIME import Thomas Zimmermann
2025-03-07 8:03 ` [PATCH v2 1/5] drm/prime: Support dedicated DMA device for dma-buf imports Thomas Zimmermann
2025-03-07 12:45 ` Jani Nikula [this message]
2025-03-07 13:03 ` Maxime Ripard
2025-03-07 8:04 ` [PATCH v2 2/5] drm/appletbdrm: Set struct drm_device.dma_dev Thomas Zimmermann
2025-03-07 11:14 ` Aditya Garg
2025-03-07 8:04 ` [PATCH v2 3/5] drm/gm12u320: " Thomas Zimmermann
2025-03-07 8:04 ` [PATCH v2 4/5] drm/gud: " Thomas Zimmermann
2025-03-07 8:04 ` [PATCH v2 5/5] drm/udl: " Thomas Zimmermann
2025-03-07 12:50 ` [PATCH v2 0/5] drm: Provide a dedicated DMA device for PRIME import Jani Nikula
2025-03-07 13:32 ` Simona Vetter
2025-03-10 9:50 ` Thomas Zimmermann
2025-03-10 10:04 ` Thomas Zimmermann
2025-03-10 13:56 ` Christian König
2025-03-10 14:30 ` Thomas Zimmermann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87y0xhggav.fsf@intel.com \
--to=jani.nikula@intel.com \
--cc=admin@kodeit.net \
--cc=airlied@gmail.com \
--cc=airlied@redhat.com \
--cc=christian.koenig@amd.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=gargaditya08@live.com \
--cc=hdegoede@redhat.com \
--cc=javierm@redhat.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=sean@poorly.run \
--cc=simona@ffwll.ch \
--cc=sumit.semwal@linaro.org \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.