Commit 1c5a2fa9 authored by Michael Strauss's avatar Michael Strauss Committed by Alex Deucher

drm/amd/display: Use correct DTO_SRC_SEL for 128b/132b encoding

[WHY]
DP DTO isn't used for 128b/132b encoding

[HOW]
Check current link rate to determine whether using 8b/10b or 128/132b encoding
Reviewed-by: default avatarNicholas Kazlauskas <Nicholas.Kazlauskas@amd.com>
Acked-by: default avatarAlex Hung <alex.hung@amd.com>
Signed-off-by: default avatarMichael Strauss <michael.strauss@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent cb849b4d
...@@ -7064,6 +7064,7 @@ void dp_enable_link_phy( ...@@ -7064,6 +7064,7 @@ void dp_enable_link_phy(
pipes[i].clock_source->funcs->program_pix_clk( pipes[i].clock_source->funcs->program_pix_clk(
pipes[i].clock_source, pipes[i].clock_source,
&pipes[i].stream_res.pix_clk_params, &pipes[i].stream_res.pix_clk_params,
dp_get_link_encoding_format(link_settings),
&pipes[i].pll_settings); &pipes[i].pll_settings);
} }
} }
......
...@@ -838,6 +838,7 @@ static void dce112_program_pixel_clk_resync( ...@@ -838,6 +838,7 @@ static void dce112_program_pixel_clk_resync(
static bool dce110_program_pix_clk( static bool dce110_program_pix_clk(
struct clock_source *clock_source, struct clock_source *clock_source,
struct pixel_clk_params *pix_clk_params, struct pixel_clk_params *pix_clk_params,
enum dp_link_encoding encoding,
struct pll_settings *pll_settings) struct pll_settings *pll_settings)
{ {
struct dce110_clk_src *clk_src = TO_DCE110_CLK_SRC(clock_source); struct dce110_clk_src *clk_src = TO_DCE110_CLK_SRC(clock_source);
...@@ -911,6 +912,7 @@ static bool dce110_program_pix_clk( ...@@ -911,6 +912,7 @@ static bool dce110_program_pix_clk(
static bool dce112_program_pix_clk( static bool dce112_program_pix_clk(
struct clock_source *clock_source, struct clock_source *clock_source,
struct pixel_clk_params *pix_clk_params, struct pixel_clk_params *pix_clk_params,
enum dp_link_encoding encoding,
struct pll_settings *pll_settings) struct pll_settings *pll_settings)
{ {
struct dce110_clk_src *clk_src = TO_DCE110_CLK_SRC(clock_source); struct dce110_clk_src *clk_src = TO_DCE110_CLK_SRC(clock_source);
...@@ -970,6 +972,7 @@ static bool dce112_program_pix_clk( ...@@ -970,6 +972,7 @@ static bool dce112_program_pix_clk(
static bool dcn31_program_pix_clk( static bool dcn31_program_pix_clk(
struct clock_source *clock_source, struct clock_source *clock_source,
struct pixel_clk_params *pix_clk_params, struct pixel_clk_params *pix_clk_params,
enum dp_link_encoding encoding,
struct pll_settings *pll_settings) struct pll_settings *pll_settings)
{ {
struct dce110_clk_src *clk_src = TO_DCE110_CLK_SRC(clock_source); struct dce110_clk_src *clk_src = TO_DCE110_CLK_SRC(clock_source);
...@@ -993,9 +996,14 @@ static bool dcn31_program_pix_clk( ...@@ -993,9 +996,14 @@ static bool dcn31_program_pix_clk(
#if defined(CONFIG_DRM_AMD_DC_DCN) #if defined(CONFIG_DRM_AMD_DC_DCN)
/* Enable DTO */ /* Enable DTO */
if (clk_src->cs_mask->PIPE0_DTO_SRC_SEL) if (clk_src->cs_mask->PIPE0_DTO_SRC_SEL)
REG_UPDATE_2(PIXEL_RATE_CNTL[inst], if (encoding == DP_128b_132b_ENCODING)
DP_DTO0_ENABLE, 1, REG_UPDATE_2(PIXEL_RATE_CNTL[inst],
PIPE0_DTO_SRC_SEL, 1); DP_DTO0_ENABLE, 1,
PIPE0_DTO_SRC_SEL, 2);
else
REG_UPDATE_2(PIXEL_RATE_CNTL[inst],
DP_DTO0_ENABLE, 1,
PIPE0_DTO_SRC_SEL, 1);
else else
REG_UPDATE(PIXEL_RATE_CNTL[inst], REG_UPDATE(PIXEL_RATE_CNTL[inst],
DP_DTO0_ENABLE, 1); DP_DTO0_ENABLE, 1);
...@@ -1198,12 +1206,13 @@ const struct pixel_rate_range_table_entry *look_up_in_video_optimized_rate_tlb( ...@@ -1198,12 +1206,13 @@ const struct pixel_rate_range_table_entry *look_up_in_video_optimized_rate_tlb(
static bool dcn20_program_pix_clk( static bool dcn20_program_pix_clk(
struct clock_source *clock_source, struct clock_source *clock_source,
struct pixel_clk_params *pix_clk_params, struct pixel_clk_params *pix_clk_params,
enum dp_link_encoding encoding,
struct pll_settings *pll_settings) struct pll_settings *pll_settings)
{ {
struct dce110_clk_src *clk_src = TO_DCE110_CLK_SRC(clock_source); struct dce110_clk_src *clk_src = TO_DCE110_CLK_SRC(clock_source);
unsigned int inst = pix_clk_params->controller_id - CONTROLLER_ID_D0; unsigned int inst = pix_clk_params->controller_id - CONTROLLER_ID_D0;
dce112_program_pix_clk(clock_source, pix_clk_params, pll_settings); dce112_program_pix_clk(clock_source, pix_clk_params, encoding, pll_settings);
if (clock_source->ctx->dc->hwss.enable_vblanks_synchronization && if (clock_source->ctx->dc->hwss.enable_vblanks_synchronization &&
clock_source->ctx->dc->config.vblank_alignment_max_frame_time_diff > 0) { clock_source->ctx->dc->config.vblank_alignment_max_frame_time_diff > 0) {
...@@ -1243,6 +1252,7 @@ static const struct clock_source_funcs dcn20_clk_src_funcs = { ...@@ -1243,6 +1252,7 @@ static const struct clock_source_funcs dcn20_clk_src_funcs = {
static bool dcn3_program_pix_clk( static bool dcn3_program_pix_clk(
struct clock_source *clock_source, struct clock_source *clock_source,
struct pixel_clk_params *pix_clk_params, struct pixel_clk_params *pix_clk_params,
enum dp_link_encoding encoding,
struct pll_settings *pll_settings) struct pll_settings *pll_settings)
{ {
struct dce110_clk_src *clk_src = TO_DCE110_CLK_SRC(clock_source); struct dce110_clk_src *clk_src = TO_DCE110_CLK_SRC(clock_source);
...@@ -1265,7 +1275,7 @@ static bool dcn3_program_pix_clk( ...@@ -1265,7 +1275,7 @@ static bool dcn3_program_pix_clk(
REG_UPDATE(PIXEL_RATE_CNTL[inst], DP_DTO0_ENABLE, 1); REG_UPDATE(PIXEL_RATE_CNTL[inst], DP_DTO0_ENABLE, 1);
} else } else
// For other signal types(HDMI_TYPE_A, DVI) Driver still to call VBIOS Command table // For other signal types(HDMI_TYPE_A, DVI) Driver still to call VBIOS Command table
dce112_program_pix_clk(clock_source, pix_clk_params, pll_settings); dce112_program_pix_clk(clock_source, pix_clk_params, encoding, pll_settings);
return true; return true;
} }
......
...@@ -1435,6 +1435,7 @@ static enum dc_status dce110_enable_stream_timing( ...@@ -1435,6 +1435,7 @@ static enum dc_status dce110_enable_stream_timing(
if (false == pipe_ctx->clock_source->funcs->program_pix_clk( if (false == pipe_ctx->clock_source->funcs->program_pix_clk(
pipe_ctx->clock_source, pipe_ctx->clock_source,
&pipe_ctx->stream_res.pix_clk_params, &pipe_ctx->stream_res.pix_clk_params,
dp_get_link_encoding_format(&pipe_ctx->link_config.dp_link_settings),
&pipe_ctx->pll_settings)) { &pipe_ctx->pll_settings)) {
BREAK_TO_DEBUGGER(); BREAK_TO_DEBUGGER();
return DC_ERROR_UNEXPECTED; return DC_ERROR_UNEXPECTED;
......
...@@ -892,6 +892,7 @@ enum dc_status dcn10_enable_stream_timing( ...@@ -892,6 +892,7 @@ enum dc_status dcn10_enable_stream_timing(
if (false == pipe_ctx->clock_source->funcs->program_pix_clk( if (false == pipe_ctx->clock_source->funcs->program_pix_clk(
pipe_ctx->clock_source, pipe_ctx->clock_source,
&pipe_ctx->stream_res.pix_clk_params, &pipe_ctx->stream_res.pix_clk_params,
dp_get_link_encoding_format(&pipe_ctx->link_config.dp_link_settings),
&pipe_ctx->pll_settings)) { &pipe_ctx->pll_settings)) {
BREAK_TO_DEBUGGER(); BREAK_TO_DEBUGGER();
return DC_ERROR_UNEXPECTED; return DC_ERROR_UNEXPECTED;
......
...@@ -700,6 +700,7 @@ enum dc_status dcn20_enable_stream_timing( ...@@ -700,6 +700,7 @@ enum dc_status dcn20_enable_stream_timing(
if (false == pipe_ctx->clock_source->funcs->program_pix_clk( if (false == pipe_ctx->clock_source->funcs->program_pix_clk(
pipe_ctx->clock_source, pipe_ctx->clock_source,
&pipe_ctx->stream_res.pix_clk_params, &pipe_ctx->stream_res.pix_clk_params,
dp_get_link_encoding_format(&pipe_ctx->link_config.dp_link_settings),
&pipe_ctx->pll_settings)) { &pipe_ctx->pll_settings)) {
BREAK_TO_DEBUGGER(); BREAK_TO_DEBUGGER();
return DC_ERROR_UNEXPECTED; return DC_ERROR_UNEXPECTED;
......
...@@ -160,8 +160,11 @@ struct calc_pll_clock_source { ...@@ -160,8 +160,11 @@ struct calc_pll_clock_source {
struct clock_source_funcs { struct clock_source_funcs {
bool (*cs_power_down)( bool (*cs_power_down)(
struct clock_source *); struct clock_source *);
bool (*program_pix_clk)(struct clock_source *, bool (*program_pix_clk)(
struct pixel_clk_params *, struct pll_settings *); struct clock_source *,
struct pixel_clk_params *,
enum dp_link_encoding encoding,
struct pll_settings *);
uint32_t (*get_pix_clk_dividers)( uint32_t (*get_pix_clk_dividers)(
struct clock_source *, struct clock_source *,
struct pixel_clk_params *, struct pixel_clk_params *,
......
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