Use helper function to print navi10 dpm tables to sysfs.

Signed-off-by: Lijo Lazar <[email protected]>
---
 .../drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c  | 222 ++----------------
 1 file changed, 22 insertions(+), 200 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
index adf973ea2809..57ce7a38bba8 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
@@ -83,9 +83,6 @@ MODULE_FIRMWARE("amdgpu/smu_13_0_14.bin");
         FEATURE_MASK(FEATURE_DPM_LCLK) | FEATURE_MASK(FEATURE_DPM_XGMI) |     \
         FEATURE_MASK(FEATURE_DPM_VCN))
 
-/* possible frequency drift (1Mhz) */
-#define EPSILON 1
-
 #define smnPCIE_ESM_CTRL 0x93D0
 #define smnPCIE_LC_LINK_WIDTH_CNTL 0x1a340288
 #define PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_RD_MASK 0x00000070L
@@ -95,9 +92,7 @@ MODULE_FIRMWARE("amdgpu/smu_13_0_14.bin");
 #define smnPCIE_LC_SPEED_CNTL                   0x1a340290
 #define PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK 0xE0
 #define PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT 0x5
-#define LINK_SPEED_MAX                         4
-#define SMU_13_0_6_DSCLK_THRESHOLD 140
-
+#define LINK_SPEED_MAX 4
 #define MCA_BANK_IPID(_ip, _hwid, _type) \
        [AMDGPU_MCA_IP_##_ip] = { .hwid = _hwid, .mcatype = _type, }
 
@@ -1238,32 +1233,6 @@ static int smu_v13_0_6_populate_umd_state_clk(struct 
smu_context *smu)
        return 0;
 }
 
