From: Dillon Varone <[email protected]>

[WHY&HOW]
Support overriding UTM client QC profiles for testing.

Reviewed-by: Alvin Lee <[email protected]>
Signed-off-by: Dillon Varone <[email protected]>
Signed-off-by: Tom Chung <[email protected]>
---
 drivers/gpu/drm/amd/display/dc/dc.h           |  2 ++
 .../display/dc/hubbub/dcn10/dcn10_hubbub.h    |  7 ++++++-
 .../display/dc/hubbub/dcn60/dcn60_hubbub.c    | 21 +++++++++++++++++++
 .../display/dc/hubbub/dcn60/dcn60_hubbub.h    |  6 +++++-
 .../amd/display/dc/hwss/dcn60/dcn60_hwseq.c   |  6 ++++++
 .../gpu/drm/amd/display/dc/inc/hw/dchubbub.h  |  1 +
 .../dc/resource/dcn60/dcn60_resource.h        |  3 ++-
 7 files changed, 43 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dc.h 
b/drivers/gpu/drm/amd/display/dc/dc.h
index 705c500ad711..6e45a484a9ad 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -1321,6 +1321,8 @@ struct dc_debug_options {
        bool disable_dynamic_expansion_for_test_pattern;
        uint32_t dml21_custom_derate_num_dpms;
        uint32_t dml21_custom_derate_at_dpm[DML2_MAX_NUM_DPM_LVL];
+       bool override_utm_client_qc_profile;
+       uint8_t utm_client_qc_profiles[4];
 };
 
 
diff --git a/drivers/gpu/drm/amd/display/dc/hubbub/dcn10/dcn10_hubbub.h 
b/drivers/gpu/drm/amd/display/dc/hubbub/dcn10/dcn10_hubbub.h
index accb79c6dde5..5f065b4045ee 100644
--- a/drivers/gpu/drm/amd/display/dc/hubbub/dcn10/dcn10_hubbub.h
+++ b/drivers/gpu/drm/amd/display/dc/hubbub/dcn10/dcn10_hubbub.h
@@ -215,6 +215,7 @@ struct dcn_hubbub_registers {
        uint32_t DC_PERFMON5_PERFMON_HI;
        uint32_t DC_PERFMON5_PERFMON_LOW;
        uint32_t FMON_CTRL;
+       uint32_t UTM_CLIENT_TO_SYSTEM_PROFILE_MAPPING_0;
 };
 
 #define HUBBUB_REG_FIELD_LIST_DCN32(type) \
@@ -545,7 +546,11 @@ struct dcn_hubbub_registers {
 
 #define HUBBUB_REG_FIELD_LIST_DCN60(type) \
                type DCHUBBUB_ARB_BUFFER_FULLNESS_WATERMARK_A;\
-               type DCHUBBUB_ARB_BUFFER_FULLNESS_WATERMARK_B
+               type DCHUBBUB_ARB_BUFFER_FULLNESS_WATERMARK_B;\
+               type SYSTEM_PROFILE_QC0;\
+               type SYSTEM_PROFILE_QC1;\
+               type SYSTEM_PROFILE_QC2;\
+               type SYSTEM_PROFILE_QC3
 
 struct dcn_hubbub_shift {
        DCN_HUBBUB_REG_FIELD_LIST(uint8_t);
diff --git a/drivers/gpu/drm/amd/display/dc/hubbub/dcn60/dcn60_hubbub.c 
b/drivers/gpu/drm/amd/display/dc/hubbub/dcn60/dcn60_hubbub.c
index 3994e73a2992..e2a457ab13bb 100644
--- a/drivers/gpu/drm/amd/display/dc/hubbub/dcn60/dcn60_hubbub.c
+++ b/drivers/gpu/drm/amd/display/dc/hubbub/dcn60/dcn60_hubbub.c
@@ -1730,6 +1730,26 @@ static void hubbub60_reset_display_qos_profile(struct 
hubbub *hubbub)
        REG_UPDATE(DCHUBBUB_ARB_QOS_FORCE, DCHUBBUB_ARB_UTM_FORCE_URGENT, 0);
 }
 
+static void hubbub60_override_utm_client_qc_profile(struct hubbub *hubbub, 
uint8_t qc_profile, int index)
+{
+       struct dcn20_hubbub *hubbub2 = TO_DCN20_HUBBUB(hubbub);
+
+       switch (index) {
+       case 0:
+               REG_UPDATE(UTM_CLIENT_TO_SYSTEM_PROFILE_MAPPING_0, 
SYSTEM_PROFILE_QC0, qc_profile);
+               break;
+       case 1:
+               REG_UPDATE(UTM_CLIENT_TO_SYSTEM_PROFILE_MAPPING_0, 
SYSTEM_PROFILE_QC1, qc_profile);
+               break;
+       case 2:
+               REG_UPDATE(UTM_CLIENT_TO_SYSTEM_PROFILE_MAPPING_0, 
SYSTEM_PROFILE_QC2, qc_profile);
+               break;
+       default:
+               BREAK_TO_DEBUGGER();
+               break;
+       }
+}
+
 static const struct hubbub_funcs hubbub60_funcs = {
        .update_dchub = hubbub2_update_dchub,
        .init_dchub_sys_ctx = hubbub3_init_dchub_sys_ctx,
@@ -1755,6 +1775,7 @@ static const struct hubbub_funcs hubbub60_funcs = {
        .program_compbuf_segments = dcn60_program_compbuf_segments,
        .wait_for_det_update = dcn60_wait_for_det_update,
        .program_arbiter = dcn401_program_arbiter,
+       .override_utm_client_qc_profile = 
hubbub60_override_utm_client_qc_profile,
        .hubbub_read_reg_state = hubbub3_read_reg_state,
        .perfmon = {
                .reset = hubbub60_perfmon_reset,
diff --git a/drivers/gpu/drm/amd/display/dc/hubbub/dcn60/dcn60_hubbub.h 
b/drivers/gpu/drm/amd/display/dc/hubbub/dcn60/dcn60_hubbub.h
index 204f422c3383..03b5182d233c 100644
--- a/drivers/gpu/drm/amd/display/dc/hubbub/dcn60/dcn60_hubbub.h
+++ b/drivers/gpu/drm/amd/display/dc/hubbub/dcn60/dcn60_hubbub.h
@@ -193,7 +193,11 @@
        HUBBUB_SF(DCHUBBUB_ARB_QOS_FORCE, DCHUBBUB_ARB_UTM_FORCE_URGENT, 
mask_sh), \
        HUBBUB_SF(DCHUBBUB_ARB_QOS_FORCE, 
DCHUBBUB_ARB_UTM_FORCE_BANDWIDTH_OVERHEAD, mask_sh), \
        HUBBUB_SF(DCHUBBUB_ARB_QOS_FORCE, DCHUBBUB_ARB_UTM_FORCE_ENABLE, 
mask_sh), \
-       HUBBUB_SF(DCHUBBUB_ARB_QOS_FORCE, 
DCHUBBUB_ARB_DO_NOT_FORCE_URGENCY_DURING_PSTATE_CHANGE_REQUEST, mask_sh)
+       HUBBUB_SF(DCHUBBUB_ARB_QOS_FORCE, 
DCHUBBUB_ARB_DO_NOT_FORCE_URGENCY_DURING_PSTATE_CHANGE_REQUEST, mask_sh), \
+       HUBBUB_SF(UTM_CLIENT_TO_SYSTEM_PROFILE_MAPPING_0, SYSTEM_PROFILE_QC0, 
mask_sh), \
+       HUBBUB_SF(UTM_CLIENT_TO_SYSTEM_PROFILE_MAPPING_0, SYSTEM_PROFILE_QC1, 
mask_sh), \
+       HUBBUB_SF(UTM_CLIENT_TO_SYSTEM_PROFILE_MAPPING_0, SYSTEM_PROFILE_QC2, 
mask_sh), \
+       HUBBUB_SF(UTM_CLIENT_TO_SYSTEM_PROFILE_MAPPING_0, SYSTEM_PROFILE_QC3, 
mask_sh)
 
 void hubbub60_construct(struct dcn20_hubbub *hubbub2,
        struct dc_context *ctx,
diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn60/dcn60_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/hwss/dcn60/dcn60_hwseq.c
index 72c2d3ca52f6..14adf1a3a1e0 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/dcn60/dcn60_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn60/dcn60_hwseq.c
@@ -753,6 +753,12 @@ void dcn60_init_hw(struct dc *dc)
        if (dc->res_pool->hubbub->funcs->set_request_limit && 
dc->config.sdpif_request_limit_words_per_umc > 0)
                
dc->res_pool->hubbub->funcs->set_request_limit(dc->res_pool->hubbub, 
dc->ctx->dc_bios->vram_info.num_chans, 
dc->config.sdpif_request_limit_words_per_umc);
 
+       if (dc->res_pool->hubbub->funcs->override_utm_client_qc_profile && 
dc->debug.override_utm_client_qc_profile) {
+               
dc->res_pool->hubbub->funcs->override_utm_client_qc_profile(dc->res_pool->hubbub,
 dc->debug.utm_client_qc_profiles[0], 0);
+               
dc->res_pool->hubbub->funcs->override_utm_client_qc_profile(dc->res_pool->hubbub,
 dc->debug.utm_client_qc_profiles[1], 1);
+               
dc->res_pool->hubbub->funcs->override_utm_client_qc_profile(dc->res_pool->hubbub,
 dc->debug.utm_client_qc_profiles[2], 2);
+       }
+
        // Get DMCUB capabilities
        if (dc->ctx->dmub_srv) {
                dc_dmub_srv_query_caps_cmd(dc->ctx->dmub_srv);
diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h 
b/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h
index 02bc0010e565..22a0e3dcb25c 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h
@@ -253,6 +253,7 @@ struct hubbub_funcs {
        void (*wait_for_det_update)(struct hubbub *hubbub, int hubp_inst);
        bool (*program_arbiter)(struct hubbub *hubbub, struct 
dml2_display_arb_regs *arb_regs, bool safe_to_lower);
        void (*dchvm_init)(struct hubbub *hubbub);
+       void (*override_utm_client_qc_profile)(struct hubbub *hubbub, uint8_t 
qc_profile, int index);
 
        /* Performance monitoring related functions */
        struct hubbub_perfmon_funcs {
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn60/dcn60_resource.h 
b/drivers/gpu/drm/amd/display/dc/resource/dcn60/dcn60_resource.h
index c4b6df4838c6..913f049deeb3 100644
--- a/drivers/gpu/drm/amd/display/dc/resource/dcn60/dcn60_resource.h
+++ b/drivers/gpu/drm/amd/display/dc/resource/dcn60/dcn60_resource.h
@@ -140,7 +140,8 @@ bool dcn50_program_mcache_pipe_config(struct dc_state 
*context,
        SR(DC_PERFMON5_PERFMON_HI),                                             
 \
        SR(DC_PERFMON5_PERFMON_LOW),                                            
 \
        SR(FMON_CTRL),                                                          
 \
-       SR(DCHUBBUB_ARB_QOS_FORCE)
+       SR(DCHUBBUB_ARB_QOS_FORCE),                                             
 \
+       SR(UTM_CLIENT_TO_SYSTEM_PROFILE_MAPPING_0)
 
 /* HUBP */
 #define HUBP_REG_LIST_DCN60_RI(id)                                             
  \
-- 
2.43.0

Reply via email to