drm/amd/display: move edp fast boot optimization flag to stream
authorAnthony Koo <Anthony.Koo@amd.com>
Tue, 21 Aug 2018 19:28:05 +0000 (14:28 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 27 Aug 2018 16:11:07 +0000 (11:11 -0500)
[Why]
During S4/S3 stress test it is possible to resume from S4 without
calling mode set on eDP, meaning high level optimization flag is not
reset. If this is followed by an S3 resume call, driver will see
optimization flag is set and consume it and think backend is powered
on when in fact it is not.

This results in PHY being off in sequence where
S4->Resume->S3->Resume->ApplyOpt->black screen.

[How]
Move optimization flag to stream instead of a DC flag.

Signed-off-by: Anthony Koo <Anthony.Koo@amd.com>
Reviewed-by: Tony Cheng <Tony.Cheng@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/dc.h
drivers/gpu/drm/amd/display/dc/dc_stream.h
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c

index 6638251162b0730b6765fa5c8dddf436bc1cfe86..53ce2a9b7eed8475f707fb5cbe383714aa7a02ad 100644 (file)
@@ -2497,8 +2497,8 @@ void core_link_enable_stream(
 
        /* eDP lit up by bios already, no need to enable again. */
        if (pipe_ctx->stream->signal == SIGNAL_TYPE_EDP &&
-               core_dc->apply_edp_fast_boot_optimization) {
-               core_dc->apply_edp_fast_boot_optimization = false;
+                       pipe_ctx->stream->apply_edp_fast_boot_optimization) {
+               pipe_ctx->stream->apply_edp_fast_boot_optimization = false;
                pipe_ctx->stream->dpms_off = false;
                return;
        }
index 1cf4ec68e741cdcef82a4b3e4306db137e9ac7bd..3564f4fe420a0020b290f3225930e6287831865f 100644 (file)
@@ -311,8 +311,6 @@ struct dc {
 
        bool optimized_required;
 
-       bool apply_edp_fast_boot_optimization;
-
        /* FBC compressor */
        struct compressor *fbc_compressor;
 
index 4a9f7e5daccfbdb38a053cc47707a5d71f8d66e3..c5bd1fbb698241507b0561f4572f8c183845466a 100644 (file)
@@ -102,6 +102,7 @@ struct dc_stream_state {
        int phy_pix_clk;
        enum signal_type signal;
        bool dpms_off;
+       bool apply_edp_fast_boot_optimization;
 
        struct dc_stream_status status;
 
index ce1e0f6ec3ca7de166609975fb3df81ab2f9ab52..dc1eed5ba996353017187b7deaa2c3d697b0664a 100644 (file)
@@ -1557,32 +1557,40 @@ static struct dc_link *get_link_for_edp_not_in_use(
  */
 void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context)
 {
+       int i;
        struct dc_link *edp_link_to_turnoff = NULL;
        struct dc_link *edp_link = get_link_for_edp(dc);
-       bool can_eDP_fast_boot_optimize = false;
+       bool can_edp_fast_boot_optimize = false;
+       bool apply_edp_fast_boot_optimization = false;
 
        if (edp_link) {
                /* this seems to cause blank screens on DCE8 */
                if ((dc->ctx->dce_version == DCE_VERSION_8_0) ||
                    (dc->ctx->dce_version == DCE_VERSION_8_1) ||
                    (dc->ctx->dce_version == DCE_VERSION_8_3))
-                       can_eDP_fast_boot_optimize = false;
+                       can_edp_fast_boot_optimize = false;
                else
-                       can_eDP_fast_boot_optimize =
+                       can_edp_fast_boot_optimize =
                                edp_link->link_enc->funcs->is_dig_enabled(edp_link->link_enc);
        }
 
-       if (can_eDP_fast_boot_optimize) {
+       if (can_edp_fast_boot_optimize)
                edp_link_to_turnoff = get_link_for_edp_not_in_use(dc, context);
 
-               /* if OS doesn't light up eDP and eDP link is available, we want to disable
-                * If resume from S4/S5, should optimization.
-                */
-               if (!edp_link_to_turnoff)
-                       dc->apply_edp_fast_boot_optimization = true;
+       /* if OS doesn't light up eDP and eDP link is available, we want to disable
+        * If resume from S4/S5, should optimization.
+        */
+       if (can_edp_fast_boot_optimize && !edp_link_to_turnoff) {
+               /* Find eDP stream and set optimization flag */
+               for (i = 0; i < context->stream_count; i++) {
+                       if (context->streams[i]->signal == SIGNAL_TYPE_EDP) {
+                               context->streams[i]->apply_edp_fast_boot_optimization = true;
+                               apply_edp_fast_boot_optimization = true;
+                       }
+               }
        }
 
-       if (!dc->apply_edp_fast_boot_optimization) {
+       if (!apply_edp_fast_boot_optimization) {
                if (edp_link_to_turnoff) {
                        /*turn off backlight before DP_blank and encoder powered down*/
                        dc->hwss.edp_backlight_control(edp_link_to_turnoff, false);