drm/xe: Add support for OOB workarounds
[linux-block.git] / drivers / gpu / drm / xe / xe_wa.c
CommitLineData
dd08ebf6
MB
1// SPDX-License-Identifier: MIT
2/*
3 * Copyright © 2022 Intel Corporation
4 */
5
6#include "xe_wa.h"
7
49d329a0 8#include <drm/drm_managed.h>
b9d773fc 9#include <kunit/visibility.h>
dd08ebf6
MB
10#include <linux/compiler_types.h>
11
9616e74b 12#include "generated/xe_wa_oob.h"
b79e8fd9 13#include "regs/xe_engine_regs.h"
226bfec8 14#include "regs/xe_gt_regs.h"
c5841481 15#include "regs/xe_regs.h"
dd08ebf6
MB
16#include "xe_device_types.h"
17#include "xe_force_wake.h"
18#include "xe_gt.h"
19#include "xe_hw_engine_types.h"
20#include "xe_mmio.h"
21#include "xe_platform_types.h"
22#include "xe_rtp.h"
23#include "xe_step.h"
24
dd08ebf6
MB
25/**
26 * DOC: Hardware workarounds
27 *
28 * Hardware workarounds are register programming documented to be executed in
29 * the driver that fall outside of the normal programming sequences for a
30 * platform. There are some basic categories of workarounds, depending on
31 * how/when they are applied:
32 *
33 * - LRC workarounds: workarounds that touch registers that are
34 * saved/restored to/from the HW context image. The list is emitted (via Load
35 * Register Immediate commands) once when initializing the device and saved in
36 * the default context. That default context is then used on every context
37 * creation to have a "primed golden context", i.e. a context image that
38 * already contains the changes needed to all the registers.
39 *
dd08ebf6
MB
40 * - Engine workarounds: the list of these WAs is applied whenever the specific
41 * engine is reset. It's also possible that a set of engine classes share a
42 * common power domain and they are reset together. This happens on some
43 * platforms with render and compute engines. In this case (at least) one of
44 * them need to keeep the workaround programming: the approach taken in the
45 * driver is to tie those workarounds to the first compute/render engine that
46 * is registered. When executing with GuC submission, engine resets are
47 * outside of kernel driver control, hence the list of registers involved in
48 * written once, on engine initialization, and then passed to GuC, that
49 * saves/restores their values before/after the reset takes place. See
50 * ``drivers/gpu/drm/xe/xe_guc_ads.c`` for reference.
51 *
52 * - GT workarounds: the list of these WAs is applied whenever these registers
53 * revert to their default values: on GPU reset, suspend/resume [1]_, etc.
54 *
55 * - Register whitelist: some workarounds need to be implemented in userspace,
56 * but need to touch privileged registers. The whitelist in the kernel
57 * instructs the hardware to allow the access to happen. From the kernel side,
58 * this is just a special case of a MMIO workaround (as we write the list of
59 * these to/be-whitelisted registers to some special HW registers).
60 *
61 * - Workaround batchbuffers: buffers that get executed automatically by the
62 * hardware on every HW context restore. These buffers are created and
63 * programmed in the default context so the hardware always go through those
64 * programming sequences when switching contexts. The support for workaround
65 * batchbuffers is enabled these hardware mechanisms:
66 *
67 * #. INDIRECT_CTX: A batchbuffer and an offset are provided in the default
68 * context, pointing the hardware to jump to that location when that offset
69 * is reached in the context restore. Workaround batchbuffer in the driver
70 * currently uses this mechanism for all platforms.
71 *
72 * #. BB_PER_CTX_PTR: A batchbuffer is provided in the default context,
73 * pointing the hardware to a buffer to continue executing after the
74 * engine registers are restored in a context restore sequence. This is
75 * currently not used in the driver.
76 *
9616e74b
LDM
77 * - Other/OOB: There are WAs that, due to their nature, cannot be applied from
78 * a central place. Those are peppered around the rest of the code, as needed.
dd08ebf6
MB
79 * Workarounds related to the display IP are the main example.
80 *
81 * .. [1] Technically, some registers are powercontext saved & restored, so they
82 * survive a suspend/resume. In practice, writing them again is not too
83 * costly and simplifies things, so it's the approach taken in the driver.
84 *
85 * .. note::
86 * Hardware workarounds in xe work the same way as in i915, with the
87 * difference of how they are maintained in the code. In xe it uses the
88 * xe_rtp infrastructure so the workarounds can be kept in tables, following
89 * a more declarative approach rather than procedural.
90 */
91
3512a78a 92#undef XE_REG_MCR
07fbd1f8 93#define XE_REG_MCR(...) XE_REG(__VA_ARGS__, .mcr = 1)
dd08ebf6 94
4d5ab121
LDM
95__diag_push();
96__diag_ignore_all("-Woverride-init", "Allow field overrides in table");
97
91042671 98static const struct xe_rtp_entry_sr gt_was[] = {
dd08ebf6
MB
99 { XE_RTP_NAME("14011060649"),
100 XE_RTP_RULES(MEDIA_VERSION_RANGE(1200, 1255),
101 ENGINE_CLASS(VIDEO_DECODE),
4c128558 102 FUNC(xe_rtp_match_even_instance)),
844c0700 103 XE_RTP_ACTIONS(SET(VDBOX_CGCTL3F10(0), IECPUNIT_CLKGATE_DIS)),
944a5e99 104 XE_RTP_ENTRY_FLAG(FOREACH_ENGINE),
dd08ebf6 105 },
6b5ccd63
LDM
106 { XE_RTP_NAME("14011059788"),
107 XE_RTP_RULES(GRAPHICS_VERSION_RANGE(1200, 1210)),
d9b79ad2 108 XE_RTP_ACTIONS(SET(DFR_RATIO_EN_AND_CHICKEN, DFR_DISABLE))
6b5ccd63
LDM
109 },
110
111 /* DG1 */
112
113 { XE_RTP_NAME("1409420604"),
114 XE_RTP_RULES(PLATFORM(DG1)),
115 XE_RTP_ACTIONS(SET(SUBSLICE_UNIT_LEVEL_CLKGATE2, CPSSUNIT_CLKGATE_DIS))
116 },
117 { XE_RTP_NAME("1408615072"),
118 XE_RTP_RULES(PLATFORM(DG1)),
d9b79ad2 119 XE_RTP_ACTIONS(SET(UNSLICE_UNIT_LEVEL_CLKGATE2, VSUNIT_CLKGATE2_DIS))
6b5ccd63
LDM
120 },
121
122 /* DG2 */
123
dd08ebf6
MB
124 { XE_RTP_NAME("16010515920"),
125 XE_RTP_RULES(SUBPLATFORM(DG2, G10),
00a5912c 126 GRAPHICS_STEP(A0, B0),
dd08ebf6 127 ENGINE_CLASS(VIDEO_DECODE)),
844c0700 128 XE_RTP_ACTIONS(SET(VDBOX_CGCTL3F18(0), ALNUNIT_CLKGATE_DIS)),
944a5e99 129 XE_RTP_ENTRY_FLAG(FOREACH_ENGINE),
dd08ebf6
MB
130 },
131 { XE_RTP_NAME("22010523718"),
132 XE_RTP_RULES(SUBPLATFORM(DG2, G10)),
844c0700 133 XE_RTP_ACTIONS(SET(UNSLICE_UNIT_LEVEL_CLKGATE, CG3DDISCFEG_CLKGATE_DIS))
dd08ebf6
MB
134 },
135 { XE_RTP_NAME("14011006942"),
136 XE_RTP_RULES(SUBPLATFORM(DG2, G10)),
d9b79ad2 137 XE_RTP_ACTIONS(SET(SUBSLICE_UNIT_LEVEL_CLKGATE, DSS_ROUTER_CLKGATE_DIS))
dd08ebf6 138 },
911aeb0f 139 { XE_RTP_NAME("14012362059"),
00a5912c 140 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(A0, B0)),
911aeb0f
LDM
141 XE_RTP_ACTIONS(SET(XEHP_MERT_MOD_CTRL, FORCE_MISS_FTLB))
142 },
143 { XE_RTP_NAME("14012362059"),
00a5912c 144 XE_RTP_RULES(SUBPLATFORM(DG2, G11), GRAPHICS_STEP(A0, B0)),
911aeb0f
LDM
145 XE_RTP_ACTIONS(SET(XEHP_MERT_MOD_CTRL, FORCE_MISS_FTLB))
146 },
dd08ebf6 147 { XE_RTP_NAME("14010948348"),
00a5912c 148 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(A0, B0)),
844c0700 149 XE_RTP_ACTIONS(SET(UNSLCGCTL9430, MSQDUNIT_CLKGATE_DIS))
dd08ebf6
MB
150 },
151 { XE_RTP_NAME("14011037102"),
00a5912c 152 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(A0, B0)),
844c0700 153 XE_RTP_ACTIONS(SET(UNSLCGCTL9444, LTCDD_CLKGATE_DIS))
dd08ebf6
MB
154 },
155 { XE_RTP_NAME("14011371254"),
00a5912c 156 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(A0, B0)),
911aeb0f 157 XE_RTP_ACTIONS(SET(XEHP_SLICE_UNIT_LEVEL_CLKGATE, NODEDSS_CLKGATE_DIS))
dd08ebf6 158 },
844c0700 159 { XE_RTP_NAME("14011431319"),
00a5912c 160 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(A0, B0)),
844c0700
LDM
161 XE_RTP_ACTIONS(SET(UNSLCGCTL9440,
162 GAMTLBOACS_CLKGATE_DIS |
163 GAMTLBVDBOX7_CLKGATE_DIS | GAMTLBVDBOX6_CLKGATE_DIS |
164 GAMTLBVDBOX5_CLKGATE_DIS | GAMTLBVDBOX4_CLKGATE_DIS |
165 GAMTLBVDBOX3_CLKGATE_DIS | GAMTLBVDBOX2_CLKGATE_DIS |
166 GAMTLBVDBOX1_CLKGATE_DIS | GAMTLBVDBOX0_CLKGATE_DIS |
167 GAMTLBKCR_CLKGATE_DIS | GAMTLBGUC_CLKGATE_DIS |
168 GAMTLBBLT_CLKGATE_DIS),
169 SET(UNSLCGCTL9444,
170 GAMTLBGFXA0_CLKGATE_DIS | GAMTLBGFXA1_CLKGATE_DIS |
171 GAMTLBCOMPA0_CLKGATE_DIS | GAMTLBCOMPA1_CLKGATE_DIS |
172 GAMTLBCOMPB0_CLKGATE_DIS | GAMTLBCOMPB1_CLKGATE_DIS |
173 GAMTLBCOMPC0_CLKGATE_DIS | GAMTLBCOMPC1_CLKGATE_DIS |
174 GAMTLBCOMPD0_CLKGATE_DIS | GAMTLBCOMPD1_CLKGATE_DIS |
175 GAMTLBMERT_CLKGATE_DIS |
176 GAMTLBVEBOX3_CLKGATE_DIS | GAMTLBVEBOX2_CLKGATE_DIS |
177 GAMTLBVEBOX1_CLKGATE_DIS | GAMTLBVEBOX0_CLKGATE_DIS))
dd08ebf6
MB
178 },
179 { XE_RTP_NAME("14010569222"),
00a5912c 180 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(A0, B0)),
844c0700 181 XE_RTP_ACTIONS(SET(UNSLICE_UNIT_LEVEL_CLKGATE, GAMEDIA_CLKGATE_DIS))
dd08ebf6
MB
182 },
183 { XE_RTP_NAME("14011028019"),
00a5912c 184 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(A0, B0)),
844c0700 185 XE_RTP_ACTIONS(SET(SSMCGCTL9530, RTFUNIT_CLKGATE_DIS))
dd08ebf6 186 },
911aeb0f 187 { XE_RTP_NAME("14010680813"),
00a5912c 188 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(A0, B0)),
911aeb0f
LDM
189 XE_RTP_ACTIONS(SET(XEHP_GAMSTLB_CTRL,
190 CONTROL_BLOCK_CLKGATE_DIS |
191 EGRESS_BLOCK_CLKGATE_DIS |
192 TAG_BLOCK_CLKGATE_DIS))
193 },
dd08ebf6
MB
194 { XE_RTP_NAME("14014830051"),
195 XE_RTP_RULES(PLATFORM(DG2)),
844c0700 196 XE_RTP_ACTIONS(CLR(SARB_CHICKEN1, COMP_CKN_IN))
dd08ebf6
MB
197 },
198 { XE_RTP_NAME("14015795083"),
199 XE_RTP_RULES(PLATFORM(DG2)),
d9b79ad2 200 XE_RTP_ACTIONS(CLR(MISCCPCTL, DOP_CLOCK_GATE_RENDER_ENABLE))
dd08ebf6 201 },
911aeb0f
LDM
202 { XE_RTP_NAME("18018781329"),
203 XE_RTP_RULES(PLATFORM(DG2)),
204 XE_RTP_ACTIONS(SET(RENDER_MOD_CTRL, FORCE_MISS_FTLB),
205 SET(COMP_MOD_CTRL, FORCE_MISS_FTLB),
206 SET(XEHP_VDBX_MOD_CTRL, FORCE_MISS_FTLB),
207 SET(XEHP_VEBX_MOD_CTRL, FORCE_MISS_FTLB))
208 },
209 { XE_RTP_NAME("1509235366"),
210 XE_RTP_RULES(PLATFORM(DG2)),
211 XE_RTP_ACTIONS(SET(XEHP_GAMCNTRL_CTRL,
212 INVALIDATION_BROADCAST_MODE_DIS |
213 GLOBAL_INVALIDATION_MODE))
214 },
215 { XE_RTP_NAME("14010648519"),
216 XE_RTP_RULES(PLATFORM(DG2)),
217 XE_RTP_ACTIONS(SET(XEHP_L3NODEARBCFG, XEHP_LNESPARE))
218 },
a19220fa
LDM
219
220 /* PVC */
221
222 { XE_RTP_NAME("14015795083"),
223 XE_RTP_RULES(PLATFORM(PVC)),
d9b79ad2 224 XE_RTP_ACTIONS(CLR(MISCCPCTL, DOP_CLOCK_GATE_RENDER_ENABLE))
a19220fa
LDM
225 },
226 { XE_RTP_NAME("18018781329"),
227 XE_RTP_RULES(PLATFORM(PVC)),
228 XE_RTP_ACTIONS(SET(RENDER_MOD_CTRL, FORCE_MISS_FTLB),
229 SET(COMP_MOD_CTRL, FORCE_MISS_FTLB),
230 SET(XEHP_VDBX_MOD_CTRL, FORCE_MISS_FTLB),
231 SET(XEHP_VEBX_MOD_CTRL, FORCE_MISS_FTLB))
232 },
233 { XE_RTP_NAME("16016694945"),
234 XE_RTP_RULES(PLATFORM(PVC)),
07fbd1f8 235 XE_RTP_ACTIONS(SET(XEHPC_LNCFMISCCFGREG0, XEHPC_OVRLSCCC))
a19220fa 236 },
dd08ebf6
MB
237 {}
238};
239
91042671 240static const struct xe_rtp_entry_sr engine_was[] = {
dd08ebf6
MB
241 { XE_RTP_NAME("22010931296, 18011464164, 14010919138"),
242 XE_RTP_RULES(GRAPHICS_VERSION(1200), ENGINE_CLASS(RENDER)),
d9b79ad2
LDM
243 XE_RTP_ACTIONS(SET(FF_THREAD_MODE,
244 FF_TESSELATION_DOP_GATE_DISABLE))
dd08ebf6 245 },
dd08ebf6
MB
246 { XE_RTP_NAME("1409804808"),
247 XE_RTP_RULES(GRAPHICS_VERSION(1200),
248 ENGINE_CLASS(RENDER),
249 IS_INTEGRATED),
07fbd1f8 250 XE_RTP_ACTIONS(SET(ROW_CHICKEN2, PUSH_CONST_DEREF_HOLD_DIS))
dd08ebf6
MB
251 },
252 { XE_RTP_NAME("14010229206, 1409085225"),
253 XE_RTP_RULES(GRAPHICS_VERSION(1200),
254 ENGINE_CLASS(RENDER),
255 IS_INTEGRATED),
07fbd1f8 256 XE_RTP_ACTIONS(SET(ROW_CHICKEN4, DISABLE_TDL_PUSH))
dd08ebf6 257 },
6b5ccd63
LDM
258 { XE_RTP_NAME("1606931601"),
259 XE_RTP_RULES(GRAPHICS_VERSION_RANGE(1200, 1210), ENGINE_CLASS(RENDER)),
07fbd1f8 260 XE_RTP_ACTIONS(SET(ROW_CHICKEN2, DISABLE_EARLY_READ))
6b5ccd63 261 },
4d5ab121
LDM
262 { XE_RTP_NAME("14010826681, 1606700617, 22010271021, 18019627453"),
263 XE_RTP_RULES(GRAPHICS_VERSION_RANGE(1200, 1255), ENGINE_CLASS(RENDER)),
07fbd1f8 264 XE_RTP_ACTIONS(SET(CS_DEBUG_MODE1, FF_DOP_CLOCK_GATE_DISABLE))
6b5ccd63
LDM
265 },
266 { XE_RTP_NAME("1406941453"),
267 XE_RTP_RULES(GRAPHICS_VERSION_RANGE(1200, 1210), ENGINE_CLASS(RENDER)),
07fbd1f8 268 XE_RTP_ACTIONS(SET(SAMPLER_MODE, ENABLE_SMALLPL))
6b5ccd63
LDM
269 },
270 { XE_RTP_NAME("FtrPerCtxtPreemptionGranularityControl"),
271 XE_RTP_RULES(GRAPHICS_VERSION_RANGE(1200, 1250), ENGINE_CLASS(RENDER)),
d9b79ad2 272 XE_RTP_ACTIONS(SET(FF_SLICE_CS_CHICKEN1,
07fbd1f8 273 FFSC_PERCTX_PREEMPT_CTRL))
6b5ccd63
LDM
274 },
275
276 /* TGL */
277
dd08ebf6
MB
278 { XE_RTP_NAME("1607297627, 1607030317, 1607186500"),
279 XE_RTP_RULES(PLATFORM(TIGERLAKE), ENGINE_CLASS(RENDER)),
844c0700 280 XE_RTP_ACTIONS(SET(RING_PSMI_CTL(RENDER_RING_BASE),
d9b79ad2 281 WAIT_FOR_EVENT_POWER_DOWN_DISABLE |
07fbd1f8 282 RC_SEMA_IDLE_MSG_DISABLE))
dd08ebf6 283 },
6b5ccd63
LDM
284
285 /* RKL */
286
dd08ebf6
MB
287 { XE_RTP_NAME("1607297627, 1607030317, 1607186500"),
288 XE_RTP_RULES(PLATFORM(ROCKETLAKE), ENGINE_CLASS(RENDER)),
844c0700 289 XE_RTP_ACTIONS(SET(RING_PSMI_CTL(RENDER_RING_BASE),
d9b79ad2 290 WAIT_FOR_EVENT_POWER_DOWN_DISABLE |
07fbd1f8 291 RC_SEMA_IDLE_MSG_DISABLE))
dd08ebf6 292 },
6b5ccd63 293
95ff48c2
LDM
294 /* ADL-P */
295
296 { XE_RTP_NAME("1607297627, 1607030317, 1607186500"),
297 XE_RTP_RULES(PLATFORM(ALDERLAKE_P), ENGINE_CLASS(RENDER)),
298 XE_RTP_ACTIONS(SET(RING_PSMI_CTL(RENDER_RING_BASE),
d9b79ad2 299 WAIT_FOR_EVENT_POWER_DOWN_DISABLE |
07fbd1f8 300 RC_SEMA_IDLE_MSG_DISABLE))
95ff48c2
LDM
301 },
302
6b5ccd63
LDM
303 /* DG2 */
304
4d5ab121
LDM
305 { XE_RTP_NAME("22013037850"),
306 XE_RTP_RULES(PLATFORM(DG2), FUNC(xe_rtp_match_first_render_or_compute)),
307 XE_RTP_ACTIONS(SET(LSC_CHICKEN_BIT_0_UDW,
308 DISABLE_128B_EVICTION_COMMAND_UDW))
309 },
310 { XE_RTP_NAME("22014226127"),
311 XE_RTP_RULES(PLATFORM(DG2), FUNC(xe_rtp_match_first_render_or_compute)),
312 XE_RTP_ACTIONS(SET(LSC_CHICKEN_BIT_0, DISABLE_D8_D16_COASLESCE))
313 },
314 { XE_RTP_NAME("18017747507"),
315 XE_RTP_RULES(PLATFORM(DG2), FUNC(xe_rtp_match_first_render_or_compute)),
316 XE_RTP_ACTIONS(SET(VFG_PREEMPTION_CHICKEN,
07fbd1f8 317 POLYGON_TRIFAN_LINELOOP_DISABLE))
4d5ab121
LDM
318 },
319 { XE_RTP_NAME("22012826095, 22013059131"),
00a5912c 320 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(B0, C0),
4d5ab121
LDM
321 FUNC(xe_rtp_match_first_render_or_compute)),
322 XE_RTP_ACTIONS(FIELD_SET(LSC_CHICKEN_BIT_0_UDW,
323 MAXREQS_PER_BANK,
324 REG_FIELD_PREP(MAXREQS_PER_BANK, 2)))
325 },
326 { XE_RTP_NAME("22012826095, 22013059131"),
327 XE_RTP_RULES(SUBPLATFORM(DG2, G11),
328 FUNC(xe_rtp_match_first_render_or_compute)),
329 XE_RTP_ACTIONS(FIELD_SET(LSC_CHICKEN_BIT_0_UDW,
330 MAXREQS_PER_BANK,
331 REG_FIELD_PREP(MAXREQS_PER_BANK, 2)))
332 },
333 { XE_RTP_NAME("22013059131"),
00a5912c 334 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(B0, C0),
4d5ab121
LDM
335 FUNC(xe_rtp_match_first_render_or_compute)),
336 XE_RTP_ACTIONS(SET(LSC_CHICKEN_BIT_0, FORCE_1_SUB_MESSAGE_PER_FRAGMENT))
337 },
338 { XE_RTP_NAME("22013059131"),
339 XE_RTP_RULES(SUBPLATFORM(DG2, G11),
340 FUNC(xe_rtp_match_first_render_or_compute)),
341 XE_RTP_ACTIONS(SET(LSC_CHICKEN_BIT_0, FORCE_1_SUB_MESSAGE_PER_FRAGMENT))
342 },
343 { XE_RTP_NAME("14010918519"),
344 XE_RTP_RULES(SUBPLATFORM(DG2, G10),
345 FUNC(xe_rtp_match_first_render_or_compute)),
346 XE_RTP_ACTIONS(SET(LSC_CHICKEN_BIT_0,
347 FORCE_SLM_FENCE_SCOPE_TO_TILE |
348 FORCE_UGM_FENCE_SCOPE_TO_TILE,
349 /*
350 * Ignore read back as it always returns 0 in these
351 * steps
352 */
353 .read_mask = 0))
354 },
6b5ccd63 355 { XE_RTP_NAME("14015227452"),
4d5ab121
LDM
356 XE_RTP_RULES(PLATFORM(DG2),
357 FUNC(xe_rtp_match_first_render_or_compute)),
07fbd1f8 358 XE_RTP_ACTIONS(SET(ROW_CHICKEN4, XEHP_DIS_BBL_SYSPIPE))
dd08ebf6 359 },
4d5ab121
LDM
360 { XE_RTP_NAME("16015675438"),
361 XE_RTP_RULES(PLATFORM(DG2),
362 FUNC(xe_rtp_match_first_render_or_compute)),
363 XE_RTP_ACTIONS(SET(FF_SLICE_CS_CHICKEN2,
07fbd1f8 364 PERF_FIX_BALANCING_CFE_DISABLE))
4d5ab121
LDM
365 },
366 { XE_RTP_NAME("16011620976, 22015475538"),
367 XE_RTP_RULES(PLATFORM(DG2),
368 FUNC(xe_rtp_match_first_render_or_compute)),
369 XE_RTP_ACTIONS(SET(LSC_CHICKEN_BIT_0_UDW, DIS_CHAIN_2XSIMD8))
370 },
371 { XE_RTP_NAME("22012654132"),
00a5912c 372 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(A0, C0),
4d5ab121
LDM
373 FUNC(xe_rtp_match_first_render_or_compute)),
374 XE_RTP_ACTIONS(SET(CACHE_MODE_SS, ENABLE_PREFETCH_INTO_IC,
4d5ab121
LDM
375 /*
376 * Register can't be read back for verification on
377 * DG2 due to Wa_14012342262
378 */
379 .read_mask = 0))
380 },
381 { XE_RTP_NAME("22012654132"),
382 XE_RTP_RULES(SUBPLATFORM(DG2, G11),
383 FUNC(xe_rtp_match_first_render_or_compute)),
384 XE_RTP_ACTIONS(SET(CACHE_MODE_SS, ENABLE_PREFETCH_INTO_IC,
4d5ab121
LDM
385 /*
386 * Register can't be read back for verification on
387 * DG2 due to Wa_14012342262
388 */
389 .read_mask = 0))
390 },
391 { XE_RTP_NAME("1509727124"),
6b5ccd63 392 XE_RTP_RULES(PLATFORM(DG2), ENGINE_CLASS(RENDER)),
07fbd1f8 393 XE_RTP_ACTIONS(SET(SAMPLER_MODE, SC_DISABLE_POWER_OPTIMIZATION_EBB))
4d5ab121
LDM
394 },
395 { XE_RTP_NAME("22012856258"),
396 XE_RTP_RULES(PLATFORM(DG2), ENGINE_CLASS(RENDER)),
07fbd1f8 397 XE_RTP_ACTIONS(SET(ROW_CHICKEN2, DISABLE_READ_SUPPRESSION))
4d5ab121
LDM
398 },
399 { XE_RTP_NAME("14013392000"),
00a5912c
LDM
400 XE_RTP_RULES(SUBPLATFORM(DG2, G11), GRAPHICS_STEP(A0, B0),
401 ENGINE_CLASS(RENDER)),
07fbd1f8 402 XE_RTP_ACTIONS(SET(ROW_CHICKEN2, ENABLE_LARGE_GRF_MODE))
4d5ab121
LDM
403 },
404 { XE_RTP_NAME("14012419201"),
00a5912c
LDM
405 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(A0, B0),
406 ENGINE_CLASS(RENDER)),
d9b79ad2 407 XE_RTP_ACTIONS(SET(ROW_CHICKEN4,
07fbd1f8 408 DISABLE_HDR_PAST_PAYLOAD_HOLD_FIX))
4d5ab121
LDM
409 },
410 { XE_RTP_NAME("14012419201"),
00a5912c
LDM
411 XE_RTP_RULES(SUBPLATFORM(DG2, G11), GRAPHICS_STEP(A0, B0),
412 ENGINE_CLASS(RENDER)),
d9b79ad2 413 XE_RTP_ACTIONS(SET(ROW_CHICKEN4,
07fbd1f8 414 DISABLE_HDR_PAST_PAYLOAD_HOLD_FIX))
4d5ab121
LDM
415 },
416 { XE_RTP_NAME("1308578152"),
00a5912c
LDM
417 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(B0, C0),
418 ENGINE_CLASS(RENDER),
4d5ab121 419 FUNC(xe_rtp_match_first_gslice_fused_off)),
d9b79ad2 420 XE_RTP_ACTIONS(CLR(CS_DEBUG_MODE1,
07fbd1f8 421 REPLAY_MODE_GRANULARITY))
4d5ab121
LDM
422 },
423 { XE_RTP_NAME("22010960976, 14013347512"),
424 XE_RTP_RULES(PLATFORM(DG2), ENGINE_CLASS(RENDER)),
425 XE_RTP_ACTIONS(CLR(XEHP_HDC_CHICKEN0,
07fbd1f8 426 LSC_L1_FLUSH_CTL_3D_DATAPORT_FLUSH_EVENTS_MASK))
4d5ab121
LDM
427 },
428 { XE_RTP_NAME("1608949956, 14010198302"),
429 XE_RTP_RULES(PLATFORM(DG2), ENGINE_CLASS(RENDER)),
d9b79ad2 430 XE_RTP_ACTIONS(SET(ROW_CHICKEN,
07fbd1f8 431 MDQ_ARBITRATION_MODE | UGM_BACKUP_MODE))
dd08ebf6 432 },
4d5ab121 433 { XE_RTP_NAME("22010430635"),
00a5912c
LDM
434 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(A0, B0),
435 ENGINE_CLASS(RENDER)),
d9b79ad2 436 XE_RTP_ACTIONS(SET(ROW_CHICKEN4,
07fbd1f8 437 DISABLE_GRF_CLEAR))
4d5ab121
LDM
438 },
439 { XE_RTP_NAME("14013202645"),
00a5912c
LDM
440 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(B0, C0),
441 ENGINE_CLASS(RENDER)),
4d5ab121
LDM
442 XE_RTP_ACTIONS(SET(RT_CTRL, DIS_NULL_QUERY))
443 },
444 { XE_RTP_NAME("14013202645"),
00a5912c
LDM
445 XE_RTP_RULES(SUBPLATFORM(DG2, G11), GRAPHICS_STEP(A0, B0),
446 ENGINE_CLASS(RENDER)),
4d5ab121
LDM
447 XE_RTP_ACTIONS(SET(RT_CTRL, DIS_NULL_QUERY))
448 },
449 { XE_RTP_NAME("22012532006"),
00a5912c
LDM
450 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(A0, C0),
451 ENGINE_CLASS(RENDER)),
d9b79ad2 452 XE_RTP_ACTIONS(SET(HALF_SLICE_CHICKEN7,
07fbd1f8 453 DG2_DISABLE_ROUND_ENABLE_ALLOW_FOR_SSLA))
4d5ab121
LDM
454 },
455 { XE_RTP_NAME("22012532006"),
00a5912c
LDM
456 XE_RTP_RULES(SUBPLATFORM(DG2, G11), GRAPHICS_STEP(A0, B0),
457 ENGINE_CLASS(RENDER)),
d9b79ad2 458 XE_RTP_ACTIONS(SET(HALF_SLICE_CHICKEN7,
07fbd1f8 459 DG2_DISABLE_ROUND_ENABLE_ALLOW_FOR_SSLA))
4d5ab121
LDM
460 },
461 { XE_RTP_NAME("22014600077"),
00a5912c 462 XE_RTP_RULES(SUBPLATFORM(DG2, G11), GRAPHICS_STEP(B0, FOREVER),
4d5ab121
LDM
463 ENGINE_CLASS(RENDER)),
464 XE_RTP_ACTIONS(SET(CACHE_MODE_SS,
465 ENABLE_EU_COUNT_FOR_TDL_FLUSH,
4d5ab121
LDM
466 /*
467 * Wa_14012342262 write-only reg, so skip
468 * verification
469 */
470 .read_mask = 0))
471 },
472 { XE_RTP_NAME("22014600077"),
473 XE_RTP_RULES(SUBPLATFORM(DG2, G10), ENGINE_CLASS(RENDER)),
474 XE_RTP_ACTIONS(SET(CACHE_MODE_SS,
475 ENABLE_EU_COUNT_FOR_TDL_FLUSH,
4d5ab121
LDM
476 /*
477 * Wa_14012342262 write-only reg, so skip
478 * verification
479 */
480 .read_mask = 0))
481 },
4688d9ce
LDM
482
483 /* PVC */
484
485 { XE_RTP_NAME("22014226127"),
486 XE_RTP_RULES(PLATFORM(PVC), FUNC(xe_rtp_match_first_render_or_compute)),
487 XE_RTP_ACTIONS(SET(LSC_CHICKEN_BIT_0, DISABLE_D8_D16_COASLESCE))
488 },
489 { XE_RTP_NAME("14015227452"),
490 XE_RTP_RULES(PLATFORM(PVC), FUNC(xe_rtp_match_first_render_or_compute)),
07fbd1f8 491 XE_RTP_ACTIONS(SET(ROW_CHICKEN4, XEHP_DIS_BBL_SYSPIPE))
4688d9ce
LDM
492 },
493 { XE_RTP_NAME("16015675438"),
494 XE_RTP_RULES(PLATFORM(PVC), FUNC(xe_rtp_match_first_render_or_compute)),
07fbd1f8 495 XE_RTP_ACTIONS(SET(FF_SLICE_CS_CHICKEN2, PERF_FIX_BALANCING_CFE_DISABLE))
4688d9ce
LDM
496 },
497 { XE_RTP_NAME("14014999345"),
00a5912c
LDM
498 XE_RTP_RULES(PLATFORM(PVC), ENGINE_CLASS(COMPUTE),
499 GRAPHICS_STEP(B0, C0)),
07fbd1f8 500 XE_RTP_ACTIONS(SET(CACHE_MODE_SS, DISABLE_ECC))
4688d9ce 501 },
dd08ebf6
MB
502 {}
503};
504
91042671 505static const struct xe_rtp_entry_sr lrc_was[] = {
dd08ebf6
MB
506 { XE_RTP_NAME("1409342910, 14010698770, 14010443199, 1408979724, 1409178076, 1409207793, 1409217633, 1409252684, 1409347922, 1409142259"),
507 XE_RTP_RULES(GRAPHICS_VERSION_RANGE(1200, 1210)),
d9b79ad2 508 XE_RTP_ACTIONS(SET(COMMON_SLICE_CHICKEN3,
07fbd1f8 509 DISABLE_CPS_AWARE_COLOR_PIPE))
dd08ebf6
MB
510 },
511 { XE_RTP_NAME("WaDisableGPGPUMidThreadPreemption"),
512 XE_RTP_RULES(GRAPHICS_VERSION_RANGE(1200, 1210)),
d9b79ad2
LDM
513 XE_RTP_ACTIONS(FIELD_SET(CS_CHICKEN1,
514 PREEMPT_GPGPU_LEVEL_MASK,
07fbd1f8 515 PREEMPT_GPGPU_THREAD_GROUP_LEVEL))
dd08ebf6 516 },
fd93946d
LDM
517 { XE_RTP_NAME("1806527549"),
518 XE_RTP_RULES(GRAPHICS_VERSION(1200)),
07fbd1f8 519 XE_RTP_ACTIONS(SET(HIZ_CHICKEN, HZ_DEPTH_TEST_LE_GE_OPT_DISABLE))
fd93946d
LDM
520 },
521 { XE_RTP_NAME("1606376872"),
522 XE_RTP_RULES(GRAPHICS_VERSION(1200)),
07fbd1f8 523 XE_RTP_ACTIONS(SET(COMMON_SLICE_CHICKEN4, DISABLE_TDC_LOAD_BALANCING_CALC))
fd93946d 524 },
cedbc0b7
LDM
525
526 /* DG1 */
527
dd08ebf6
MB
528 { XE_RTP_NAME("1409044764"),
529 XE_RTP_RULES(PLATFORM(DG1)),
d9b79ad2 530 XE_RTP_ACTIONS(CLR(COMMON_SLICE_CHICKEN3,
07fbd1f8 531 DG1_FLOAT_POINT_BLEND_OPT_STRICT_MODE_EN))
dd08ebf6
MB
532 },
533 { XE_RTP_NAME("22010493298"),
534 XE_RTP_RULES(PLATFORM(DG1)),
844c0700 535 XE_RTP_ACTIONS(SET(HIZ_CHICKEN,
07fbd1f8 536 DG1_HZ_READ_SUPPRESSION_OPTIMIZATION_DISABLE))
dd08ebf6 537 },
8cd7e975
LDM
538
539 /* DG2 */
540
541 { XE_RTP_NAME("16011186671"),
00a5912c 542 XE_RTP_RULES(SUBPLATFORM(DG2, G11), GRAPHICS_STEP(A0, B0)),
07fbd1f8
LDM
543 XE_RTP_ACTIONS(CLR(VFLSKPD, DIS_MULT_MISS_RD_SQUASH),
544 SET(VFLSKPD, DIS_OVER_FETCH_CACHE))
8cd7e975
LDM
545 },
546 { XE_RTP_NAME("14010469329"),
00a5912c 547 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(A0, B0)),
8cd7e975 548 XE_RTP_ACTIONS(SET(XEHP_COMMON_SLICE_CHICKEN3,
07fbd1f8 549 XEHP_DUAL_SIMD8_SEQ_MERGE_DISABLE))
8cd7e975
LDM
550 },
551 { XE_RTP_NAME("14010698770, 22010613112, 22010465075"),
00a5912c 552 XE_RTP_RULES(SUBPLATFORM(DG2, G10), GRAPHICS_STEP(A0, B0)),
8cd7e975 553 XE_RTP_ACTIONS(SET(XEHP_COMMON_SLICE_CHICKEN3,
07fbd1f8 554 DISABLE_CPS_AWARE_COLOR_PIPE))
8cd7e975
LDM
555 },
556 { XE_RTP_NAME("16013271637"),
557 XE_RTP_RULES(PLATFORM(DG2)),
558 XE_RTP_ACTIONS(SET(XEHP_SLICE_COMMON_ECO_CHICKEN1,
07fbd1f8 559 MSC_MSAA_REODER_BUF_BYPASS_DISABLE))
8cd7e975
LDM
560 },
561 { XE_RTP_NAME("14014947963"),
562 XE_RTP_RULES(PLATFORM(DG2)),
563 XE_RTP_ACTIONS(FIELD_SET(VF_PREEMPTION,
564 PREEMPTION_VERTEX_COUNT,
07fbd1f8 565 0x4000))
8cd7e975
LDM
566 },
567 { XE_RTP_NAME("18018764978"),
568 XE_RTP_RULES(PLATFORM(DG2)),
569 XE_RTP_ACTIONS(SET(XEHP_PSS_MODE2,
07fbd1f8 570 SCOREBOARD_STALL_FLUSH_CONTROL))
8cd7e975
LDM
571 },
572 { XE_RTP_NAME("15010599737"),
573 XE_RTP_RULES(PLATFORM(DG2)),
07fbd1f8 574 XE_RTP_ACTIONS(SET(CHICKEN_RASTER_1, DIS_SF_ROUND_NEAREST_EVEN))
8cd7e975
LDM
575 },
576 { XE_RTP_NAME("18019271663"),
577 XE_RTP_RULES(PLATFORM(DG2)),
07fbd1f8 578 XE_RTP_ACTIONS(SET(CACHE_MODE_1, MSAA_OPTIMIZATION_REDUC_DISABLE))
8cd7e975 579 },
dd08ebf6
MB
580 {}
581};
582
9616e74b
LDM
583static __maybe_unused const struct xe_rtp_entry oob_was[] = {
584#include <generated/xe_wa_oob.c>
585 {}
586};
587
588static_assert(ARRAY_SIZE(oob_was) - 1 == _XE_WA_OOB_COUNT);
589
4d5ab121
LDM
590__diag_pop();
591
9616e74b
LDM
592/**
593 * xe_wa_process_oob - process OOB workaround table
594 * @gt: GT instance to process workarounds for
595 *
596 * Process OOB workaround table for this platform, marking in @gt the
597 * workarounds that are active.
598 */
599void xe_wa_process_oob(struct xe_gt *gt)
600{
601 struct xe_rtp_process_ctx ctx = XE_RTP_PROCESS_CTX_INITIALIZER(gt);
602
603 xe_rtp_process_ctx_enable_active_tracking(&ctx, gt->wa_active.oob,
604 ARRAY_SIZE(oob_was));
605 xe_rtp_process(&ctx, oob_was);
606}
607
dd08ebf6
MB
608/**
609 * xe_wa_process_gt - process GT workaround table
610 * @gt: GT instance to process workarounds for
611 *
612 * Process GT workaround table for this platform, saving in @gt all the
613 * workarounds that need to be applied at the GT level.
614 */
615void xe_wa_process_gt(struct xe_gt *gt)
616{
72906d34
LDM
617 struct xe_rtp_process_ctx ctx = XE_RTP_PROCESS_CTX_INITIALIZER(gt);
618
49d329a0
LDM
619 xe_rtp_process_ctx_enable_active_tracking(&ctx, gt->wa_active.gt,
620 ARRAY_SIZE(gt_was));
91042671 621 xe_rtp_process_to_sr(&ctx, gt_was, &gt->reg_sr);
dd08ebf6 622}
b9d773fc 623EXPORT_SYMBOL_IF_KUNIT(xe_wa_process_gt);
dd08ebf6
MB
624
625/**
626 * xe_wa_process_engine - process engine workaround table
627 * @hwe: engine instance to process workarounds for
628 *
629 * Process engine workaround table for this platform, saving in @hwe all the
630 * workarounds that need to be applied at the engine level that match this
631 * engine.
632 */
633void xe_wa_process_engine(struct xe_hw_engine *hwe)
634{
72906d34
LDM
635 struct xe_rtp_process_ctx ctx = XE_RTP_PROCESS_CTX_INITIALIZER(hwe);
636
49d329a0
LDM
637 xe_rtp_process_ctx_enable_active_tracking(&ctx, hwe->gt->wa_active.engine,
638 ARRAY_SIZE(engine_was));
91042671 639 xe_rtp_process_to_sr(&ctx, engine_was, &hwe->reg_sr);
dd08ebf6
MB
640}
641
642/**
643 * xe_wa_process_lrc - process context workaround table
644 * @hwe: engine instance to process workarounds for
645 *
646 * Process context workaround table for this platform, saving in @hwe all the
647 * workarounds that need to be applied on context restore. These are workarounds
648 * touching registers that are part of the HW context image.
649 */
650void xe_wa_process_lrc(struct xe_hw_engine *hwe)
651{
72906d34
LDM
652 struct xe_rtp_process_ctx ctx = XE_RTP_PROCESS_CTX_INITIALIZER(hwe);
653
49d329a0
LDM
654 xe_rtp_process_ctx_enable_active_tracking(&ctx, hwe->gt->wa_active.lrc,
655 ARRAY_SIZE(lrc_was));
91042671 656 xe_rtp_process_to_sr(&ctx, lrc_was, &hwe->reg_lrc);
dd08ebf6 657}
49d329a0
LDM
658
659/**
660 * xe_wa_init - initialize gt with workaround bookkeeping
661 * @gt: GT instance to initialize
662 *
663 * Returns 0 for success, negative error code otherwise.
664 */
665int xe_wa_init(struct xe_gt *gt)
666{
667 struct xe_device *xe = gt_to_xe(gt);
9616e74b 668 size_t n_oob, n_lrc, n_engine, n_gt, total;
49d329a0
LDM
669 unsigned long *p;
670
671 n_gt = BITS_TO_LONGS(ARRAY_SIZE(gt_was));
672 n_engine = BITS_TO_LONGS(ARRAY_SIZE(engine_was));
673 n_lrc = BITS_TO_LONGS(ARRAY_SIZE(lrc_was));
9616e74b
LDM
674 n_oob = BITS_TO_LONGS(ARRAY_SIZE(oob_was));
675 total = n_gt + n_engine + n_lrc + n_oob;
49d329a0
LDM
676
677 p = drmm_kzalloc(&xe->drm, sizeof(*p) * total, GFP_KERNEL);
678 if (!p)
679 return -ENOMEM;
680
681 gt->wa_active.gt = p;
682 p += n_gt;
683 gt->wa_active.engine = p;
684 p += n_engine;
685 gt->wa_active.lrc = p;
9616e74b
LDM
686 p += n_lrc;
687 gt->wa_active.oob = p;
49d329a0
LDM
688
689 return 0;
690}
40a627ca
LDM
691
692void xe_wa_dump(struct xe_gt *gt, struct drm_printer *p)
693{
694 size_t idx;
695
696 drm_printf(p, "GT Workarounds\n");
697 for_each_set_bit(idx, gt->wa_active.gt, ARRAY_SIZE(gt_was))
698 drm_printf_indent(p, 1, "%s\n", gt_was[idx].name);
699
700 drm_printf(p, "\nEngine Workarounds\n");
701 for_each_set_bit(idx, gt->wa_active.engine, ARRAY_SIZE(engine_was))
702 drm_printf_indent(p, 1, "%s\n", engine_was[idx].name);
703
704 drm_printf(p, "\nLRC Workarounds\n");
705 for_each_set_bit(idx, gt->wa_active.lrc, ARRAY_SIZE(lrc_was))
706 drm_printf_indent(p, 1, "%s\n", lrc_was[idx].name);
9616e74b
LDM
707
708 drm_printf(p, "\nOOB Workarounds\n");
709 for_each_set_bit(idx, gt->wa_active.oob, ARRAY_SIZE(oob_was))
710 if (oob_was[idx].name)
711 drm_printf_indent(p, 1, "%s\n", oob_was[idx].name);
40a627ca 712}