aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1467-drm-amd-powerplay-add-function-to-get-sclk-and-mclk.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1467-drm-amd-powerplay-add-function-to-get-sclk-and-mclk.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1467-drm-amd-powerplay-add-function-to-get-sclk-and-mclk.patch197
1 files changed, 197 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1467-drm-amd-powerplay-add-function-to-get-sclk-and-mclk.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1467-drm-amd-powerplay-add-function-to-get-sclk-and-mclk.patch
new file mode 100644
index 00000000..127b48ef
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1467-drm-amd-powerplay-add-function-to-get-sclk-and-mclk.patch
@@ -0,0 +1,197 @@
+From a0c64c16ec52d1668637858871a0c5bbf2b6a0b0 Mon Sep 17 00:00:00 2001
+From: Likun Gao <Likun.Gao@amd.com>
+Date: Mon, 28 Jan 2019 19:12:10 +0800
+Subject: [PATCH 1467/2940] drm/amd/powerplay: add function to get sclk and
+ mclk
+
+Add function to get sclk and mclk for smu11.
+
+Signed-off-by: Likun Gao <Likun.Gao@amd.com>
+Reviewed-by: Huang Rui <ray.huang@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c | 16 ++++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h | 10 +--
+ .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 6 ++
+ drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 84 +++++++++++++++++++
+ 4 files changed, 110 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c
+index 344967df3137..523b8ab6b04e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c
+@@ -904,3 +904,19 @@ amdgpu_get_vce_clock_state(void *handle, u32 idx)
+
+ return NULL;
+ }
++
++int amdgpu_dpm_get_sclk(struct amdgpu_device *adev, bool low)
++{
++ if (is_support_sw_smu(adev))
++ return smu_get_sclk(&adev->smu, low);
++ else
++ return (adev)->powerplay.pp_funcs->get_sclk((adev)->powerplay.pp_handle, (low));
++}
++
++int amdgpu_dpm_get_mclk(struct amdgpu_device *adev, bool low)
++{
++ if (is_support_sw_smu(adev))
++ return smu_get_mclk(&adev->smu, low);
++ else
++ return (adev)->powerplay.pp_funcs->get_mclk((adev)->powerplay.pp_handle, (low));
++}
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
+index 5b1539e72101..2fda77fec930 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
+@@ -278,12 +278,6 @@ enum amdgpu_pcie_gen {
+ #define amdgpu_dpm_set_fan_speed_rpm(adev, s) \
+ ((adev)->powerplay.pp_funcs->set_fan_speed_rpm)((adev)->powerplay.pp_handle, (s))
+
+-#define amdgpu_dpm_get_sclk(adev, l) \
+- ((adev)->powerplay.pp_funcs->get_sclk((adev)->powerplay.pp_handle, (l)))
+-
+-#define amdgpu_dpm_get_mclk(adev, l) \
+- ((adev)->powerplay.pp_funcs->get_mclk((adev)->powerplay.pp_handle, (l)))
+-
+ #define amdgpu_dpm_force_performance_level(adev, l) \
+ ((adev)->powerplay.pp_funcs->force_performance_level((adev)->powerplay.pp_handle, (l)))
+
+@@ -509,4 +503,8 @@ enum amdgpu_pcie_gen amdgpu_get_pcie_gen_support(struct amdgpu_device *adev,
+ struct amd_vce_state*
+ amdgpu_get_vce_clock_state(void *handle, u32 idx);
+
++extern int amdgpu_dpm_get_sclk(struct amdgpu_device *adev, bool low);
++
++extern int amdgpu_dpm_get_mclk(struct amdgpu_device *adev, bool low);
++
+ #endif
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+index db050978020f..d7f26e178839 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+@@ -528,6 +528,8 @@ struct smu_funcs
+ uint32_t value);
+ int (*dpm_set_uvd_enable)(struct smu_context *smu, bool enable);
+ int (*dpm_set_vce_enable)(struct smu_context *smu, bool enable);
++ uint32_t (*get_sclk)(struct smu_context *smu, bool low);
++ uint32_t (*get_mclk)(struct smu_context *smu, bool low);
+ };
+
+ #define smu_init_microcode(smu) \
+@@ -693,6 +695,10 @@ struct smu_funcs
+ ((smu)->funcs->dpm_set_uvd_enable ? (smu)->funcs->dpm_set_uvd_enable((smu), (enable)) : 0)
+ #define smu_dpm_set_vce_enable(smu, enable) \
+ ((smu)->funcs->dpm_set_vce_enable ? (smu)->funcs->dpm_set_vce_enable((smu), (enable)) : 0)
++#define smu_get_sclk(smu, low) \
++ ((smu)->funcs->get_sclk ? (smu)->funcs->get_sclk((smu), (low)) : 0)
++#define smu_get_mclk(smu, low) \
++ ((smu)->funcs->get_mclk ? (smu)->funcs->get_mclk((smu), (low)) : 0)
+
+
+ extern int smu_get_atom_data_table(struct smu_context *smu, uint32_t table,
+diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+index 3ebf89b3f815..48174df19105 100644
+--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
++++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+@@ -1258,6 +1258,88 @@ smu_v11_0_set_watermarks_for_clock_ranges(struct smu_context *smu, struct
+ return ret;
+ }
+
++static int smu_v11_0_get_clock_ranges(struct smu_context *smu,
++ uint32_t *clock,
++ PPCLK_e clock_select,
++ bool max)
++{
++ int ret;
++ *clock = 0;
++ if (max) {
++ ret = smu_send_smc_msg_with_param(smu, SMU_MSG_GetMaxDpmFreq,
++ (clock_select << 16));
++ if (ret) {
++ pr_err("[GetClockRanges] Failed to get max clock from SMC!\n");
++ return ret;
++ }
++ smu_read_smc_arg(smu, clock);
++ } else {
++ ret = smu_send_smc_msg_with_param(smu, SMU_MSG_GetMinDpmFreq,
++ (clock_select << 16));
++ if (ret) {
++ pr_err("[GetClockRanges] Failed to get min clock from SMC!\n");
++ return ret;
++ }
++ smu_read_smc_arg(smu, clock);
++ }
++
++ return 0;
++}
++
++static uint32_t smu_v11_0_dpm_get_sclk(struct smu_context *smu, bool low)
++{
++ uint32_t gfx_clk;
++ int ret;
++
++ if (!smu_feature_is_enabled(smu, FEATURE_DPM_GFXCLK_BIT)) {
++ pr_err("[GetSclks]: gfxclk dpm not enabled!\n");
++ return -EPERM;
++ }
++
++ if (low) {
++ ret = smu_v11_0_get_clock_ranges(smu, &gfx_clk, PPCLK_GFXCLK, false);
++ if (ret) {
++ pr_err("[GetSclks]: fail to get min PPCLK_GFXCLK\n");
++ return ret;
++ }
++ } else {
++ ret = smu_v11_0_get_clock_ranges(smu, &gfx_clk, PPCLK_GFXCLK, true);
++ if (ret) {
++ pr_err("[GetSclks]: fail to get max PPCLK_GFXCLK\n");
++ return ret;
++ }
++ }
++
++ return (gfx_clk * 100);
++}
++
++static uint32_t smu_v11_0_dpm_get_mclk(struct smu_context *smu, bool low)
++{
++ uint32_t mem_clk;
++ int ret;
++
++ if (!smu_feature_is_enabled(smu, FEATURE_DPM_UCLK_BIT)) {
++ pr_err("[GetMclks]: memclk dpm not enabled!\n");
++ return -EPERM;
++ }
++
++ if (low) {
++ ret = smu_v11_0_get_clock_ranges(smu, &mem_clk, PPCLK_UCLK, false);
++ if (ret) {
++ pr_err("[GetMclks]: fail to get min PPCLK_UCLK\n");
++ return ret;
++ }
++ } else {
++ ret = smu_v11_0_get_clock_ranges(smu, &mem_clk, PPCLK_GFXCLK, true);
++ if (ret) {
++ pr_err("[GetMclks]: fail to get max PPCLK_UCLK\n");
++ return ret;
++ }
++ }
++
++ return (mem_clk * 100);
++}
++
+ static int smu_v11_0_set_od8_default_settings(struct smu_context *smu)
+ {
+ struct smu_table_context *table_context = &smu->smu_table;
+@@ -1658,6 +1740,8 @@ static const struct smu_funcs smu_v11_0_funcs = {
+ .set_deep_sleep_dcefclk = smu_v11_0_set_deep_sleep_dcefclk,
+ .display_clock_voltage_request = smu_v11_0_display_clock_voltage_request,
+ .set_watermarks_for_clock_ranges = smu_v11_0_set_watermarks_for_clock_ranges,
++ .get_sclk = smu_v11_0_dpm_get_sclk,
++ .get_mclk = smu_v11_0_dpm_get_mclk,
+ .set_od8_default_settings = smu_v11_0_set_od8_default_settings,
+ .get_activity_monitor_coeff = smu_v11_0_get_activity_monitor_coeff,
+ .set_activity_monitor_coeff = smu_v11_0_set_activity_monitor_coeff,
+--
+2.17.1
+