Skip to content

Commit 6cc7a5c

Browse files
drm/i915/guc: Add support for w/a KLVs
To prevent running out of bits, new w/a enable flags are being added via a KLV system instead of a 32 bit flags word. Signed-off-by: John Harrison <[email protected]> Reviewed-by: Vinay Belgaumkar <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent f673d59 commit 6cc7a5c

File tree

5 files changed

+85
-2
lines changed

5 files changed

+85
-2
lines changed

drivers/gpu/drm/i915/gt/uc/abi/guc_errors_abi.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ enum intel_guc_load_status {
3636
INTEL_GUC_LOAD_STATUS_INVALID_INIT_DATA_RANGE_START,
3737
INTEL_GUC_LOAD_STATUS_MPU_DATA_INVALID = 0x73,
3838
INTEL_GUC_LOAD_STATUS_INIT_MMIO_SAVE_RESTORE_INVALID = 0x74,
39+
INTEL_GUC_LOAD_STATUS_KLV_WORKAROUND_INIT_ERROR = 0x75,
3940
INTEL_GUC_LOAD_STATUS_INVALID_INIT_DATA_RANGE_END,
4041

4142
INTEL_GUC_LOAD_STATUS_READY = 0xF0,

drivers/gpu/drm/i915/gt/uc/intel_guc.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,8 @@ struct intel_guc {
204204
struct guc_mmio_reg *ads_regset;
205205
/** @ads_golden_ctxt_size: size of the golden contexts in the ADS */
206206
u32 ads_golden_ctxt_size;
207+
/** @ads_waklv_size: size of workaround KLVs */
208+
u32 ads_waklv_size;
207209
/** @ads_capture_size: size of register lists in the ADS used for error capture */
208210
u32 ads_capture_size;
209211
/** @ads_engine_usage_size: size of engine usage in the ADS */

drivers/gpu/drm/i915/gt/uc/intel_guc_ads.c

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@
4646
* +---------------------------------------+
4747
* | padding |
4848
* +---------------------------------------+ <== 4K aligned
49+
* | w/a KLVs |
50+
* +---------------------------------------+
51+
* | padding |
52+
* +---------------------------------------+ <== 4K aligned
4953
* | capture lists |
5054
* +---------------------------------------+
5155
* | padding |
@@ -88,6 +92,11 @@ static u32 guc_ads_golden_ctxt_size(struct intel_guc *guc)
8892
return PAGE_ALIGN(guc->ads_golden_ctxt_size);
8993
}
9094

95+
static u32 guc_ads_waklv_size(struct intel_guc *guc)
96+
{
97+
return PAGE_ALIGN(guc->ads_waklv_size);
98+
}
99+
91100
static u32 guc_ads_capture_size(struct intel_guc *guc)
92101
{
93102
return PAGE_ALIGN(guc->ads_capture_size);
@@ -113,7 +122,7 @@ static u32 guc_ads_golden_ctxt_offset(struct intel_guc *guc)
113122
return PAGE_ALIGN(offset);
114123
}
115124

116-
static u32 guc_ads_capture_offset(struct intel_guc *guc)
125+
static u32 guc_ads_waklv_offset(struct intel_guc *guc)
117126
{
118127
u32 offset;
119128

@@ -123,6 +132,16 @@ static u32 guc_ads_capture_offset(struct intel_guc *guc)
123132
return PAGE_ALIGN(offset);
124133
}
125134

135+
static u32 guc_ads_capture_offset(struct intel_guc *guc)
136+
{
137+
u32 offset;
138+
139+
offset = guc_ads_waklv_offset(guc) +
140+
guc_ads_waklv_size(guc);
141+
142+
return PAGE_ALIGN(offset);
143+
}
144+
126145
static u32 guc_ads_private_data_offset(struct intel_guc *guc)
127146
{
128147
u32 offset;
@@ -796,6 +815,49 @@ guc_capture_prep_lists(struct intel_guc *guc)
796815
return PAGE_ALIGN(total_size);
797816
}
798817

818+
static void guc_waklv_init(struct intel_guc *guc)
819+
{
820+
struct intel_gt *gt = guc_to_gt(guc);
821+
u32 offset, addr_ggtt, remain, size;
822+
823+
if (!intel_uc_uses_guc_submission(&gt->uc))
824+
return;
825+
826+
if (GUC_FIRMWARE_VER(guc) < MAKE_GUC_VER(70, 10, 0))
827+
return;
828+
829+
GEM_BUG_ON(iosys_map_is_null(&guc->ads_map));
830+
offset = guc_ads_waklv_offset(guc);
831+
remain = guc_ads_waklv_size(guc);
832+
833+
/*
834+
* Add workarounds here:
835+
*
836+
* if (want_wa_<name>) {
837+
* size = guc_waklv_<name>(guc, offset, remain);
838+
* offset += size;
839+
* remain -= size;
840+
* }
841+
*/
842+
843+
size = guc_ads_waklv_size(guc) - remain;
844+
if (!size)
845+
return;
846+
847+
offset = guc_ads_waklv_offset(guc);
848+
addr_ggtt = intel_guc_ggtt_offset(guc, guc->ads_vma) + offset;
849+
850+
ads_blob_write(guc, ads.wa_klv_addr_lo, addr_ggtt);
851+
ads_blob_write(guc, ads.wa_klv_addr_hi, 0);
852+
ads_blob_write(guc, ads.wa_klv_size, size);
853+
}
854+
855+
static int guc_prep_waklv(struct intel_guc *guc)
856+
{
857+
/* Fudge something chunky for now: */
858+
return PAGE_SIZE;
859+
}
860+
799861
static void __guc_ads_init(struct intel_guc *guc)
800862
{
801863
struct intel_gt *gt = guc_to_gt(guc);
@@ -843,6 +905,9 @@ static void __guc_ads_init(struct intel_guc *guc)
843905
/* MMIO save/restore list */
844906
guc_mmio_reg_state_init(guc);
845907

908+
/* Workaround KLV list */
909+
guc_waklv_init(guc);
910+
846911
/* Private Data */
847912
ads_blob_write(guc, ads.private_data, base +
848913
guc_ads_private_data_offset(guc));
@@ -886,6 +951,12 @@ int intel_guc_ads_create(struct intel_guc *guc)
886951
return ret;
887952
guc->ads_capture_size = ret;
888953

954+
/* And don't forget the workaround KLVs: */
955+
ret = guc_prep_waklv(guc);
956+
if (ret < 0)
957+
return ret;
958+
guc->ads_waklv_size = ret;
959+
889960
/* Now the total size can be determined: */
890961
size = guc_ads_blob_size(guc);
891962

drivers/gpu/drm/i915/gt/uc/intel_guc_fw.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ static inline bool guc_load_done(struct intel_uncore *uncore, u32 *status, bool
115115
case INTEL_GUC_LOAD_STATUS_INIT_DATA_INVALID:
116116
case INTEL_GUC_LOAD_STATUS_MPU_DATA_INVALID:
117117
case INTEL_GUC_LOAD_STATUS_INIT_MMIO_SAVE_RESTORE_INVALID:
118+
case INTEL_GUC_LOAD_STATUS_KLV_WORKAROUND_INIT_ERROR:
118119
*success = false;
119120
return true;
120121
}
@@ -241,6 +242,11 @@ static int guc_wait_ucode(struct intel_guc *guc)
241242
ret = -EPERM;
242243
break;
243244

245+
case INTEL_GUC_LOAD_STATUS_KLV_WORKAROUND_INIT_ERROR:
246+
guc_info(guc, "invalid w/a KLV entry\n");
247+
ret = -EINVAL;
248+
break;
249+
244250
case INTEL_GUC_LOAD_STATUS_HWCONFIG_START:
245251
guc_info(guc, "still extracting hwconfig table.\n");
246252
ret = -ETIMEDOUT;

drivers/gpu/drm/i915/gt/uc/intel_guc_fwif.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,10 @@ struct guc_ads {
431431
u32 capture_instance[GUC_CAPTURE_LIST_INDEX_MAX][GUC_MAX_ENGINE_CLASSES];
432432
u32 capture_class[GUC_CAPTURE_LIST_INDEX_MAX][GUC_MAX_ENGINE_CLASSES];
433433
u32 capture_global[GUC_CAPTURE_LIST_INDEX_MAX];
434-
u32 reserved[14];
434+
u32 wa_klv_addr_lo;
435+
u32 wa_klv_addr_hi;
436+
u32 wa_klv_size;
437+
u32 reserved[11];
435438
} __packed;
436439

437440
/* Engine usage stats */

0 commit comments

Comments
 (0)