aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1431-drm-amd-powerplay-add-interface-to-get-current-clock.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1431-drm-amd-powerplay-add-interface-to-get-current-clock.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1431-drm-amd-powerplay-add-interface-to-get-current-clock.patch144
1 files changed, 144 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1431-drm-amd-powerplay-add-interface-to-get-current-clock.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1431-drm-amd-powerplay-add-interface-to-get-current-clock.patch
new file mode 100644
index 00000000..09bc4319
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1431-drm-amd-powerplay-add-interface-to-get-current-clock.patch
@@ -0,0 +1,144 @@
+From 6548d4e7eacf7725f869d02112c7b8c734e88e61 Mon Sep 17 00:00:00 2001
+From: Huang Rui <ray.huang@amd.com>
+Date: Wed, 16 Jan 2019 14:43:29 +0800
+Subject: [PATCH 1431/2940] drm/amd/powerplay: add interface to get current
+ clocks for display
+
+This patch fills the amd_pp_clock_info data for display, it will get the current
+info in that structure.
+
+Signed-off-by: Huang Rui <ray.huang@amd.com>
+Reviewed-by: Kevin Wang <Kevin1.Wang@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ .../amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c | 2 +
+ drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 78 +++++++++++++++++++
+ .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 4 +
+ 3 files changed, 84 insertions(+)
+
+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 2ad18fb558fa..7b201c6a7fae 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
+@@ -497,6 +497,8 @@ bool dm_pp_get_static_clocks(
+ ret = adev->powerplay.pp_funcs->get_current_clocks(
+ adev->powerplay.pp_handle,
+ &pp_clk_info);
++ else if (adev->smu.funcs)
++ ret = smu_get_current_clocks(&adev->smu, &pp_clk_info);
+ if (ret)
+ return false;
+
+diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+index cf8739f262c8..9e60f56853b2 100644
+--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
++++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
+@@ -814,6 +814,84 @@ int smu_display_configuration_change(struct smu_context *smu,
+ return 0;
+ }
+
++static int smu_get_clock_info(struct smu_context *smu,
++ struct smu_clock_info *clk_info,
++ enum smu_perf_level_designation designation)
++{
++ int ret;
++ struct smu_performance_level level = {0};
++
++ if (!clk_info)
++ return -EINVAL;
++
++ ret = smu_get_perf_level(smu, PERF_LEVEL_ACTIVITY, &level);
++ if (ret)
++ return -EINVAL;
++
++ clk_info->min_mem_clk = level.memory_clock;
++ clk_info->min_eng_clk = level.core_clock;
++ clk_info->min_bus_bandwidth = level.non_local_mem_freq * level.non_local_mem_width;
++
++ ret = smu_get_perf_level(smu, designation, &level);
++ if (ret)
++ return -EINVAL;
++
++ clk_info->min_mem_clk = level.memory_clock;
++ clk_info->min_eng_clk = level.core_clock;
++ clk_info->min_bus_bandwidth = level.non_local_mem_freq * level.non_local_mem_width;
++
++ return 0;
++}
++
++int smu_get_current_clocks(struct smu_context *smu,
++ struct amd_pp_clock_info *clocks)
++{
++ struct amd_pp_simple_clock_info simple_clocks = {0};
++ struct smu_clock_info hw_clocks;
++ int ret = 0;
++
++ if (!is_support_sw_smu(smu->adev))
++ return -EINVAL;
++
++ mutex_lock(&smu->mutex);
++
++ smu_get_dal_power_level(smu, &simple_clocks);
++
++ if (smu->support_power_containment)
++ ret = smu_get_clock_info(smu, &hw_clocks,
++ PERF_LEVEL_POWER_CONTAINMENT);
++ else
++ ret = smu_get_clock_info(smu, &hw_clocks, PERF_LEVEL_ACTIVITY);
++
++ if (ret) {
++ pr_err("Error in smu_get_clock_info\n");
++ goto failed;
++ }
++
++ clocks->min_engine_clock = hw_clocks.min_eng_clk;
++ clocks->max_engine_clock = hw_clocks.max_eng_clk;
++ clocks->min_memory_clock = hw_clocks.min_mem_clk;
++ clocks->max_memory_clock = hw_clocks.max_mem_clk;
++ clocks->min_bus_bandwidth = hw_clocks.min_bus_bandwidth;
++ clocks->max_bus_bandwidth = hw_clocks.max_bus_bandwidth;
++ clocks->max_engine_clock_in_sr = hw_clocks.max_eng_clk;
++ clocks->min_engine_clock_in_sr = hw_clocks.min_eng_clk;
++
++ if (simple_clocks.level == 0)
++ clocks->max_clocks_state = PP_DAL_POWERLEVEL_7;
++ else
++ clocks->max_clocks_state = simple_clocks.level;
++
++ if (!smu_get_current_shallow_sleep_clocks(smu, &hw_clocks)) {
++ clocks->max_engine_clock_in_sr = hw_clocks.max_eng_clk;
++ clocks->min_engine_clock_in_sr = hw_clocks.min_eng_clk;
++ }
++
++failed:
++ mutex_unlock(&smu->mutex);
++ return ret;
++}
++
+ static int smu_set_clockgating_state(void *handle,
+ enum amd_clockgating_state state)
+ {
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+index 27a542cdf1f6..a7e62cde5a96 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+@@ -233,6 +233,8 @@ struct smu_context
+
+ uint32_t power_limit;
+ uint32_t default_power_limit;
++
++ bool support_power_containment;
+ };
+
+ struct pptable_funcs {
+@@ -465,5 +467,7 @@ enum amd_pm_state_type smu_get_current_power_state(struct smu_context *smu);
+ extern int smu_display_configuration_change(struct smu_context *smu, const
+ struct amd_pp_display_configuration
+ *display_config);
++extern int smu_get_current_clocks(struct smu_context *smu,
++ struct amd_pp_clock_info *clocks);
+
+ #endif
+--
+2.17.1
+