drm/amd/display: change zstate allow msg condition
[Why] PMFW message which previously thought to only control Z9 controls both Z9 and Z10. Also HW design team requested that Z9 must only be supported on eDP due to content protection interop. [How] Change zstate support condition to match updated policy Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com> Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com> Signed-off-by: Eric Yang <Eric.Yang2@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
ce350c6e78
commit
93b6bd307a
@ -139,10 +139,10 @@ static void dcn31_update_clocks(struct clk_mgr *clk_mgr_base,
|
||||
* also if safe to lower is false, we just go in the higher state
|
||||
*/
|
||||
if (safe_to_lower) {
|
||||
if (new_clocks->z9_support == DCN_Z9_SUPPORT_ALLOW &&
|
||||
new_clocks->z9_support != clk_mgr_base->clks.z9_support) {
|
||||
if (new_clocks->zstate_support == DCN_ZSTATE_SUPPORT_ALLOW &&
|
||||
new_clocks->zstate_support != clk_mgr_base->clks.zstate_support) {
|
||||
dcn31_smu_set_Z9_support(clk_mgr, true);
|
||||
clk_mgr_base->clks.z9_support = new_clocks->z9_support;
|
||||
clk_mgr_base->clks.zstate_support = new_clocks->zstate_support;
|
||||
}
|
||||
|
||||
if (clk_mgr_base->clks.dtbclk_en && !new_clocks->dtbclk_en) {
|
||||
@ -163,10 +163,10 @@ static void dcn31_update_clocks(struct clk_mgr *clk_mgr_base,
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (new_clocks->z9_support == DCN_Z9_SUPPORT_DISALLOW &&
|
||||
new_clocks->z9_support != clk_mgr_base->clks.z9_support) {
|
||||
if (new_clocks->zstate_support == DCN_ZSTATE_SUPPORT_DISALLOW &&
|
||||
new_clocks->zstate_support != clk_mgr_base->clks.zstate_support) {
|
||||
dcn31_smu_set_Z9_support(clk_mgr, false);
|
||||
clk_mgr_base->clks.z9_support = new_clocks->z9_support;
|
||||
clk_mgr_base->clks.zstate_support = new_clocks->zstate_support;
|
||||
}
|
||||
|
||||
if (!clk_mgr_base->clks.dtbclk_en && new_clocks->dtbclk_en) {
|
||||
@ -286,7 +286,7 @@ static void dcn31_init_clocks(struct clk_mgr *clk_mgr)
|
||||
clk_mgr->clks.p_state_change_support = true;
|
||||
clk_mgr->clks.prev_p_state_change_support = true;
|
||||
clk_mgr->clks.pwr_state = DCN_PWR_STATE_UNKNOWN;
|
||||
clk_mgr->clks.z9_support = DCN_Z9_SUPPORT_UNKNOWN;
|
||||
clk_mgr->clks.zstate_support = DCN_ZSTATE_SUPPORT_UNKNOWN;
|
||||
}
|
||||
|
||||
static bool dcn31_are_clock_states_equal(struct dc_clocks *a,
|
||||
@ -300,7 +300,7 @@ static bool dcn31_are_clock_states_equal(struct dc_clocks *a,
|
||||
return false;
|
||||
else if (a->dcfclk_deep_sleep_khz != b->dcfclk_deep_sleep_khz)
|
||||
return false;
|
||||
else if (a->z9_support != b->z9_support)
|
||||
else if (a->zstate_support != b->zstate_support)
|
||||
return false;
|
||||
else if (a->dtbclk_en != b->dtbclk_en)
|
||||
return false;
|
||||
|
@ -354,10 +354,10 @@ enum dcn_pwr_state {
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DRM_AMD_DC_DCN)
|
||||
enum dcn_z9_support_state {
|
||||
DCN_Z9_SUPPORT_UNKNOWN,
|
||||
DCN_Z9_SUPPORT_ALLOW,
|
||||
DCN_Z9_SUPPORT_DISALLOW,
|
||||
enum dcn_zstate_support_state {
|
||||
DCN_ZSTATE_SUPPORT_UNKNOWN,
|
||||
DCN_ZSTATE_SUPPORT_ALLOW,
|
||||
DCN_ZSTATE_SUPPORT_DISALLOW,
|
||||
};
|
||||
#endif
|
||||
/*
|
||||
@ -378,7 +378,7 @@ struct dc_clocks {
|
||||
int dramclk_khz;
|
||||
bool p_state_change_support;
|
||||
#if defined(CONFIG_DRM_AMD_DC_DCN)
|
||||
enum dcn_z9_support_state z9_support;
|
||||
enum dcn_zstate_support_state zstate_support;
|
||||
bool dtbclk_en;
|
||||
#endif
|
||||
enum dcn_pwr_state pwr_state;
|
||||
|
@ -3081,6 +3081,37 @@ static bool is_dtbclk_required(struct dc *dc, struct dc_state *context)
|
||||
return false;
|
||||
}
|
||||
|
||||
static enum dcn_zstate_support_state decide_zstate_support(struct dc *dc, struct dc_state *context)
|
||||
{
|
||||
int plane_count;
|
||||
int i;
|
||||
|
||||
plane_count = 0;
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
if (context->res_ctx.pipe_ctx[i].plane_state)
|
||||
plane_count++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Zstate is allowed in following scenarios:
|
||||
* 1. Single eDP with PSR enabled
|
||||
* 2. 0 planes (No memory requests)
|
||||
* 3. Single eDP without PSR but > 5ms stutter period
|
||||
*/
|
||||
if (plane_count == 0)
|
||||
return DCN_ZSTATE_SUPPORT_ALLOW;
|
||||
else if (context->stream_count == 1 && context->streams[0]->signal == SIGNAL_TYPE_EDP) {
|
||||
struct dc_link *link = context->streams[0]->sink->link;
|
||||
|
||||
if ((link->link_index == 0 && link->psr_settings.psr_feature_enabled)
|
||||
|| context->bw_ctx.dml.vba.StutterPeriod > 5000.0)
|
||||
return DCN_ZSTATE_SUPPORT_ALLOW;
|
||||
else
|
||||
return DCN_ZSTATE_SUPPORT_DISALLOW;
|
||||
} else
|
||||
return DCN_ZSTATE_SUPPORT_DISALLOW;
|
||||
}
|
||||
|
||||
void dcn20_calculate_dlg_params(
|
||||
struct dc *dc, struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
@ -3088,7 +3119,6 @@ void dcn20_calculate_dlg_params(
|
||||
int vlevel)
|
||||
{
|
||||
int i, pipe_idx;
|
||||
int plane_count;
|
||||
|
||||
/* Writeback MCIF_WB arbitration parameters */
|
||||
dc->res_pool->funcs->set_mcif_arb_params(dc, context, pipes, pipe_cnt);
|
||||
@ -3104,17 +3134,7 @@ void dcn20_calculate_dlg_params(
|
||||
!= dm_dram_clock_change_unsupported;
|
||||
context->bw_ctx.bw.dcn.clk.dppclk_khz = 0;
|
||||
|
||||
context->bw_ctx.bw.dcn.clk.z9_support = (context->bw_ctx.dml.vba.StutterPeriod > 5000.0) ?
|
||||
DCN_Z9_SUPPORT_ALLOW : DCN_Z9_SUPPORT_DISALLOW;
|
||||
|
||||
plane_count = 0;
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
if (context->res_ctx.pipe_ctx[i].plane_state)
|
||||
plane_count++;
|
||||
}
|
||||
|
||||
if (plane_count == 0)
|
||||
context->bw_ctx.bw.dcn.clk.z9_support = DCN_Z9_SUPPORT_ALLOW;
|
||||
context->bw_ctx.bw.dcn.clk.zstate_support = decide_zstate_support(dc, context);
|
||||
|
||||
context->bw_ctx.bw.dcn.clk.dtbclk_en = is_dtbclk_required(dc, context);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user