From: Thomas Zimmermann <tzimmerm...@suse.de>

[ Upstream commit b57aa47d39e94dc47403a745e2024664e544078c ]

Add drm_gem_is_imported() that tests if a GEM object's buffer has
been imported. Update the GEM code accordingly.

GEM code usually tests for imports if import_attach has been set
in struct drm_gem_object. But attaching a dma-buf on import requires
a DMA-capable importer device, which is not the case for many serial
busses like USB or I2C. The new helper tests if a GEM object's dma-buf
has been created from the GEM object.

Signed-off-by: Thomas Zimmermann <tzimmerm...@suse.de>
Reviewed-by: Anusha Srivatsa <asriv...@redhat.com>
Reviewed-by: Christian König <christian.koe...@amd.com>
Link: 
https://patchwork.freedesktop.org/patch/msgid/20250226172457.217725-2-tzimmerm...@suse.de
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/gpu/drm/drm_gem.c |  4 ++--
 include/drm/drm_gem.h     | 14 ++++++++++++++
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index 44a948b80ee14..deb93f78ce344 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -322,7 +322,7 @@ int drm_gem_dumb_map_offset(struct drm_file *file, struct 
drm_device *dev,
                return -ENOENT;
 
        /* Don't allow imported objects to be mapped */
-       if (obj->import_attach) {
+       if (drm_gem_is_imported(obj)) {
                ret = -EINVAL;
                goto out;
        }
@@ -1155,7 +1155,7 @@ void drm_gem_print_info(struct drm_printer *p, unsigned 
int indent,
                          drm_vma_node_start(&obj->vma_node));
        drm_printf_indent(p, indent, "size=%zu\n", obj->size);
        drm_printf_indent(p, indent, "imported=%s\n",
-                         str_yes_no(obj->import_attach));
+                         str_yes_no(drm_gem_is_imported(obj)));
 
        if (obj->funcs->print_info)
                obj->funcs->print_info(p, indent, obj);
diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h
index 7c2ec139c464a..fbfccb96dd17b 100644
--- a/include/drm/drm_gem.h
+++ b/include/drm/drm_gem.h
@@ -35,6 +35,7 @@
  */
 
 #include <linux/kref.h>
+#include <linux/dma-buf.h>
 #include <linux/dma-resv.h>
 #include <linux/list.h>
 #include <linux/mutex.h>
@@ -557,6 +558,19 @@ static inline bool 
drm_gem_object_is_shared_for_memory_stats(struct drm_gem_obje
        return (obj->handle_count > 1) || obj->dma_buf;
 }
 
+/**
+ * drm_gem_is_imported() - Tests if GEM object's buffer has been imported
+ * @obj: the GEM object
+ *
+ * Returns:
+ * True if the GEM object's buffer has been imported, false otherwise
+ */
+static inline bool drm_gem_is_imported(const struct drm_gem_object *obj)
+{
+       /* The dma-buf's priv field points to the original GEM object. */
+       return obj->dma_buf && (obj->dma_buf->priv != obj);
+}
+
 #ifdef CONFIG_LOCKDEP
 /**
  * drm_gem_gpuva_set_lock() - Set the lock protecting accesses to the gpuva 
list.
-- 
2.39.5

Reply via email to