aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3701-drm-amd-powerplay-implement-sysfs-for-getting-dpm-cl.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3701-drm-amd-powerplay-implement-sysfs-for-getting-dpm-cl.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3701-drm-amd-powerplay-implement-sysfs-for-getting-dpm-cl.patch146
1 files changed, 146 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3701-drm-amd-powerplay-implement-sysfs-for-getting-dpm-cl.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3701-drm-amd-powerplay-implement-sysfs-for-getting-dpm-cl.patch
new file mode 100644
index 00000000..9bb32cb4
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3701-drm-amd-powerplay-implement-sysfs-for-getting-dpm-cl.patch
@@ -0,0 +1,146 @@
+From e36e655f16c39980e58f078dfc0ce1bc4fa41fac Mon Sep 17 00:00:00 2001
+From: Prike Liang <Prike.Liang@amd.com>
+Date: Wed, 4 Sep 2019 16:34:39 +0800
+Subject: [PATCH 3701/4256] drm/amd/powerplay: implement sysfs for getting dpm
+ clock
+
+With the common interface print_clk_levels can get the following dpm clock:
+
+-pp_dpm_dcefclk
+-pp_dpm_fclk
+-pp_dpm_mclk
+-pp_dpm_sclk
+-pp_dpm_socclk
+
+Signed-off-by: Prike Liang <Prike.Liang@amd.com>
+Reviewed-by: Evan Quan <evan.quan@amd.com>
+Reviewed-by: Kevin Wang <kevin1.wang@amd.com>
+---
+ drivers/gpu/drm/amd/powerplay/renoir_ppt.c | 70 ++++++++++++++++++++++
+ drivers/gpu/drm/amd/powerplay/renoir_ppt.h | 25 ++++++++
+ 2 files changed, 95 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
+index 872598c19a5d..b7fa8b158ff2 100644
+--- a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
++++ b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
+@@ -177,12 +177,82 @@ static int renoir_get_dpm_uclk_limited(struct smu_context *smu, uint32_t *clock,
+
+ }
+
++static int renoir_print_clk_levels(struct smu_context *smu,
++ enum smu_clk_type clk_type, char *buf)
++{
++ int i, size = 0, ret = 0;
++ uint32_t cur_value = 0, value = 0, count = 0, min = 0, max = 0;
++ DpmClocks_t *clk_table = smu->smu_table.clocks_table;
++ SmuMetrics_t metrics = {0};
++
++ if (!clk_table || clk_type >= SMU_CLK_COUNT)
++ return -EINVAL;
++
++ ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, 0,
++ (void *)&metrics, false);
++ if (ret)
++ return ret;
++
++ switch (clk_type) {
++ case SMU_GFXCLK:
++ case SMU_SCLK:
++ /* retirve table returned paramters unit is MHz */
++ cur_value = metrics.ClockFrequency[CLOCK_GFXCLK];
++ ret = smu_get_dpm_freq_range(smu, SMU_GFXCLK, &min, &max);
++ if (!ret) {
++ /* driver only know min/max gfx_clk, Add level 1 for all other gfx clks */
++ if (cur_value == max)
++ i = 2;
++ else if (cur_value == min)
++ i = 0;
++ else
++ i = 1;
++
++ size += sprintf(buf + size, "0: %uMhz %s\n", min,
++ i == 0 ? "*" : "");
++ size += sprintf(buf + size, "1: %uMhz %s\n",
++ i == 1 ? cur_value : RENOIR_UMD_PSTATE_GFXCLK,
++ i == 1 ? "*" : "");
++ size += sprintf(buf + size, "2: %uMhz %s\n", max,
++ i == 2 ? "*" : "");
++ }
++ return size;
++ case SMU_SOCCLK:
++ count = NUM_SOCCLK_DPM_LEVELS;
++ cur_value = metrics.ClockFrequency[CLOCK_SOCCLK];
++ break;
++ case SMU_MCLK:
++ count = NUM_MEMCLK_DPM_LEVELS;
++ cur_value = metrics.ClockFrequency[CLOCK_UMCCLK];
++ break;
++ case SMU_DCEFCLK:
++ count = NUM_DCFCLK_DPM_LEVELS;
++ cur_value = metrics.ClockFrequency[CLOCK_DCFCLK];
++ break;
++ case SMU_FCLK:
++ count = NUM_FCLK_DPM_LEVELS;
++ cur_value = metrics.ClockFrequency[CLOCK_FCLK];
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ for (i = 0; i < count; i++) {
++ GET_DPM_CUR_FREQ(clk_table, clk_type, i, value);
++ size += sprintf(buf + size, "%d: %uMhz %s\n", i, value,
++ cur_value == value ? "*" : "");
++ }
++
++ return size;
++}
++
+ static const struct pptable_funcs renoir_ppt_funcs = {
+ .get_smu_msg_index = renoir_get_smu_msg_index,
+ .get_smu_table_index = renoir_get_smu_table_index,
+ .tables_init = renoir_tables_init,
+ .set_power_state = NULL,
+ .get_dpm_uclk_limited = renoir_get_dpm_uclk_limited,
++ .print_clk_levels = renoir_print_clk_levels,
+ };
+
+ void renoir_set_ppt_funcs(struct smu_context *smu)
+diff --git a/drivers/gpu/drm/amd/powerplay/renoir_ppt.h b/drivers/gpu/drm/amd/powerplay/renoir_ppt.h
+index e9b7237c0f7f..2a390ddd37dd 100644
+--- a/drivers/gpu/drm/amd/powerplay/renoir_ppt.h
++++ b/drivers/gpu/drm/amd/powerplay/renoir_ppt.h
+@@ -25,4 +25,29 @@
+
+ extern void renoir_set_ppt_funcs(struct smu_context *smu);
+
++/* UMD PState Renoir Msg Parameters in MHz */
++#define RENOIR_UMD_PSTATE_GFXCLK 700
++#define RENOIR_UMD_PSTATE_SOCCLK 678
++#define RENOIR_UMD_PSTATE_FCLK 800
++
++#define GET_DPM_CUR_FREQ(table, clk_type, dpm_level, freq) \
++ do { \
++ switch (clk_type) { \
++ case SMU_SOCCLK: \
++ freq = table->SocClocks[dpm_level].Freq; \
++ break; \
++ case SMU_MCLK: \
++ freq = table->MemClocks[dpm_level].Freq; \
++ break; \
++ case SMU_DCEFCLK: \
++ freq = table->DcfClocks[dpm_level].Freq; \
++ break; \
++ case SMU_FCLK: \
++ freq = table->FClocks[dpm_level].Freq; \
++ break; \
++ default: \
++ break; \
++ } \
++ } while (0)
++
+ #endif
+--
+2.17.1
+