drm/amd/pm: correct the logics for retreiving SMU13 OD setting limits
authorEvan Quan <evan.quan@amd.com>
Thu, 10 Aug 2023 07:53:15 +0000 (15:53 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 15 Aug 2023 22:07:42 +0000 (18:07 -0400)
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>
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c

index a5857ac..48b0352 100644 (file)
  */
 #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_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_BIT:
+       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 ||
index 93b3e8f..690f89f 100644 (file)
 
 #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_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_BIT:
+       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 ||