-static int
-smu_v13_0_6_get_clk_table(struct smu_context *smu,
-                         struct pp_clock_levels_with_latency *clocks,
-                         struct smu_dpm_table *dpm_table)
-{
-       int i, count;
-
-       count = (dpm_table->count > MAX_NUM_CLOCKS) ? MAX_NUM_CLOCKS :
-                                                     dpm_table->count;
-       clocks->num_levels = count;
-
-       for (i = 0; i < count; i++) {
-               clocks->data[i].clocks_in_khz =
-                       dpm_table->dpm_levels[i].value * 1000;
-               clocks->data[i].latency_in_us = 0;
-       }
-
-       return 0;
-}
-
-static int smu_v13_0_6_freqs_in_same_level(int32_t frequency1,
-                                          int32_t frequency2)
-{
-       return (abs(frequency1 - frequency2) <= EPSILON);
-}
-
 static uint32_t smu_v13_0_6_get_throttler_status(struct smu_context *smu)
 {
        struct smu_power_context *smu_power = &smu->smu_power;
@@ -1368,9 +1337,11 @@ static int 
smu_v13_0_6_get_current_clk_freq_by_table(struct smu_context *smu,
 
        switch (clk_type) {
        case SMU_GFXCLK:
+       case SMU_SCLK:
                member_type = METRICS_CURR_GFXCLK;
                break;
        case SMU_UCLK:
+       case SMU_MCLK:
                member_type = METRICS_CURR_UCLK;
                break;
        case SMU_SOCCLK:
@@ -1392,57 +1363,6 @@ static int 
smu_v13_0_6_get_current_clk_freq_by_table(struct smu_context *smu,
        return smu_v13_0_6_get_smu_metrics_data(smu, member_type, value);
 }
 
-static int smu_v13_0_6_print_clks(struct smu_context *smu, char *buf, int size,
-                                 struct smu_dpm_table *single_dpm_table,
-                                 uint32_t curr_clk, const char *clk_name)
-{
-       struct pp_clock_levels_with_latency clocks;
-       int i, ret, level = -1;
-       uint32_t clk1, clk2;
-
-       ret = smu_v13_0_6_get_clk_table(smu, &clocks, single_dpm_table);
-       if (ret) {
-               dev_err(smu->adev->dev, "Attempt to get %s clk levels failed!",
-                       clk_name);
-               return ret;
-       }
-
-       if (!clocks.num_levels)
-               return -EINVAL;
-
-       if (curr_clk < SMU_13_0_6_DSCLK_THRESHOLD) {
-               size += sysfs_emit_at(buf, size, "S: %uMhz *\n", curr_clk);
-               for (i = 0; i < clocks.num_levels; i++)
-                       size += sysfs_emit_at(buf, size, "%d: %uMhz\n", i,
-                                             clocks.data[i].clocks_in_khz /
-                                                     1000);
-
-       } else {
-               if ((clocks.num_levels == 1) ||
-                   (curr_clk < (clocks.data[0].clocks_in_khz / 1000)))
-                       level = 0;
-               for (i = 0; i < clocks.num_levels; i++) {
-                       clk1 = clocks.data[i].clocks_in_khz / 1000;
-
-                       if (i < (clocks.num_levels - 1))
-                               clk2 = clocks.data[i + 1].clocks_in_khz / 1000;
-
-                       if (curr_clk == clk1) {
-                               level = i;
-                       } else if (curr_clk >= clk1 && curr_clk < clk2) {
-                               level = (curr_clk - clk1) <= (clk2 - curr_clk) ?
-                                               i :
-                                               i + 1;
-                       }
-
-                       size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n", i,
-                                             clk1, (level == i) ? "*" : "");
-               }
-       }
-
-       return size;
-}
-
 static int smu_v13_0_6_emit_clk_levels(struct smu_context *smu,
                                       enum smu_clk_type type, char *buf,
                                       int *offset)
@@ -1450,10 +1370,9 @@ static int smu_v13_0_6_emit_clk_levels(struct 
smu_context *smu,
        int now, size = *offset, start_offset = *offset;
        int ret = 0;
        struct smu_umd_pstate_table *pstate_table = &smu->pstate_table;
-       struct smu_dpm_table *single_dpm_table;
+       struct smu_dpm_table *single_dpm_table = NULL;
        struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
        struct smu_13_0_dpm_context *dpm_context = NULL;
-       uint32_t min_clk, max_clk;
 
        if (amdgpu_ras_intr_triggered()) {
                sysfs_emit_at(buf, size, "unavailable\n");
@@ -1469,46 +1388,6 @@ static int smu_v13_0_6_emit_clk_levels(struct 
smu_context *smu,
                                      pstate_table->gfxclk_pstate.curr.min,
                                      pstate_table->gfxclk_pstate.curr.max);
                break;
-       case SMU_SCLK:
-               ret = smu_v13_0_6_get_current_clk_freq_by_table(smu, SMU_GFXCLK,
-                                                               &now);
-               if (ret) {
-                       dev_err(smu->adev->dev,
-                               "Attempt to get current gfx clk Failed!");
-                       return ret;
-               }
-
-               single_dpm_table = &(dpm_context->dpm_tables.gfx_table);
-               min_clk = SMU_DPM_TABLE_MIN(single_dpm_table);
-               max_clk = SMU_DPM_TABLE_MAX(single_dpm_table);
-
-               if (now < SMU_13_0_6_DSCLK_THRESHOLD) {
-                       size += sysfs_emit_at(buf, size, "S: %uMhz *\n",
-                                             now);
-                       size += sysfs_emit_at(buf, size, "0: %uMhz\n",
-                                             min_clk);
-                       size += sysfs_emit_at(buf, size, "1: %uMhz\n",
-                                             max_clk);
-
-               } else if (!smu_v13_0_6_freqs_in_same_level(now, min_clk) &&
-                   !smu_v13_0_6_freqs_in_same_level(now, max_clk)) {
-                       size += sysfs_emit_at(buf, size, "0: %uMhz\n",
-                                             min_clk);
-                       size += sysfs_emit_at(buf, size, "1: %uMhz *\n",
-                                             now);
-                       size += sysfs_emit_at(buf, size, "2: %uMhz\n",
-                                             max_clk);
-               } else {
-                       size += sysfs_emit_at(buf, size, "0: %uMhz %s\n",
-                                             min_clk,
-                                             
smu_v13_0_6_freqs_in_same_level(now, min_clk) ? "*" : "");
-                       size += sysfs_emit_at(buf, size, "1: %uMhz %s\n",
-                                             max_clk,
-                                             
smu_v13_0_6_freqs_in_same_level(now, max_clk) ? "*" : "");
-               }
-
-               break;
-
        case SMU_OD_MCLK:
                if (!smu_v13_0_6_cap_supported(smu, SMU_CAP(SET_UCLK_MAX)))
                        return 0;
@@ -1518,100 +1397,43 @@ static int smu_v13_0_6_emit_clk_levels(struct 
smu_context *smu,
                                      pstate_table->uclk_pstate.curr.min,
                                      pstate_table->uclk_pstate.curr.max);
                break;
-       case SMU_MCLK:
-               ret = smu_v13_0_6_get_current_clk_freq_by_table(smu, SMU_UCLK,
-                                                               &now);
-               if (ret) {
-                       dev_err(smu->adev->dev,
-                               "Attempt to get current mclk Failed!");
-                       return ret;
-               }
 
+       case SMU_SCLK:
+       case SMU_GFXCLK:
+               single_dpm_table = &(dpm_context->dpm_tables.gfx_table);
+               break;
+       case SMU_MCLK:
+       case SMU_UCLK:
                single_dpm_table = &(dpm_context->dpm_tables.uclk_table);
-
-               ret = smu_v13_0_6_print_clks(smu, buf, size, single_dpm_table,
-                                            now, "mclk");
-               if (ret < 0)
-                       return ret;
-
-               size = ret;
                break;
        case SMU_SOCCLK:
-               ret = smu_v13_0_6_get_current_clk_freq_by_table(smu, SMU_SOCCLK,
-                                                               &now);
-               if (ret) {
-                       dev_err(smu->adev->dev,
-                               "Attempt to get current socclk Failed!");
-                       return ret;
-               }
-
                single_dpm_table = &(dpm_context->dpm_tables.soc_table);
-
-               ret = smu_v13_0_6_print_clks(smu, buf, size, single_dpm_table,
-                                            now, "socclk");
-               if (ret < 0)
-                       return ret;
-
-               size = ret;
                break;
        case SMU_FCLK:
-               ret = smu_v13_0_6_get_current_clk_freq_by_table(smu, SMU_FCLK,
-                                                               &now);
-               if (ret) {
-                       dev_err(smu->adev->dev,
-                               "Attempt to get current fclk Failed!");
-                       return ret;
-               }
-
                single_dpm_table = &(dpm_context->dpm_tables.fclk_table);
-
-               ret = smu_v13_0_6_print_clks(smu, buf, size, single_dpm_table,
-                                            now, "fclk");
-               if (ret < 0)
-                       return ret;
-
-               size = ret;
                break;
        case SMU_VCLK:
-               ret = smu_v13_0_6_get_current_clk_freq_by_table(smu, SMU_VCLK,
-                                                               &now);
-               if (ret) {
-                       dev_err(smu->adev->dev,
-                               "Attempt to get current vclk Failed!");
-                       return ret;
-               }
-
                single_dpm_table = &(dpm_context->dpm_tables.vclk_table);
-
-               ret = smu_v13_0_6_print_clks(smu, buf, size, single_dpm_table,
-                                            now, "vclk");
-               if (ret < 0)
-                       return ret;
-
-               size = ret;
                break;
        case SMU_DCLK:
-               ret = smu_v13_0_6_get_current_clk_freq_by_table(smu, SMU_DCLK,
-                                                              &now);
-               if (ret) {
-                       dev_err(smu->adev->dev,
-                               "Attempt to get current dclk Failed!");
-                       return ret;
-               }
-
                single_dpm_table = &(dpm_context->dpm_tables.dclk_table);
-
-               ret = smu_v13_0_6_print_clks(smu, buf, size, single_dpm_table,
-                                            now, "dclk");
-               if (ret < 0)
-                       return ret;
-
-               size = ret;
                break;
        default:
                break;
        }
 
+       if (single_dpm_table) {
+               ret = smu_v13_0_6_get_current_clk_freq_by_table(smu, type,
+                                                               &now);
+               if (ret) {
+                       dev_err(smu->adev->dev,
+                               "Attempt to get current clk Failed!");
+                       return ret;
+               }
+               return smu_cmn_print_dpm_clk_levels(smu, single_dpm_table, now,
+                                                   buf, offset);
+       }
+
        *offset += size - start_offset;
 
        return 0;
-- 
2.49.0

Reply via email to