aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3025-drm-amd-display-Split-out-common-HUBP-registers-and-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3025-drm-amd-display-Split-out-common-HUBP-registers-and-.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3025-drm-amd-display-Split-out-common-HUBP-registers-and-.patch342
1 files changed, 342 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3025-drm-amd-display-Split-out-common-HUBP-registers-and-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3025-drm-amd-display-Split-out-common-HUBP-registers-and-.patch
new file mode 100644
index 00000000..4d4ca082
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3025-drm-amd-display-Split-out-common-HUBP-registers-and-.patch
@@ -0,0 +1,342 @@
+From 9a458db365cb2222f2c6e0417630ce8eb7829622 Mon Sep 17 00:00:00 2001
+From: Charlene Liu <charlene.liu@amd.com>
+Date: Wed, 5 Jun 2019 15:21:03 -0400
+Subject: [PATCH 3025/4256] drm/amd/display: Split out common HUBP registers
+ and code
+
+There are shared regs and code across DCN generations. Pull them out
+into a shared common location.
+
+Also, expose some dcn20 init functions.
+
+Signed-off-by: Charlene Liu <charlene.liu@amd.com>
+Reviewed-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+---
+ .../gpu/drm/amd/display/dc/dce/dce_hwseq.h | 3 +-
+ .../gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c | 50 ++++++++++++-------
+ .../gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h | 23 ++++++---
+ .../gpu/drm/amd/display/dc/dcn20/dcn20_hubp.h | 23 +++++----
+ .../drm/amd/display/dc/dcn20/dcn20_hwseq.c | 43 +++++++++++++++-
+ .../drm/amd/display/dc/dcn20/dcn20_hwseq.h | 14 ++----
+ 6 files changed, 109 insertions(+), 47 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h b/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h
+index cb0a037b1c4a..3a49f1ffb5dd 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h
++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h
+@@ -696,7 +696,8 @@ struct dce_hwseq_registers {
+ type D2VGA_MODE_ENABLE; \
+ type D3VGA_MODE_ENABLE; \
+ type D4VGA_MODE_ENABLE; \
+- type AZALIA_AUDIO_DTO_MODULE;
++ type AZALIA_AUDIO_DTO_MODULE;\
++ type HPO_HDMISTREAMCLK_GATE_DIS;
+
+ struct dce_hwseq_shift {
+ HWSEQ_REG_FIELD_LIST(uint8_t)
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c
+index 934bacc0c6ad..a16128814d62 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c
+@@ -843,7 +843,7 @@ void min_set_viewport(
+ PRI_VIEWPORT_Y_START_C, viewport_c->y);
+ }
+
+-void hubp1_read_state(struct hubp *hubp)
++void hubp1_read_state_common(struct hubp *hubp)
+ {
+ struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp);
+ struct dcn_hubp_state *s = &hubp1->state;
+@@ -859,24 +859,6 @@ void hubp1_read_state(struct hubp *hubp)
+ PRQ_EXPANSION_MODE, &rq_regs->prq_expansion_mode,
+ MRQ_EXPANSION_MODE, &rq_regs->mrq_expansion_mode,
+ CRQ_EXPANSION_MODE, &rq_regs->crq_expansion_mode);
+- REG_GET_8(DCHUBP_REQ_SIZE_CONFIG,
+- CHUNK_SIZE, &rq_regs->rq_regs_l.chunk_size,
+- MIN_CHUNK_SIZE, &rq_regs->rq_regs_l.min_chunk_size,
+- META_CHUNK_SIZE, &rq_regs->rq_regs_l.meta_chunk_size,
+- MIN_META_CHUNK_SIZE, &rq_regs->rq_regs_l.min_meta_chunk_size,
+- DPTE_GROUP_SIZE, &rq_regs->rq_regs_l.dpte_group_size,
+- MPTE_GROUP_SIZE, &rq_regs->rq_regs_l.mpte_group_size,
+- SWATH_HEIGHT, &rq_regs->rq_regs_l.swath_height,
+- PTE_ROW_HEIGHT_LINEAR, &rq_regs->rq_regs_l.pte_row_height_linear);
+- REG_GET_8(DCHUBP_REQ_SIZE_CONFIG_C,
+- CHUNK_SIZE_C, &rq_regs->rq_regs_c.chunk_size,
+- MIN_CHUNK_SIZE_C, &rq_regs->rq_regs_c.min_chunk_size,
+- META_CHUNK_SIZE_C, &rq_regs->rq_regs_c.meta_chunk_size,
+- MIN_META_CHUNK_SIZE_C, &rq_regs->rq_regs_c.min_meta_chunk_size,
+- DPTE_GROUP_SIZE_C, &rq_regs->rq_regs_c.dpte_group_size,
+- MPTE_GROUP_SIZE_C, &rq_regs->rq_regs_c.mpte_group_size,
+- SWATH_HEIGHT_C, &rq_regs->rq_regs_c.swath_height,
+- PTE_ROW_HEIGHT_LINEAR_C, &rq_regs->rq_regs_c.pte_row_height_linear);
+
+ /* DLG - Per hubp */
+ REG_GET_2(BLANK_OFFSET_0,
+@@ -1030,8 +1012,38 @@ void hubp1_read_state(struct hubp *hubp)
+ REG_GET_2(DCN_TTU_QOS_WM,
+ QoS_LEVEL_LOW_WM, &s->qos_level_low_wm,
+ QoS_LEVEL_HIGH_WM, &s->qos_level_high_wm);
++
+ }
+
++void hubp1_read_state(struct hubp *hubp)
++{
++ struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp);
++ struct dcn_hubp_state *s = &hubp1->state;
++ struct _vcs_dpi_display_rq_regs_st *rq_regs = &s->rq_regs;
++
++ hubp1_read_state_common(hubp);
++
++ REG_GET_8(DCHUBP_REQ_SIZE_CONFIG,
++ CHUNK_SIZE, &rq_regs->rq_regs_l.chunk_size,
++ MIN_CHUNK_SIZE, &rq_regs->rq_regs_l.min_chunk_size,
++ META_CHUNK_SIZE, &rq_regs->rq_regs_l.meta_chunk_size,
++ MIN_META_CHUNK_SIZE, &rq_regs->rq_regs_l.min_meta_chunk_size,
++ DPTE_GROUP_SIZE, &rq_regs->rq_regs_l.dpte_group_size,
++ MPTE_GROUP_SIZE, &rq_regs->rq_regs_l.mpte_group_size,
++ SWATH_HEIGHT, &rq_regs->rq_regs_l.swath_height,
++ PTE_ROW_HEIGHT_LINEAR, &rq_regs->rq_regs_l.pte_row_height_linear);
++
++ REG_GET_8(DCHUBP_REQ_SIZE_CONFIG_C,
++ CHUNK_SIZE_C, &rq_regs->rq_regs_c.chunk_size,
++ MIN_CHUNK_SIZE_C, &rq_regs->rq_regs_c.min_chunk_size,
++ META_CHUNK_SIZE_C, &rq_regs->rq_regs_c.meta_chunk_size,
++ MIN_META_CHUNK_SIZE_C, &rq_regs->rq_regs_c.min_meta_chunk_size,
++ DPTE_GROUP_SIZE_C, &rq_regs->rq_regs_c.dpte_group_size,
++ MPTE_GROUP_SIZE_C, &rq_regs->rq_regs_c.mpte_group_size,
++ SWATH_HEIGHT_C, &rq_regs->rq_regs_c.swath_height,
++ PTE_ROW_HEIGHT_LINEAR_C, &rq_regs->rq_regs_c.pte_row_height_linear);
++
++}
+ enum cursor_pitch hubp1_get_cursor_pitch(unsigned int pitch)
+ {
+ enum cursor_pitch hw_pitch;
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h
+index 31c8fdd3206c..8f4bcdc74116 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h
+@@ -249,7 +249,8 @@
+ .field_name = reg_name ## __ ## field_name ## post_fix
+
+ /* Mask/shift struct generation macro for all ASICs (including those with reduced functionality) */
+-#define HUBP_MASK_SH_LIST_DCN_COMMON(mask_sh)\
++/*1.x, 2.x, and 3.x*/
++#define HUBP_MASK_SH_LIST_DCN_SHARE_COMMON(mask_sh)\
+ HUBP_SF(HUBP0_DCHUBP_CNTL, HUBP_BLANK_EN, mask_sh),\
+ HUBP_SF(HUBP0_DCHUBP_CNTL, HUBP_TTU_DISABLE, mask_sh),\
+ HUBP_SF(HUBP0_DCHUBP_CNTL, HUBP_UNDERFLOW_STATUS, mask_sh),\
+@@ -265,7 +266,6 @@
+ HUBP_SF(HUBP0_DCSURF_ADDR_CONFIG, MAX_COMPRESSED_FRAGS, mask_sh),\
+ HUBP_SF(HUBP0_DCSURF_TILING_CONFIG, SW_MODE, mask_sh),\
+ HUBP_SF(HUBP0_DCSURF_TILING_CONFIG, META_LINEAR, mask_sh),\
+- HUBP_SF(HUBP0_DCSURF_TILING_CONFIG, RB_ALIGNED, mask_sh),\
+ HUBP_SF(HUBP0_DCSURF_TILING_CONFIG, PIPE_ALIGNED, mask_sh),\
+ HUBP_SF(HUBPREQ0_DCSURF_SURFACE_PITCH, PITCH, mask_sh),\
+ HUBP_SF(HUBPREQ0_DCSURF_SURFACE_PITCH, META_PITCH, mask_sh),\
+@@ -372,12 +372,17 @@
+ HUBP_SF(HUBPREQ0_DCN_SURF0_TTU_CNTL0, QoS_RAMP_DISABLE, mask_sh),\
+ HUBP_SF(HUBPREQ0_DCN_SURF0_TTU_CNTL1, REFCYC_PER_REQ_DELIVERY_PRE, mask_sh),\
+ HUBP_SF(HUBP0_HUBP_CLK_CNTL, HUBP_CLOCK_ENABLE, mask_sh)
+-
+-#define HUBP_MASK_SH_LIST_DCN(mask_sh)\
+- HUBP_MASK_SH_LIST_DCN_COMMON(mask_sh),\
++/*2.x and 1.x only*/
++#define HUBP_MASK_SH_LIST_DCN_COMMON(mask_sh)\
++ HUBP_MASK_SH_LIST_DCN_SHARE_COMMON(mask_sh),\
++ HUBP_SF(HUBP0_DCSURF_TILING_CONFIG, RB_ALIGNED, mask_sh),\
+ HUBP_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG, MPTE_GROUP_SIZE, mask_sh),\
+ HUBP_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG_C, MPTE_GROUP_SIZE_C, mask_sh)
+
++/*2.x and 1.x only*/
++#define HUBP_MASK_SH_LIST_DCN(mask_sh)\
++ HUBP_MASK_SH_LIST_DCN_COMMON(mask_sh)
++
+ /* Mask/shift struct generation macro for ASICs with VM */
+ #define HUBP_MASK_SH_LIST_DCN_VM(mask_sh)\
+ HUBP_SF(HUBPREQ0_NOM_PARAMETERS_0, DST_Y_PER_PTE_ROW_NOM_L, mask_sh),\
+@@ -434,7 +439,7 @@
+ HUBP_SF(CURSOR0_CURSOR_HOT_SPOT, CURSOR_HOT_SPOT_Y, mask_sh), \
+ HUBP_SF(CURSOR0_CURSOR_DST_OFFSET, CURSOR_DST_X_OFFSET, mask_sh)
+
+-#define DCN_HUBP_REG_FIELD_LIST(type) \
++#define DCN_HUBP_REG_FIELD_BASE_LIST(type) \
+ type HUBP_BLANK_EN;\
+ type HUBP_DISABLE;\
+ type HUBP_TTU_DISABLE;\
+@@ -459,7 +464,6 @@
+ type ROTATION_ANGLE;\
+ type H_MIRROR_EN;\
+ type SURFACE_PIXEL_FORMAT;\
+- type ALPHA_PLANE_EN;\
+ type SURFACE_FLIP_TYPE;\
+ type SURFACE_FLIP_MODE_FOR_STEREOSYNC;\
+ type SURFACE_FLIP_IN_STEREOSYNC;\
+@@ -632,6 +636,10 @@
+ type CURSOR_DST_X_OFFSET; \
+ type OUTPUT_FP
+
++#define DCN_HUBP_REG_FIELD_LIST(type) \
++ DCN_HUBP_REG_FIELD_BASE_LIST(type);\
++ type ALPHA_PLANE_EN
++
+ struct dcn_mi_registers {
+ HUBP_COMMON_REG_VARIABLE_LIST;
+ };
+@@ -760,5 +768,6 @@ void hubp1_vready_workaround(struct hubp *hubp,
+ struct _vcs_dpi_display_pipe_dest_params_st *pipe_dest);
+
+ void hubp1_init(struct hubp *hubp);
++void hubp1_read_state_common(struct hubp *hubp);
+
+ #endif
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubp.h b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubp.h
+index d5acc348be22..2c6405a62fc1 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubp.h
++++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubp.h
+@@ -72,8 +72,8 @@
+ SR(DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB),\
+ SR(DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB)
+
+-#define HUBP_MASK_SH_LIST_DCN2_COMMON(mask_sh)\
+- HUBP_MASK_SH_LIST_DCN(mask_sh),\
++#define HUBP_MASK_SH_LIST_DCN2_SHARE_COMMON(mask_sh)\
++ HUBP_MASK_SH_LIST_DCN_SHARE_COMMON(mask_sh),\
+ HUBP_MASK_SH_LIST_DCN_VM(mask_sh),\
+ HUBP_SF(HUBP0_DCSURF_SURFACE_CONFIG, ROTATION_ANGLE, mask_sh),\
+ HUBP_SF(HUBP0_DCSURF_SURFACE_CONFIG, H_MIRROR_EN, mask_sh),\
+@@ -127,13 +127,21 @@
+ HUBP_SF(HUBPREQ0_DCSURF_FLIP_CONTROL2, SURFACE_TRIPLE_BUFFER_ENABLE, mask_sh),\
+ HUBP_SF(HUBPREQ0_VMID_SETTINGS_0, VMID, mask_sh)
+
++/*DCN2.x and DCN1.x*/
++#define HUBP_MASK_SH_LIST_DCN2_COMMON(mask_sh)\
++ HUBP_MASK_SH_LIST_DCN2_SHARE_COMMON(mask_sh),\
++ HUBP_SF(HUBP0_DCSURF_TILING_CONFIG, RB_ALIGNED, mask_sh),\
++ HUBP_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG, MPTE_GROUP_SIZE, mask_sh),\
++ HUBP_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG_C, MPTE_GROUP_SIZE_C, mask_sh)
++
++/*DCN2.0 specific*/
+ #define HUBP_MASK_SH_LIST_DCN20(mask_sh)\
+ HUBP_MASK_SH_LIST_DCN2_COMMON(mask_sh),\
+ HUBP_SF(DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, DCN_VM_SYSTEM_APERTURE_DEFAULT_SYSTEM, mask_sh),\
+ HUBP_SF(DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, mask_sh),\
+ HUBP_SF(DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, mask_sh)
+
+-
++/*DCN2.x */
+ #define DCN2_HUBP_REG_COMMON_VARIABLE_LIST \
+ HUBP_COMMON_REG_VARIABLE_LIST; \
+ uint32_t DMDATA_ADDRESS_HIGH; \
+@@ -149,14 +157,11 @@
+ uint32_t FLIP_PARAMETERS_2;\
+ uint32_t DCN_CUR1_TTU_CNTL0;\
+ uint32_t DCN_CUR1_TTU_CNTL1;\
+- uint32_t VMID_SETTINGS_0;\
+- uint32_t FLIP_PARAMETERS_3;\
+- uint32_t FLIP_PARAMETERS_4;\
+- uint32_t VBLANK_PARAMETERS_5;\
+- uint32_t VBLANK_PARAMETERS_6
++ uint32_t VMID_SETTINGS_0
++
+
+ #define DCN2_HUBP_REG_FIELD_VARIABLE_LIST(type) \
+- DCN_HUBP_REG_FIELD_LIST(type); \
++ DCN_HUBP_REG_FIELD_BASE_LIST(type); \
+ type DMDATA_ADDRESS_HIGH;\
+ type DMDATA_MODE;\
+ type DMDATA_UPDATED;\
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
+index 8d3bc156de6f..f820e9667e3c 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
+@@ -115,7 +115,7 @@ static void enable_power_gating_plane(
+ REG_UPDATE(DOMAIN21_PG_CONFIG, DOMAIN21_POWER_FORCEON, force_on);
+ }
+
+-static void dcn20_dccg_init(struct dce_hwseq *hws)
++void dcn20_dccg_init(struct dce_hwseq *hws)
+ {
+ /*
+ * set MICROSECOND_TIME_BASE_DIV
+@@ -138,6 +138,45 @@ static void dcn20_dccg_init(struct dce_hwseq *hws)
+ /* This value is dependent on the hardware pipeline delay so set once per SOC */
+ REG_WRITE(DISPCLK_FREQ_CHANGE_CNTL, 0x801003c);
+ }
++void dcn20_display_init(struct dc *dc)
++{
++ struct dce_hwseq *hws = dc->hwseq;
++
++ /* RBBMIF
++ * disable RBBMIF timeout detection for all clients
++ * Ensure RBBMIF does not drop register accesses due to the per-client timeout
++ */
++ REG_WRITE(RBBMIF_TIMEOUT_DIS, 0xFFFFFFFF);
++ REG_WRITE(RBBMIF_TIMEOUT_DIS_2, 0xFFFFFFFF);
++
++ /* DCCG */
++ dcn20_dccg_init(hws);
++
++ /* Disable all memory low power mode. All memories are enabled. */
++ REG_UPDATE(DC_MEM_GLOBAL_PWR_REQ_CNTL, DC_MEM_GLOBAL_PWR_REQ_DIS, 1);
++
++ /* DCHUB/MMHUBBUB
++ * set global timer refclk divider
++ * 100Mhz refclk -> 2
++ * 27Mhz refclk -> 1
++ * 48Mhz refclk -> 1
++ */
++ REG_UPDATE(DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, 2);
++ REG_UPDATE(DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_ENABLE, 1);
++ REG_WRITE(REFCLK_CNTL, 0);
++
++ /* OPTC
++ * OTG_CONTROL.OTG_DISABLE_POINT_CNTL = 0x3; will be set during optc2_enable_crtc
++ */
++
++ /* AZ
++ * default value is 0x64 for 100Mhz ref clock, if the ref clock is 100Mhz, no need to program this regiser,
++ * if not, it should be programmed according to the ref clock
++ */
++ REG_UPDATE(AZALIA_AUDIO_DTO, AZALIA_AUDIO_DTO_MODULE, 0x64);
++ /* Enable controller clock gating */
++ REG_WRITE(AZALIA_CONTROLLER_CLOCK_GATING, 0x1);
++}
+
+ static void disable_vga(
+ struct dce_hwseq *hws)
+@@ -163,7 +202,7 @@ void dcn20_program_tripleBuffer(
+ }
+
+ /* Blank pixel data during initialization */
+-static void dcn20_init_blank(
++void dcn20_init_blank(
+ struct dc *dc,
+ struct timing_generator *tg)
+ {
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.h b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.h
+index 2b0409454073..689c2765b071 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.h
++++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.h
+@@ -91,13 +91,9 @@ void dcn20_pipe_control_lock_global(
+ void dcn20_setup_gsl_group_as_lock(const struct dc *dc,
+ struct pipe_ctx *pipe_ctx,
+ bool enable);
+-void dcn20_pipe_control_lock(
+- struct dc *dc,
+- struct pipe_ctx *pipe,
+- bool lock);
+-void dcn20_disable_plane(struct dc *dc, struct pipe_ctx *pipe_ctx);
+-void dcn20_enable_plane(
+- struct dc *dc,
+- struct pipe_ctx *pipe_ctx,
+- struct dc_state *context);
++void dcn20_dccg_init(struct dce_hwseq *hws);
++void dcn20_init_blank(
++ struct dc *dc,
++ struct timing_generator *tg);
++void dcn20_display_init(struct dc *dc);
+ #endif /* __DC_HWSS_DCN20_H__ */
+--
+2.17.1
+