aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1745-drm-amd-display-use-proper-formula-to-calculate-band.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1745-drm-amd-display-use-proper-formula-to-calculate-band.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1745-drm-amd-display-use-proper-formula-to-calculate-band.patch176
1 files changed, 176 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1745-drm-amd-display-use-proper-formula-to-calculate-band.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1745-drm-amd-display-use-proper-formula-to-calculate-band.patch
new file mode 100644
index 00000000..1239f26d
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1745-drm-amd-display-use-proper-formula-to-calculate-band.patch
@@ -0,0 +1,176 @@
+From e64caacede5db360ad01bad4764987f3d44ac60f Mon Sep 17 00:00:00 2001
+From: Wenjing Liu <Wenjing.Liu@amd.com>
+Date: Thu, 21 Mar 2019 13:05:36 -0400
+Subject: [PATCH 1745/2940] drm/amd/display: use proper formula to calculate
+ bandwidth from timing
+
+[why]
+The existing calculation uses a wrong formula to
+calculate bandwidth from timing.
+
+[how]
+Expose the existing proper function that calculates the bandwidth,
+so dc_link can use it to calculate timing bandwidth correctly.
+
+Signed-off-by: Wenjing Liu <Wenjing.Liu@amd.com>
+Reviewed-by: Jun Lei <Jun.Lei@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/core/dc_link.c | 48 ++++++++++++++++-
+ .../gpu/drm/amd/display/dc/core/dc_link_dp.c | 51 +------------------
+ drivers/gpu/drm/amd/display/dc/dc_link.h | 2 +
+ 3 files changed, 51 insertions(+), 50 deletions(-)
+
+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 b369da078b2f..fa14dffabc05 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+@@ -2321,7 +2321,7 @@ static struct fixed31_32 get_pbn_from_timing(struct pipe_ctx *pipe_ctx)
+ uint32_t denominator;
+
+ bpc = get_color_depth(pipe_ctx->stream_res.pix_clk_params.color_depth);
+- kbps = pipe_ctx->stream_res.pix_clk_params.requested_pix_clk_100hz / 10 * bpc * 3;
++ kbps = dc_bandwidth_in_kbps_from_timing(&pipe_ctx->stream->timing);
+
+ /*
+ * margin 5300ppm + 300ppm ~ 0.6% as per spec, factor is 1.006
+@@ -2742,3 +2742,49 @@ void dc_link_enable_hpd_filter(struct dc_link *link, bool enable)
+ }
+ }
+
++uint32_t dc_bandwidth_in_kbps_from_timing(
++ const struct dc_crtc_timing *timing)
++{
++ uint32_t bits_per_channel = 0;
++ uint32_t kbps;
++
++ switch (timing->display_color_depth) {
++ case COLOR_DEPTH_666:
++ bits_per_channel = 6;
++ break;
++ case COLOR_DEPTH_888:
++ bits_per_channel = 8;
++ break;
++ case COLOR_DEPTH_101010:
++ bits_per_channel = 10;
++ break;
++ case COLOR_DEPTH_121212:
++ bits_per_channel = 12;
++ break;
++ case COLOR_DEPTH_141414:
++ bits_per_channel = 14;
++ break;
++ case COLOR_DEPTH_161616:
++ bits_per_channel = 16;
++ break;
++ default:
++ break;
++ }
++
++ ASSERT(bits_per_channel != 0);
++
++ kbps = timing->pix_clk_100hz / 10;
++ kbps *= bits_per_channel;
++
++ if (timing->flags.Y_ONLY != 1) {
++ /*Only YOnly make reduce bandwidth by 1/3 compares to RGB*/
++ kbps *= 3;
++ if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR420)
++ kbps /= 2;
++ else if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR422)
++ kbps = kbps * 2 / 3;
++ }
++
++ return kbps;
++
++}
+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 528c9625b5c0..491d13d27e9e 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,53 +1533,6 @@ static bool decide_fallback_link_setting(
+ return true;
+ }
+
+-static uint32_t bandwidth_in_kbps_from_timing(
+- const struct dc_crtc_timing *timing)
+-{
+- uint32_t bits_per_channel = 0;
+- uint32_t kbps;
+-
+- switch (timing->display_color_depth) {
+- case COLOR_DEPTH_666:
+- bits_per_channel = 6;
+- break;
+- case COLOR_DEPTH_888:
+- bits_per_channel = 8;
+- break;
+- case COLOR_DEPTH_101010:
+- bits_per_channel = 10;
+- break;
+- case COLOR_DEPTH_121212:
+- bits_per_channel = 12;
+- break;
+- case COLOR_DEPTH_141414:
+- bits_per_channel = 14;
+- break;
+- case COLOR_DEPTH_161616:
+- bits_per_channel = 16;
+- break;
+- default:
+- break;
+- }
+-
+- ASSERT(bits_per_channel != 0);
+-
+- kbps = timing->pix_clk_100hz / 10;
+- kbps *= bits_per_channel;
+-
+- if (timing->flags.Y_ONLY != 1) {
+- /*Only YOnly make reduce bandwidth by 1/3 compares to RGB*/
+- kbps *= 3;
+- if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR420)
+- kbps /= 2;
+- else if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR422)
+- kbps = kbps * 2 / 3;
+- }
+-
+- return kbps;
+-
+-}
+-
+ static uint32_t bandwidth_in_kbps_from_link_settings(
+ const struct dc_link_settings *link_setting)
+ {
+@@ -1620,7 +1573,7 @@ bool dp_validate_mode_timing(
+ link_setting = &link->verified_link_cap;
+ */
+
+- req_bw = bandwidth_in_kbps_from_timing(timing);
++ req_bw = dc_bandwidth_in_kbps_from_timing(timing);
+ max_bw = bandwidth_in_kbps_from_link_settings(link_setting);
+
+ if (req_bw <= max_bw) {
+@@ -1739,7 +1692,7 @@ void decide_link_settings(struct dc_stream_state *stream,
+ struct dc_link *link;
+ uint32_t req_bw;
+
+- req_bw = bandwidth_in_kbps_from_timing(&stream->timing);
++ req_bw = dc_bandwidth_in_kbps_from_timing(&stream->timing);
+
+ link = stream->link;
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h b/drivers/gpu/drm/amd/display/dc/dc_link.h
+index 8fc223defed4..a83e1c60f9db 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc_link.h
++++ b/drivers/gpu/drm/amd/display/dc/dc_link.h
+@@ -252,4 +252,6 @@ bool dc_submit_i2c(
+ uint32_t link_index,
+ struct i2c_command *cmd);
+
++uint32_t dc_bandwidth_in_kbps_from_timing(
++ const struct dc_crtc_timing *timing);
+ #endif /* DC_LINK_H_ */
+--
+2.17.1
+