From d61f4c178cb36a7b15871fcc60814f1f94a5044d Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Thu, 20 Aug 2015 14:54:16 +1000 Subject: [PATCH] drm/nouveau/nvif: device time mthd Signed-off-by: Ben Skeggs --- drivers/gpu/drm/nouveau/include/nvif/class.h | 7 +++++++ drivers/gpu/drm/nouveau/include/nvif/device.h | 1 - drivers/gpu/drm/nouveau/nvif/device.c | 6 +++++- drivers/gpu/drm/nouveau/nvkm/engine/device/user.c | 21 +++++++++++++++++++++ 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/nouveau/include/nvif/class.h b/drivers/gpu/drm/nouveau/include/nvif/class.h index e11b5ac..d52b27a 100644 --- a/drivers/gpu/drm/nouveau/include/nvif/class.h +++ b/drivers/gpu/drm/nouveau/include/nvif/class.h @@ -129,6 +129,7 @@ struct nv_device_v0 { }; #define NV_DEVICE_V0_INFO 0x00 +#define NV_DEVICE_V0_TIME 0x01 struct nv_device_info_v0 { __u8 version; @@ -157,6 +158,12 @@ struct nv_device_info_v0 { char name[64]; }; +struct nv_device_time_v0 { + __u8 version; + __u8 pad01[7]; + __u64 time; +}; + /******************************************************************************* * context dma diff --git a/drivers/gpu/drm/nouveau/include/nvif/device.h b/drivers/gpu/drm/nouveau/include/nvif/device.h index 68b431b..68196f4 100644 --- a/drivers/gpu/drm/nouveau/include/nvif/device.h +++ b/drivers/gpu/drm/nouveau/include/nvif/device.h @@ -57,7 +57,6 @@ u64 nvif_device_time(struct nvif_device *); #define nvxx_gpio(a) nvkm_gpio(nvxx_device(a)) #define nvxx_clk(a) nvkm_clk(nvxx_device(a)) #define nvxx_i2c(a) nvkm_i2c(nvxx_device(a)) -#define nvxx_timer(a) nvkm_timer(nvxx_device(a)) #define nvxx_therm(a) nvkm_therm(nvxx_device(a)) #include diff --git a/drivers/gpu/drm/nouveau/nvif/device.c b/drivers/gpu/drm/nouveau/nvif/device.c index 561fb9d..252d8c3 100644 --- a/drivers/gpu/drm/nouveau/nvif/device.c +++ b/drivers/gpu/drm/nouveau/nvif/device.c @@ -27,7 +27,11 @@ u64 nvif_device_time(struct nvif_device *device) { - return nvxx_timer(device)->read(nvxx_timer(device)); + struct nv_device_time_v0 args = {}; + int ret = nvif_object_mthd(&device->object, NV_DEVICE_V0_TIME, + &args, sizeof(args)); + WARN_ON_ONCE(ret != 0); + return args.time; } void diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/user.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/user.c index e44d607..cb3f3de 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/device/user.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/user.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -112,11 +113,31 @@ nvkm_udevice_info(struct nvkm_object *object, void *data, u32 size) } static int +nvkm_udevice_time(struct nvkm_object *object, void *data, u32 size) +{ + struct nvkm_udevice *udev = (void *)object; + struct nvkm_device *device = udev->device; + struct nvkm_timer *tmr = device->timer; + union { + struct nv_device_time_v0 v0; + } *args = data; + int ret; + + if (nvif_unpack(args->v0, 0, 0, false)) { + args->v0.time = tmr->read(tmr); + } + + return ret; +} + +static int nvkm_udevice_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size) { switch (mthd) { case NV_DEVICE_V0_INFO: return nvkm_udevice_info(object, data, size); + case NV_DEVICE_V0_TIME: + return nvkm_udevice_time(object, data, size); default: break; } -- 2.7.4