Commit 0514dda3 authored by Evan Quan's avatar Evan Quan Committed by Alex Deucher

drm/amd/pm: correct the logics for retreiving SMU13 OD setting limits

To better meet the growing demainds for more OD features.
Signed-off-by: default avatarEvan Quan <evan.quan@amd.com>
Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent b7cc5b42
...@@ -96,6 +96,12 @@ ...@@ -96,6 +96,12 @@
*/ */
#define SUPPORT_ECCTABLE_SMU_13_0_10_VERSION 0x00502200 #define SUPPORT_ECCTABLE_SMU_13_0_10_VERSION 0x00502200
#define PP_OD_FEATURE_GFXCLK_FMIN 0
#define PP_OD_FEATURE_GFXCLK_FMAX 1
#define PP_OD_FEATURE_UCLK_FMIN 2
#define PP_OD_FEATURE_UCLK_FMAX 3
#define PP_OD_FEATURE_GFX_VF_CURVE 4
static struct cmn2asic_msg_mapping smu_v13_0_0_message_map[SMU_MSG_MAX_COUNT] = { static struct cmn2asic_msg_mapping smu_v13_0_0_message_map[SMU_MSG_MAX_COUNT] = {
MSG_MAP(TestMessage, PPSMC_MSG_TestMessage, 1), MSG_MAP(TestMessage, PPSMC_MSG_TestMessage, 1),
MSG_MAP(GetSmuVersion, PPSMC_MSG_GetSmuVersion, 1), MSG_MAP(GetSmuVersion, PPSMC_MSG_GetSmuVersion, 1),
...@@ -1058,7 +1064,6 @@ static bool smu_v13_0_0_is_od_feature_supported(struct smu_context *smu, ...@@ -1058,7 +1064,6 @@ static bool smu_v13_0_0_is_od_feature_supported(struct smu_context *smu,
static void smu_v13_0_0_get_od_setting_limits(struct smu_context *smu, static void smu_v13_0_0_get_od_setting_limits(struct smu_context *smu,
int od_feature_bit, int od_feature_bit,
bool lower_boundary,
int32_t *min, int32_t *min,
int32_t *max) int32_t *max)
{ {
...@@ -1070,29 +1075,28 @@ static void smu_v13_0_0_get_od_setting_limits(struct smu_context *smu, ...@@ -1070,29 +1075,28 @@ static void smu_v13_0_0_get_od_setting_limits(struct smu_context *smu,
int32_t od_min_setting, od_max_setting; int32_t od_min_setting, od_max_setting;
switch (od_feature_bit) { switch (od_feature_bit) {
case PP_OD_FEATURE_GFXCLK_BIT: case PP_OD_FEATURE_GFXCLK_FMIN:
if (lower_boundary) {
od_min_setting = overdrive_lowerlimits->GfxclkFmin; od_min_setting = overdrive_lowerlimits->GfxclkFmin;
od_max_setting = overdrive_upperlimits->GfxclkFmin; od_max_setting = overdrive_upperlimits->GfxclkFmin;
} else { break;
case PP_OD_FEATURE_GFXCLK_FMAX:
od_min_setting = overdrive_lowerlimits->GfxclkFmax; od_min_setting = overdrive_lowerlimits->GfxclkFmax;
od_max_setting = overdrive_upperlimits->GfxclkFmax; od_max_setting = overdrive_upperlimits->GfxclkFmax;
}
break; break;
case PP_OD_FEATURE_UCLK_BIT: case PP_OD_FEATURE_UCLK_FMIN:
if (lower_boundary) {
od_min_setting = overdrive_lowerlimits->UclkFmin; od_min_setting = overdrive_lowerlimits->UclkFmin;
od_max_setting = overdrive_upperlimits->UclkFmin; od_max_setting = overdrive_upperlimits->UclkFmin;
} else { break;
case PP_OD_FEATURE_UCLK_FMAX:
od_min_setting = overdrive_lowerlimits->UclkFmax; od_min_setting = overdrive_lowerlimits->UclkFmax;
od_max_setting = overdrive_upperlimits->UclkFmax; od_max_setting = overdrive_upperlimits->UclkFmax;
}
break; break;
case PP_OD_FEATURE_GFX_VF_CURVE_BIT: case PP_OD_FEATURE_GFX_VF_CURVE:
od_min_setting = overdrive_lowerlimits->VoltageOffsetPerZoneBoundary; od_min_setting = overdrive_lowerlimits->VoltageOffsetPerZoneBoundary;
od_max_setting = overdrive_upperlimits->VoltageOffsetPerZoneBoundary; od_max_setting = overdrive_upperlimits->VoltageOffsetPerZoneBoundary;
break; break;
default: default:
od_min_setting = od_max_setting = INT_MAX;
break; break;
} }
...@@ -1318,13 +1322,11 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu, ...@@ -1318,13 +1322,11 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu,
if (smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT)) { if (smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT)) {
smu_v13_0_0_get_od_setting_limits(smu, smu_v13_0_0_get_od_setting_limits(smu,
PP_OD_FEATURE_GFXCLK_BIT, PP_OD_FEATURE_GFXCLK_FMIN,
true,
&min_value, &min_value,
NULL); NULL);
smu_v13_0_0_get_od_setting_limits(smu, smu_v13_0_0_get_od_setting_limits(smu,
PP_OD_FEATURE_GFXCLK_BIT, PP_OD_FEATURE_GFXCLK_FMAX,
false,
NULL, NULL,
&max_value); &max_value);
size += sysfs_emit_at(buf, size, "SCLK: %7uMhz %10uMhz\n", size += sysfs_emit_at(buf, size, "SCLK: %7uMhz %10uMhz\n",
...@@ -1333,13 +1335,11 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu, ...@@ -1333,13 +1335,11 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu,
if (smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT)) { if (smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT)) {
smu_v13_0_0_get_od_setting_limits(smu, smu_v13_0_0_get_od_setting_limits(smu,
PP_OD_FEATURE_UCLK_BIT, PP_OD_FEATURE_UCLK_FMIN,
true,
&min_value, &min_value,
NULL); NULL);
smu_v13_0_0_get_od_setting_limits(smu, smu_v13_0_0_get_od_setting_limits(smu,
PP_OD_FEATURE_UCLK_BIT, PP_OD_FEATURE_UCLK_FMAX,
false,
NULL, NULL,
&max_value); &max_value);
size += sysfs_emit_at(buf, size, "MCLK: %7uMhz %10uMhz\n", size += sysfs_emit_at(buf, size, "MCLK: %7uMhz %10uMhz\n",
...@@ -1348,8 +1348,7 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu, ...@@ -1348,8 +1348,7 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu,
if (smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_GFX_VF_CURVE_BIT)) { if (smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_GFX_VF_CURVE_BIT)) {
smu_v13_0_0_get_od_setting_limits(smu, smu_v13_0_0_get_od_setting_limits(smu,
PP_OD_FEATURE_GFX_VF_CURVE_BIT, PP_OD_FEATURE_GFX_VF_CURVE,
true,
&min_value, &min_value,
&max_value); &max_value);
size += sysfs_emit_at(buf, size, "VDDC_CURVE: %7dmv %10dmv\n", size += sysfs_emit_at(buf, size, "VDDC_CURVE: %7dmv %10dmv\n",
...@@ -1394,8 +1393,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu, ...@@ -1394,8 +1393,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,
switch (input[i]) { switch (input[i]) {
case 0: case 0:
smu_v13_0_0_get_od_setting_limits(smu, smu_v13_0_0_get_od_setting_limits(smu,
PP_OD_FEATURE_GFXCLK_BIT, PP_OD_FEATURE_GFXCLK_FMIN,
true,
&minimum, &minimum,
&maximum); &maximum);
if (input[i + 1] < minimum || if (input[i + 1] < minimum ||
...@@ -1411,8 +1409,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu, ...@@ -1411,8 +1409,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,
case 1: case 1:
smu_v13_0_0_get_od_setting_limits(smu, smu_v13_0_0_get_od_setting_limits(smu,
PP_OD_FEATURE_GFXCLK_BIT, PP_OD_FEATURE_GFXCLK_FMAX,
false,
&minimum, &minimum,
&maximum); &maximum);
if (input[i + 1] < minimum || if (input[i + 1] < minimum ||
...@@ -1457,8 +1454,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu, ...@@ -1457,8 +1454,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,
switch (input[i]) { switch (input[i]) {
case 0: case 0:
smu_v13_0_0_get_od_setting_limits(smu, smu_v13_0_0_get_od_setting_limits(smu,
PP_OD_FEATURE_UCLK_BIT, PP_OD_FEATURE_UCLK_FMIN,
true,
&minimum, &minimum,
&maximum); &maximum);
if (input[i + 1] < minimum || if (input[i + 1] < minimum ||
...@@ -1474,8 +1470,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu, ...@@ -1474,8 +1470,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,
case 1: case 1:
smu_v13_0_0_get_od_setting_limits(smu, smu_v13_0_0_get_od_setting_limits(smu,
PP_OD_FEATURE_UCLK_BIT, PP_OD_FEATURE_UCLK_FMAX,
false,
&minimum, &minimum,
&maximum); &maximum);
if (input[i + 1] < minimum || if (input[i + 1] < minimum ||
...@@ -1516,8 +1511,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu, ...@@ -1516,8 +1511,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,
return -EINVAL; return -EINVAL;
smu_v13_0_0_get_od_setting_limits(smu, smu_v13_0_0_get_od_setting_limits(smu,
PP_OD_FEATURE_GFX_VF_CURVE_BIT, PP_OD_FEATURE_GFX_VF_CURVE,
true,
&minimum, &minimum,
&maximum); &maximum);
if (input[1] < minimum || if (input[1] < minimum ||
......
...@@ -72,6 +72,12 @@ ...@@ -72,6 +72,12 @@
#define MP0_MP1_DATA_REGION_SIZE_COMBOPPTABLE 0x4000 #define MP0_MP1_DATA_REGION_SIZE_COMBOPPTABLE 0x4000
#define PP_OD_FEATURE_GFXCLK_FMIN 0
#define PP_OD_FEATURE_GFXCLK_FMAX 1
#define PP_OD_FEATURE_UCLK_FMIN 2
#define PP_OD_FEATURE_UCLK_FMAX 3
#define PP_OD_FEATURE_GFX_VF_CURVE 4
static struct cmn2asic_msg_mapping smu_v13_0_7_message_map[SMU_MSG_MAX_COUNT] = { static struct cmn2asic_msg_mapping smu_v13_0_7_message_map[SMU_MSG_MAX_COUNT] = {
MSG_MAP(TestMessage, PPSMC_MSG_TestMessage, 1), MSG_MAP(TestMessage, PPSMC_MSG_TestMessage, 1),
MSG_MAP(GetSmuVersion, PPSMC_MSG_GetSmuVersion, 1), MSG_MAP(GetSmuVersion, PPSMC_MSG_GetSmuVersion, 1),
...@@ -1039,7 +1045,6 @@ static bool smu_v13_0_7_is_od_feature_supported(struct smu_context *smu, ...@@ -1039,7 +1045,6 @@ static bool smu_v13_0_7_is_od_feature_supported(struct smu_context *smu,
static void smu_v13_0_7_get_od_setting_limits(struct smu_context *smu, static void smu_v13_0_7_get_od_setting_limits(struct smu_context *smu,
int od_feature_bit, int od_feature_bit,
bool lower_boundary,
int32_t *min, int32_t *min,
int32_t *max) int32_t *max)
{ {
...@@ -1051,29 +1056,28 @@ static void smu_v13_0_7_get_od_setting_limits(struct smu_context *smu, ...@@ -1051,29 +1056,28 @@ static void smu_v13_0_7_get_od_setting_limits(struct smu_context *smu,
int32_t od_min_setting, od_max_setting; int32_t od_min_setting, od_max_setting;
switch (od_feature_bit) { switch (od_feature_bit) {
case PP_OD_FEATURE_GFXCLK_BIT: case PP_OD_FEATURE_GFXCLK_FMIN:
if (lower_boundary) {
od_min_setting = overdrive_lowerlimits->GfxclkFmin; od_min_setting = overdrive_lowerlimits->GfxclkFmin;
od_max_setting = overdrive_upperlimits->GfxclkFmin; od_max_setting = overdrive_upperlimits->GfxclkFmin;
} else { break;
case PP_OD_FEATURE_GFXCLK_FMAX:
od_min_setting = overdrive_lowerlimits->GfxclkFmax; od_min_setting = overdrive_lowerlimits->GfxclkFmax;
od_max_setting = overdrive_upperlimits->GfxclkFmax; od_max_setting = overdrive_upperlimits->GfxclkFmax;
}
break; break;
case PP_OD_FEATURE_UCLK_BIT: case PP_OD_FEATURE_UCLK_FMIN:
if (lower_boundary) {
od_min_setting = overdrive_lowerlimits->UclkFmin; od_min_setting = overdrive_lowerlimits->UclkFmin;
od_max_setting = overdrive_upperlimits->UclkFmin; od_max_setting = overdrive_upperlimits->UclkFmin;
} else { break;
case PP_OD_FEATURE_UCLK_FMAX:
od_min_setting = overdrive_lowerlimits->UclkFmax; od_min_setting = overdrive_lowerlimits->UclkFmax;
od_max_setting = overdrive_upperlimits->UclkFmax; od_max_setting = overdrive_upperlimits->UclkFmax;
}
break; break;
case PP_OD_FEATURE_GFX_VF_CURVE_BIT: case PP_OD_FEATURE_GFX_VF_CURVE:
od_min_setting = overdrive_lowerlimits->VoltageOffsetPerZoneBoundary; od_min_setting = overdrive_lowerlimits->VoltageOffsetPerZoneBoundary;
od_max_setting = overdrive_upperlimits->VoltageOffsetPerZoneBoundary; od_max_setting = overdrive_upperlimits->VoltageOffsetPerZoneBoundary;
break; break;
default: default:
od_min_setting = od_max_setting = INT_MAX;
break; break;
} }
...@@ -1299,13 +1303,11 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu, ...@@ -1299,13 +1303,11 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,
if (smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT)) { if (smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT)) {
smu_v13_0_7_get_od_setting_limits(smu, smu_v13_0_7_get_od_setting_limits(smu,
PP_OD_FEATURE_GFXCLK_BIT, PP_OD_FEATURE_GFXCLK_FMIN,
true,
&min_value, &min_value,
NULL); NULL);
smu_v13_0_7_get_od_setting_limits(smu, smu_v13_0_7_get_od_setting_limits(smu,
PP_OD_FEATURE_GFXCLK_BIT, PP_OD_FEATURE_GFXCLK_FMAX,
false,
NULL, NULL,
&max_value); &max_value);
size += sysfs_emit_at(buf, size, "SCLK: %7uMhz %10uMhz\n", size += sysfs_emit_at(buf, size, "SCLK: %7uMhz %10uMhz\n",
...@@ -1314,13 +1316,11 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu, ...@@ -1314,13 +1316,11 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,
if (smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT)) { if (smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT)) {
smu_v13_0_7_get_od_setting_limits(smu, smu_v13_0_7_get_od_setting_limits(smu,
PP_OD_FEATURE_UCLK_BIT, PP_OD_FEATURE_UCLK_FMIN,
true,
&min_value, &min_value,
NULL); NULL);
smu_v13_0_7_get_od_setting_limits(smu, smu_v13_0_7_get_od_setting_limits(smu,
PP_OD_FEATURE_UCLK_BIT, PP_OD_FEATURE_UCLK_FMAX,
false,
NULL, NULL,
&max_value); &max_value);
size += sysfs_emit_at(buf, size, "MCLK: %7uMhz %10uMhz\n", size += sysfs_emit_at(buf, size, "MCLK: %7uMhz %10uMhz\n",
...@@ -1329,8 +1329,7 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu, ...@@ -1329,8 +1329,7 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,
if (smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_GFX_VF_CURVE_BIT)) { if (smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_GFX_VF_CURVE_BIT)) {
smu_v13_0_7_get_od_setting_limits(smu, smu_v13_0_7_get_od_setting_limits(smu,
PP_OD_FEATURE_GFX_VF_CURVE_BIT, PP_OD_FEATURE_GFX_VF_CURVE,
true,
&min_value, &min_value,
&max_value); &max_value);
size += sysfs_emit_at(buf, size, "VDDC_CURVE: %7dmv %10dmv\n", size += sysfs_emit_at(buf, size, "VDDC_CURVE: %7dmv %10dmv\n",
...@@ -1375,8 +1374,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu, ...@@ -1375,8 +1374,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
switch (input[i]) { switch (input[i]) {
case 0: case 0:
smu_v13_0_7_get_od_setting_limits(smu, smu_v13_0_7_get_od_setting_limits(smu,
PP_OD_FEATURE_GFXCLK_BIT, PP_OD_FEATURE_GFXCLK_FMIN,
true,
&minimum, &minimum,
&maximum); &maximum);
if (input[i + 1] < minimum || if (input[i + 1] < minimum ||
...@@ -1392,8 +1390,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu, ...@@ -1392,8 +1390,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
case 1: case 1:
smu_v13_0_7_get_od_setting_limits(smu, smu_v13_0_7_get_od_setting_limits(smu,
PP_OD_FEATURE_GFXCLK_BIT, PP_OD_FEATURE_GFXCLK_FMAX,
false,
&minimum, &minimum,
&maximum); &maximum);
if (input[i + 1] < minimum || if (input[i + 1] < minimum ||
...@@ -1438,8 +1435,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu, ...@@ -1438,8 +1435,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
switch (input[i]) { switch (input[i]) {
case 0: case 0:
smu_v13_0_7_get_od_setting_limits(smu, smu_v13_0_7_get_od_setting_limits(smu,
PP_OD_FEATURE_UCLK_BIT, PP_OD_FEATURE_UCLK_FMIN,
true,
&minimum, &minimum,
&maximum); &maximum);
if (input[i + 1] < minimum || if (input[i + 1] < minimum ||
...@@ -1455,8 +1451,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu, ...@@ -1455,8 +1451,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
case 1: case 1:
smu_v13_0_7_get_od_setting_limits(smu, smu_v13_0_7_get_od_setting_limits(smu,
PP_OD_FEATURE_UCLK_BIT, PP_OD_FEATURE_UCLK_FMAX,
false,
&minimum, &minimum,
&maximum); &maximum);
if (input[i + 1] < minimum || if (input[i + 1] < minimum ||
...@@ -1497,8 +1492,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu, ...@@ -1497,8 +1492,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
return -EINVAL; return -EINVAL;
smu_v13_0_7_get_od_setting_limits(smu, smu_v13_0_7_get_od_setting_limits(smu,
PP_OD_FEATURE_GFX_VF_CURVE_BIT, PP_OD_FEATURE_GFX_VF_CURVE,
true,
&minimum, &minimum,
&maximum); &maximum);
if (input[1] < minimum || if (input[1] < minimum ||
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment