OSDN Git Service

drm/amd/display: Fix runtime errors for diagnostic tests
authorEric Bernstein <eric.bernstein@amd.com>
Fri, 9 Nov 2018 21:51:55 +0000 (16:51 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 14 Jan 2019 20:04:32 +0000 (15:04 -0500)
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>
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_cm.c
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer_debug.c
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c
drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h
drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h

index 116977e..41f0f4c 100644 (file)
 
 #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;
                        }
 
index c7d1e67..eb31a5e 100644 (file)
@@ -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,
index d0f03d1..aca6763 100644 (file)
@@ -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;
index 91e015e..f001edd 100644 (file)
@@ -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");
index cd46901..8217582 100644 (file)
@@ -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;
index 7c13861..cdb3f09 100644 (file)
@@ -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,
index 02f757d..dc0bb5b 100644 (file)
@@ -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);
 };
 
 
index e894e64..fb7967b 100644 (file)
@@ -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;