return value;
 }
 
+uint32_t generic_indirect_reg_get(const struct dc_context *ctx,
+               uint32_t addr_index, uint32_t addr_data,
+               uint32_t index, int n,
+               uint8_t shift1, uint32_t mask1, uint32_t *field_value1,
+               ...)
+{
+       uint32_t shift, mask, *field_value;
+       uint32_t value = 0;
+       int i = 1;
+
+       va_list ap;
+
+       va_start(ap, field_value1);
+
+       value = generic_read_indirect_reg(ctx, addr_index, addr_data, index);
+       *field_value1 = get_reg_field_value_ex(value, mask1, shift1);
+
+       while (i < n) {
+               shift = va_arg(ap, uint32_t);
+               mask = va_arg(ap, uint32_t);
+               field_value = va_arg(ap, uint32_t *);
+
+               *field_value = get_reg_field_value_ex(value, mask, shift);
+               i++;
+       }
+
+       va_end(ap);
+
+       return value;
+}
 
 uint32_t generic_indirect_reg_update_ex(const struct dc_context *ctx,
                uint32_t addr_index, uint32_t addr_data,
 
  *                     Gamut Remap Mode: [10..9]
  */
 #define CM_TEST_DEBUG_DATA_STATUS_IDX 9
-#define CM_TEST_DEBUG_DATA_ICSC_MODE_SH 3
-#define CM_TEST_DEBUG_DATA_ICSC_MODE_MASK 0x3
-#define CM_TEST_DEBUG_DATA_GAMUT_REMAP_MODE_SH 9
-#define CM_TEST_DEBUG_DATA_GAMUT_REMAP_MODE_MASK 0x3
+
+#define TF_DEBUG_REG_LIST_SH_DCN20 \
+       TF_DEBUG_REG_LIST_SH_DCN10, \
+       .CM_TEST_DEBUG_DATA_ICSC_MODE = 3, \
+       .CM_TEST_DEBUG_DATA_GAMUT_REMAP_MODE = 9
+
+#define TF_DEBUG_REG_LIST_MASK_DCN20 \
+       TF_DEBUG_REG_LIST_MASK_DCN10, \
+       .CM_TEST_DEBUG_DATA_ICSC_MODE = 0x18, \
+       .CM_TEST_DEBUG_DATA_GAMUT_REMAP_MODE = 0x600
 
 #define TF_REG_FIELD_LIST_DCN2_0(type) \
        TF_REG_FIELD_LIST(type) \
        type CM_BLNDGAM_LUT_DATA; \
+       type CM_TEST_DEBUG_DATA_ICSC_MODE; \
+       type CM_TEST_DEBUG_DATA_GAMUT_REMAP_MODE; \
        type FORMAT_CNV16; \
        type CNVC_BYPASS_MSB_ALIGN; \
        type CLAMP_POSITIVE; \
 
         * currently. select the alternate set to double buffer
         * the update so gamut_remap is updated on frame boundary
         */
-       cur_select = IX_REG_READ(CM_TEST_DEBUG_INDEX, CM_TEST_DEBUG_DATA,
-                                       CM_TEST_DEBUG_DATA_STATUS_IDX);
-
-       /* IX_REG_READ reads whole reg, so isolate part we want [10..9] */
-       cur_select = (cur_select >> CM_TEST_DEBUG_DATA_GAMUT_REMAP_MODE_SH)
-                                       & CM_TEST_DEBUG_DATA_GAMUT_REMAP_MODE_MASK;
+       IX_REG_GET(CM_TEST_DEBUG_INDEX, CM_TEST_DEBUG_DATA,
+                                       CM_TEST_DEBUG_DATA_STATUS_IDX,
+                                       CM_TEST_DEBUG_DATA_GAMUT_REMAP_MODE, &cur_select);
 
        /* value stored in dbg reg will be 1 greater than mode we want */
        if (cur_select != DCN2_GAMUT_REMAP_COEF_A)
         * currently.  select the alternate set to double buffer
         * the CSC update so CSC is updated on frame boundary
         */
-       cur_select = IX_REG_READ(CM_TEST_DEBUG_INDEX, CM_TEST_DEBUG_DATA,
-                                       CM_TEST_DEBUG_DATA_STATUS_IDX);
-
-       /* IX_REG_READ reads whole reg, so isolate part we want [4..3] */
-       cur_select = (cur_select >> CM_TEST_DEBUG_DATA_ICSC_MODE_SH)
-                                       & CM_TEST_DEBUG_DATA_ICSC_MODE_MASK;
+       IX_REG_GET(CM_TEST_DEBUG_INDEX, CM_TEST_DEBUG_DATA,
+                                       CM_TEST_DEBUG_DATA_STATUS_IDX,
+                                       CM_TEST_DEBUG_DATA_ICSC_MODE, &cur_select);
 
        if (cur_select != DCN2_ICSC_SELECT_ICSC_A)
                select = DCN2_ICSC_SELECT_ICSC_A;
 
         * currently.  select the alternate set to double buffer
         * the CSC update so CSC is updated on frame boundary
         */
-       cur_mode = IX_REG_READ(MPC_OCSC_TEST_DEBUG_INDEX, MPC_OCSC_TEST_DEBUG_DATA,
-                                               MPC_OCSC_TEST_DEBUG_DATA_STATUS_IDX);
-
-       /* Isolate part of reg data we want [1..0] */
-       cur_mode = cur_mode & MPC_OCSC_TEST_DEBUG_DATA_OCSC_MODE_MASK;
+       IX_REG_GET(MPC_OCSC_TEST_DEBUG_INDEX, MPC_OCSC_TEST_DEBUG_DATA,
+                                               MPC_OCSC_TEST_DEBUG_DATA_STATUS_IDX,
+                                               MPC_OCSC_TEST_DEBUG_DATA_OCSC_MODE, &cur_mode);
 
        if (cur_mode != MPC_OUTPUT_CSC_COEF_A)
                ocsc_mode = MPC_OUTPUT_CSC_COEF_A;
         * currently.  select the alternate set to double buffer
         * the CSC update so CSC is updated on frame boundary
         */
-       cur_mode = IX_REG_READ(MPC_OCSC_TEST_DEBUG_INDEX, MPC_OCSC_TEST_DEBUG_DATA,
-                                               MPC_OCSC_TEST_DEBUG_DATA_STATUS_IDX);
-
-       /* Isolate part of reg data we want [1..0] */
-       cur_mode = cur_mode & MPC_OCSC_TEST_DEBUG_DATA_OCSC_MODE_MASK;
+       IX_REG_GET(MPC_OCSC_TEST_DEBUG_INDEX, MPC_OCSC_TEST_DEBUG_DATA,
+                                               MPC_OCSC_TEST_DEBUG_DATA_STATUS_IDX,
+                                               MPC_OCSC_TEST_DEBUG_DATA_OCSC_MODE, &cur_mode);
 
        if (cur_mode != MPC_OUTPUT_CSC_COEF_A)
                ocsc_mode = MPC_OUTPUT_CSC_COEF_A;
 
        SF(MPCC0_MPCC_TOP_GAIN, MPCC_TOP_GAIN, mask_sh),\
        SF(MPCC0_MPCC_BOT_GAIN_INSIDE, MPCC_BOT_GAIN_INSIDE, mask_sh),\
        SF(MPCC0_MPCC_BOT_GAIN_OUTSIDE, MPCC_BOT_GAIN_OUTSIDE, mask_sh),\
-       SF(MPC_OCSC_TEST_DEBUG_DATA, MPC_OCSC_TEST_DEBUG_DATA, mask_sh),\
        SF(MPC_OCSC_TEST_DEBUG_INDEX, MPC_OCSC_TEST_DEBUG_INDEX, mask_sh),\
        SF(MPC_OUT0_CSC_MODE, MPC_OCSC_MODE, mask_sh),\
        SF(MPC_OUT0_CSC_C11_C12_A, MPC_OCSC_C11_A, mask_sh),\
  *                     OCSC Mode: [1..0]
  */
 #define MPC_OCSC_TEST_DEBUG_DATA_STATUS_IDX 1
-#define MPC_OCSC_TEST_DEBUG_DATA_OCSC_MODE_MASK 0x3
+
+#define MPC_DEBUG_REG_LIST_SH_DCN20 \
+       .MPC_OCSC_TEST_DEBUG_DATA_OCSC_MODE = 0
+
+#define MPC_DEBUG_REG_LIST_MASK_DCN20 \
+       .MPC_OCSC_TEST_DEBUG_DATA_OCSC_MODE = 0x3
 
 #define MPC_REG_FIELD_LIST_DCN2_0(type) \
        MPC_REG_FIELD_LIST(type)\
        type MPCC_TOP_GAIN;\
        type MPCC_BOT_GAIN_INSIDE;\
        type MPCC_BOT_GAIN_OUTSIDE;\
-       type MPC_OCSC_TEST_DEBUG_DATA;\
+       type MPC_OCSC_TEST_DEBUG_DATA_OCSC_MODE;\
        type MPC_OCSC_TEST_DEBUG_INDEX;\
        type MPC_OCSC_MODE;\
        type MPC_OCSC_C11_A;\
 
 
 static const struct dcn2_dpp_shift tf_shift = {
                TF_REG_LIST_SH_MASK_DCN20(__SHIFT),
-               TF_DEBUG_REG_LIST_SH_DCN10
+               TF_DEBUG_REG_LIST_SH_DCN20
 };
 
 static const struct dcn2_dpp_mask tf_mask = {
                TF_REG_LIST_SH_MASK_DCN20(_MASK),
-               TF_DEBUG_REG_LIST_MASK_DCN10
+               TF_DEBUG_REG_LIST_MASK_DCN20
 };
 
 #define dwbc_regs_dcn2(id)\
 };
 
 static const struct dcn20_mpc_shift mpc_shift = {
-       MPC_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
+       MPC_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT),
+       MPC_DEBUG_REG_LIST_SH_DCN20
 };
 
 static const struct dcn20_mpc_mask mpc_mask = {
-       MPC_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
+       MPC_COMMON_MASK_SH_LIST_DCN2_0(_MASK),
+       MPC_DEBUG_REG_LIST_MASK_DCN20
 };
 
 #define tg_regs(id)\
 
 };
 
 static const struct dcn20_mpc_shift mpc_shift = {
-       MPC_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
+       MPC_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT),
+       MPC_DEBUG_REG_LIST_SH_DCN20
 };
 
 static const struct dcn20_mpc_mask mpc_mask = {
-       MPC_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
+       MPC_COMMON_MASK_SH_LIST_DCN2_0(_MASK),
+       MPC_DEBUG_REG_LIST_MASK_DCN20
 };
 
 #define hubp_regs(id)\
 
 static const struct dcn2_dpp_shift tf_shift = {
                TF_REG_LIST_SH_MASK_DCN20(__SHIFT),
-               TF_DEBUG_REG_LIST_SH_DCN10
+               TF_DEBUG_REG_LIST_SH_DCN20
 };
 
 static const struct dcn2_dpp_mask tf_mask = {
                TF_REG_LIST_SH_MASK_DCN20(_MASK),
-               TF_DEBUG_REG_LIST_MASK_DCN10
+               TF_DEBUG_REG_LIST_MASK_DCN20
 };
 
 #define stream_enc_regs(id)\
 
 #define IX_REG_READ(index_reg_name, data_reg_name, index) \
                generic_read_indirect_reg(CTX, REG(index_reg_name), REG(data_reg_name), IND_REG(index))
 
+#define IX_REG_GET_N(index_reg_name, data_reg_name, index, n, ...) \
+               generic_indirect_reg_get(CTX, REG(index_reg_name), REG(data_reg_name), \
+                               IND_REG(index), \
+                               n, __VA_ARGS__)
 
+#define IX_REG_GET(index_reg_name, data_reg_name, index, field, val) \
+               IX_REG_GET_N(index_reg_name, data_reg_name, index, 1, \
+                               FN(data_reg_name, field), val)
 
 #define IX_REG_UPDATE_N(index_reg_name, data_reg_name, index, n, ...)  \
                generic_indirect_reg_update_ex(CTX, \
                uint32_t addr_index, uint32_t addr_data,
                uint32_t index);
 
+uint32_t generic_indirect_reg_get(const struct dc_context *ctx,
+               uint32_t addr_index, uint32_t addr_data,
+               uint32_t index, int n,
+               uint8_t shift1, uint32_t mask1, uint32_t *field_value1,
+               ...);
+
 uint32_t generic_indirect_reg_update_ex(const struct dc_context *ctx,
                uint32_t addr_index, uint32_t addr_data,
                uint32_t index, uint32_t reg_val, int n,