diff options
| author | Sung Lee <sung.lee@amd.com> | 2020-08-11 17:23:20 -0400 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2020-08-26 15:18:41 -0400 | 
| commit | d2ce14fd99e91f3de667e5dba5b9affa3e40e725 (patch) | |
| tree | d46947381a06c703a289ebce5de64c08d2cf10f0 | |
| parent | de7a1b0b8753e1b0000084f0e339ffab295d27ef (diff) | |
drm/amd/display: Send DISPLAY_OFF after power down on boot
[WHY]
update_clocks might not be called on headless adapters. This means
DISPLAY_OFF may not be sent in headless cases.
[HOW]
If hardware is powered down on boot because it is headless (mode set
does not happen on that adapter) also send DISPLAY_OFF notification.
Signed-off-by: Sung Lee <sung.lee@amd.com>
Reviewed-by: Yongqiang Sun <yongqiang.sun@amd.com>
Acked-by: Eryk Brol <eryk.brol@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
| -rw-r--r-- | drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 53 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h | 2 | 
3 files changed, 43 insertions, 22 deletions
| diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c index c664404a75d4..543afa34d87a 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c @@ -94,6 +94,15 @@ int rn_get_active_display_cnt_wa(  	return display_count;  } +void rn_set_low_power_state(struct clk_mgr *clk_mgr_base) +{ +	struct clk_mgr_internal *clk_mgr = TO_CLK_MGR_INTERNAL(clk_mgr_base); + +	rn_vbios_smu_set_dcn_low_power_state(clk_mgr, DCN_PWR_STATE_LOW_POWER); +	/* update power state */ +	clk_mgr_base->clks.pwr_state = DCN_PWR_STATE_LOW_POWER; +} +  void rn_update_clocks(struct clk_mgr *clk_mgr_base,  			struct dc_state *context,  			bool safe_to_lower) @@ -516,6 +525,7 @@ static struct clk_mgr_funcs dcn21_funcs = {  	.init_clocks = rn_init_clocks,  	.enable_pme_wa = rn_enable_pme_wa,  	.are_clock_states_equal = rn_are_clock_states_equal, +	.set_low_power_state = rn_set_low_power_state,  	.notify_wm_ranges = rn_notify_wm_ranges,  	.notify_link_rate_change = rn_notify_link_rate_change,  }; diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c index a643927e272b..fa643ec5a876 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c @@ -1450,33 +1450,42 @@ void dcn10_init_hw(struct dc *dc)  void dcn10_power_down_on_boot(struct dc *dc)  {  	int i = 0; +	struct dc_link *edp_link; -	if (dc->config.power_down_display_on_boot) { -		struct dc_link *edp_link = get_edp_link(dc); - -		if (edp_link && -				edp_link->link_enc->funcs->is_dig_enabled && -				edp_link->link_enc->funcs->is_dig_enabled(edp_link->link_enc) && -				dc->hwseq->funcs.edp_backlight_control && -				dc->hwss.power_down && -				dc->hwss.edp_power_control) { -			dc->hwseq->funcs.edp_backlight_control(edp_link, false); -			dc->hwss.power_down(dc); -			dc->hwss.edp_power_control(edp_link, false); -		} else { -			for (i = 0; i < dc->link_count; i++) { -				struct dc_link *link = dc->links[i]; - -				if (link->link_enc->funcs->is_dig_enabled && -						link->link_enc->funcs->is_dig_enabled(link->link_enc) && -						dc->hwss.power_down) { -					dc->hwss.power_down(dc); -					break; -				} +	if (!dc->config.power_down_display_on_boot) +		return; + +	edp_link = get_edp_link(dc); +	if (edp_link && +			edp_link->link_enc->funcs->is_dig_enabled && +			edp_link->link_enc->funcs->is_dig_enabled(edp_link->link_enc) && +			dc->hwseq->funcs.edp_backlight_control && +			dc->hwss.power_down && +			dc->hwss.edp_power_control) { +		dc->hwseq->funcs.edp_backlight_control(edp_link, false); +		dc->hwss.power_down(dc); +		dc->hwss.edp_power_control(edp_link, false); +	} else { +		for (i = 0; i < dc->link_count; i++) { +			struct dc_link *link = dc->links[i]; +			if (link->link_enc->funcs->is_dig_enabled && +					link->link_enc->funcs->is_dig_enabled(link->link_enc) && +					dc->hwss.power_down) { +				dc->hwss.power_down(dc); +				break;  			} +  		}  	} + +	/* +	 * Call update_clocks with empty context +	 * to send DISPLAY_OFF +	 * Otherwise DISPLAY_OFF may not be asserted +	 */ +	if (dc->clk_mgr->funcs->set_low_power_state) +		dc->clk_mgr->funcs->set_low_power_state(dc->clk_mgr);  }  void dcn10_reset_hw_ctx_wrap( diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h b/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h index 5994d2a33c40..947d6106f341 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h +++ b/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h @@ -230,6 +230,8 @@ struct clk_mgr_funcs {  	int (*get_dp_ref_clk_frequency)(struct clk_mgr *clk_mgr); +	void (*set_low_power_state)(struct clk_mgr *clk_mgr); +  	void (*init_clocks)(struct clk_mgr *clk_mgr);  	void (*enable_pme_wa) (struct clk_mgr *clk_mgr); | 
