OSDN Git Service

drm/nouveau/nvif: access PTIMER through usermode class, if available
authorBen Skeggs <bskeggs@redhat.com>
Mon, 17 Feb 2020 04:55:49 +0000 (14:55 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 7 Apr 2020 04:37:50 +0000 (14:37 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/include/nvif/user.h
drivers/gpu/drm/nouveau/nvif/device.c
drivers/gpu/drm/nouveau/nvif/userc361.c

index 03c1182..6825574 100644 (file)
@@ -10,6 +10,7 @@ struct nvif_user {
 
 struct nvif_user_func {
        void (*doorbell)(struct nvif_user *, u32 token);
+       u64 (*time)(struct nvif_user *);
 };
 
 int nvif_user_init(struct nvif_device *);
index 1ec101b..0e92db4 100644 (file)
 u64
 nvif_device_time(struct nvif_device *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;
+       if (!device->user.func) {
+               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;
+       }
+
+       return device->user.func->time(&device->user);
 }
 
 void
index 19f9958..1116f87 100644 (file)
  */
 #include <nvif/user.h>
 
+static u64
+nvif_userc361_time(struct nvif_user *user)
+{
+       u32 hi, lo;
+
+       do {
+               hi = nvif_rd32(&user->object, 0x084);
+               lo = nvif_rd32(&user->object, 0x080);
+       } while (hi != nvif_rd32(&user->object, 0x084));
+
+       return ((u64)hi << 32 | lo);
+}
+
 static void
 nvif_userc361_doorbell(struct nvif_user *user, u32 token)
 {
@@ -30,4 +43,5 @@ nvif_userc361_doorbell(struct nvif_user *user, u32 token)
 const struct nvif_user_func
 nvif_userc361 = {
        .doorbell = nvif_userc361_doorbell,
+       .time = nvif_userc361_time,
 };