diff options
author | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2023-03-31 14:21:34 -0400 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2023-12-12 14:05:59 -0500 |
commit | 7aaec3a623adda324f2435153a105088a8556b9a (patch) | |
tree | f5c5dcdedd15f236bbe8672b0933f16baac570aa /drivers/gpu/drm/xe/xe_mmio.h | |
parent | 86011ae21c15a779dcf25b97d5670371dc14e4c3 (diff) |
drm/xe: Let's return last value read on xe_mmio_wait32.
This is already useful because it avoids some extra reads
where registers might have changed after the timeout decision.
But also, it will be important to end the kill of i915's wait_for.
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Diffstat (limited to 'drivers/gpu/drm/xe/xe_mmio.h')
-rw-r--r-- | drivers/gpu/drm/xe/xe_mmio.h | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/drivers/gpu/drm/xe/xe_mmio.h b/drivers/gpu/drm/xe/xe_mmio.h index 7352b622ca87..ccd97a4a89c1 100644 --- a/drivers/gpu/drm/xe/xe_mmio.h +++ b/drivers/gpu/drm/xe/xe_mmio.h @@ -82,21 +82,28 @@ static inline int xe_mmio_write32_and_verify(struct xe_gt *gt, return (reg_val & mask) != eval ? -EINVAL : 0; } -static inline int xe_mmio_wait32(struct xe_gt *gt, - u32 reg, u32 val, - u32 mask, u32 timeout_ms) +static inline int xe_mmio_wait32(struct xe_gt *gt, u32 reg, u32 val, + u32 mask, u32 timeout_ms, u32 *out_val) { ktime_t cur = ktime_get_raw(); const ktime_t end = ktime_add_ms(cur, timeout_ms); + int ret = -ETIMEDOUT; s64 wait = 10; + u32 read; for (;;) { if ((xe_mmio_read32(gt, reg) & mask) == val) return 0; + read = xe_mmio_read32(gt, reg); + if ((read & mask) == val) { + ret = 0; + break; + } + cur = ktime_get_raw(); if (!ktime_before(cur, end)) - return -ETIMEDOUT; + break; if (ktime_after(ktime_add_us(cur, wait), end)) wait = ktime_us_delta(end, cur); @@ -105,7 +112,10 @@ static inline int xe_mmio_wait32(struct xe_gt *gt, wait <<= 1; } - return -ETIMEDOUT; + if (out_val) + *out_val = read; + + return ret; } int xe_mmio_ioctl(struct drm_device *dev, void *data, |