drm/amd/pm: add od table upload error message parsing for smu v14.0.x

parse and print detailed reasons for od table upload failures to
help users understand error causes.

example:
$ echo "0 30 40" | sudo tee fan_curve
$ echo "1 40 30" | sudo tee fan_curve
$ echo "c" | sudo tee fan_curve

kernel log:
[   75.040174] amdgpu 0000:0a:00.0: Failed to upload overdrive table, ret:-5
[   75.040178] amdgpu 0000:0a:00.0: Invalid overdrive table content: OD_FAN_CURVE_PWM_ERROR (13)
[   75.040181] amdgpu 0000:0a:00.0: Failed to upload overdrive table!

Signed-off-by: Yang Wang <kevinyang.wang@amd.com>
Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Yang Wang 2026-04-02 23:52:46 -04:00 committed by Alex Deucher
parent 79d47bc4c7
commit 4f2c86c62a

View File

@ -2214,17 +2214,61 @@ static void smu_v14_0_2_dump_od_table(struct smu_context *smu,
od_table->OverDriveTable.UclkFmax);
}
#define OD_ERROR_MSG_MAP(msg) \
[msg] = #msg
static const char *od_error_message[] = {
OD_ERROR_MSG_MAP(OD_REQUEST_ADVANCED_NOT_SUPPORTED),
OD_ERROR_MSG_MAP(OD_UNSUPPORTED_FEATURE),
OD_ERROR_MSG_MAP(OD_INVALID_FEATURE_COMBO_ERROR),
OD_ERROR_MSG_MAP(OD_GFXCLK_VF_CURVE_OFFSET_ERROR),
OD_ERROR_MSG_MAP(OD_VDD_GFX_VMAX_ERROR),
OD_ERROR_MSG_MAP(OD_VDD_SOC_VMAX_ERROR),
OD_ERROR_MSG_MAP(OD_PPT_ERROR),
OD_ERROR_MSG_MAP(OD_FAN_MIN_PWM_ERROR),
OD_ERROR_MSG_MAP(OD_FAN_ACOUSTIC_TARGET_ERROR),
OD_ERROR_MSG_MAP(OD_FAN_ACOUSTIC_LIMIT_ERROR),
OD_ERROR_MSG_MAP(OD_FAN_TARGET_TEMP_ERROR),
OD_ERROR_MSG_MAP(OD_FAN_ZERO_RPM_STOP_TEMP_ERROR),
OD_ERROR_MSG_MAP(OD_FAN_CURVE_PWM_ERROR),
OD_ERROR_MSG_MAP(OD_FAN_CURVE_TEMP_ERROR),
OD_ERROR_MSG_MAP(OD_FULL_CTRL_GFXCLK_ERROR),
OD_ERROR_MSG_MAP(OD_FULL_CTRL_UCLK_ERROR),
OD_ERROR_MSG_MAP(OD_FULL_CTRL_FCLK_ERROR),
OD_ERROR_MSG_MAP(OD_FULL_CTRL_VDD_GFX_ERROR),
OD_ERROR_MSG_MAP(OD_FULL_CTRL_VDD_SOC_ERROR),
OD_ERROR_MSG_MAP(OD_TDC_ERROR),
OD_ERROR_MSG_MAP(OD_GFXCLK_ERROR),
OD_ERROR_MSG_MAP(OD_UCLK_ERROR),
OD_ERROR_MSG_MAP(OD_FCLK_ERROR),
OD_ERROR_MSG_MAP(OD_OP_TEMP_ERROR),
OD_ERROR_MSG_MAP(OD_OP_GFX_EDC_ERROR),
OD_ERROR_MSG_MAP(OD_OP_GFX_PCC_ERROR),
OD_ERROR_MSG_MAP(OD_POWER_FEATURE_CTRL_ERROR),
};
static int smu_v14_0_2_upload_overdrive_table(struct smu_context *smu,
OverDriveTableExternal_t *od_table)
{
int ret;
ret = smu_cmn_update_table(smu,
SMU_TABLE_OVERDRIVE,
0,
(void *)od_table,
true);
if (ret)
dev_err(smu->adev->dev, "Failed to upload overdrive table!\n");
uint32_t read_arg = 0;
int ret, od_error_type;
ret = smu_cmn_update_table_read_arg(smu,
SMU_TABLE_OVERDRIVE,
0,
(void *)od_table,
&read_arg,
true);
if (ret) {
dev_err(smu->adev->dev, "Failed to upload overdrive table, ret:%d\n", ret);
if ((read_arg & 0xff) == TABLE_TRANSFER_FAILED) {
od_error_type = read_arg >> 16;
dev_err(smu->adev->dev, "Invalid overdrive table content: %s (%d)\n",
od_error_type < ARRAY_SIZE(od_error_message) ?
od_error_message[od_error_type] : "unknown",
od_error_type);
}
}
return ret;
}