mirror of https://gitee.com/openkylin/linux.git
drm/nouveau/nvif: access PTIMER through usermode class, if available
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
028a12f5aa
commit
58e92b5ee8
|
@ -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 *);
|
||||
|
|
|
@ -27,11 +27,15 @@
|
|||
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
|
||||
|
|
|
@ -21,6 +21,19 @@
|
|||
*/
|
||||
#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,
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue