aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1427-drm-amd-powerplay-add-interface-to-request-display-c.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1427-drm-amd-powerplay-add-interface-to-request-display-c.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1427-drm-amd-powerplay-add-interface-to-request-display-c.patch146
1 files changed, 146 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1427-drm-amd-powerplay-add-interface-to-request-display-c.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1427-drm-amd-powerplay-add-interface-to-request-display-c.patch
new file mode 100644
index 00000000..9e47606f
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1427-drm-amd-powerplay-add-interface-to-request-display-c.patch
@@ -0,0 +1,146 @@
+From daf3e5fca236cff7c546fdeb535e7b6331ad32eb Mon Sep 17 00:00:00 2001
+From: Huang Rui <ray.huang@amd.com>
+Date: Mon, 14 Jan 2019 15:24:59 +0800
+Subject: [PATCH 1427/2940] drm/amd/powerplay: add interface to request display
+ clock voltage
+
+This patch adds interface to request display clock voltage, display will use it
+to request current display clock voltage.
+
+Signed-off-by: Huang Rui <ray.huang@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+Reviewed-by: Evan Quan <evan.quan@amd.com>
+---
+ .../amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c | 17 ++++---
+ .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 5 +++
+ drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 44 +++++++++++++++++++
+ 3 files changed, 61 insertions(+), 5 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 29946e1000fc..2ad18fb558fa 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
+@@ -476,6 +476,10 @@ bool dm_pp_apply_clock_for_voltage_request(
+ ret = adev->powerplay.pp_funcs->display_clock_voltage_request(
+ adev->powerplay.pp_handle,
+ &pp_clock_request);
++ else if (adev->smu.funcs &&
++ adev->smu.funcs->display_clock_voltage_request)
++ ret = smu_display_clock_voltage_request(&adev->smu,
++ &pp_clock_request);
+ if (ret)
+ return false;
+ return true;
+@@ -512,16 +516,19 @@ void pp_rv_set_display_requirement(struct pp_smu *pp,
+ const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
+ struct pp_display_clock_request clock = {0};
+
+- if (!pp_funcs || !pp_funcs->display_clock_voltage_request)
+- return;
+-
+ clock.clock_type = amd_pp_dcf_clock;
+ clock.clock_freq_in_khz = req->hard_min_dcefclk_mhz * 1000;
+- pp_funcs->display_clock_voltage_request(pp_handle, &clock);
++ if (pp_funcs && pp_funcs->display_clock_voltage_request)
++ pp_funcs->display_clock_voltage_request(pp_handle, &clock);
++ else if (adev->smu.funcs && adev->smu.funcs->display_clock_voltage_request)
++ smu_display_clock_voltage_request(&adev->smu, &clock);
+
+ clock.clock_type = amd_pp_f_clock;
+ clock.clock_freq_in_khz = req->hard_min_fclk_mhz *1000;
+- pp_funcs->display_clock_voltage_request(pp_handle, &clock);
++ if (pp_funcs && pp_funcs->display_clock_voltage_request)
++ pp_funcs->display_clock_voltage_request(pp_handle, &clock);
++ else if (adev->smu.funcs && adev->smu.funcs->display_clock_voltage_request)
++ smu_display_clock_voltage_request(&adev->smu, &clock);
+ }
+
+ void pp_rv_set_wm_ranges(struct pp_smu *pp,
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+index 9b0080427de6..9d16db16f2b5 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+@@ -284,6 +284,9 @@ struct smu_funcs
+ struct amd_pp_clocks *clocks);
+ int (*get_max_high_clocks)(struct smu_context *smu,
+ struct amd_pp_simple_clock_info *clocks);
++ int (*display_clock_voltage_request)(struct smu_context *smu, struct
++ pp_display_clock_request
++ *clock_req);
+ };
+
+ #define smu_init_microcode(smu) \
+@@ -393,6 +396,8 @@ struct smu_funcs
+ ((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_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) \
++ ((smu)->funcs->display_clock_voltage_request ? (smu)->funcs->display_clock_voltage_request((smu), (clock_req)) : 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 5987c89d4155..04d949e220d2 100644
+--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
++++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+@@ -1124,6 +1124,49 @@ static int smu_v11_0_read_sensor(struct smu_context *smu,
+ return ret;
+ }
+
++static int
++smu_v11_0_display_clock_voltage_request(struct smu_context *smu,
++ struct pp_display_clock_request
++ *clock_req)
++{
++ enum amd_pp_clock_type clk_type = clock_req->clock_type;
++ int ret = 0;
++ PPCLK_e clk_select = 0;
++ uint32_t clk_freq = clock_req->clock_freq_in_khz / 1000;
++
++ mutex_lock(&smu->mutex);
++ if (smu_feature_is_enabled(smu, FEATURE_DPM_DCEFCLK_BIT)) {
++ switch (clk_type) {
++ case amd_pp_dcef_clock:
++ clk_select = PPCLK_DCEFCLK;
++ break;
++ case amd_pp_disp_clock:
++ clk_select = PPCLK_DISPCLK;
++ break;
++ case amd_pp_pixel_clock:
++ clk_select = PPCLK_PIXCLK;
++ break;
++ case amd_pp_phy_clock:
++ clk_select = PPCLK_PHYCLK;
++ break;
++ default:
++ pr_info("[%s] Invalid Clock Type!", __func__);
++ ret = -EINVAL;
++ break;
++ }
++
++ if (ret)
++ goto failed;
++
++ ret = smu_send_smc_msg_with_param(smu, SMU_MSG_SetHardMinByFreq,
++ (clk_select << 16) | clk_freq);
++ }
++
++failed:
++ mutex_unlock(&smu->mutex);
++ return ret;
++}
++
+ static const struct smu_funcs smu_v11_0_funcs = {
+ .init_microcode = smu_v11_0_init_microcode,
+ .load_microcode = smu_v11_0_load_microcode,
+@@ -1158,6 +1201,7 @@ static const struct smu_funcs smu_v11_0_funcs = {
+ .start_thermal_control = smu_v11_0_start_thermal_control,
+ .read_sensor = smu_v11_0_read_sensor,
+ .set_deep_sleep_dcefclk = smu_v11_0_set_deep_sleep_dcefclk,
++ .display_clock_voltage_request = smu_v11_0_display_clock_voltage_request,
+ };
+
+ void smu_v11_0_set_smu_funcs(struct smu_context *smu)
+--
+2.17.1
+