On Wed, 19 Mar 2025 15:03:17 +0000
Adrián Larumbe <adrian.laru...@collabora.com> wrote:

> Allow UM to label a BO for which it possesses a DRM handle.
> 
> Signed-off-by: Adrián Larumbe <adrian.laru...@collabora.com>
> ---
>  drivers/gpu/drm/panthor/panthor_drv.c | 37 +++++++++++++++++++++++++++
>  include/uapi/drm/panthor_drm.h        | 19 ++++++++++++++
>  2 files changed, 56 insertions(+)
> 
> diff --git a/drivers/gpu/drm/panthor/panthor_drv.c 
> b/drivers/gpu/drm/panthor/panthor_drv.c
> index 310bb44abe1a..e91acf132e06 100644
> --- a/drivers/gpu/drm/panthor/panthor_drv.c
> +++ b/drivers/gpu/drm/panthor/panthor_drv.c
> @@ -1330,6 +1330,41 @@ static int panthor_ioctl_vm_get_state(struct 
> drm_device *ddev, void *data,
>       return 0;
>  }
>  
> +static int panthor_ioctl_bo_set_label(struct drm_device *ddev, void *data,
> +                               struct drm_file *file)
> +{
> +     struct drm_panthor_bo_set_label *args = data;
> +     struct drm_gem_object *obj;
> +     const char *label;
> +     unsigned long len;
> +     int ret = 0;
> +
> +     obj = drm_gem_object_lookup(file, args->handle);
> +     if (!obj)
> +             return -ENOENT;
> +
> +     if (args->size && args->label) {
> +             len = (args->size < PAGE_SIZE) ? args->size : PAGE_SIZE;

Let's return -E2BIG or -EINVAL if args->size is bigger exceeds our limit
instead of pretending the label was stored.

> +             label = strndup_user(u64_to_user_ptr(args->label), len);
> +             if (IS_ERR(label)) {
> +                     ret = PTR_ERR(label);
> +                     goto err_label;
> +             }
> +     } else if (args->size && !args->label) {
> +             ret = -EINVAL;
> +             goto err_label;
> +     } else {
> +             label = NULL;
> +     }
> +
> +     panthor_gem_bo_set_label(obj, label);
> +
> +err_label:
> +     drm_gem_object_put(obj);
> +
> +     return ret;
> +}
> +
>  static int
>  panthor_open(struct drm_device *ddev, struct drm_file *file)
>  {
> @@ -1399,6 +1434,7 @@ static const struct drm_ioctl_desc 
> panthor_drm_driver_ioctls[] = {
>       PANTHOR_IOCTL(TILER_HEAP_CREATE, tiler_heap_create, DRM_RENDER_ALLOW),
>       PANTHOR_IOCTL(TILER_HEAP_DESTROY, tiler_heap_destroy, DRM_RENDER_ALLOW),
>       PANTHOR_IOCTL(GROUP_SUBMIT, group_submit, DRM_RENDER_ALLOW),
> +     PANTHOR_IOCTL(BO_SET_LABEL, bo_set_label, DRM_RENDER_ALLOW),
>  };
>  
>  static int panthor_mmap(struct file *filp, struct vm_area_struct *vma)
> @@ -1508,6 +1544,7 @@ static void panthor_debugfs_init(struct drm_minor 
> *minor)
>   * - 1.2 - adds DEV_QUERY_GROUP_PRIORITIES_INFO query
>   *       - adds PANTHOR_GROUP_PRIORITY_REALTIME priority
>   * - 1.3 - adds DRM_PANTHOR_GROUP_STATE_INNOCENT flag
> + * - 1.4 - adds DRM_IOCTL_PANTHOR_BO_SET_LABEL ioctl
>   */
>  static const struct drm_driver panthor_drm_driver = {
>       .driver_features = DRIVER_RENDER | DRIVER_GEM | DRIVER_SYNCOBJ |
> diff --git a/include/uapi/drm/panthor_drm.h b/include/uapi/drm/panthor_drm.h
> index 97e2c4510e69..26b52f147360 100644
> --- a/include/uapi/drm/panthor_drm.h
> +++ b/include/uapi/drm/panthor_drm.h
> @@ -127,6 +127,9 @@ enum drm_panthor_ioctl_id {
>  
>       /** @DRM_PANTHOR_TILER_HEAP_DESTROY: Destroy a tiler heap. */
>       DRM_PANTHOR_TILER_HEAP_DESTROY,
> +
> +     /** @DRM_PANTHOR_BO_SET_LABEL: Label a BO. */
> +     DRM_PANTHOR_BO_SET_LABEL,
>  };
>  
>  /**
> @@ -977,6 +980,20 @@ struct drm_panthor_tiler_heap_destroy {
>       __u32 pad;
>  };
>  
> +/**
> + * struct drm_panthor_bo_set_label - Arguments passed to 
> DRM_IOCTL_PANTHOR_BO_SET_LABEL
> + */
> +struct drm_panthor_bo_set_label {
> +     /** @handle: Handle of the buffer object to label. */
> +     __u32 handle;
> +
> +     /** @size: Length of the label, including the NULL terminator. */
> +     __u32 size;
> +
> +     /** @label: User pointer to a NULL-terminated string */
> +     __u64 label;
> +};
> +
>  /**
>   * DRM_IOCTL_PANTHOR() - Build a Panthor IOCTL number
>   * @__access: Access type. Must be R, W or RW.
> @@ -1019,6 +1036,8 @@ enum {
>               DRM_IOCTL_PANTHOR(WR, TILER_HEAP_CREATE, tiler_heap_create),
>       DRM_IOCTL_PANTHOR_TILER_HEAP_DESTROY =
>               DRM_IOCTL_PANTHOR(WR, TILER_HEAP_DESTROY, tiler_heap_destroy),
> +     DRM_IOCTL_PANTHOR_BO_SET_LABEL =
> +             DRM_IOCTL_PANTHOR(WR, BO_SET_LABEL, bo_set_label),
>  };
>  
>  #if defined(__cplusplus)

Reply via email to