mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-19 04:07:55 +07:00
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>
This commit is contained in:
parent
de7a1b0b87
commit
d2ce14fd99
@ -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,
|
||||
};
|
||||
|
@ -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 (!dc->config.power_down_display_on_boot)
|
||||
return;
|
||||
|
||||
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;
|
||||
}
|
||||
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(
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user