]> git.baikalelectronics.ru Git - kernel.git/commit
drm/i915/perf: workaround register corruption in OATAILPTR
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Tue, 17 Nov 2020 13:01:24 +0000 (15:01 +0200)
committerLionel Landwerlin <lionel.g.landwerlin@intel.com>
Thu, 19 Nov 2020 13:46:29 +0000 (15:46 +0200)
commita539c0201cac25bbf98474939cd6a088f44369c5
tree753702e56a795e1a39a92401a2a94fb026069fe5
parent34a03a824e455e85122aa94d8ff031ea48cfd4df
drm/i915/perf: workaround register corruption in OATAILPTR

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.

This change has no impact on userspace, it only avoids a bunch of
DRM_NOTE("Skipping spurious, invalid OA report\n") messages.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Fixes: 85faa4d90530d5 ("drm/i915/perf: Add OA unit support for Gen 8+")
Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20201117130124.829979-1-lionel.g.landwerlin@intel.com
drivers/gpu/drm/i915/i915_perf.c
drivers/gpu/drm/i915/i915_reg.h