untrusted comment: verify with openbsd-65-base.pub
RWSZaRmt1LEQTyf/B7jK/PSfxorzTyhxg/UMb7NIsDrhAu5J5v0418bXj3LsdhjTxKdn5zx4AfE7nHQFnK6ngVemRP4gclvOmAk=
OpenBSD 6.5 errata 028, January 17, 2020:
Execution Unit state was not cleared on context switch with Intel Gen9
graphics hardware.
Apply by doing:
signify -Vep /etc/signify/openbsd-65-base.pub -x 028_inteldrmctx.patch.sig \
-m - | (cd /usr/src && patch -p0)
And then rebuild and install a new kernel:
KK=`sysctl -n kern.osversion | cut -d# -f1`
cd /usr/src/sys/arch/`machine`/compile/$KK
make obj
make config
make
make install
Index: sys/dev/pci/drm/i915/intel_lrc.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_lrc.c,v
retrieving revision 1.2
diff -u -p -r1.2 intel_lrc.c
--- sys/dev/pci/drm/i915/intel_lrc.c 30 Sep 2017 07:36:56 -0000 1.2
+++ sys/dev/pci/drm/i915/intel_lrc.c 15 Jan 2020 02:32:53 -0000
@@ -1313,6 +1313,7 @@ static int gen9_init_indirectctx_bb(stru
int ret;
struct drm_device *dev = ring->dev;
uint32_t index = wa_ctx_start(wa_ctx, *offset, CACHELINE_DWORDS);
+ uint32_t scratch_addr;
/* WaDisableCtxRestoreArbitration:skl,bxt */
if (IS_SKL_REVID(dev, 0, SKL_REVID_D0) ||
@@ -1324,6 +1325,19 @@ static int gen9_init_indirectctx_bb(stru
if (ret < 0)
return ret;
index = ret;
+
+ /* WaClearSlmSpaceAtContextSwitch:skl,bxt,kbl,glk,cfl */
+ /* Actual scratch location is at 128 bytes offset */
+ scratch_addr = ring->scratch.gtt_offset + 2 * CACHELINE_BYTES;
+ wa_ctx_emit(batch, index, GFX_OP_PIPE_CONTROL(6));
+ wa_ctx_emit(batch, index, (PIPE_CONTROL_FLUSH_L3 |
+ PIPE_CONTROL_GLOBAL_GTT_IVB |
+ PIPE_CONTROL_CS_STALL |
+ PIPE_CONTROL_QW_WRITE));
+ wa_ctx_emit(batch, index, scratch_addr);
+ wa_ctx_emit(batch, index, 0);
+ wa_ctx_emit(batch, index, 0);
+ wa_ctx_emit(batch, index, 0);
/* Pad to end of cacheline */
while (index % CACHELINE_DWORDS)