aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1747-drm-amd-display-Calculate-link-bandwidth-in-a-common.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1747-drm-amd-display-Calculate-link-bandwidth-in-a-common.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1747-drm-amd-display-Calculate-link-bandwidth-in-a-common.patch155
1 files changed, 155 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1747-drm-amd-display-Calculate-link-bandwidth-in-a-common.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1747-drm-amd-display-Calculate-link-bandwidth-in-a-common.patch
new file mode 100644
index 00000000..2a20c85c
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1747-drm-amd-display-Calculate-link-bandwidth-in-a-common.patch
@@ -0,0 +1,155 @@
+From 479760d05927373697175d48d883b0fe526a7d88 Mon Sep 17 00:00:00 2001
+From: Nikola Cornij <nikola.cornij@amd.com>
+Date: Tue, 19 Mar 2019 19:47:32 -0400
+Subject: [PATCH 1747/2940] drm/amd/display: Calculate link bandwidth in a
+ common function
+
+[why]
+Currently link bandwidth is calculated in two places, using the same
+formula. They should be unified into calling one function.
+
+[how]
+Replace all implementations of link bandwidth calculation with a call
+to a function.
+
+Signed-off-by: Nikola Cornij <nikola.cornij@amd.com>
+Reviewed-by: Nikola Cornij <Nikola.Cornij@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/core/dc.c | 13 ++++++++++
+ drivers/gpu/drm/amd/display/dc/core/dc_link.c | 16 ++++++-------
+ .../gpu/drm/amd/display/dc/core/dc_link_dp.c | 24 ++++---------------
+ drivers/gpu/drm/amd/display/dc/dc_link.h | 3 +++
+ 4 files changed, 28 insertions(+), 28 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
+index c7c3c383974b..2401c679a70d 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
+@@ -590,6 +590,19 @@ void dc_link_set_test_pattern(struct dc_link *link,
+ cust_pattern_size);
+ }
+
++uint32_t dc_link_bandwidth_kbps(
++ const struct dc_link *link,
++ const struct dc_link_settings *link_setting)
++{
++ uint32_t link_bw_kbps = link_setting->link_rate * LINK_RATE_REF_FREQ_IN_KHZ; /* bytes per sec */
++
++ link_bw_kbps *= 8; /* 8 bits per byte*/
++ link_bw_kbps *= link_setting->lane_count;
++
++ return link_bw_kbps;
++
++}
++
+ static void destruct(struct dc *dc)
+ {
+ dc_release_state(dc->current_state);
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+index 5428bb3fa90c..8504396be362 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+@@ -58,7 +58,6 @@
+ ******************************************************************************/
+
+ enum {
+- LINK_RATE_REF_FREQ_IN_MHZ = 27,
+ PEAK_FACTOR_X1000 = 1006,
+ /*
+ * Some receivers fail to train on first try and are good
+@@ -2289,14 +2288,13 @@ void core_link_resume(struct dc_link *link)
+
+ static struct fixed31_32 get_pbn_per_slot(struct dc_stream_state *stream)
+ {
+- struct dc_link_settings *link_settings =
+- &stream->link->cur_link_settings;
+- uint32_t link_rate_in_mbps =
+- link_settings->link_rate * LINK_RATE_REF_FREQ_IN_MHZ;
+- struct fixed31_32 mbps = dc_fixpt_from_int(
+- link_rate_in_mbps * link_settings->lane_count);
+-
+- return dc_fixpt_div_int(mbps, 54);
++ struct fixed31_32 mbytes_per_sec;
++ uint32_t link_rate_in_mbytes_per_sec = dc_link_bandwidth_kbps(stream->link, &stream->link->cur_link_settings);
++ link_rate_in_mbytes_per_sec /= 8000; /* Kbits to MBytes */
++
++ mbytes_per_sec = dc_fixpt_from_int(link_rate_in_mbytes_per_sec);
++
++ return dc_fixpt_div_int(mbytes_per_sec, 54);
+ }
+
+ static int get_color_depth(enum dc_color_depth color_depth)
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
+index 491d13d27e9e..0d8ef8f7cb58 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
+@@ -1533,22 +1533,6 @@ static bool decide_fallback_link_setting(
+ return true;
+ }
+
+-static uint32_t bandwidth_in_kbps_from_link_settings(
+- const struct dc_link_settings *link_setting)
+-{
+- uint32_t link_rate_in_kbps = link_setting->link_rate *
+- LINK_RATE_REF_FREQ_IN_KHZ;
+-
+- uint32_t lane_count = link_setting->lane_count;
+- uint32_t kbps = link_rate_in_kbps;
+-
+- kbps *= lane_count;
+- kbps *= 8; /* 8 bits per byte*/
+-
+- return kbps;
+-
+-}
+-
+ bool dp_validate_mode_timing(
+ struct dc_link *link,
+ const struct dc_crtc_timing *timing)
+@@ -1574,7 +1558,7 @@ bool dp_validate_mode_timing(
+ */
+
+ req_bw = dc_bandwidth_in_kbps_from_timing(timing);
+- max_bw = bandwidth_in_kbps_from_link_settings(link_setting);
++ max_bw = dc_link_bandwidth_kbps(link, link_setting);
+
+ if (req_bw <= max_bw) {
+ /* remember the biggest mode here, during
+@@ -1609,7 +1593,8 @@ static bool decide_dp_link_settings(struct dc_link *link, struct dc_link_setting
+ */
+ while (current_link_setting.link_rate <=
+ link->verified_link_cap.link_rate) {
+- link_bw = bandwidth_in_kbps_from_link_settings(
++ link_bw = dc_link_bandwidth_kbps(
++ link,
+ &current_link_setting);
+ if (req_bw <= link_bw) {
+ *link_setting = current_link_setting;
+@@ -1660,7 +1645,8 @@ static bool decide_edp_link_settings(struct dc_link *link, struct dc_link_settin
+ */
+ while (current_link_setting.link_rate <=
+ link->verified_link_cap.link_rate) {
+- link_bw = bandwidth_in_kbps_from_link_settings(
++ link_bw = dc_link_bandwidth_kbps(
++ link,
+ &current_link_setting);
+ if (req_bw <= link_bw) {
+ *link_setting = current_link_setting;
+diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h b/drivers/gpu/drm/amd/display/dc/dc_link.h
+index a83e1c60f9db..7b61fb7b1bb7 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc_link.h
++++ b/drivers/gpu/drm/amd/display/dc/dc_link.h
+@@ -246,6 +246,9 @@ void dc_link_set_test_pattern(struct dc_link *link,
+ const struct link_training_settings *p_link_settings,
+ const unsigned char *p_custom_pattern,
+ unsigned int cust_pattern_size);
++uint32_t dc_link_bandwidth_kbps(
++ const struct dc_link *link,
++ const struct dc_link_settings *link_setting);
+
+ bool dc_submit_i2c(
+ struct dc *dc,
+--
+2.17.1
+