[Intel-gfx] [PATCH] drm/i915/perf: workaround register corruption in OATAILPTR

Umesh Nerlige Ramappa umesh.nerlige.ramappa at intel.com
Tue Nov 17 17:09:47 UTC 2020


On Tue, Nov 17, 2020 at 03:01:24PM +0200, Lionel Landwerlin wrote:
>After having written the entire OA buffer with reports, the HW will
>write again at the beginning of the OA buffer. It'll indicate it by
>setting the WRAP bits in the OASTATUS register.
>
>When a wrap happens and that at the end of the read vfunc we write the
>OASTATUS register back to clear the REPORT_LOST bit, we sometimes see
>that the OATAILPTR register is reset to a previous position on Gen8/9
>(apparently not the case on Gen11+). This leads the next call to the
>read vfunc to process reports we've already read. Because we've marked
>those as read by clearing the reason & timestamp dwords, they're
>discarded and a "Skipping spurious, invalid OA report" message is
>emitted.
>
>The workaround to avoid this OATAILPTR value reset seems to be to set
>the wrap bits when writing back OASTATUS.
>
>Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
>Fixes: 19f81df2859eb1 ("drm/i915/perf: Add OA unit support for Gen 8+")
>---
> drivers/gpu/drm/i915/i915_perf.c | 9 +++++++--
> drivers/gpu/drm/i915/i915_reg.h  | 2 ++
> 2 files changed, 9 insertions(+), 2 deletions(-)
>
>diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
>index e94976976571..3640d0e229d2 100644
>--- a/drivers/gpu/drm/i915/i915_perf.c
>+++ b/drivers/gpu/drm/i915/i915_perf.c
>@@ -909,8 +909,13 @@ static int gen8_oa_read(struct i915_perf_stream *stream,
> 				       DRM_I915_PERF_RECORD_OA_REPORT_LOST);
> 		if (ret)
> 			return ret;
>-		intel_uncore_write(uncore, oastatus_reg,
>-				   oastatus & ~GEN8_OASTATUS_REPORT_LOST);
>+
>+		intel_uncore_rmw(uncore, oastatus_reg,
>+				 GEN8_OASTATUS_COUNTER_OVERFLOW |
>+				 GEN8_OASTATUS_REPORT_LOST,
>+				 IS_GEN_RANGE(uncore->i915, 8, 10) ?
>+				 (GEN8_OASTATUS_HEAD_POINTER_WRAP |
>+				  GEN8_OASTATUS_TAIL_POINTER_WRAP) : 0);

Great find. Thanks for resolving this.

Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa at intel.com>

Umesh
> 	}
>
> 	return gen8_append_oa_reports(stream, buf, count, offset);
>diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
>index 7ea70b7ffcc6..5375b219cc3b 100644
>--- a/drivers/gpu/drm/i915/i915_reg.h
>+++ b/drivers/gpu/drm/i915/i915_reg.h
>@@ -679,6 +679,8 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
> #define  GEN7_OASTATUS2_MEM_SELECT_GGTT     (1 << 0) /* 0: PPGTT, 1: GGTT */
>
> #define GEN8_OASTATUS _MMIO(0x2b08)
>+#define  GEN8_OASTATUS_TAIL_POINTER_WRAP    (1 << 17)
>+#define  GEN8_OASTATUS_HEAD_POINTER_WRAP    (1 << 16)
> #define  GEN8_OASTATUS_OVERRUN_STATUS	    (1 << 3)
> #define  GEN8_OASTATUS_COUNTER_OVERFLOW     (1 << 2)
> #define  GEN8_OASTATUS_OABUFFER_OVERFLOW    (1 << 1)
>-- 
>2.29.2
>


More information about the Intel-gfx mailing list