Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Eric Yang and committed by
Alex Deucher
93b6bd30 ce350c6e

+45 -25
+8 -8
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_clk_mgr.c
··· 139 139 * also if safe to lower is false, we just go in the higher state 140 140 */ 141 141 if (safe_to_lower) { 142 - if (new_clocks->z9_support == DCN_Z9_SUPPORT_ALLOW && 143 - new_clocks->z9_support != clk_mgr_base->clks.z9_support) { 142 + if (new_clocks->zstate_support == DCN_ZSTATE_SUPPORT_ALLOW && 143 + new_clocks->zstate_support != clk_mgr_base->clks.zstate_support) { 144 144 dcn31_smu_set_Z9_support(clk_mgr, true); 145 - clk_mgr_base->clks.z9_support = new_clocks->z9_support; 145 + clk_mgr_base->clks.zstate_support = new_clocks->zstate_support; 146 146 } 147 147 148 148 if (clk_mgr_base->clks.dtbclk_en && !new_clocks->dtbclk_en) { ··· 163 163 } 164 164 } 165 165 } else { 166 - if (new_clocks->z9_support == DCN_Z9_SUPPORT_DISALLOW && 167 - new_clocks->z9_support != clk_mgr_base->clks.z9_support) { 166 + if (new_clocks->zstate_support == DCN_ZSTATE_SUPPORT_DISALLOW && 167 + new_clocks->zstate_support != clk_mgr_base->clks.zstate_support) { 168 168 dcn31_smu_set_Z9_support(clk_mgr, false); 169 - clk_mgr_base->clks.z9_support = new_clocks->z9_support; 169 + clk_mgr_base->clks.zstate_support = new_clocks->zstate_support; 170 170 } 171 171 172 172 if (!clk_mgr_base->clks.dtbclk_en && new_clocks->dtbclk_en) { ··· 286 286 clk_mgr->clks.p_state_change_support = true; 287 287 clk_mgr->clks.prev_p_state_change_support = true; 288 288 clk_mgr->clks.pwr_state = DCN_PWR_STATE_UNKNOWN; 289 - clk_mgr->clks.z9_support = DCN_Z9_SUPPORT_UNKNOWN; 289 + clk_mgr->clks.zstate_support = DCN_ZSTATE_SUPPORT_UNKNOWN; 290 290 } 291 291 292 292 static bool dcn31_are_clock_states_equal(struct dc_clocks *a, ··· 300 300 return false; 301 301 else if (a->dcfclk_deep_sleep_khz != b->dcfclk_deep_sleep_khz) 302 302 return false; 303 - else if (a->z9_support != b->z9_support) 303 + else if (a->zstate_support != b->zstate_support) 304 304 return false; 305 305 else if (a->dtbclk_en != b->dtbclk_en) 306 306 return false;
+5 -5
drivers/gpu/drm/amd/display/dc/dc.h
··· 354 354 }; 355 355 356 356 #if defined(CONFIG_DRM_AMD_DC_DCN) 357 - enum dcn_z9_support_state { 358 - DCN_Z9_SUPPORT_UNKNOWN, 359 - DCN_Z9_SUPPORT_ALLOW, 360 - DCN_Z9_SUPPORT_DISALLOW, 357 + enum dcn_zstate_support_state { 358 + DCN_ZSTATE_SUPPORT_UNKNOWN, 359 + DCN_ZSTATE_SUPPORT_ALLOW, 360 + DCN_ZSTATE_SUPPORT_DISALLOW, 361 361 }; 362 362 #endif 363 363 /* ··· 378 378 int dramclk_khz; 379 379 bool p_state_change_support; 380 380 #if defined(CONFIG_DRM_AMD_DC_DCN) 381 - enum dcn_z9_support_state z9_support; 381 + enum dcn_zstate_support_state zstate_support; 382 382 bool dtbclk_en; 383 383 #endif 384 384 enum dcn_pwr_state pwr_state;
+32 -12
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
··· 3081 3081 return false; 3082 3082 } 3083 3083 3084 + static enum dcn_zstate_support_state decide_zstate_support(struct dc *dc, struct dc_state *context) 3085 + { 3086 + int plane_count; 3087 + int i; 3088 + 3089 + plane_count = 0; 3090 + for (i = 0; i < dc->res_pool->pipe_count; i++) { 3091 + if (context->res_ctx.pipe_ctx[i].plane_state) 3092 + plane_count++; 3093 + } 3094 + 3095 + /* 3096 + * Zstate is allowed in following scenarios: 3097 + * 1. Single eDP with PSR enabled 3098 + * 2. 0 planes (No memory requests) 3099 + * 3. Single eDP without PSR but > 5ms stutter period 3100 + */ 3101 + if (plane_count == 0) 3102 + return DCN_ZSTATE_SUPPORT_ALLOW; 3103 + else if (context->stream_count == 1 && context->streams[0]->signal == SIGNAL_TYPE_EDP) { 3104 + struct dc_link *link = context->streams[0]->sink->link; 3105 + 3106 + if ((link->link_index == 0 && link->psr_settings.psr_feature_enabled) 3107 + || context->bw_ctx.dml.vba.StutterPeriod > 5000.0) 3108 + return DCN_ZSTATE_SUPPORT_ALLOW; 3109 + else 3110 + return DCN_ZSTATE_SUPPORT_DISALLOW; 3111 + } else 3112 + return DCN_ZSTATE_SUPPORT_DISALLOW; 3113 + } 3114 + 3084 3115 void dcn20_calculate_dlg_params( 3085 3116 struct dc *dc, struct dc_state *context, 3086 3117 display_e2e_pipe_params_st *pipes, ··· 3119 3088 int vlevel) 3120 3089 { 3121 3090 int i, pipe_idx; 3122 - int plane_count; 3123 3091 3124 3092 /* Writeback MCIF_WB arbitration parameters */ 3125 3093 dc->res_pool->funcs->set_mcif_arb_params(dc, context, pipes, pipe_cnt); ··· 3134 3104 != dm_dram_clock_change_unsupported; 3135 3105 context->bw_ctx.bw.dcn.clk.dppclk_khz = 0; 3136 3106 3137 - context->bw_ctx.bw.dcn.clk.z9_support = (context->bw_ctx.dml.vba.StutterPeriod > 5000.0) ? 3138 - DCN_Z9_SUPPORT_ALLOW : DCN_Z9_SUPPORT_DISALLOW; 3139 - 3140 - plane_count = 0; 3141 - for (i = 0; i < dc->res_pool->pipe_count; i++) { 3142 - if (context->res_ctx.pipe_ctx[i].plane_state) 3143 - plane_count++; 3144 - } 3145 - 3146 - if (plane_count == 0) 3147 - context->bw_ctx.bw.dcn.clk.z9_support = DCN_Z9_SUPPORT_ALLOW; 3107 + context->bw_ctx.bw.dcn.clk.zstate_support = decide_zstate_support(dc, context); 3148 3108 3149 3109 context->bw_ctx.bw.dcn.clk.dtbclk_en = is_dtbclk_required(dc, context); 3150 3110