]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
drm/amd/display: check link status before disable stream
authorPaul Hsieh <paul.hsieh@amd.com>
Thu, 28 Nov 2019 02:44:39 +0000 (10:44 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 18 Dec 2019 21:09:09 +0000 (16:09 -0500)
[Why]
1. Set second screen only then unplug external monitor
2. Enter to S4 then plug in external monitor
3. Resume from S4, eDP will not turn off when OS set
   second screen only
Sometimes OS will not set eDP power up cause eDP dpms_off
keep true then driver skipp disable stream

[How]
When drvier try to disable stream, add link status condition

Signed-off-by: Paul Hsieh <paul.hsieh@amd.com>
Reviewed-by: Anthony Koo <Anthony.Koo@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c

index c9f7c0af58e3e40d02c6cbdc0ab31b28510933ef..aa389dea279d0bf7193b755ff09864461736d9df 100644 (file)
@@ -860,6 +860,7 @@ static void dcn10_reset_back_end_for_pipe(
                struct dc_state *context)
 {
        int i;
+       struct dc_link *link;
        DC_LOGGER_INIT(dc->ctx->logger);
        if (pipe_ctx->stream_res.stream_enc == NULL) {
                pipe_ctx->stream = NULL;
@@ -867,8 +868,14 @@ static void dcn10_reset_back_end_for_pipe(
        }
 
        if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) {
-               /* DPMS may already disable */
-               if (!pipe_ctx->stream->dpms_off)
+               link = pipe_ctx->stream->link;
+               /* DPMS may already disable or */
+               /* dpms_off status is incorrect due to fastboot
+                * feature. When system resume from S4 with second
+                * screen only, the dpms_off would be true but
+                * VBIOS lit up eDP, so check link status too.
+                */
+               if (!pipe_ctx->stream->dpms_off || link->link_status.link_active)
                        core_link_disable_stream(pipe_ctx);
                else if (pipe_ctx->stream_res.audio)
                        dc->hwss.disable_audio_stream(pipe_ctx);
index fb667546db09ddc084018e5e56817294620fe8c2..3706299906e4acd036d2a648a7f2965def868071 100644 (file)
@@ -2002,6 +2002,7 @@ static void dcn20_reset_back_end_for_pipe(
                struct dc_state *context)
 {
        int i;
+       struct dc_link *link;
        DC_LOGGER_INIT(dc->ctx->logger);
        if (pipe_ctx->stream_res.stream_enc == NULL) {
                pipe_ctx->stream = NULL;
@@ -2009,8 +2010,14 @@ static void dcn20_reset_back_end_for_pipe(
        }
 
        if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) {
-               /* DPMS may already disable */
-               if (!pipe_ctx->stream->dpms_off)
+               link = pipe_ctx->stream->link;
+               /* DPMS may already disable or */
+               /* dpms_off status is incorrect due to fastboot
+                * feature. When system resume from S4 with second
+                * screen only, the dpms_off would be true but
+                * VBIOS lit up eDP, so check link status too.
+                */
+               if (!pipe_ctx->stream->dpms_off || link->link_status.link_active)
                        core_link_disable_stream(pipe_ctx);
                else if (pipe_ctx->stream_res.audio)
                        dc->hwss.disable_audio_stream(pipe_ctx);