Commit 3e27e10e authored by Mikita Lipski's avatar Mikita Lipski Committed by Alex Deucher

drm/amd/display: Don't share clk source between DP and HDMI

[why]
Prevent clock source sharing between HDMI and DP connectors.
DP shouldn't be sharing its ref clock with phy clock,
which caused an issue of older ASICS booting up with multiple
diplays plugged in.

[how]
Add an extra check that would prevent HDMI and DP sharing clk.
Signed-off-by: default avatarMikita Lipski <mikita.lipski@amd.com>
Reviewed-by: default avatarHersen Wu <hersenxs.wu@amd.com>
Acked-by: default avatarBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
parent 9315e239
...@@ -330,6 +330,9 @@ bool resource_are_streams_timing_synchronizable( ...@@ -330,6 +330,9 @@ bool resource_are_streams_timing_synchronizable(
!= stream2->timing.pix_clk_khz) != stream2->timing.pix_clk_khz)
return false; return false;
if (stream1->clamping.c_depth != stream2->clamping.c_depth)
return false;
if (stream1->phy_pix_clk != stream2->phy_pix_clk if (stream1->phy_pix_clk != stream2->phy_pix_clk
&& (!dc_is_dp_signal(stream1->signal) && (!dc_is_dp_signal(stream1->signal)
|| !dc_is_dp_signal(stream2->signal))) || !dc_is_dp_signal(stream2->signal)))
...@@ -337,6 +340,20 @@ bool resource_are_streams_timing_synchronizable( ...@@ -337,6 +340,20 @@ bool resource_are_streams_timing_synchronizable(
return true; return true;
} }
static bool is_dp_and_hdmi_sharable(
struct dc_stream_state *stream1,
struct dc_stream_state *stream2)
{
if (stream1->ctx->dc->caps.disable_dp_clk_share)
return false;
if (stream1->clamping.c_depth != COLOR_DEPTH_888 ||
stream2->clamping.c_depth != COLOR_DEPTH_888)
return false;
return true;
}
static bool is_sharable_clk_src( static bool is_sharable_clk_src(
const struct pipe_ctx *pipe_with_clk_src, const struct pipe_ctx *pipe_with_clk_src,
...@@ -348,7 +365,10 @@ static bool is_sharable_clk_src( ...@@ -348,7 +365,10 @@ static bool is_sharable_clk_src(
if (pipe_with_clk_src->stream->signal == SIGNAL_TYPE_VIRTUAL) if (pipe_with_clk_src->stream->signal == SIGNAL_TYPE_VIRTUAL)
return false; return false;
if (dc_is_dp_signal(pipe_with_clk_src->stream->signal)) if (dc_is_dp_signal(pipe_with_clk_src->stream->signal) ||
(dc_is_dp_signal(pipe->stream->signal) &&
!is_dp_and_hdmi_sharable(pipe_with_clk_src->stream,
pipe->stream)))
return false; return false;
if (dc_is_hdmi_signal(pipe_with_clk_src->stream->signal) if (dc_is_hdmi_signal(pipe_with_clk_src->stream->signal)
......
...@@ -78,6 +78,7 @@ struct dc_caps { ...@@ -78,6 +78,7 @@ struct dc_caps {
bool dual_link_dvi; bool dual_link_dvi;
bool post_blend_color_processing; bool post_blend_color_processing;
bool force_dp_tps4_for_cp2520; bool force_dp_tps4_for_cp2520;
bool disable_dp_clk_share;
}; };
struct dc_dcc_surface_param { struct dc_dcc_surface_param {
......
...@@ -919,7 +919,7 @@ static bool construct( ...@@ -919,7 +919,7 @@ static bool construct(
dc->caps.i2c_speed_in_khz = 40; dc->caps.i2c_speed_in_khz = 40;
dc->caps.max_cursor_size = 128; dc->caps.max_cursor_size = 128;
dc->caps.dual_link_dvi = true; dc->caps.dual_link_dvi = true;
dc->caps.disable_dp_clk_share = true;
for (i = 0; i < pool->base.pipe_count; i++) { for (i = 0; i < pool->base.pipe_count; i++) {
pool->base.timing_generators[i] = pool->base.timing_generators[i] =
dce100_timing_generator_create( dce100_timing_generator_create(
......
...@@ -946,6 +946,7 @@ static bool dce80_construct( ...@@ -946,6 +946,7 @@ static bool dce80_construct(
} }
dc->caps.max_planes = pool->base.pipe_count; dc->caps.max_planes = pool->base.pipe_count;
dc->caps.disable_dp_clk_share = true;
if (!resource_construct(num_virtual_links, dc, &pool->base, if (!resource_construct(num_virtual_links, dc, &pool->base,
&res_create_funcs)) &res_create_funcs))
...@@ -1131,6 +1132,7 @@ static bool dce81_construct( ...@@ -1131,6 +1132,7 @@ static bool dce81_construct(
} }
dc->caps.max_planes = pool->base.pipe_count; dc->caps.max_planes = pool->base.pipe_count;
dc->caps.disable_dp_clk_share = true;
if (!resource_construct(num_virtual_links, dc, &pool->base, if (!resource_construct(num_virtual_links, dc, &pool->base,
&res_create_funcs)) &res_create_funcs))
...@@ -1312,6 +1314,7 @@ static bool dce83_construct( ...@@ -1312,6 +1314,7 @@ static bool dce83_construct(
} }
dc->caps.max_planes = pool->base.pipe_count; dc->caps.max_planes = pool->base.pipe_count;
dc->caps.disable_dp_clk_share = true;
if (!resource_construct(num_virtual_links, dc, &pool->base, if (!resource_construct(num_virtual_links, dc, &pool->base,
&res_create_funcs)) &res_create_funcs))
......
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