From: Samson Tam <[email protected]>

[Why]
During init_pipes, otg master is not initialized. So mpc tree is
still configured even if mpc bottom is not active

[How]
For pipes that have tg enabled, check their mpc tree and clear
opp_list if mpc bottom is not active

Reviewed-by: George Shen <[email protected]>
Acked-by: Wayne Lin <[email protected]>
Signed-off-by: Samson Tam <[email protected]>
---
 .../drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c  | 16 ++++++++++++++++
 .../drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c  | 16 ++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c
index 314798400b16..e0c3c14d12f3 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c
@@ -1366,6 +1366,7 @@ void dcn10_init_pipes(struct dc *dc, struct dc_state 
*context)
        struct dce_hwseq *hws = dc->hwseq;
        struct hubbub *hubbub = dc->res_pool->hubbub;
        bool can_apply_seamless_boot = false;
+       bool tg_enabled[MAX_PIPES] = {false};
 
        for (i = 0; i < context->stream_count; i++) {
                if (context->streams[i]->apply_seamless_boot_optimization) {
@@ -1447,6 +1448,7 @@ void dcn10_init_pipes(struct dc *dc, struct dc_state 
*context)
                        // requesting data while in PSR.
                        tg->funcs->tg_init(tg);
                        hubp->power_gated = true;
+                       tg_enabled[i] = true;
                        continue;
                }
 
@@ -1488,6 +1490,20 @@ void dcn10_init_pipes(struct dc *dc, struct dc_state 
*context)
                tg->funcs->tg_init(tg);
        }
 
+       /* Clean up MPC tree */
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               if (tg_enabled[i]) {
+                       if (dc->res_pool->opps[i]->mpc_tree_params.opp_list) {
+                               if 
(dc->res_pool->opps[i]->mpc_tree_params.opp_list->mpcc_bot) {
+                                       int bot_id = 
dc->res_pool->opps[i]->mpc_tree_params.opp_list->mpcc_bot->mpcc_id;
+
+                                       if ((bot_id < MAX_MPCC) && (bot_id < 
MAX_PIPES) && (!tg_enabled[bot_id]))
+                                               
dc->res_pool->opps[i]->mpc_tree_params.opp_list = NULL;
+                               }
+                       }
+               }
+       }
+
        /* Power gate DSCs */
        if (hws->funcs.dsc_pg_control != NULL) {
                uint32_t num_opps = 0;
diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c
index 2e8ec58a16eb..26ab60deb12d 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c
@@ -720,6 +720,7 @@ void dcn35_init_pipes(struct dc *dc, struct dc_state 
*context)
        struct hubbub *hubbub = dc->res_pool->hubbub;
        struct pg_cntl *pg_cntl = dc->res_pool->pg_cntl;
        bool can_apply_seamless_boot = false;
+       bool tg_enabled[MAX_PIPES] = {false};
 
        for (i = 0; i < context->stream_count; i++) {
                if (context->streams[i]->apply_seamless_boot_optimization) {
@@ -801,6 +802,7 @@ void dcn35_init_pipes(struct dc *dc, struct dc_state 
*context)
                        // requesting data while in PSR.
                        tg->funcs->tg_init(tg);
                        hubp->power_gated = true;
+                       tg_enabled[i] = true;
                        continue;
                }
 
@@ -842,6 +844,20 @@ void dcn35_init_pipes(struct dc *dc, struct dc_state 
*context)
                tg->funcs->tg_init(tg);
        }
 
+       /* Clean up MPC tree */
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               if (tg_enabled[i]) {
+                       if (dc->res_pool->opps[i]->mpc_tree_params.opp_list) {
+                               if 
(dc->res_pool->opps[i]->mpc_tree_params.opp_list->mpcc_bot) {
+                                       int bot_id = 
dc->res_pool->opps[i]->mpc_tree_params.opp_list->mpcc_bot->mpcc_id;
+
+                                       if ((bot_id < MAX_MPCC) && (bot_id < 
MAX_PIPES) && (!tg_enabled[bot_id]))
+                                               
dc->res_pool->opps[i]->mpc_tree_params.opp_list = NULL;
+                               }
+                       }
+               }
+       }
+
        if (pg_cntl != NULL) {
                if (pg_cntl->funcs->dsc_pg_control != NULL) {
                        uint32_t num_opps = 0;
-- 
2.37.3

Reply via email to