aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1024-drm-amd-display-Start-using-the-new-pp_smu-interface.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1024-drm-amd-display-Start-using-the-new-pp_smu-interface.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1024-drm-amd-display-Start-using-the-new-pp_smu-interface.patch194
1 files changed, 194 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1024-drm-amd-display-Start-using-the-new-pp_smu-interface.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1024-drm-amd-display-Start-using-the-new-pp_smu-interface.patch
new file mode 100644
index 00000000..be2e6617
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1024-drm-amd-display-Start-using-the-new-pp_smu-interface.patch
@@ -0,0 +1,194 @@
+From 737dda3cae5f657cdaebae2843712e9efcc3df99 Mon Sep 17 00:00:00 2001
+From: Fatemeh Darbehani <fatemeh.darbehani@amd.com>
+Date: Fri, 30 Nov 2018 15:55:01 -0500
+Subject: [PATCH 1024/2940] drm/amd/display: Start using the new pp_smu
+ interface
+
+[Why]
+PPLib has impelemented the new pp_smu interface
+
+[How]
+Use the new functions if available instead of the old interface
+'set_display_requirement' and 'dcn1_pplib_apply_display_requirements'.
+
+Signed-off-by: Fatemeh Darbehani <fatemeh.darbehani@amd.com>
+Reviewed-by: Fatemeh Darbehani <Fatemeh.Darbehani@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+Acked-by: Su Chung <Su.Chung@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Chaudhary Amit Kumar <Chaudharyamit.Kumar@amd.com>
+---
+ .../amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c | 4 +-
+ .../drm/amd/display/dc/dcn10/dcn10_clk_mgr.c | 82 ++++++-------------
+ drivers/gpu/drm/amd/display/dc/dm_pp_smu.h | 4 +-
+ 3 files changed, 31 insertions(+), 59 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 12001a006b2d..1afdff967f32 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
+@@ -485,11 +485,11 @@ void pp_rv_set_display_requirement(struct pp_smu *pp,
+ return;
+
+ clock.clock_type = amd_pp_dcf_clock;
+- clock.clock_freq_in_khz = req->hard_min_dcefclk_khz;
++ clock.clock_freq_in_khz = req->hard_min_dcefclk_mhz;
+ pp_funcs->display_clock_voltage_request(pp_handle, &clock);
+
+ clock.clock_type = amd_pp_f_clock;
+- clock.clock_freq_in_khz = req->hard_min_fclk_khz;
++ clock.clock_freq_in_khz = req->hard_min_fclk_mhz;
+ pp_funcs->display_clock_voltage_request(pp_handle, &clock);
+ }
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_clk_mgr.c
+index d4824a1b327b..9c3b87c9ede9 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_clk_mgr.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_clk_mgr.c
+@@ -161,40 +161,6 @@ static int get_active_display_cnt(
+ return display_count;
+ }
+
+-static void notify_deep_sleep_dcfclk_to_smu(
+- struct pp_smu_funcs_rv *pp_smu, int min_dcef_deep_sleep_clk_khz)
+-{
+- int min_dcef_deep_sleep_clk_mhz; //minimum required DCEF Deep Sleep clock in mhz
+- /*
+- * if function pointer not set up, this message is
+- * sent as part of pplib_apply_display_requirements.
+- * So just return.
+- */
+- if (!pp_smu || !pp_smu->set_min_deep_sleep_dcfclk)
+- return;
+-
+- min_dcef_deep_sleep_clk_mhz = (min_dcef_deep_sleep_clk_khz + 999) / 1000; //Round up
+- pp_smu->set_min_deep_sleep_dcfclk(&pp_smu->pp_smu, min_dcef_deep_sleep_clk_mhz);
+-}
+-
+-static void notify_hard_min_dcfclk_to_smu(
+- struct pp_smu_funcs_rv *pp_smu, int min_dcf_clk_khz)
+-{
+- int min_dcf_clk_mhz; //minimum required DCF clock in mhz
+-
+- /*
+- * if function pointer not set up, this message is
+- * sent as part of pplib_apply_display_requirements.
+- * So just return.
+- */
+- if (!pp_smu || !pp_smu->set_hard_min_dcfclk_by_freq)
+- return;
+-
+- min_dcf_clk_mhz = min_dcf_clk_khz / 1000;
+-
+- pp_smu->set_hard_min_dcfclk_by_freq(&pp_smu->pp_smu, min_dcf_clk_mhz);
+-}
+-
+ static void dcn1_update_clocks(struct clk_mgr *clk_mgr,
+ struct dc_state *context,
+ bool safe_to_lower)
+@@ -206,7 +172,6 @@ static void dcn1_update_clocks(struct clk_mgr *clk_mgr,
+ &dc->res_pool->pp_smu_req;
+ struct pp_smu_display_requirement_rv smu_req = *smu_req_cur;
+ struct pp_smu_funcs_rv *pp_smu = dc->res_pool->pp_smu;
+- uint32_t requested_dcf_clock_in_khz = 0;
+ bool send_request_to_increase = false;
+ bool send_request_to_lower = false;
+ int display_count;
+@@ -226,8 +191,8 @@ static void dcn1_update_clocks(struct clk_mgr *clk_mgr,
+ */
+ if (pp_smu->set_display_count)
+ pp_smu->set_display_count(&pp_smu->pp_smu, display_count);
+- else
+- smu_req.display_count = display_count;
++
++ smu_req.display_count = display_count;
+
+ }
+
+@@ -265,7 +230,7 @@ static void dcn1_update_clocks(struct clk_mgr *clk_mgr,
+ if (should_set_clock(safe_to_lower,
+ new_clocks->dcfclk_deep_sleep_khz, clk_mgr->clks.dcfclk_deep_sleep_khz)) {
+ clk_mgr->clks.dcfclk_deep_sleep_khz = new_clocks->dcfclk_deep_sleep_khz;
+- smu_req.min_deep_sleep_dcefclk_mhz = new_clocks->dcfclk_deep_sleep_khz;
++ smu_req.min_deep_sleep_dcefclk_mhz = (new_clocks->dcfclk_deep_sleep_khz + 999) / 1000;
+
+ send_request_to_lower = true;
+ }
+@@ -275,15 +240,18 @@ static void dcn1_update_clocks(struct clk_mgr *clk_mgr,
+ */
+ if (send_request_to_increase) {
+ /*use dcfclk to request voltage*/
+- requested_dcf_clock_in_khz = dcn_find_dcfclk_suits_all(dc, new_clocks);
+-
+- notify_hard_min_dcfclk_to_smu(pp_smu, requested_dcf_clock_in_khz);
+-
+- if (pp_smu->set_display_requirement)
+- pp_smu->set_display_requirement(&pp_smu->pp_smu, &smu_req);
+-
+- notify_deep_sleep_dcfclk_to_smu(pp_smu, clk_mgr->clks.dcfclk_deep_sleep_khz);
+- dcn1_pplib_apply_display_requirements(dc, context);
++ if (pp_smu->set_hard_min_fclk_by_freq &&
++ pp_smu->set_hard_min_dcfclk_by_freq &&
++ pp_smu->set_min_deep_sleep_dcfclk) {
++
++ pp_smu->set_hard_min_fclk_by_freq(&pp_smu->pp_smu, smu_req.hard_min_fclk_mhz);
++ pp_smu->set_hard_min_dcfclk_by_freq(&pp_smu->pp_smu, smu_req.hard_min_dcefclk_mhz);
++ pp_smu->set_min_deep_sleep_dcfclk(&pp_smu->pp_smu, smu_req.min_deep_sleep_dcefclk_mhz);
++ } else {
++ if (pp_smu->set_display_requirement)
++ pp_smu->set_display_requirement(&pp_smu->pp_smu, &smu_req);
++ dcn1_pplib_apply_display_requirements(dc, context);
++ }
+ }
+
+ /* dcn1 dppclk is tied to dispclk */
+@@ -298,15 +266,19 @@ static void dcn1_update_clocks(struct clk_mgr *clk_mgr,
+
+ if (!send_request_to_increase && send_request_to_lower) {
+ /*use dcfclk to request voltage*/
+- requested_dcf_clock_in_khz = dcn_find_dcfclk_suits_all(dc, new_clocks);
+-
+- notify_hard_min_dcfclk_to_smu(pp_smu, requested_dcf_clock_in_khz);
+-
+- if (pp_smu->set_display_requirement)
+- pp_smu->set_display_requirement(&pp_smu->pp_smu, &smu_req);
++ if (pp_smu->set_hard_min_fclk_by_freq &&
++ pp_smu->set_hard_min_dcfclk_by_freq &&
++ pp_smu->set_min_deep_sleep_dcfclk) {
++
++ pp_smu->set_hard_min_fclk_by_freq(&pp_smu->pp_smu, smu_req.hard_min_fclk_mhz);
++ pp_smu->set_hard_min_dcfclk_by_freq(&pp_smu->pp_smu, smu_req.hard_min_dcefclk_mhz);
++ pp_smu->set_min_deep_sleep_dcfclk(&pp_smu->pp_smu, smu_req.min_deep_sleep_dcefclk_mhz);
++ } else {
++ if (pp_smu->set_display_requirement)
++ pp_smu->set_display_requirement(&pp_smu->pp_smu, &smu_req);
++ dcn1_pplib_apply_display_requirements(dc, context);
++ }
+
+- notify_deep_sleep_dcfclk_to_smu(pp_smu, clk_mgr->clks.dcfclk_deep_sleep_khz);
+- dcn1_pplib_apply_display_requirements(dc, context);
+ }
+
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dm_pp_smu.h b/drivers/gpu/drm/amd/display/dc/dm_pp_smu.h
+index b10272d6b84b..90e94b030113 100644
+--- a/drivers/gpu/drm/amd/display/dc/dm_pp_smu.h
++++ b/drivers/gpu/drm/amd/display/dc/dm_pp_smu.h
+@@ -81,12 +81,12 @@ struct pp_smu_display_requirement_rv {
+ /* PPSMC_MSG_SetHardMinFclkByFreq: khz
+ * FCLK will vary with DPM, but never below requested hard min
+ */
+- unsigned int hard_min_fclk_khz;
++ unsigned int hard_min_fclk_mhz;
+
+ /* PPSMC_MSG_SetHardMinDcefclkByFreq: khz
+ * fixed clock at requested freq, either from FCH bypass or DFS
+ */
+- unsigned int hard_min_dcefclk_khz;
++ unsigned int hard_min_dcefclk_mhz;
+
+ /* PPSMC_MSG_SetMinDeepSleepDcefclk: mhz
+ * when DF is in cstate, dcf clock is further divided down
+--
+2.17.1
+