From 92ed8780d2d4075473bdd86ceac52c391f8bd3e7 Mon Sep 17 00:00:00 2001 From: Mikko Perttunen Date: Thu, 31 Oct 2024 04:29:11 +0000 Subject: [PATCH] drm/tegra: Add new syncpoint increment IOCTL Add new syncpoint increment IOCTL in line with the new channel/ syncpoint IOCTLs, that only allows incrementing owned syncpoints. Change-Id: Ieed11e1ba840da31ecfe7029051bfa61b88cd2b5 Signed-off-by: Mikko Perttunen Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3284407 GVS: buildbot_gerritrpt Reviewed-by: Santosh BS --- drivers/gpu/drm/tegra/drm.c | 2 ++ .../tegra/include/uapi/drm/tegra_drm_next.h | 12 ++++++++++ drivers/gpu/drm/tegra/uapi.c | 24 +++++++++++++++++++ drivers/gpu/drm/tegra/uapi.h | 2 ++ 4 files changed, 40 insertions(+) diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c index c185f354..885b31f4 100644 --- a/drivers/gpu/drm/tegra/drm.c +++ b/drivers/gpu/drm/tegra/drm.c @@ -782,6 +782,8 @@ static const struct drm_ioctl_desc tegra_drm_ioctls[] = { DRM_RENDER_ALLOW), DRM_IOCTL_DEF_DRV(TEGRA_SYNCPOINT_EXPORT_MEMORY, tegra_drm_ioctl_syncpoint_export_memory, DRM_RENDER_ALLOW), + DRM_IOCTL_DEF_DRV(TEGRA_SYNCPOINT_INCREMENT, tegra_drm_ioctl_syncpoint_increment, + DRM_RENDER_ALLOW), DRM_IOCTL_DEF_DRV(TEGRA_GEM_CREATE, tegra_gem_create, DRM_RENDER_ALLOW), DRM_IOCTL_DEF_DRV(TEGRA_GEM_MMAP, tegra_gem_mmap, DRM_RENDER_ALLOW), diff --git a/drivers/gpu/drm/tegra/include/uapi/drm/tegra_drm_next.h b/drivers/gpu/drm/tegra/include/uapi/drm/tegra_drm_next.h index 3ef63a59..a27ae928 100644 --- a/drivers/gpu/drm/tegra/include/uapi/drm/tegra_drm_next.h +++ b/drivers/gpu/drm/tegra/include/uapi/drm/tegra_drm_next.h @@ -1107,6 +1107,17 @@ struct drm_tegra_syncpoint_export_memory { __u32 stride; }; +struct drm_tegra_syncpoint_increment { + /** + * @id: [in] + * + * ID of syncpoint to increment. The specific syncpoint + * must be allocated through this file descriptor. + */ + __u32 id; + __u32 padding; +}; + #define DRM_IOCTL_TEGRA_CHANNEL_OPEN DRM_IOWR(DRM_COMMAND_BASE + 0x10, struct drm_tegra_channel_open) #define DRM_IOCTL_TEGRA_CHANNEL_CLOSE DRM_IOWR(DRM_COMMAND_BASE + 0x11, struct drm_tegra_channel_close) #define DRM_IOCTL_TEGRA_CHANNEL_MAP DRM_IOWR(DRM_COMMAND_BASE + 0x12, struct drm_tegra_channel_map) @@ -1116,6 +1127,7 @@ struct drm_tegra_syncpoint_export_memory { #define DRM_IOCTL_TEGRA_SYNCPOINT_ALLOCATE DRM_IOWR(DRM_COMMAND_BASE + 0x20, struct drm_tegra_syncpoint_allocate) #define DRM_IOCTL_TEGRA_SYNCPOINT_FREE DRM_IOWR(DRM_COMMAND_BASE + 0x21, struct drm_tegra_syncpoint_free) #define DRM_IOCTL_TEGRA_SYNCPOINT_WAIT DRM_IOWR(DRM_COMMAND_BASE + 0x22, struct drm_tegra_syncpoint_wait) +#define DRM_IOCTL_TEGRA_SYNCPOINT_INCREMENT DRM_IOWR(DRM_COMMAND_BASE + 0x23, struct drm_tegra_syncpoint_increment) #define DRM_IOCTL_TEGRA_SYNCPOINT_EXPORT_MEMORY DRM_IOWR(DRM_COMMAND_BASE + 0x24, struct drm_tegra_syncpoint_export_memory) #if defined(__cplusplus) diff --git a/drivers/gpu/drm/tegra/uapi.c b/drivers/gpu/drm/tegra/uapi.c index b7cdbde0..55ddac2d 100644 --- a/drivers/gpu/drm/tegra/uapi.c +++ b/drivers/gpu/drm/tegra/uapi.c @@ -574,3 +574,27 @@ put_syncpts: return err; } + +int tegra_drm_ioctl_syncpoint_increment(struct drm_device *drm, void *data, + struct drm_file *file) +{ + struct drm_tegra_syncpoint_increment *args = data; + struct tegra_drm_file *fpriv = file->driver_priv; + struct host1x_syncpt *sp; + int err; + + if (args->padding != 0) + return -EINVAL; + + mutex_lock(&fpriv->lock); + sp = xa_load(&fpriv->syncpoints, args->id); + if (!sp) { + mutex_unlock(&fpriv->lock); + return -EINVAL; + } + + err = host1x_syncpt_incr(sp); + mutex_unlock(&fpriv->lock); + + return err; +} diff --git a/drivers/gpu/drm/tegra/uapi.h b/drivers/gpu/drm/tegra/uapi.h index 5f9c82c7..e9692f5d 100644 --- a/drivers/gpu/drm/tegra/uapi.h +++ b/drivers/gpu/drm/tegra/uapi.h @@ -51,6 +51,8 @@ int tegra_drm_ioctl_syncpoint_free(struct drm_device *drm, void *data, struct drm_file *file); int tegra_drm_ioctl_syncpoint_wait(struct drm_device *drm, void *data, struct drm_file *file); +int tegra_drm_ioctl_syncpoint_increment(struct drm_device *drm, void *data, + struct drm_file *file); int tegra_drm_ioctl_syncpoint_export_memory(struct drm_device *drm, void *data, struct drm_file *file);