On 10/10/2025 11:11, Boris Brezillon wrote: > 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 > > Signed-off-by: Boris Brezillon <[email protected]>
Reviewed-by: Steven Price <[email protected]> > --- > drivers/gpu/drm/panthor/panthor_drv.c | 24 +++++++++++ > include/uapi/drm/panthor_drm.h | 57 +++++++++++++++++++++++++++ > 2 files changed, 81 insertions(+) > > diff --git a/drivers/gpu/drm/panthor/panthor_drv.c > b/drivers/gpu/drm/panthor/panthor_drv.c > index 857954d2ac7b..9004d0ba0e45 100644 > --- a/drivers/gpu/drm/panthor/panthor_drv.c > +++ b/drivers/gpu/drm/panthor/panthor_drv.c > @@ -1438,6 +1438,29 @@ static int panthor_ioctl_bo_sync(struct drm_device > *ddev, void *data, > 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) > { > @@ -1513,6 +1536,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) > diff --git a/include/uapi/drm/panthor_drm.h b/include/uapi/drm/panthor_drm.h > index 4b10b3c289e9..54502286c8b1 100644 > --- a/include/uapi/drm/panthor_drm.h > +++ b/include/uapi/drm/panthor_drm.h > @@ -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, > }; > > /** > @@ -1137,6 +1144,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. > @@ -1185,6 +1240,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)
