Commit da1043cf authored by Eric Bernstein's avatar Eric Bernstein Committed by Alex Deucher

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: default avatarEric Bernstein <eric.bernstein@amd.com>
Reviewed-by: default avatarDmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Acked-by: default avatarLeo Li <sunpeng.li@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 60a804c8
...@@ -51,10 +51,6 @@ ...@@ -51,10 +51,6 @@
#define NUM_ELEMENTS(a) (sizeof(a) / sizeof((a)[0])) #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 { enum dcn10_coef_filter_type_sel {
SCL_COEF_LUMA_VERT_FILTER = 0, SCL_COEF_LUMA_VERT_FILTER = 0,
...@@ -99,7 +95,7 @@ enum gamut_remap_select { ...@@ -99,7 +95,7 @@ enum gamut_remap_select {
GAMUT_REMAP_COMB_COEFF 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, {COLOR_SPACE_SRGB,
{0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0} }, {0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0} },
{COLOR_SPACE_SRGB_LIMITED, {COLOR_SPACE_SRGB_LIMITED,
...@@ -454,7 +450,7 @@ void dpp1_program_input_csc( ...@@ -454,7 +450,7 @@ void dpp1_program_input_csc(
{ {
struct dcn10_dpp *dpp = TO_DCN10_DPP(dpp_base); struct dcn10_dpp *dpp = TO_DCN10_DPP(dpp_base);
int i; 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; const uint16_t *regval = NULL;
uint32_t cur_select = 0; uint32_t cur_select = 0;
enum dcn10_input_csc_select select; enum dcn10_input_csc_select select;
...@@ -467,8 +463,8 @@ void dpp1_program_input_csc( ...@@ -467,8 +463,8 @@ void dpp1_program_input_csc(
if (tbl_entry == NULL) { if (tbl_entry == NULL) {
for (i = 0; i < arr_size; i++) for (i = 0; i < arr_size; i++)
if (dcn10_input_csc_matrix[i].color_space == color_space) { if (dpp_input_csc_matrix[i].color_space == color_space) {
regval = dcn10_input_csc_matrix[i].regval; regval = dpp_input_csc_matrix[i].regval;
break; break;
} }
......
...@@ -275,14 +275,16 @@ void hubbub1_program_watermarks( ...@@ -275,14 +275,16 @@ void hubbub1_program_watermarks(
watermarks->a.urgent_ns, prog_wm_value); watermarks->a.urgent_ns, prog_wm_value);
} }
if (safe_to_lower || watermarks->a.pte_meta_urgent_ns > hubbub->watermarks.a.pte_meta_urgent_ns) { if (REG(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A)) {
hubbub->watermarks.a.pte_meta_urgent_ns = watermarks->a.pte_meta_urgent_ns; if (safe_to_lower || watermarks->a.pte_meta_urgent_ns > hubbub->watermarks.a.pte_meta_urgent_ns) {
prog_wm_value = convert_and_clamp(watermarks->a.pte_meta_urgent_ns, hubbub->watermarks.a.pte_meta_urgent_ns = watermarks->a.pte_meta_urgent_ns;
refclk_mhz, 0x1fffff); prog_wm_value = convert_and_clamp(watermarks->a.pte_meta_urgent_ns,
REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A, prog_wm_value); refclk_mhz, 0x1fffff);
DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_A calculated =%d\n" REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A, prog_wm_value);
"HW register value = 0x%x\n", DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_A calculated =%d\n"
watermarks->a.pte_meta_urgent_ns, prog_wm_value); "HW register value = 0x%x\n",
watermarks->a.pte_meta_urgent_ns, prog_wm_value);
}
} }
if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A)) { if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A)) {
...@@ -338,14 +340,16 @@ void hubbub1_program_watermarks( ...@@ -338,14 +340,16 @@ void hubbub1_program_watermarks(
watermarks->b.urgent_ns, prog_wm_value); watermarks->b.urgent_ns, prog_wm_value);
} }
if (safe_to_lower || watermarks->b.pte_meta_urgent_ns > hubbub->watermarks.b.pte_meta_urgent_ns) { if (REG(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B)) {
hubbub->watermarks.b.pte_meta_urgent_ns = watermarks->b.pte_meta_urgent_ns; if (safe_to_lower || watermarks->b.pte_meta_urgent_ns > hubbub->watermarks.b.pte_meta_urgent_ns) {
prog_wm_value = convert_and_clamp(watermarks->b.pte_meta_urgent_ns, hubbub->watermarks.b.pte_meta_urgent_ns = watermarks->b.pte_meta_urgent_ns;
refclk_mhz, 0x1fffff); prog_wm_value = convert_and_clamp(watermarks->b.pte_meta_urgent_ns,
REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B, prog_wm_value); refclk_mhz, 0x1fffff);
DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_B calculated =%d\n" REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B, prog_wm_value);
"HW register value = 0x%x\n", DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_B calculated =%d\n"
watermarks->b.pte_meta_urgent_ns, prog_wm_value); "HW register value = 0x%x\n",
watermarks->b.pte_meta_urgent_ns, prog_wm_value);
}
} }
if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B)) { if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B)) {
...@@ -401,14 +405,16 @@ void hubbub1_program_watermarks( ...@@ -401,14 +405,16 @@ void hubbub1_program_watermarks(
watermarks->c.urgent_ns, prog_wm_value); watermarks->c.urgent_ns, prog_wm_value);
} }
if (safe_to_lower || watermarks->c.pte_meta_urgent_ns > hubbub->watermarks.c.pte_meta_urgent_ns) { if (REG(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C)) {
hubbub->watermarks.c.pte_meta_urgent_ns = watermarks->c.pte_meta_urgent_ns; if (safe_to_lower || watermarks->c.pte_meta_urgent_ns > hubbub->watermarks.c.pte_meta_urgent_ns) {
prog_wm_value = convert_and_clamp(watermarks->c.pte_meta_urgent_ns, hubbub->watermarks.c.pte_meta_urgent_ns = watermarks->c.pte_meta_urgent_ns;
refclk_mhz, 0x1fffff); prog_wm_value = convert_and_clamp(watermarks->c.pte_meta_urgent_ns,
REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C, prog_wm_value); refclk_mhz, 0x1fffff);
DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_C calculated =%d\n" REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C, prog_wm_value);
"HW register value = 0x%x\n", DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_C calculated =%d\n"
watermarks->c.pte_meta_urgent_ns, prog_wm_value); "HW register value = 0x%x\n",
watermarks->c.pte_meta_urgent_ns, prog_wm_value);
}
} }
if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C)) { if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C)) {
...@@ -464,14 +470,16 @@ void hubbub1_program_watermarks( ...@@ -464,14 +470,16 @@ void hubbub1_program_watermarks(
watermarks->d.urgent_ns, prog_wm_value); watermarks->d.urgent_ns, prog_wm_value);
} }
if (safe_to_lower || watermarks->d.pte_meta_urgent_ns > hubbub->watermarks.d.pte_meta_urgent_ns) { if (REG(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D)) {
hubbub->watermarks.d.pte_meta_urgent_ns = watermarks->d.pte_meta_urgent_ns; if (safe_to_lower || watermarks->d.pte_meta_urgent_ns > hubbub->watermarks.d.pte_meta_urgent_ns) {
prog_wm_value = convert_and_clamp(watermarks->d.pte_meta_urgent_ns, hubbub->watermarks.d.pte_meta_urgent_ns = watermarks->d.pte_meta_urgent_ns;
refclk_mhz, 0x1fffff); prog_wm_value = convert_and_clamp(watermarks->d.pte_meta_urgent_ns,
REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D, prog_wm_value); refclk_mhz, 0x1fffff);
DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_D calculated =%d\n" REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D, prog_wm_value);
"HW register value = 0x%x\n", DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_D calculated =%d\n"
watermarks->d.pte_meta_urgent_ns, prog_wm_value); "HW register value = 0x%x\n",
watermarks->d.pte_meta_urgent_ns, prog_wm_value);
}
} }
if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D)) { if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D)) {
...@@ -837,6 +845,7 @@ static const struct hubbub_funcs hubbub1_funcs = { ...@@ -837,6 +845,7 @@ static const struct hubbub_funcs hubbub1_funcs = {
.dcc_support_swizzle = hubbub1_dcc_support_swizzle, .dcc_support_swizzle = hubbub1_dcc_support_swizzle,
.dcc_support_pixel_format = hubbub1_dcc_support_pixel_format, .dcc_support_pixel_format = hubbub1_dcc_support_pixel_format,
.get_dcc_compression_cap = hubbub1_get_dcc_compression_cap, .get_dcc_compression_cap = hubbub1_get_dcc_compression_cap,
.wm_read_state = hubbub1_wm_read_state,
}; };
void hubbub1_construct(struct hubbub *hubbub, void hubbub1_construct(struct hubbub *hubbub,
......
...@@ -165,18 +165,6 @@ struct dcn_hubbub_mask { ...@@ -165,18 +165,6 @@ struct dcn_hubbub_mask {
struct dc; 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 { struct hubbub {
const struct hubbub_funcs *funcs; const struct hubbub_funcs *funcs;
......
...@@ -95,7 +95,7 @@ void dcn10_log_hubbub_state(struct dc *dc, struct dc_log_buffer_ctx *log_ctx) ...@@ -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}; struct dcn_hubbub_wm wm = {0};
int i; 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" DTN_INFO("HUBBUB WM: data_urgent pte_meta_urgent"
" sr_enter sr_exit dram_clk_change\n"); " sr_enter sr_exit dram_clk_change\n");
......
...@@ -81,7 +81,7 @@ static unsigned int dcn10_get_hubbub_state(struct dc *dc, char *pBuf, unsigned i ...@@ -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; const uint32_t ref_clk_mhz = dc_ctx->dc->res_pool->ref_clock_inKhz / 1000;
static const unsigned int frac = 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"); 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; remaining_buffer -= chars_printed;
......
...@@ -299,16 +299,17 @@ void optc1_program_timing( ...@@ -299,16 +299,17 @@ void optc1_program_timing(
} }
/* Interlace */ /* Interlace */
if (patched_crtc_timing.flags.INTERLACE == 1) { if (REG(OTG_INTERLACE_CONTROL)) {
REG_UPDATE(OTG_INTERLACE_CONTROL, if (patched_crtc_timing.flags.INTERLACE == 1) {
OTG_INTERLACE_ENABLE, 1); REG_UPDATE(OTG_INTERLACE_CONTROL,
v_init = v_init / 2; OTG_INTERLACE_ENABLE, 1);
if ((optc->dlg_otg_param.vstartup_start/2)*2 > asic_blank_end) v_init = v_init / 2;
v_fp2 = v_fp2 / 2; if ((optc->dlg_otg_param.vstartup_start/2)*2 > asic_blank_end)
} else v_fp2 = v_fp2 / 2;
REG_UPDATE(OTG_INTERLACE_CONTROL, } else
OTG_INTERLACE_ENABLE, 0); REG_UPDATE(OTG_INTERLACE_CONTROL,
OTG_INTERLACE_ENABLE, 0);
}
/* VTG enable set to 0 first VInit */ /* VTG enable set to 0 first VInit */
REG_UPDATE(CONTROL, REG_UPDATE(CONTROL,
......
...@@ -39,6 +39,18 @@ enum segment_order { ...@@ -39,6 +39,18 @@ enum segment_order {
segment_order__non_contiguous, 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 { struct hubbub_funcs {
void (*update_dchub)( void (*update_dchub)(
...@@ -58,6 +70,9 @@ struct hubbub_funcs { ...@@ -58,6 +70,9 @@ struct hubbub_funcs {
bool (*dcc_support_pixel_format)( bool (*dcc_support_pixel_format)(
enum surface_pixel_format format, enum surface_pixel_format format,
unsigned int *bytes_per_element); unsigned int *bytes_per_element);
void (*wm_read_state)(struct hubbub *hubbub,
struct dcn_hubbub_wm *wm);
}; };
......
...@@ -39,6 +39,11 @@ struct dpp { ...@@ -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 dpp_grph_csc_adjustment {
struct fixed31_32 temperature_matrix[CSC_TEMPERATURE_MATRIX_SIZE]; struct fixed31_32 temperature_matrix[CSC_TEMPERATURE_MATRIX_SIZE];
enum graphics_gamut_adjust_type gamut_adjust_type; enum graphics_gamut_adjust_type gamut_adjust_type;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment