aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2349-drm-amd-powerplay-add-function-get_clock_by_type_wit.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2349-drm-amd-powerplay-add-function-get_clock_by_type_wit.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2349-drm-amd-powerplay-add-function-get_clock_by_type_wit.patch174
1 files changed, 174 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2349-drm-amd-powerplay-add-function-get_clock_by_type_wit.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2349-drm-amd-powerplay-add-function-get_clock_by_type_wit.patch
new file mode 100644
index 00000000..45702a2a
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2349-drm-amd-powerplay-add-function-get_clock_by_type_wit.patch
@@ -0,0 +1,174 @@
+From d77924bd29b1fd2ef25bcf90295fc1f0f9280f51 Mon Sep 17 00:00:00 2001
+From: Kevin Wang <kevin1.wang@amd.com>
+Date: Fri, 19 Apr 2019 14:05:58 +0800
+Subject: [PATCH 2349/2940] drm/amd/powerplay: add function
+ get_clock_by_type_with_latency for navi10
+
+add callback function get_clock_by_type_with_latency for navi10 asic
+
+Signed-off-by: Kevin Wang <kevin1.wang@amd.com>
+Reviewed-by: Huang Rui <ray.huang@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ .../amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c | 19 +++++++++-
+ .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 6 ++--
+ drivers/gpu/drm/amd/powerplay/navi10_ppt.c | 35 +++++++++++++++++++
+ drivers/gpu/drm/amd/powerplay/vega20_ppt.c | 12 +++----
+ 4 files changed, 62 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
+index 905b28198352..e19df8bb4f68 100644
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
+@@ -149,6 +149,23 @@ static void get_default_clock_levels(
+ }
+ }
+
++static enum smu_clk_type dc_to_smu_clock_type(
++ enum dm_pp_clock_type dm_pp_clk_type)
++{
++#define DCCLK_MAP_SMUCLK(dcclk, smuclk) \
++ [dcclk] = smuclk
++
++ static int dc_clk_type_map[] = {
++ DCCLK_MAP_SMUCLK(DM_PP_CLOCK_TYPE_DISPLAY_CLK, SMU_DISPCLK),
++ DCCLK_MAP_SMUCLK(DM_PP_CLOCK_TYPE_ENGINE_CLK, SMU_GFXCLK),
++ DCCLK_MAP_SMUCLK(DM_PP_CLOCK_TYPE_MEMORY_CLK, SMU_MCLK),
++ DCCLK_MAP_SMUCLK(DM_PP_CLOCK_TYPE_DCEFCLK, SMU_DCEFCLK),
++ DCCLK_MAP_SMUCLK(DM_PP_CLOCK_TYPE_SOCCLK, SMU_SOCCLK),
++ };
++
++ return dc_clk_type_map[dm_pp_clk_type];
++}
++
+ static enum amd_pp_clock_type dc_to_pp_clock_type(
+ enum dm_pp_clock_type dm_pp_clk_type)
+ {
+@@ -317,7 +334,7 @@ bool dm_pp_get_clock_levels_by_type(
+ }
+ } else if (adev->smu.funcs && adev->smu.funcs->get_clock_by_type) {
+ if (smu_get_clock_by_type(&adev->smu,
+- dc_to_pp_clock_type(clk_type),
++ dc_to_smu_clock_type(clk_type),
+ &pp_clks)) {
+ get_default_clock_levels(clk_type, dc_clks);
+ return true;
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+index 8a4618084358..e05f4dd96f4b 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+@@ -552,7 +552,7 @@ struct pptable_funcs {
+ enum PP_OD_DPM_TABLE_COMMAND type,
+ long *input, uint32_t size);
+ int (*get_clock_by_type_with_latency)(struct smu_context *smu,
+- enum amd_pp_clock_type type,
++ enum smu_clk_type clk_type,
+ struct
+ pp_clock_levels_with_latency
+ *clocks);
+@@ -857,8 +857,8 @@ struct smu_funcs
+ ((smu)->funcs->get_clock_by_type ? (smu)->funcs->get_clock_by_type((smu), (type), (clocks)) : 0)
+ #define smu_get_max_high_clocks(smu, clocks) \
+ ((smu)->funcs->get_max_high_clocks ? (smu)->funcs->get_max_high_clocks((smu), (clocks)) : 0)
+-#define smu_get_clock_by_type_with_latency(smu, type, clocks) \
+- ((smu)->ppt_funcs->get_clock_by_type_with_latency ? (smu)->ppt_funcs->get_clock_by_type_with_latency((smu), (type), (clocks)) : 0)
++#define smu_get_clock_by_type_with_latency(smu, clk_type, clocks) \
++ ((smu)->ppt_funcs->get_clock_by_type_with_latency ? (smu)->ppt_funcs->get_clock_by_type_with_latency((smu), (clk_type), (clocks)) : 0)
+ #define smu_get_clock_by_type_with_voltage(smu, type, clocks) \
+ ((smu)->ppt_funcs->get_clock_by_type_with_voltage ? (smu)->ppt_funcs->get_clock_by_type_with_voltage((smu), (type), (clocks)) : 0)
+ #define smu_display_clock_voltage_request(smu, clock_req) \
+diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+index 936dfe571e6a..214ceece428d 100644
+--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
++++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
+@@ -616,6 +616,40 @@ static int navi10_populate_umd_state_clk(struct smu_context *smu)
+ return ret;
+ }
+
++static int navi10_get_clock_by_type_with_latency(struct smu_context *smu,
++ enum smu_clk_type clk_type,
++ struct pp_clock_levels_with_latency *clocks)
++{
++ int ret = 0, i = 0;
++ uint32_t level_count = 0, freq = 0;
++
++ switch (clk_type) {
++ case SMU_GFXCLK:
++ case SMU_DCEFCLK:
++ case SMU_SOCCLK:
++ ret = smu_get_dpm_level_count(smu, clk_type, &level_count);
++ if (ret)
++ return ret;
++
++ level_count = min(level_count, (uint32_t)MAX_NUM_CLOCKS);
++ clocks->num_levels = level_count;
++
++ for (i = 0; i < level_count; i++) {
++ ret = smu_get_dpm_freq_by_index(smu, clk_type, i, &freq);
++ if (ret)
++ return ret;
++
++ clocks->data[i].clocks_in_khz = freq * 1000;
++ clocks->data[i].latency_in_us = 0;
++ }
++ break;
++ default:
++ break;
++ }
++
++ return ret;
++}
++
+ static const struct pptable_funcs navi10_ppt_funcs = {
+ .tables_init = navi10_tables_init,
+ .alloc_dpm_context = navi10_allocate_dpm_context,
+@@ -634,6 +668,7 @@ static const struct pptable_funcs navi10_ppt_funcs = {
+ .print_clk_levels = navi10_print_clk_levels,
+ .force_clk_levels = navi10_force_clk_levels,
+ .populate_umd_state_clk = navi10_populate_umd_state_clk,
++ .get_clock_by_type_with_latency = navi10_get_clock_by_type_with_latency,
+ };
+
+ void navi10_set_ppt_funcs(struct smu_context *smu)
+diff --git a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
+index 7ed8c7c36037..1f0f4d85fe23 100644
+--- a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
++++ b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
+@@ -1395,7 +1395,7 @@ static int vega20_force_clk_levels(struct smu_context *smu,
+ }
+
+ static int vega20_get_clock_by_type_with_latency(struct smu_context *smu,
+- enum amd_pp_clock_type type,
++ enum smu_clk_type clk_type,
+ struct pp_clock_levels_with_latency *clocks)
+ {
+ int ret;
+@@ -1407,20 +1407,20 @@ static int vega20_get_clock_by_type_with_latency(struct smu_context *smu,
+
+ mutex_lock(&smu->mutex);
+
+- switch (type) {
+- case amd_pp_sys_clock:
++ switch (clk_type) {
++ case SMU_GFXCLK:
+ single_dpm_table = &(dpm_table->gfx_table);
+ ret = vega20_get_clk_table(smu, clocks, single_dpm_table);
+ break;
+- case amd_pp_mem_clock:
++ case SMU_MCLK:
+ single_dpm_table = &(dpm_table->mem_table);
+ ret = vega20_get_clk_table(smu, clocks, single_dpm_table);
+ break;
+- case amd_pp_dcef_clock:
++ case SMU_DCEFCLK:
+ single_dpm_table = &(dpm_table->dcef_table);
+ ret = vega20_get_clk_table(smu, clocks, single_dpm_table);
+ break;
+- case amd_pp_soc_clock:
++ case SMU_SOCCLK:
+ single_dpm_table = &(dpm_table->soc_table);
+ ret = vega20_get_clk_table(smu, clocks, single_dpm_table);
+ break;
+--
+2.17.1
+