From 09c1b1e9da9f49cf79a3f58e4d3b25b0d4912ac3 Mon Sep 17 00:00:00 2001 From: Mikko Perttunen Date: Tue, 1 Nov 2022 12:01:19 +0200 Subject: [PATCH] gpu: host1x: Timestamp syncpoint wait completions Collect CLOCK_MONOTONIC timestamps in the interrupt handler when a syncpoint wait completes, and report it back in dma_fences and syncpoint wait UAPI. Signed-off-by: Mikko Perttunen Change-Id: I9f783833698df7d96c99c9ffef3205aa82adceb5 Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2801167 Reviewed-by: Jonathan Hunter Reviewed-by: svc_kernel_abi GVS: Gerrit_Virtual_Submit --- .../gpu/drm/tegra/include/uapi/drm/tegra_drm_next.h | 7 +++++++ drivers/gpu/drm/tegra/uapi.c | 10 +++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) 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 eb76cb90..d2a40c9f 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 @@ -1057,6 +1057,13 @@ struct drm_tegra_syncpoint_wait { __u32 value; __u32 padding; + + /** + * @timestamp: [out] + * + * CLOCK_MONOTONIC timestamp in nanoseconds taken when the wait completes. + */ + __u64 timestamp; }; #define DRM_IOCTL_TEGRA_CHANNEL_OPEN DRM_IOWR(DRM_COMMAND_BASE + 0x10, struct drm_tegra_channel_open) diff --git a/drivers/gpu/drm/tegra/uapi.c b/drivers/gpu/drm/tegra/uapi.c index 4552c3ac..45f92b4f 100644 --- a/drivers/gpu/drm/tegra/uapi.c +++ b/drivers/gpu/drm/tegra/uapi.c @@ -345,6 +345,8 @@ int tegra_drm_ioctl_syncpoint_wait(struct drm_device *drm, void *data, struct dr struct drm_tegra_syncpoint_wait *args = data; signed long timeout_jiffies; struct host1x_syncpt *sp; + ktime_t ts; + int err; if (args->padding != 0) return -EINVAL; @@ -355,5 +357,11 @@ int tegra_drm_ioctl_syncpoint_wait(struct drm_device *drm, void *data, struct dr timeout_jiffies = drm_timeout_abs_to_jiffies(args->timeout_ns); - return host1x_syncpt_wait(sp, args->threshold, timeout_jiffies, &args->value); + err = host1x_syncpt_wait_ts(sp, args->threshold, timeout_jiffies, &args->value, &ts); + if (err) + return err; + + args->timestamp = ktime_to_ns(ts); + + return 0; }