aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3719-drm-amd-display-Isolate-DSC-module-from-driver-depen.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3719-drm-amd-display-Isolate-DSC-module-from-driver-depen.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3719-drm-amd-display-Isolate-DSC-module-from-driver-depen.patch399
1 files changed, 399 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3719-drm-amd-display-Isolate-DSC-module-from-driver-depen.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3719-drm-amd-display-Isolate-DSC-module-from-driver-depen.patch
new file mode 100644
index 00000000..0764fc80
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3719-drm-amd-display-Isolate-DSC-module-from-driver-depen.patch
@@ -0,0 +1,399 @@
+From d7ed4b19e517d7da8b66c7ace112b587e968946e Mon Sep 17 00:00:00 2001
+From: Bayan Zabihiyan <bayan.zabihiyan@amd.com>
+Date: Mon, 19 Aug 2019 15:18:43 -0400
+Subject: [PATCH 3719/4256] drm/amd/display: Isolate DSC module from driver
+ dependencies
+
+[Why]
+Edid Utility wishes to include DSC module from driver instead
+of doing it's own logic which will need to be updated every time
+someone modifies the driver logic.
+
+[How]
+Modify some functions such that we dont need to pass the entire
+DC structure as parameter.
+-Remove DC inclusion from module.
+-Filter out problematic types and inclusions
+
+Signed-off-by: Bayan Zabihiyan <bayan.zabihiyan@amd.com>
+Reviewed-by: Jun Lei <Jun.Lei@amd.com>
+Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
+---
+ .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 +-
+ drivers/gpu/drm/amd/display/dc/dc_dsc.h | 14 +++-
+ drivers/gpu/drm/amd/display/dc/dc_hw_types.h | 57 ++++++++------
+ drivers/gpu/drm/amd/display/dc/dc_types.h | 9 +++
+ drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c | 75 ++++++++++++++++---
+ drivers/gpu/drm/amd/display/dc/inc/hw/dsc.h | 12 ++-
+ 6 files changed, 125 insertions(+), 45 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+index ad585734095b..65aff741befb 100644
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+@@ -3691,8 +3691,9 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
+ dc_link_get_link_cap(aconnector->dc_link));
+
+ if (dsc_caps.is_dsc_supported)
+- if (dc_dsc_compute_config(aconnector->dc_link->ctx->dc,
++ if (dc_dsc_compute_config(aconnector->dc_link->ctx->dc->res_pool->dscs[0],
+ &dsc_caps,
++ aconnector->dc_link->ctx->dc->debug.dsc_min_slice_height_override,
+ link_bandwidth_kbps,
+ &stream->timing,
+ &stream->timing.dsc_cfg))
+diff --git a/drivers/gpu/drm/amd/display/dc/dc_dsc.h b/drivers/gpu/drm/amd/display/dc/dc_dsc.h
+index 6e42209f0e20..0ed2962add5a 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc_dsc.h
++++ b/drivers/gpu/drm/amd/display/dc/dc_dsc.h
+@@ -30,6 +30,7 @@
+ #define DP_DSC_BRANCH_OVERALL_THROUGHPUT_0 0x0a0 /* DP 1.4a SCR */
+ #define DP_DSC_BRANCH_OVERALL_THROUGHPUT_1 0x0a1
+ #define DP_DSC_BRANCH_MAX_LINE_WIDTH 0x0a2
++#include "dc_types.h"
+
+ struct dc_dsc_bw_range {
+ uint32_t min_kbps; /* Bandwidth if min_target_bpp_x16 is used */
+@@ -39,13 +40,21 @@ struct dc_dsc_bw_range {
+ uint32_t stream_kbps; /* Uncompressed stream bandwidth */
+ };
+
++struct display_stream_compressor {
++ const struct dsc_funcs *funcs;
++#ifndef AMD_EDID_UTILITY
++ struct dc_context *ctx;
++ int inst;
++#endif
++};
+
+ bool dc_dsc_parse_dsc_dpcd(const uint8_t *dpcd_dsc_basic_data,
+ const uint8_t *dpcd_dsc_ext_data,
+ struct dsc_dec_dpcd_caps *dsc_sink_caps);
+
+ bool dc_dsc_compute_bandwidth_range(
+- const struct dc *dc,
++ const struct display_stream_compressor *dsc,
++ const uint32_t dsc_min_slice_height_override,
+ const uint32_t min_kbps,
+ const uint32_t max_kbps,
+ const struct dsc_dec_dpcd_caps *dsc_sink_caps,
+@@ -53,8 +62,9 @@ bool dc_dsc_compute_bandwidth_range(
+ struct dc_dsc_bw_range *range);
+
+ bool dc_dsc_compute_config(
+- const struct dc *dc,
++ const struct display_stream_compressor *dsc,
+ const struct dsc_dec_dpcd_caps *dsc_sink_caps,
++ const uint32_t dsc_min_slice_height_override,
+ uint32_t target_bandwidth_kbps,
+ const struct dc_crtc_timing *timing,
+ struct dc_dsc_config *dsc_cfg);
+diff --git a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
+index dafc19a7b699..2869b26d966a 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
++++ b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
+@@ -26,6 +26,8 @@
+ #ifndef DC_HW_TYPES_H
+ #define DC_HW_TYPES_H
+
++#ifndef AMD_EDID_UTILITY
++
+ #include "os_types.h"
+ #include "fixed31_32.h"
+ #include "signal_types.h"
+@@ -587,6 +589,8 @@ struct scaling_taps {
+ bool integer_scaling;
+ };
+
++#endif /* AMD_EDID_UTILITY */
++
+ enum dc_timing_standard {
+ DC_TIMING_STANDARD_UNDEFINED,
+ DC_TIMING_STANDARD_DMT,
+@@ -708,30 +712,6 @@ enum dc_timing_3d_format {
+ TIMING_3D_FORMAT_MAX,
+ };
+
+-enum trigger_delay {
+- TRIGGER_DELAY_NEXT_PIXEL = 0,
+- TRIGGER_DELAY_NEXT_LINE,
+-};
+-
+-enum crtc_event {
+- CRTC_EVENT_VSYNC_RISING = 0,
+- CRTC_EVENT_VSYNC_FALLING
+-};
+-
+-struct crtc_trigger_info {
+- bool enabled;
+- struct dc_stream_state *event_source;
+- enum crtc_event event;
+- enum trigger_delay delay;
+-};
+-
+-struct dc_crtc_timing_adjust {
+- uint32_t v_total_min;
+- uint32_t v_total_max;
+- uint32_t v_total_mid;
+- uint32_t v_total_mid_frame_num;
+-};
+-
+ #ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
+ struct dc_dsc_config {
+ uint32_t num_slices_h; /* Number of DSC slices - horizontal */
+@@ -775,6 +755,33 @@ struct dc_crtc_timing {
+ #endif
+ };
+
++#ifndef AMD_EDID_UTILITY
++
++enum trigger_delay {
++ TRIGGER_DELAY_NEXT_PIXEL = 0,
++ TRIGGER_DELAY_NEXT_LINE,
++};
++
++enum crtc_event {
++ CRTC_EVENT_VSYNC_RISING = 0,
++ CRTC_EVENT_VSYNC_FALLING
++};
++
++struct crtc_trigger_info {
++ bool enabled;
++ struct dc_stream_state *event_source;
++ enum crtc_event event;
++ enum trigger_delay delay;
++};
++
++struct dc_crtc_timing_adjust {
++ uint32_t v_total_min;
++ uint32_t v_total_max;
++ uint32_t v_total_mid;
++ uint32_t v_total_mid_frame_num;
++};
++
++
+ /* Passed on init */
+ enum vram_type {
+ VIDEO_MEMORY_TYPE_GDDR5 = 2,
+@@ -845,5 +852,7 @@ struct tg_color {
+ uint16_t color_b_cb;
+ };
+
++#endif /* AMD_EDID_UTILITY */
++
+ #endif /* DC_HW_TYPES_H */
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dc_types.h b/drivers/gpu/drm/amd/display/dc/dc_types.h
+index f4ccdb2e3c32..ed60bf011af2 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc_types.h
++++ b/drivers/gpu/drm/amd/display/dc/dc_types.h
+@@ -25,6 +25,11 @@
+ #ifndef DC_TYPES_H_
+ #define DC_TYPES_H_
+
++#ifndef AMD_EDID_UTILITY
++/* AND EdidUtility only needs a portion
++ * of this file, including the rest only
++ * causes additional issues.
++ */
+ #include "os_types.h"
+ #include "fixed31_32.h"
+ #include "irq_types.h"
+@@ -754,6 +759,9 @@ struct dc_clock_config {
+ uint32_t current_clock_khz;/*current clock in use*/
+ };
+
++#endif /*AMD_EDID_UTILITY*/
++//AMD EDID UTILITY does not need any of the above structures
++
+ #ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
+ /* DSC DPCD capabilities */
+ union dsc_slice_caps1 {
+@@ -825,4 +833,5 @@ struct dsc_dec_dpcd_caps {
+ uint32_t branch_max_line_width;
+ };
+ #endif
++
+ #endif /* DC_TYPES_H_ */
+diff --git a/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c b/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c
+index 929ebd4cfb8c..e60f760585e4 100644
+--- a/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c
++++ b/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c
+@@ -23,8 +23,7 @@
+ */
+
+ #ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
+-#include "dc.h"
+-#include "core_types.h"
++#include "dc_hw_types.h"
+ #include "dsc.h"
+ #include <drm/drm_dp_helper.h>
+
+@@ -47,6 +46,59 @@ const struct dc_dsc_policy dsc_policy = {
+
+ /* This module's internal functions */
+
++static uint32_t dc_dsc_bandwidth_in_kbps_from_timing(
++ const struct dc_crtc_timing *timing)
++{
++ uint32_t bits_per_channel = 0;
++ uint32_t kbps;
++
++ if (timing->flags.DSC) {
++ kbps = (timing->pix_clk_100hz * timing->dsc_cfg.bits_per_pixel);
++ kbps = kbps / 160 + ((kbps % 160) ? 1 : 0);
++ return 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 bool dsc_buff_block_size_from_dpcd(int dpcd_buff_block_size, int *buff_block_size)
+ {
+
+@@ -178,12 +230,11 @@ static bool dsc_bpp_increment_div_from_dpcd(int bpp_increment_dpcd, uint32_t *bp
+ }
+
+ static void get_dsc_enc_caps(
+- const struct dc *dc,
++ const struct display_stream_compressor *dsc,
+ struct dsc_enc_caps *dsc_enc_caps,
+ int pixel_clock_100Hz)
+ {
+ // This is a static HW query, so we can use any DSC
+- struct display_stream_compressor *dsc = dc->res_pool->dscs[0];
+
+ memset(dsc_enc_caps, 0, sizeof(struct dsc_enc_caps));
+ if (dsc)
+@@ -290,7 +341,7 @@ static void get_dsc_bandwidth_range(
+ struct dc_dsc_bw_range *range)
+ {
+ /* native stream bandwidth */
+- range->stream_kbps = dc_bandwidth_in_kbps_from_timing(timing);
++ range->stream_kbps = dc_dsc_bandwidth_in_kbps_from_timing(timing);
+
+ /* max dsc target bpp */
+ range->max_kbps = dsc_div_by_10_round_up(max_bpp * timing->pix_clk_100hz);
+@@ -806,7 +857,8 @@ bool dc_dsc_parse_dsc_dpcd(const uint8_t *dpcd_dsc_basic_data, const uint8_t *dp
+ * If DSC is not possible, leave '*range' untouched.
+ */
+ bool dc_dsc_compute_bandwidth_range(
+- const struct dc *dc,
++ const struct display_stream_compressor *dsc,
++ const uint32_t dsc_min_slice_height_override,
+ const uint32_t min_bpp,
+ const uint32_t max_bpp,
+ const struct dsc_dec_dpcd_caps *dsc_sink_caps,
+@@ -818,14 +870,14 @@ bool dc_dsc_compute_bandwidth_range(
+ struct dsc_enc_caps dsc_common_caps;
+ struct dc_dsc_config config;
+
+- get_dsc_enc_caps(dc, &dsc_enc_caps, timing->pix_clk_100hz);
++ get_dsc_enc_caps(dsc, &dsc_enc_caps, timing->pix_clk_100hz);
+
+ is_dsc_possible = intersect_dsc_caps(dsc_sink_caps, &dsc_enc_caps,
+ timing->pixel_encoding, &dsc_common_caps);
+
+ if (is_dsc_possible)
+ is_dsc_possible = setup_dsc_config(dsc_sink_caps, &dsc_enc_caps, 0, timing,
+- dc->debug.dsc_min_slice_height_override, &config);
++ dsc_min_slice_height_override, &config);
+
+ if (is_dsc_possible)
+ get_dsc_bandwidth_range(min_bpp, max_bpp, &dsc_common_caps, timing, range);
+@@ -834,8 +886,9 @@ bool dc_dsc_compute_bandwidth_range(
+ }
+
+ bool dc_dsc_compute_config(
+- const struct dc *dc,
++ const struct display_stream_compressor *dsc,
+ const struct dsc_dec_dpcd_caps *dsc_sink_caps,
++ const uint32_t dsc_min_slice_height_override,
+ uint32_t target_bandwidth_kbps,
+ const struct dc_crtc_timing *timing,
+ struct dc_dsc_config *dsc_cfg)
+@@ -843,11 +896,11 @@ bool dc_dsc_compute_config(
+ bool is_dsc_possible = false;
+ struct dsc_enc_caps dsc_enc_caps;
+
+- get_dsc_enc_caps(dc, &dsc_enc_caps, timing->pix_clk_100hz);
++ get_dsc_enc_caps(dsc, &dsc_enc_caps, timing->pix_clk_100hz);
+ is_dsc_possible = setup_dsc_config(dsc_sink_caps,
+ &dsc_enc_caps,
+ target_bandwidth_kbps,
+- timing, dc->debug.dsc_min_slice_height_override, dsc_cfg);
++ timing, dsc_min_slice_height_override, dsc_cfg);
+ return is_dsc_possible;
+ }
+ #endif /* CONFIG_DRM_AMD_DC_DSC_SUPPORT */
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dsc.h b/drivers/gpu/drm/amd/display/dc/inc/hw/dsc.h
+index 1ddb1c6fa149..c6ff3d78b435 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/hw/dsc.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/dsc.h
+@@ -28,7 +28,11 @@
+
+ #include "dc_dsc.h"
+ #include "dc_hw_types.h"
+-#include "dc_dp_types.h"
++#include "dc_types.h"
++/* do not include any other headers
++ * or else it might break Edid Utility functionality.
++ */
++
+
+ /* Input parameters for configuring DSC from the outside of DSC */
+ struct dsc_config {
+@@ -81,12 +85,6 @@ struct dsc_enc_caps {
+ uint32_t bpp_increment_div; /* bpp increment divisor, e.g. if 16, it's 1/16th of a bit */
+ };
+
+-struct display_stream_compressor {
+- const struct dsc_funcs *funcs;
+- struct dc_context *ctx;
+- int inst;
+-};
+-
+ struct dsc_funcs {
+ void (*dsc_get_enc_caps)(struct dsc_enc_caps *dsc_enc_caps, int pixel_clock_100Hz);
+ void (*dsc_read_state)(struct display_stream_compressor *dsc, struct dcn_dsc_state *s);
+--
+2.17.1
+