mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
drm/xe/guc: Extract function to print load error
Move the error parsing and print out of guc_wait_ucode() into a helper to clean up the wait function. Since now the `load_done != 1` condition has a return statement, also simplify the if/else chain. Reviewed-by: John Harrison <John.C.Harrison@Intel.com> # v2 Link: https://lore.kernel.org/r/20250922-xe-iopoll-v4-4-06438311a63f@intel.com Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
This commit is contained in:
@@ -1047,6 +1047,54 @@ static int guc_load_done(u32 status)
|
|||||||
#endif
|
#endif
|
||||||
#define GUC_LOAD_TIME_WARN_MS 200
|
#define GUC_LOAD_TIME_WARN_MS 200
|
||||||
|
|
||||||
|
static void print_load_status_err(struct xe_gt *gt, u32 status)
|
||||||
|
{
|
||||||
|
struct xe_mmio *mmio = >->mmio;
|
||||||
|
u32 ukernel = REG_FIELD_GET(GS_UKERNEL_MASK, status);
|
||||||
|
u32 bootrom = REG_FIELD_GET(GS_BOOTROM_MASK, status);
|
||||||
|
|
||||||
|
xe_gt_err(gt, "load failed: status: Reset = %d, BootROM = 0x%02X, UKernel = 0x%02X, MIA = 0x%02X, Auth = 0x%02X\n",
|
||||||
|
REG_FIELD_GET(GS_MIA_IN_RESET, status),
|
||||||
|
bootrom, ukernel,
|
||||||
|
REG_FIELD_GET(GS_MIA_MASK, status),
|
||||||
|
REG_FIELD_GET(GS_AUTH_STATUS_MASK, status));
|
||||||
|
|
||||||
|
switch (bootrom) {
|
||||||
|
case XE_BOOTROM_STATUS_NO_KEY_FOUND:
|
||||||
|
xe_gt_err(gt, "invalid key requested, header = 0x%08X\n",
|
||||||
|
xe_mmio_read32(mmio, GUC_HEADER_INFO));
|
||||||
|
break;
|
||||||
|
case XE_BOOTROM_STATUS_RSA_FAILED:
|
||||||
|
xe_gt_err(gt, "firmware signature verification failed\n");
|
||||||
|
break;
|
||||||
|
case XE_BOOTROM_STATUS_PROD_KEY_CHECK_FAILURE:
|
||||||
|
xe_gt_err(gt, "firmware production part check failure\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (ukernel) {
|
||||||
|
case XE_GUC_LOAD_STATUS_HWCONFIG_START:
|
||||||
|
xe_gt_err(gt, "still extracting hwconfig table.\n");
|
||||||
|
break;
|
||||||
|
case XE_GUC_LOAD_STATUS_EXCEPTION:
|
||||||
|
xe_gt_err(gt, "firmware exception. EIP: %#x\n",
|
||||||
|
xe_mmio_read32(mmio, SOFT_SCRATCH(13)));
|
||||||
|
break;
|
||||||
|
case XE_GUC_LOAD_STATUS_INIT_DATA_INVALID:
|
||||||
|
xe_gt_err(gt, "illegal init/ADS data\n");
|
||||||
|
break;
|
||||||
|
case XE_GUC_LOAD_STATUS_INIT_MMIO_SAVE_RESTORE_INVALID:
|
||||||
|
xe_gt_err(gt, "illegal register in save/restore workaround list\n");
|
||||||
|
break;
|
||||||
|
case XE_GUC_LOAD_STATUS_KLV_WORKAROUND_INIT_ERROR:
|
||||||
|
xe_gt_err(gt, "illegal workaround KLV data\n");
|
||||||
|
break;
|
||||||
|
case XE_GUC_LOAD_STATUS_INVALID_FTR_FLAG:
|
||||||
|
xe_gt_err(gt, "illegal feature flag specified\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int guc_wait_ucode(struct xe_guc *guc)
|
static int guc_wait_ucode(struct xe_guc *guc)
|
||||||
{
|
{
|
||||||
struct xe_gt *gt = guc_to_gt(guc);
|
struct xe_gt *gt = guc_to_gt(guc);
|
||||||
@@ -1100,62 +1148,15 @@ static int guc_wait_ucode(struct xe_guc *guc)
|
|||||||
} while (1);
|
} while (1);
|
||||||
|
|
||||||
if (load_done != 1) {
|
if (load_done != 1) {
|
||||||
u32 ukernel = REG_FIELD_GET(GS_UKERNEL_MASK, status);
|
|
||||||
u32 bootrom = REG_FIELD_GET(GS_BOOTROM_MASK, status);
|
|
||||||
|
|
||||||
xe_gt_err(gt, "load failed: status = 0x%08X, time = %lldms, freq = %dMHz (req %dMHz), done = %d\n",
|
xe_gt_err(gt, "load failed: status = 0x%08X, time = %lldms, freq = %dMHz (req %dMHz), done = %d\n",
|
||||||
status, delta_ms, xe_guc_pc_get_act_freq(guc_pc),
|
status, delta_ms, xe_guc_pc_get_act_freq(guc_pc),
|
||||||
xe_guc_pc_get_cur_freq_fw(guc_pc), load_done);
|
xe_guc_pc_get_cur_freq_fw(guc_pc), load_done);
|
||||||
xe_gt_err(gt, "load failed: status: Reset = %d, BootROM = 0x%02X, UKernel = 0x%02X, MIA = 0x%02X, Auth = 0x%02X\n",
|
print_load_status_err(gt, status);
|
||||||
REG_FIELD_GET(GS_MIA_IN_RESET, status),
|
|
||||||
bootrom, ukernel,
|
|
||||||
REG_FIELD_GET(GS_MIA_MASK, status),
|
|
||||||
REG_FIELD_GET(GS_AUTH_STATUS_MASK, status));
|
|
||||||
|
|
||||||
switch (bootrom) {
|
|
||||||
case XE_BOOTROM_STATUS_NO_KEY_FOUND:
|
|
||||||
xe_gt_err(gt, "invalid key requested, header = 0x%08X\n",
|
|
||||||
xe_mmio_read32(mmio, GUC_HEADER_INFO));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case XE_BOOTROM_STATUS_RSA_FAILED:
|
|
||||||
xe_gt_err(gt, "firmware signature verification failed\n");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case XE_BOOTROM_STATUS_PROD_KEY_CHECK_FAILURE:
|
|
||||||
xe_gt_err(gt, "firmware production part check failure\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (ukernel) {
|
|
||||||
case XE_GUC_LOAD_STATUS_HWCONFIG_START:
|
|
||||||
xe_gt_err(gt, "still extracting hwconfig table.\n");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case XE_GUC_LOAD_STATUS_EXCEPTION:
|
|
||||||
xe_gt_err(gt, "firmware exception. EIP: %#x\n",
|
|
||||||
xe_mmio_read32(mmio, SOFT_SCRATCH(13)));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case XE_GUC_LOAD_STATUS_INIT_DATA_INVALID:
|
|
||||||
xe_gt_err(gt, "illegal init/ADS data\n");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case XE_GUC_LOAD_STATUS_INIT_MMIO_SAVE_RESTORE_INVALID:
|
|
||||||
xe_gt_err(gt, "illegal register in save/restore workaround list\n");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case XE_GUC_LOAD_STATUS_KLV_WORKAROUND_INIT_ERROR:
|
|
||||||
xe_gt_err(gt, "illegal workaround KLV data\n");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case XE_GUC_LOAD_STATUS_INVALID_FTR_FLAG:
|
|
||||||
xe_gt_err(gt, "illegal feature flag specified\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -EPROTO;
|
return -EPROTO;
|
||||||
} else if (delta_ms > GUC_LOAD_TIME_WARN_MS) {
|
}
|
||||||
|
|
||||||
|
if (delta_ms > GUC_LOAD_TIME_WARN_MS) {
|
||||||
xe_gt_warn(gt, "excessive init time: %lldms! [status = 0x%08X, timeouts = %d]\n",
|
xe_gt_warn(gt, "excessive init time: %lldms! [status = 0x%08X, timeouts = %d]\n",
|
||||||
delta_ms, status, count);
|
delta_ms, status, count);
|
||||||
xe_gt_warn(gt, "excessive init time: [freq = %dMHz (req = %dMHz), before = %dMHz, perf_limit_reasons = 0x%08X]\n",
|
xe_gt_warn(gt, "excessive init time: [freq = %dMHz (req = %dMHz), before = %dMHz, perf_limit_reasons = 0x%08X]\n",
|
||||||
|
|||||||
Reference in New Issue
Block a user