| .. | .. |
|---|
| 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 | { |
|---|