};
#define NV_DEVICE_V0_INFO 0x00
+#define NV_DEVICE_V0_TIME 0x01
struct nv_device_info_v0 {
__u8 version;
char name[64];
};
+struct nv_device_time_v0 {
+ __u8 version;
+ __u8 pad01[7];
+ __u64 time;
+};
+
/*******************************************************************************
* context dma
#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 <core/device.h>
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
#include <core/client.h>
#include <subdev/fb.h>
#include <subdev/instmem.h>
+#include <subdev/timer.h>
#include <nvif/class.h>
#include <nvif/unpack.h>
return 0;
}
+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;
}