drm/amd/display: support new PMFW interface to disable Z9 only
authorEric Yang <Eric.Yang2@amd.com>
Wed, 15 Dec 2021 22:09:05 +0000 (17:09 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 18 Jan 2022 22:41:19 +0000 (17:41 -0500)
[Why]
Need to disable Z9 on configurations that only support Z10

[How]
Support new PMFW interface to disable Z9

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>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_clk_mgr.c
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.h
drivers/gpu/drm/amd/display/dc/dc.h
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c

index 4162ce40089b17d53666f9a110984c0dfba11b55..66bd0261ead63d7c2b5e2019bf7b078568c105c0 100644 (file)
@@ -139,9 +139,9 @@ 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->zstate_support == DCN_ZSTATE_SUPPORT_ALLOW &&
+               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, true);
+                       dcn31_smu_set_zstate_support(clk_mgr, new_clocks->zstate_support);
                        dm_helpers_enable_periodic_detection(clk_mgr_base->ctx, true);
                        clk_mgr_base->clks.zstate_support = new_clocks->zstate_support;
                }
@@ -167,7 +167,7 @@ void dcn31_update_clocks(struct clk_mgr *clk_mgr_base,
        } else {
                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);
+                       dcn31_smu_set_zstate_support(clk_mgr, DCN_ZSTATE_SUPPORT_DISALLOW);
                        dm_helpers_enable_periodic_detection(clk_mgr_base->ctx, false);
                        clk_mgr_base->clks.zstate_support = new_clocks->zstate_support;
                }
index a1011f3273f384cf7f0980a434e36bbce45d117a..1c0415366216757cd3b7f886baf4dfea8618330e 100644 (file)
@@ -306,23 +306,28 @@ void dcn31_smu_transfer_wm_table_dram_2_smu(struct clk_mgr_internal *clk_mgr)
                        VBIOSSMC_MSG_TransferTableDram2Smu, TABLE_WATERMARKS);
 }
 
-void dcn31_smu_set_Z9_support(struct clk_mgr_internal *clk_mgr, bool support)
+void dcn31_smu_set_zstate_support(struct clk_mgr_internal *clk_mgr, enum dcn_zstate_support_state support)
 {
        //TODO: Work with smu team to define optimization options.
-       unsigned int msg_id;
+       unsigned int msg_id, param;
 
        if (!clk_mgr->smu_present)
                return;
 
-       if (support)
-               msg_id = VBIOSSMC_MSG_AllowZstatesEntry;
+       if (support == DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY)
+               param = 1;
        else
+               param = 0;
+
+       if (support == DCN_ZSTATE_SUPPORT_DISALLOW)
                msg_id = VBIOSSMC_MSG_DisallowZstatesEntry;
+       else
+               msg_id = VBIOSSMC_MSG_AllowZstatesEntry;
 
        dcn31_smu_send_msg_with_param(
                clk_mgr,
                msg_id,
-               0);
+               param);
 
 }
 
index cd0b7e1e685f8bfb8a9da8267548ad61fe695af5..dfa25a76a6d10aecbd3f2e690097af331dc00375 100644 (file)
@@ -265,7 +265,7 @@ void dcn31_smu_set_dram_addr_low(struct clk_mgr_internal *clk_mgr, uint32_t addr
 void dcn31_smu_transfer_dpm_table_smu_2_dram(struct clk_mgr_internal *clk_mgr);
 void dcn31_smu_transfer_wm_table_dram_2_smu(struct clk_mgr_internal *clk_mgr);
 
-void dcn31_smu_set_Z9_support(struct clk_mgr_internal *clk_mgr, bool support);
+void dcn31_smu_set_zstate_support(struct clk_mgr_internal *clk_mgr, enum dcn_zstate_support_state support);
 void dcn31_smu_set_dtbclk(struct clk_mgr_internal *clk_mgr, bool enable);
 
 #endif /* DAL_DC_31_SMU_H_ */
index 263f7edd42a4a6d1be345b4dd878c701d36cb474..b5e15da2901779cd8ec785c4a1657d9d6536943c 100644 (file)
@@ -396,6 +396,7 @@ enum dcn_pwr_state {
 enum dcn_zstate_support_state {
        DCN_ZSTATE_SUPPORT_UNKNOWN,
        DCN_ZSTATE_SUPPORT_ALLOW,
+       DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY,
        DCN_ZSTATE_SUPPORT_DISALLOW,
 };
 #endif
index 2bc93df023ad26d54ac9e211ff749a1e2a5a3eec..d0a5c7afa2653e8843c92ee41e1a8685241a91d6 100644 (file)
@@ -3093,8 +3093,14 @@ static enum dcn_zstate_support_state  decide_zstate_support(struct dc *dc, struc
        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 && context->bw_ctx.dml.vba.StutterPeriod > 5000.0)
+               /* zstate only supported on PWRSEQ0 */
+               if (link->link_index != 0)
+                       return DCN_ZSTATE_SUPPORT_DISALLOW;
+
+               if (context->bw_ctx.dml.vba.StutterPeriod > 5000.0)
                        return DCN_ZSTATE_SUPPORT_ALLOW;
+               else if (link->psr_settings.psr_feature_enabled)
+                       return DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY;
                else
                        return DCN_ZSTATE_SUPPORT_DISALLOW;
        } else