.. | .. |
---|
23 | 23 | */ |
---|
24 | 24 | #include "priv.h" |
---|
25 | 25 | |
---|
| 26 | +s64 |
---|
| 27 | +nvkm_timer_wait_test(struct nvkm_timer_wait *wait) |
---|
| 28 | +{ |
---|
| 29 | + struct nvkm_subdev *subdev = &wait->tmr->subdev; |
---|
| 30 | + u64 time = nvkm_timer_read(wait->tmr); |
---|
| 31 | + |
---|
| 32 | + if (wait->reads == 0) { |
---|
| 33 | + wait->time0 = time; |
---|
| 34 | + wait->time1 = time; |
---|
| 35 | + } |
---|
| 36 | + |
---|
| 37 | + if (wait->time1 == time) { |
---|
| 38 | + if (wait->reads++ == 16) { |
---|
| 39 | + nvkm_fatal(subdev, "stalled at %016llx\n", time); |
---|
| 40 | + return -ETIMEDOUT; |
---|
| 41 | + } |
---|
| 42 | + } else { |
---|
| 43 | + wait->time1 = time; |
---|
| 44 | + wait->reads = 1; |
---|
| 45 | + } |
---|
| 46 | + |
---|
| 47 | + if (wait->time1 - wait->time0 > wait->limit) |
---|
| 48 | + return -ETIMEDOUT; |
---|
| 49 | + |
---|
| 50 | + return wait->time1 - wait->time0; |
---|
| 51 | +} |
---|
| 52 | + |
---|
| 53 | +void |
---|
| 54 | +nvkm_timer_wait_init(struct nvkm_device *device, u64 nsec, |
---|
| 55 | + struct nvkm_timer_wait *wait) |
---|
| 56 | +{ |
---|
| 57 | + wait->tmr = device->timer; |
---|
| 58 | + wait->limit = nsec; |
---|
| 59 | + wait->reads = 0; |
---|
| 60 | +} |
---|
| 61 | + |
---|
26 | 62 | u64 |
---|
27 | 63 | nvkm_timer_read(struct nvkm_timer *tmr) |
---|
28 | 64 | { |
---|