drm/amd/display: enabling stream after HPD low to high happened
authorCharlene Liu <charlene.liu@amd.com>
Mon, 29 Apr 2019 18:35:01 +0000 (14:35 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 24 May 2019 17:21:00 +0000 (12:21 -0500)
[Why]
1. No real HPD plug in/out but HPD happens,
 the driver notifies OS connection changed.
2. No display in target.

When HPD goes low to high,
the driver should regard as HPD and enter setmode flow.

[How]
In this case, even stream didn't change but still retrain.

Signed-off-by: Chiawen Huang <chiawen.huang@amd.com>
Signed-off-by: Charlene Liu <charlene.liu@amd.com>
Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
Acked-by: Anthony Koo <Anthony.Koo@amd.com>
Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc_link.c
drivers/gpu/drm/amd/display/dc/core/dc_resource.c
drivers/gpu/drm/amd/display/dc/dc_link.h
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c

index 9fbf926d5bf9fe7b135e20f93e0c17c06737a27e..6b8dc72a7861d7cb935bc92379045a23814fe375 100644 (file)
@@ -704,6 +704,7 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
 
        if (new_connection_type != dc_connection_none) {
                link->type = new_connection_type;
+               link->link_state_valid = false;
 
                /* From Disconnected-to-Connected. */
                switch (link->connector_signal) {
@@ -2631,6 +2632,8 @@ void core_link_enable_stream(
                        stream->phy_pix_clk,
                        pipe_ctx->stream_res.audio != NULL);
 
+       pipe_ctx->stream->link->link_state_valid = true;
+
        if (dc_is_dvi_signal(pipe_ctx->stream->signal))
                pipe_ctx->stream_res.stream_enc->funcs->dvi_set_stream_attribute(
                        pipe_ctx->stream_res.stream_enc,
index 262d07a8cb75358f19545ce46fdedcfec6cbaa3d..578503ba0d9f4f61934cb64511a17e300ab45e99 100644 (file)
@@ -2642,6 +2642,10 @@ bool pipe_need_reprogram(
        if (is_vsc_info_packet_changed(pipe_ctx_old->stream, pipe_ctx->stream))
                return true;
 
+       if (false == pipe_ctx_old->stream->link->link_state_valid &&
+               false == pipe_ctx_old->stream->dpms_off)
+               return true;
+
        return false;
 }
 
index 7b9429e30d821cabdb103dc5eb7a0b0b0b5c34ce..094009127e25337ac72e4e74f4bc2f0ba22e6ef9 100644 (file)
@@ -75,6 +75,7 @@ struct dc_link {
        enum dc_irq_source irq_source_hpd_rx;/* aka DP Short Pulse  */
        bool is_hpd_filter_disabled;
        bool dp_ss_off;
+       bool link_state_valid;
 
        /* caps is the same as reported_link_cap. link_traing use
         * reported_link_cap. Will clean up.  TODO
index d3c821f3899b0f469990e876956226a72037a071..69f215967af31327d6d5ff749f1f5625b7dfe67d 100644 (file)
@@ -2023,8 +2023,10 @@ enum dc_status dce110_apply_ctx_to_hw(
                if (pipe_ctx->stream == NULL)
                        continue;
 
-               if (pipe_ctx->stream == pipe_ctx_old->stream)
+               if (pipe_ctx->stream == pipe_ctx_old->stream &&
+                       pipe_ctx->stream->link->link_state_valid) {
                        continue;
+               }
 
                if (pipe_ctx_old->stream && !pipe_need_reprogram(pipe_ctx_old, pipe_ctx))
                        continue;