aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0650-drm-amd-dal-Refactor-timing-generator.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0650-drm-amd-dal-Refactor-timing-generator.patch')
-rw-r--r--common/recipes-kernel/linux/files/0650-drm-amd-dal-Refactor-timing-generator.patch717
1 files changed, 717 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0650-drm-amd-dal-Refactor-timing-generator.patch b/common/recipes-kernel/linux/files/0650-drm-amd-dal-Refactor-timing-generator.patch
new file mode 100644
index 00000000..4b83b4b3
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0650-drm-amd-dal-Refactor-timing-generator.patch
@@ -0,0 +1,717 @@
+From 204f22d4fef912e6ee47572f2deecf8d4c5ccc3c Mon Sep 17 00:00:00 2001
+From: Yongqiang Sun <yongqiang.sun@amd.com>
+Date: Wed, 23 Dec 2015 16:27:53 -0500
+Subject: [PATCH 0650/1110] drm/amd/dal: Refactor timing generator.
+
+Change the way to access register the same
+as stream_encoder.
+
+Signed-off-by: Yongqiang Sun <yongqiang.sun@amd.com>
+Signed-off-by: Harry Wentland <harry.wentland@amd.com>
+Acked-by: Harry Wentland <Harry.Wentland@amd.com>
+---
+ .../amd/dal/dc/dce110/dce110_timing_generator.c | 269 ++++++++-------------
+ .../amd/dal/dc/dce110/dce110_timing_generator.h | 6 +
+ .../drm/amd/dal/include/timing_generator_types.h | 1 -
+ 3 files changed, 103 insertions(+), 173 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.c
+index 182d23e..3c6c04a 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.c
++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.c
+@@ -37,64 +37,6 @@
+ #include "include/timing_generator_types.h"
+ #include "dce110_timing_generator.h"
+
+-
+-enum tg_regs_idx {
+- IDX_CRTC_UPDATE_LOCK,
+- IDX_CRTC_MASTER_UPDATE_LOCK,
+- IDX_CRTC_MASTER_UPDATE_MODE,
+- IDX_CRTC_H_TOTAL,
+- IDX_CRTC_V_TOTAL,
+- IDX_CRTC_H_BLANK_START_END,
+- IDX_CRTC_V_BLANK_START_END,
+- IDX_CRTC_H_SYNC_A,
+- IDX_CRTC_V_SYNC_A,
+- IDX_CRTC_H_SYNC_A_CNTL,
+- IDX_CRTC_V_SYNC_A_CNTL,
+- IDX_CRTC_INTERLACE_CONTROL,
+- IDX_CRTC_BLANK_CONTROL,
+- IDX_PIPE_PG_STATUS,
+-
+- IDX_CRTC_TEST_PATTERN_COLOR,
+- IDX_CRTC_TEST_PATTERN_CONTROL,
+- IDX_CRTC_TEST_PATTERN_PARAMETERS,
+- IDX_CRTC_FLOW_CONTROL,
+- IDX_CRTC_STATUS,
+- IDX_CRTC_STATUS_POSITION,
+- IDX_CRTC_STATUS_FRAME_COUNT,
+- IDX_CRTC_STEREO_CONTROL,
+- IDX_CRTC_STEREO_STATUS,
+- IDX_CRTC_STEREO_FORCE_NEXT_EYE,
+- IDX_CRTC_3D_STRUCTURE_CONTROL,
+- IDX_CRTC_DOUBLE_BUFFER_CONTROL,
+- IDX_CRTC_V_TOTAL_MIN,
+- IDX_CRTC_V_TOTAL_MAX,
+- IDX_CRTC_V_TOTAL_CONTROL,
+- IDX_CRTC_NOM_VERT_POSITION,
+- IDX_CRTC_STATIC_SCREEN_CONTROL,
+- IDX_CRTC_TRIGB_CNTL,
+- IDX_CRTC_FORCE_COUNT_CNTL,
+- IDX_CRTC_GSL_CONTROL,
+- IDX_CRTC_GSL_WINDOW,
+-
+- IDX_CRTC_CONTROL,
+- IDX_CRTC_START_LINE_CONTROL,
+- IDX_CRTC_COUNT_CONTROL,
+-
+- IDX_MODE_EXT_OVERSCAN_LEFT_RIGHT,
+- IDX_MODE_EXT_OVERSCAN_TOP_BOTTOM,
+- IDX_DCP_GSL_CONTROL,
+- IDX_GRPH_UPDATE,
+-
+- IDX_CRTC_VBI_END,
+-
+- IDX_BLND_UNDERFLOW_INTERRUPT,
+- IDX_CRTC_BLACK_COLOR,
+- IDX_CRTC_OVERSCAN_COLOR,
+- IDX_CRTC_BLANK_DATA_COLOR,
+-
+- TG_REGS_IDX_SIZE
+-};
+-
+ enum black_color_format {
+ BLACK_COLOR_FORMAT_RGB_FULLRANGE = 0, /* used as index in array */
+ BLACK_COLOR_FORMAT_RGB_LIMITED,
+@@ -105,61 +47,6 @@ enum black_color_format {
+ BLACK_COLOR_FORMAT_COUNT
+ };
+
+-#define regs_for_controller(id)\
+-[CONTROLLER_ID_D ## id - 1] =\
+-{[IDX_CRTC_UPDATE_LOCK] = mmCRTC ## id ## _CRTC_UPDATE_LOCK,\
+-[IDX_CRTC_MASTER_UPDATE_LOCK] = mmCRTC ## id ## _CRTC_MASTER_UPDATE_LOCK,\
+-[IDX_CRTC_MASTER_UPDATE_MODE] = mmCRTC ## id ## _CRTC_MASTER_UPDATE_MODE,\
+-[IDX_CRTC_H_TOTAL] = mmCRTC ## id ## _CRTC_H_TOTAL,\
+-[IDX_CRTC_V_TOTAL] = mmCRTC ## id ## _CRTC_V_TOTAL,\
+-[IDX_CRTC_H_BLANK_START_END] = mmCRTC ## id ## _CRTC_H_BLANK_START_END,\
+-[IDX_CRTC_V_BLANK_START_END] = mmCRTC ## id ## _CRTC_V_BLANK_START_END,\
+-[IDX_CRTC_H_SYNC_A] = mmCRTC ## id ## _CRTC_H_SYNC_A,\
+-[IDX_CRTC_V_SYNC_A] = mmCRTC ## id ## _CRTC_V_SYNC_A,\
+-[IDX_CRTC_H_SYNC_A_CNTL] = mmCRTC ## id ## _CRTC_H_SYNC_A_CNTL,\
+-[IDX_CRTC_V_SYNC_A_CNTL] = mmCRTC ## id ## _CRTC_V_SYNC_A_CNTL,\
+-[IDX_CRTC_INTERLACE_CONTROL] = mmCRTC ## id ## _CRTC_INTERLACE_CONTROL,\
+-[IDX_CRTC_BLANK_CONTROL] = mmCRTC ## id ## _CRTC_BLANK_CONTROL,\
+-[IDX_PIPE_PG_STATUS] = mmPIPE ## id ## _PG_STATUS,\
+-[IDX_CRTC_TEST_PATTERN_COLOR] = mmCRTC ## id ## _CRTC_TEST_PATTERN_COLOR,\
+-[IDX_CRTC_TEST_PATTERN_CONTROL] = mmCRTC ## id ## _CRTC_TEST_PATTERN_CONTROL,\
+-[IDX_CRTC_TEST_PATTERN_PARAMETERS] =\
+-mmCRTC ## id ## _CRTC_TEST_PATTERN_PARAMETERS,\
+-[IDX_CRTC_FLOW_CONTROL] = mmCRTC ## id ## _CRTC_FLOW_CONTROL,\
+-[IDX_CRTC_STATUS] = mmCRTC ## id ## _CRTC_STATUS,\
+-[IDX_CRTC_STATUS_POSITION] = mmCRTC ## id ## _CRTC_STATUS_POSITION,\
+-[IDX_CRTC_STATUS_FRAME_COUNT] = mmCRTC ## id ## _CRTC_STATUS_FRAME_COUNT,\
+-[IDX_CRTC_STEREO_CONTROL] = mmCRTC ## id ## _CRTC_STEREO_CONTROL,\
+-[IDX_CRTC_STEREO_STATUS] = mmCRTC ## id ## _CRTC_STEREO_STATUS,\
+-[IDX_CRTC_STEREO_FORCE_NEXT_EYE] = \
+-mmCRTC ## id ## _CRTC_STEREO_FORCE_NEXT_EYE,\
+-[IDX_CRTC_3D_STRUCTURE_CONTROL] = mmCRTC ## id ## _CRTC_3D_STRUCTURE_CONTROL,\
+-[IDX_CRTC_DOUBLE_BUFFER_CONTROL] =\
+-mmCRTC ## id ## _CRTC_DOUBLE_BUFFER_CONTROL,\
+-[IDX_CRTC_V_TOTAL_MIN] = mmCRTC ## id ## _CRTC_V_TOTAL_MIN,\
+-[IDX_CRTC_V_TOTAL_MAX] = mmCRTC ## id ## _CRTC_V_TOTAL_MAX,\
+-[IDX_CRTC_V_TOTAL_CONTROL] = mmCRTC ## id ## _CRTC_V_TOTAL_CONTROL,\
+-[IDX_CRTC_NOM_VERT_POSITION] = mmCRTC ## id ## _CRTC_NOM_VERT_POSITION,\
+-[IDX_CRTC_STATIC_SCREEN_CONTROL] =\
+-mmCRTC ## id ## _CRTC_STATIC_SCREEN_CONTROL,\
+-[IDX_CRTC_TRIGB_CNTL] = mmCRTC ## id ## _CRTC_TRIGB_CNTL,\
+-[IDX_CRTC_FORCE_COUNT_CNTL] = mmCRTC ## id ## _CRTC_FORCE_COUNT_NOW_CNTL,\
+-[IDX_CRTC_GSL_CONTROL] = mmCRTC ## id ## _CRTC_GSL_CONTROL,\
+-[IDX_CRTC_GSL_WINDOW] = mmCRTC ## id ## _CRTC_GSL_WINDOW,\
+-[IDX_CRTC_CONTROL] = mmCRTC ## id ## _CRTC_CONTROL,\
+-[IDX_CRTC_START_LINE_CONTROL] = mmCRTC ## id ## _CRTC_START_LINE_CONTROL,\
+-[IDX_CRTC_COUNT_CONTROL] = mmCRTC ## id ## _CRTC_COUNT_CONTROL,\
+-[IDX_MODE_EXT_OVERSCAN_LEFT_RIGHT] = mmSCL ## id ## _EXT_OVERSCAN_LEFT_RIGHT,\
+-[IDX_MODE_EXT_OVERSCAN_TOP_BOTTOM] = mmSCL ## id ## _EXT_OVERSCAN_TOP_BOTTOM,\
+-[IDX_DCP_GSL_CONTROL] = mmDCP ## id ## _DCP_GSL_CONTROL,\
+-[IDX_GRPH_UPDATE] = mmDCP ## id ## _GRPH_UPDATE,\
+-[IDX_CRTC_VBI_END] = mmCRTC ## id ## _CRTC_VBI_END,\
+-[IDX_BLND_UNDERFLOW_INTERRUPT] = mmBLND ## id ## _BLND_UNDERFLOW_INTERRUPT,\
+-[IDX_CRTC_BLACK_COLOR] = mmCRTC ## id ## _CRTC_BLACK_COLOR,\
+-[IDX_CRTC_OVERSCAN_COLOR] = mmCRTC ## id ## _CRTC_OVERSCAN_COLOR,\
+-[IDX_CRTC_BLANK_DATA_COLOR] = mmCRTC ## id ## _CRTC_BLANK_DATA_COLOR,\
+-}
+-
+ #define NUMBER_OF_FRAME_TO_WAIT_ON_TRIGGERED_RESET 10
+
+ #define MAX_H_TOTAL (CRTC_H_TOTAL__CRTC_H_TOTAL_MASK + 1)
+@@ -169,12 +56,23 @@ mmCRTC ## id ## _CRTC_STATIC_SCREEN_CONTROL,\
+ #define FROM_TIMING_GENERATOR(tg)\
+ container_of(tg, struct dce110_timing_generator, base)
+
+-static uint32_t tg_regs[][TG_REGS_IDX_SIZE] = {
+- regs_for_controller(0),
+- regs_for_controller(1),
+- regs_for_controller(2),
+-};
++#define CRTC_REG(reg) (reg + tg110->offsets.crtc)
++#define DCP_REG(reg) (reg + tg110->offsets.dcp)
+
++static const struct dce110_timing_generator_offsets reg_offsets[] = {
++ {
++ .crtc = 0,
++ .dcp = 0,
++ },
++ {
++ .crtc = (mmCRTC1_CRTC_CONTROL - mmCRTC0_CRTC_CONTROL),
++ .dcp = (mmDCP1_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
++ },
++ {
++ .crtc = (mmCRTC2_CRTC_CONTROL - mmCRTC0_CRTC_CONTROL),
++ .dcp = (mmDCP2_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
++ }
++};
+ /*******************************************************************************
+ * GSL Sync related values */
+
+@@ -237,7 +135,10 @@ static bool dce110_timing_generator_construct(
+ struct timing_generator *tg,
+ enum controller_id id)
+ {
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
++
+ tg->controller_id = id;
++ tg110->offsets = reg_offsets[id - 1];
+ return true;
+ }
+
+@@ -345,8 +246,9 @@ static bool dce110_timing_generator_is_in_vertical_blank(
+ uint32_t addr = 0;
+ uint32_t value = 0;
+ uint32_t field = 0;
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
+
+- addr = tg->regs[IDX_CRTC_STATUS];
++ addr = CRTC_REG(mmCRTC_STATUS);
+ value = dal_read_reg(tg->ctx, addr);
+ field = get_reg_field_value(value, CRTC_STATUS, CRTC_V_BLANK);
+ return field == 1;
+@@ -357,7 +259,8 @@ void dce110_timing_generator_set_early_control(
+ uint32_t early_cntl)
+ {
+ uint32_t regval;
+- uint32_t address = tg->regs[IDX_CRTC_CONTROL];
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
++ uint32_t address = CRTC_REG(mmCRTC_CONTROL);
+
+ regval = dal_read_reg(tg->ctx, address);
+ set_reg_field_value(regval, early_cntl,
+@@ -376,13 +279,14 @@ bool dce110_timing_generator_enable_crtc(struct timing_generator *tg)
+ /* 0 value is needed by DRR and is also suggested default value for CZ
+ */
+ uint32_t value;
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
+
+ value = dal_read_reg(tg->ctx,
+- tg->regs[IDX_CRTC_MASTER_UPDATE_MODE]);
++ CRTC_REG(mmCRTC_MASTER_UPDATE_MODE));
+ set_reg_field_value(value, 3,
+ CRTC_MASTER_UPDATE_MODE, MASTER_UPDATE_MODE);
+ dal_write_reg(tg->ctx,
+- tg->regs[IDX_CRTC_MASTER_UPDATE_MODE], value);
++ CRTC_REG(mmCRTC_MASTER_UPDATE_MODE), value);
+
+ result = dal_bios_parser_enable_crtc(tg->bp, tg->controller_id, true);
+
+@@ -394,7 +298,8 @@ void dce110_timing_generator_program_blank_color(
+ enum color_space color_space)
+ {
+ struct crtc_black_color black_color;
+- uint32_t addr = tg->regs[IDX_CRTC_BLACK_COLOR];
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
++ uint32_t addr = CRTC_REG(mmCRTC_BLACK_COLOR);
+ uint32_t value = dal_read_reg(tg->ctx, addr);
+
+ dce110_timing_generator_color_space_to_black_color(
+@@ -427,7 +332,8 @@ void dce110_timing_generator_program_blank_color(
+
+ bool dce110_timing_generator_blank_crtc(struct timing_generator *tg)
+ {
+- uint32_t addr = tg->regs[IDX_CRTC_BLANK_CONTROL];
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
++ uint32_t addr = CRTC_REG(mmCRTC_BLANK_CONTROL);
+ uint32_t value = dal_read_reg(tg->ctx, addr);
+ uint8_t counter = 100;
+
+@@ -479,7 +385,8 @@ bool dce110_timing_generator_blank_crtc(struct timing_generator *tg)
+ */
+ bool dce110_timing_generator_unblank_crtc(struct timing_generator *tg)
+ {
+- uint32_t addr = tg->regs[IDX_CRTC_BLANK_CONTROL];
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
++ uint32_t addr = CRTC_REG(mmCRTC_BLANK_CONTROL);
+ uint32_t value = dal_read_reg(tg->ctx, addr);
+
+ set_reg_field_value(
+@@ -512,7 +419,8 @@ bool dce110_timing_generator_unblank_crtc(struct timing_generator *tg)
+ @TODOSTEREO
+ static void disable_stereo(struct timing_generator *tg)
+ {
+- uint32_t addr = tg->regs[IDX_CRTC_3D_STRUCTURE_CONTROL];
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
++ uint32_t addr = CRTC_REG(mmCRTC_3D_STRUCTURE_CONTROL);
+ uint32_t value = 0;
+ uint32_t test = 0;
+ uint32_t field = 0;
+@@ -579,9 +487,10 @@ static void program_horz_count_by_2(
+ const struct dc_crtc_timing *timing)
+ {
+ uint32_t regval;
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
+
+ regval = dal_read_reg(tg->ctx,
+- tg->regs[IDX_CRTC_COUNT_CONTROL]);
++ CRTC_REG(mmCRTC_COUNT_CONTROL));
+
+ set_reg_field_value(regval, 0, CRTC_COUNT_CONTROL,
+ CRTC_HORZ_COUNT_BY2_EN);
+@@ -591,7 +500,7 @@ static void program_horz_count_by_2(
+ CRTC_HORZ_COUNT_BY2_EN);
+
+ dal_write_reg(tg->ctx,
+- tg->regs[IDX_CRTC_COUNT_CONTROL], regval);
++ CRTC_REG(mmCRTC_COUNT_CONTROL), regval);
+ }
+
+ /**
+@@ -606,6 +515,7 @@ bool dce110_timing_generator_program_timing_generator(
+ enum bp_result result;
+ struct bp_hw_crtc_timing_parameters bp_params;
+ uint32_t regval;
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
+
+ uint32_t vsync_offset = dc_crtc_timing->v_border_bottom +
+ dc_crtc_timing->v_front_porch;
+@@ -663,7 +573,7 @@ bool dce110_timing_generator_program_timing_generator(
+
+
+ regval = dal_read_reg(tg->ctx,
+- tg->regs[IDX_CRTC_START_LINE_CONTROL]);
++ CRTC_REG(mmCRTC_START_LINE_CONTROL));
+
+ if (dce110_timing_generator_get_vsynch_and_front_porch_size(dc_crtc_timing) <= 3) {
+ set_reg_field_value(regval, 3,
+@@ -683,7 +593,7 @@ bool dce110_timing_generator_program_timing_generator(
+ CRTC_PREFETCH_EN);
+ }
+ dal_write_reg(tg->ctx,
+- tg->regs[IDX_CRTC_START_LINE_CONTROL], regval);
++ CRTC_REG(mmCRTC_START_LINE_CONTROL), regval);
+
+ /* Enable stereo - only when we need to pack 3D frame. Other types
+ * of stereo handled in explicit call */
+@@ -722,19 +632,20 @@ void dce110_timing_generator_program_drr(
+ uint32_t v_total_max = 0;
+ uint32_t v_total_cntl = 0;
+ uint32_t static_screen_cntl = 0;
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
+
+ uint32_t addr = 0;
+
+- addr = tg->regs[IDX_CRTC_V_TOTAL_MIN];
++ addr = CRTC_REG(mmCRTC_V_TOTAL_MIN);
+ v_total_min = dal_read_reg(tg->ctx, addr);
+
+- addr = tg->regs[IDX_CRTC_V_TOTAL_MAX];
++ addr = CRTC_REG(mmCRTC_V_TOTAL_MAX);
+ v_total_max = dal_read_reg(tg->ctx, addr);
+
+- addr = tg->regs[IDX_CRTC_V_TOTAL_CONTROL];
++ addr = CRTC_REG(mmCRTC_V_TOTAL_CONTROL);
+ v_total_cntl = dal_read_reg(tg->ctx, addr);
+
+- addr = tg->regs[IDX_CRTC_STATIC_SCREEN_CONTROL];
++ addr = CRTC_REG(mmCRTC_STATIC_SCREEN_CONTROL);
+ static_screen_cntl = dal_read_reg(tg->ctx, addr);
+
+ if (timing != NULL) {
+@@ -856,16 +767,16 @@ void dce110_timing_generator_program_drr(
+ CRTC_FORCE_LOCK_TO_MASTER_VSYNC);
+ }
+
+- addr = tg->regs[IDX_CRTC_V_TOTAL_MIN];
++ addr = CRTC_REG(mmCRTC_V_TOTAL_MIN);
+ dal_write_reg(tg->ctx, addr, v_total_min);
+
+- addr = tg->regs[IDX_CRTC_V_TOTAL_MAX];
++ addr = CRTC_REG(mmCRTC_V_TOTAL_MAX);
+ dal_write_reg(tg->ctx, addr, v_total_max);
+
+- addr = tg->regs[IDX_CRTC_V_TOTAL_CONTROL];
++ addr = CRTC_REG(mmCRTC_V_TOTAL_CONTROL);
+ dal_write_reg(tg->ctx, addr, v_total_cntl);
+
+- addr = tg->regs[IDX_CRTC_STATIC_SCREEN_CONTROL];
++ addr = CRTC_REG(mmCRTC_STATIC_SCREEN_CONTROL);
+ dal_write_reg(tg->ctx, addr, static_screen_cntl);
+ }
+
+@@ -885,7 +796,8 @@ void dce110_timing_generator_program_drr(
+ */
+ uint32_t dce110_timing_generator_get_vblank_counter(struct timing_generator *tg)
+ {
+- uint32_t addr = tg->regs[IDX_CRTC_STATUS_FRAME_COUNT];
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
++ uint32_t addr = CRTC_REG(mmCRTC_STATUS_FRAME_COUNT);
+ uint32_t value = dal_read_reg(tg->ctx, addr);
+ uint32_t field = get_reg_field_value(
+ value, CRTC_STATUS_FRAME_COUNT, CRTC_FRAME_COUNT);
+@@ -910,8 +822,9 @@ void dce110_timing_generator_get_crtc_positions(
+ int32_t *v_position)
+ {
+ uint32_t value;
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
+
+- value = dal_read_reg(tg->ctx, tg->regs[IDX_CRTC_STATUS_POSITION]);
++ value = dal_read_reg(tg->ctx, CRTC_REG(mmCRTC_STATUS_POSITION));
+
+ *h_position = get_reg_field_value(
+ value,
+@@ -939,6 +852,7 @@ uint32_t dce110_timing_generator_get_crtc_scanoutpos(
+ int32_t *vbl,
+ int32_t *position)
+ {
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
+ /* TODO 1: Update the implementation once caller is updated
+ * WARNING!! This function is returning the whole register value
+ * because the caller is expecting it instead of proper vertical and
+@@ -948,10 +862,10 @@ uint32_t dce110_timing_generator_get_crtc_scanoutpos(
+ /* TODO 2: re-use dce110_timing_generator_get_crtc_positions() */
+
+ *vbl = dal_read_reg(tg->ctx,
+- tg->regs[IDX_CRTC_V_BLANK_START_END]);
++ CRTC_REG(mmCRTC_V_BLANK_START_END));
+
+ *position = dal_read_reg(tg->ctx,
+- tg->regs[IDX_CRTC_STATUS_POSITION]);
++ CRTC_REG(mmCRTC_STATUS_POSITION));
+
+ /* @TODO: return value should indicate if current
+ * crtc is inside vblank*/
+@@ -973,13 +887,14 @@ void dce110_timing_generator_program_blanking(
+ uint32_t hsync_offset = timing->h_border_right +
+ timing->h_front_porch;
+ uint32_t h_sync_start = timing->h_addressable + hsync_offset;
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
+
+ struct dc_context *ctx = tg->ctx;
+ uint32_t value = 0;
+ uint32_t addr = 0;
+ uint32_t tmp = 0;
+
+- addr = tg->regs[IDX_CRTC_H_TOTAL];
++ addr = CRTC_REG(mmCRTC_H_TOTAL);
+ value = dal_read_reg(ctx, addr);
+ set_reg_field_value(
+ value,
+@@ -988,7 +903,7 @@ void dce110_timing_generator_program_blanking(
+ CRTC_H_TOTAL);
+ dal_write_reg(ctx, addr, value);
+
+- addr = tg->regs[IDX_CRTC_V_TOTAL];
++ addr = CRTC_REG(mmCRTC_V_TOTAL);
+ value = dal_read_reg(ctx, addr);
+ set_reg_field_value(
+ value,
+@@ -997,7 +912,7 @@ void dce110_timing_generator_program_blanking(
+ CRTC_V_TOTAL);
+ dal_write_reg(ctx, addr, value);
+
+- addr = tg->regs[IDX_CRTC_H_BLANK_START_END];
++ addr = CRTC_REG(mmCRTC_H_BLANK_START_END);
+ value = dal_read_reg(ctx, addr);
+
+ tmp = timing->h_total -
+@@ -1020,7 +935,7 @@ void dce110_timing_generator_program_blanking(
+
+ dal_write_reg(ctx, addr, value);
+
+- addr = tg->regs[IDX_CRTC_V_BLANK_START_END];
++ addr = CRTC_REG(mmCRTC_V_BLANK_START_END);
+ value = dal_read_reg(ctx, addr);
+
+ tmp = timing->v_total - (v_sync_start + timing->v_border_top);
+@@ -1054,12 +969,13 @@ void dce110_timing_generator_set_test_pattern(
+ struct dc_context *ctx = tg->ctx;
+ uint32_t value;
+ uint32_t addr;
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
+
+ /* TODO: add support for other test patterns */
+ switch (test_pattern) {
+ default:
+ value = 0;
+- addr = tg->regs[IDX_CRTC_TEST_PATTERN_PARAMETERS];
++ addr = CRTC_REG(mmCRTC_TEST_PATTERN_PARAMETERS);
+
+ set_reg_field_value(
+ value,
+@@ -1074,7 +990,7 @@ void dce110_timing_generator_set_test_pattern(
+
+ dal_write_reg(ctx, addr, value);
+
+- addr = tg->regs[IDX_CRTC_TEST_PATTERN_CONTROL];
++ addr = CRTC_REG(mmCRTC_TEST_PATTERN_CONTROL);
+ value = 0;
+
+ set_reg_field_value(
+@@ -1221,7 +1137,6 @@ static bool timing_generator_dce110_construct(struct timing_generator *tg,
+
+ tg->ctx = ctx;
+ tg->bp = dal_adapter_service_get_bios_parser(as);
+- tg->regs = tg_regs[id-1];
+
+ tg->max_h_total = CRTC_H_TOTAL__CRTC_H_TOTAL_MASK + 1;
+ tg->max_v_total = CRTC_V_TOTAL__CRTC_V_TOTAL_MASK + 1;
+@@ -1270,7 +1185,8 @@ void dce110_timing_generator_setup_global_swap_lock(
+ const struct dcp_gsl_params *gsl_params)
+ {
+ uint32_t value;
+- uint32_t address = tg->regs[IDX_DCP_GSL_CONTROL];
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
++ uint32_t address = DCP_REG(mmDCP_GSL_CONTROL);
+ uint32_t check_point = FLIP_READY_BACK_LOOKUP;
+
+ value = dal_read_reg(tg->ctx, address);
+@@ -1302,7 +1218,8 @@ void dce110_timing_generator_setup_global_swap_lock(
+ {
+ uint32_t value_crtc_vtotal;
+
+- value_crtc_vtotal = dal_read_reg(tg->ctx, tg->regs[IDX_CRTC_V_TOTAL]);
++ value_crtc_vtotal = dal_read_reg(tg->ctx,
++ CRTC_REG(mmCRTC_V_TOTAL));
+
+ set_reg_field_value(value,
+ gsl_params->gsl_purpose,
+@@ -1314,7 +1231,7 @@ void dce110_timing_generator_setup_global_swap_lock(
+ CRTC_V_TOTAL,
+ CRTC_V_TOTAL);
+
+- dal_write_reg(tg->ctx, tg->regs[IDX_CRTC_GSL_WINDOW], 0);
++ dal_write_reg(tg->ctx, CRTC_REG(mmCRTC_GSL_WINDOW), 0);
+ }
+
+ set_reg_field_value(value,
+@@ -1325,7 +1242,7 @@ void dce110_timing_generator_setup_global_swap_lock(
+ dal_write_reg(tg->ctx, address, value);
+
+ /********************************************************************/
+- address = tg->regs[IDX_CRTC_GSL_CONTROL];
++ address = CRTC_REG(mmCRTC_GSL_CONTROL);
+
+ value = 0;
+ set_reg_field_value(value,
+@@ -1350,7 +1267,8 @@ void dce110_timing_generator_tear_down_global_swap_lock(
+ */
+
+ uint32_t value;
+- uint32_t address = tg->regs[IDX_DCP_GSL_CONTROL];
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
++ uint32_t address = DCP_REG(mmDCP_GSL_CONTROL);
+
+ value = 0;
+
+@@ -1381,7 +1299,8 @@ void dce110_timing_generator_tear_down_global_swap_lock(
+ {
+ uint32_t value_crtc_vtotal;
+
+- value_crtc_vtotal = dal_read_reg(tg->ctx, tg->regs[IDX_CRTC_V_TOTAL]);
++ value_crtc_vtotal = dal_read_reg(tg->ctx,
++ CRTC_REG(mmCRTC_V_TOTAL));
+
+ set_reg_field_value(value,
+ 0,
+@@ -1397,7 +1316,7 @@ void dce110_timing_generator_tear_down_global_swap_lock(
+ dal_write_reg(tg->ctx, address, value);
+
+ /********************************************************************/
+- address = tg->regs[IDX_CRTC_GSL_CONTROL];
++ address = CRTC_REG(mmCRTC_GSL_CONTROL);
+
+ value = 0;
+ set_reg_field_value(value,
+@@ -1446,7 +1365,8 @@ void dce110_timing_generator_enable_advanced_request(
+ bool enable,
+ const struct dc_crtc_timing *timing)
+ {
+- uint32_t addr = tg->regs[IDX_CRTC_START_LINE_CONTROL];
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
++ uint32_t addr = CRTC_REG(mmCRTC_START_LINE_CONTROL);
+ uint32_t value = dal_read_reg(tg->ctx, addr);
+
+ if (enable && FROM_TIMING_GENERATOR(tg)->advanced_request_enable) {
+@@ -1507,7 +1427,8 @@ void dce110_timing_generator_set_lock_master(struct timing_generator *tg,
+ bool lock)
+ {
+ struct dc_context *ctx = tg->ctx;
+- uint32_t addr = tg->regs[IDX_CRTC_MASTER_UPDATE_LOCK];
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
++ uint32_t addr = CRTC_REG(mmCRTC_MASTER_UPDATE_LOCK);
+ uint32_t value = dal_read_reg(ctx, addr);
+
+ set_reg_field_value(
+@@ -1528,6 +1449,7 @@ void dce110_timing_generator_enable_reset_trigger(
+ uint32_t rising_edge = 0;
+ uint32_t falling_edge = 0;
+ enum trigger_source_select trig_src_select = TRIGGER_SOURCE_SELECT_LOGIC_ZERO;
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
+
+ /* Setup trigger edge */
+ switch (trigger_params->edge) {
+@@ -1535,7 +1457,7 @@ void dce110_timing_generator_enable_reset_trigger(
+ case TRIGGER_EDGE_DEFAULT:
+ {
+ uint32_t pol_value = dal_read_reg(tg->ctx,
+- tg->regs[IDX_CRTC_V_SYNC_A_CNTL]);
++ CRTC_REG(mmCRTC_V_SYNC_A_CNTL));
+
+ /* Register spec has reversed definition:
+ * 0 for positive, 1 for negative */
+@@ -1563,7 +1485,7 @@ void dce110_timing_generator_enable_reset_trigger(
+ return;
+ }
+
+- value = dal_read_reg(tg->ctx, tg->regs[IDX_CRTC_TRIGB_CNTL]);
++ value = dal_read_reg(tg->ctx, CRTC_REG(mmCRTC_TRIGB_CNTL));
+
+ switch(trigger_params->source) {
+ /* Currently supporting only a single group, the group zero. */
+@@ -1610,11 +1532,11 @@ void dce110_timing_generator_enable_reset_trigger(
+ CRTC_TRIGB_CNTL,
+ CRTC_TRIGB_CLEAR);
+
+- dal_write_reg(tg->ctx, tg->regs[IDX_CRTC_TRIGB_CNTL], value);
++ dal_write_reg(tg->ctx, CRTC_REG(mmCRTC_TRIGB_CNTL), value);
+
+ /**************************************************************/
+
+- value = dal_read_reg(tg->ctx, tg->regs[IDX_CRTC_FORCE_COUNT_CNTL]);
++ value = dal_read_reg(tg->ctx, CRTC_REG(mmCRTC_FORCE_COUNT_NOW_CNTL));
+
+ set_reg_field_value(value,
+ 2, /* force H count to H_TOTAL and V count to V_TOTAL */
+@@ -1631,15 +1553,16 @@ void dce110_timing_generator_enable_reset_trigger(
+ CRTC_FORCE_COUNT_NOW_CNTL,
+ CRTC_FORCE_COUNT_NOW_CLEAR);
+
+- dal_write_reg(tg->ctx, tg->regs[IDX_CRTC_FORCE_COUNT_CNTL], value);
++ dal_write_reg(tg->ctx, CRTC_REG(mmCRTC_FORCE_COUNT_NOW_CNTL), value);
+ }
+
+ void dce110_timing_generator_disable_reset_trigger(
+ struct timing_generator *tg)
+ {
+ uint32_t value;
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
+
+- value = dal_read_reg(tg->ctx, tg->regs[IDX_CRTC_FORCE_COUNT_CNTL]);
++ value = dal_read_reg(tg->ctx, CRTC_REG(mmCRTC_FORCE_COUNT_NOW_CNTL));
+
+ set_reg_field_value(value,
+ 0, /* force counter now mode is disabled */
+@@ -1651,10 +1574,10 @@ void dce110_timing_generator_disable_reset_trigger(
+ CRTC_FORCE_COUNT_NOW_CNTL,
+ CRTC_FORCE_COUNT_NOW_CLEAR);
+
+- dal_write_reg(tg->ctx, tg->regs[IDX_CRTC_FORCE_COUNT_CNTL], value);
++ dal_write_reg(tg->ctx, CRTC_REG(mmCRTC_FORCE_COUNT_NOW_CNTL), value);
+
+ /********************************************************************/
+- value = dal_read_reg(tg->ctx, tg->regs[IDX_CRTC_TRIGB_CNTL]);
++ value = dal_read_reg(tg->ctx, CRTC_REG(mmCRTC_TRIGB_CNTL));
+
+ set_reg_field_value(value,
+ TRIGGER_SOURCE_SELECT_LOGIC_ZERO,
+@@ -1671,7 +1594,7 @@ void dce110_timing_generator_disable_reset_trigger(
+ CRTC_TRIGB_CNTL,
+ CRTC_TRIGB_CLEAR);
+
+- dal_write_reg(tg->ctx, tg->regs[IDX_CRTC_TRIGB_CNTL], value);
++ dal_write_reg(tg->ctx, CRTC_REG(mmCRTC_TRIGB_CNTL), value);
+ }
+
+ /**
+@@ -1686,7 +1609,9 @@ void dce110_timing_generator_disable_reset_trigger(
+ bool dce110_timing_generator_did_triggered_reset_occur(
+ struct timing_generator *tg)
+ {
+- uint32_t value = dal_read_reg(tg->ctx, tg->regs[IDX_CRTC_FORCE_COUNT_CNTL]);
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
++ uint32_t value = dal_read_reg(tg->ctx,
++ CRTC_REG(mmCRTC_FORCE_COUNT_NOW_CNTL));
+
+ return get_reg_field_value(value,
+ CRTC_FORCE_COUNT_NOW_CNTL,
+@@ -1744,7 +1669,7 @@ void dce110_timing_generator_set_overscan_color_black(
+ struct dc_context *ctx = tg->ctx;
+ uint32_t value = 0;
+ uint32_t addr;
+-
++ struct dce110_timing_generator *tg110 = FROM_TIMING_GENERATOR(tg);
+ /* Overscan Color for YUV display modes:
+ * to achieve a black color for both the explicit and implicit overscan,
+ * the overscan color registers should be programmed to: */
+@@ -1842,15 +1767,15 @@ void dce110_timing_generator_set_overscan_color_black(
+ /* default is sRGB black 0. */
+ break;
+ }
+- addr = tg->regs[IDX_CRTC_OVERSCAN_COLOR];
++ addr = CRTC_REG(mmCRTC_OVERSCAN_COLOR);
+ dal_write_reg(ctx, addr, value);
+- addr = tg->regs[IDX_CRTC_BLACK_COLOR];
++ addr = CRTC_REG(mmCRTC_BLACK_COLOR);
+ dal_write_reg(ctx, addr, value);
+ /* This is desirable to have a constant DAC output voltage during the
+ * blank time that is higher than the 0 volt reference level that the
+ * DAC outputs when the NBLANK signal
+ * is asserted low, such as for output to an analog TV. */
+- addr = tg->regs[IDX_CRTC_BLANK_DATA_COLOR];
++ addr = CRTC_REG(mmCRTC_BLANK_DATA_COLOR);
+ dal_write_reg(ctx, addr, value);
+
+ /* TO DO we have to program EXT registers and we need to know LB DATA
+diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.h b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.h
+index c75c659..c4a815f 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.h
++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.h
+@@ -50,8 +50,14 @@
+ #define CRTC_OVERSCAN_COLOR_BLACK_COLOR_G_RGB_LIMITED_RANGE 0x40
+ #define CRTC_OVERSCAN_COLOR_BLACK_COLOR_R_RGB_LIMITED_RANGE 0X40
+
++struct dce110_timing_generator_offsets {
++ uint32_t crtc;
++ uint32_t dcp;
++};
++
+ struct dce110_timing_generator {
+ struct timing_generator base;
++ struct dce110_timing_generator_offsets offsets;
+ enum sync_source cached_gsl_group;
+ bool advanced_request_enable;
+ };
+diff --git a/drivers/gpu/drm/amd/dal/include/timing_generator_types.h b/drivers/gpu/drm/amd/dal/include/timing_generator_types.h
+index 9c4d92d..bc04acd 100644
+--- a/drivers/gpu/drm/amd/dal/include/timing_generator_types.h
++++ b/drivers/gpu/drm/amd/dal/include/timing_generator_types.h
+@@ -135,7 +135,6 @@ enum controller_dp_test_pattern {
+ };
+
+ struct timing_generator {
+- uint32_t *regs;
+ struct bios_parser *bp;
+ enum controller_id controller_id;
+ struct dc_context *ctx;
+--
+2.7.4
+