]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/amd/display: Don't share clk source between DP and HDMI
authorMikita Lipski <mikita.lipski@amd.com>
Thu, 12 Jul 2018 20:44:05 +0000 (16:44 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 6 Aug 2018 19:35:43 +0000 (14:35 -0500)
[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: Mikita Lipski <mikita.lipski@amd.com>
Reviewed-by: Hersen Wu <hersenxs.wu@amd.com>
Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/display/dc/core/dc_resource.c
drivers/gpu/drm/amd/display/dc/dc.h
drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c

index 2e65715f76a1ce0ad95f89a7fe47ba672320add3..4ca41d6e3bcf2cb89dce5227eed4cf55add06236 100644 (file)
@@ -330,6 +330,9 @@ bool resource_are_streams_timing_synchronizable(
                                != stream2->timing.pix_clk_khz)
                return false;
 
+       if (stream1->clamping.c_depth != stream2->clamping.c_depth)
+               return false;
+
        if (stream1->phy_pix_clk != stream2->phy_pix_clk
                        && (!dc_is_dp_signal(stream1->signal)
                        || !dc_is_dp_signal(stream2->signal)))
@@ -337,6 +340,20 @@ bool resource_are_streams_timing_synchronizable(
 
        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(
        const struct pipe_ctx *pipe_with_clk_src,
@@ -348,7 +365,10 @@ static bool is_sharable_clk_src(
        if (pipe_with_clk_src->stream->signal == SIGNAL_TYPE_VIRTUAL)
                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;
 
        if (dc_is_hdmi_signal(pipe_with_clk_src->stream->signal)
index 55bcc3bdc6a3b448d872cc9e5a2484aab02f8775..3ecd2d614f416afd8456d084d2f66fbf7222cdaf 100644 (file)
@@ -78,6 +78,7 @@ struct dc_caps {
        bool dual_link_dvi;
        bool post_blend_color_processing;
        bool force_dp_tps4_for_cp2520;
+       bool disable_dp_clk_share;
 };
 
 struct dc_dcc_surface_param {
index fd2bdae4dcec71f30680967ecc7b2f241a9be221..3f76e6019546f029739bfd182036b37fac3b671d 100644 (file)
@@ -919,7 +919,7 @@ static bool construct(
        dc->caps.i2c_speed_in_khz = 40;
        dc->caps.max_cursor_size = 128;
        dc->caps.dual_link_dvi = true;
-
+       dc->caps.disable_dp_clk_share = true;
        for (i = 0; i < pool->base.pipe_count; i++) {
                pool->base.timing_generators[i] =
                        dce100_timing_generator_create(
index dc9f3e9afc338bcb08d16a3b16deb496800e05a1..604c62969ead727a225a57eaea4d6c8198c24ac1 100644 (file)
@@ -946,6 +946,7 @@ static bool dce80_construct(
        }
 
        dc->caps.max_planes =  pool->base.pipe_count;
+       dc->caps.disable_dp_clk_share = true;
 
        if (!resource_construct(num_virtual_links, dc, &pool->base,
                        &res_create_funcs))
@@ -1131,6 +1132,7 @@ static bool dce81_construct(
        }
 
        dc->caps.max_planes =  pool->base.pipe_count;
+       dc->caps.disable_dp_clk_share = true;
 
        if (!resource_construct(num_virtual_links, dc, &pool->base,
                        &res_create_funcs))
@@ -1312,6 +1314,7 @@ static bool dce83_construct(
        }
 
        dc->caps.max_planes =  pool->base.pipe_count;
+       dc->caps.disable_dp_clk_share = true;
 
        if (!resource_construct(num_virtual_links, dc, &pool->base,
                        &res_create_funcs))