aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3000-drm-amd-powerplay-change-sysfs-pp_dpm_xxx-format-for.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3000-drm-amd-powerplay-change-sysfs-pp_dpm_xxx-format-for.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3000-drm-amd-powerplay-change-sysfs-pp_dpm_xxx-format-for.patch103
1 files changed, 103 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3000-drm-amd-powerplay-change-sysfs-pp_dpm_xxx-format-for.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3000-drm-amd-powerplay-change-sysfs-pp_dpm_xxx-format-for.patch
new file mode 100644
index 00000000..ba4f0c8a
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3000-drm-amd-powerplay-change-sysfs-pp_dpm_xxx-format-for.patch
@@ -0,0 +1,103 @@
+From 040f55650a185d0dfa7915093f24c4d0b55d00b4 Mon Sep 17 00:00:00 2001
+From: Kevin Wang <kevin1.wang@amd.com>
+Date: Thu, 18 Jul 2019 15:46:55 +0800
+Subject: [PATCH 3000/4256] drm/amd/powerplay: change sysfs pp_dpm_xxx format
+ for navi10
+
+v2:
+set average clock value on level 1 when current clock equal
+min or max clock (fine grained dpm support).
+
+the navi10 gfxclk (sclk) support fine grained DPM,
+so use level 1 to show current dpm freq in sysfs pp_dpm_xxx
+
+Change-Id: I730bfdedbbcf118f781057be6b2620f047c5d57b
+Signed-off-by: Kevin Wang <kevin1.wang@amd.com>
+Reviewed-by: Kenneth Feng <kenneth.feng@amd.com>
+---
+ drivers/gpu/drm/amd/powerplay/navi10_ppt.c | 47 +++++++++++++++++++---
+ 1 file changed, 41 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+index 0ab02efcbc83..e44041a25e64 100644
+--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
++++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+@@ -646,11 +646,26 @@ static int navi10_get_current_clk_freq_by_table(struct smu_context *smu,
+ return ret;
+ }
+
++static bool navi10_is_support_fine_grained_dpm(struct smu_context *smu, enum smu_clk_type clk_type)
++{
++ PPTable_t *pptable = smu->smu_table.driver_pptable;
++ DpmDescriptor_t *dpm_desc = NULL;
++ uint32_t clk_index = 0;
++
++ clk_index = smu_clk_get_index(smu, clk_type);
++ dpm_desc = &pptable->DpmDescriptor[clk_index];
++
++ /* 0 - Fine grained DPM, 1 - Discrete DPM */
++ return dpm_desc->SnapToDiscrete == 0 ? true : false;
++}
++
+ static int navi10_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;
++ uint32_t freq_values[3] = {0};
++ uint32_t mark_index = 0;
+
+ switch (clk_type) {
+ case SMU_GFXCLK:
+@@ -663,22 +678,42 @@ static int navi10_print_clk_levels(struct smu_context *smu,
+ ret = smu_get_current_clk_freq(smu, clk_type, &cur_value);
+ if (ret)
+ return size;
++
+ /* 10KHz -> MHz */
+ cur_value = cur_value / 100;
+
+- size += sprintf(buf, "current clk: %uMhz\n", cur_value);
+-
+ ret = smu_get_dpm_level_count(smu, clk_type, &count);
+ if (ret)
+ return size;
+
+- for (i = 0; i < count; i++) {
+- ret = smu_get_dpm_freq_by_index(smu, clk_type, i, &value);
++ if (!navi10_is_support_fine_grained_dpm(smu, clk_type)) {
++ for (i = 0; i < count; i++) {
++ ret = smu_get_dpm_freq_by_index(smu, clk_type, i, &value);
++ if (ret)
++ return size;
++
++ size += sprintf(buf + size, "%d: %uMhz %s\n", i, value,
++ cur_value == value ? "*" : "");
++ }
++ } else {
++ ret = smu_get_dpm_freq_by_index(smu, clk_type, 0, &freq_values[0]);
++ if (ret)
++ return size;
++ ret = smu_get_dpm_freq_by_index(smu, clk_type, count - 1, &freq_values[2]);
+ if (ret)
+ return size;
+
+- size += sprintf(buf + size, "%d: %uMhz %s\n", i, value,
+- cur_value == value ? "*" : "");
++ freq_values[1] = cur_value;
++ mark_index = cur_value == freq_values[0] ? 0 :
++ cur_value == freq_values[2] ? 2 : 1;
++ if (mark_index != 1)
++ freq_values[1] = (freq_values[0] + freq_values[2]) / 2;
++
++ for (i = 0; i < 3; i++) {
++ size += sprintf(buf + size, "%d: %uMhz %s\n", i, freq_values[i],
++ i == mark_index ? "*" : "");
++ }
++
+ }
+ break;
+ default:
+--
+2.17.1
+