diff options
author | Ben Skeggs | 2018-12-11 05:50:02 +0100 |
---|---|---|
committer | Ben Skeggs | 2018-12-11 06:37:45 +0100 |
commit | e4f90a35c9668f8d0469a0160482b1856d07c2b5 (patch) | |
tree | 5fd2d6c73da8c7936c2776f2f054b3a9c15cf43e /drivers/gpu/drm/nouveau/nvkm/subdev/timer | |
parent | drm/nouveau/devinit/gm200-: export function to upload+execute PMU/PRE_OS (diff) | |
download | kernel-qcow2-linux-e4f90a35c9668f8d0469a0160482b1856d07c2b5.tar.gz kernel-qcow2-linux-e4f90a35c9668f8d0469a0160482b1856d07c2b5.tar.xz kernel-qcow2-linux-e4f90a35c9668f8d0469a0160482b1856d07c2b5.zip |
drm/nouveau/tmr: detect stalled gpu timer and break out of waits
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nvkm/subdev/timer')
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c index 36de23d12ae4..dd922033628c 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c @@ -23,6 +23,42 @@ */ #include "priv.h" +s64 +nvkm_timer_wait_test(struct nvkm_timer_wait *wait) +{ + struct nvkm_subdev *subdev = &wait->tmr->subdev; + u64 time = nvkm_timer_read(wait->tmr); + + if (wait->reads == 0) { + wait->time0 = time; + wait->time1 = time; + } + + if (wait->time1 == time) { + if (wait->reads++ == 16) { + nvkm_fatal(subdev, "stalled at %016llx\n", time); + return -ETIMEDOUT; + } + } else { + wait->time1 = time; + wait->reads = 1; + } + + if (wait->time1 - wait->time0 > wait->limit) + return -ETIMEDOUT; + + return wait->time1 - wait->time0; +} + +void +nvkm_timer_wait_init(struct nvkm_device *device, u64 nsec, + struct nvkm_timer_wait *wait) +{ + wait->tmr = device->timer; + wait->limit = nsec; + wait->reads = 0; +} + u64 nvkm_timer_read(struct nvkm_timer *tmr) { |