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; }