drm/amd/display: send display_count msg so SMU can enter S0i2
authorHersen Wu <hersenxs.wu@amd.com>
Tue, 31 Oct 2017 19:55:15 +0000 (15:55 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 6 Dec 2017 17:47:33 +0000 (12:47 -0500)
SMU can future lower voltages in long idle case when all display is off.

If all display output is turned off via DPMS, send display_count = 0
after all output are turned off.

otherwise send display_count msg before turning on display to make sure
SMU exit S0i2 state.  before is not neccessary as we are out of S0i2
when driver execute code, but send message before anyways for correctness.

Signed-off-by: Hersen Wu <hersenxs.wu@amd.com>
Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
Acked-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc.c
drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.c
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h

index e59e7028ad5795ba05614a5fd285398c92cf90cf..5745304b5af5cad6d495610e6ba59b6aacb38c1f 100644 (file)
@@ -389,11 +389,19 @@ void set_dpms(
 
        if (stream->dpms_off != dpms_off) {
                stream->dpms_off = dpms_off;
-               if (dpms_off)
+
+               if (dpms_off) {
                        core_link_disable_stream(pipe_ctx,
                                        KEEP_ACQUIRED_RESOURCE);
-               else
+
+                       dc->hwss.pplib_apply_display_requirements(
+                                       dc, dc->current_state);
+               } else {
+                       dc->hwss.pplib_apply_display_requirements(
+                                       dc, dc->current_state);
+
                        core_link_enable_stream(dc->current_state, pipe_ctx);
+               }
        }
 }
 
index e7a694835e3e27bcb0dd64cdda00e7a6e5535652..469af0587604e3911e6d0ea27fe0202e98b5d3e9 100644 (file)
@@ -148,5 +148,7 @@ void dce100_hw_sequencer_construct(struct dc *dc)
 
        dc->hwss.enable_display_power_gating = dce100_enable_display_power_gating;
        dc->hwss.set_bandwidth = dce100_set_bandwidth;
+       dc->hwss.pplib_apply_display_requirements =
+                       dce100_pplib_apply_display_requirements;
 }
 
index 1ec008404784e173cc1a9d831eb7b83258b60d49..d22745e6dff0a1d3a6b2606e79dd84c538156ae7 100644 (file)
@@ -2595,6 +2595,10 @@ void dce110_fill_display_configs(
 
                ASSERT(pipe_ctx != NULL);
 
+               /* only notify active stream */
+               if (stream->dpms_off)
+                       continue;
+
                num_cfgs++;
                cfg->signal = pipe_ctx->stream->signal;
                cfg->pipe_idx = pipe_ctx->pipe_idx;
@@ -3024,6 +3028,7 @@ static const struct hw_sequencer_funcs dce110_funcs = {
        .wait_for_mpcc_disconnect = dce110_wait_for_mpcc_disconnect,
        .ready_shared_resources = ready_shared_resources,
        .optimize_shared_resources = optimize_shared_resources,
+       .pplib_apply_display_requirements = pplib_apply_display_requirements,
        .edp_backlight_control = hwss_edp_backlight_control,
        .edp_power_control = hwss_edp_power_control,
 };
index 5d1fb1c297a3c4fa8d66702e8da949f15e850062..73e7afb360b167138a8795d32ca073f14488e7e5 100644 (file)
@@ -2567,6 +2567,8 @@ static const struct hw_sequencer_funcs dcn10_funcs = {
        .wait_for_mpcc_disconnect = dcn10_wait_for_mpcc_disconnect,
        .ready_shared_resources = ready_shared_resources,
        .optimize_shared_resources = optimize_shared_resources,
+       .pplib_apply_display_requirements =
+                       dcn10_pplib_apply_display_requirements,
        .edp_backlight_control = hwss_edp_backlight_control,
        .edp_power_control = hwss_edp_power_control
 };
index 19cfca91bb4eaad1a86098d9d6c6e62c658e0ea8..1d8852683f1f6a97bff0dc7819f10ca68a3beccb 100644 (file)
@@ -183,12 +183,16 @@ struct hw_sequencer_funcs {
 
        void (*ready_shared_resources)(struct dc *dc, struct dc_state *context);
        void (*optimize_shared_resources)(struct dc *dc);
+       void (*pplib_apply_display_requirements)(
+                       struct dc *dc,
+                       struct dc_state *context);
        void (*edp_power_control)(
                        struct dc_link *link,
                        bool enable);
        void (*edp_backlight_control)(
                        struct dc_link *link,
                        bool enable);
+
 };
 
 void color_space_to_black_color(