xref: /linux/drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.c (revision ab93e0dd72c37d378dd936f031ffb83ff2bd87ce)
12083640fSNicholas Kazlauskas /*
22083640fSNicholas Kazlauskas  * Copyright 2019 Advanced Micro Devices, Inc.
32083640fSNicholas Kazlauskas  *
42083640fSNicholas Kazlauskas  * Permission is hereby granted, free of charge, to any person obtaining a
52083640fSNicholas Kazlauskas  * copy of this software and associated documentation files (the "Software"),
62083640fSNicholas Kazlauskas  * to deal in the Software without restriction, including without limitation
72083640fSNicholas Kazlauskas  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
82083640fSNicholas Kazlauskas  * and/or sell copies of the Software, and to permit persons to whom the
92083640fSNicholas Kazlauskas  * Software is furnished to do so, subject to the following conditions:
102083640fSNicholas Kazlauskas  *
112083640fSNicholas Kazlauskas  * The above copyright notice and this permission notice shall be included in
122083640fSNicholas Kazlauskas  * all copies or substantial portions of the Software.
132083640fSNicholas Kazlauskas  *
142083640fSNicholas Kazlauskas  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
152083640fSNicholas Kazlauskas  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
162083640fSNicholas Kazlauskas  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
172083640fSNicholas Kazlauskas  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
182083640fSNicholas Kazlauskas  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
192083640fSNicholas Kazlauskas  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
202083640fSNicholas Kazlauskas  * OTHER DEALINGS IN THE SOFTWARE.
212083640fSNicholas Kazlauskas  *
222083640fSNicholas Kazlauskas  * Authors: AMD
232083640fSNicholas Kazlauskas  *
242083640fSNicholas Kazlauskas  */
252083640fSNicholas Kazlauskas 
262083640fSNicholas Kazlauskas 
272083640fSNicholas Kazlauskas #include "dm_services.h"
282083640fSNicholas Kazlauskas #include "dc.h"
292083640fSNicholas Kazlauskas 
302083640fSNicholas Kazlauskas #include "dcn31/dcn31_init.h"
312083640fSNicholas Kazlauskas 
322083640fSNicholas Kazlauskas #include "resource.h"
332083640fSNicholas Kazlauskas #include "include/irq_service_interface.h"
342083640fSNicholas Kazlauskas #include "dcn31_resource.h"
352083640fSNicholas Kazlauskas 
362083640fSNicholas Kazlauskas #include "dcn20/dcn20_resource.h"
372083640fSNicholas Kazlauskas #include "dcn30/dcn30_resource.h"
382083640fSNicholas Kazlauskas 
39e4b0eac3SJasdeep Dhillon #include "dml/dcn30/dcn30_fpu.h"
40e4b0eac3SJasdeep Dhillon 
412083640fSNicholas Kazlauskas #include "dcn10/dcn10_ipp.h"
422083640fSNicholas Kazlauskas #include "dcn30/dcn30_hubbub.h"
432083640fSNicholas Kazlauskas #include "dcn31/dcn31_hubbub.h"
442083640fSNicholas Kazlauskas #include "dcn30/dcn30_mpc.h"
452083640fSNicholas Kazlauskas #include "dcn31/dcn31_hubp.h"
462083640fSNicholas Kazlauskas #include "irq/dcn31/irq_service_dcn31.h"
472083640fSNicholas Kazlauskas #include "dcn30/dcn30_dpp.h"
482083640fSNicholas Kazlauskas #include "dcn31/dcn31_optc.h"
492083640fSNicholas Kazlauskas #include "dcn20/dcn20_hwseq.h"
502083640fSNicholas Kazlauskas #include "dcn30/dcn30_hwseq.h"
51e53524cdSMounika Adhuri #include "dce110/dce110_hwseq.h"
522083640fSNicholas Kazlauskas #include "dcn30/dcn30_opp.h"
532083640fSNicholas Kazlauskas #include "dcn20/dcn20_dsc.h"
542083640fSNicholas Kazlauskas #include "dcn30/dcn30_vpg.h"
552083640fSNicholas Kazlauskas #include "dcn30/dcn30_afmt.h"
562083640fSNicholas Kazlauskas #include "dcn30/dcn30_dio_stream_encoder.h"
5783228ebbSFangzhi Zuo #include "dcn31/dcn31_hpo_dp_stream_encoder.h"
583bc8d921SFangzhi Zuo #include "dcn31/dcn31_hpo_dp_link_encoder.h"
5961452908SFangzhi Zuo #include "dcn31/dcn31_apg.h"
602083640fSNicholas Kazlauskas #include "dcn31/dcn31_dio_link_encoder.h"
6118b4f1a0SMichael Strauss #include "dcn31/dcn31_vpg.h"
6218b4f1a0SMichael Strauss #include "dcn31/dcn31_afmt.h"
632083640fSNicholas Kazlauskas #include "dce/dce_clock_source.h"
642083640fSNicholas Kazlauskas #include "dce/dce_audio.h"
652083640fSNicholas Kazlauskas #include "dce/dce_hwseq.h"
662083640fSNicholas Kazlauskas #include "clk_mgr.h"
672083640fSNicholas Kazlauskas #include "virtual/virtual_stream_encoder.h"
682083640fSNicholas Kazlauskas #include "dce110/dce110_resource.h"
692083640fSNicholas Kazlauskas #include "dml/display_mode_vba.h"
7026f4712aSMelissa Wen #include "dml/dcn31/dcn31_fpu.h"
712083640fSNicholas Kazlauskas #include "dcn31/dcn31_dccg.h"
722083640fSNicholas Kazlauskas #include "dcn10/dcn10_resource.h"
738b8eed05SMounika Adhuri #include "dcn31/dcn31_panel_cntl.h"
742083640fSNicholas Kazlauskas 
752083640fSNicholas Kazlauskas #include "dcn30/dcn30_dwb.h"
762083640fSNicholas Kazlauskas #include "dcn30/dcn30_mmhubbub.h"
772083640fSNicholas Kazlauskas 
782083640fSNicholas Kazlauskas #include "yellow_carp_offset.h"
792083640fSNicholas Kazlauskas #include "dcn/dcn_3_1_2_offset.h"
802083640fSNicholas Kazlauskas #include "dcn/dcn_3_1_2_sh_mask.h"
812083640fSNicholas Kazlauskas #include "nbio/nbio_7_2_0_offset.h"
822083640fSNicholas Kazlauskas #include "dpcs/dpcs_4_2_0_offset.h"
832083640fSNicholas Kazlauskas #include "dpcs/dpcs_4_2_0_sh_mask.h"
842083640fSNicholas Kazlauskas #include "mmhub/mmhub_2_3_0_offset.h"
852083640fSNicholas Kazlauskas #include "mmhub/mmhub_2_3_0_sh_mask.h"
862083640fSNicholas Kazlauskas 
872083640fSNicholas Kazlauskas 
882083640fSNicholas Kazlauskas #define regDCHUBBUB_DEBUG_CTRL_0                                              0x04d6
892083640fSNicholas Kazlauskas #define regDCHUBBUB_DEBUG_CTRL_0_BASE_IDX                                     2
902083640fSNicholas Kazlauskas #define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH__SHIFT                               0x10
912083640fSNicholas Kazlauskas #define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH_MASK                                 0x01FF0000L
922083640fSNicholas Kazlauskas 
932083640fSNicholas Kazlauskas #include "reg_helper.h"
942083640fSNicholas Kazlauskas #include "dce/dmub_abm.h"
952083640fSNicholas Kazlauskas #include "dce/dmub_psr.h"
962083640fSNicholas Kazlauskas #include "dce/dce_aux.h"
972083640fSNicholas Kazlauskas #include "dce/dce_i2c.h"
98c7ddc0a8SBhawanpreet Lakha #include "dce/dmub_replay.h"
992083640fSNicholas Kazlauskas 
1002083640fSNicholas Kazlauskas #include "dml/dcn30/display_mode_vba_30.h"
1012083640fSNicholas Kazlauskas #include "vm_helper.h"
1022083640fSNicholas Kazlauskas #include "dcn20/dcn20_vmid.h"
1032083640fSNicholas Kazlauskas 
1042083640fSNicholas Kazlauskas #include "link_enc_cfg.h"
1052083640fSNicholas Kazlauskas 
1065d72e247SHamza Mahfooz #define DC_LOGGER \
1075d72e247SHamza Mahfooz 	dc->ctx->logger
1082083640fSNicholas Kazlauskas #define DC_LOGGER_INIT(logger)
1092083640fSNicholas Kazlauskas 
1102083640fSNicholas Kazlauskas enum dcn31_clk_src_array_id {
1112083640fSNicholas Kazlauskas 	DCN31_CLK_SRC_PLL0,
1122083640fSNicholas Kazlauskas 	DCN31_CLK_SRC_PLL1,
1132083640fSNicholas Kazlauskas 	DCN31_CLK_SRC_PLL2,
1142083640fSNicholas Kazlauskas 	DCN31_CLK_SRC_PLL3,
1152083640fSNicholas Kazlauskas 	DCN31_CLK_SRC_PLL4,
1162083640fSNicholas Kazlauskas 	DCN30_CLK_SRC_TOTAL
1172083640fSNicholas Kazlauskas };
1182083640fSNicholas Kazlauskas 
1192083640fSNicholas Kazlauskas /* begin *********************
1202083640fSNicholas Kazlauskas  * macros to expend register list macro defined in HW object header file
1212083640fSNicholas Kazlauskas  */
1222083640fSNicholas Kazlauskas 
1232083640fSNicholas Kazlauskas /* DCN */
1242083640fSNicholas Kazlauskas #define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
1252083640fSNicholas Kazlauskas 
1262083640fSNicholas Kazlauskas #define BASE(seg) BASE_INNER(seg)
1272083640fSNicholas Kazlauskas 
1282083640fSNicholas Kazlauskas #define SR(reg_name)\
1292083640fSNicholas Kazlauskas 		.reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
1302083640fSNicholas Kazlauskas 					reg ## reg_name
1312083640fSNicholas Kazlauskas 
1322083640fSNicholas Kazlauskas #define SRI(reg_name, block, id)\
1332083640fSNicholas Kazlauskas 	.reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
1342083640fSNicholas Kazlauskas 					reg ## block ## id ## _ ## reg_name
1352083640fSNicholas Kazlauskas 
1362083640fSNicholas Kazlauskas #define SRI2(reg_name, block, id)\
1372083640fSNicholas Kazlauskas 	.reg_name = BASE(reg ## reg_name ## _BASE_IDX) + \
1382083640fSNicholas Kazlauskas 					reg ## reg_name
1392083640fSNicholas Kazlauskas 
1402083640fSNicholas Kazlauskas #define SRIR(var_name, reg_name, block, id)\
1412083640fSNicholas Kazlauskas 	.var_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
1422083640fSNicholas Kazlauskas 					reg ## block ## id ## _ ## reg_name
1432083640fSNicholas Kazlauskas 
1442083640fSNicholas Kazlauskas #define SRII(reg_name, block, id)\
1452083640fSNicholas Kazlauskas 	.reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
1462083640fSNicholas Kazlauskas 					reg ## block ## id ## _ ## reg_name
1472083640fSNicholas Kazlauskas 
1482083640fSNicholas Kazlauskas #define SRII_MPC_RMU(reg_name, block, id)\
1492083640fSNicholas Kazlauskas 	.RMU##_##reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
1502083640fSNicholas Kazlauskas 					reg ## block ## id ## _ ## reg_name
1512083640fSNicholas Kazlauskas 
1522083640fSNicholas Kazlauskas #define SRII_DWB(reg_name, temp_name, block, id)\
1532083640fSNicholas Kazlauskas 	.reg_name[id] = BASE(reg ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
1542083640fSNicholas Kazlauskas 					reg ## block ## id ## _ ## temp_name
1552083640fSNicholas Kazlauskas 
156158858bfSAurabindo Pillai #define SF_DWB2(reg_name, block, id, field_name, post_fix)	\
157158858bfSAurabindo Pillai 	.field_name = reg_name ## __ ## field_name ## post_fix
158158858bfSAurabindo Pillai 
1592083640fSNicholas Kazlauskas #define DCCG_SRII(reg_name, block, id)\
1602083640fSNicholas Kazlauskas 	.block ## _ ## reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
1612083640fSNicholas Kazlauskas 					reg ## block ## id ## _ ## reg_name
1622083640fSNicholas Kazlauskas 
1632083640fSNicholas Kazlauskas #define VUPDATE_SRII(reg_name, block, id)\
1642083640fSNicholas Kazlauskas 	.reg_name[id] = BASE(reg ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
1652083640fSNicholas Kazlauskas 					reg ## reg_name ## _ ## block ## id
1662083640fSNicholas Kazlauskas 
1672083640fSNicholas Kazlauskas /* NBIO */
1682083640fSNicholas Kazlauskas #define NBIO_BASE_INNER(seg) \
1692083640fSNicholas Kazlauskas 	NBIO_BASE__INST0_SEG ## seg
1702083640fSNicholas Kazlauskas 
1712083640fSNicholas Kazlauskas #define NBIO_BASE(seg) \
1722083640fSNicholas Kazlauskas 	NBIO_BASE_INNER(seg)
1732083640fSNicholas Kazlauskas 
1742083640fSNicholas Kazlauskas #define NBIO_SR(reg_name)\
1752083640fSNicholas Kazlauskas 		.reg_name = NBIO_BASE(regBIF_BX1_ ## reg_name ## _BASE_IDX) + \
1762083640fSNicholas Kazlauskas 					regBIF_BX1_ ## reg_name
1772083640fSNicholas Kazlauskas 
1782083640fSNicholas Kazlauskas /* MMHUB */
1792083640fSNicholas Kazlauskas #define MMHUB_BASE_INNER(seg) \
1802083640fSNicholas Kazlauskas 	MMHUB_BASE__INST0_SEG ## seg
1812083640fSNicholas Kazlauskas 
1822083640fSNicholas Kazlauskas #define MMHUB_BASE(seg) \
1832083640fSNicholas Kazlauskas 	MMHUB_BASE_INNER(seg)
1842083640fSNicholas Kazlauskas 
1852083640fSNicholas Kazlauskas #define MMHUB_SR(reg_name)\
1862083640fSNicholas Kazlauskas 		.reg_name = MMHUB_BASE(mm ## reg_name ## _BASE_IDX) + \
1872083640fSNicholas Kazlauskas 					mm ## reg_name
1882083640fSNicholas Kazlauskas 
1892083640fSNicholas Kazlauskas /* CLOCK */
1902083640fSNicholas Kazlauskas #define CLK_BASE_INNER(seg) \
1912083640fSNicholas Kazlauskas 	CLK_BASE__INST0_SEG ## seg
1922083640fSNicholas Kazlauskas 
1932083640fSNicholas Kazlauskas #define CLK_BASE(seg) \
1942083640fSNicholas Kazlauskas 	CLK_BASE_INNER(seg)
1952083640fSNicholas Kazlauskas 
1962083640fSNicholas Kazlauskas #define CLK_SRI(reg_name, block, inst)\
1972083640fSNicholas Kazlauskas 	.reg_name = CLK_BASE(reg ## block ## _ ## inst ## _ ## reg_name ## _BASE_IDX) + \
1982083640fSNicholas Kazlauskas 					reg ## block ## _ ## inst ## _ ## reg_name
1992083640fSNicholas Kazlauskas 
2002083640fSNicholas Kazlauskas 
2012083640fSNicholas Kazlauskas static const struct bios_registers bios_regs = {
2022083640fSNicholas Kazlauskas 		NBIO_SR(BIOS_SCRATCH_3),
2032083640fSNicholas Kazlauskas 		NBIO_SR(BIOS_SCRATCH_6)
2042083640fSNicholas Kazlauskas };
2052083640fSNicholas Kazlauskas 
2062083640fSNicholas Kazlauskas #define clk_src_regs(index, pllid)\
2072083640fSNicholas Kazlauskas [index] = {\
2082083640fSNicholas Kazlauskas 	CS_COMMON_REG_LIST_DCN3_0(index, pllid),\
2092083640fSNicholas Kazlauskas }
2102083640fSNicholas Kazlauskas 
2112083640fSNicholas Kazlauskas static const struct dce110_clk_src_regs clk_src_regs[] = {
2122083640fSNicholas Kazlauskas 	clk_src_regs(0, A),
2132083640fSNicholas Kazlauskas 	clk_src_regs(1, B),
2142083640fSNicholas Kazlauskas 	clk_src_regs(2, C),
2152083640fSNicholas Kazlauskas 	clk_src_regs(3, D),
2162083640fSNicholas Kazlauskas 	clk_src_regs(4, E)
2172083640fSNicholas Kazlauskas };
218bf252ce1SCharlene Liu /*pll_id being rempped in dmub, in driver it is logical instance*/
219bf252ce1SCharlene Liu static const struct dce110_clk_src_regs clk_src_regs_b0[] = {
220bf252ce1SCharlene Liu 	clk_src_regs(0, A),
221bf252ce1SCharlene Liu 	clk_src_regs(1, B),
222bf252ce1SCharlene Liu 	clk_src_regs(2, F),
223bf252ce1SCharlene Liu 	clk_src_regs(3, G),
224bf252ce1SCharlene Liu 	clk_src_regs(4, E)
225bf252ce1SCharlene Liu };
2262083640fSNicholas Kazlauskas 
2272083640fSNicholas Kazlauskas static const struct dce110_clk_src_shift cs_shift = {
2282083640fSNicholas Kazlauskas 		CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
2292083640fSNicholas Kazlauskas };
2302083640fSNicholas Kazlauskas 
2312083640fSNicholas Kazlauskas static const struct dce110_clk_src_mask cs_mask = {
2322083640fSNicholas Kazlauskas 		CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
2332083640fSNicholas Kazlauskas };
2342083640fSNicholas Kazlauskas 
2352083640fSNicholas Kazlauskas #define abm_regs(id)\
2362083640fSNicholas Kazlauskas [id] = {\
237b5ce6fe8SJosip Pavic 		ABM_DCN302_REG_LIST(id)\
2382083640fSNicholas Kazlauskas }
2392083640fSNicholas Kazlauskas 
2402083640fSNicholas Kazlauskas static const struct dce_abm_registers abm_regs[] = {
2412083640fSNicholas Kazlauskas 		abm_regs(0),
2422083640fSNicholas Kazlauskas 		abm_regs(1),
2432083640fSNicholas Kazlauskas 		abm_regs(2),
2442083640fSNicholas Kazlauskas 		abm_regs(3),
2452083640fSNicholas Kazlauskas };
2462083640fSNicholas Kazlauskas 
2472083640fSNicholas Kazlauskas static const struct dce_abm_shift abm_shift = {
2482083640fSNicholas Kazlauskas 		ABM_MASK_SH_LIST_DCN30(__SHIFT)
2492083640fSNicholas Kazlauskas };
2502083640fSNicholas Kazlauskas 
2512083640fSNicholas Kazlauskas static const struct dce_abm_mask abm_mask = {
2522083640fSNicholas Kazlauskas 		ABM_MASK_SH_LIST_DCN30(_MASK)
2532083640fSNicholas Kazlauskas };
2542083640fSNicholas Kazlauskas 
2552083640fSNicholas Kazlauskas #define audio_regs(id)\
2562083640fSNicholas Kazlauskas [id] = {\
2572083640fSNicholas Kazlauskas 		AUD_COMMON_REG_LIST(id)\
2582083640fSNicholas Kazlauskas }
2592083640fSNicholas Kazlauskas 
2602083640fSNicholas Kazlauskas static const struct dce_audio_registers audio_regs[] = {
2612083640fSNicholas Kazlauskas 	audio_regs(0),
2622083640fSNicholas Kazlauskas 	audio_regs(1),
2632083640fSNicholas Kazlauskas 	audio_regs(2),
2642083640fSNicholas Kazlauskas 	audio_regs(3),
2652083640fSNicholas Kazlauskas 	audio_regs(4),
2662083640fSNicholas Kazlauskas 	audio_regs(5),
2672083640fSNicholas Kazlauskas 	audio_regs(6)
2682083640fSNicholas Kazlauskas };
2692083640fSNicholas Kazlauskas 
2702083640fSNicholas Kazlauskas #define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
2712083640fSNicholas Kazlauskas 		SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
2722083640fSNicholas Kazlauskas 		SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
2732083640fSNicholas Kazlauskas 		AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
2742083640fSNicholas Kazlauskas 
2752083640fSNicholas Kazlauskas static const struct dce_audio_shift audio_shift = {
2762083640fSNicholas Kazlauskas 		DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
2772083640fSNicholas Kazlauskas };
2782083640fSNicholas Kazlauskas 
2792083640fSNicholas Kazlauskas static const struct dce_audio_mask audio_mask = {
2802083640fSNicholas Kazlauskas 		DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
2812083640fSNicholas Kazlauskas };
2822083640fSNicholas Kazlauskas 
2832083640fSNicholas Kazlauskas #define vpg_regs(id)\
2842083640fSNicholas Kazlauskas [id] = {\
28518b4f1a0SMichael Strauss 	VPG_DCN31_REG_LIST(id)\
2862083640fSNicholas Kazlauskas }
2872083640fSNicholas Kazlauskas 
28818b4f1a0SMichael Strauss static const struct dcn31_vpg_registers vpg_regs[] = {
2892083640fSNicholas Kazlauskas 	vpg_regs(0),
2902083640fSNicholas Kazlauskas 	vpg_regs(1),
2912083640fSNicholas Kazlauskas 	vpg_regs(2),
2922083640fSNicholas Kazlauskas 	vpg_regs(3),
2932083640fSNicholas Kazlauskas 	vpg_regs(4),
2942083640fSNicholas Kazlauskas 	vpg_regs(5),
2952083640fSNicholas Kazlauskas 	vpg_regs(6),
2962083640fSNicholas Kazlauskas 	vpg_regs(7),
2972083640fSNicholas Kazlauskas 	vpg_regs(8),
2982083640fSNicholas Kazlauskas 	vpg_regs(9),
2992083640fSNicholas Kazlauskas };
3002083640fSNicholas Kazlauskas 
30118b4f1a0SMichael Strauss static const struct dcn31_vpg_shift vpg_shift = {
30218b4f1a0SMichael Strauss 	DCN31_VPG_MASK_SH_LIST(__SHIFT)
3032083640fSNicholas Kazlauskas };
3042083640fSNicholas Kazlauskas 
30518b4f1a0SMichael Strauss static const struct dcn31_vpg_mask vpg_mask = {
30618b4f1a0SMichael Strauss 	DCN31_VPG_MASK_SH_LIST(_MASK)
3072083640fSNicholas Kazlauskas };
3082083640fSNicholas Kazlauskas 
3092083640fSNicholas Kazlauskas #define afmt_regs(id)\
3102083640fSNicholas Kazlauskas [id] = {\
31118b4f1a0SMichael Strauss 	AFMT_DCN31_REG_LIST(id)\
3122083640fSNicholas Kazlauskas }
3132083640fSNicholas Kazlauskas 
31418b4f1a0SMichael Strauss static const struct dcn31_afmt_registers afmt_regs[] = {
3152083640fSNicholas Kazlauskas 	afmt_regs(0),
3162083640fSNicholas Kazlauskas 	afmt_regs(1),
3172083640fSNicholas Kazlauskas 	afmt_regs(2),
3182083640fSNicholas Kazlauskas 	afmt_regs(3),
3192083640fSNicholas Kazlauskas 	afmt_regs(4),
3202083640fSNicholas Kazlauskas 	afmt_regs(5)
3212083640fSNicholas Kazlauskas };
3222083640fSNicholas Kazlauskas 
32318b4f1a0SMichael Strauss static const struct dcn31_afmt_shift afmt_shift = {
32418b4f1a0SMichael Strauss 	DCN31_AFMT_MASK_SH_LIST(__SHIFT)
3252083640fSNicholas Kazlauskas };
3262083640fSNicholas Kazlauskas 
32718b4f1a0SMichael Strauss static const struct dcn31_afmt_mask afmt_mask = {
32818b4f1a0SMichael Strauss 	DCN31_AFMT_MASK_SH_LIST(_MASK)
3292083640fSNicholas Kazlauskas };
3302083640fSNicholas Kazlauskas 
33161452908SFangzhi Zuo #define apg_regs(id)\
33261452908SFangzhi Zuo [id] = {\
33361452908SFangzhi Zuo 	APG_DCN31_REG_LIST(id)\
33461452908SFangzhi Zuo }
33561452908SFangzhi Zuo 
33661452908SFangzhi Zuo static const struct dcn31_apg_registers apg_regs[] = {
33761452908SFangzhi Zuo 	apg_regs(0),
33861452908SFangzhi Zuo 	apg_regs(1),
33961452908SFangzhi Zuo 	apg_regs(2),
34061452908SFangzhi Zuo 	apg_regs(3)
34161452908SFangzhi Zuo };
34261452908SFangzhi Zuo 
34361452908SFangzhi Zuo static const struct dcn31_apg_shift apg_shift = {
34461452908SFangzhi Zuo 	DCN31_APG_MASK_SH_LIST(__SHIFT)
34561452908SFangzhi Zuo };
34661452908SFangzhi Zuo 
34761452908SFangzhi Zuo static const struct dcn31_apg_mask apg_mask = {
34861452908SFangzhi Zuo 		DCN31_APG_MASK_SH_LIST(_MASK)
34961452908SFangzhi Zuo };
35061452908SFangzhi Zuo 
3512083640fSNicholas Kazlauskas #define stream_enc_regs(id)\
3522083640fSNicholas Kazlauskas [id] = {\
3532083640fSNicholas Kazlauskas 	SE_DCN3_REG_LIST(id)\
3542083640fSNicholas Kazlauskas }
3552083640fSNicholas Kazlauskas 
356d374d3b4SNicholas Kazlauskas /* Some encoders won't be initialized here - but they're logical, not physical. */
357d374d3b4SNicholas Kazlauskas static const struct dcn10_stream_enc_registers stream_enc_regs[ENGINE_ID_COUNT] = {
3582083640fSNicholas Kazlauskas 	stream_enc_regs(0),
3592083640fSNicholas Kazlauskas 	stream_enc_regs(1),
3602083640fSNicholas Kazlauskas 	stream_enc_regs(2),
3612083640fSNicholas Kazlauskas 	stream_enc_regs(3),
3622083640fSNicholas Kazlauskas 	stream_enc_regs(4)
3632083640fSNicholas Kazlauskas };
3642083640fSNicholas Kazlauskas 
3652083640fSNicholas Kazlauskas static const struct dcn10_stream_encoder_shift se_shift = {
3662083640fSNicholas Kazlauskas 		SE_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
3672083640fSNicholas Kazlauskas };
3682083640fSNicholas Kazlauskas 
3692083640fSNicholas Kazlauskas static const struct dcn10_stream_encoder_mask se_mask = {
3702083640fSNicholas Kazlauskas 		SE_COMMON_MASK_SH_LIST_DCN30(_MASK)
3712083640fSNicholas Kazlauskas };
3722083640fSNicholas Kazlauskas 
3732083640fSNicholas Kazlauskas 
3742083640fSNicholas Kazlauskas #define aux_regs(id)\
3752083640fSNicholas Kazlauskas [id] = {\
3762083640fSNicholas Kazlauskas 	DCN2_AUX_REG_LIST(id)\
3772083640fSNicholas Kazlauskas }
3782083640fSNicholas Kazlauskas 
3792083640fSNicholas Kazlauskas static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
3802083640fSNicholas Kazlauskas 		aux_regs(0),
3812083640fSNicholas Kazlauskas 		aux_regs(1),
3822083640fSNicholas Kazlauskas 		aux_regs(2),
3832083640fSNicholas Kazlauskas 		aux_regs(3),
3842083640fSNicholas Kazlauskas 		aux_regs(4)
3852083640fSNicholas Kazlauskas };
3862083640fSNicholas Kazlauskas 
3872083640fSNicholas Kazlauskas #define hpd_regs(id)\
3882083640fSNicholas Kazlauskas [id] = {\
3892083640fSNicholas Kazlauskas 	HPD_REG_LIST(id)\
3902083640fSNicholas Kazlauskas }
3912083640fSNicholas Kazlauskas 
3922083640fSNicholas Kazlauskas static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
3932083640fSNicholas Kazlauskas 		hpd_regs(0),
3942083640fSNicholas Kazlauskas 		hpd_regs(1),
3952083640fSNicholas Kazlauskas 		hpd_regs(2),
3962083640fSNicholas Kazlauskas 		hpd_regs(3),
3972083640fSNicholas Kazlauskas 		hpd_regs(4)
3982083640fSNicholas Kazlauskas };
3992083640fSNicholas Kazlauskas 
4002083640fSNicholas Kazlauskas #define link_regs(id, phyid)\
4012083640fSNicholas Kazlauskas [id] = {\
4022083640fSNicholas Kazlauskas 	LE_DCN31_REG_LIST(id), \
4032083640fSNicholas Kazlauskas 	UNIPHY_DCN2_REG_LIST(phyid), \
4042083640fSNicholas Kazlauskas 	DPCS_DCN31_REG_LIST(id), \
4052083640fSNicholas Kazlauskas }
4062083640fSNicholas Kazlauskas 
4072083640fSNicholas Kazlauskas static const struct dce110_aux_registers_shift aux_shift = {
4082083640fSNicholas Kazlauskas 	DCN_AUX_MASK_SH_LIST(__SHIFT)
4092083640fSNicholas Kazlauskas };
4102083640fSNicholas Kazlauskas 
4112083640fSNicholas Kazlauskas static const struct dce110_aux_registers_mask aux_mask = {
4122083640fSNicholas Kazlauskas 	DCN_AUX_MASK_SH_LIST(_MASK)
4132083640fSNicholas Kazlauskas };
4142083640fSNicholas Kazlauskas 
4152083640fSNicholas Kazlauskas static const struct dcn10_link_enc_registers link_enc_regs[] = {
4162083640fSNicholas Kazlauskas 	link_regs(0, A),
4172083640fSNicholas Kazlauskas 	link_regs(1, B),
4182083640fSNicholas Kazlauskas 	link_regs(2, C),
4192083640fSNicholas Kazlauskas 	link_regs(3, D),
4202083640fSNicholas Kazlauskas 	link_regs(4, E)
4212083640fSNicholas Kazlauskas };
4222083640fSNicholas Kazlauskas 
4232083640fSNicholas Kazlauskas static const struct dcn10_link_enc_shift le_shift = {
4242083640fSNicholas Kazlauskas 	LINK_ENCODER_MASK_SH_LIST_DCN31(__SHIFT), \
4252083640fSNicholas Kazlauskas 	DPCS_DCN31_MASK_SH_LIST(__SHIFT)
4262083640fSNicholas Kazlauskas };
4272083640fSNicholas Kazlauskas 
4282083640fSNicholas Kazlauskas static const struct dcn10_link_enc_mask le_mask = {
4292083640fSNicholas Kazlauskas 	LINK_ENCODER_MASK_SH_LIST_DCN31(_MASK), \
4302083640fSNicholas Kazlauskas 	DPCS_DCN31_MASK_SH_LIST(_MASK)
4312083640fSNicholas Kazlauskas };
4322083640fSNicholas Kazlauskas 
43383228ebbSFangzhi Zuo #define hpo_dp_stream_encoder_reg_list(id)\
43483228ebbSFangzhi Zuo [id] = {\
43583228ebbSFangzhi Zuo 	DCN3_1_HPO_DP_STREAM_ENC_REG_LIST(id)\
43683228ebbSFangzhi Zuo }
43783228ebbSFangzhi Zuo 
43883228ebbSFangzhi Zuo static const struct dcn31_hpo_dp_stream_encoder_registers hpo_dp_stream_enc_regs[] = {
43983228ebbSFangzhi Zuo 	hpo_dp_stream_encoder_reg_list(0),
44083228ebbSFangzhi Zuo 	hpo_dp_stream_encoder_reg_list(1),
44183228ebbSFangzhi Zuo 	hpo_dp_stream_encoder_reg_list(2),
44283228ebbSFangzhi Zuo 	hpo_dp_stream_encoder_reg_list(3),
44383228ebbSFangzhi Zuo };
44483228ebbSFangzhi Zuo 
44583228ebbSFangzhi Zuo static const struct dcn31_hpo_dp_stream_encoder_shift hpo_dp_se_shift = {
44683228ebbSFangzhi Zuo 	DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(__SHIFT)
44783228ebbSFangzhi Zuo };
44883228ebbSFangzhi Zuo 
44983228ebbSFangzhi Zuo static const struct dcn31_hpo_dp_stream_encoder_mask hpo_dp_se_mask = {
45083228ebbSFangzhi Zuo 	DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(_MASK)
45183228ebbSFangzhi Zuo };
45283228ebbSFangzhi Zuo 
4533bc8d921SFangzhi Zuo #define hpo_dp_link_encoder_reg_list(id)\
4543bc8d921SFangzhi Zuo [id] = {\
4553bc8d921SFangzhi Zuo 	DCN3_1_HPO_DP_LINK_ENC_REG_LIST(id),\
4563bc8d921SFangzhi Zuo 	DCN3_1_RDPCSTX_REG_LIST(0),\
4573bc8d921SFangzhi Zuo 	DCN3_1_RDPCSTX_REG_LIST(1),\
4583bc8d921SFangzhi Zuo 	DCN3_1_RDPCSTX_REG_LIST(2),\
4593bc8d921SFangzhi Zuo 	DCN3_1_RDPCSTX_REG_LIST(3),\
4603bc8d921SFangzhi Zuo 	DCN3_1_RDPCSTX_REG_LIST(4)\
4613bc8d921SFangzhi Zuo }
4623bc8d921SFangzhi Zuo 
4633bc8d921SFangzhi Zuo static const struct dcn31_hpo_dp_link_encoder_registers hpo_dp_link_enc_regs[] = {
4643bc8d921SFangzhi Zuo 	hpo_dp_link_encoder_reg_list(0),
4653bc8d921SFangzhi Zuo 	hpo_dp_link_encoder_reg_list(1),
4663bc8d921SFangzhi Zuo };
4673bc8d921SFangzhi Zuo 
4683bc8d921SFangzhi Zuo static const struct dcn31_hpo_dp_link_encoder_shift hpo_dp_le_shift = {
4693bc8d921SFangzhi Zuo 	DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(__SHIFT)
4703bc8d921SFangzhi Zuo };
4713bc8d921SFangzhi Zuo 
4723bc8d921SFangzhi Zuo static const struct dcn31_hpo_dp_link_encoder_mask hpo_dp_le_mask = {
4733bc8d921SFangzhi Zuo 	DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(_MASK)
4743bc8d921SFangzhi Zuo };
4753bc8d921SFangzhi Zuo 
476f01ee019SFangzhi Zuo #define dpp_regs(id)\
477f01ee019SFangzhi Zuo [id] = {\
478f01ee019SFangzhi Zuo 	DPP_REG_LIST_DCN30(id),\
479f01ee019SFangzhi Zuo }
480f01ee019SFangzhi Zuo 
4812083640fSNicholas Kazlauskas static const struct dcn3_dpp_registers dpp_regs[] = {
4822083640fSNicholas Kazlauskas 	dpp_regs(0),
4832083640fSNicholas Kazlauskas 	dpp_regs(1),
4842083640fSNicholas Kazlauskas 	dpp_regs(2),
4852083640fSNicholas Kazlauskas 	dpp_regs(3)
4862083640fSNicholas Kazlauskas };
4872083640fSNicholas Kazlauskas 
4882083640fSNicholas Kazlauskas static const struct dcn3_dpp_shift tf_shift = {
4892083640fSNicholas Kazlauskas 		DPP_REG_LIST_SH_MASK_DCN30(__SHIFT)
4902083640fSNicholas Kazlauskas };
4912083640fSNicholas Kazlauskas 
4922083640fSNicholas Kazlauskas static const struct dcn3_dpp_mask tf_mask = {
4932083640fSNicholas Kazlauskas 		DPP_REG_LIST_SH_MASK_DCN30(_MASK)
4942083640fSNicholas Kazlauskas };
4952083640fSNicholas Kazlauskas 
4962083640fSNicholas Kazlauskas #define opp_regs(id)\
4972083640fSNicholas Kazlauskas [id] = {\
4982083640fSNicholas Kazlauskas 	OPP_REG_LIST_DCN30(id),\
4992083640fSNicholas Kazlauskas }
5002083640fSNicholas Kazlauskas 
5012083640fSNicholas Kazlauskas static const struct dcn20_opp_registers opp_regs[] = {
5022083640fSNicholas Kazlauskas 	opp_regs(0),
5032083640fSNicholas Kazlauskas 	opp_regs(1),
5042083640fSNicholas Kazlauskas 	opp_regs(2),
5052083640fSNicholas Kazlauskas 	opp_regs(3)
5062083640fSNicholas Kazlauskas };
5072083640fSNicholas Kazlauskas 
5082083640fSNicholas Kazlauskas static const struct dcn20_opp_shift opp_shift = {
5092083640fSNicholas Kazlauskas 	OPP_MASK_SH_LIST_DCN20(__SHIFT)
5102083640fSNicholas Kazlauskas };
5112083640fSNicholas Kazlauskas 
5122083640fSNicholas Kazlauskas static const struct dcn20_opp_mask opp_mask = {
5132083640fSNicholas Kazlauskas 	OPP_MASK_SH_LIST_DCN20(_MASK)
5142083640fSNicholas Kazlauskas };
5152083640fSNicholas Kazlauskas 
5162083640fSNicholas Kazlauskas #define aux_engine_regs(id)\
5172083640fSNicholas Kazlauskas [id] = {\
5182083640fSNicholas Kazlauskas 	AUX_COMMON_REG_LIST0(id), \
5192083640fSNicholas Kazlauskas 	.AUXN_IMPCAL = 0, \
5202083640fSNicholas Kazlauskas 	.AUXP_IMPCAL = 0, \
5212083640fSNicholas Kazlauskas 	.AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
5222083640fSNicholas Kazlauskas }
5232083640fSNicholas Kazlauskas 
5242083640fSNicholas Kazlauskas static const struct dce110_aux_registers aux_engine_regs[] = {
5252083640fSNicholas Kazlauskas 		aux_engine_regs(0),
5262083640fSNicholas Kazlauskas 		aux_engine_regs(1),
5272083640fSNicholas Kazlauskas 		aux_engine_regs(2),
5282083640fSNicholas Kazlauskas 		aux_engine_regs(3),
5292083640fSNicholas Kazlauskas 		aux_engine_regs(4)
5302083640fSNicholas Kazlauskas };
5312083640fSNicholas Kazlauskas 
5322083640fSNicholas Kazlauskas #define dwbc_regs_dcn3(id)\
5332083640fSNicholas Kazlauskas [id] = {\
5342083640fSNicholas Kazlauskas 	DWBC_COMMON_REG_LIST_DCN30(id),\
5352083640fSNicholas Kazlauskas }
5362083640fSNicholas Kazlauskas 
5372083640fSNicholas Kazlauskas static const struct dcn30_dwbc_registers dwbc30_regs[] = {
5382083640fSNicholas Kazlauskas 	dwbc_regs_dcn3(0),
5392083640fSNicholas Kazlauskas };
5402083640fSNicholas Kazlauskas 
5412083640fSNicholas Kazlauskas static const struct dcn30_dwbc_shift dwbc30_shift = {
5422083640fSNicholas Kazlauskas 	DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
5432083640fSNicholas Kazlauskas };
5442083640fSNicholas Kazlauskas 
5452083640fSNicholas Kazlauskas static const struct dcn30_dwbc_mask dwbc30_mask = {
5462083640fSNicholas Kazlauskas 	DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
5472083640fSNicholas Kazlauskas };
5482083640fSNicholas Kazlauskas 
5492083640fSNicholas Kazlauskas #define mcif_wb_regs_dcn3(id)\
5502083640fSNicholas Kazlauskas [id] = {\
5512083640fSNicholas Kazlauskas 	MCIF_WB_COMMON_REG_LIST_DCN30(id),\
5522083640fSNicholas Kazlauskas }
5532083640fSNicholas Kazlauskas 
5542083640fSNicholas Kazlauskas static const struct dcn30_mmhubbub_registers mcif_wb30_regs[] = {
5552083640fSNicholas Kazlauskas 	mcif_wb_regs_dcn3(0)
5562083640fSNicholas Kazlauskas };
5572083640fSNicholas Kazlauskas 
5582083640fSNicholas Kazlauskas static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
5592083640fSNicholas Kazlauskas 	MCIF_WB_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
5602083640fSNicholas Kazlauskas };
5612083640fSNicholas Kazlauskas 
5622083640fSNicholas Kazlauskas static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
5632083640fSNicholas Kazlauskas 	MCIF_WB_COMMON_MASK_SH_LIST_DCN30(_MASK)
5642083640fSNicholas Kazlauskas };
5652083640fSNicholas Kazlauskas 
5662083640fSNicholas Kazlauskas #define dsc_regsDCN20(id)\
5672083640fSNicholas Kazlauskas [id] = {\
5682083640fSNicholas Kazlauskas 	DSC_REG_LIST_DCN20(id)\
5692083640fSNicholas Kazlauskas }
5702083640fSNicholas Kazlauskas 
5712083640fSNicholas Kazlauskas static const struct dcn20_dsc_registers dsc_regs[] = {
5722083640fSNicholas Kazlauskas 	dsc_regsDCN20(0),
5732083640fSNicholas Kazlauskas 	dsc_regsDCN20(1),
5742083640fSNicholas Kazlauskas 	dsc_regsDCN20(2)
5752083640fSNicholas Kazlauskas };
5762083640fSNicholas Kazlauskas 
5772083640fSNicholas Kazlauskas static const struct dcn20_dsc_shift dsc_shift = {
5782083640fSNicholas Kazlauskas 	DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
5792083640fSNicholas Kazlauskas };
5802083640fSNicholas Kazlauskas 
5812083640fSNicholas Kazlauskas static const struct dcn20_dsc_mask dsc_mask = {
5822083640fSNicholas Kazlauskas 	DSC_REG_LIST_SH_MASK_DCN20(_MASK)
5832083640fSNicholas Kazlauskas };
5842083640fSNicholas Kazlauskas 
5852083640fSNicholas Kazlauskas static const struct dcn30_mpc_registers mpc_regs = {
5862083640fSNicholas Kazlauskas 		MPC_REG_LIST_DCN3_0(0),
5872083640fSNicholas Kazlauskas 		MPC_REG_LIST_DCN3_0(1),
5882083640fSNicholas Kazlauskas 		MPC_REG_LIST_DCN3_0(2),
5892083640fSNicholas Kazlauskas 		MPC_REG_LIST_DCN3_0(3),
5902083640fSNicholas Kazlauskas 		MPC_OUT_MUX_REG_LIST_DCN3_0(0),
5912083640fSNicholas Kazlauskas 		MPC_OUT_MUX_REG_LIST_DCN3_0(1),
5922083640fSNicholas Kazlauskas 		MPC_OUT_MUX_REG_LIST_DCN3_0(2),
5932083640fSNicholas Kazlauskas 		MPC_OUT_MUX_REG_LIST_DCN3_0(3),
5942083640fSNicholas Kazlauskas 		MPC_RMU_GLOBAL_REG_LIST_DCN3AG,
5952083640fSNicholas Kazlauskas 		MPC_RMU_REG_LIST_DCN3AG(0),
5962083640fSNicholas Kazlauskas 		MPC_RMU_REG_LIST_DCN3AG(1),
5972083640fSNicholas Kazlauskas 		//MPC_RMU_REG_LIST_DCN3AG(2),
5982083640fSNicholas Kazlauskas 		MPC_DWB_MUX_REG_LIST_DCN3_0(0),
5992083640fSNicholas Kazlauskas };
6002083640fSNicholas Kazlauskas 
6012083640fSNicholas Kazlauskas static const struct dcn30_mpc_shift mpc_shift = {
6022083640fSNicholas Kazlauskas 	MPC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
6032083640fSNicholas Kazlauskas };
6042083640fSNicholas Kazlauskas 
6052083640fSNicholas Kazlauskas static const struct dcn30_mpc_mask mpc_mask = {
6062083640fSNicholas Kazlauskas 	MPC_COMMON_MASK_SH_LIST_DCN30(_MASK)
6072083640fSNicholas Kazlauskas };
6082083640fSNicholas Kazlauskas 
6092083640fSNicholas Kazlauskas #define optc_regs(id)\
6102083640fSNicholas Kazlauskas [id] = {OPTC_COMMON_REG_LIST_DCN3_1(id)}
6112083640fSNicholas Kazlauskas 
6122083640fSNicholas Kazlauskas static const struct dcn_optc_registers optc_regs[] = {
6132083640fSNicholas Kazlauskas 	optc_regs(0),
6142083640fSNicholas Kazlauskas 	optc_regs(1),
6152083640fSNicholas Kazlauskas 	optc_regs(2),
6162083640fSNicholas Kazlauskas 	optc_regs(3)
6172083640fSNicholas Kazlauskas };
6182083640fSNicholas Kazlauskas 
6192083640fSNicholas Kazlauskas static const struct dcn_optc_shift optc_shift = {
6202083640fSNicholas Kazlauskas 	OPTC_COMMON_MASK_SH_LIST_DCN3_1(__SHIFT)
6212083640fSNicholas Kazlauskas };
6222083640fSNicholas Kazlauskas 
6232083640fSNicholas Kazlauskas static const struct dcn_optc_mask optc_mask = {
6242083640fSNicholas Kazlauskas 	OPTC_COMMON_MASK_SH_LIST_DCN3_1(_MASK)
6252083640fSNicholas Kazlauskas };
6262083640fSNicholas Kazlauskas 
6272083640fSNicholas Kazlauskas #define hubp_regs(id)\
6282083640fSNicholas Kazlauskas [id] = {\
6292083640fSNicholas Kazlauskas 	HUBP_REG_LIST_DCN30(id)\
6302083640fSNicholas Kazlauskas }
6312083640fSNicholas Kazlauskas 
6322083640fSNicholas Kazlauskas static const struct dcn_hubp2_registers hubp_regs[] = {
6332083640fSNicholas Kazlauskas 		hubp_regs(0),
6342083640fSNicholas Kazlauskas 		hubp_regs(1),
6352083640fSNicholas Kazlauskas 		hubp_regs(2),
6362083640fSNicholas Kazlauskas 		hubp_regs(3)
6372083640fSNicholas Kazlauskas };
6382083640fSNicholas Kazlauskas 
6392083640fSNicholas Kazlauskas 
6402083640fSNicholas Kazlauskas static const struct dcn_hubp2_shift hubp_shift = {
6412083640fSNicholas Kazlauskas 		HUBP_MASK_SH_LIST_DCN31(__SHIFT)
6422083640fSNicholas Kazlauskas };
6432083640fSNicholas Kazlauskas 
6442083640fSNicholas Kazlauskas static const struct dcn_hubp2_mask hubp_mask = {
6452083640fSNicholas Kazlauskas 		HUBP_MASK_SH_LIST_DCN31(_MASK)
6462083640fSNicholas Kazlauskas };
6472083640fSNicholas Kazlauskas static const struct dcn_hubbub_registers hubbub_reg = {
6482083640fSNicholas Kazlauskas 		HUBBUB_REG_LIST_DCN31(0)
6492083640fSNicholas Kazlauskas };
6502083640fSNicholas Kazlauskas 
6512083640fSNicholas Kazlauskas static const struct dcn_hubbub_shift hubbub_shift = {
6522083640fSNicholas Kazlauskas 		HUBBUB_MASK_SH_LIST_DCN31(__SHIFT)
6532083640fSNicholas Kazlauskas };
6542083640fSNicholas Kazlauskas 
6552083640fSNicholas Kazlauskas static const struct dcn_hubbub_mask hubbub_mask = {
6562083640fSNicholas Kazlauskas 		HUBBUB_MASK_SH_LIST_DCN31(_MASK)
6572083640fSNicholas Kazlauskas };
6582083640fSNicholas Kazlauskas 
6592083640fSNicholas Kazlauskas static const struct dccg_registers dccg_regs = {
6602083640fSNicholas Kazlauskas 		DCCG_REG_LIST_DCN31()
6612083640fSNicholas Kazlauskas };
6622083640fSNicholas Kazlauskas 
6632083640fSNicholas Kazlauskas static const struct dccg_shift dccg_shift = {
6642083640fSNicholas Kazlauskas 		DCCG_MASK_SH_LIST_DCN31(__SHIFT)
6652083640fSNicholas Kazlauskas };
6662083640fSNicholas Kazlauskas 
6672083640fSNicholas Kazlauskas static const struct dccg_mask dccg_mask = {
6682083640fSNicholas Kazlauskas 		DCCG_MASK_SH_LIST_DCN31(_MASK)
6692083640fSNicholas Kazlauskas };
6702083640fSNicholas Kazlauskas 
6712083640fSNicholas Kazlauskas 
6722083640fSNicholas Kazlauskas #define SRII2(reg_name_pre, reg_name_post, id)\
6732083640fSNicholas Kazlauskas 	.reg_name_pre ## _ ##  reg_name_post[id] = BASE(reg ## reg_name_pre \
6742083640fSNicholas Kazlauskas 			## id ## _ ## reg_name_post ## _BASE_IDX) + \
6752083640fSNicholas Kazlauskas 			reg ## reg_name_pre ## id ## _ ## reg_name_post
6762083640fSNicholas Kazlauskas 
6772083640fSNicholas Kazlauskas 
6782083640fSNicholas Kazlauskas #define HWSEQ_DCN31_REG_LIST()\
6792083640fSNicholas Kazlauskas 	SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
68032f1d0cfSEric Yang 	SR(DCHUBBUB_ARB_HOSTVM_CNTL), \
6812083640fSNicholas Kazlauskas 	SR(DIO_MEM_PWR_CTRL), \
6822083640fSNicholas Kazlauskas 	SR(ODM_MEM_PWR_CTRL3), \
6832083640fSNicholas Kazlauskas 	SR(DMU_MEM_PWR_CNTL), \
6842083640fSNicholas Kazlauskas 	SR(MMHUBBUB_MEM_PWR_CNTL), \
6852083640fSNicholas Kazlauskas 	SR(DCCG_GATE_DISABLE_CNTL), \
6862083640fSNicholas Kazlauskas 	SR(DCCG_GATE_DISABLE_CNTL2), \
6872083640fSNicholas Kazlauskas 	SR(DCFCLK_CNTL),\
6882083640fSNicholas Kazlauskas 	SR(DC_MEM_GLOBAL_PWR_REQ_CNTL), \
6892083640fSNicholas Kazlauskas 	SRII(PIXEL_RATE_CNTL, OTG, 0), \
6902083640fSNicholas Kazlauskas 	SRII(PIXEL_RATE_CNTL, OTG, 1),\
6912083640fSNicholas Kazlauskas 	SRII(PIXEL_RATE_CNTL, OTG, 2),\
6922083640fSNicholas Kazlauskas 	SRII(PIXEL_RATE_CNTL, OTG, 3),\
6932083640fSNicholas Kazlauskas 	SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 0),\
6942083640fSNicholas Kazlauskas 	SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 1),\
6952083640fSNicholas Kazlauskas 	SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 2),\
6962083640fSNicholas Kazlauskas 	SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 3),\
6972083640fSNicholas Kazlauskas 	SR(MICROSECOND_TIME_BASE_DIV), \
6982083640fSNicholas Kazlauskas 	SR(MILLISECOND_TIME_BASE_DIV), \
6992083640fSNicholas Kazlauskas 	SR(DISPCLK_FREQ_CHANGE_CNTL), \
7002083640fSNicholas Kazlauskas 	SR(RBBMIF_TIMEOUT_DIS), \
7012083640fSNicholas Kazlauskas 	SR(RBBMIF_TIMEOUT_DIS_2), \
7022083640fSNicholas Kazlauskas 	SR(DCHUBBUB_CRC_CTRL), \
7032083640fSNicholas Kazlauskas 	SR(DPP_TOP0_DPP_CRC_CTRL), \
7042083640fSNicholas Kazlauskas 	SR(DPP_TOP0_DPP_CRC_VAL_B_A), \
7052083640fSNicholas Kazlauskas 	SR(DPP_TOP0_DPP_CRC_VAL_R_G), \
7062083640fSNicholas Kazlauskas 	SR(MPC_CRC_CTRL), \
7072083640fSNicholas Kazlauskas 	SR(MPC_CRC_RESULT_GB), \
7082083640fSNicholas Kazlauskas 	SR(MPC_CRC_RESULT_C), \
7092083640fSNicholas Kazlauskas 	SR(MPC_CRC_RESULT_AR), \
7102083640fSNicholas Kazlauskas 	SR(DOMAIN0_PG_CONFIG), \
7112083640fSNicholas Kazlauskas 	SR(DOMAIN1_PG_CONFIG), \
7122083640fSNicholas Kazlauskas 	SR(DOMAIN2_PG_CONFIG), \
7132083640fSNicholas Kazlauskas 	SR(DOMAIN3_PG_CONFIG), \
7142083640fSNicholas Kazlauskas 	SR(DOMAIN16_PG_CONFIG), \
7152083640fSNicholas Kazlauskas 	SR(DOMAIN17_PG_CONFIG), \
7162083640fSNicholas Kazlauskas 	SR(DOMAIN18_PG_CONFIG), \
7172083640fSNicholas Kazlauskas 	SR(DOMAIN0_PG_STATUS), \
7182083640fSNicholas Kazlauskas 	SR(DOMAIN1_PG_STATUS), \
7192083640fSNicholas Kazlauskas 	SR(DOMAIN2_PG_STATUS), \
7202083640fSNicholas Kazlauskas 	SR(DOMAIN3_PG_STATUS), \
7212083640fSNicholas Kazlauskas 	SR(DOMAIN16_PG_STATUS), \
7222083640fSNicholas Kazlauskas 	SR(DOMAIN17_PG_STATUS), \
7232083640fSNicholas Kazlauskas 	SR(DOMAIN18_PG_STATUS), \
7242083640fSNicholas Kazlauskas 	SR(D1VGA_CONTROL), \
7252083640fSNicholas Kazlauskas 	SR(D2VGA_CONTROL), \
7262083640fSNicholas Kazlauskas 	SR(D3VGA_CONTROL), \
7272083640fSNicholas Kazlauskas 	SR(D4VGA_CONTROL), \
7282083640fSNicholas Kazlauskas 	SR(D5VGA_CONTROL), \
7292083640fSNicholas Kazlauskas 	SR(D6VGA_CONTROL), \
7302083640fSNicholas Kazlauskas 	SR(DC_IP_REQUEST_CNTL), \
7312083640fSNicholas Kazlauskas 	SR(AZALIA_AUDIO_DTO), \
7320a068b68SJake Wang 	SR(AZALIA_CONTROLLER_CLOCK_GATING), \
7330a068b68SJake Wang 	SR(HPO_TOP_HW_CONTROL)
7342083640fSNicholas Kazlauskas 
7352083640fSNicholas Kazlauskas static const struct dce_hwseq_registers hwseq_reg = {
7362083640fSNicholas Kazlauskas 		HWSEQ_DCN31_REG_LIST()
7372083640fSNicholas Kazlauskas };
7382083640fSNicholas Kazlauskas 
7392083640fSNicholas Kazlauskas #define HWSEQ_DCN31_MASK_SH_LIST(mask_sh)\
7402083640fSNicholas Kazlauskas 	HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
7412083640fSNicholas Kazlauskas 	HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
74232f1d0cfSEric Yang 	HWS_SF(, DCHUBBUB_ARB_HOSTVM_CNTL, DISABLE_HOSTVM_FORCE_ALLOW_PSTATE, mask_sh), \
7432083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
7442083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
7452083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
7462083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
7472083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
7482083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
7492083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
7502083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
7512083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
7522083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
7532083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
7542083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
7552083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
7562083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
7572083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
7582083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
7592083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
7602083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
7612083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
7622083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
7632083640fSNicholas Kazlauskas 	HWS_SF(, DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
7642083640fSNicholas Kazlauskas 	HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
7652083640fSNicholas Kazlauskas 	HWS_SF(, AZALIA_AUDIO_DTO, AZALIA_AUDIO_DTO_MODULE, mask_sh), \
7662083640fSNicholas Kazlauskas 	HWS_SF(, HPO_TOP_CLOCK_CONTROL, HPO_HDMISTREAMCLK_G_GATE_DIS, mask_sh), \
7672083640fSNicholas Kazlauskas 	HWS_SF(, DMU_MEM_PWR_CNTL, DMCU_ERAM_MEM_PWR_FORCE, mask_sh), \
7682083640fSNicholas Kazlauskas 	HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_UNASSIGNED_PWR_MODE, mask_sh), \
7692083640fSNicholas Kazlauskas 	HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_VBLANK_PWR_MODE, mask_sh), \
7705ffb5267SMichael Strauss 	HWS_SF(, MMHUBBUB_MEM_PWR_CNTL, VGA_MEM_PWR_FORCE, mask_sh), \
7710a068b68SJake Wang 	HWS_SF(, DIO_MEM_PWR_CTRL, I2C_LIGHT_SLEEP_FORCE, mask_sh), \
7720a068b68SJake Wang 	HWS_SF(, HPO_TOP_HW_CONTROL, HPO_IO_EN, mask_sh)
7732083640fSNicholas Kazlauskas 
7742083640fSNicholas Kazlauskas static const struct dce_hwseq_shift hwseq_shift = {
7752083640fSNicholas Kazlauskas 		HWSEQ_DCN31_MASK_SH_LIST(__SHIFT)
7762083640fSNicholas Kazlauskas };
7772083640fSNicholas Kazlauskas 
7782083640fSNicholas Kazlauskas static const struct dce_hwseq_mask hwseq_mask = {
7792083640fSNicholas Kazlauskas 		HWSEQ_DCN31_MASK_SH_LIST(_MASK)
7802083640fSNicholas Kazlauskas };
7812083640fSNicholas Kazlauskas #define vmid_regs(id)\
7822083640fSNicholas Kazlauskas [id] = {\
7832083640fSNicholas Kazlauskas 		DCN20_VMID_REG_LIST(id)\
7842083640fSNicholas Kazlauskas }
7852083640fSNicholas Kazlauskas 
7862083640fSNicholas Kazlauskas static const struct dcn_vmid_registers vmid_regs[] = {
7872083640fSNicholas Kazlauskas 	vmid_regs(0),
7882083640fSNicholas Kazlauskas 	vmid_regs(1),
7892083640fSNicholas Kazlauskas 	vmid_regs(2),
7902083640fSNicholas Kazlauskas 	vmid_regs(3),
7912083640fSNicholas Kazlauskas 	vmid_regs(4),
7922083640fSNicholas Kazlauskas 	vmid_regs(5),
7932083640fSNicholas Kazlauskas 	vmid_regs(6),
7942083640fSNicholas Kazlauskas 	vmid_regs(7),
7952083640fSNicholas Kazlauskas 	vmid_regs(8),
7962083640fSNicholas Kazlauskas 	vmid_regs(9),
7972083640fSNicholas Kazlauskas 	vmid_regs(10),
7982083640fSNicholas Kazlauskas 	vmid_regs(11),
7992083640fSNicholas Kazlauskas 	vmid_regs(12),
8002083640fSNicholas Kazlauskas 	vmid_regs(13),
8012083640fSNicholas Kazlauskas 	vmid_regs(14),
8022083640fSNicholas Kazlauskas 	vmid_regs(15)
8032083640fSNicholas Kazlauskas };
8042083640fSNicholas Kazlauskas 
8052083640fSNicholas Kazlauskas static const struct dcn20_vmid_shift vmid_shifts = {
8062083640fSNicholas Kazlauskas 		DCN20_VMID_MASK_SH_LIST(__SHIFT)
8072083640fSNicholas Kazlauskas };
8082083640fSNicholas Kazlauskas 
8092083640fSNicholas Kazlauskas static const struct dcn20_vmid_mask vmid_masks = {
8102083640fSNicholas Kazlauskas 		DCN20_VMID_MASK_SH_LIST(_MASK)
8112083640fSNicholas Kazlauskas };
8122083640fSNicholas Kazlauskas 
8132083640fSNicholas Kazlauskas static const struct resource_caps res_cap_dcn31 = {
8142083640fSNicholas Kazlauskas 	.num_timing_generator = 4,
8152083640fSNicholas Kazlauskas 	.num_opp = 4,
8162083640fSNicholas Kazlauskas 	.num_video_plane = 4,
8172083640fSNicholas Kazlauskas 	.num_audio = 5,
8182083640fSNicholas Kazlauskas 	.num_stream_encoder = 5,
8192083640fSNicholas Kazlauskas 	.num_dig_link_enc = 5,
82083228ebbSFangzhi Zuo 	.num_hpo_dp_stream_encoder = 4,
8213bc8d921SFangzhi Zuo 	.num_hpo_dp_link_encoder = 2,
8222083640fSNicholas Kazlauskas 	.num_pll = 5,
8232083640fSNicholas Kazlauskas 	.num_dwb = 1,
8242083640fSNicholas Kazlauskas 	.num_ddc = 5,
8252083640fSNicholas Kazlauskas 	.num_vmid = 16,
8262083640fSNicholas Kazlauskas 	.num_mpc_3dlut = 2,
8272083640fSNicholas Kazlauskas 	.num_dsc = 3,
8282083640fSNicholas Kazlauskas };
8292083640fSNicholas Kazlauskas 
8302083640fSNicholas Kazlauskas static const struct dc_plane_cap plane_cap = {
8312083640fSNicholas Kazlauskas 	.type = DC_PLANE_TYPE_DCN_UNIVERSAL,
8322083640fSNicholas Kazlauskas 	.per_pixel_alpha = true,
8332083640fSNicholas Kazlauskas 
8342083640fSNicholas Kazlauskas 	.pixel_format_support = {
8352083640fSNicholas Kazlauskas 			.argb8888 = true,
8362083640fSNicholas Kazlauskas 			.nv12 = true,
8372083640fSNicholas Kazlauskas 			.fp16 = true,
838ebe5ffd8SStylon Wang 			.p010 = true,
8392083640fSNicholas Kazlauskas 			.ayuv = false,
8402083640fSNicholas Kazlauskas 	},
8412083640fSNicholas Kazlauskas 
8422083640fSNicholas Kazlauskas 	.max_upscale_factor = {
8432083640fSNicholas Kazlauskas 			.argb8888 = 16000,
8442083640fSNicholas Kazlauskas 			.nv12 = 16000,
8452083640fSNicholas Kazlauskas 			.fp16 = 16000
8462083640fSNicholas Kazlauskas 	},
8472083640fSNicholas Kazlauskas 
8482083640fSNicholas Kazlauskas 	// 6:1 downscaling ratio: 1000/6 = 166.666
8492083640fSNicholas Kazlauskas 	.max_downscale_factor = {
8502083640fSNicholas Kazlauskas 			.argb8888 = 167,
8512083640fSNicholas Kazlauskas 			.nv12 = 167,
8522083640fSNicholas Kazlauskas 			.fp16 = 167
8532083640fSNicholas Kazlauskas 	},
8542083640fSNicholas Kazlauskas 	64,
8552083640fSNicholas Kazlauskas 	64
8562083640fSNicholas Kazlauskas };
8572083640fSNicholas Kazlauskas 
8582083640fSNicholas Kazlauskas static const struct dc_debug_options debug_defaults_drv = {
8592083640fSNicholas Kazlauskas 	.disable_dmcu = true,
8602083640fSNicholas Kazlauskas 	.force_abm_enable = false,
8612083640fSNicholas Kazlauskas 	.clock_trace = true,
8622083640fSNicholas Kazlauskas 	.disable_pplib_clock_request = false,
863458c79a8SAngus Wang 	.pipe_split_policy = MPC_SPLIT_DYNAMIC,
8642083640fSNicholas Kazlauskas 	.force_single_disp_pipe_split = false,
8652083640fSNicholas Kazlauskas 	.disable_dcc = DCC_ENABLE,
8662083640fSNicholas Kazlauskas 	.vsr_support = true,
8672083640fSNicholas Kazlauskas 	.performance_trace = false,
8688048af26SNikola Cornij 	.max_downscale_src_width = 4096,/*upto true 4K*/
8692083640fSNicholas Kazlauskas 	.disable_pplib_wm_range = false,
8702083640fSNicholas Kazlauskas 	.scl_reset_length10 = true,
8710d5fd22bSEmily Nie 	.sanity_checks = false,
8722083640fSNicholas Kazlauskas 	.underflow_assert_delay_us = 0xFFFFFFFF,
8732083640fSNicholas Kazlauskas 	.dwb_fi_phase = -1, // -1 = disable,
8742083640fSNicholas Kazlauskas 	.dmub_command_table = true,
8752083640fSNicholas Kazlauskas 	.pstate_enabled = true,
8762083640fSNicholas Kazlauskas 	.use_max_lb = true,
8772083640fSNicholas Kazlauskas 	.enable_mem_low_power = {
8782083640fSNicholas Kazlauskas 		.bits = {
8793da35006SMichael Strauss 			.vga = true,
8803da35006SMichael Strauss 			.i2c = true,
8812083640fSNicholas Kazlauskas 			.dmcu = false, // This is previously known to cause hang on S3 cycles if enabled
8823da35006SMichael Strauss 			.dscl = true,
883028a998cSMichael Strauss 			.cm = true,
8843da35006SMichael Strauss 			.mpc = true,
8853da35006SMichael Strauss 			.optc = true,
8863da35006SMichael Strauss 			.vpg = true,
8873da35006SMichael Strauss 			.afmt = true,
8882083640fSNicholas Kazlauskas 		}
8892083640fSNicholas Kazlauskas 	},
8905d5af340SSaaem Rizvi 	.disable_z10 = true,
8910baae624SAlvin Lee 	.enable_legacy_fast_update = true,
892d9f23030SEric Yang 	.enable_z9_disable_interface = true, /* Allow support for the PMFW interface for disable Z9*/
893ba93dddfSAurabindo Pillai 	.dml_hostvm_override = DML_HOSTVM_OVERRIDE_FALSE,
89479de4d9aSRodrigo Siqueira 	.using_dml2 = false,
8952083640fSNicholas Kazlauskas };
8962083640fSNicholas Kazlauskas 
8971178ac68SIan Chen static const struct dc_panel_config panel_config_defaults = {
898bd829d57SIan Chen 	.psr = {
899bd829d57SIan Chen 		.disable_psr = false,
900bd829d57SIan Chen 		.disallow_psrsu = false,
901e0138644SBhawanpreet Lakha 		.disallow_replay = false,
902bd829d57SIan Chen 	},
9031178ac68SIan Chen 	.ilr = {
9041178ac68SIan Chen 		.optimize_edp_link_rate = true,
9051178ac68SIan Chen 	},
9061178ac68SIan Chen };
9071178ac68SIan Chen 
dcn31_dpp_destroy(struct dpp ** dpp)9082083640fSNicholas Kazlauskas static void dcn31_dpp_destroy(struct dpp **dpp)
9092083640fSNicholas Kazlauskas {
9102083640fSNicholas Kazlauskas 	kfree(TO_DCN20_DPP(*dpp));
9112083640fSNicholas Kazlauskas 	*dpp = NULL;
9122083640fSNicholas Kazlauskas }
9132083640fSNicholas Kazlauskas 
dcn31_dpp_create(struct dc_context * ctx,uint32_t inst)9142083640fSNicholas Kazlauskas static struct dpp *dcn31_dpp_create(
9152083640fSNicholas Kazlauskas 	struct dc_context *ctx,
9162083640fSNicholas Kazlauskas 	uint32_t inst)
9172083640fSNicholas Kazlauskas {
9182083640fSNicholas Kazlauskas 	struct dcn3_dpp *dpp =
9192083640fSNicholas Kazlauskas 		kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
9202083640fSNicholas Kazlauskas 
9212083640fSNicholas Kazlauskas 	if (!dpp)
9222083640fSNicholas Kazlauskas 		return NULL;
9232083640fSNicholas Kazlauskas 
9242083640fSNicholas Kazlauskas 	if (dpp3_construct(dpp, ctx, inst,
9252083640fSNicholas Kazlauskas 			&dpp_regs[inst], &tf_shift, &tf_mask))
9262083640fSNicholas Kazlauskas 		return &dpp->base;
9272083640fSNicholas Kazlauskas 
9282083640fSNicholas Kazlauskas 	BREAK_TO_DEBUGGER();
9292083640fSNicholas Kazlauskas 	kfree(dpp);
9302083640fSNicholas Kazlauskas 	return NULL;
9312083640fSNicholas Kazlauskas }
9322083640fSNicholas Kazlauskas 
dcn31_opp_create(struct dc_context * ctx,uint32_t inst)9332083640fSNicholas Kazlauskas static struct output_pixel_processor *dcn31_opp_create(
9342083640fSNicholas Kazlauskas 	struct dc_context *ctx, uint32_t inst)
9352083640fSNicholas Kazlauskas {
9362083640fSNicholas Kazlauskas 	struct dcn20_opp *opp =
9372083640fSNicholas Kazlauskas 		kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
9382083640fSNicholas Kazlauskas 
9392083640fSNicholas Kazlauskas 	if (!opp) {
9402083640fSNicholas Kazlauskas 		BREAK_TO_DEBUGGER();
9412083640fSNicholas Kazlauskas 		return NULL;
9422083640fSNicholas Kazlauskas 	}
9432083640fSNicholas Kazlauskas 
9442083640fSNicholas Kazlauskas 	dcn20_opp_construct(opp, ctx, inst,
9452083640fSNicholas Kazlauskas 			&opp_regs[inst], &opp_shift, &opp_mask);
9462083640fSNicholas Kazlauskas 	return &opp->base;
9472083640fSNicholas Kazlauskas }
9482083640fSNicholas Kazlauskas 
dcn31_aux_engine_create(struct dc_context * ctx,uint32_t inst)9492083640fSNicholas Kazlauskas static struct dce_aux *dcn31_aux_engine_create(
9502083640fSNicholas Kazlauskas 	struct dc_context *ctx,
9512083640fSNicholas Kazlauskas 	uint32_t inst)
9522083640fSNicholas Kazlauskas {
9532083640fSNicholas Kazlauskas 	struct aux_engine_dce110 *aux_engine =
9542083640fSNicholas Kazlauskas 		kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
9552083640fSNicholas Kazlauskas 
9562083640fSNicholas Kazlauskas 	if (!aux_engine)
9572083640fSNicholas Kazlauskas 		return NULL;
9582083640fSNicholas Kazlauskas 
9592083640fSNicholas Kazlauskas 	dce110_aux_engine_construct(aux_engine, ctx, inst,
9602083640fSNicholas Kazlauskas 				    SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
9612083640fSNicholas Kazlauskas 				    &aux_engine_regs[inst],
9622083640fSNicholas Kazlauskas 					&aux_mask,
9632083640fSNicholas Kazlauskas 					&aux_shift,
9642083640fSNicholas Kazlauskas 					ctx->dc->caps.extended_aux_timeout_support);
9652083640fSNicholas Kazlauskas 
9662083640fSNicholas Kazlauskas 	return &aux_engine->base;
9672083640fSNicholas Kazlauskas }
9682083640fSNicholas Kazlauskas #define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST_DCN30(id) }
9692083640fSNicholas Kazlauskas 
9702083640fSNicholas Kazlauskas static const struct dce_i2c_registers i2c_hw_regs[] = {
9712083640fSNicholas Kazlauskas 		i2c_inst_regs(1),
9722083640fSNicholas Kazlauskas 		i2c_inst_regs(2),
9732083640fSNicholas Kazlauskas 		i2c_inst_regs(3),
9742083640fSNicholas Kazlauskas 		i2c_inst_regs(4),
9752083640fSNicholas Kazlauskas 		i2c_inst_regs(5),
9762083640fSNicholas Kazlauskas };
9772083640fSNicholas Kazlauskas 
9782083640fSNicholas Kazlauskas static const struct dce_i2c_shift i2c_shifts = {
9792083640fSNicholas Kazlauskas 		I2C_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
9802083640fSNicholas Kazlauskas };
9812083640fSNicholas Kazlauskas 
9822083640fSNicholas Kazlauskas static const struct dce_i2c_mask i2c_masks = {
9832083640fSNicholas Kazlauskas 		I2C_COMMON_MASK_SH_LIST_DCN30(_MASK)
9842083640fSNicholas Kazlauskas };
9852083640fSNicholas Kazlauskas 
dcn31_i2c_hw_create(struct dc_context * ctx,uint32_t inst)9862083640fSNicholas Kazlauskas static struct dce_i2c_hw *dcn31_i2c_hw_create(
9872083640fSNicholas Kazlauskas 	struct dc_context *ctx,
9882083640fSNicholas Kazlauskas 	uint32_t inst)
9892083640fSNicholas Kazlauskas {
9902083640fSNicholas Kazlauskas 	struct dce_i2c_hw *dce_i2c_hw =
9912083640fSNicholas Kazlauskas 		kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
9922083640fSNicholas Kazlauskas 
9932083640fSNicholas Kazlauskas 	if (!dce_i2c_hw)
9942083640fSNicholas Kazlauskas 		return NULL;
9952083640fSNicholas Kazlauskas 
9962083640fSNicholas Kazlauskas 	dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
9972083640fSNicholas Kazlauskas 				    &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
9982083640fSNicholas Kazlauskas 
9992083640fSNicholas Kazlauskas 	return dce_i2c_hw;
10002083640fSNicholas Kazlauskas }
dcn31_mpc_create(struct dc_context * ctx,int num_mpcc,int num_rmu)10012083640fSNicholas Kazlauskas static struct mpc *dcn31_mpc_create(
10022083640fSNicholas Kazlauskas 		struct dc_context *ctx,
10032083640fSNicholas Kazlauskas 		int num_mpcc,
10042083640fSNicholas Kazlauskas 		int num_rmu)
10052083640fSNicholas Kazlauskas {
10062083640fSNicholas Kazlauskas 	struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
10072083640fSNicholas Kazlauskas 					  GFP_KERNEL);
10082083640fSNicholas Kazlauskas 
10092083640fSNicholas Kazlauskas 	if (!mpc30)
10102083640fSNicholas Kazlauskas 		return NULL;
10112083640fSNicholas Kazlauskas 
10122083640fSNicholas Kazlauskas 	dcn30_mpc_construct(mpc30, ctx,
10132083640fSNicholas Kazlauskas 			&mpc_regs,
10142083640fSNicholas Kazlauskas 			&mpc_shift,
10152083640fSNicholas Kazlauskas 			&mpc_mask,
10162083640fSNicholas Kazlauskas 			num_mpcc,
10172083640fSNicholas Kazlauskas 			num_rmu);
10182083640fSNicholas Kazlauskas 
10192083640fSNicholas Kazlauskas 	return &mpc30->base;
10202083640fSNicholas Kazlauskas }
10212083640fSNicholas Kazlauskas 
dcn31_hubbub_create(struct dc_context * ctx)10222083640fSNicholas Kazlauskas static struct hubbub *dcn31_hubbub_create(struct dc_context *ctx)
10232083640fSNicholas Kazlauskas {
10242083640fSNicholas Kazlauskas 	int i;
10252083640fSNicholas Kazlauskas 
10262083640fSNicholas Kazlauskas 	struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub),
10272083640fSNicholas Kazlauskas 					  GFP_KERNEL);
10282083640fSNicholas Kazlauskas 
10292083640fSNicholas Kazlauskas 	if (!hubbub3)
10302083640fSNicholas Kazlauskas 		return NULL;
10312083640fSNicholas Kazlauskas 
10322083640fSNicholas Kazlauskas 	hubbub31_construct(hubbub3, ctx,
10332083640fSNicholas Kazlauskas 			&hubbub_reg,
10342083640fSNicholas Kazlauskas 			&hubbub_shift,
10352083640fSNicholas Kazlauskas 			&hubbub_mask,
10362083640fSNicholas Kazlauskas 			dcn3_1_ip.det_buffer_size_kbytes,
10372083640fSNicholas Kazlauskas 			dcn3_1_ip.pixel_chunk_size_kbytes,
10382083640fSNicholas Kazlauskas 			dcn3_1_ip.config_return_buffer_size_in_kbytes);
10392083640fSNicholas Kazlauskas 
10402083640fSNicholas Kazlauskas 
10412083640fSNicholas Kazlauskas 	for (i = 0; i < res_cap_dcn31.num_vmid; i++) {
10422083640fSNicholas Kazlauskas 		struct dcn20_vmid *vmid = &hubbub3->vmid[i];
10432083640fSNicholas Kazlauskas 
10442083640fSNicholas Kazlauskas 		vmid->ctx = ctx;
10452083640fSNicholas Kazlauskas 
10462083640fSNicholas Kazlauskas 		vmid->regs = &vmid_regs[i];
10472083640fSNicholas Kazlauskas 		vmid->shifts = &vmid_shifts;
10482083640fSNicholas Kazlauskas 		vmid->masks = &vmid_masks;
10492083640fSNicholas Kazlauskas 	}
10502083640fSNicholas Kazlauskas 
10512083640fSNicholas Kazlauskas 	return &hubbub3->base;
10522083640fSNicholas Kazlauskas }
10532083640fSNicholas Kazlauskas 
dcn31_timing_generator_create(struct dc_context * ctx,uint32_t instance)10542083640fSNicholas Kazlauskas static struct timing_generator *dcn31_timing_generator_create(
10552083640fSNicholas Kazlauskas 		struct dc_context *ctx,
10562083640fSNicholas Kazlauskas 		uint32_t instance)
10572083640fSNicholas Kazlauskas {
10582083640fSNicholas Kazlauskas 	struct optc *tgn10 =
10592083640fSNicholas Kazlauskas 		kzalloc(sizeof(struct optc), GFP_KERNEL);
10602083640fSNicholas Kazlauskas 
10612083640fSNicholas Kazlauskas 	if (!tgn10)
10622083640fSNicholas Kazlauskas 		return NULL;
10632083640fSNicholas Kazlauskas 
10642083640fSNicholas Kazlauskas 	tgn10->base.inst = instance;
10652083640fSNicholas Kazlauskas 	tgn10->base.ctx = ctx;
10662083640fSNicholas Kazlauskas 
10672083640fSNicholas Kazlauskas 	tgn10->tg_regs = &optc_regs[instance];
10682083640fSNicholas Kazlauskas 	tgn10->tg_shift = &optc_shift;
10692083640fSNicholas Kazlauskas 	tgn10->tg_mask = &optc_mask;
10702083640fSNicholas Kazlauskas 
10712083640fSNicholas Kazlauskas 	dcn31_timing_generator_init(tgn10);
10722083640fSNicholas Kazlauskas 
10732083640fSNicholas Kazlauskas 	return &tgn10->base;
10742083640fSNicholas Kazlauskas }
10752083640fSNicholas Kazlauskas 
10762083640fSNicholas Kazlauskas static const struct encoder_feature_support link_enc_feature = {
10772083640fSNicholas Kazlauskas 		.max_hdmi_deep_color = COLOR_DEPTH_121212,
10782083640fSNicholas Kazlauskas 		.max_hdmi_pixel_clock = 600000,
10792083640fSNicholas Kazlauskas 		.hdmi_ycbcr420_supported = true,
10802083640fSNicholas Kazlauskas 		.dp_ycbcr420_supported = true,
10812083640fSNicholas Kazlauskas 		.fec_supported = true,
10822083640fSNicholas Kazlauskas 		.flags.bits.IS_HBR2_CAPABLE = true,
10832083640fSNicholas Kazlauskas 		.flags.bits.IS_HBR3_CAPABLE = true,
10842083640fSNicholas Kazlauskas 		.flags.bits.IS_TPS3_CAPABLE = true,
10852083640fSNicholas Kazlauskas 		.flags.bits.IS_TPS4_CAPABLE = true
10862083640fSNicholas Kazlauskas };
10872083640fSNicholas Kazlauskas 
dcn31_link_encoder_create(struct dc_context * ctx,const struct encoder_init_data * enc_init_data)10882083640fSNicholas Kazlauskas static struct link_encoder *dcn31_link_encoder_create(
1089e216431bSAurabindo Pillai 	struct dc_context *ctx,
10902083640fSNicholas Kazlauskas 	const struct encoder_init_data *enc_init_data)
10912083640fSNicholas Kazlauskas {
10922083640fSNicholas Kazlauskas 	struct dcn20_link_encoder *enc20 =
10932083640fSNicholas Kazlauskas 		kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
10942083640fSNicholas Kazlauskas 
10951791bd09SSrinivasan Shanmugam 	if (!enc20 || enc_init_data->hpd_source >= ARRAY_SIZE(link_enc_hpd_regs))
10962083640fSNicholas Kazlauskas 		return NULL;
10972083640fSNicholas Kazlauskas 
10982083640fSNicholas Kazlauskas 	dcn31_link_encoder_construct(enc20,
10992083640fSNicholas Kazlauskas 			enc_init_data,
11002083640fSNicholas Kazlauskas 			&link_enc_feature,
11012083640fSNicholas Kazlauskas 			&link_enc_regs[enc_init_data->transmitter],
11022083640fSNicholas Kazlauskas 			&link_enc_aux_regs[enc_init_data->channel - 1],
11032083640fSNicholas Kazlauskas 			&link_enc_hpd_regs[enc_init_data->hpd_source],
11042083640fSNicholas Kazlauskas 			&le_shift,
11052083640fSNicholas Kazlauskas 			&le_mask);
11062083640fSNicholas Kazlauskas 
11072083640fSNicholas Kazlauskas 	return &enc20->enc10.base;
11082083640fSNicholas Kazlauskas }
11092083640fSNicholas Kazlauskas 
11102083640fSNicholas Kazlauskas /* Create a minimal link encoder object not associated with a particular
11112083640fSNicholas Kazlauskas  * physical connector.
11122083640fSNicholas Kazlauskas  * resource_funcs.link_enc_create_minimal
11132083640fSNicholas Kazlauskas  */
dcn31_link_enc_create_minimal(struct dc_context * ctx,enum engine_id eng_id)11142083640fSNicholas Kazlauskas static struct link_encoder *dcn31_link_enc_create_minimal(
11152083640fSNicholas Kazlauskas 		struct dc_context *ctx, enum engine_id eng_id)
11162083640fSNicholas Kazlauskas {
11172083640fSNicholas Kazlauskas 	struct dcn20_link_encoder *enc20;
11182083640fSNicholas Kazlauskas 
11192083640fSNicholas Kazlauskas 	if ((eng_id - ENGINE_ID_DIGA) > ctx->dc->res_pool->res_cap->num_dig_link_enc)
11202083640fSNicholas Kazlauskas 		return NULL;
11212083640fSNicholas Kazlauskas 
11222083640fSNicholas Kazlauskas 	enc20 = kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
11232083640fSNicholas Kazlauskas 	if (!enc20)
11242083640fSNicholas Kazlauskas 		return NULL;
11252083640fSNicholas Kazlauskas 
11262083640fSNicholas Kazlauskas 	dcn31_link_encoder_construct_minimal(
11272083640fSNicholas Kazlauskas 			enc20,
11282083640fSNicholas Kazlauskas 			ctx,
11292083640fSNicholas Kazlauskas 			&link_enc_feature,
11302083640fSNicholas Kazlauskas 			&link_enc_regs[eng_id - ENGINE_ID_DIGA],
11312083640fSNicholas Kazlauskas 			eng_id);
11322083640fSNicholas Kazlauskas 
11332083640fSNicholas Kazlauskas 	return &enc20->enc10.base;
11342083640fSNicholas Kazlauskas }
11352083640fSNicholas Kazlauskas 
dcn31_panel_cntl_create(const struct panel_cntl_init_data * init_data)1136240e6d25SIsabella Basso static struct panel_cntl *dcn31_panel_cntl_create(const struct panel_cntl_init_data *init_data)
11372083640fSNicholas Kazlauskas {
11382083640fSNicholas Kazlauskas 	struct dcn31_panel_cntl *panel_cntl =
11392083640fSNicholas Kazlauskas 		kzalloc(sizeof(struct dcn31_panel_cntl), GFP_KERNEL);
11402083640fSNicholas Kazlauskas 
11412083640fSNicholas Kazlauskas 	if (!panel_cntl)
11422083640fSNicholas Kazlauskas 		return NULL;
11432083640fSNicholas Kazlauskas 
11442083640fSNicholas Kazlauskas 	dcn31_panel_cntl_construct(panel_cntl, init_data);
11452083640fSNicholas Kazlauskas 
11462083640fSNicholas Kazlauskas 	return &panel_cntl->base;
11472083640fSNicholas Kazlauskas }
11482083640fSNicholas Kazlauskas 
read_dce_straps(struct dc_context * ctx,struct resource_straps * straps)11492083640fSNicholas Kazlauskas static void read_dce_straps(
11502083640fSNicholas Kazlauskas 	struct dc_context *ctx,
11512083640fSNicholas Kazlauskas 	struct resource_straps *straps)
11522083640fSNicholas Kazlauskas {
11532083640fSNicholas Kazlauskas 	generic_reg_get(ctx, regDC_PINSTRAPS + BASE(regDC_PINSTRAPS_BASE_IDX),
11542083640fSNicholas Kazlauskas 		FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
11552083640fSNicholas Kazlauskas 
11562083640fSNicholas Kazlauskas }
11572083640fSNicholas Kazlauskas 
dcn31_create_audio(struct dc_context * ctx,unsigned int inst)11582083640fSNicholas Kazlauskas static struct audio *dcn31_create_audio(
11592083640fSNicholas Kazlauskas 		struct dc_context *ctx, unsigned int inst)
11602083640fSNicholas Kazlauskas {
11612083640fSNicholas Kazlauskas 	return dce_audio_create(ctx, inst,
11622083640fSNicholas Kazlauskas 			&audio_regs[inst], &audio_shift, &audio_mask);
11632083640fSNicholas Kazlauskas }
11642083640fSNicholas Kazlauskas 
dcn31_vpg_create(struct dc_context * ctx,uint32_t inst)11652083640fSNicholas Kazlauskas static struct vpg *dcn31_vpg_create(
11662083640fSNicholas Kazlauskas 	struct dc_context *ctx,
11672083640fSNicholas Kazlauskas 	uint32_t inst)
11682083640fSNicholas Kazlauskas {
116918b4f1a0SMichael Strauss 	struct dcn31_vpg *vpg31 = kzalloc(sizeof(struct dcn31_vpg), GFP_KERNEL);
11702083640fSNicholas Kazlauskas 
117118b4f1a0SMichael Strauss 	if (!vpg31)
11722083640fSNicholas Kazlauskas 		return NULL;
11732083640fSNicholas Kazlauskas 
117418b4f1a0SMichael Strauss 	vpg31_construct(vpg31, ctx, inst,
11752083640fSNicholas Kazlauskas 			&vpg_regs[inst],
11762083640fSNicholas Kazlauskas 			&vpg_shift,
11772083640fSNicholas Kazlauskas 			&vpg_mask);
11782083640fSNicholas Kazlauskas 
117918b4f1a0SMichael Strauss 	return &vpg31->base;
11802083640fSNicholas Kazlauskas }
11812083640fSNicholas Kazlauskas 
dcn31_afmt_create(struct dc_context * ctx,uint32_t inst)11822083640fSNicholas Kazlauskas static struct afmt *dcn31_afmt_create(
11832083640fSNicholas Kazlauskas 	struct dc_context *ctx,
11842083640fSNicholas Kazlauskas 	uint32_t inst)
11852083640fSNicholas Kazlauskas {
118618b4f1a0SMichael Strauss 	struct dcn31_afmt *afmt31 = kzalloc(sizeof(struct dcn31_afmt), GFP_KERNEL);
11872083640fSNicholas Kazlauskas 
118818b4f1a0SMichael Strauss 	if (!afmt31)
11892083640fSNicholas Kazlauskas 		return NULL;
11902083640fSNicholas Kazlauskas 
119118b4f1a0SMichael Strauss 	afmt31_construct(afmt31, ctx, inst,
11922083640fSNicholas Kazlauskas 			&afmt_regs[inst],
11932083640fSNicholas Kazlauskas 			&afmt_shift,
11942083640fSNicholas Kazlauskas 			&afmt_mask);
11952083640fSNicholas Kazlauskas 
119618b4f1a0SMichael Strauss 	// Light sleep by default, no need to power down here
119718b4f1a0SMichael Strauss 
119818b4f1a0SMichael Strauss 	return &afmt31->base;
11992083640fSNicholas Kazlauskas }
12002083640fSNicholas Kazlauskas 
dcn31_apg_create(struct dc_context * ctx,uint32_t inst)120161452908SFangzhi Zuo static struct apg *dcn31_apg_create(
120261452908SFangzhi Zuo 	struct dc_context *ctx,
120361452908SFangzhi Zuo 	uint32_t inst)
120461452908SFangzhi Zuo {
120561452908SFangzhi Zuo 	struct dcn31_apg *apg31 = kzalloc(sizeof(struct dcn31_apg), GFP_KERNEL);
120661452908SFangzhi Zuo 
120761452908SFangzhi Zuo 	if (!apg31)
120861452908SFangzhi Zuo 		return NULL;
120961452908SFangzhi Zuo 
121061452908SFangzhi Zuo 	apg31_construct(apg31, ctx, inst,
121161452908SFangzhi Zuo 			&apg_regs[inst],
121261452908SFangzhi Zuo 			&apg_shift,
121361452908SFangzhi Zuo 			&apg_mask);
121461452908SFangzhi Zuo 
121561452908SFangzhi Zuo 	return &apg31->base;
121661452908SFangzhi Zuo }
121761452908SFangzhi Zuo 
dcn31_stream_encoder_create(enum engine_id eng_id,struct dc_context * ctx)12182083640fSNicholas Kazlauskas static struct stream_encoder *dcn31_stream_encoder_create(
12192083640fSNicholas Kazlauskas 	enum engine_id eng_id,
12202083640fSNicholas Kazlauskas 	struct dc_context *ctx)
12212083640fSNicholas Kazlauskas {
12222083640fSNicholas Kazlauskas 	struct dcn10_stream_encoder *enc1;
12232083640fSNicholas Kazlauskas 	struct vpg *vpg;
12242083640fSNicholas Kazlauskas 	struct afmt *afmt;
12252083640fSNicholas Kazlauskas 	int vpg_inst;
12262083640fSNicholas Kazlauskas 	int afmt_inst;
12272083640fSNicholas Kazlauskas 
12282083640fSNicholas Kazlauskas 	/* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
12292083640fSNicholas Kazlauskas 	if (eng_id <= ENGINE_ID_DIGF) {
12302083640fSNicholas Kazlauskas 		vpg_inst = eng_id;
12312083640fSNicholas Kazlauskas 		afmt_inst = eng_id;
12322083640fSNicholas Kazlauskas 	} else
12332083640fSNicholas Kazlauskas 		return NULL;
12342083640fSNicholas Kazlauskas 
12352083640fSNicholas Kazlauskas 	enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
12362083640fSNicholas Kazlauskas 	vpg = dcn31_vpg_create(ctx, vpg_inst);
12372083640fSNicholas Kazlauskas 	afmt = dcn31_afmt_create(ctx, afmt_inst);
12382083640fSNicholas Kazlauskas 
12397b89bf83SAnson Jacob 	if (!enc1 || !vpg || !afmt) {
12407b89bf83SAnson Jacob 		kfree(enc1);
12417b89bf83SAnson Jacob 		kfree(vpg);
12427b89bf83SAnson Jacob 		kfree(afmt);
12432083640fSNicholas Kazlauskas 		return NULL;
12447b89bf83SAnson Jacob 	}
12452083640fSNicholas Kazlauskas 
12462083640fSNicholas Kazlauskas 	dcn30_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
12472083640fSNicholas Kazlauskas 					eng_id, vpg, afmt,
12482083640fSNicholas Kazlauskas 					&stream_enc_regs[eng_id],
12492083640fSNicholas Kazlauskas 					&se_shift, &se_mask);
12502083640fSNicholas Kazlauskas 
12512083640fSNicholas Kazlauskas 	return &enc1->base;
12522083640fSNicholas Kazlauskas }
12532083640fSNicholas Kazlauskas 
dcn31_hpo_dp_stream_encoder_create(enum engine_id eng_id,struct dc_context * ctx)125483228ebbSFangzhi Zuo static struct hpo_dp_stream_encoder *dcn31_hpo_dp_stream_encoder_create(
125583228ebbSFangzhi Zuo 	enum engine_id eng_id,
125683228ebbSFangzhi Zuo 	struct dc_context *ctx)
125783228ebbSFangzhi Zuo {
125883228ebbSFangzhi Zuo 	struct dcn31_hpo_dp_stream_encoder *hpo_dp_enc31;
125983228ebbSFangzhi Zuo 	struct vpg *vpg;
126083228ebbSFangzhi Zuo 	struct apg *apg;
126183228ebbSFangzhi Zuo 	uint32_t hpo_dp_inst;
126283228ebbSFangzhi Zuo 	uint32_t vpg_inst;
126383228ebbSFangzhi Zuo 	uint32_t apg_inst;
126483228ebbSFangzhi Zuo 
126583228ebbSFangzhi Zuo 	ASSERT((eng_id >= ENGINE_ID_HPO_DP_0) && (eng_id <= ENGINE_ID_HPO_DP_3));
126683228ebbSFangzhi Zuo 	hpo_dp_inst = eng_id - ENGINE_ID_HPO_DP_0;
126783228ebbSFangzhi Zuo 
126883228ebbSFangzhi Zuo 	/* Mapping of VPG register blocks to HPO DP block instance:
126983228ebbSFangzhi Zuo 	 * VPG[6] -> HPO_DP[0]
127083228ebbSFangzhi Zuo 	 * VPG[7] -> HPO_DP[1]
127183228ebbSFangzhi Zuo 	 * VPG[8] -> HPO_DP[2]
127283228ebbSFangzhi Zuo 	 * VPG[9] -> HPO_DP[3]
127383228ebbSFangzhi Zuo 	 */
127483228ebbSFangzhi Zuo 	vpg_inst = hpo_dp_inst + 6;
127583228ebbSFangzhi Zuo 
127683228ebbSFangzhi Zuo 	/* Mapping of APG register blocks to HPO DP block instance:
127783228ebbSFangzhi Zuo 	 * APG[0] -> HPO_DP[0]
127883228ebbSFangzhi Zuo 	 * APG[1] -> HPO_DP[1]
127983228ebbSFangzhi Zuo 	 * APG[2] -> HPO_DP[2]
128083228ebbSFangzhi Zuo 	 * APG[3] -> HPO_DP[3]
128183228ebbSFangzhi Zuo 	 */
128283228ebbSFangzhi Zuo 	apg_inst = hpo_dp_inst;
128383228ebbSFangzhi Zuo 
128483228ebbSFangzhi Zuo 	/* allocate HPO stream encoder and create VPG sub-block */
128583228ebbSFangzhi Zuo 	hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_stream_encoder), GFP_KERNEL);
128683228ebbSFangzhi Zuo 	vpg = dcn31_vpg_create(ctx, vpg_inst);
128783228ebbSFangzhi Zuo 	apg = dcn31_apg_create(ctx, apg_inst);
128883228ebbSFangzhi Zuo 
12897b89bf83SAnson Jacob 	if (!hpo_dp_enc31 || !vpg || !apg) {
12907b89bf83SAnson Jacob 		kfree(hpo_dp_enc31);
12917b89bf83SAnson Jacob 		kfree(vpg);
12927b89bf83SAnson Jacob 		kfree(apg);
129383228ebbSFangzhi Zuo 		return NULL;
12947b89bf83SAnson Jacob 	}
129583228ebbSFangzhi Zuo 
129683228ebbSFangzhi Zuo 	dcn31_hpo_dp_stream_encoder_construct(hpo_dp_enc31, ctx, ctx->dc_bios,
129783228ebbSFangzhi Zuo 					hpo_dp_inst, eng_id, vpg, apg,
129883228ebbSFangzhi Zuo 					&hpo_dp_stream_enc_regs[hpo_dp_inst],
129983228ebbSFangzhi Zuo 					&hpo_dp_se_shift, &hpo_dp_se_mask);
130083228ebbSFangzhi Zuo 
130183228ebbSFangzhi Zuo 	return &hpo_dp_enc31->base;
130283228ebbSFangzhi Zuo }
130383228ebbSFangzhi Zuo 
dcn31_hpo_dp_link_encoder_create(uint8_t inst,struct dc_context * ctx)13043bc8d921SFangzhi Zuo static struct hpo_dp_link_encoder *dcn31_hpo_dp_link_encoder_create(
13053bc8d921SFangzhi Zuo 	uint8_t inst,
13063bc8d921SFangzhi Zuo 	struct dc_context *ctx)
13073bc8d921SFangzhi Zuo {
13083bc8d921SFangzhi Zuo 	struct dcn31_hpo_dp_link_encoder *hpo_dp_enc31;
13093bc8d921SFangzhi Zuo 
13103bc8d921SFangzhi Zuo 	/* allocate HPO link encoder */
13113bc8d921SFangzhi Zuo 	hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL);
13128e65a1b7SHersen Wu 	if (!hpo_dp_enc31)
13138e65a1b7SHersen Wu 		return NULL; /* out of memory */
13143bc8d921SFangzhi Zuo 
13153bc8d921SFangzhi Zuo 	hpo_dp_link_encoder31_construct(hpo_dp_enc31, ctx, inst,
13163bc8d921SFangzhi Zuo 					&hpo_dp_link_enc_regs[inst],
13173bc8d921SFangzhi Zuo 					&hpo_dp_le_shift, &hpo_dp_le_mask);
13183bc8d921SFangzhi Zuo 
13193bc8d921SFangzhi Zuo 	return &hpo_dp_enc31->base;
13203bc8d921SFangzhi Zuo }
13213bc8d921SFangzhi Zuo 
dcn31_hwseq_create(struct dc_context * ctx)13222083640fSNicholas Kazlauskas static struct dce_hwseq *dcn31_hwseq_create(
13232083640fSNicholas Kazlauskas 	struct dc_context *ctx)
13242083640fSNicholas Kazlauskas {
13252083640fSNicholas Kazlauskas 	struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
13262083640fSNicholas Kazlauskas 
13272083640fSNicholas Kazlauskas 	if (hws) {
13282083640fSNicholas Kazlauskas 		hws->ctx = ctx;
13292083640fSNicholas Kazlauskas 		hws->regs = &hwseq_reg;
13302083640fSNicholas Kazlauskas 		hws->shifts = &hwseq_shift;
13312083640fSNicholas Kazlauskas 		hws->masks = &hwseq_mask;
13322083640fSNicholas Kazlauskas 	}
13332083640fSNicholas Kazlauskas 	return hws;
13342083640fSNicholas Kazlauskas }
13352083640fSNicholas Kazlauskas static const struct resource_create_funcs res_create_funcs = {
13362083640fSNicholas Kazlauskas 	.read_dce_straps = read_dce_straps,
13372083640fSNicholas Kazlauskas 	.create_audio = dcn31_create_audio,
13382083640fSNicholas Kazlauskas 	.create_stream_encoder = dcn31_stream_encoder_create,
133983228ebbSFangzhi Zuo 	.create_hpo_dp_stream_encoder = dcn31_hpo_dp_stream_encoder_create,
13403bc8d921SFangzhi Zuo 	.create_hpo_dp_link_encoder = dcn31_hpo_dp_link_encoder_create,
13412083640fSNicholas Kazlauskas 	.create_hwseq = dcn31_hwseq_create,
13422083640fSNicholas Kazlauskas };
13432083640fSNicholas Kazlauskas 
dcn31_resource_destruct(struct dcn31_resource_pool * pool)13442083640fSNicholas Kazlauskas static void dcn31_resource_destruct(struct dcn31_resource_pool *pool)
13452083640fSNicholas Kazlauskas {
13462083640fSNicholas Kazlauskas 	unsigned int i;
13472083640fSNicholas Kazlauskas 
13482083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.stream_enc_count; i++) {
13492083640fSNicholas Kazlauskas 		if (pool->base.stream_enc[i] != NULL) {
13502083640fSNicholas Kazlauskas 			if (pool->base.stream_enc[i]->vpg != NULL) {
13512083640fSNicholas Kazlauskas 				kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
13522083640fSNicholas Kazlauskas 				pool->base.stream_enc[i]->vpg = NULL;
13532083640fSNicholas Kazlauskas 			}
13542083640fSNicholas Kazlauskas 			if (pool->base.stream_enc[i]->afmt != NULL) {
13552083640fSNicholas Kazlauskas 				kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
13562083640fSNicholas Kazlauskas 				pool->base.stream_enc[i]->afmt = NULL;
13572083640fSNicholas Kazlauskas 			}
13582083640fSNicholas Kazlauskas 			kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
13592083640fSNicholas Kazlauskas 			pool->base.stream_enc[i] = NULL;
13602083640fSNicholas Kazlauskas 		}
13612083640fSNicholas Kazlauskas 	}
13622083640fSNicholas Kazlauskas 
136383228ebbSFangzhi Zuo 	for (i = 0; i < pool->base.hpo_dp_stream_enc_count; i++) {
136483228ebbSFangzhi Zuo 		if (pool->base.hpo_dp_stream_enc[i] != NULL) {
136583228ebbSFangzhi Zuo 			if (pool->base.hpo_dp_stream_enc[i]->vpg != NULL) {
136683228ebbSFangzhi Zuo 				kfree(DCN30_VPG_FROM_VPG(pool->base.hpo_dp_stream_enc[i]->vpg));
136783228ebbSFangzhi Zuo 				pool->base.hpo_dp_stream_enc[i]->vpg = NULL;
136883228ebbSFangzhi Zuo 			}
136983228ebbSFangzhi Zuo 			if (pool->base.hpo_dp_stream_enc[i]->apg != NULL) {
137083228ebbSFangzhi Zuo 				kfree(DCN31_APG_FROM_APG(pool->base.hpo_dp_stream_enc[i]->apg));
137183228ebbSFangzhi Zuo 				pool->base.hpo_dp_stream_enc[i]->apg = NULL;
137283228ebbSFangzhi Zuo 			}
137383228ebbSFangzhi Zuo 			kfree(DCN3_1_HPO_DP_STREAM_ENC_FROM_HPO_STREAM_ENC(pool->base.hpo_dp_stream_enc[i]));
137483228ebbSFangzhi Zuo 			pool->base.hpo_dp_stream_enc[i] = NULL;
137583228ebbSFangzhi Zuo 		}
137683228ebbSFangzhi Zuo 	}
137783228ebbSFangzhi Zuo 
13783bc8d921SFangzhi Zuo 	for (i = 0; i < pool->base.hpo_dp_link_enc_count; i++) {
13793bc8d921SFangzhi Zuo 		if (pool->base.hpo_dp_link_enc[i] != NULL) {
13803bc8d921SFangzhi Zuo 			kfree(DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(pool->base.hpo_dp_link_enc[i]));
13813bc8d921SFangzhi Zuo 			pool->base.hpo_dp_link_enc[i] = NULL;
13823bc8d921SFangzhi Zuo 		}
13833bc8d921SFangzhi Zuo 	}
13843bc8d921SFangzhi Zuo 
13852083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
13862083640fSNicholas Kazlauskas 		if (pool->base.dscs[i] != NULL)
13872083640fSNicholas Kazlauskas 			dcn20_dsc_destroy(&pool->base.dscs[i]);
13882083640fSNicholas Kazlauskas 	}
13892083640fSNicholas Kazlauskas 
13902083640fSNicholas Kazlauskas 	if (pool->base.mpc != NULL) {
13912083640fSNicholas Kazlauskas 		kfree(TO_DCN20_MPC(pool->base.mpc));
13922083640fSNicholas Kazlauskas 		pool->base.mpc = NULL;
13932083640fSNicholas Kazlauskas 	}
13942083640fSNicholas Kazlauskas 	if (pool->base.hubbub != NULL) {
13952083640fSNicholas Kazlauskas 		kfree(pool->base.hubbub);
13962083640fSNicholas Kazlauskas 		pool->base.hubbub = NULL;
13972083640fSNicholas Kazlauskas 	}
13982083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.pipe_count; i++) {
13992083640fSNicholas Kazlauskas 		if (pool->base.dpps[i] != NULL)
14002083640fSNicholas Kazlauskas 			dcn31_dpp_destroy(&pool->base.dpps[i]);
14012083640fSNicholas Kazlauskas 
14022083640fSNicholas Kazlauskas 		if (pool->base.ipps[i] != NULL)
14032083640fSNicholas Kazlauskas 			pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
14042083640fSNicholas Kazlauskas 
14052083640fSNicholas Kazlauskas 		if (pool->base.hubps[i] != NULL) {
14062083640fSNicholas Kazlauskas 			kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
14072083640fSNicholas Kazlauskas 			pool->base.hubps[i] = NULL;
14082083640fSNicholas Kazlauskas 		}
14092083640fSNicholas Kazlauskas 
14102083640fSNicholas Kazlauskas 		if (pool->base.irqs != NULL) {
14112083640fSNicholas Kazlauskas 			dal_irq_service_destroy(&pool->base.irqs);
14122083640fSNicholas Kazlauskas 		}
14132083640fSNicholas Kazlauskas 	}
14142083640fSNicholas Kazlauskas 
14152083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
14162083640fSNicholas Kazlauskas 		if (pool->base.engines[i] != NULL)
14172083640fSNicholas Kazlauskas 			dce110_engine_destroy(&pool->base.engines[i]);
14182083640fSNicholas Kazlauskas 		if (pool->base.hw_i2cs[i] != NULL) {
14192083640fSNicholas Kazlauskas 			kfree(pool->base.hw_i2cs[i]);
14202083640fSNicholas Kazlauskas 			pool->base.hw_i2cs[i] = NULL;
14212083640fSNicholas Kazlauskas 		}
14222083640fSNicholas Kazlauskas 		if (pool->base.sw_i2cs[i] != NULL) {
14232083640fSNicholas Kazlauskas 			kfree(pool->base.sw_i2cs[i]);
14242083640fSNicholas Kazlauskas 			pool->base.sw_i2cs[i] = NULL;
14252083640fSNicholas Kazlauskas 		}
14262083640fSNicholas Kazlauskas 	}
14272083640fSNicholas Kazlauskas 
14282083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.res_cap->num_opp; i++) {
14292083640fSNicholas Kazlauskas 		if (pool->base.opps[i] != NULL)
14302083640fSNicholas Kazlauskas 			pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
14312083640fSNicholas Kazlauskas 	}
14322083640fSNicholas Kazlauskas 
14332083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
14342083640fSNicholas Kazlauskas 		if (pool->base.timing_generators[i] != NULL)	{
14352083640fSNicholas Kazlauskas 			kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
14362083640fSNicholas Kazlauskas 			pool->base.timing_generators[i] = NULL;
14372083640fSNicholas Kazlauskas 		}
14382083640fSNicholas Kazlauskas 	}
14392083640fSNicholas Kazlauskas 
14402083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
14412083640fSNicholas Kazlauskas 		if (pool->base.dwbc[i] != NULL) {
14422083640fSNicholas Kazlauskas 			kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
14432083640fSNicholas Kazlauskas 			pool->base.dwbc[i] = NULL;
14442083640fSNicholas Kazlauskas 		}
14452083640fSNicholas Kazlauskas 		if (pool->base.mcif_wb[i] != NULL) {
14462083640fSNicholas Kazlauskas 			kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
14472083640fSNicholas Kazlauskas 			pool->base.mcif_wb[i] = NULL;
14482083640fSNicholas Kazlauskas 		}
14492083640fSNicholas Kazlauskas 	}
14502083640fSNicholas Kazlauskas 
14512083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.audio_count; i++) {
14522083640fSNicholas Kazlauskas 		if (pool->base.audios[i])
14532083640fSNicholas Kazlauskas 			dce_aud_destroy(&pool->base.audios[i]);
14542083640fSNicholas Kazlauskas 	}
14552083640fSNicholas Kazlauskas 
14562083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.clk_src_count; i++) {
14572083640fSNicholas Kazlauskas 		if (pool->base.clock_sources[i] != NULL) {
14582083640fSNicholas Kazlauskas 			dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
14592083640fSNicholas Kazlauskas 			pool->base.clock_sources[i] = NULL;
14602083640fSNicholas Kazlauskas 		}
14612083640fSNicholas Kazlauskas 	}
14622083640fSNicholas Kazlauskas 
14632083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
14642083640fSNicholas Kazlauskas 		if (pool->base.mpc_lut[i] != NULL) {
14652083640fSNicholas Kazlauskas 			dc_3dlut_func_release(pool->base.mpc_lut[i]);
14662083640fSNicholas Kazlauskas 			pool->base.mpc_lut[i] = NULL;
14672083640fSNicholas Kazlauskas 		}
14682083640fSNicholas Kazlauskas 		if (pool->base.mpc_shaper[i] != NULL) {
14692083640fSNicholas Kazlauskas 			dc_transfer_func_release(pool->base.mpc_shaper[i]);
14702083640fSNicholas Kazlauskas 			pool->base.mpc_shaper[i] = NULL;
14712083640fSNicholas Kazlauskas 		}
14722083640fSNicholas Kazlauskas 	}
14732083640fSNicholas Kazlauskas 
14742083640fSNicholas Kazlauskas 	if (pool->base.dp_clock_source != NULL) {
14752083640fSNicholas Kazlauskas 		dcn20_clock_source_destroy(&pool->base.dp_clock_source);
14762083640fSNicholas Kazlauskas 		pool->base.dp_clock_source = NULL;
14772083640fSNicholas Kazlauskas 	}
14782083640fSNicholas Kazlauskas 
14792083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
14802083640fSNicholas Kazlauskas 		if (pool->base.multiple_abms[i] != NULL)
14812083640fSNicholas Kazlauskas 			dce_abm_destroy(&pool->base.multiple_abms[i]);
14822083640fSNicholas Kazlauskas 	}
14832083640fSNicholas Kazlauskas 
14842083640fSNicholas Kazlauskas 	if (pool->base.psr != NULL)
14852083640fSNicholas Kazlauskas 		dmub_psr_destroy(&pool->base.psr);
14862083640fSNicholas Kazlauskas 
1487c7ddc0a8SBhawanpreet Lakha 	if (pool->base.replay != NULL)
1488c7ddc0a8SBhawanpreet Lakha 		dmub_replay_destroy(&pool->base.replay);
1489c7ddc0a8SBhawanpreet Lakha 
14902083640fSNicholas Kazlauskas 	if (pool->base.dccg != NULL)
14912083640fSNicholas Kazlauskas 		dcn_dccg_destroy(&pool->base.dccg);
14922083640fSNicholas Kazlauskas }
14932083640fSNicholas Kazlauskas 
dcn31_hubp_create(struct dc_context * ctx,uint32_t inst)14942083640fSNicholas Kazlauskas static struct hubp *dcn31_hubp_create(
14952083640fSNicholas Kazlauskas 	struct dc_context *ctx,
14962083640fSNicholas Kazlauskas 	uint32_t inst)
14972083640fSNicholas Kazlauskas {
14982083640fSNicholas Kazlauskas 	struct dcn20_hubp *hubp2 =
14992083640fSNicholas Kazlauskas 		kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
15002083640fSNicholas Kazlauskas 
15012083640fSNicholas Kazlauskas 	if (!hubp2)
15022083640fSNicholas Kazlauskas 		return NULL;
15032083640fSNicholas Kazlauskas 
15042083640fSNicholas Kazlauskas 	if (hubp31_construct(hubp2, ctx, inst,
15052083640fSNicholas Kazlauskas 			&hubp_regs[inst], &hubp_shift, &hubp_mask))
15062083640fSNicholas Kazlauskas 		return &hubp2->base;
15072083640fSNicholas Kazlauskas 
15082083640fSNicholas Kazlauskas 	BREAK_TO_DEBUGGER();
15092083640fSNicholas Kazlauskas 	kfree(hubp2);
15102083640fSNicholas Kazlauskas 	return NULL;
15112083640fSNicholas Kazlauskas }
15122083640fSNicholas Kazlauskas 
dcn31_dwbc_create(struct dc_context * ctx,struct resource_pool * pool)15132083640fSNicholas Kazlauskas static bool dcn31_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
15142083640fSNicholas Kazlauskas {
15152083640fSNicholas Kazlauskas 	int i;
15162083640fSNicholas Kazlauskas 	uint32_t pipe_count = pool->res_cap->num_dwb;
15172083640fSNicholas Kazlauskas 
15182083640fSNicholas Kazlauskas 	for (i = 0; i < pipe_count; i++) {
15192083640fSNicholas Kazlauskas 		struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
15202083640fSNicholas Kazlauskas 						    GFP_KERNEL);
15212083640fSNicholas Kazlauskas 
15222083640fSNicholas Kazlauskas 		if (!dwbc30) {
15232083640fSNicholas Kazlauskas 			dm_error("DC: failed to create dwbc30!\n");
15242083640fSNicholas Kazlauskas 			return false;
15252083640fSNicholas Kazlauskas 		}
15262083640fSNicholas Kazlauskas 
15272083640fSNicholas Kazlauskas 		dcn30_dwbc_construct(dwbc30, ctx,
15282083640fSNicholas Kazlauskas 				&dwbc30_regs[i],
15292083640fSNicholas Kazlauskas 				&dwbc30_shift,
15302083640fSNicholas Kazlauskas 				&dwbc30_mask,
15312083640fSNicholas Kazlauskas 				i);
15322083640fSNicholas Kazlauskas 
15332083640fSNicholas Kazlauskas 		pool->dwbc[i] = &dwbc30->base;
15342083640fSNicholas Kazlauskas 	}
15352083640fSNicholas Kazlauskas 	return true;
15362083640fSNicholas Kazlauskas }
15372083640fSNicholas Kazlauskas 
dcn31_mmhubbub_create(struct dc_context * ctx,struct resource_pool * pool)15382083640fSNicholas Kazlauskas static bool dcn31_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
15392083640fSNicholas Kazlauskas {
15402083640fSNicholas Kazlauskas 	int i;
15412083640fSNicholas Kazlauskas 	uint32_t pipe_count = pool->res_cap->num_dwb;
15422083640fSNicholas Kazlauskas 
15432083640fSNicholas Kazlauskas 	for (i = 0; i < pipe_count; i++) {
15442083640fSNicholas Kazlauskas 		struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
15452083640fSNicholas Kazlauskas 						    GFP_KERNEL);
15462083640fSNicholas Kazlauskas 
15472083640fSNicholas Kazlauskas 		if (!mcif_wb30) {
15482083640fSNicholas Kazlauskas 			dm_error("DC: failed to create mcif_wb30!\n");
15492083640fSNicholas Kazlauskas 			return false;
15502083640fSNicholas Kazlauskas 		}
15512083640fSNicholas Kazlauskas 
15522083640fSNicholas Kazlauskas 		dcn30_mmhubbub_construct(mcif_wb30, ctx,
15532083640fSNicholas Kazlauskas 				&mcif_wb30_regs[i],
15542083640fSNicholas Kazlauskas 				&mcif_wb30_shift,
15552083640fSNicholas Kazlauskas 				&mcif_wb30_mask,
15562083640fSNicholas Kazlauskas 				i);
15572083640fSNicholas Kazlauskas 
15582083640fSNicholas Kazlauskas 		pool->mcif_wb[i] = &mcif_wb30->base;
15592083640fSNicholas Kazlauskas 	}
15602083640fSNicholas Kazlauskas 	return true;
15612083640fSNicholas Kazlauskas }
15622083640fSNicholas Kazlauskas 
dcn31_dsc_create(struct dc_context * ctx,uint32_t inst)15632083640fSNicholas Kazlauskas static struct display_stream_compressor *dcn31_dsc_create(
15642083640fSNicholas Kazlauskas 	struct dc_context *ctx, uint32_t inst)
15652083640fSNicholas Kazlauskas {
15662083640fSNicholas Kazlauskas 	struct dcn20_dsc *dsc =
15672083640fSNicholas Kazlauskas 		kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
15682083640fSNicholas Kazlauskas 
15692083640fSNicholas Kazlauskas 	if (!dsc) {
15702083640fSNicholas Kazlauskas 		BREAK_TO_DEBUGGER();
15712083640fSNicholas Kazlauskas 		return NULL;
15722083640fSNicholas Kazlauskas 	}
15732083640fSNicholas Kazlauskas 
15742083640fSNicholas Kazlauskas 	dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
15752083640fSNicholas Kazlauskas 	return &dsc->base;
15762083640fSNicholas Kazlauskas }
15772083640fSNicholas Kazlauskas 
dcn31_destroy_resource_pool(struct resource_pool ** pool)15782083640fSNicholas Kazlauskas static void dcn31_destroy_resource_pool(struct resource_pool **pool)
15792083640fSNicholas Kazlauskas {
15802083640fSNicholas Kazlauskas 	struct dcn31_resource_pool *dcn31_pool = TO_DCN31_RES_POOL(*pool);
15812083640fSNicholas Kazlauskas 
15822083640fSNicholas Kazlauskas 	dcn31_resource_destruct(dcn31_pool);
15832083640fSNicholas Kazlauskas 	kfree(dcn31_pool);
15842083640fSNicholas Kazlauskas 	*pool = NULL;
15852083640fSNicholas Kazlauskas }
15862083640fSNicholas Kazlauskas 
dcn31_clock_source_create(struct dc_context * ctx,struct dc_bios * bios,enum clock_source_id id,const struct dce110_clk_src_regs * regs,bool dp_clk_src)15872083640fSNicholas Kazlauskas static struct clock_source *dcn31_clock_source_create(
15882083640fSNicholas Kazlauskas 		struct dc_context *ctx,
15892083640fSNicholas Kazlauskas 		struct dc_bios *bios,
15902083640fSNicholas Kazlauskas 		enum clock_source_id id,
15912083640fSNicholas Kazlauskas 		const struct dce110_clk_src_regs *regs,
15922083640fSNicholas Kazlauskas 		bool dp_clk_src)
15932083640fSNicholas Kazlauskas {
15942083640fSNicholas Kazlauskas 	struct dce110_clk_src *clk_src =
15952083640fSNicholas Kazlauskas 		kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
15962083640fSNicholas Kazlauskas 
15972083640fSNicholas Kazlauskas 	if (!clk_src)
15982083640fSNicholas Kazlauskas 		return NULL;
15992083640fSNicholas Kazlauskas 
16002083640fSNicholas Kazlauskas 	if (dcn3_clk_src_construct(clk_src, ctx, bios, id,
16012083640fSNicholas Kazlauskas 			regs, &cs_shift, &cs_mask)) {
16022083640fSNicholas Kazlauskas 		clk_src->base.dp_clk_src = dp_clk_src;
16032083640fSNicholas Kazlauskas 		return &clk_src->base;
16042083640fSNicholas Kazlauskas 	}
16052083640fSNicholas Kazlauskas 
1606fcb4f919SLongJun Tang 	kfree(clk_src);
16072083640fSNicholas Kazlauskas 	BREAK_TO_DEBUGGER();
16082083640fSNicholas Kazlauskas 	return NULL;
16092083640fSNicholas Kazlauskas }
16102083640fSNicholas Kazlauskas 
is_dual_plane(enum surface_pixel_format format)16112083640fSNicholas Kazlauskas static bool is_dual_plane(enum surface_pixel_format format)
16122083640fSNicholas Kazlauskas {
16132083640fSNicholas Kazlauskas 	return format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN || format == SURFACE_PIXEL_FORMAT_GRPH_RGBE_ALPHA;
16142083640fSNicholas Kazlauskas }
16152083640fSNicholas Kazlauskas 
dcn31x_populate_dml_pipes_from_context(struct dc * dc,struct dc_state * context,display_e2e_pipe_params_st * pipes,enum dc_validate_mode validate_mode)161627142312SCharlene Liu int dcn31x_populate_dml_pipes_from_context(struct dc *dc,
161727142312SCharlene Liu 					  struct dc_state *context,
161827142312SCharlene Liu 					  display_e2e_pipe_params_st *pipes,
161927142312SCharlene Liu 					  enum dc_validate_mode validate_mode)
162027142312SCharlene Liu {
162127142312SCharlene Liu 	uint32_t pipe_cnt;
162227142312SCharlene Liu 	int i;
162327142312SCharlene Liu 
162427142312SCharlene Liu 	dc_assert_fp_enabled();
162527142312SCharlene Liu 
162627142312SCharlene Liu 	pipe_cnt = dcn20_populate_dml_pipes_from_context(dc, context, pipes, validate_mode);
162727142312SCharlene Liu 
162827142312SCharlene Liu 	for (i = 0; i < pipe_cnt; i++) {
162927142312SCharlene Liu 		pipes[i].pipe.src.gpuvm = 1;
163027142312SCharlene Liu 		if (dc->debug.dml_hostvm_override == DML_HOSTVM_NO_OVERRIDE) {
163127142312SCharlene Liu 			//pipes[pipe_cnt].pipe.src.hostvm = dc->res_pool->hubbub->riommu_active;
163227142312SCharlene Liu 			pipes[i].pipe.src.hostvm = dc->vm_pa_config.is_hvm_enabled;
163327142312SCharlene Liu 		} else if (dc->debug.dml_hostvm_override == DML_HOSTVM_OVERRIDE_FALSE)
163427142312SCharlene Liu 			pipes[i].pipe.src.hostvm = false;
163527142312SCharlene Liu 		else if (dc->debug.dml_hostvm_override == DML_HOSTVM_OVERRIDE_TRUE)
163627142312SCharlene Liu 			pipes[i].pipe.src.hostvm = true;
163727142312SCharlene Liu 	}
163827142312SCharlene Liu 	return pipe_cnt;
163927142312SCharlene Liu }
164027142312SCharlene Liu 
dcn31_populate_dml_pipes_from_context(struct dc * dc,struct dc_state * context,display_e2e_pipe_params_st * pipes,enum dc_validate_mode validate_mode)16416dc0fdedSNicholas Kazlauskas int dcn31_populate_dml_pipes_from_context(
16422083640fSNicholas Kazlauskas 	struct dc *dc, struct dc_state *context,
16432083640fSNicholas Kazlauskas 	display_e2e_pipe_params_st *pipes,
16442083640fSNicholas Kazlauskas 	enum dc_validate_mode validate_mode)
16452083640fSNicholas Kazlauskas {
16462083640fSNicholas Kazlauskas 	int i, pipe_cnt;
16472083640fSNicholas Kazlauskas 	struct resource_context *res_ctx = &context->res_ctx;
1648aece2094SAric Cyr 	struct pipe_ctx *pipe = 0;
16494658b25dSMichael Strauss 	bool upscaled = false;
16502083640fSNicholas Kazlauskas 
1651cf689e86SMelissa Wen 	DC_FP_START();
165227142312SCharlene Liu 	dcn31x_populate_dml_pipes_from_context(dc, context, pipes, validate_mode);
1653cf689e86SMelissa Wen 	DC_FP_END();
16542083640fSNicholas Kazlauskas 
16552083640fSNicholas Kazlauskas 	for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
16562083640fSNicholas Kazlauskas 		struct dc_crtc_timing *timing;
16572083640fSNicholas Kazlauskas 
16582083640fSNicholas Kazlauskas 		if (!res_ctx->pipe_ctx[i].stream)
16592083640fSNicholas Kazlauskas 			continue;
16602083640fSNicholas Kazlauskas 		pipe = &res_ctx->pipe_ctx[i];
16612083640fSNicholas Kazlauskas 		timing = &pipe->stream->timing;
16624658b25dSMichael Strauss 		if (pipe->plane_state &&
16634658b25dSMichael Strauss 				(pipe->plane_state->src_rect.height < pipe->plane_state->dst_rect.height ||
16644658b25dSMichael Strauss 				pipe->plane_state->src_rect.width < pipe->plane_state->dst_rect.width))
16654658b25dSMichael Strauss 			upscaled = true;
16664658b25dSMichael Strauss 
16675595e962SNicholas Kazlauskas 		/*
16685595e962SNicholas Kazlauskas 		 * Immediate flip can be set dynamically after enabling the plane.
16695595e962SNicholas Kazlauskas 		 * We need to require support for immediate flip or underflow can be
16705595e962SNicholas Kazlauskas 		 * intermittently experienced depending on peak b/w requirements.
16715595e962SNicholas Kazlauskas 		 */
16725595e962SNicholas Kazlauskas 		pipes[pipe_cnt].pipe.src.immediate_flip = true;
16732083640fSNicholas Kazlauskas 		pipes[pipe_cnt].pipe.src.unbounded_req_mode = false;
16742083640fSNicholas Kazlauskas 		pipes[pipe_cnt].pipe.src.gpuvm = true;
16752083640fSNicholas Kazlauskas 		pipes[pipe_cnt].pipe.dest.vfront_porch = timing->v_front_porch;
16762083640fSNicholas Kazlauskas 		pipes[pipe_cnt].pipe.src.dcc_rate = 3;
16772083640fSNicholas Kazlauskas 		pipes[pipe_cnt].dout.dsc_input_bpc = 0;
167839a6f3feSMelissa Wen 		DC_FP_START();
167939a6f3feSMelissa Wen 		dcn31_zero_pipe_dcc_fraction(pipes, pipe_cnt);
168039a6f3feSMelissa Wen 		DC_FP_END();
16812083640fSNicholas Kazlauskas 
16824a0caac0SMichael Strauss 
16832083640fSNicholas Kazlauskas 		if (pipes[pipe_cnt].dout.dsc_enable) {
16842083640fSNicholas Kazlauskas 			switch (timing->display_color_depth) {
16852083640fSNicholas Kazlauskas 			case COLOR_DEPTH_888:
16862083640fSNicholas Kazlauskas 				pipes[pipe_cnt].dout.dsc_input_bpc = 8;
16872083640fSNicholas Kazlauskas 				break;
16882083640fSNicholas Kazlauskas 			case COLOR_DEPTH_101010:
16892083640fSNicholas Kazlauskas 				pipes[pipe_cnt].dout.dsc_input_bpc = 10;
16902083640fSNicholas Kazlauskas 				break;
16912083640fSNicholas Kazlauskas 			case COLOR_DEPTH_121212:
16922083640fSNicholas Kazlauskas 				pipes[pipe_cnt].dout.dsc_input_bpc = 12;
16932083640fSNicholas Kazlauskas 				break;
16942083640fSNicholas Kazlauskas 			default:
16952083640fSNicholas Kazlauskas 				ASSERT(0);
16962083640fSNicholas Kazlauskas 				break;
16972083640fSNicholas Kazlauskas 			}
16982083640fSNicholas Kazlauskas 		}
16992083640fSNicholas Kazlauskas 
17002083640fSNicholas Kazlauskas 		pipe_cnt++;
17012083640fSNicholas Kazlauskas 	}
17022083640fSNicholas Kazlauskas 	context->bw_ctx.dml.ip.det_buffer_size_kbytes = DCN3_1_DEFAULT_DET_SIZE;
17032083640fSNicholas Kazlauskas 	dc->config.enable_4to1MPC = false;
17042083640fSNicholas Kazlauskas 	if (pipe_cnt == 1 && pipe->plane_state && !dc->debug.disable_z9_mpc) {
17052083640fSNicholas Kazlauskas 		if (is_dual_plane(pipe->plane_state->format)
17062083640fSNicholas Kazlauskas 				&& pipe->plane_state->src_rect.width <= 1920 && pipe->plane_state->src_rect.height <= 1080) {
17072083640fSNicholas Kazlauskas 			dc->config.enable_4to1MPC = true;
17083084488aSDmytro Laktyushkin 		} else if (!is_dual_plane(pipe->plane_state->format) && pipe->plane_state->src_rect.width <= 5120) {
17093084488aSDmytro Laktyushkin 			/* Limit to 5k max to avoid forced pipe split when there is not enough detile for swath */
17102083640fSNicholas Kazlauskas 			context->bw_ctx.dml.ip.det_buffer_size_kbytes = 192;
17112083640fSNicholas Kazlauskas 			pipes[0].pipe.src.unbounded_req_mode = true;
17122083640fSNicholas Kazlauskas 		}
1713f3edefceSMichael Strauss 	} else if (context->stream_count >= dc->debug.crb_alloc_policy_min_disp_count
1714f3edefceSMichael Strauss 			&& dc->debug.crb_alloc_policy > DET_SIZE_DEFAULT) {
1715f3edefceSMichael Strauss 		context->bw_ctx.dml.ip.det_buffer_size_kbytes = dc->debug.crb_alloc_policy * 64;
17164658b25dSMichael Strauss 	} else if (context->stream_count >= 3 && upscaled) {
17174658b25dSMichael Strauss 		context->bw_ctx.dml.ip.det_buffer_size_kbytes = 192;
17182083640fSNicholas Kazlauskas 	}
17192083640fSNicholas Kazlauskas 
17202083640fSNicholas Kazlauskas 	return pipe_cnt;
17212083640fSNicholas Kazlauskas }
17222083640fSNicholas Kazlauskas 
dcn31_get_det_buffer_size(const struct dc_state * context)17236a7fd76bSSung Lee unsigned int dcn31_get_det_buffer_size(
17246a7fd76bSSung Lee 	const struct dc_state *context)
17256a7fd76bSSung Lee {
17266a7fd76bSSung Lee 	return context->bw_ctx.dml.ip.det_buffer_size_kbytes;
17276a7fd76bSSung Lee }
17286a7fd76bSSung Lee 
dcn31_calculate_wm_and_dlg(struct dc * dc,struct dc_state * context,display_e2e_pipe_params_st * pipes,int pipe_cnt,int vlevel)1729876e835eSDmytro Laktyushkin void dcn31_calculate_wm_and_dlg(
17303e88cbb0SAlex Deucher 		struct dc *dc, struct dc_state *context,
17313e88cbb0SAlex Deucher 		display_e2e_pipe_params_st *pipes,
17323e88cbb0SAlex Deucher 		int pipe_cnt,
17333e88cbb0SAlex Deucher 		int vlevel)
17343e88cbb0SAlex Deucher {
17353e88cbb0SAlex Deucher 	DC_FP_START();
17363e88cbb0SAlex Deucher 	dcn31_calculate_wm_and_dlg_fp(dc, context, pipes, pipe_cnt, vlevel);
17373e88cbb0SAlex Deucher 	DC_FP_END();
17383e88cbb0SAlex Deucher }
17393e88cbb0SAlex Deucher 
17407324d02aSMelissa Wen void
dcn31_populate_dml_writeback_from_context(struct dc * dc,struct resource_context * res_ctx,display_e2e_pipe_params_st * pipes)17417324d02aSMelissa Wen dcn31_populate_dml_writeback_from_context(struct dc *dc,
17427324d02aSMelissa Wen 					  struct resource_context *res_ctx,
17437324d02aSMelissa Wen 					  display_e2e_pipe_params_st *pipes)
17447324d02aSMelissa Wen {
17457324d02aSMelissa Wen 	DC_FP_START();
17467324d02aSMelissa Wen 	dcn30_populate_dml_writeback_from_context(dc, res_ctx, pipes);
17477324d02aSMelissa Wen 	DC_FP_END();
17487324d02aSMelissa Wen }
17497324d02aSMelissa Wen 
17507324d02aSMelissa Wen void
dcn31_set_mcif_arb_params(struct dc * dc,struct dc_state * context,display_e2e_pipe_params_st * pipes,int pipe_cnt)17517324d02aSMelissa Wen dcn31_set_mcif_arb_params(struct dc *dc,
17527324d02aSMelissa Wen 			  struct dc_state *context,
17537324d02aSMelissa Wen 			  display_e2e_pipe_params_st *pipes,
17547324d02aSMelissa Wen 			  int pipe_cnt)
17557324d02aSMelissa Wen {
17567324d02aSMelissa Wen 	DC_FP_START();
17577324d02aSMelissa Wen 	dcn30_set_mcif_arb_params(dc, context, pipes, pipe_cnt);
17587324d02aSMelissa Wen 	DC_FP_END();
17597324d02aSMelissa Wen }
17607324d02aSMelissa Wen 
dcn31_validate_bandwidth(struct dc * dc,struct dc_state * context,enum dc_validate_mode validate_mode)1761*4465dd0eSDillon Varone enum dc_status dcn31_validate_bandwidth(struct dc *dc,
1762bc204778SMichael Strauss 		struct dc_state *context,
1763bc204778SMichael Strauss 		enum dc_validate_mode validate_mode)
1764bc204778SMichael Strauss {
1765bc204778SMichael Strauss 	bool out = false;
1766bc204778SMichael Strauss 
1767bc204778SMichael Strauss 	BW_VAL_TRACE_SETUP();
1768bc204778SMichael Strauss 
1769bc204778SMichael Strauss 	int vlevel = 0;
1770bc204778SMichael Strauss 	int pipe_cnt = 0;
1771934cb529SEthan Carter Edwards 	display_e2e_pipe_params_st *pipes = kcalloc(dc->res_pool->pipe_count,
1772934cb529SEthan Carter Edwards 			sizeof(display_e2e_pipe_params_st), GFP_KERNEL);
1773bc204778SMichael Strauss 	DC_LOGGER_INIT(dc->ctx->logger);
1774bc204778SMichael Strauss 
1775bc204778SMichael Strauss 	BW_VAL_TRACE_COUNT();
1776bc204778SMichael Strauss 
17778e65a1b7SHersen Wu 	if (!pipes)
17788e65a1b7SHersen Wu 		goto validate_fail;
17798e65a1b7SHersen Wu 
178050e6cb3fSCHANDAN VURDIGERE NATARAJ 	DC_FP_START();
178171c4ca2dSNasir Osman 	out = dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, validate_mode, true);
178250e6cb3fSCHANDAN VURDIGERE NATARAJ 	DC_FP_END();
1783bc204778SMichael Strauss 
1784713537e3SRodrigo Siqueira 	// Disable DC_VALIDATE_MODE_ONLY and DC_VALIDATE_MODE_AND_STATE_INDEX to set min dcfclk in calculate_wm_and_dlg
1785bc204778SMichael Strauss 	if (pipe_cnt == 0)
1786bc204778SMichael Strauss 		validate_mode = DC_VALIDATE_MODE_AND_PROGRAMMING;
1787bc204778SMichael Strauss 
1788bc204778SMichael Strauss 	if (!out)
1789bc204778SMichael Strauss 		goto validate_fail;
1790bc204778SMichael Strauss 
1791bc204778SMichael Strauss 	BW_VAL_TRACE_END_VOLTAGE_LEVEL();
1792bc204778SMichael Strauss 
1793bc204778SMichael Strauss 	if (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING) {
1794bc204778SMichael Strauss 		BW_VAL_TRACE_SKIP(fast);
1795bc204778SMichael Strauss 		goto validate_out;
1796bc204778SMichael Strauss 	}
1797f7d0157bSCharlene Liu 	if (dc->res_pool->funcs->calculate_wm_and_dlg)
1798bc204778SMichael Strauss 		dc->res_pool->funcs->calculate_wm_and_dlg(dc, context, pipes, pipe_cnt, vlevel);
1799bc204778SMichael Strauss 
1800bc204778SMichael Strauss 	BW_VAL_TRACE_END_WATERMARKS();
1801bc204778SMichael Strauss 
1802bc204778SMichael Strauss 	goto validate_out;
1803bc204778SMichael Strauss 
1804bc204778SMichael Strauss validate_fail:
1805f9e476c5SColin Ian King 	DC_LOG_WARNING("Mode Validation Warning: %s failed validation.\n",
1806bc204778SMichael Strauss 		dml_get_status_message(context->bw_ctx.dml.vba.ValidationStatus[context->bw_ctx.dml.vba.soc.num_states]));
1807bc204778SMichael Strauss 
1808bc204778SMichael Strauss 	BW_VAL_TRACE_SKIP(fail);
1809bc204778SMichael Strauss 	out = false;
1810bc204778SMichael Strauss 
1811bc204778SMichael Strauss validate_out:
1812bc204778SMichael Strauss 	kfree(pipes);
1813bc204778SMichael Strauss 
1814bc204778SMichael Strauss 	BW_VAL_TRACE_FINISH();
1815bc204778SMichael Strauss 
1816*4465dd0eSDillon Varone 	return out ? DC_OK : DC_FAIL_BANDWIDTH_VALIDATE;
1817bc204778SMichael Strauss }
1818bc204778SMichael Strauss 
dcn31_get_panel_config_defaults(struct dc_panel_config * panel_config)18191178ac68SIan Chen static void dcn31_get_panel_config_defaults(struct dc_panel_config *panel_config)
18201178ac68SIan Chen {
18211178ac68SIan Chen 	*panel_config = panel_config_defaults;
18221178ac68SIan Chen }
18231178ac68SIan Chen 
18242083640fSNicholas Kazlauskas static struct dc_cap_funcs cap_funcs = {
18252083640fSNicholas Kazlauskas 	.get_dcc_compression_cap = dcn20_get_dcc_compression_cap
18262083640fSNicholas Kazlauskas };
18272083640fSNicholas Kazlauskas 
18282083640fSNicholas Kazlauskas static struct resource_funcs dcn31_res_pool_funcs = {
18292083640fSNicholas Kazlauskas 	.destroy = dcn31_destroy_resource_pool,
18302083640fSNicholas Kazlauskas 	.link_enc_create = dcn31_link_encoder_create,
18312083640fSNicholas Kazlauskas 	.link_enc_create_minimal = dcn31_link_enc_create_minimal,
18322083640fSNicholas Kazlauskas 	.link_encs_assign = link_enc_cfg_link_encs_assign,
18332083640fSNicholas Kazlauskas 	.link_enc_unassign = link_enc_cfg_link_enc_unassign,
18342083640fSNicholas Kazlauskas 	.panel_cntl_create = dcn31_panel_cntl_create,
1835bc204778SMichael Strauss 	.validate_bandwidth = dcn31_validate_bandwidth,
18362083640fSNicholas Kazlauskas 	.calculate_wm_and_dlg = dcn31_calculate_wm_and_dlg,
18372083640fSNicholas Kazlauskas 	.update_soc_for_wm_a = dcn31_update_soc_for_wm_a,
18382083640fSNicholas Kazlauskas 	.populate_dml_pipes = dcn31_populate_dml_pipes_from_context,
1839198f0e89SWenjing Liu 	.acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
184021741810SWenjing Liu 	.release_pipe = dcn20_release_pipe,
18412083640fSNicholas Kazlauskas 	.add_stream_to_ctx = dcn30_add_stream_to_ctx,
18422083640fSNicholas Kazlauskas 	.add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
18432083640fSNicholas Kazlauskas 	.remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
18447324d02aSMelissa Wen 	.populate_dml_writeback_from_context = dcn31_populate_dml_writeback_from_context,
18457324d02aSMelissa Wen 	.set_mcif_arb_params = dcn31_set_mcif_arb_params,
18462083640fSNicholas Kazlauskas 	.find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
18472083640fSNicholas Kazlauskas 	.acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
18482083640fSNicholas Kazlauskas 	.release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
18492083640fSNicholas Kazlauskas 	.update_bw_bounding_box = dcn31_update_bw_bounding_box,
18502083640fSNicholas Kazlauskas 	.patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
18511178ac68SIan Chen 	.get_panel_config_defaults = dcn31_get_panel_config_defaults,
18526a7fd76bSSung Lee 	.get_det_buffer_size = dcn31_get_det_buffer_size,
185363ab80d9SRafal Ostrowski 	.get_vstartup_for_pipe = dcn10_get_vstartup_for_pipe,
18542083640fSNicholas Kazlauskas 	.update_dc_state_for_encoder_switch = dcn31_update_dc_state_for_encoder_switch,
18552083640fSNicholas Kazlauskas 	.build_pipe_pix_clk_params = dcn20_build_pipe_pix_clk_params
18562083640fSNicholas Kazlauskas };
18572083640fSNicholas Kazlauskas 
dcn30_clock_source_create(struct dc_context * ctx,struct dc_bios * bios,enum clock_source_id id,const struct dce110_clk_src_regs * regs,bool dp_clk_src)18582083640fSNicholas Kazlauskas static struct clock_source *dcn30_clock_source_create(
18592083640fSNicholas Kazlauskas 		struct dc_context *ctx,
18602083640fSNicholas Kazlauskas 		struct dc_bios *bios,
18612083640fSNicholas Kazlauskas 		enum clock_source_id id,
18622083640fSNicholas Kazlauskas 		const struct dce110_clk_src_regs *regs,
18632083640fSNicholas Kazlauskas 		bool dp_clk_src)
18642083640fSNicholas Kazlauskas {
18652083640fSNicholas Kazlauskas 	struct dce110_clk_src *clk_src =
18662083640fSNicholas Kazlauskas 		kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
18672083640fSNicholas Kazlauskas 
18682083640fSNicholas Kazlauskas 	if (!clk_src)
1869df5a07c4SHansen Dsouza 		return NULL;
18702083640fSNicholas Kazlauskas 
18712083640fSNicholas Kazlauskas 	if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
18722083640fSNicholas Kazlauskas 			regs, &cs_shift, &cs_mask)) {
18732083640fSNicholas Kazlauskas 		clk_src->base.dp_clk_src = dp_clk_src;
18742083640fSNicholas Kazlauskas 		return &clk_src->base;
1875674704a5SHersen Wu 	}
18762083640fSNicholas Kazlauskas 
18772083640fSNicholas Kazlauskas 	kfree(clk_src);
18782083640fSNicholas Kazlauskas 	BREAK_TO_DEBUGGER();
18792083640fSNicholas Kazlauskas 	return NULL;
18802083640fSNicholas Kazlauskas }
18812083640fSNicholas Kazlauskas 
dcn31_resource_construct(uint8_t num_virtual_links,struct dc * dc,struct dcn31_resource_pool * pool)18822083640fSNicholas Kazlauskas static bool dcn31_resource_construct(
18832083640fSNicholas Kazlauskas 	uint8_t num_virtual_links,
18842083640fSNicholas Kazlauskas 	struct dc *dc,
18852083640fSNicholas Kazlauskas 	struct dcn31_resource_pool *pool)
18862083640fSNicholas Kazlauskas {
18872083640fSNicholas Kazlauskas 	int i;
18882083640fSNicholas Kazlauskas 	struct dc_context *ctx = dc->ctx;
18892083640fSNicholas Kazlauskas 	struct irq_service_init_data init_data;
18902083640fSNicholas Kazlauskas 
18912083640fSNicholas Kazlauskas 	ctx->dc_bios->regs = &bios_regs;
18922083640fSNicholas Kazlauskas 
18932083640fSNicholas Kazlauskas 	pool->base.res_cap = &res_cap_dcn31;
18942083640fSNicholas Kazlauskas 
18952083640fSNicholas Kazlauskas 	pool->base.funcs = &dcn31_res_pool_funcs;
18962083640fSNicholas Kazlauskas 
18972083640fSNicholas Kazlauskas 	/*************************************************
18982083640fSNicholas Kazlauskas 	 *  Resource + asic cap harcoding                *
18992083640fSNicholas Kazlauskas 	 *************************************************/
19002083640fSNicholas Kazlauskas 	pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
19012083640fSNicholas Kazlauskas 	pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
19022083640fSNicholas Kazlauskas 	pool->base.mpcc_count = pool->base.res_cap->num_timing_generator;
19032083640fSNicholas Kazlauskas 	dc->caps.max_downscale_ratio = 600;
19042083640fSNicholas Kazlauskas 	dc->caps.i2c_speed_in_khz = 100;
19052083640fSNicholas Kazlauskas 	dc->caps.i2c_speed_in_khz_hdcp = 5; /*1.4 w/a applied by default*/
19062083640fSNicholas Kazlauskas 	dc->caps.max_cursor_size = 256;
19072083640fSNicholas Kazlauskas 	dc->caps.min_horizontal_blanking_period = 80;
1908e9ebc23bSKrunoslav Kovac 	dc->caps.dmdata_alloc_size = 2048;
1909e9ebc23bSKrunoslav Kovac 
1910e9ebc23bSKrunoslav Kovac 	dc->caps.max_slave_planes = 2;
19112083640fSNicholas Kazlauskas 	dc->caps.max_slave_yuv_planes = 2;
19122083640fSNicholas Kazlauskas 	dc->caps.max_slave_rgb_planes = 2;
1913da339aa4SLeo Chen 	dc->caps.post_blend_color_processing = true;
1914da339aa4SLeo Chen 	dc->caps.force_dp_tps4_for_cp2520 = true;
1915f01ee019SFangzhi Zuo 	if (dc->config.forceHBR2CP2520)
1916068ab0cdSHamza Mahfooz 		dc->caps.force_dp_tps4_for_cp2520 = false;
19172665f63aSMikita Lipski 	dc->caps.dp_hpo = true;
19182083640fSNicholas Kazlauskas 	dc->caps.dp_hdmi21_pcon_support = true;
19192083640fSNicholas Kazlauskas 	dc->caps.edp_dsc_support = true;
19202083640fSNicholas Kazlauskas 	dc->caps.extended_aux_timeout_support = true;
1921e5fc7825SGabe Teeger 	dc->caps.dmcub_support = true;
19222083640fSNicholas Kazlauskas 	dc->caps.is_apu = true;
19232083640fSNicholas Kazlauskas 	dc->caps.zstate_support = true;
19242083640fSNicholas Kazlauskas 
19252083640fSNicholas Kazlauskas 	/* Color pipeline capabilities */
19262083640fSNicholas Kazlauskas 	dc->caps.color.dpp.dcn_arch = 1;
19272083640fSNicholas Kazlauskas 	dc->caps.color.dpp.input_lut_shared = 0;
19282083640fSNicholas Kazlauskas 	dc->caps.color.dpp.icsc = 1;
19292083640fSNicholas Kazlauskas 	dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
19302083640fSNicholas Kazlauskas 	dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
19312083640fSNicholas Kazlauskas 	dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
19322083640fSNicholas Kazlauskas 	dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
19332083640fSNicholas Kazlauskas 	dc->caps.color.dpp.dgam_rom_caps.pq = 1;
19342083640fSNicholas Kazlauskas 	dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
19352083640fSNicholas Kazlauskas 	dc->caps.color.dpp.post_csc = 1;
19362083640fSNicholas Kazlauskas 	dc->caps.color.dpp.gamma_corr = 1;
19372083640fSNicholas Kazlauskas 	dc->caps.color.dpp.dgam_rom_for_yuv = 0;
19382083640fSNicholas Kazlauskas 
19392083640fSNicholas Kazlauskas 	dc->caps.color.dpp.hw_3d_lut = 1;
19402083640fSNicholas Kazlauskas 	dc->caps.color.dpp.ogam_ram = 1;
19412083640fSNicholas Kazlauskas 	// no OGAM ROM on DCN301
19422083640fSNicholas Kazlauskas 	dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
19432083640fSNicholas Kazlauskas 	dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
19442083640fSNicholas Kazlauskas 	dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
19452083640fSNicholas Kazlauskas 	dc->caps.color.dpp.ogam_rom_caps.pq = 0;
19462083640fSNicholas Kazlauskas 	dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
19472083640fSNicholas Kazlauskas 	dc->caps.color.dpp.ocsc = 0;
19482083640fSNicholas Kazlauskas 
19492083640fSNicholas Kazlauskas 	dc->caps.color.mpc.gamut_remap = 1;
19502083640fSNicholas Kazlauskas 	dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //2
19512083640fSNicholas Kazlauskas 	dc->caps.color.mpc.ogam_ram = 1;
19522083640fSNicholas Kazlauskas 	dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
19532083640fSNicholas Kazlauskas 	dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
19542083640fSNicholas Kazlauskas 	dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
19552083640fSNicholas Kazlauskas 	dc->caps.color.mpc.ogam_rom_caps.pq = 0;
19562083640fSNicholas Kazlauskas 	dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
1957a896f870SMeenakshikumar Somasundaram 	dc->caps.color.mpc.ocsc = 1;
1958a896f870SMeenakshikumar Somasundaram 
19594ccc8fdcSAlvin Lee 	dc->caps.num_of_host_routers = 2;
1960a896f870SMeenakshikumar Somasundaram 	dc->caps.num_of_dpias_per_host_router = 2;
1961ba18f235SWesley Chalmers 
1962ba18f235SWesley Chalmers 	/* Use pipe context based otg sync logic */
1963ba18f235SWesley Chalmers 	dc->config.use_pipe_ctx_sync_logic = true;
1964ba18f235SWesley Chalmers 	dc->config.disable_hbr_audio_dp2 = true;
1965ba18f235SWesley Chalmers 
1966ba18f235SWesley Chalmers 	/* read VBIOS LTTPR caps */
1967ba18f235SWesley Chalmers 	{
1968ba18f235SWesley Chalmers 		if (ctx->dc_bios->funcs->get_lttpr_caps) {
1969ba18f235SWesley Chalmers 			enum bp_result bp_query_result;
1970ba18f235SWesley Chalmers 			uint8_t is_vbios_lttpr_enable = 0;
1971ba18f235SWesley Chalmers 
1972ba18f235SWesley Chalmers 			bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
1973ba18f235SWesley Chalmers 			dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
1974ba18f235SWesley Chalmers 		}
1975ba18f235SWesley Chalmers 
1976ba18f235SWesley Chalmers 		/* interop bit is implicit */
19772083640fSNicholas Kazlauskas 		{
19782083640fSNicholas Kazlauskas 			dc->caps.vbios_lttpr_aware = true;
197925879d7bSQingqing Zhuo 		}
19802083640fSNicholas Kazlauskas 	}
19812083640fSNicholas Kazlauskas 
19822083640fSNicholas Kazlauskas 	if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
19832083640fSNicholas Kazlauskas 		dc->debug = debug_defaults_drv;
19842083640fSNicholas Kazlauskas 
19852083640fSNicholas Kazlauskas 	// Init the vm_helper
19862083640fSNicholas Kazlauskas 	if (dc->vm_helper)
19872083640fSNicholas Kazlauskas 		vm_helper_init(dc->vm_helper, 16);
19882083640fSNicholas Kazlauskas 
19892083640fSNicholas Kazlauskas 	/*************************************************
19902083640fSNicholas Kazlauskas 	 *  Create resources                             *
19912083640fSNicholas Kazlauskas 	 *************************************************/
19922083640fSNicholas Kazlauskas 
19932083640fSNicholas Kazlauskas 	/* Clock Sources for Pixel Clock*/
19942083640fSNicholas Kazlauskas 	pool->base.clock_sources[DCN31_CLK_SRC_PLL0] =
19952083640fSNicholas Kazlauskas 			dcn30_clock_source_create(ctx, ctx->dc_bios,
19962083640fSNicholas Kazlauskas 				CLOCK_SOURCE_COMBO_PHY_PLL0,
1997bf252ce1SCharlene Liu 				&clk_src_regs[0], false);
1998bf252ce1SCharlene Liu 	pool->base.clock_sources[DCN31_CLK_SRC_PLL1] =
1999bf252ce1SCharlene Liu 			dcn30_clock_source_create(ctx, ctx->dc_bios,
2000bf252ce1SCharlene Liu 				CLOCK_SOURCE_COMBO_PHY_PLL1,
2001bf252ce1SCharlene Liu 				&clk_src_regs[1], false);
2002bf252ce1SCharlene Liu 	/*move phypllx_pixclk_resync to dmub next*/
2003bf252ce1SCharlene Liu 	if (dc->ctx->asic_id.hw_internal_rev == YELLOW_CARP_B0) {
2004bf252ce1SCharlene Liu 		pool->base.clock_sources[DCN31_CLK_SRC_PLL2] =
2005bf252ce1SCharlene Liu 			dcn30_clock_source_create(ctx, ctx->dc_bios,
2006bf252ce1SCharlene Liu 				CLOCK_SOURCE_COMBO_PHY_PLL2,
2007bf252ce1SCharlene Liu 				&clk_src_regs_b0[2], false);
20082083640fSNicholas Kazlauskas 		pool->base.clock_sources[DCN31_CLK_SRC_PLL3] =
20092083640fSNicholas Kazlauskas 			dcn30_clock_source_create(ctx, ctx->dc_bios,
20102083640fSNicholas Kazlauskas 				CLOCK_SOURCE_COMBO_PHY_PLL3,
20112083640fSNicholas Kazlauskas 				&clk_src_regs_b0[3], false);
20122083640fSNicholas Kazlauskas 	} else {
20132083640fSNicholas Kazlauskas 		pool->base.clock_sources[DCN31_CLK_SRC_PLL2] =
20142083640fSNicholas Kazlauskas 			dcn30_clock_source_create(ctx, ctx->dc_bios,
20152083640fSNicholas Kazlauskas 				CLOCK_SOURCE_COMBO_PHY_PLL2,
2016bf252ce1SCharlene Liu 				&clk_src_regs[2], false);
2017bf252ce1SCharlene Liu 		pool->base.clock_sources[DCN31_CLK_SRC_PLL3] =
20182083640fSNicholas Kazlauskas 			dcn30_clock_source_create(ctx, ctx->dc_bios,
20192083640fSNicholas Kazlauskas 				CLOCK_SOURCE_COMBO_PHY_PLL3,
20202083640fSNicholas Kazlauskas 				&clk_src_regs[3], false);
20212083640fSNicholas Kazlauskas 	}
20222083640fSNicholas Kazlauskas 
20232083640fSNicholas Kazlauskas 	pool->base.clock_sources[DCN31_CLK_SRC_PLL4] =
20242083640fSNicholas Kazlauskas 			dcn30_clock_source_create(ctx, ctx->dc_bios,
20252083640fSNicholas Kazlauskas 				CLOCK_SOURCE_COMBO_PHY_PLL4,
20262083640fSNicholas Kazlauskas 				&clk_src_regs[4], false);
20272083640fSNicholas Kazlauskas 
20282083640fSNicholas Kazlauskas 	pool->base.clk_src_count = DCN30_CLK_SRC_TOTAL;
20292083640fSNicholas Kazlauskas 
20302083640fSNicholas Kazlauskas 	/* todo: not reuse phy_pll registers */
20312083640fSNicholas Kazlauskas 	pool->base.dp_clock_source =
20322083640fSNicholas Kazlauskas 			dcn31_clock_source_create(ctx, ctx->dc_bios,
20332083640fSNicholas Kazlauskas 				CLOCK_SOURCE_ID_DP_DTO,
20342083640fSNicholas Kazlauskas 				&clk_src_regs[0], true);
20352083640fSNicholas Kazlauskas 
20362083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.clk_src_count; i++) {
20372083640fSNicholas Kazlauskas 		if (pool->base.clock_sources[i] == NULL) {
20382083640fSNicholas Kazlauskas 			dm_error("DC: failed to create clock sources!\n");
20392083640fSNicholas Kazlauskas 			BREAK_TO_DEBUGGER();
20402083640fSNicholas Kazlauskas 			goto create_fail;
20412083640fSNicholas Kazlauskas 		}
20422083640fSNicholas Kazlauskas 	}
20432083640fSNicholas Kazlauskas 
20442083640fSNicholas Kazlauskas 	/* TODO: DCCG */
20452083640fSNicholas Kazlauskas 	pool->base.dccg = dccg31_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
20462083640fSNicholas Kazlauskas 	if (pool->base.dccg == NULL) {
20472083640fSNicholas Kazlauskas 		dm_error("DC: failed to create dccg!\n");
20482083640fSNicholas Kazlauskas 		BREAK_TO_DEBUGGER();
20492083640fSNicholas Kazlauskas 		goto create_fail;
20502083640fSNicholas Kazlauskas 	}
20512083640fSNicholas Kazlauskas 
20522083640fSNicholas Kazlauskas 	/* TODO: IRQ */
20532083640fSNicholas Kazlauskas 	init_data.ctx = dc->ctx;
20542083640fSNicholas Kazlauskas 	pool->base.irqs = dal_irq_service_dcn31_create(&init_data);
20552083640fSNicholas Kazlauskas 	if (!pool->base.irqs)
20562083640fSNicholas Kazlauskas 		goto create_fail;
20572083640fSNicholas Kazlauskas 
20582083640fSNicholas Kazlauskas 	/* HUBBUB */
20592083640fSNicholas Kazlauskas 	pool->base.hubbub = dcn31_hubbub_create(ctx);
20602083640fSNicholas Kazlauskas 	if (pool->base.hubbub == NULL) {
20612083640fSNicholas Kazlauskas 		BREAK_TO_DEBUGGER();
20622083640fSNicholas Kazlauskas 		dm_error("DC: failed to create hubbub!\n");
20632083640fSNicholas Kazlauskas 		goto create_fail;
20642083640fSNicholas Kazlauskas 	}
20652083640fSNicholas Kazlauskas 
20662083640fSNicholas Kazlauskas 	/* HUBPs, DPPs, OPPs and TGs */
20672083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.pipe_count; i++) {
20682083640fSNicholas Kazlauskas 		pool->base.hubps[i] = dcn31_hubp_create(ctx, i);
20692083640fSNicholas Kazlauskas 		if (pool->base.hubps[i] == NULL) {
20702083640fSNicholas Kazlauskas 			BREAK_TO_DEBUGGER();
20712083640fSNicholas Kazlauskas 			dm_error(
20722083640fSNicholas Kazlauskas 				"DC: failed to create hubps!\n");
20732083640fSNicholas Kazlauskas 			goto create_fail;
20742083640fSNicholas Kazlauskas 		}
20752083640fSNicholas Kazlauskas 
20762083640fSNicholas Kazlauskas 		pool->base.dpps[i] = dcn31_dpp_create(ctx, i);
20772083640fSNicholas Kazlauskas 		if (pool->base.dpps[i] == NULL) {
20782083640fSNicholas Kazlauskas 			BREAK_TO_DEBUGGER();
20792083640fSNicholas Kazlauskas 			dm_error(
20802083640fSNicholas Kazlauskas 				"DC: failed to create dpps!\n");
20812083640fSNicholas Kazlauskas 			goto create_fail;
20822083640fSNicholas Kazlauskas 		}
20832083640fSNicholas Kazlauskas 	}
20842083640fSNicholas Kazlauskas 
20852083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.res_cap->num_opp; i++) {
20862083640fSNicholas Kazlauskas 		pool->base.opps[i] = dcn31_opp_create(ctx, i);
20872083640fSNicholas Kazlauskas 		if (pool->base.opps[i] == NULL) {
20882083640fSNicholas Kazlauskas 			BREAK_TO_DEBUGGER();
20892083640fSNicholas Kazlauskas 			dm_error(
20902083640fSNicholas Kazlauskas 				"DC: failed to create output pixel processor!\n");
20912083640fSNicholas Kazlauskas 			goto create_fail;
20922083640fSNicholas Kazlauskas 		}
20932083640fSNicholas Kazlauskas 	}
20942083640fSNicholas Kazlauskas 
20952083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
20962083640fSNicholas Kazlauskas 		pool->base.timing_generators[i] = dcn31_timing_generator_create(
20972083640fSNicholas Kazlauskas 				ctx, i);
20982083640fSNicholas Kazlauskas 		if (pool->base.timing_generators[i] == NULL) {
20992083640fSNicholas Kazlauskas 			BREAK_TO_DEBUGGER();
21002083640fSNicholas Kazlauskas 			dm_error("DC: failed to create tg!\n");
21012083640fSNicholas Kazlauskas 			goto create_fail;
21022083640fSNicholas Kazlauskas 		}
21032083640fSNicholas Kazlauskas 	}
21042083640fSNicholas Kazlauskas 	pool->base.timing_generator_count = i;
21052083640fSNicholas Kazlauskas 
21062083640fSNicholas Kazlauskas 	/* PSR */
21072083640fSNicholas Kazlauskas 	pool->base.psr = dmub_psr_create(ctx);
21082083640fSNicholas Kazlauskas 	if (pool->base.psr == NULL) {
2109c7ddc0a8SBhawanpreet Lakha 		dm_error("DC: failed to create psr obj!\n");
2110c7ddc0a8SBhawanpreet Lakha 		BREAK_TO_DEBUGGER();
2111c7ddc0a8SBhawanpreet Lakha 		goto create_fail;
2112c7ddc0a8SBhawanpreet Lakha 	}
2113c7ddc0a8SBhawanpreet Lakha 
2114c7ddc0a8SBhawanpreet Lakha 	/* Replay */
2115c7ddc0a8SBhawanpreet Lakha 	pool->base.replay = dmub_replay_create(ctx);
2116c7ddc0a8SBhawanpreet Lakha 	if (pool->base.replay == NULL) {
21172083640fSNicholas Kazlauskas 		dm_error("DC: failed to create replay obj!\n");
21182083640fSNicholas Kazlauskas 		BREAK_TO_DEBUGGER();
21192083640fSNicholas Kazlauskas 		goto create_fail;
21202083640fSNicholas Kazlauskas 	}
21212083640fSNicholas Kazlauskas 
21222083640fSNicholas Kazlauskas 	/* ABM */
21232083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
21242083640fSNicholas Kazlauskas 		pool->base.multiple_abms[i] = dmub_abm_create(ctx,
21252083640fSNicholas Kazlauskas 				&abm_regs[i],
21262083640fSNicholas Kazlauskas 				&abm_shift,
21272083640fSNicholas Kazlauskas 				&abm_mask);
21282083640fSNicholas Kazlauskas 		if (pool->base.multiple_abms[i] == NULL) {
21292083640fSNicholas Kazlauskas 			dm_error("DC: failed to create abm for pipe %d!\n", i);
21302083640fSNicholas Kazlauskas 			BREAK_TO_DEBUGGER();
21312083640fSNicholas Kazlauskas 			goto create_fail;
21322083640fSNicholas Kazlauskas 		}
21332083640fSNicholas Kazlauskas 	}
21342083640fSNicholas Kazlauskas 
21352083640fSNicholas Kazlauskas 	/* MPC and DSC */
21362083640fSNicholas Kazlauskas 	pool->base.mpc = dcn31_mpc_create(ctx, pool->base.mpcc_count, pool->base.res_cap->num_mpc_3dlut);
21372083640fSNicholas Kazlauskas 	if (pool->base.mpc == NULL) {
21382083640fSNicholas Kazlauskas 		BREAK_TO_DEBUGGER();
21392083640fSNicholas Kazlauskas 		dm_error("DC: failed to create mpc!\n");
21402083640fSNicholas Kazlauskas 		goto create_fail;
21412083640fSNicholas Kazlauskas 	}
21422083640fSNicholas Kazlauskas 
21432083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
21442083640fSNicholas Kazlauskas 		pool->base.dscs[i] = dcn31_dsc_create(ctx, i);
21452083640fSNicholas Kazlauskas 		if (pool->base.dscs[i] == NULL) {
21462083640fSNicholas Kazlauskas 			BREAK_TO_DEBUGGER();
21472083640fSNicholas Kazlauskas 			dm_error("DC: failed to create display stream compressor %d!\n", i);
21482083640fSNicholas Kazlauskas 			goto create_fail;
21492083640fSNicholas Kazlauskas 		}
21502083640fSNicholas Kazlauskas 	}
21512083640fSNicholas Kazlauskas 
21522083640fSNicholas Kazlauskas 	/* DWB and MMHUBBUB */
21532083640fSNicholas Kazlauskas 	if (!dcn31_dwbc_create(ctx, &pool->base)) {
21542083640fSNicholas Kazlauskas 		BREAK_TO_DEBUGGER();
21552083640fSNicholas Kazlauskas 		dm_error("DC: failed to create dwbc!\n");
21562083640fSNicholas Kazlauskas 		goto create_fail;
21572083640fSNicholas Kazlauskas 	}
21582083640fSNicholas Kazlauskas 
21592083640fSNicholas Kazlauskas 	if (!dcn31_mmhubbub_create(ctx, &pool->base)) {
21602083640fSNicholas Kazlauskas 		BREAK_TO_DEBUGGER();
21612083640fSNicholas Kazlauskas 		dm_error("DC: failed to create mcif_wb!\n");
21622083640fSNicholas Kazlauskas 		goto create_fail;
21632083640fSNicholas Kazlauskas 	}
21642083640fSNicholas Kazlauskas 
21652083640fSNicholas Kazlauskas 	/* AUX and I2C */
21662083640fSNicholas Kazlauskas 	for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
21672083640fSNicholas Kazlauskas 		pool->base.engines[i] = dcn31_aux_engine_create(ctx, i);
21682083640fSNicholas Kazlauskas 		if (pool->base.engines[i] == NULL) {
21692083640fSNicholas Kazlauskas 			BREAK_TO_DEBUGGER();
21702083640fSNicholas Kazlauskas 			dm_error(
21712083640fSNicholas Kazlauskas 				"DC:failed to create aux engine!!\n");
21722083640fSNicholas Kazlauskas 			goto create_fail;
21732083640fSNicholas Kazlauskas 		}
21742083640fSNicholas Kazlauskas 		pool->base.hw_i2cs[i] = dcn31_i2c_hw_create(ctx, i);
21752083640fSNicholas Kazlauskas 		if (pool->base.hw_i2cs[i] == NULL) {
21762083640fSNicholas Kazlauskas 			BREAK_TO_DEBUGGER();
21772083640fSNicholas Kazlauskas 			dm_error(
21782083640fSNicholas Kazlauskas 				"DC:failed to create hw i2c!!\n");
21799fa0fb77SMeenakshikumar Somasundaram 			goto create_fail;
2180b0ce6272SMeenakshikumar Somasundaram 		}
2181b0ce6272SMeenakshikumar Somasundaram 		pool->base.sw_i2cs[i] = NULL;
21829fa0fb77SMeenakshikumar Somasundaram 	}
21839fa0fb77SMeenakshikumar Somasundaram 
21849fa0fb77SMeenakshikumar Somasundaram 	if (dc->ctx->asic_id.chip_family == FAMILY_YELLOW_CARP &&
21859fa0fb77SMeenakshikumar Somasundaram 	    dc->ctx->asic_id.hw_internal_rev == YELLOW_CARP_B0 &&
218608ebadfcSYifan Zhang 	    !dc->debug.dpia_debug.bits.disable_dpia) {
2187ee7b62e1SRoman Li 		/* YELLOW CARP B0 has 4 DPIA's */
2188ee7b62e1SRoman Li 		pool->base.usb4_dpia_count = 4;
21892083640fSNicholas Kazlauskas 	}
21902083640fSNicholas Kazlauskas 
219125879d7bSQingqing Zhuo 	if (dc->ctx->asic_id.chip_family == AMDGPU_FAMILY_GC_11_0_1)
21922083640fSNicholas Kazlauskas 		pool->base.usb4_dpia_count = 4;
21932083640fSNicholas Kazlauskas 
21942083640fSNicholas Kazlauskas 	/* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */
21952083640fSNicholas Kazlauskas 	if (!resource_construct(num_virtual_links, dc, &pool->base,
21962083640fSNicholas Kazlauskas 			&res_create_funcs))
21972083640fSNicholas Kazlauskas 		goto create_fail;
21982083640fSNicholas Kazlauskas 
21992083640fSNicholas Kazlauskas 	/* HW Sequencer and Plane caps */
22002083640fSNicholas Kazlauskas 	dcn31_hw_sequencer_construct(dc);
22012083640fSNicholas Kazlauskas 
22022083640fSNicholas Kazlauskas 	dc->caps.max_planes =  pool->base.pipe_count;
22032083640fSNicholas Kazlauskas 
22045fdccd5bSMichael Strauss 	for (i = 0; i < dc->caps.max_planes; ++i)
22055fdccd5bSMichael Strauss 		dc->caps.planes[i] = plane_cap;
22062083640fSNicholas Kazlauskas 
22072083640fSNicholas Kazlauskas 	dc->caps.max_odm_combine_factor = 4;
22082083640fSNicholas Kazlauskas 
22092083640fSNicholas Kazlauskas 	dc->cap_funcs = cap_funcs;
22102083640fSNicholas Kazlauskas 
22112083640fSNicholas Kazlauskas 	dc->dcn_ip->max_num_dpp = dcn3_1_ip.max_num_dpp;
22122083640fSNicholas Kazlauskas 
22132083640fSNicholas Kazlauskas 	return true;
22142083640fSNicholas Kazlauskas 
22152083640fSNicholas Kazlauskas create_fail:
22162083640fSNicholas Kazlauskas 	dcn31_resource_destruct(pool);
22172083640fSNicholas Kazlauskas 
22182083640fSNicholas Kazlauskas 	return false;
22192083640fSNicholas Kazlauskas }
22202083640fSNicholas Kazlauskas 
dcn31_create_resource_pool(const struct dc_init_data * init_data,struct dc * dc)22212083640fSNicholas Kazlauskas struct resource_pool *dcn31_create_resource_pool(
22222083640fSNicholas Kazlauskas 		const struct dc_init_data *init_data,
22232083640fSNicholas Kazlauskas 		struct dc *dc)
22242083640fSNicholas Kazlauskas {
22252083640fSNicholas Kazlauskas 	struct dcn31_resource_pool *pool =
22262083640fSNicholas Kazlauskas 		kzalloc(sizeof(struct dcn31_resource_pool), GFP_KERNEL);
22272083640fSNicholas Kazlauskas 
22282083640fSNicholas Kazlauskas 	if (!pool)
22292083640fSNicholas Kazlauskas 		return NULL;
22302083640fSNicholas Kazlauskas 
2231 	if (dcn31_resource_construct(init_data->num_virtual_links, dc, pool))
2232 		return &pool->base;
2233 
2234 	BREAK_TO_DEBUGGER();
2235 	kfree(pool);
2236 	return NULL;
2237 }
2238 
dcn31_update_dc_state_for_encoder_switch(struct dc_link * link,struct dc_link_settings * link_setting,uint8_t pipe_count,struct pipe_ctx * pipes,struct audio_output * audio_output)2239 enum dc_status dcn31_update_dc_state_for_encoder_switch(struct dc_link *link,
2240 	struct dc_link_settings *link_setting,
2241 	uint8_t pipe_count,
2242 	struct pipe_ctx *pipes,
2243 	struct audio_output *audio_output)
2244 {
2245 	struct dc_state *state = link->dc->current_state;
2246 	int i;
2247 
2248 #if defined(CONFIG_DRM_AMD_DC_FP)
2249 	for (i = 0; i < state->stream_count; i++)
2250 		if (state->streams[i] && state->streams[i]->link && state->streams[i]->link == link)
2251 			link->dc->hwss.calculate_pix_rate_divider((struct dc *)link->dc, state, state->streams[i]);
2252 
2253 	for (i = 0; i < pipe_count; i++) {
2254 		link->dc->res_pool->funcs->build_pipe_pix_clk_params(&pipes[i]);
2255 
2256 		// Setup audio
2257 		if (pipes[i].stream_res.audio != NULL)
2258 			build_audio_output(state, &pipes[i], &audio_output[i]);
2259 	}
2260 #else
2261 	/* This DCN requires rate divider updates and audio reprogramming to allow DP1<-->DP2 link rate switching,
2262 	 * but the above will not compile on architectures without an FPU.
2263 	 */
2264 	DC_LOG_WARNING("%s: DP1<-->DP2 link retraining will not work on this DCN on non-FPU platforms", __func__);
2265 	ASSERT(0);
2266 #endif
2267 
2268 	return DC_OK;
2269 }
2270