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: Evan Quan <evan.quan@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
b7cc5b421c
commit
0514dda30f
drivers/gpu/drm/amd/pm/swsmu/smu13
@ -96,6 +96,12 @@
|
||||
*/
|
||||
#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] = {
|
||||
MSG_MAP(TestMessage, PPSMC_MSG_TestMessage, 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,
|
||||
|
||||
static void smu_v13_0_0_get_od_setting_limits(struct smu_context *smu,
|
||||
int od_feature_bit,
|
||||
bool lower_boundary,
|
||||
int32_t *min,
|
||||
int32_t *max)
|
||||
{
|
||||
@ -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;
|
||||
|
||||
switch (od_feature_bit) {
|
||||
case PP_OD_FEATURE_GFXCLK_BIT:
|
||||
if (lower_boundary) {
|
||||
od_min_setting = overdrive_lowerlimits->GfxclkFmin;
|
||||
od_max_setting = overdrive_upperlimits->GfxclkFmin;
|
||||
} else {
|
||||
od_min_setting = overdrive_lowerlimits->GfxclkFmax;
|
||||
od_max_setting = overdrive_upperlimits->GfxclkFmax;
|
||||
}
|
||||
case PP_OD_FEATURE_GFXCLK_FMIN:
|
||||
od_min_setting = overdrive_lowerlimits->GfxclkFmin;
|
||||
od_max_setting = overdrive_upperlimits->GfxclkFmin;
|
||||
break;
|
||||
case PP_OD_FEATURE_UCLK_BIT:
|
||||
if (lower_boundary) {
|
||||
od_min_setting = overdrive_lowerlimits->UclkFmin;
|
||||
od_max_setting = overdrive_upperlimits->UclkFmin;
|
||||
} else {
|
||||
od_min_setting = overdrive_lowerlimits->UclkFmax;
|
||||
od_max_setting = overdrive_upperlimits->UclkFmax;
|
||||
}
|
||||
case PP_OD_FEATURE_GFXCLK_FMAX:
|
||||
od_min_setting = overdrive_lowerlimits->GfxclkFmax;
|
||||
od_max_setting = overdrive_upperlimits->GfxclkFmax;
|
||||
break;
|
||||
case PP_OD_FEATURE_GFX_VF_CURVE_BIT:
|
||||
case PP_OD_FEATURE_UCLK_FMIN:
|
||||
od_min_setting = overdrive_lowerlimits->UclkFmin;
|
||||
od_max_setting = overdrive_upperlimits->UclkFmin;
|
||||
break;
|
||||
case PP_OD_FEATURE_UCLK_FMAX:
|
||||
od_min_setting = overdrive_lowerlimits->UclkFmax;
|
||||
od_max_setting = overdrive_upperlimits->UclkFmax;
|
||||
break;
|
||||
case PP_OD_FEATURE_GFX_VF_CURVE:
|
||||
od_min_setting = overdrive_lowerlimits->VoltageOffsetPerZoneBoundary;
|
||||
od_max_setting = overdrive_upperlimits->VoltageOffsetPerZoneBoundary;
|
||||
break;
|
||||
default:
|
||||
od_min_setting = od_max_setting = INT_MAX;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -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)) {
|
||||
smu_v13_0_0_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_GFXCLK_BIT,
|
||||
true,
|
||||
PP_OD_FEATURE_GFXCLK_FMIN,
|
||||
&min_value,
|
||||
NULL);
|
||||
smu_v13_0_0_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_GFXCLK_BIT,
|
||||
false,
|
||||
PP_OD_FEATURE_GFXCLK_FMAX,
|
||||
NULL,
|
||||
&max_value);
|
||||
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,
|
||||
|
||||
if (smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT)) {
|
||||
smu_v13_0_0_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_UCLK_BIT,
|
||||
true,
|
||||
PP_OD_FEATURE_UCLK_FMIN,
|
||||
&min_value,
|
||||
NULL);
|
||||
smu_v13_0_0_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_UCLK_BIT,
|
||||
false,
|
||||
PP_OD_FEATURE_UCLK_FMAX,
|
||||
NULL,
|
||||
&max_value);
|
||||
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,
|
||||
|
||||
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,
|
||||
PP_OD_FEATURE_GFX_VF_CURVE_BIT,
|
||||
true,
|
||||
PP_OD_FEATURE_GFX_VF_CURVE,
|
||||
&min_value,
|
||||
&max_value);
|
||||
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,
|
||||
switch (input[i]) {
|
||||
case 0:
|
||||
smu_v13_0_0_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_GFXCLK_BIT,
|
||||
true,
|
||||
PP_OD_FEATURE_GFXCLK_FMIN,
|
||||
&minimum,
|
||||
&maximum);
|
||||
if (input[i + 1] < minimum ||
|
||||
@ -1411,8 +1409,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,
|
||||
|
||||
case 1:
|
||||
smu_v13_0_0_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_GFXCLK_BIT,
|
||||
false,
|
||||
PP_OD_FEATURE_GFXCLK_FMAX,
|
||||
&minimum,
|
||||
&maximum);
|
||||
if (input[i + 1] < minimum ||
|
||||
@ -1457,8 +1454,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,
|
||||
switch (input[i]) {
|
||||
case 0:
|
||||
smu_v13_0_0_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_UCLK_BIT,
|
||||
true,
|
||||
PP_OD_FEATURE_UCLK_FMIN,
|
||||
&minimum,
|
||||
&maximum);
|
||||
if (input[i + 1] < minimum ||
|
||||
@ -1474,8 +1470,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,
|
||||
|
||||
case 1:
|
||||
smu_v13_0_0_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_UCLK_BIT,
|
||||
false,
|
||||
PP_OD_FEATURE_UCLK_FMAX,
|
||||
&minimum,
|
||||
&maximum);
|
||||
if (input[i + 1] < minimum ||
|
||||
@ -1516,8 +1511,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,
|
||||
return -EINVAL;
|
||||
|
||||
smu_v13_0_0_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_GFX_VF_CURVE_BIT,
|
||||
true,
|
||||
PP_OD_FEATURE_GFX_VF_CURVE,
|
||||
&minimum,
|
||||
&maximum);
|
||||
if (input[1] < minimum ||
|
||||
|
@ -72,6 +72,12 @@
|
||||
|
||||
#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] = {
|
||||
MSG_MAP(TestMessage, PPSMC_MSG_TestMessage, 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,
|
||||
|
||||
static void smu_v13_0_7_get_od_setting_limits(struct smu_context *smu,
|
||||
int od_feature_bit,
|
||||
bool lower_boundary,
|
||||
int32_t *min,
|
||||
int32_t *max)
|
||||
{
|
||||
@ -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;
|
||||
|
||||
switch (od_feature_bit) {
|
||||
case PP_OD_FEATURE_GFXCLK_BIT:
|
||||
if (lower_boundary) {
|
||||
od_min_setting = overdrive_lowerlimits->GfxclkFmin;
|
||||
od_max_setting = overdrive_upperlimits->GfxclkFmin;
|
||||
} else {
|
||||
od_min_setting = overdrive_lowerlimits->GfxclkFmax;
|
||||
od_max_setting = overdrive_upperlimits->GfxclkFmax;
|
||||
}
|
||||
case PP_OD_FEATURE_GFXCLK_FMIN:
|
||||
od_min_setting = overdrive_lowerlimits->GfxclkFmin;
|
||||
od_max_setting = overdrive_upperlimits->GfxclkFmin;
|
||||
break;
|
||||
case PP_OD_FEATURE_UCLK_BIT:
|
||||
if (lower_boundary) {
|
||||
od_min_setting = overdrive_lowerlimits->UclkFmin;
|
||||
od_max_setting = overdrive_upperlimits->UclkFmin;
|
||||
} else {
|
||||
od_min_setting = overdrive_lowerlimits->UclkFmax;
|
||||
od_max_setting = overdrive_upperlimits->UclkFmax;
|
||||
}
|
||||
case PP_OD_FEATURE_GFXCLK_FMAX:
|
||||
od_min_setting = overdrive_lowerlimits->GfxclkFmax;
|
||||
od_max_setting = overdrive_upperlimits->GfxclkFmax;
|
||||
break;
|
||||
case PP_OD_FEATURE_GFX_VF_CURVE_BIT:
|
||||
case PP_OD_FEATURE_UCLK_FMIN:
|
||||
od_min_setting = overdrive_lowerlimits->UclkFmin;
|
||||
od_max_setting = overdrive_upperlimits->UclkFmin;
|
||||
break;
|
||||
case PP_OD_FEATURE_UCLK_FMAX:
|
||||
od_min_setting = overdrive_lowerlimits->UclkFmax;
|
||||
od_max_setting = overdrive_upperlimits->UclkFmax;
|
||||
break;
|
||||
case PP_OD_FEATURE_GFX_VF_CURVE:
|
||||
od_min_setting = overdrive_lowerlimits->VoltageOffsetPerZoneBoundary;
|
||||
od_max_setting = overdrive_upperlimits->VoltageOffsetPerZoneBoundary;
|
||||
break;
|
||||
default:
|
||||
od_min_setting = od_max_setting = INT_MAX;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -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)) {
|
||||
smu_v13_0_7_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_GFXCLK_BIT,
|
||||
true,
|
||||
PP_OD_FEATURE_GFXCLK_FMIN,
|
||||
&min_value,
|
||||
NULL);
|
||||
smu_v13_0_7_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_GFXCLK_BIT,
|
||||
false,
|
||||
PP_OD_FEATURE_GFXCLK_FMAX,
|
||||
NULL,
|
||||
&max_value);
|
||||
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,
|
||||
|
||||
if (smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT)) {
|
||||
smu_v13_0_7_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_UCLK_BIT,
|
||||
true,
|
||||
PP_OD_FEATURE_UCLK_FMIN,
|
||||
&min_value,
|
||||
NULL);
|
||||
smu_v13_0_7_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_UCLK_BIT,
|
||||
false,
|
||||
PP_OD_FEATURE_UCLK_FMAX,
|
||||
NULL,
|
||||
&max_value);
|
||||
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,
|
||||
|
||||
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,
|
||||
PP_OD_FEATURE_GFX_VF_CURVE_BIT,
|
||||
true,
|
||||
PP_OD_FEATURE_GFX_VF_CURVE,
|
||||
&min_value,
|
||||
&max_value);
|
||||
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,
|
||||
switch (input[i]) {
|
||||
case 0:
|
||||
smu_v13_0_7_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_GFXCLK_BIT,
|
||||
true,
|
||||
PP_OD_FEATURE_GFXCLK_FMIN,
|
||||
&minimum,
|
||||
&maximum);
|
||||
if (input[i + 1] < minimum ||
|
||||
@ -1392,8 +1390,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
|
||||
|
||||
case 1:
|
||||
smu_v13_0_7_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_GFXCLK_BIT,
|
||||
false,
|
||||
PP_OD_FEATURE_GFXCLK_FMAX,
|
||||
&minimum,
|
||||
&maximum);
|
||||
if (input[i + 1] < minimum ||
|
||||
@ -1438,8 +1435,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
|
||||
switch (input[i]) {
|
||||
case 0:
|
||||
smu_v13_0_7_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_UCLK_BIT,
|
||||
true,
|
||||
PP_OD_FEATURE_UCLK_FMIN,
|
||||
&minimum,
|
||||
&maximum);
|
||||
if (input[i + 1] < minimum ||
|
||||
@ -1455,8 +1451,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
|
||||
|
||||
case 1:
|
||||
smu_v13_0_7_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_UCLK_BIT,
|
||||
false,
|
||||
PP_OD_FEATURE_UCLK_FMAX,
|
||||
&minimum,
|
||||
&maximum);
|
||||
if (input[i + 1] < minimum ||
|
||||
@ -1497,8 +1492,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
|
||||
return -EINVAL;
|
||||
|
||||
smu_v13_0_7_get_od_setting_limits(smu,
|
||||
PP_OD_FEATURE_GFX_VF_CURVE_BIT,
|
||||
true,
|
||||
PP_OD_FEATURE_GFX_VF_CURVE,
|
||||
&minimum,
|
||||
&maximum);
|
||||
if (input[1] < minimum ||
|
||||
|
Loading…
x
Reference in New Issue
Block a user