aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1001-drm-amd-display-Fix-runtime-errors-for-diagnostic-te.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1001-drm-amd-display-Fix-runtime-errors-for-diagnostic-te.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1001-drm-amd-display-Fix-runtime-errors-for-diagnostic-te.patch318
1 files changed, 318 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1001-drm-amd-display-Fix-runtime-errors-for-diagnostic-te.patch b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1001-drm-amd-display-Fix-runtime-errors-for-diagnostic-te.patch
new file mode 100644
index 00000000..c459bc9f
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1001-drm-amd-display-Fix-runtime-errors-for-diagnostic-te.patch
@@ -0,0 +1,318 @@
+From 81be5a90726f543ceb0430b65bb089391bf39b0b Mon Sep 17 00:00:00 2001
+From: Eric Bernstein <eric.bernstein@amd.com>
+Date: Fri, 9 Nov 2018 16:51:55 -0500
+Subject: [PATCH 1001/2940] drm/amd/display: Fix runtime errors for diagnostic
+ tests
+
+1) Rename and make public definition of input CSC matrix struct.
+2) Make wm_read_state() function an interface of hubbub, and check
+ if watermark registers exist before read/write to them.
+3) Check if OTG_INTERLACE_CONTROL register exists before updating
+4) Add dummy functions for set_input/output_transfer function to avoid
+ errors due to differences in CM registers.
+5) Added missing register field definition in header file
+
+Signed-off-by: Eric Bernstein <eric.bernstein@amd.com>
+Reviewed-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ .../drm/amd/display/dc/dcn10/dcn10_dpp_cm.c | 12 +--
+ .../drm/amd/display/dc/dcn10/dcn10_hubbub.c | 73 +++++++++++--------
+ .../drm/amd/display/dc/dcn10/dcn10_hubbub.h | 12 ---
+ .../amd/display/dc/dcn10/dcn10_hw_sequencer.c | 2 +-
+ .../dc/dcn10/dcn10_hw_sequencer_debug.c | 2 +-
+ .../gpu/drm/amd/display/dc/dcn10/dcn10_optc.c | 21 +++---
+ .../gpu/drm/amd/display/dc/inc/hw/dchubbub.h | 15 ++++
+ drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h | 5 ++
+ 8 files changed, 78 insertions(+), 64 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c
+index 116977eb24e2..41f0f4c912e7 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c
+@@ -51,10 +51,6 @@
+
+ #define NUM_ELEMENTS(a) (sizeof(a) / sizeof((a)[0]))
+
+-struct dcn10_input_csc_matrix {
+- enum dc_color_space color_space;
+- uint16_t regval[12];
+-};
+
+ enum dcn10_coef_filter_type_sel {
+ SCL_COEF_LUMA_VERT_FILTER = 0,
+@@ -99,7 +95,7 @@ enum gamut_remap_select {
+ GAMUT_REMAP_COMB_COEFF
+ };
+
+-static const struct dcn10_input_csc_matrix dcn10_input_csc_matrix[] = {
++static const struct dpp_input_csc_matrix dpp_input_csc_matrix[] = {
+ {COLOR_SPACE_SRGB,
+ {0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0} },
+ {COLOR_SPACE_SRGB_LIMITED,
+@@ -454,7 +450,7 @@ void dpp1_program_input_csc(
+ {
+ struct dcn10_dpp *dpp = TO_DCN10_DPP(dpp_base);
+ int i;
+- int arr_size = sizeof(dcn10_input_csc_matrix)/sizeof(struct dcn10_input_csc_matrix);
++ int arr_size = sizeof(dpp_input_csc_matrix)/sizeof(struct dpp_input_csc_matrix);
+ const uint16_t *regval = NULL;
+ uint32_t cur_select = 0;
+ enum dcn10_input_csc_select select;
+@@ -467,8 +463,8 @@ void dpp1_program_input_csc(
+
+ if (tbl_entry == NULL) {
+ for (i = 0; i < arr_size; i++)
+- if (dcn10_input_csc_matrix[i].color_space == color_space) {
+- regval = dcn10_input_csc_matrix[i].regval;
++ if (dpp_input_csc_matrix[i].color_space == color_space) {
++ regval = dpp_input_csc_matrix[i].regval;
+ break;
+ }
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c
+index c7d1e678ebf5..eb31a5ed6dff 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c
+@@ -275,14 +275,16 @@ void hubbub1_program_watermarks(
+ watermarks->a.urgent_ns, prog_wm_value);
+ }
+
+- if (safe_to_lower || watermarks->a.pte_meta_urgent_ns > hubbub->watermarks.a.pte_meta_urgent_ns) {
+- hubbub->watermarks.a.pte_meta_urgent_ns = watermarks->a.pte_meta_urgent_ns;
+- prog_wm_value = convert_and_clamp(watermarks->a.pte_meta_urgent_ns,
+- refclk_mhz, 0x1fffff);
+- REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A, prog_wm_value);
+- DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_A calculated =%d\n"
+- "HW register value = 0x%x\n",
+- watermarks->a.pte_meta_urgent_ns, prog_wm_value);
++ if (REG(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A)) {
++ if (safe_to_lower || watermarks->a.pte_meta_urgent_ns > hubbub->watermarks.a.pte_meta_urgent_ns) {
++ hubbub->watermarks.a.pte_meta_urgent_ns = watermarks->a.pte_meta_urgent_ns;
++ prog_wm_value = convert_and_clamp(watermarks->a.pte_meta_urgent_ns,
++ refclk_mhz, 0x1fffff);
++ REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A, prog_wm_value);
++ DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_A calculated =%d\n"
++ "HW register value = 0x%x\n",
++ watermarks->a.pte_meta_urgent_ns, prog_wm_value);
++ }
+ }
+
+ if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A)) {
+@@ -338,14 +340,16 @@ void hubbub1_program_watermarks(
+ watermarks->b.urgent_ns, prog_wm_value);
+ }
+
+- if (safe_to_lower || watermarks->b.pte_meta_urgent_ns > hubbub->watermarks.b.pte_meta_urgent_ns) {
+- hubbub->watermarks.b.pte_meta_urgent_ns = watermarks->b.pte_meta_urgent_ns;
+- prog_wm_value = convert_and_clamp(watermarks->b.pte_meta_urgent_ns,
+- refclk_mhz, 0x1fffff);
+- REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B, prog_wm_value);
+- DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_B calculated =%d\n"
+- "HW register value = 0x%x\n",
+- watermarks->b.pte_meta_urgent_ns, prog_wm_value);
++ if (REG(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B)) {
++ if (safe_to_lower || watermarks->b.pte_meta_urgent_ns > hubbub->watermarks.b.pte_meta_urgent_ns) {
++ hubbub->watermarks.b.pte_meta_urgent_ns = watermarks->b.pte_meta_urgent_ns;
++ prog_wm_value = convert_and_clamp(watermarks->b.pte_meta_urgent_ns,
++ refclk_mhz, 0x1fffff);
++ REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B, prog_wm_value);
++ DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_B calculated =%d\n"
++ "HW register value = 0x%x\n",
++ watermarks->b.pte_meta_urgent_ns, prog_wm_value);
++ }
+ }
+
+ if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B)) {
+@@ -401,14 +405,16 @@ void hubbub1_program_watermarks(
+ watermarks->c.urgent_ns, prog_wm_value);
+ }
+
+- if (safe_to_lower || watermarks->c.pte_meta_urgent_ns > hubbub->watermarks.c.pte_meta_urgent_ns) {
+- hubbub->watermarks.c.pte_meta_urgent_ns = watermarks->c.pte_meta_urgent_ns;
+- prog_wm_value = convert_and_clamp(watermarks->c.pte_meta_urgent_ns,
+- refclk_mhz, 0x1fffff);
+- REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C, prog_wm_value);
+- DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_C calculated =%d\n"
+- "HW register value = 0x%x\n",
+- watermarks->c.pte_meta_urgent_ns, prog_wm_value);
++ if (REG(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C)) {
++ if (safe_to_lower || watermarks->c.pte_meta_urgent_ns > hubbub->watermarks.c.pte_meta_urgent_ns) {
++ hubbub->watermarks.c.pte_meta_urgent_ns = watermarks->c.pte_meta_urgent_ns;
++ prog_wm_value = convert_and_clamp(watermarks->c.pte_meta_urgent_ns,
++ refclk_mhz, 0x1fffff);
++ REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C, prog_wm_value);
++ DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_C calculated =%d\n"
++ "HW register value = 0x%x\n",
++ watermarks->c.pte_meta_urgent_ns, prog_wm_value);
++ }
+ }
+
+ if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C)) {
+@@ -464,14 +470,16 @@ void hubbub1_program_watermarks(
+ watermarks->d.urgent_ns, prog_wm_value);
+ }
+
+- if (safe_to_lower || watermarks->d.pte_meta_urgent_ns > hubbub->watermarks.d.pte_meta_urgent_ns) {
+- hubbub->watermarks.d.pte_meta_urgent_ns = watermarks->d.pte_meta_urgent_ns;
+- prog_wm_value = convert_and_clamp(watermarks->d.pte_meta_urgent_ns,
+- refclk_mhz, 0x1fffff);
+- REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D, prog_wm_value);
+- DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_D calculated =%d\n"
+- "HW register value = 0x%x\n",
+- watermarks->d.pte_meta_urgent_ns, prog_wm_value);
++ if (REG(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D)) {
++ if (safe_to_lower || watermarks->d.pte_meta_urgent_ns > hubbub->watermarks.d.pte_meta_urgent_ns) {
++ hubbub->watermarks.d.pte_meta_urgent_ns = watermarks->d.pte_meta_urgent_ns;
++ prog_wm_value = convert_and_clamp(watermarks->d.pte_meta_urgent_ns,
++ refclk_mhz, 0x1fffff);
++ REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D, prog_wm_value);
++ DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_D calculated =%d\n"
++ "HW register value = 0x%x\n",
++ watermarks->d.pte_meta_urgent_ns, prog_wm_value);
++ }
+ }
+
+ if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D)) {
+@@ -837,6 +845,7 @@ static const struct hubbub_funcs hubbub1_funcs = {
+ .dcc_support_swizzle = hubbub1_dcc_support_swizzle,
+ .dcc_support_pixel_format = hubbub1_dcc_support_pixel_format,
+ .get_dcc_compression_cap = hubbub1_get_dcc_compression_cap,
++ .wm_read_state = hubbub1_wm_read_state,
+ };
+
+ void hubbub1_construct(struct hubbub *hubbub,
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h
+index d0f03d152913..aca67633ee58 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h
+@@ -165,18 +165,6 @@ struct dcn_hubbub_mask {
+
+ struct dc;
+
+-struct dcn_hubbub_wm_set {
+- uint32_t wm_set;
+- uint32_t data_urgent;
+- uint32_t pte_meta_urgent;
+- uint32_t sr_enter;
+- uint32_t sr_exit;
+- uint32_t dram_clk_chanage;
+-};
+-
+-struct dcn_hubbub_wm {
+- struct dcn_hubbub_wm_set sets[4];
+-};
+
+ struct hubbub {
+ const struct hubbub_funcs *funcs;
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+index 4645804f0035..cef17789b744 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+@@ -95,7 +95,7 @@ void dcn10_log_hubbub_state(struct dc *dc, struct dc_log_buffer_ctx *log_ctx)
+ struct dcn_hubbub_wm wm = {0};
+ int i;
+
+- hubbub1_wm_read_state(dc->res_pool->hubbub, &wm);
++ dc->res_pool->hubbub->funcs->wm_read_state(dc->res_pool->hubbub, &wm);
+
+ DTN_INFO("HUBBUB WM: data_urgent pte_meta_urgent"
+ " sr_enter sr_exit dram_clk_change\n");
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer_debug.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer_debug.c
+index cd469014baa3..82175820b0cf 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer_debug.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer_debug.c
+@@ -81,7 +81,7 @@ static unsigned int dcn10_get_hubbub_state(struct dc *dc, char *pBuf, unsigned i
+ const uint32_t ref_clk_mhz = dc_ctx->dc->res_pool->ref_clock_inKhz / 1000;
+ static const unsigned int frac = 1000;
+
+- hubbub1_wm_read_state(dc->res_pool->hubbub, &wm);
++ dc->res_pool->hubbub->funcs->wm_read_state(dc->res_pool->hubbub, &wm);
+
+ chars_printed = snprintf_count(pBuf, remaining_buffer, "wm_set_index,data_urgent,pte_meta_urgent,sr_enter,sr_exit,dram_clk_chanage\n");
+ remaining_buffer -= chars_printed;
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c
+index 7c138615f17d..cdb3f096eb25 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c
+@@ -299,16 +299,17 @@ void optc1_program_timing(
+ }
+
+ /* Interlace */
+- if (patched_crtc_timing.flags.INTERLACE == 1) {
+- REG_UPDATE(OTG_INTERLACE_CONTROL,
+- OTG_INTERLACE_ENABLE, 1);
+- v_init = v_init / 2;
+- if ((optc->dlg_otg_param.vstartup_start/2)*2 > asic_blank_end)
+- v_fp2 = v_fp2 / 2;
+- } else
+- REG_UPDATE(OTG_INTERLACE_CONTROL,
+- OTG_INTERLACE_ENABLE, 0);
+-
++ if (REG(OTG_INTERLACE_CONTROL)) {
++ if (patched_crtc_timing.flags.INTERLACE == 1) {
++ REG_UPDATE(OTG_INTERLACE_CONTROL,
++ OTG_INTERLACE_ENABLE, 1);
++ v_init = v_init / 2;
++ if ((optc->dlg_otg_param.vstartup_start/2)*2 > asic_blank_end)
++ v_fp2 = v_fp2 / 2;
++ } else
++ REG_UPDATE(OTG_INTERLACE_CONTROL,
++ OTG_INTERLACE_ENABLE, 0);
++ }
+
+ /* VTG enable set to 0 first VInit */
+ REG_UPDATE(CONTROL,
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h b/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h
+index 02f757dd70d4..dc0bb5bd8cac 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h
+@@ -39,6 +39,18 @@ enum segment_order {
+ segment_order__non_contiguous,
+ };
+
++struct dcn_hubbub_wm_set {
++ uint32_t wm_set;
++ uint32_t data_urgent;
++ uint32_t pte_meta_urgent;
++ uint32_t sr_enter;
++ uint32_t sr_exit;
++ uint32_t dram_clk_chanage;
++};
++
++struct dcn_hubbub_wm {
++ struct dcn_hubbub_wm_set sets[4];
++};
+
+ struct hubbub_funcs {
+ void (*update_dchub)(
+@@ -58,6 +70,9 @@ struct hubbub_funcs {
+ bool (*dcc_support_pixel_format)(
+ enum surface_pixel_format format,
+ unsigned int *bytes_per_element);
++
++ void (*wm_read_state)(struct hubbub *hubbub,
++ struct dcn_hubbub_wm *wm);
+ };
+
+
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h b/drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h
+index e894e649ce5a..fb7967b39edb 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h
+@@ -39,6 +39,11 @@ struct dpp {
+
+ };
+
++struct dpp_input_csc_matrix {
++ enum dc_color_space color_space;
++ uint16_t regval[12];
++};
++
+ struct dpp_grph_csc_adjustment {
+ struct fixed31_32 temperature_matrix[CSC_TEMPERATURE_MATRIX_SIZE];
+ enum graphics_gamut_adjust_type gamut_adjust_type;
+--
+2.17.1
+