Commit 93b6bd30 authored by Eric Yang's avatar Eric Yang Committed by Alex Deucher

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: default avatarNicholas Kazlauskas <Nicholas.Kazlauskas@amd.com>
Acked-by: default avatarRodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: default avatarEric Yang <Eric.Yang2@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent ce350c6e
...@@ -139,10 +139,10 @@ static void dcn31_update_clocks(struct clk_mgr *clk_mgr_base, ...@@ -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 * also if safe to lower is false, we just go in the higher state
*/ */
if (safe_to_lower) { if (safe_to_lower) {
if (new_clocks->z9_support == DCN_Z9_SUPPORT_ALLOW && if (new_clocks->zstate_support == DCN_ZSTATE_SUPPORT_ALLOW &&
new_clocks->z9_support != clk_mgr_base->clks.z9_support) { new_clocks->zstate_support != clk_mgr_base->clks.zstate_support) {
dcn31_smu_set_Z9_support(clk_mgr, true); 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) { 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, ...@@ -163,10 +163,10 @@ static void dcn31_update_clocks(struct clk_mgr *clk_mgr_base,
} }
} }
} else { } else {
if (new_clocks->z9_support == DCN_Z9_SUPPORT_DISALLOW && if (new_clocks->zstate_support == DCN_ZSTATE_SUPPORT_DISALLOW &&
new_clocks->z9_support != clk_mgr_base->clks.z9_support) { new_clocks->zstate_support != clk_mgr_base->clks.zstate_support) {
dcn31_smu_set_Z9_support(clk_mgr, false); 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) { 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) ...@@ -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.p_state_change_support = true;
clk_mgr->clks.prev_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.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, 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, ...@@ -300,7 +300,7 @@ static bool dcn31_are_clock_states_equal(struct dc_clocks *a,
return false; return false;
else if (a->dcfclk_deep_sleep_khz != b->dcfclk_deep_sleep_khz) else if (a->dcfclk_deep_sleep_khz != b->dcfclk_deep_sleep_khz)
return false; return false;
else if (a->z9_support != b->z9_support) else if (a->zstate_support != b->zstate_support)
return false; return false;
else if (a->dtbclk_en != b->dtbclk_en) else if (a->dtbclk_en != b->dtbclk_en)
return false; return false;
......
...@@ -354,10 +354,10 @@ enum dcn_pwr_state { ...@@ -354,10 +354,10 @@ enum dcn_pwr_state {
}; };
#if defined(CONFIG_DRM_AMD_DC_DCN) #if defined(CONFIG_DRM_AMD_DC_DCN)
enum dcn_z9_support_state { enum dcn_zstate_support_state {
DCN_Z9_SUPPORT_UNKNOWN, DCN_ZSTATE_SUPPORT_UNKNOWN,
DCN_Z9_SUPPORT_ALLOW, DCN_ZSTATE_SUPPORT_ALLOW,
DCN_Z9_SUPPORT_DISALLOW, DCN_ZSTATE_SUPPORT_DISALLOW,
}; };
#endif #endif
/* /*
...@@ -378,7 +378,7 @@ struct dc_clocks { ...@@ -378,7 +378,7 @@ struct dc_clocks {
int dramclk_khz; int dramclk_khz;
bool p_state_change_support; bool p_state_change_support;
#if defined(CONFIG_DRM_AMD_DC_DCN) #if defined(CONFIG_DRM_AMD_DC_DCN)
enum dcn_z9_support_state z9_support; enum dcn_zstate_support_state zstate_support;
bool dtbclk_en; bool dtbclk_en;
#endif #endif
enum dcn_pwr_state pwr_state; enum dcn_pwr_state pwr_state;
......
...@@ -3081,6 +3081,37 @@ static bool is_dtbclk_required(struct dc *dc, struct dc_state *context) ...@@ -3081,6 +3081,37 @@ static bool is_dtbclk_required(struct dc *dc, struct dc_state *context)
return false; 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( void dcn20_calculate_dlg_params(
struct dc *dc, struct dc_state *context, struct dc *dc, struct dc_state *context,
display_e2e_pipe_params_st *pipes, display_e2e_pipe_params_st *pipes,
...@@ -3088,7 +3119,6 @@ void dcn20_calculate_dlg_params( ...@@ -3088,7 +3119,6 @@ void dcn20_calculate_dlg_params(
int vlevel) int vlevel)
{ {
int i, pipe_idx; int i, pipe_idx;
int plane_count;
/* Writeback MCIF_WB arbitration parameters */ /* Writeback MCIF_WB arbitration parameters */
dc->res_pool->funcs->set_mcif_arb_params(dc, context, pipes, pipe_cnt); dc->res_pool->funcs->set_mcif_arb_params(dc, context, pipes, pipe_cnt);
...@@ -3104,17 +3134,7 @@ void dcn20_calculate_dlg_params( ...@@ -3104,17 +3134,7 @@ void dcn20_calculate_dlg_params(
!= dm_dram_clock_change_unsupported; != dm_dram_clock_change_unsupported;
context->bw_ctx.bw.dcn.clk.dppclk_khz = 0; 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) ? context->bw_ctx.bw.dcn.clk.zstate_support = decide_zstate_support(dc, context);
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.dtbclk_en = is_dtbclk_required(dc, context); context->bw_ctx.bw.dcn.clk.dtbclk_en = is_dtbclk_required(dc, context);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment