From: Dillon Varone <[email protected]>

Revert commit 14978d267e12 ("drm/amd/display: Add 3DLUT DMA broadcast support")

[WHY&HOW]
Dependencies of this change are still causing issues, so reverting until
those can be fixed.

Reviewed-by: Martin Leung <[email protected]>
Signed-off-by: Dillon Varone <[email protected]>
Signed-off-by: Chuanyu Tseng <[email protected]>
---
 drivers/gpu/drm/amd/display/dc/core/dc.c      |   2 +-
 .../amd/display/dc/hwss/dcn401/dcn401_hwseq.c | 109 ++++++++----------
 .../amd/display/dc/hwss/dcn401/dcn401_hwseq.h |   3 +-
 .../drm/amd/display/dc/hwss/hw_sequencer.h    |   2 +-
 4 files changed, 49 insertions(+), 67 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 1db99c14876a..e0eba1bf2dde 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -4671,7 +4671,7 @@ static void commit_planes_for_stream(struct dc *dc,
                                                
srf_updates[i].cm->flags.bits.lut3d_enable &&
                                                
srf_updates[i].cm->flags.bits.lut3d_dma_enable &&
                                                dc->hwss.trigger_3dlut_dma_load)
-                                       
dc->hwss.trigger_3dlut_dma_load(pipe_ctx);
+                                       dc->hwss.trigger_3dlut_dma_load(dc, 
pipe_ctx);
 
                                /*program triple buffer after lock based on 
flip type*/
                                if (dc->hwss.program_triplebuffer != NULL && 
dc->debug.enable_tri_buf) {
diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c
index 56d4c350d8c9..a11dd9dd703b 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c
@@ -369,14 +369,13 @@ void dcn401_init_hw(struct dc *dc)
        }
 }
 
