Commit 387f3a30 authored by Sung Lee's avatar Sung Lee Committed by Alex Deucher
Browse files

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: default avatarSung Lee <sung.lee@amd.com>
Reviewed-by: default avatarYongqiang Sun <yongqiang.sun@amd.com>
Acked-by: default avatarEryk Brol <eryk.brol@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent d3bbba79
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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,
};
+31 −22
Original line number Diff line number Diff line
@@ -1450,10 +1450,12 @@ 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 (!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) &&
@@ -1476,7 +1478,14 @@ void dcn10_power_down_on_boot(struct dc *dc)

		}
	}
	}

	/*
	 * 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(
+2 −0
Original line number Diff line number Diff line
@@ -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);