]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/panthor: Add an ioctl to query BO flags
authorBoris Brezillon <boris.brezillon@collabora.com>
Mon, 8 Dec 2025 10:08:32 +0000 (11:08 +0100)
committerBoris Brezillon <boris.brezillon@collabora.com>
Tue, 9 Dec 2025 12:09:36 +0000 (13:09 +0100)
This is useful when importing BOs, so we can know about cacheability
and flush the caches when needed.

We can also know when the buffer comes from a different subsystem and
take proper actions (avoid CPU mappings, or do kernel-based syncs
instead of userland cache flushes).

v2:
- New commit

v3:
- Add Steve's R-b

v4:
- No changes

v5:
- No changes

v6:
- No changes

v7:
- No changes

v8:
- No changes

Reviewed-by: Steven Price <steven.price@arm.com>
Link: https://patch.msgid.link/20251208100841.730527-6-boris.brezillon@collabora.com
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
drivers/gpu/drm/panthor/panthor_drv.c
include/uapi/drm/panthor_drm.h

index 2a9f1feac57adc583d375876ca36cd9f0fdfcffa..67d694d00ccb0fe04c11a6d20f23ea9c90241bac 100644 (file)
@@ -1434,6 +1434,29 @@ err_ops:
        return ret;
 }
 
+static int panthor_ioctl_bo_query_info(struct drm_device *ddev, void *data,
+                                      struct drm_file *file)
+{
+       struct drm_panthor_bo_query_info *args = data;
+       struct panthor_gem_object *bo;
+       struct drm_gem_object *obj;
+
+       obj = drm_gem_object_lookup(file, args->handle);
+       if (!obj)
+               return -ENOENT;
+
+       bo = to_panthor_bo(obj);
+       args->pad = 0;
+       args->create_flags = bo->flags;
+
+       args->extra_flags = 0;
+       if (drm_gem_is_imported(&bo->base.base))
+               args->extra_flags |= DRM_PANTHOR_BO_IS_IMPORTED;
+
+       drm_gem_object_put(obj);
+       return 0;
+}
+
 static int
 panthor_open(struct drm_device *ddev, struct drm_file *file)
 {
@@ -1509,6 +1532,7 @@ static const struct drm_ioctl_desc panthor_drm_driver_ioctls[] = {
        PANTHOR_IOCTL(BO_SET_LABEL, bo_set_label, DRM_RENDER_ALLOW),
        PANTHOR_IOCTL(SET_USER_MMIO_OFFSET, set_user_mmio_offset, DRM_RENDER_ALLOW),
        PANTHOR_IOCTL(BO_SYNC, bo_sync, DRM_RENDER_ALLOW),
+       PANTHOR_IOCTL(BO_QUERY_INFO, bo_query_info, DRM_RENDER_ALLOW),
 };
 
 static int panthor_mmap(struct file *filp, struct vm_area_struct *vma)
index 9f810305db6e08b5e8f65edc86e29abe4a7e5182..39d5ce8157423f5eb66cee1bb7d97d864dde2a6b 100644 (file)
@@ -147,6 +147,13 @@ enum drm_panthor_ioctl_id {
 
        /** @DRM_PANTHOR_BO_SYNC: Sync BO data to/from the device */
        DRM_PANTHOR_BO_SYNC,
+
+       /**
+        * @DRM_PANTHOR_BO_QUERY_INFO: Query information about a BO.
+        *
+        * This is useful for imported BOs.
+        */
+       DRM_PANTHOR_BO_QUERY_INFO,
 };
 
 /**
@@ -1123,6 +1130,54 @@ struct drm_panthor_bo_sync {
        struct drm_panthor_obj_array ops;
 };
 
+/**
+ * enum drm_panthor_bo_extra_flags - Set of flags returned on a BO_QUERY_INFO request
+ *
+ * Those are flags reflecting BO properties that are not directly coming from the flags
+ * passed are creation time, or information on BOs that were imported from other drivers.
+ */
+enum drm_panthor_bo_extra_flags {
+       /**
+        * @DRM_PANTHOR_BO_IS_IMPORTED: BO has been imported from an external driver.
+        *
+        * Note that imported dma-buf handles are not flagged as imported if they
+        * where exported by panthor. Only buffers that are coming from other drivers
+        * (dma heaps, other GPUs, display controllers, V4L, ...).
+        *
+        * It's also important to note that all imported BOs are mapped cached and can't
+        * be considered IO-coherent even if the GPU is. This means they require explicit
+        * syncs that must go through the DRM_PANTHOR_BO_SYNC ioctl (userland cache
+        * maintenance is not allowed in that case, because extra operations might be
+        * needed to make changes visible to the CPU/device, like buffer migration when the
+        * exporter is a GPU with its own VRAM).
+        */
+       DRM_PANTHOR_BO_IS_IMPORTED = (1 << 0),
+};
+
+/**
+ * struct drm_panthor_bo_query_info - Query BO info
+ */
+struct drm_panthor_bo_query_info {
+       /** @handle: Handle of the buffer object to query flags on. */
+       __u32 handle;
+
+       /**
+        * @extra_flags: Combination of enum drm_panthor_bo_extra_flags flags.
+        */
+       __u32 extra_flags;
+
+       /**
+        * @create_flags: Flags passed at creation time.
+        *
+        * Combination of enum drm_panthor_bo_flags flags.
+        * Will be zero if the buffer comes from a different driver.
+        */
+       __u32 create_flags;
+
+       /** @pad: Will be zero on return. */
+       __u32 pad;
+};
+
 /**
  * DRM_IOCTL_PANTHOR() - Build a Panthor IOCTL number
  * @__access: Access type. Must be R, W or RW.
@@ -1171,6 +1226,8 @@ enum {
                DRM_IOCTL_PANTHOR(WR, SET_USER_MMIO_OFFSET, set_user_mmio_offset),
        DRM_IOCTL_PANTHOR_BO_SYNC =
                DRM_IOCTL_PANTHOR(WR, BO_SYNC, bo_sync),
+       DRM_IOCTL_PANTHOR_BO_QUERY_INFO =
+               DRM_IOCTL_PANTHOR(WR, BO_QUERY_INFO, bo_query_info),
 };
 
 #if defined(__cplusplus)