aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4729-drm-amd-powerplay-implement-interface-to-retrieve-cl.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4729-drm-amd-powerplay-implement-interface-to-retrieve-cl.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4729-drm-amd-powerplay-implement-interface-to-retrieve-cl.patch169
1 files changed, 169 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4729-drm-amd-powerplay-implement-interface-to-retrieve-cl.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4729-drm-amd-powerplay-implement-interface-to-retrieve-cl.patch
new file mode 100644
index 00000000..d2902008
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4729-drm-amd-powerplay-implement-interface-to-retrieve-cl.patch
@@ -0,0 +1,169 @@
+From dd90194758a70456d1de08bd83f6d4fdfd682e44 Mon Sep 17 00:00:00 2001
+From: Xiaomeng Hou <Xiaomeng.Hou@amd.com>
+Date: Wed, 4 Dec 2019 15:17:38 +0800
+Subject: [PATCH 4729/4736] drm/amd/powerplay: implement interface to retrieve
+ clock freq for renoir
+
+implement smu12 get_clk_freq interface to get clock frequency like
+MCLK/SCLK.
+
+Change-Id: I2481d649811c15cd2d8e2741242b2928a32413fc
+Signed-off-by: Xiaomeng Hou <Xiaomeng.Hou@amd.com>
+Reviewed-by: Huang Rui <ray.huang@amd.com>
+---
+ drivers/gpu/drm/amd/powerplay/inc/smu_v12_0.h | 4 ++
+ drivers/gpu/drm/amd/powerplay/renoir_ppt.c | 49 +++++++++++++++++++
+ drivers/gpu/drm/amd/powerplay/smu_v12_0.c | 20 ++++++++
+ 3 files changed, 73 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu_v12_0.h b/drivers/gpu/drm/amd/powerplay/inc/smu_v12_0.h
+index 922973b7e29f..ad68a5623033 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/smu_v12_0.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/smu_v12_0.h
+@@ -75,6 +75,10 @@ int smu_v12_0_fini_smc_tables(struct smu_context *smu);
+
+ int smu_v12_0_populate_smc_tables(struct smu_context *smu);
+
++int smu_v12_0_get_current_clk_freq(struct smu_context *smu,
++ enum smu_clk_type clk_id,
++ uint32_t *value);
++
+ int smu_v12_0_get_dpm_ultimate_freq(struct smu_context *smu, enum smu_clk_type clk_type,
+ uint32_t *min, uint32_t *max);
+
+diff --git a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
+index be3c996728b1..861445f66e3e 100644
+--- a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
++++ b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c
+@@ -31,6 +31,9 @@
+ #include "renoir_ppt.h"
+
+
++#define CLK_MAP(clk, index) \
++ [SMU_##clk] = {1, (index)}
++
+ #define MSG_MAP(msg, index) \
+ [SMU_MSG_##msg] = {1, (index)}
+
+@@ -104,6 +107,14 @@ static struct smu_12_0_cmn2aisc_mapping renoir_message_map[SMU_MSG_MAX_COUNT] =
+ MSG_MAP(SetHardMinFclkByFreq, PPSMC_MSG_SetHardMinFclkByFreq),
+ };
+
++static struct smu_12_0_cmn2aisc_mapping renoir_clk_map[SMU_CLK_COUNT] = {
++ CLK_MAP(GFXCLK, CLOCK_GFXCLK),
++ CLK_MAP(SCLK, CLOCK_GFXCLK),
++ CLK_MAP(SOCCLK, CLOCK_SOCCLK),
++ CLK_MAP(UCLK, CLOCK_UMCCLK),
++ CLK_MAP(MCLK, CLOCK_UMCCLK),
++};
++
+ static struct smu_12_0_cmn2aisc_mapping renoir_table_map[SMU_TABLE_COUNT] = {
+ TAB_MAP_VALID(WATERMARKS),
+ TAB_MAP_INVALID(CUSTOM_DPM),
+@@ -125,6 +136,21 @@ static int renoir_get_smu_msg_index(struct smu_context *smc, uint32_t index)
+ return mapping.map_to;
+ }
+
++static int renoir_get_smu_clk_index(struct smu_context *smc, uint32_t index)
++{
++ struct smu_12_0_cmn2aisc_mapping mapping;
++
++ if (index >= SMU_CLK_COUNT)
++ return -EINVAL;
++
++ mapping = renoir_clk_map[index];
++ if (!(mapping.valid_mapping)) {
++ return -EINVAL;
++ }
++
++ return mapping.map_to;
++}
++
+ static int renoir_get_smu_table_index(struct smu_context *smc, uint32_t index)
+ {
+ struct smu_12_0_cmn2aisc_mapping mapping;
+@@ -352,6 +378,26 @@ static int renoir_dpm_set_jpeg_enable(struct smu_context *smu, bool enable)
+ return ret;
+ }
+
++static int renoir_get_current_clk_freq_by_table(struct smu_context *smu,
++ enum smu_clk_type clk_type,
++ uint32_t *value)
++{
++ int ret = 0, clk_id = 0;
++ SmuMetrics_t metrics;
++
++ ret = renoir_get_metrics_table(smu, &metrics);
++ if (ret)
++ return ret;
++
++ clk_id = smu_clk_get_index(smu, clk_type);
++ if (clk_id < 0)
++ return clk_id;
++
++ *value = metrics.ClockFrequency[clk_id];
++
++ return ret;
++}
++
+ static int renoir_force_dpm_limit_value(struct smu_context *smu, bool highest)
+ {
+ int ret = 0, i = 0;
+@@ -799,6 +845,7 @@ static int renoir_read_sensor(struct smu_context *smu,
+
+ static const struct pptable_funcs renoir_ppt_funcs = {
+ .get_smu_msg_index = renoir_get_smu_msg_index,
++ .get_smu_clk_index = renoir_get_smu_clk_index,
+ .get_smu_table_index = renoir_get_smu_table_index,
+ .tables_init = renoir_tables_init,
+ .set_power_state = NULL,
+@@ -807,6 +854,7 @@ static const struct pptable_funcs renoir_ppt_funcs = {
+ .get_current_power_state = renoir_get_current_power_state,
+ .dpm_set_uvd_enable = renoir_dpm_set_uvd_enable,
+ .dpm_set_jpeg_enable = renoir_dpm_set_jpeg_enable,
++ .get_current_clk_freq_by_table = renoir_get_current_clk_freq_by_table,
+ .force_dpm_limit_value = renoir_force_dpm_limit_value,
+ .unforce_dpm_levels = renoir_unforce_dpm_levels,
+ .get_workload_type = renoir_get_workload_type,
+@@ -830,6 +878,7 @@ static const struct pptable_funcs renoir_ppt_funcs = {
+ .init_smc_tables = smu_v12_0_init_smc_tables,
+ .fini_smc_tables = smu_v12_0_fini_smc_tables,
+ .populate_smc_tables = smu_v12_0_populate_smc_tables,
++ .get_current_clk_freq = smu_v12_0_get_current_clk_freq,
+ .get_dpm_ultimate_freq = smu_v12_0_get_dpm_ultimate_freq,
+ .mode2_reset = smu_v12_0_mode2_reset,
+ .set_soft_freq_limited_range = smu_v12_0_set_soft_freq_limited_range,
+diff --git a/drivers/gpu/drm/amd/powerplay/smu_v12_0.c b/drivers/gpu/drm/amd/powerplay/smu_v12_0.c
+index 951aa4570a04..0e10cec5e9c3 100644
+--- a/drivers/gpu/drm/amd/powerplay/smu_v12_0.c
++++ b/drivers/gpu/drm/amd/powerplay/smu_v12_0.c
+@@ -330,6 +330,26 @@ int smu_v12_0_populate_smc_tables(struct smu_context *smu)
+ return smu_update_table(smu, SMU_TABLE_DPMCLOCKS, 0, smu_table->clocks_table, false);
+ }
+
++int smu_v12_0_get_current_clk_freq(struct smu_context *smu,
++ enum smu_clk_type clk_id,
++ uint32_t *value)
++{
++ int ret = 0;
++ uint32_t freq = 0;
++
++ if (clk_id >= SMU_CLK_COUNT || !value)
++ return -EINVAL;
++
++ ret = smu_get_current_clk_freq_by_table(smu, clk_id, &freq);
++ if (ret)
++ return ret;
++
++ freq *= 100;
++ *value = freq;
++
++ return ret;
++}
++
+ int smu_v12_0_get_dpm_ultimate_freq(struct smu_context *smu, enum smu_clk_type clk_type,
+ uint32_t *min, uint32_t *max)
+ {
+--
+2.17.1
+