OSDN Git Service

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 c9f7c0a..aa389de 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 fb66754..3706299 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);