aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2021-drm-amd-display-fix-calculation-of-total_data_read_b.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2021-drm-amd-display-fix-calculation-of-total_data_read_b.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2021-drm-amd-display-fix-calculation-of-total_data_read_b.patch85
1 files changed, 85 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2021-drm-amd-display-fix-calculation-of-total_data_read_b.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2021-drm-amd-display-fix-calculation-of-total_data_read_b.patch
new file mode 100644
index 00000000..b11d2df1
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2021-drm-amd-display-fix-calculation-of-total_data_read_b.patch
@@ -0,0 +1,85 @@
+From 41c5c2d67d52d3cd57b0ca58a2ce01eaa5fe85b0 Mon Sep 17 00:00:00 2001
+From: Su Sung Chung <Su.Chung@amd.com>
+Date: Wed, 1 May 2019 16:54:56 -0400
+Subject: [PATCH 2021/2940] drm/amd/display: fix calculation of
+ total_data_read_bandwidth
+
+[why]
+by adding fast_validate flag, we are skipping some portion of
+dcn_validate_bandwidth code that is not necessary for mode validation.
+However we have a bug where it does not calculate
+v->total_data_read_bandwidth, which is one of the factors determines the
+result of the validation, and therefore report false positive during
+mode validation.
+
+[how]
+add calculation of v->total_data_read_bandwidth outside of the region
+that is guarded by fast_validate flag
+
+Signed-off-by: Su Sung Chung <Su.Chung@amd.com>
+Reviewed-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+---
+ .../gpu/drm/amd/display/dc/calcs/dcn_calcs.c | 39 ++++++++++++++++++-
+ 1 file changed, 38 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c b/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c
+index d53306de2e16..0a336c80c7bb 100644
+--- a/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c
++++ b/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c
+@@ -711,7 +711,7 @@ bool dcn_validate_bandwidth(
+
+ const struct resource_pool *pool = dc->res_pool;
+ struct dcn_bw_internal_vars *v = &context->dcn_bw_vars;
+- int i, input_idx;
++ int i, input_idx, k;
+ int vesa_sync_start, asic_blank_end, asic_blank_start;
+ bool bw_limit_pass;
+ float bw_limit;
+@@ -1022,6 +1022,43 @@ bool dcn_validate_bandwidth(
+ mode_support_and_system_configuration(v);
+ }
+
++ display_pipe_configuration(v);
++
++ for (k = 0; k <= v->number_of_active_planes - 1; k++) {
++ if (v->source_scan[k] == dcn_bw_hor)
++ v->swath_width_y[k] = v->viewport_width[k] / v->dpp_per_plane[k];
++ else
++ v->swath_width_y[k] = v->viewport_height[k] / v->dpp_per_plane[k];
++ }
++ for (k = 0; k <= v->number_of_active_planes - 1; k++) {
++ if (v->source_pixel_format[k] == dcn_bw_rgb_sub_64) {
++ v->byte_per_pixel_dety[k] = 8.0;
++ v->byte_per_pixel_detc[k] = 0.0;
++ } else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_32) {
++ v->byte_per_pixel_dety[k] = 4.0;
++ v->byte_per_pixel_detc[k] = 0.0;
++ } else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_16) {
++ v->byte_per_pixel_dety[k] = 2.0;
++ v->byte_per_pixel_detc[k] = 0.0;
++ } else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_8) {
++ v->byte_per_pixel_dety[k] = 1.0;
++ v->byte_per_pixel_detc[k] = 2.0;
++ } else {
++ v->byte_per_pixel_dety[k] = 4.0f / 3.0f;
++ v->byte_per_pixel_detc[k] = 8.0f / 3.0f;
++ }
++ }
++
++ v->total_data_read_bandwidth = 0.0;
++ for (k = 0; k <= v->number_of_active_planes - 1; k++) {
++ v->read_bandwidth_plane_luma[k] = v->swath_width_y[k] * v->dpp_per_plane[k] *
++ dcn_bw_ceil2(v->byte_per_pixel_dety[k], 1.0) / (v->htotal[k] / v->pixel_clock[k]) * v->v_ratio[k];
++ v->read_bandwidth_plane_chroma[k] = v->swath_width_y[k] / 2.0 * v->dpp_per_plane[k] *
++ dcn_bw_ceil2(v->byte_per_pixel_detc[k], 2.0) / (v->htotal[k] / v->pixel_clock[k]) * v->v_ratio[k] / 2.0;
++ v->total_data_read_bandwidth = v->total_data_read_bandwidth +
++ v->read_bandwidth_plane_luma[k] + v->read_bandwidth_plane_chroma[k];
++ }
++
+ BW_VAL_TRACE_END_VOLTAGE_LEVEL();
+
+ if (v->voltage_level != number_of_states_plus_one && !fast_validate) {
+--
+2.17.1
+