-void dcn401_trigger_3dlut_dma_load(struct pipe_ctx *pipe_ctx)
+void dcn401_trigger_3dlut_dma_load(struct dc *dc, struct pipe_ctx *pipe_ctx)
 {
-       const struct pipe_ctx *primary_dpp_pipe_ctx = 
resource_get_primary_dpp_pipe(pipe_ctx);
-       struct hubp *primary_hubp = primary_dpp_pipe_ctx ?
-                       primary_dpp_pipe_ctx->plane_res.hubp : NULL;
+       (void)dc;
+       struct hubp *hubp = pipe_ctx->plane_res.hubp;
 
-       if (primary_hubp && primary_hubp->funcs->hubp_enable_3dlut_fl) {
-               primary_hubp->funcs->hubp_enable_3dlut_fl(primary_hubp, true);
+       if (hubp->funcs->hubp_enable_3dlut_fl) {
+               hubp->funcs->hubp_enable_3dlut_fl(hubp, true);
        }
 }
 
@@ -384,11 +383,8 @@ bool dcn401_set_mcm_luts(struct pipe_ctx *pipe_ctx,
                                const struct dc_plane_state *plane_state)
 {
        struct dc *dc = pipe_ctx->plane_res.hubp->ctx->dc;
-       const struct pipe_ctx *primary_dpp_pipe_ctx = 
resource_get_primary_dpp_pipe(pipe_ctx);
        struct dpp *dpp_base = pipe_ctx->plane_res.dpp;
        struct hubp *hubp = pipe_ctx->plane_res.hubp;
-       struct hubp *primary_hubp =     primary_dpp_pipe_ctx ?
-                       primary_dpp_pipe_ctx->plane_res.hubp : NULL;
        const struct dc_plane_cm *cm = &plane_state->cm;
        int mpcc_id = hubp->inst;
        struct mpc *mpc = dc->res_pool->mpc;
@@ -486,41 +482,25 @@ bool dcn401_set_mcm_luts(struct pipe_ctx *pipe_ctx,
                        mpc->funcs->program_lut_read_write_control(mpc, 
MCM_LUT_3DLUT, lut_bank_a, 12, mpcc_id);
 
                if (mpc->funcs->update_3dlut_fast_load_select)
-                       mpc->funcs->update_3dlut_fast_load_select(mpc, mpcc_id, 
primary_hubp->inst);
+                       mpc->funcs->update_3dlut_fast_load_select(mpc, mpcc_id, 
hubp->inst);
 
                /* HUBP */
-               if (primary_hubp->inst == hubp->inst) {
-                       /* only program if this is the primary dpp pipe for the 
given plane */
-                       if (hubp->funcs->hubp_program_3dlut_fl_config)
-                               hubp->funcs->hubp_program_3dlut_fl_config(hubp, 
&cm->lut3d_dma);
+               if (hubp->funcs->hubp_program_3dlut_fl_config)
+                       hubp->funcs->hubp_program_3dlut_fl_config(hubp, 
&cm->lut3d_dma);
 
-                       if (hubp->funcs->hubp_program_3dlut_fl_crossbar)
-                               
hubp->funcs->hubp_program_3dlut_fl_crossbar(hubp, cm->lut3d_dma.format);
+               if (hubp->funcs->hubp_program_3dlut_fl_crossbar)
+                       hubp->funcs->hubp_program_3dlut_fl_crossbar(hubp, 
cm->lut3d_dma.format);
 
-                       if (hubp->funcs->hubp_program_3dlut_fl_addr)
-                               hubp->funcs->hubp_program_3dlut_fl_addr(hubp, 
&cm->lut3d_dma.addr);
+               if (hubp->funcs->hubp_program_3dlut_fl_addr)
+                       hubp->funcs->hubp_program_3dlut_fl_addr(hubp, 
&cm->lut3d_dma.addr);
 
-                       if (hubp->funcs->hubp_enable_3dlut_fl) {
-                               hubp->funcs->hubp_enable_3dlut_fl(hubp, true);
-                       } else {
-                               /* GPU memory only supports fast load path */
-                               BREAK_TO_DEBUGGER();
-                               lut_enable = false;
-                               result = false;
-                       }
+               if (hubp->funcs->hubp_enable_3dlut_fl) {
+                       hubp->funcs->hubp_enable_3dlut_fl(hubp, true);
                } else {
-                       /* re-trigger priamry HUBP to load 3DLUT */
-                       if (primary_hubp->funcs->hubp_enable_3dlut_fl) {
-                               
primary_hubp->funcs->hubp_enable_3dlut_fl(primary_hubp, true);
-                       }
-
-                       /* clear FL setup on this pipe's HUBP */
-                       memset(&lut3d_dma, 0, sizeof(lut3d_dma));
-                       if (hubp->funcs->hubp_program_3dlut_fl_config)
-                               hubp->funcs->hubp_program_3dlut_fl_config(hubp, 
&lut3d_dma);
-
-                       if (hubp->funcs->hubp_enable_3dlut_fl)
-                               hubp->funcs->hubp_enable_3dlut_fl(hubp, false);
+                       /* GPU memory only supports fast load path */
+                       BREAK_TO_DEBUGGER();
+                       lut_enable = false;
+                       result = false;
                }
        } else {
                /* Legacy (Host) Load Mode */
@@ -1830,41 +1810,42 @@ void dcn401_perform_3dlut_wa_unlock(struct pipe_ctx 
*pipe_ctx)
         * This is meant to work around a known HW issue where VREADY will 
cancel the pending 3DLUT_ENABLE signal regardless
         * of whether OTG lock is currently being held or not.
         */
-       const struct pipe_ctx *otg_master_pipe_ctx = 
resource_get_otg_master(pipe_ctx);
-       struct timing_generator *tg = otg_master_pipe_ctx ?
-                       otg_master_pipe_ctx->stream_res.tg : NULL;
-       const struct pipe_ctx *primary_dpp_pipe_ctx = 
resource_is_pipe_type(pipe_ctx, DPP_PIPE) ?
-                       resource_get_primary_dpp_pipe(pipe_ctx) : pipe_ctx;
-       struct hubp *primary_hubp = primary_dpp_pipe_ctx ?
-                       primary_dpp_pipe_ctx->plane_res.hubp : NULL;
-
-       if (!otg_master_pipe_ctx && !tg) {
-               return;
+       struct pipe_ctx *wa_pipes[MAX_PIPES] = { NULL };
+       struct pipe_ctx *odm_pipe, *mpc_pipe;
+       int i, wa_pipe_ct = 0;
+
+       for (odm_pipe = pipe_ctx; odm_pipe != NULL; odm_pipe = 
odm_pipe->next_odm_pipe) {
+               for (mpc_pipe = odm_pipe; mpc_pipe != NULL; mpc_pipe = 
mpc_pipe->bottom_pipe) {
+                       if (mpc_pipe->plane_state &&
+                                       
mpc_pipe->plane_state->cm.flags.bits.lut3d_enable &&
+                                       
mpc_pipe->plane_state->cm.flags.bits.lut3d_dma_enable) {
+                               wa_pipes[wa_pipe_ct++] = mpc_pipe;
+                       }
+               }
        }
 
-       if (primary_dpp_pipe_ctx &&
-                       primary_dpp_pipe_ctx->plane_state &&
-                       
primary_dpp_pipe_ctx->plane_state->cm.flags.bits.lut3d_enable &&
-                       
primary_dpp_pipe_ctx->plane_state->cm.flags.bits.lut3d_dma_enable) {
-               if (tg->funcs->set_vupdate_keepout)
-                       tg->funcs->set_vupdate_keepout(tg, true);
+       if (wa_pipe_ct > 0) {
+               if (pipe_ctx->stream_res.tg->funcs->set_vupdate_keepout)
+                       
pipe_ctx->stream_res.tg->funcs->set_vupdate_keepout(pipe_ctx->stream_res.tg, 
true);
 
-               if (primary_hubp->funcs->hubp_enable_3dlut_fl) {
-                       primary_hubp->funcs->hubp_enable_3dlut_fl(primary_hubp, 
true);
+               for (i = 0; i < wa_pipe_ct; ++i) {
+                       if 
(wa_pipes[i]->plane_res.hubp->funcs->hubp_enable_3dlut_fl)
+                               
wa_pipes[i]->plane_res.hubp->funcs->hubp_enable_3dlut_fl(wa_pipes[i]->plane_res.hubp,
 true);
                }
 
-               tg->funcs->unlock(tg);
-               if (tg->funcs->wait_update_lock_status)
-                       tg->funcs->wait_update_lock_status(tg, false);
+               pipe_ctx->stream_res.tg->funcs->unlock(pipe_ctx->stream_res.tg);
+               if (pipe_ctx->stream_res.tg->funcs->wait_update_lock_status)
+                       
pipe_ctx->stream_res.tg->funcs->wait_update_lock_status(pipe_ctx->stream_res.tg,
 false);
 
-               if (primary_hubp->funcs->hubp_enable_3dlut_fl) {
-                       primary_hubp->funcs->hubp_enable_3dlut_fl(primary_hubp, 
true);
+               for (i = 0; i < wa_pipe_ct; ++i) {
+                       if 
(wa_pipes[i]->plane_res.hubp->funcs->hubp_enable_3dlut_fl)
+                               
wa_pipes[i]->plane_res.hubp->funcs->hubp_enable_3dlut_fl(wa_pipes[i]->plane_res.hubp,
 true);
                }
 
-               if (tg->funcs->set_vupdate_keepout)
-                       tg->funcs->set_vupdate_keepout(tg, false);
+               if (pipe_ctx->stream_res.tg->funcs->set_vupdate_keepout)
+                       
pipe_ctx->stream_res.tg->funcs->set_vupdate_keepout(pipe_ctx->stream_res.tg, 
false);
        } else {
-               tg->funcs->unlock(tg);
+               pipe_ctx->stream_res.tg->funcs->unlock(pipe_ctx->stream_res.tg);
        }
 }
 
diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.h 
b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.h
index b9a03ffa2717..f78162ab859b 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.h
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.h
@@ -41,7 +41,8 @@ bool dcn401_set_mcm_luts(struct pipe_ctx *pipe_ctx,
 bool dcn401_set_output_transfer_func(struct dc *dc,
                                struct pipe_ctx *pipe_ctx,
                                const struct dc_stream_state *stream);
-void dcn401_trigger_3dlut_dma_load(struct pipe_ctx *pipe_ctx);
+void dcn401_trigger_3dlut_dma_load(struct dc *dc,
+                               struct pipe_ctx *pipe_ctx);
 void dcn401_calculate_dccg_tmds_div_value(struct pipe_ctx *pipe_ctx,
                                unsigned int *tmds_div);
 enum dc_status dcn401_enable_stream_timing(
diff --git a/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h 
b/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h
index 98abe0d2d30f..d1dba7ffcd9b 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h
+++ b/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h
@@ -1120,7 +1120,7 @@ struct hw_sequencer_funcs {
        void (*program_output_csc)(struct dc *dc, struct pipe_ctx *pipe_ctx,
                        enum dc_color_space colorspace,
                        uint16_t *matrix, int opp_id);
-       void (*trigger_3dlut_dma_load)(struct pipe_ctx *pipe_ctx);
+       void (*trigger_3dlut_dma_load)(struct dc *dc, struct pipe_ctx 
*pipe_ctx);
 
        /* VM Related */
        int (*init_sys_ctx)(struct dce_hwseq *hws,
-- 
2.43.0

Reply via email to