From: Leo Zeng <leo.z...@amd.com>

[WHY]
We want to add a visual confirm mode for DCC and MCache for
debugging purpose.

[HOW]
color pipes based on whether DCC is enabled and what MCache id
is used.
black - DCC disabled
red - DCC enabled
grey - 2 different MCaches used
other colors - 1 MCache used

Reviewed-by: Dillon Varone <dillon.var...@amd.com>
Signed-off-by: Leo Zeng <leo.z...@amd.com>
Signed-off-by: Wayne Lin <wayne....@amd.com>
---
 drivers/gpu/drm/amd/display/dc/core/dc.c      |  8 ++--
 .../drm/amd/display/dc/core/dc_hw_sequencer.c | 48 +++++++++++++++++++
 drivers/gpu/drm/amd/display/dc/dc.h           |  1 +
 .../drm/amd/display/dc/hwss/hw_sequencer.h    |  5 ++
 4 files changed, 59 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index fe59649d3e15..e71ea21401f5 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -1202,6 +1202,8 @@ static void dc_update_visual_confirm_color(struct dc *dc, 
struct dc_state *conte
                        get_surface_tile_visual_confirm_color(pipe_ctx, 
&(pipe_ctx->visual_confirm_color));
                else if (dc->debug.visual_confirm == VISUAL_CONFIRM_HW_CURSOR)
                        get_cursor_visual_confirm_color(pipe_ctx, 
&(pipe_ctx->visual_confirm_color));
+               else if (dc->debug.visual_confirm == VISUAL_CONFIRM_DCC)
+                       get_dcc_visual_confirm_color(dc, pipe_ctx, 
&(pipe_ctx->visual_confirm_color));
                else {
                        if (dc->ctx->dce_version < DCN_VERSION_2_0)
                                color_space_to_black_color(
@@ -3956,6 +3958,9 @@ static void commit_planes_for_stream(struct dc *dc,
        if (update_type == UPDATE_TYPE_FULL && dc->optimized_required)
                hwss_process_outstanding_hw_updates(dc, dc->current_state);
 
+       if (update_type != UPDATE_TYPE_FAST && 
dc->res_pool->funcs->prepare_mcache_programming)
+               dc->res_pool->funcs->prepare_mcache_programming(dc, context);
+
        for (i = 0; i < dc->res_pool->pipe_count; i++) {
                struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
 
@@ -4014,9 +4019,6 @@ static void commit_planes_for_stream(struct dc *dc,
                                odm_pipe->ttu_regs.min_ttu_vblank = MAX_TTU;
        }
 
-       if (update_type != UPDATE_TYPE_FAST && 
dc->res_pool->funcs->prepare_mcache_programming)
-               dc->res_pool->funcs->prepare_mcache_programming(dc, context);
-
        if ((update_type != UPDATE_TYPE_FAST) && 
stream->update_flags.bits.dsc_changed)
                if (top_pipe_to_program &&
                        
top_pipe_to_program->stream_res.tg->funcs->lock_doublebuffer_enable) {
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
index 367c6b794412..e0277728268a 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
@@ -34,6 +34,7 @@
 #include "dc_state_priv.h"
 
 #define NUM_ELEMENTS(a) (sizeof(a) / sizeof((a)[0]))
+#define MAX_NUM_MCACHE 8
 
 /* used as index in array of black_color_format */
 enum black_color_format {
@@ -553,6 +554,53 @@ void get_cursor_visual_confirm_color(
        }
 }
 
+void get_dcc_visual_confirm_color(
+       struct dc *dc,
+       struct pipe_ctx *pipe_ctx,
+       struct tg_color *color)
+{
+       const uint32_t MCACHE_ID_UNASSIGNED = 0xF;
+
+       if (!pipe_ctx->plane_state->dcc.enable) {
+               color->color_r_cr = 0; /* black - DCC disabled */
+               color->color_g_y = 0;
+               color->color_b_cb = 0;
+               return;
+       }
+
+       if (dc->ctx->dce_version < DCN_VERSION_4_01) {
+               color->color_r_cr = MAX_TG_COLOR_VALUE; /* red - DCC enabled */
+               color->color_g_y = 0;
+               color->color_b_cb = 0;
+               return;
+       }
+
+       uint32_t first_id = pipe_ctx->mcache_regs.main.p0.mcache_id_first;
+       uint32_t second_id = pipe_ctx->mcache_regs.main.p0.mcache_id_second;
+
+       if (first_id != MCACHE_ID_UNASSIGNED && second_id != 
MCACHE_ID_UNASSIGNED && first_id != second_id) {
+               color->color_r_cr = MAX_TG_COLOR_VALUE/2; /* grey - 2 mcache */
+               color->color_g_y = MAX_TG_COLOR_VALUE/2;
+               color->color_b_cb = MAX_TG_COLOR_VALUE/2;
+       }
+
+       else if (first_id != MCACHE_ID_UNASSIGNED || second_id != 
MCACHE_ID_UNASSIGNED) {
+               const struct tg_color id_colors[MAX_NUM_MCACHE] = {
+               {0, MAX_TG_COLOR_VALUE, 0}, /* green */
+               {0, 0, MAX_TG_COLOR_VALUE}, /* blue */
+               {MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE, 0}, /* yellow */
+               {MAX_TG_COLOR_VALUE, 0, MAX_TG_COLOR_VALUE}, /* magenta */
+               {0, MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE}, /* cyan */
+               {MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE}, 
/* white */
+               {MAX_TG_COLOR_VALUE/2, 0, 0}, /* dark red */
+               {0, MAX_TG_COLOR_VALUE/2, 0}, /* dark green */
+               };
+
+               uint32_t assigned_id = (first_id != MCACHE_ID_UNASSIGNED) ? 
first_id : second_id;
+               *color = id_colors[assigned_id];
+       }
+}
+
 void set_p_state_switch_method(
                struct dc *dc,
                struct dc_state *context,
diff --git a/drivers/gpu/drm/amd/display/dc/dc.h 
b/drivers/gpu/drm/amd/display/dc/dc.h
index f646f537a3dc..02bf6fe51a0d 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -495,6 +495,7 @@ enum visual_confirm {
        VISUAL_CONFIRM_FAMS2 = 19,
        VISUAL_CONFIRM_HW_CURSOR = 20,
        VISUAL_CONFIRM_VABC = 21,
+       VISUAL_CONFIRM_DCC = 22,
 };
 
 enum dc_psr_power_opts {
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 599fa41fd75f..2b1a2a00648a 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h
+++ b/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h
@@ -517,6 +517,11 @@ void get_cursor_visual_confirm_color(
                struct pipe_ctx *pipe_ctx,
                struct tg_color *color);
 
+void get_dcc_visual_confirm_color(
+       struct dc *dc,
+       struct pipe_ctx *pipe_ctx,
+       struct tg_color *color);
+
 void set_p_state_switch_method(
                struct dc *dc,
                struct dc_state *context,
-- 
2.37.3

Reply via email to