|
7 | 7 |
|
8 | 8 | #include <drm/drm_managed.h> |
9 | 9 |
|
| 10 | +#include <generated/xe_wa_oob.h> |
| 11 | + |
10 | 12 | #include "regs/xe_engine_regs.h" |
11 | 13 | #include "regs/xe_gt_regs.h" |
12 | 14 | #include "regs/xe_guc_regs.h" |
|
19 | 21 | #include "xe_map.h" |
20 | 22 | #include "xe_mmio.h" |
21 | 23 | #include "xe_platform_types.h" |
| 24 | +#include "xe_wa.h" |
22 | 25 |
|
23 | 26 | /* Slack of a few additional entries per engine */ |
24 | 27 | #define ADS_REGSET_EXTRA_MAX 8 |
@@ -279,21 +282,42 @@ static size_t calculate_golden_lrc_size(struct xe_guc_ads *ads) |
279 | 282 | return total_size; |
280 | 283 | } |
281 | 284 |
|
| 285 | +static void guc_waklv_enable_simple(struct xe_guc_ads *ads, |
| 286 | + enum xe_guc_klv_ids klv_id, u32 *offset, u32 *remain) |
| 287 | +{ |
| 288 | + u32 klv_entry[] = { |
| 289 | + /* 16:16 key/length */ |
| 290 | + FIELD_PREP(GUC_KLV_0_KEY, klv_id) | |
| 291 | + FIELD_PREP(GUC_KLV_0_LEN, 0), |
| 292 | + /* 0 dwords data */ |
| 293 | + }; |
| 294 | + u32 size; |
| 295 | + |
| 296 | + size = sizeof(klv_entry); |
| 297 | + |
| 298 | + if (xe_gt_WARN(ads_to_gt(ads), *remain < size, |
| 299 | + "w/a klv buffer too small to add klv id %d\n", klv_id)) |
| 300 | + return; |
| 301 | + |
| 302 | + xe_map_memcpy_to(ads_to_xe(ads), ads_to_map(ads), *offset, |
| 303 | + klv_entry, size); |
| 304 | + *offset += size; |
| 305 | + *remain -= size; |
| 306 | +} |
| 307 | + |
282 | 308 | static void guc_waklv_init(struct xe_guc_ads *ads) |
283 | 309 | { |
| 310 | + struct xe_gt *gt = ads_to_gt(ads); |
284 | 311 | u64 addr_ggtt; |
285 | 312 | u32 offset, remain, size; |
286 | 313 |
|
287 | 314 | offset = guc_ads_waklv_offset(ads); |
288 | 315 | remain = guc_ads_waklv_size(ads); |
289 | 316 |
|
290 | | - /* Add workarounds here |
291 | | - * |
292 | | - * if (XE_WA(gt, wa_id)) |
293 | | - * guc_waklv_enable_simple(ads, |
294 | | - * wa_klv_id, |
295 | | - * &offset, &remain); |
296 | | - */ |
| 317 | + if (XE_WA(gt, 14019882105)) |
| 318 | + guc_waklv_enable_simple(ads, |
| 319 | + GUC_WORKAROUND_KLV_BLOCK_INTERRUPTS_WHEN_MGSR_BLOCKED, |
| 320 | + &offset, &remain); |
297 | 321 |
|
298 | 322 | size = guc_ads_waklv_size(ads) - remain; |
299 | 323 | if (!size) |
|
0 commit comments