xref: /openbsd-src/sys/dev/pci/drm/amd/display/dc/dcn321/dcn321_resource.c (revision 4b0e85add7a765c13fc1270f31ec7d2a745b6489)
11bb76ff1Sjsg // SPDX-License-Identifier: MIT
21bb76ff1Sjsg /*
31bb76ff1Sjsg  * Copyright 2019 Advanced Micro Devices, Inc.
41bb76ff1Sjsg  *
51bb76ff1Sjsg  * Permission is hereby granted, free of charge, to any person obtaining a
61bb76ff1Sjsg  * copy of this software and associated documentation files (the "Software"),
71bb76ff1Sjsg  * to deal in the Software without restriction, including without limitation
81bb76ff1Sjsg  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
91bb76ff1Sjsg  * and/or sell copies of the Software, and to permit persons to whom the
101bb76ff1Sjsg  * Software is furnished to do so, subject to the following conditions:
111bb76ff1Sjsg  *
121bb76ff1Sjsg  * The above copyright notice and this permission notice shall be included in
131bb76ff1Sjsg  * all copies or substantial portions of the Software.
141bb76ff1Sjsg  *
151bb76ff1Sjsg  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
161bb76ff1Sjsg  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
171bb76ff1Sjsg  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
181bb76ff1Sjsg  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
191bb76ff1Sjsg  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
201bb76ff1Sjsg  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
211bb76ff1Sjsg  * OTHER DEALINGS IN THE SOFTWARE.
221bb76ff1Sjsg  *
231bb76ff1Sjsg  * Authors: AMD
241bb76ff1Sjsg  *
251bb76ff1Sjsg  */
261bb76ff1Sjsg 
271bb76ff1Sjsg #include "dm_services.h"
281bb76ff1Sjsg #include "dc.h"
291bb76ff1Sjsg 
301bb76ff1Sjsg #include "dcn32/dcn32_init.h"
311bb76ff1Sjsg 
321bb76ff1Sjsg #include "resource.h"
331bb76ff1Sjsg #include "include/irq_service_interface.h"
341bb76ff1Sjsg #include "dcn32/dcn32_resource.h"
351bb76ff1Sjsg #include "dcn321_resource.h"
361bb76ff1Sjsg 
371bb76ff1Sjsg #include "dcn20/dcn20_resource.h"
381bb76ff1Sjsg #include "dcn30/dcn30_resource.h"
391bb76ff1Sjsg 
401bb76ff1Sjsg #include "dml/dcn321/dcn321_fpu.h"
411bb76ff1Sjsg 
421bb76ff1Sjsg #include "dcn10/dcn10_ipp.h"
431bb76ff1Sjsg #include "dcn30/dcn30_hubbub.h"
441bb76ff1Sjsg #include "dcn31/dcn31_hubbub.h"
451bb76ff1Sjsg #include "dcn32/dcn32_hubbub.h"
461bb76ff1Sjsg #include "dcn32/dcn32_mpc.h"
471bb76ff1Sjsg #include "dcn32/dcn32_hubp.h"
481bb76ff1Sjsg #include "irq/dcn32/irq_service_dcn32.h"
491bb76ff1Sjsg #include "dcn32/dcn32_dpp.h"
501bb76ff1Sjsg #include "dcn32/dcn32_optc.h"
511bb76ff1Sjsg #include "dcn20/dcn20_hwseq.h"
521bb76ff1Sjsg #include "dcn30/dcn30_hwseq.h"
531bb76ff1Sjsg #include "dce110/dce110_hw_sequencer.h"
541bb76ff1Sjsg #include "dcn30/dcn30_opp.h"
551bb76ff1Sjsg #include "dcn20/dcn20_dsc.h"
561bb76ff1Sjsg #include "dcn30/dcn30_vpg.h"
571bb76ff1Sjsg #include "dcn30/dcn30_afmt.h"
581bb76ff1Sjsg #include "dcn30/dcn30_dio_stream_encoder.h"
591bb76ff1Sjsg #include "dcn32/dcn32_dio_stream_encoder.h"
601bb76ff1Sjsg #include "dcn31/dcn31_hpo_dp_stream_encoder.h"
611bb76ff1Sjsg #include "dcn31/dcn31_hpo_dp_link_encoder.h"
621bb76ff1Sjsg #include "dcn32/dcn32_hpo_dp_link_encoder.h"
631bb76ff1Sjsg #include "dcn31/dcn31_apg.h"
641bb76ff1Sjsg #include "dcn31/dcn31_dio_link_encoder.h"
651bb76ff1Sjsg #include "dcn32/dcn32_dio_link_encoder.h"
661bb76ff1Sjsg #include "dcn321_dio_link_encoder.h"
671bb76ff1Sjsg #include "dce/dce_clock_source.h"
681bb76ff1Sjsg #include "dce/dce_audio.h"
691bb76ff1Sjsg #include "dce/dce_hwseq.h"
701bb76ff1Sjsg #include "clk_mgr.h"
711bb76ff1Sjsg #include "virtual/virtual_stream_encoder.h"
721bb76ff1Sjsg #include "dml/display_mode_vba.h"
731bb76ff1Sjsg #include "dcn32/dcn32_dccg.h"
741bb76ff1Sjsg #include "dcn10/dcn10_resource.h"
75f005ef32Sjsg #include "link.h"
761bb76ff1Sjsg #include "dcn31/dcn31_panel_cntl.h"
771bb76ff1Sjsg 
781bb76ff1Sjsg #include "dcn30/dcn30_dwb.h"
791bb76ff1Sjsg #include "dcn32/dcn32_mmhubbub.h"
801bb76ff1Sjsg 
811bb76ff1Sjsg #include "dcn/dcn_3_2_1_offset.h"
821bb76ff1Sjsg #include "dcn/dcn_3_2_1_sh_mask.h"
831bb76ff1Sjsg #include "nbio/nbio_4_3_0_offset.h"
841bb76ff1Sjsg 
851bb76ff1Sjsg #include "reg_helper.h"
861bb76ff1Sjsg #include "dce/dmub_abm.h"
871bb76ff1Sjsg #include "dce/dmub_psr.h"
881bb76ff1Sjsg #include "dce/dce_aux.h"
891bb76ff1Sjsg #include "dce/dce_i2c.h"
901bb76ff1Sjsg 
911bb76ff1Sjsg #include "dml/dcn30/display_mode_vba_30.h"
921bb76ff1Sjsg #include "vm_helper.h"
931bb76ff1Sjsg #include "dcn20/dcn20_vmid.h"
941bb76ff1Sjsg 
951bb76ff1Sjsg #define DC_LOGGER_INIT(logger)
961bb76ff1Sjsg 
971bb76ff1Sjsg enum dcn321_clk_src_array_id {
981bb76ff1Sjsg 	DCN321_CLK_SRC_PLL0,
991bb76ff1Sjsg 	DCN321_CLK_SRC_PLL1,
1001bb76ff1Sjsg 	DCN321_CLK_SRC_PLL2,
1011bb76ff1Sjsg 	DCN321_CLK_SRC_PLL3,
1021bb76ff1Sjsg 	DCN321_CLK_SRC_PLL4,
1031bb76ff1Sjsg 	DCN321_CLK_SRC_TOTAL
1041bb76ff1Sjsg };
1051bb76ff1Sjsg 
1061bb76ff1Sjsg /* begin *********************
1071bb76ff1Sjsg  * macros to expend register list macro defined in HW object header file
1081bb76ff1Sjsg  */
1091bb76ff1Sjsg 
1101bb76ff1Sjsg /* DCN */
1111bb76ff1Sjsg #define BASE_INNER(seg) ctx->dcn_reg_offsets[seg]
1121bb76ff1Sjsg 
1131bb76ff1Sjsg #define BASE(seg) BASE_INNER(seg)
1141bb76ff1Sjsg 
1151bb76ff1Sjsg #define SR(reg_name)\
1161bb76ff1Sjsg 	REG_STRUCT.reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
1171bb76ff1Sjsg 		reg ## reg_name
1181bb76ff1Sjsg #define SR_ARR(reg_name, id)\
1191bb76ff1Sjsg 	REG_STRUCT[id].reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
1201bb76ff1Sjsg 		reg ## reg_name
1211bb76ff1Sjsg #define SR_ARR_INIT(reg_name, id, value)\
1221bb76ff1Sjsg 	REG_STRUCT[id].reg_name =  value
1231bb76ff1Sjsg 
1241bb76ff1Sjsg #define SRI(reg_name, block, id)\
1251bb76ff1Sjsg 	REG_STRUCT.reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
1261bb76ff1Sjsg 		reg ## block ## id ## _ ## reg_name
1271bb76ff1Sjsg 
1281bb76ff1Sjsg #define SRI_ARR(reg_name, block, id)\
1291bb76ff1Sjsg 	REG_STRUCT[id].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
1301bb76ff1Sjsg 		reg ## block ## id ## _ ## reg_name
1311bb76ff1Sjsg 
1321bb76ff1Sjsg #define SR_ARR_I2C(reg_name, id) \
1331bb76ff1Sjsg 	REG_STRUCT[id-1].reg_name = BASE(reg##reg_name##_BASE_IDX) + reg##reg_name
1341bb76ff1Sjsg 
1351bb76ff1Sjsg #define SRI_ARR_I2C(reg_name, block, id)\
1361bb76ff1Sjsg 	REG_STRUCT[id-1].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
1371bb76ff1Sjsg 		reg ## block ## id ## _ ## reg_name
1381bb76ff1Sjsg 
1391bb76ff1Sjsg #define SRI_ARR_ALPHABET(reg_name, block, index, id)\
1401bb76ff1Sjsg 	REG_STRUCT[index].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
1411bb76ff1Sjsg 		reg ## block ## id ## _ ## reg_name
1421bb76ff1Sjsg 
1431bb76ff1Sjsg #define SRI2(reg_name, block, id)\
1441bb76ff1Sjsg 	.reg_name = BASE(reg ## reg_name ## _BASE_IDX) + \
1451bb76ff1Sjsg 		reg ## reg_name
1461bb76ff1Sjsg #define SRI2_ARR(reg_name, block, id)\
1471bb76ff1Sjsg 	REG_STRUCT[id].reg_name = BASE(reg ## reg_name ## _BASE_IDX) + \
1481bb76ff1Sjsg 		reg ## reg_name
1491bb76ff1Sjsg 
1501bb76ff1Sjsg #define SRIR(var_name, reg_name, block, id)\
1511bb76ff1Sjsg 	.var_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
1521bb76ff1Sjsg 		reg ## block ## id ## _ ## reg_name
1531bb76ff1Sjsg 
1541bb76ff1Sjsg #define SRII(reg_name, block, id)\
1551bb76ff1Sjsg 	REG_STRUCT.reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
1561bb76ff1Sjsg 		reg ## block ## id ## _ ## reg_name
1571bb76ff1Sjsg 
1581bb76ff1Sjsg #define SRII_ARR_2(reg_name, block, id, inst)\
1591bb76ff1Sjsg 	REG_STRUCT[inst].reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
1601bb76ff1Sjsg 		reg ## block ## id ## _ ## reg_name
1611bb76ff1Sjsg 
1621bb76ff1Sjsg #define SRII_MPC_RMU(reg_name, block, id)\
1631bb76ff1Sjsg 	.RMU##_##reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
1641bb76ff1Sjsg 		reg ## block ## id ## _ ## reg_name
1651bb76ff1Sjsg 
1661bb76ff1Sjsg #define SRII_DWB(reg_name, temp_name, block, id)\
1671bb76ff1Sjsg 	REG_STRUCT.reg_name[id] = BASE(reg ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
1681bb76ff1Sjsg 		reg ## block ## id ## _ ## temp_name
1691bb76ff1Sjsg 
1701bb76ff1Sjsg #define DCCG_SRII(reg_name, block, id)\
1711bb76ff1Sjsg 	REG_STRUCT.block ## _ ## reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
1721bb76ff1Sjsg 		reg ## block ## id ## _ ## reg_name
1731bb76ff1Sjsg 
174f005ef32Sjsg #define SF_DWB2(reg_name, block, id, field_name, post_fix) \
175f005ef32Sjsg 	.field_name = reg_name ## __ ## field_name ## post_fix
176f005ef32Sjsg 
1771bb76ff1Sjsg #define VUPDATE_SRII(reg_name, block, id)\
1781bb76ff1Sjsg 	REG_STRUCT.reg_name[id] = BASE(reg ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
1791bb76ff1Sjsg 		reg ## reg_name ## _ ## block ## id
1801bb76ff1Sjsg 
1811bb76ff1Sjsg /* NBIO */
1821bb76ff1Sjsg #define NBIO_BASE_INNER(seg) ctx->nbio_reg_offsets[seg]
1831bb76ff1Sjsg 
1841bb76ff1Sjsg #define NBIO_BASE(seg) \
1851bb76ff1Sjsg 	NBIO_BASE_INNER(seg)
1861bb76ff1Sjsg 
1871bb76ff1Sjsg #define NBIO_SR(reg_name)\
1881bb76ff1Sjsg 	REG_STRUCT.reg_name = NBIO_BASE(regBIF_BX0_ ## reg_name ## _BASE_IDX) + \
1891bb76ff1Sjsg 		regBIF_BX0_ ## reg_name
1901bb76ff1Sjsg #define NBIO_SR_ARR(reg_name, id)\
1911bb76ff1Sjsg 	REG_STRUCT[id].reg_name = NBIO_BASE(regBIF_BX0_ ## reg_name ## _BASE_IDX) + \
1921bb76ff1Sjsg 		regBIF_BX0_ ## reg_name
1931bb76ff1Sjsg 
1941bb76ff1Sjsg #define CTX ctx
1951bb76ff1Sjsg #define REG(reg_name) \
1961bb76ff1Sjsg 	(ctx->dcn_reg_offsets[reg ## reg_name ## _BASE_IDX] + reg ## reg_name)
1971bb76ff1Sjsg 
1981bb76ff1Sjsg static struct bios_registers bios_regs;
1991bb76ff1Sjsg 
2001bb76ff1Sjsg #define bios_regs_init() \
2011bb76ff1Sjsg 		( \
2021bb76ff1Sjsg 		NBIO_SR(BIOS_SCRATCH_3),\
2031bb76ff1Sjsg 		NBIO_SR(BIOS_SCRATCH_6)\
2041bb76ff1Sjsg 		)
2051bb76ff1Sjsg 
2061bb76ff1Sjsg #define clk_src_regs_init(index, pllid)\
2071bb76ff1Sjsg 	CS_COMMON_REG_LIST_DCN3_0_RI(index, pllid)
2081bb76ff1Sjsg 
2091bb76ff1Sjsg static struct dce110_clk_src_regs clk_src_regs[5];
2101bb76ff1Sjsg 
2111bb76ff1Sjsg static const struct dce110_clk_src_shift cs_shift = {
2121bb76ff1Sjsg 		CS_COMMON_MASK_SH_LIST_DCN3_2(__SHIFT)
2131bb76ff1Sjsg };
2141bb76ff1Sjsg 
2151bb76ff1Sjsg static const struct dce110_clk_src_mask cs_mask = {
2161bb76ff1Sjsg 		CS_COMMON_MASK_SH_LIST_DCN3_2(_MASK)
2171bb76ff1Sjsg };
2181bb76ff1Sjsg 
2191bb76ff1Sjsg #define abm_regs_init(id)\
2201bb76ff1Sjsg 		ABM_DCN32_REG_LIST_RI(id)
2211bb76ff1Sjsg 
2221bb76ff1Sjsg static struct dce_abm_registers abm_regs[4];
2231bb76ff1Sjsg 
2241bb76ff1Sjsg static const struct dce_abm_shift abm_shift = {
2251bb76ff1Sjsg 		ABM_MASK_SH_LIST_DCN32(__SHIFT)
2261bb76ff1Sjsg };
2271bb76ff1Sjsg 
2281bb76ff1Sjsg static const struct dce_abm_mask abm_mask = {
2291bb76ff1Sjsg 		ABM_MASK_SH_LIST_DCN32(_MASK)
2301bb76ff1Sjsg };
2311bb76ff1Sjsg 
2321bb76ff1Sjsg #define audio_regs_init(id)\
2331bb76ff1Sjsg 		AUD_COMMON_REG_LIST_RI(id)
2341bb76ff1Sjsg 
2351bb76ff1Sjsg static struct dce_audio_registers audio_regs[5];
2361bb76ff1Sjsg 
2371bb76ff1Sjsg #define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
2381bb76ff1Sjsg 		SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
2391bb76ff1Sjsg 		SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
2401bb76ff1Sjsg 		AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
2411bb76ff1Sjsg 
2421bb76ff1Sjsg static const struct dce_audio_shift audio_shift = {
2431bb76ff1Sjsg 		DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
2441bb76ff1Sjsg };
2451bb76ff1Sjsg 
2461bb76ff1Sjsg static const struct dce_audio_mask audio_mask = {
2471bb76ff1Sjsg 		DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
2481bb76ff1Sjsg };
2491bb76ff1Sjsg 
2501bb76ff1Sjsg #define vpg_regs_init(id)\
2511bb76ff1Sjsg 	VPG_DCN3_REG_LIST_RI(id)
2521bb76ff1Sjsg 
2531bb76ff1Sjsg static struct dcn30_vpg_registers vpg_regs[10];
2541bb76ff1Sjsg 
2551bb76ff1Sjsg static const struct dcn30_vpg_shift vpg_shift = {
2561bb76ff1Sjsg 	DCN3_VPG_MASK_SH_LIST(__SHIFT)
2571bb76ff1Sjsg };
2581bb76ff1Sjsg 
2591bb76ff1Sjsg static const struct dcn30_vpg_mask vpg_mask = {
2601bb76ff1Sjsg 	DCN3_VPG_MASK_SH_LIST(_MASK)
2611bb76ff1Sjsg };
2621bb76ff1Sjsg 
2631bb76ff1Sjsg #define afmt_regs_init(id)\
2641bb76ff1Sjsg 	AFMT_DCN3_REG_LIST_RI(id)
2651bb76ff1Sjsg 
2661bb76ff1Sjsg static struct dcn30_afmt_registers afmt_regs[6];
2671bb76ff1Sjsg 
2681bb76ff1Sjsg static const struct dcn30_afmt_shift afmt_shift = {
2691bb76ff1Sjsg 	DCN3_AFMT_MASK_SH_LIST(__SHIFT)
2701bb76ff1Sjsg };
2711bb76ff1Sjsg 
2721bb76ff1Sjsg static const struct dcn30_afmt_mask afmt_mask = {
2731bb76ff1Sjsg 	DCN3_AFMT_MASK_SH_LIST(_MASK)
2741bb76ff1Sjsg };
2751bb76ff1Sjsg 
2761bb76ff1Sjsg #define apg_regs_init(id)\
2771bb76ff1Sjsg 	APG_DCN31_REG_LIST_RI(id)
2781bb76ff1Sjsg 
2791bb76ff1Sjsg static struct dcn31_apg_registers apg_regs[4];
2801bb76ff1Sjsg 
2811bb76ff1Sjsg static const struct dcn31_apg_shift apg_shift = {
2821bb76ff1Sjsg 	DCN31_APG_MASK_SH_LIST(__SHIFT)
2831bb76ff1Sjsg };
2841bb76ff1Sjsg 
2851bb76ff1Sjsg static const struct dcn31_apg_mask apg_mask = {
2861bb76ff1Sjsg 		DCN31_APG_MASK_SH_LIST(_MASK)
2871bb76ff1Sjsg };
2881bb76ff1Sjsg 
2891bb76ff1Sjsg #define stream_enc_regs_init(id)\
2901bb76ff1Sjsg 	SE_DCN32_REG_LIST_RI(id)
2911bb76ff1Sjsg 
2921bb76ff1Sjsg static struct dcn10_stream_enc_registers stream_enc_regs[5];
2931bb76ff1Sjsg 
2941bb76ff1Sjsg static const struct dcn10_stream_encoder_shift se_shift = {
2951bb76ff1Sjsg 		SE_COMMON_MASK_SH_LIST_DCN32(__SHIFT)
2961bb76ff1Sjsg };
2971bb76ff1Sjsg 
2981bb76ff1Sjsg static const struct dcn10_stream_encoder_mask se_mask = {
2991bb76ff1Sjsg 		SE_COMMON_MASK_SH_LIST_DCN32(_MASK)
3001bb76ff1Sjsg };
3011bb76ff1Sjsg 
3021bb76ff1Sjsg 
3031bb76ff1Sjsg #define aux_regs_init(id)\
3041bb76ff1Sjsg 	DCN2_AUX_REG_LIST_RI(id)
3051bb76ff1Sjsg 
3061bb76ff1Sjsg static struct dcn10_link_enc_aux_registers link_enc_aux_regs[5];
3071bb76ff1Sjsg 
3081bb76ff1Sjsg #define hpd_regs_init(id)\
3091bb76ff1Sjsg 	HPD_REG_LIST_RI(id)
3101bb76ff1Sjsg 
3111bb76ff1Sjsg static struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[5];
3121bb76ff1Sjsg 
3131bb76ff1Sjsg #define link_regs_init(id, phyid)\
3141bb76ff1Sjsg 	( \
3151bb76ff1Sjsg 	LE_DCN31_REG_LIST_RI(id), \
3161bb76ff1Sjsg 	UNIPHY_DCN2_REG_LIST_RI(id, phyid)\
3171bb76ff1Sjsg 	)
3181bb76ff1Sjsg 	/*DPCS_DCN31_REG_LIST(id),*/ \
3191bb76ff1Sjsg 
3201bb76ff1Sjsg static struct dcn10_link_enc_registers link_enc_regs[5];
3211bb76ff1Sjsg 
3221bb76ff1Sjsg static const struct dcn10_link_enc_shift le_shift = {
3231bb76ff1Sjsg 	LINK_ENCODER_MASK_SH_LIST_DCN31(__SHIFT), \
3241bb76ff1Sjsg //	DPCS_DCN31_MASK_SH_LIST(__SHIFT)
3251bb76ff1Sjsg };
3261bb76ff1Sjsg 
3271bb76ff1Sjsg static const struct dcn10_link_enc_mask le_mask = {
3281bb76ff1Sjsg 	LINK_ENCODER_MASK_SH_LIST_DCN31(_MASK), \
3291bb76ff1Sjsg //	DPCS_DCN31_MASK_SH_LIST(_MASK)
3301bb76ff1Sjsg };
3311bb76ff1Sjsg 
3321bb76ff1Sjsg #define hpo_dp_stream_encoder_reg_init(id)\
3331bb76ff1Sjsg 	DCN3_1_HPO_DP_STREAM_ENC_REG_LIST_RI(id)
3341bb76ff1Sjsg 
3351bb76ff1Sjsg static struct dcn31_hpo_dp_stream_encoder_registers hpo_dp_stream_enc_regs[4];
3361bb76ff1Sjsg 
3371bb76ff1Sjsg static const struct dcn31_hpo_dp_stream_encoder_shift hpo_dp_se_shift = {
3381bb76ff1Sjsg 	DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(__SHIFT)
3391bb76ff1Sjsg };
3401bb76ff1Sjsg 
3411bb76ff1Sjsg static const struct dcn31_hpo_dp_stream_encoder_mask hpo_dp_se_mask = {
3421bb76ff1Sjsg 	DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(_MASK)
3431bb76ff1Sjsg };
3441bb76ff1Sjsg 
3451bb76ff1Sjsg 
3461bb76ff1Sjsg #define hpo_dp_link_encoder_reg_init(id)\
3471bb76ff1Sjsg 	DCN3_1_HPO_DP_LINK_ENC_REG_LIST_RI(id)
3481bb76ff1Sjsg 	/*DCN3_1_RDPCSTX_REG_LIST(0),*/
3491bb76ff1Sjsg 	/*DCN3_1_RDPCSTX_REG_LIST(1),*/
3501bb76ff1Sjsg 	/*DCN3_1_RDPCSTX_REG_LIST(2),*/
3511bb76ff1Sjsg 	/*DCN3_1_RDPCSTX_REG_LIST(3),*/
3521bb76ff1Sjsg 
3531bb76ff1Sjsg static struct dcn31_hpo_dp_link_encoder_registers hpo_dp_link_enc_regs[2];
3541bb76ff1Sjsg 
3551bb76ff1Sjsg static const struct dcn31_hpo_dp_link_encoder_shift hpo_dp_le_shift = {
3561bb76ff1Sjsg 	DCN3_2_HPO_DP_LINK_ENC_MASK_SH_LIST(__SHIFT)
3571bb76ff1Sjsg };
3581bb76ff1Sjsg 
3591bb76ff1Sjsg static const struct dcn31_hpo_dp_link_encoder_mask hpo_dp_le_mask = {
3601bb76ff1Sjsg 	DCN3_2_HPO_DP_LINK_ENC_MASK_SH_LIST(_MASK)
3611bb76ff1Sjsg };
3621bb76ff1Sjsg 
3631bb76ff1Sjsg #define dpp_regs_init(id)\
3641bb76ff1Sjsg 	DPP_REG_LIST_DCN30_COMMON_RI(id)
3651bb76ff1Sjsg 
3661bb76ff1Sjsg static struct dcn3_dpp_registers dpp_regs[4];
3671bb76ff1Sjsg 
3681bb76ff1Sjsg static const struct dcn3_dpp_shift tf_shift = {
3691bb76ff1Sjsg 		DPP_REG_LIST_SH_MASK_DCN30_COMMON(__SHIFT)
3701bb76ff1Sjsg };
3711bb76ff1Sjsg 
3721bb76ff1Sjsg static const struct dcn3_dpp_mask tf_mask = {
3731bb76ff1Sjsg 		DPP_REG_LIST_SH_MASK_DCN30_COMMON(_MASK)
3741bb76ff1Sjsg };
3751bb76ff1Sjsg 
3761bb76ff1Sjsg 
3771bb76ff1Sjsg #define opp_regs_init(id)\
3781bb76ff1Sjsg 	OPP_REG_LIST_DCN30_RI(id)
3791bb76ff1Sjsg 
3801bb76ff1Sjsg static struct dcn20_opp_registers opp_regs[4];
3811bb76ff1Sjsg 
3821bb76ff1Sjsg static const struct dcn20_opp_shift opp_shift = {
3831bb76ff1Sjsg 	OPP_MASK_SH_LIST_DCN20(__SHIFT)
3841bb76ff1Sjsg };
3851bb76ff1Sjsg 
3861bb76ff1Sjsg static const struct dcn20_opp_mask opp_mask = {
3871bb76ff1Sjsg 	OPP_MASK_SH_LIST_DCN20(_MASK)
3881bb76ff1Sjsg };
3891bb76ff1Sjsg 
3901bb76ff1Sjsg #define aux_engine_regs_init(id) \
3911bb76ff1Sjsg 	( \
3921bb76ff1Sjsg 	AUX_COMMON_REG_LIST0_RI(id), SR_ARR_INIT(AUXN_IMPCAL, id, 0), \
3931bb76ff1Sjsg 	SR_ARR_INIT(AUXP_IMPCAL, id, 0), \
3941bb76ff1Sjsg 	SR_ARR_INIT(AUX_RESET_MASK, id, DP_AUX0_AUX_CONTROL__AUX_RESET_MASK), \
3951bb76ff1Sjsg 	SR_ARR_INIT(AUX_RESET_MASK, id, DP_AUX0_AUX_CONTROL__AUX_RESET_MASK)\
3961bb76ff1Sjsg 	)
3971bb76ff1Sjsg 
3981bb76ff1Sjsg static struct dce110_aux_registers aux_engine_regs[5];
3991bb76ff1Sjsg 
4001bb76ff1Sjsg static const struct dce110_aux_registers_shift aux_shift = {
4011bb76ff1Sjsg 	DCN_AUX_MASK_SH_LIST(__SHIFT)
4021bb76ff1Sjsg };
4031bb76ff1Sjsg 
4041bb76ff1Sjsg static const struct dce110_aux_registers_mask aux_mask = {
4051bb76ff1Sjsg 	DCN_AUX_MASK_SH_LIST(_MASK)
4061bb76ff1Sjsg };
4071bb76ff1Sjsg 
4081bb76ff1Sjsg #define dwbc_regs_dcn3_init(id)\
4091bb76ff1Sjsg 	DWBC_COMMON_REG_LIST_DCN30_RI(id)
4101bb76ff1Sjsg 
4111bb76ff1Sjsg static struct dcn30_dwbc_registers dwbc30_regs[1];
4121bb76ff1Sjsg 
4131bb76ff1Sjsg static const struct dcn30_dwbc_shift dwbc30_shift = {
4141bb76ff1Sjsg 	DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
4151bb76ff1Sjsg };
4161bb76ff1Sjsg 
4171bb76ff1Sjsg static const struct dcn30_dwbc_mask dwbc30_mask = {
4181bb76ff1Sjsg 	DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
4191bb76ff1Sjsg };
4201bb76ff1Sjsg 
4211bb76ff1Sjsg #define mcif_wb_regs_dcn3_init(id)\
4221bb76ff1Sjsg 	MCIF_WB_COMMON_REG_LIST_DCN32_RI(id)
4231bb76ff1Sjsg 
4241bb76ff1Sjsg static struct dcn30_mmhubbub_registers mcif_wb30_regs[1];
4251bb76ff1Sjsg 
4261bb76ff1Sjsg static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
4271bb76ff1Sjsg 	MCIF_WB_COMMON_MASK_SH_LIST_DCN32(__SHIFT)
4281bb76ff1Sjsg };
4291bb76ff1Sjsg 
4301bb76ff1Sjsg static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
4311bb76ff1Sjsg 	MCIF_WB_COMMON_MASK_SH_LIST_DCN32(_MASK)
4321bb76ff1Sjsg };
4331bb76ff1Sjsg 
4341bb76ff1Sjsg #define dsc_regsDCN20_init(id)\
4351bb76ff1Sjsg 	DSC_REG_LIST_DCN20_RI(id)
4361bb76ff1Sjsg 
4371bb76ff1Sjsg static struct dcn20_dsc_registers dsc_regs[4];
4381bb76ff1Sjsg 
4391bb76ff1Sjsg static const struct dcn20_dsc_shift dsc_shift = {
4401bb76ff1Sjsg 	DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
4411bb76ff1Sjsg };
4421bb76ff1Sjsg 
4431bb76ff1Sjsg static const struct dcn20_dsc_mask dsc_mask = {
4441bb76ff1Sjsg 	DSC_REG_LIST_SH_MASK_DCN20(_MASK)
4451bb76ff1Sjsg };
4461bb76ff1Sjsg 
4471bb76ff1Sjsg static struct dcn30_mpc_registers mpc_regs;
4481bb76ff1Sjsg #define dcn_mpc_regs_init()\
4491bb76ff1Sjsg 	MPC_REG_LIST_DCN3_2_RI(0),\
4501bb76ff1Sjsg 	MPC_REG_LIST_DCN3_2_RI(1),\
4511bb76ff1Sjsg 	MPC_REG_LIST_DCN3_2_RI(2),\
4521bb76ff1Sjsg 	MPC_REG_LIST_DCN3_2_RI(3),\
4531bb76ff1Sjsg 	MPC_OUT_MUX_REG_LIST_DCN3_0_RI(0),\
4541bb76ff1Sjsg 	MPC_OUT_MUX_REG_LIST_DCN3_0_RI(1),\
4551bb76ff1Sjsg 	MPC_OUT_MUX_REG_LIST_DCN3_0_RI(2),\
4561bb76ff1Sjsg 	MPC_OUT_MUX_REG_LIST_DCN3_0_RI(3),\
4571bb76ff1Sjsg 	MPC_DWB_MUX_REG_LIST_DCN3_0_RI(0)
4581bb76ff1Sjsg 
4591bb76ff1Sjsg static const struct dcn30_mpc_shift mpc_shift = {
4601bb76ff1Sjsg 	MPC_COMMON_MASK_SH_LIST_DCN32(__SHIFT)
4611bb76ff1Sjsg };
4621bb76ff1Sjsg 
4631bb76ff1Sjsg static const struct dcn30_mpc_mask mpc_mask = {
4641bb76ff1Sjsg 	MPC_COMMON_MASK_SH_LIST_DCN32(_MASK)
4651bb76ff1Sjsg };
4661bb76ff1Sjsg 
4671bb76ff1Sjsg #define optc_regs_init(id)\
4681bb76ff1Sjsg 	OPTC_COMMON_REG_LIST_DCN3_2_RI(id)
4691bb76ff1Sjsg 
4701bb76ff1Sjsg static struct dcn_optc_registers optc_regs[4];
4711bb76ff1Sjsg 
4721bb76ff1Sjsg static const struct dcn_optc_shift optc_shift = {
4731bb76ff1Sjsg 	OPTC_COMMON_MASK_SH_LIST_DCN3_2(__SHIFT)
4741bb76ff1Sjsg };
4751bb76ff1Sjsg 
4761bb76ff1Sjsg static const struct dcn_optc_mask optc_mask = {
4771bb76ff1Sjsg 	OPTC_COMMON_MASK_SH_LIST_DCN3_2(_MASK)
4781bb76ff1Sjsg };
4791bb76ff1Sjsg 
4801bb76ff1Sjsg #define hubp_regs_init(id) \
4811bb76ff1Sjsg 	HUBP_REG_LIST_DCN32_RI(id)
4821bb76ff1Sjsg 
4831bb76ff1Sjsg static struct dcn_hubp2_registers hubp_regs[4];
4841bb76ff1Sjsg 
4851bb76ff1Sjsg static const struct dcn_hubp2_shift hubp_shift = {
4861bb76ff1Sjsg 		HUBP_MASK_SH_LIST_DCN32(__SHIFT)
4871bb76ff1Sjsg };
4881bb76ff1Sjsg 
4891bb76ff1Sjsg static const struct dcn_hubp2_mask hubp_mask = {
4901bb76ff1Sjsg 		HUBP_MASK_SH_LIST_DCN32(_MASK)
4911bb76ff1Sjsg };
4921bb76ff1Sjsg 
4931bb76ff1Sjsg static struct dcn_hubbub_registers hubbub_reg;
4941bb76ff1Sjsg #define hubbub_reg_init()\
4951bb76ff1Sjsg 		HUBBUB_REG_LIST_DCN32_RI(0)
4961bb76ff1Sjsg 
4971bb76ff1Sjsg static const struct dcn_hubbub_shift hubbub_shift = {
4981bb76ff1Sjsg 		HUBBUB_MASK_SH_LIST_DCN32(__SHIFT)
4991bb76ff1Sjsg };
5001bb76ff1Sjsg 
5011bb76ff1Sjsg static const struct dcn_hubbub_mask hubbub_mask = {
5021bb76ff1Sjsg 		HUBBUB_MASK_SH_LIST_DCN32(_MASK)
5031bb76ff1Sjsg };
5041bb76ff1Sjsg 
5051bb76ff1Sjsg static struct dccg_registers dccg_regs;
5061bb76ff1Sjsg 
5071bb76ff1Sjsg #define dccg_regs_init()\
5081bb76ff1Sjsg 	DCCG_REG_LIST_DCN32_RI()
5091bb76ff1Sjsg 
5101bb76ff1Sjsg static const struct dccg_shift dccg_shift = {
5111bb76ff1Sjsg 		DCCG_MASK_SH_LIST_DCN32(__SHIFT)
5121bb76ff1Sjsg };
5131bb76ff1Sjsg 
5141bb76ff1Sjsg static const struct dccg_mask dccg_mask = {
5151bb76ff1Sjsg 		DCCG_MASK_SH_LIST_DCN32(_MASK)
5161bb76ff1Sjsg };
5171bb76ff1Sjsg 
5181bb76ff1Sjsg 
5191bb76ff1Sjsg #define SRII2(reg_name_pre, reg_name_post, id)\
5201bb76ff1Sjsg 	.reg_name_pre ## _ ##  reg_name_post[id] = BASE(reg ## reg_name_pre \
5211bb76ff1Sjsg 			## id ## _ ## reg_name_post ## _BASE_IDX) + \
5221bb76ff1Sjsg 			reg ## reg_name_pre ## id ## _ ## reg_name_post
5231bb76ff1Sjsg 
5241bb76ff1Sjsg 
5251bb76ff1Sjsg #define HWSEQ_DCN32_REG_LIST()\
5261bb76ff1Sjsg 	SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
5271bb76ff1Sjsg 	SR(DIO_MEM_PWR_CTRL), \
5281bb76ff1Sjsg 	SR(ODM_MEM_PWR_CTRL3), \
5291bb76ff1Sjsg 	SR(MMHUBBUB_MEM_PWR_CNTL), \
5301bb76ff1Sjsg 	SR(DCCG_GATE_DISABLE_CNTL), \
5311bb76ff1Sjsg 	SR(DCCG_GATE_DISABLE_CNTL2), \
5321bb76ff1Sjsg 	SR(DCFCLK_CNTL),\
5331bb76ff1Sjsg 	SR(DC_MEM_GLOBAL_PWR_REQ_CNTL), \
5341bb76ff1Sjsg 	SRII(PIXEL_RATE_CNTL, OTG, 0), \
5351bb76ff1Sjsg 	SRII(PIXEL_RATE_CNTL, OTG, 1),\
5361bb76ff1Sjsg 	SRII(PIXEL_RATE_CNTL, OTG, 2),\
5371bb76ff1Sjsg 	SRII(PIXEL_RATE_CNTL, OTG, 3),\
5381bb76ff1Sjsg 	SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 0),\
5391bb76ff1Sjsg 	SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 1),\
5401bb76ff1Sjsg 	SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 2),\
5411bb76ff1Sjsg 	SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 3),\
5421bb76ff1Sjsg 	SR(MICROSECOND_TIME_BASE_DIV), \
5431bb76ff1Sjsg 	SR(MILLISECOND_TIME_BASE_DIV), \
5441bb76ff1Sjsg 	SR(DISPCLK_FREQ_CHANGE_CNTL), \
5451bb76ff1Sjsg 	SR(RBBMIF_TIMEOUT_DIS), \
5461bb76ff1Sjsg 	SR(RBBMIF_TIMEOUT_DIS_2), \
5471bb76ff1Sjsg 	SR(DCHUBBUB_CRC_CTRL), \
5481bb76ff1Sjsg 	SR(DPP_TOP0_DPP_CRC_CTRL), \
5491bb76ff1Sjsg 	SR(DPP_TOP0_DPP_CRC_VAL_B_A), \
5501bb76ff1Sjsg 	SR(DPP_TOP0_DPP_CRC_VAL_R_G), \
5511bb76ff1Sjsg 	SR(MPC_CRC_CTRL), \
5521bb76ff1Sjsg 	SR(MPC_CRC_RESULT_GB), \
5531bb76ff1Sjsg 	SR(MPC_CRC_RESULT_C), \
5541bb76ff1Sjsg 	SR(MPC_CRC_RESULT_AR), \
5551bb76ff1Sjsg 	SR(DOMAIN0_PG_CONFIG), \
5561bb76ff1Sjsg 	SR(DOMAIN1_PG_CONFIG), \
5571bb76ff1Sjsg 	SR(DOMAIN2_PG_CONFIG), \
5581bb76ff1Sjsg 	SR(DOMAIN3_PG_CONFIG), \
5591bb76ff1Sjsg 	SR(DOMAIN16_PG_CONFIG), \
5601bb76ff1Sjsg 	SR(DOMAIN17_PG_CONFIG), \
5611bb76ff1Sjsg 	SR(DOMAIN18_PG_CONFIG), \
5621bb76ff1Sjsg 	SR(DOMAIN19_PG_CONFIG), \
5631bb76ff1Sjsg 	SR(DOMAIN0_PG_STATUS), \
5641bb76ff1Sjsg 	SR(DOMAIN1_PG_STATUS), \
5651bb76ff1Sjsg 	SR(DOMAIN2_PG_STATUS), \
5661bb76ff1Sjsg 	SR(DOMAIN3_PG_STATUS), \
5671bb76ff1Sjsg 	SR(DOMAIN16_PG_STATUS), \
5681bb76ff1Sjsg 	SR(DOMAIN17_PG_STATUS), \
5691bb76ff1Sjsg 	SR(DOMAIN18_PG_STATUS), \
5701bb76ff1Sjsg 	SR(DOMAIN19_PG_STATUS), \
5711bb76ff1Sjsg 	SR(D1VGA_CONTROL), \
5721bb76ff1Sjsg 	SR(D2VGA_CONTROL), \
5731bb76ff1Sjsg 	SR(D3VGA_CONTROL), \
5741bb76ff1Sjsg 	SR(D4VGA_CONTROL), \
5751bb76ff1Sjsg 	SR(D5VGA_CONTROL), \
5761bb76ff1Sjsg 	SR(D6VGA_CONTROL), \
5771bb76ff1Sjsg 	SR(DC_IP_REQUEST_CNTL), \
5781bb76ff1Sjsg 	SR(AZALIA_AUDIO_DTO), \
5791bb76ff1Sjsg 	SR(AZALIA_CONTROLLER_CLOCK_GATING)
5801bb76ff1Sjsg 
5811bb76ff1Sjsg static struct dce_hwseq_registers hwseq_reg;
5821bb76ff1Sjsg 
5831bb76ff1Sjsg #define hwseq_reg_init()\
5841bb76ff1Sjsg 	HWSEQ_DCN32_REG_LIST()
5851bb76ff1Sjsg 
5861bb76ff1Sjsg #define HWSEQ_DCN32_MASK_SH_LIST(mask_sh)\
5871bb76ff1Sjsg 	HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
5881bb76ff1Sjsg 	HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
5891bb76ff1Sjsg 	HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
5901bb76ff1Sjsg 	HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
5911bb76ff1Sjsg 	HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
5921bb76ff1Sjsg 	HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
5931bb76ff1Sjsg 	HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
5941bb76ff1Sjsg 	HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
5951bb76ff1Sjsg 	HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
5961bb76ff1Sjsg 	HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
5971bb76ff1Sjsg 	HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
5981bb76ff1Sjsg 	HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
5991bb76ff1Sjsg 	HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
6001bb76ff1Sjsg 	HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
6011bb76ff1Sjsg 	HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
6021bb76ff1Sjsg 	HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
6031bb76ff1Sjsg 	HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
6041bb76ff1Sjsg 	HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
6051bb76ff1Sjsg 	HWS_SF(, DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
6061bb76ff1Sjsg 	HWS_SF(, DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
6071bb76ff1Sjsg 	HWS_SF(, DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
6081bb76ff1Sjsg 	HWS_SF(, DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
6091bb76ff1Sjsg 	HWS_SF(, DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
6101bb76ff1Sjsg 	HWS_SF(, DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
6111bb76ff1Sjsg 	HWS_SF(, DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
6121bb76ff1Sjsg 	HWS_SF(, DOMAIN19_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
6131bb76ff1Sjsg 	HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
6141bb76ff1Sjsg 	HWS_SF(, AZALIA_AUDIO_DTO, AZALIA_AUDIO_DTO_MODULE, mask_sh), \
6151bb76ff1Sjsg 	HWS_SF(, HPO_TOP_CLOCK_CONTROL, HPO_HDMISTREAMCLK_G_GATE_DIS, mask_sh), \
6161bb76ff1Sjsg 	HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_UNASSIGNED_PWR_MODE, mask_sh), \
6171bb76ff1Sjsg 	HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_VBLANK_PWR_MODE, mask_sh), \
6181bb76ff1Sjsg 	HWS_SF(, MMHUBBUB_MEM_PWR_CNTL, VGA_MEM_PWR_FORCE, mask_sh)
6191bb76ff1Sjsg 
6201bb76ff1Sjsg static const struct dce_hwseq_shift hwseq_shift = {
6211bb76ff1Sjsg 		HWSEQ_DCN32_MASK_SH_LIST(__SHIFT)
6221bb76ff1Sjsg };
6231bb76ff1Sjsg 
6241bb76ff1Sjsg static const struct dce_hwseq_mask hwseq_mask = {
6251bb76ff1Sjsg 		HWSEQ_DCN32_MASK_SH_LIST(_MASK)
6261bb76ff1Sjsg };
6271bb76ff1Sjsg #define vmid_regs_init(id)\
6281bb76ff1Sjsg 		DCN20_VMID_REG_LIST_RI(id)
6291bb76ff1Sjsg 
6301bb76ff1Sjsg static struct dcn_vmid_registers vmid_regs[16];
6311bb76ff1Sjsg 
6321bb76ff1Sjsg static const struct dcn20_vmid_shift vmid_shifts = {
6331bb76ff1Sjsg 		DCN20_VMID_MASK_SH_LIST(__SHIFT)
6341bb76ff1Sjsg };
6351bb76ff1Sjsg 
6361bb76ff1Sjsg static const struct dcn20_vmid_mask vmid_masks = {
6371bb76ff1Sjsg 		DCN20_VMID_MASK_SH_LIST(_MASK)
6381bb76ff1Sjsg };
6391bb76ff1Sjsg 
6401bb76ff1Sjsg static const struct resource_caps res_cap_dcn321 = {
6411bb76ff1Sjsg 	.num_timing_generator = 4,
6421bb76ff1Sjsg 	.num_opp = 4,
6431bb76ff1Sjsg 	.num_video_plane = 4,
6441bb76ff1Sjsg 	.num_audio = 5,
6451bb76ff1Sjsg 	.num_stream_encoder = 5,
6461bb76ff1Sjsg 	.num_hpo_dp_stream_encoder = 4,
6471bb76ff1Sjsg 	.num_hpo_dp_link_encoder = 2,
6481bb76ff1Sjsg 	.num_pll = 5,
6491bb76ff1Sjsg 	.num_dwb = 1,
6501bb76ff1Sjsg 	.num_ddc = 5,
6511bb76ff1Sjsg 	.num_vmid = 16,
6521bb76ff1Sjsg 	.num_mpc_3dlut = 4,
6531bb76ff1Sjsg 	.num_dsc = 4,
6541bb76ff1Sjsg };
6551bb76ff1Sjsg 
6561bb76ff1Sjsg static const struct dc_plane_cap plane_cap = {
6571bb76ff1Sjsg 	.type = DC_PLANE_TYPE_DCN_UNIVERSAL,
6581bb76ff1Sjsg 	.per_pixel_alpha = true,
6591bb76ff1Sjsg 
6601bb76ff1Sjsg 	.pixel_format_support = {
6611bb76ff1Sjsg 			.argb8888 = true,
6621bb76ff1Sjsg 			.nv12 = true,
6631bb76ff1Sjsg 			.fp16 = true,
6641bb76ff1Sjsg 			.p010 = true,
6651bb76ff1Sjsg 			.ayuv = false,
6661bb76ff1Sjsg 	},
6671bb76ff1Sjsg 
6681bb76ff1Sjsg 	.max_upscale_factor = {
6691bb76ff1Sjsg 			.argb8888 = 16000,
6701bb76ff1Sjsg 			.nv12 = 16000,
6711bb76ff1Sjsg 			.fp16 = 16000
6721bb76ff1Sjsg 	},
6731bb76ff1Sjsg 
6741bb76ff1Sjsg 	// 6:1 downscaling ratio: 1000/6 = 166.666
6751bb76ff1Sjsg 	.max_downscale_factor = {
6761bb76ff1Sjsg 			.argb8888 = 167,
6771bb76ff1Sjsg 			.nv12 = 167,
6781bb76ff1Sjsg 			.fp16 = 167
6791bb76ff1Sjsg 	},
6801bb76ff1Sjsg 	64,
6811bb76ff1Sjsg 	64
6821bb76ff1Sjsg };
6831bb76ff1Sjsg 
6841bb76ff1Sjsg static const struct dc_debug_options debug_defaults_drv = {
6851bb76ff1Sjsg 	.disable_dmcu = true,
6861bb76ff1Sjsg 	.force_abm_enable = false,
6871bb76ff1Sjsg 	.timing_trace = false,
6881bb76ff1Sjsg 	.clock_trace = true,
6891bb76ff1Sjsg 	.disable_pplib_clock_request = false,
6901bb76ff1Sjsg 	.pipe_split_policy = MPC_SPLIT_AVOID,
6911bb76ff1Sjsg 	.force_single_disp_pipe_split = false,
6921bb76ff1Sjsg 	.disable_dcc = DCC_ENABLE,
6931bb76ff1Sjsg 	.vsr_support = true,
6941bb76ff1Sjsg 	.performance_trace = false,
6951bb76ff1Sjsg 	.max_downscale_src_width = 7680,/*upto 8K*/
6961bb76ff1Sjsg 	.disable_pplib_wm_range = false,
6971bb76ff1Sjsg 	.scl_reset_length10 = true,
6981bb76ff1Sjsg 	.sanity_checks = false,
6991bb76ff1Sjsg 	.underflow_assert_delay_us = 0xFFFFFFFF,
7001bb76ff1Sjsg 	.dwb_fi_phase = -1, // -1 = disable,
7011bb76ff1Sjsg 	.dmub_command_table = true,
7021bb76ff1Sjsg 	.enable_mem_low_power = {
7031bb76ff1Sjsg 		.bits = {
7041bb76ff1Sjsg 			.vga = false,
7051bb76ff1Sjsg 			.i2c = false,
7061bb76ff1Sjsg 			.dmcu = false, // This is previously known to cause hang on S3 cycles if enabled
7071bb76ff1Sjsg 			.dscl = false,
7081bb76ff1Sjsg 			.cm = false,
7091bb76ff1Sjsg 			.mpc = false,
7101bb76ff1Sjsg 			.optc = true,
7111bb76ff1Sjsg 		}
7121bb76ff1Sjsg 	},
7131bb76ff1Sjsg 	.use_max_lb = true,
7141bb76ff1Sjsg 	.force_disable_subvp = false,
7151bb76ff1Sjsg 	.exit_idle_opt_for_cursor_updates = true,
7161bb76ff1Sjsg 	.enable_single_display_2to1_odm_policy = true,
7171bb76ff1Sjsg 
7181bb76ff1Sjsg 	/*must match enable_single_display_2to1_odm_policy to support dynamic ODM transitions*/
7191bb76ff1Sjsg 	.enable_double_buffered_dsc_pg_support = true,
7201bb76ff1Sjsg 	.enable_dp_dig_pixel_rate_div_policy = 1,
721f005ef32Sjsg 	.allow_sw_cursor_fallback = false, // Linux can't do SW cursor "fallback"
7221bb76ff1Sjsg 	.alloc_extra_way_for_cursor = true,
7231bb76ff1Sjsg 	.min_prefetch_in_strobe_ns = 60000, // 60us
724f005ef32Sjsg 	.disable_unbounded_requesting = false,
725f005ef32Sjsg 	.override_dispclk_programming = true,
726f005ef32Sjsg 	.disable_fpo_optimizations = false,
727f005ef32Sjsg 	.fpo_vactive_margin_us = 2000, // 2000us
728f005ef32Sjsg 	.disable_fpo_vactive = false,
729f005ef32Sjsg 	.disable_boot_optimizations = false,
730f005ef32Sjsg 	.disable_subvp_high_refresh = false,
731f005ef32Sjsg 	.fpo_vactive_min_active_margin_us = 200,
732f005ef32Sjsg 	.fpo_vactive_max_blank_us = 1000,
733f005ef32Sjsg 	.enable_legacy_fast_update = false,
734f005ef32Sjsg 	.disable_dc_mode_overwrite = true,
7351bb76ff1Sjsg };
7361bb76ff1Sjsg 
7371bb76ff1Sjsg static struct dce_aux *dcn321_aux_engine_create(
7381bb76ff1Sjsg 	struct dc_context *ctx,
7391bb76ff1Sjsg 	uint32_t inst)
7401bb76ff1Sjsg {
7411bb76ff1Sjsg 	struct aux_engine_dce110 *aux_engine =
7421bb76ff1Sjsg 		kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
7431bb76ff1Sjsg 
7441bb76ff1Sjsg 	if (!aux_engine)
7451bb76ff1Sjsg 		return NULL;
7461bb76ff1Sjsg 
7471bb76ff1Sjsg #undef REG_STRUCT
7481bb76ff1Sjsg #define REG_STRUCT aux_engine_regs
7491bb76ff1Sjsg 	aux_engine_regs_init(0),
7501bb76ff1Sjsg 	aux_engine_regs_init(1),
7511bb76ff1Sjsg 	aux_engine_regs_init(2),
7521bb76ff1Sjsg 	aux_engine_regs_init(3),
7531bb76ff1Sjsg 	aux_engine_regs_init(4);
7541bb76ff1Sjsg 
7551bb76ff1Sjsg 	dce110_aux_engine_construct(aux_engine, ctx, inst,
7561bb76ff1Sjsg 				    SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
7571bb76ff1Sjsg 				    &aux_engine_regs[inst],
7581bb76ff1Sjsg 					&aux_mask,
7591bb76ff1Sjsg 					&aux_shift,
7601bb76ff1Sjsg 					ctx->dc->caps.extended_aux_timeout_support);
7611bb76ff1Sjsg 
7621bb76ff1Sjsg 	return &aux_engine->base;
7631bb76ff1Sjsg }
7641bb76ff1Sjsg #define i2c_inst_regs_init(id)\
7651bb76ff1Sjsg 	I2C_HW_ENGINE_COMMON_REG_LIST_DCN30_RI(id)
7661bb76ff1Sjsg 
7671bb76ff1Sjsg static struct dce_i2c_registers i2c_hw_regs[5];
7681bb76ff1Sjsg 
7691bb76ff1Sjsg static const struct dce_i2c_shift i2c_shifts = {
7701bb76ff1Sjsg 		I2C_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
7711bb76ff1Sjsg };
7721bb76ff1Sjsg 
7731bb76ff1Sjsg static const struct dce_i2c_mask i2c_masks = {
7741bb76ff1Sjsg 		I2C_COMMON_MASK_SH_LIST_DCN30(_MASK)
7751bb76ff1Sjsg };
7761bb76ff1Sjsg 
7771bb76ff1Sjsg static struct dce_i2c_hw *dcn321_i2c_hw_create(
7781bb76ff1Sjsg 	struct dc_context *ctx,
7791bb76ff1Sjsg 	uint32_t inst)
7801bb76ff1Sjsg {
7811bb76ff1Sjsg 	struct dce_i2c_hw *dce_i2c_hw =
7821bb76ff1Sjsg 		kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
7831bb76ff1Sjsg 
7841bb76ff1Sjsg 	if (!dce_i2c_hw)
7851bb76ff1Sjsg 		return NULL;
7861bb76ff1Sjsg 
7871bb76ff1Sjsg #undef REG_STRUCT
7881bb76ff1Sjsg #define REG_STRUCT i2c_hw_regs
7891bb76ff1Sjsg 	i2c_inst_regs_init(1),
7901bb76ff1Sjsg 	i2c_inst_regs_init(2),
7911bb76ff1Sjsg 	i2c_inst_regs_init(3),
7921bb76ff1Sjsg 	i2c_inst_regs_init(4),
7931bb76ff1Sjsg 	i2c_inst_regs_init(5);
7941bb76ff1Sjsg 
7951bb76ff1Sjsg 	dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
7961bb76ff1Sjsg 				    &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
7971bb76ff1Sjsg 
7981bb76ff1Sjsg 	return dce_i2c_hw;
7991bb76ff1Sjsg }
8001bb76ff1Sjsg 
8011bb76ff1Sjsg static struct clock_source *dcn321_clock_source_create(
8021bb76ff1Sjsg 		struct dc_context *ctx,
8031bb76ff1Sjsg 		struct dc_bios *bios,
8041bb76ff1Sjsg 		enum clock_source_id id,
8051bb76ff1Sjsg 		const struct dce110_clk_src_regs *regs,
8061bb76ff1Sjsg 		bool dp_clk_src)
8071bb76ff1Sjsg {
8081bb76ff1Sjsg 	struct dce110_clk_src *clk_src =
8091bb76ff1Sjsg 		kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
8101bb76ff1Sjsg 
8111bb76ff1Sjsg 	if (!clk_src)
8121bb76ff1Sjsg 		return NULL;
8131bb76ff1Sjsg 
8141bb76ff1Sjsg 	if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
8151bb76ff1Sjsg 			regs, &cs_shift, &cs_mask)) {
8161bb76ff1Sjsg 		clk_src->base.dp_clk_src = dp_clk_src;
8171bb76ff1Sjsg 		return &clk_src->base;
8181bb76ff1Sjsg 	}
8191bb76ff1Sjsg 
820f005ef32Sjsg 	kfree(clk_src);
8211bb76ff1Sjsg 	BREAK_TO_DEBUGGER();
8221bb76ff1Sjsg 	return NULL;
8231bb76ff1Sjsg }
8241bb76ff1Sjsg 
8251bb76ff1Sjsg static struct hubbub *dcn321_hubbub_create(struct dc_context *ctx)
8261bb76ff1Sjsg {
8271bb76ff1Sjsg 	int i;
8281bb76ff1Sjsg 
8291bb76ff1Sjsg 	struct dcn20_hubbub *hubbub2 = kzalloc(sizeof(struct dcn20_hubbub),
8301bb76ff1Sjsg 					  GFP_KERNEL);
8311bb76ff1Sjsg 
8321bb76ff1Sjsg 	if (!hubbub2)
8331bb76ff1Sjsg 		return NULL;
8341bb76ff1Sjsg 
8351bb76ff1Sjsg #undef REG_STRUCT
8361bb76ff1Sjsg #define REG_STRUCT hubbub_reg
8371bb76ff1Sjsg 	hubbub_reg_init();
8381bb76ff1Sjsg 
8391bb76ff1Sjsg #undef REG_STRUCT
8401bb76ff1Sjsg #define REG_STRUCT vmid_regs
8411bb76ff1Sjsg 	vmid_regs_init(0),
8421bb76ff1Sjsg 	vmid_regs_init(1),
8431bb76ff1Sjsg 	vmid_regs_init(2),
8441bb76ff1Sjsg 	vmid_regs_init(3),
8451bb76ff1Sjsg 	vmid_regs_init(4),
8461bb76ff1Sjsg 	vmid_regs_init(5),
8471bb76ff1Sjsg 	vmid_regs_init(6),
8481bb76ff1Sjsg 	vmid_regs_init(7),
8491bb76ff1Sjsg 	vmid_regs_init(8),
8501bb76ff1Sjsg 	vmid_regs_init(9),
8511bb76ff1Sjsg 	vmid_regs_init(10),
8521bb76ff1Sjsg 	vmid_regs_init(11),
8531bb76ff1Sjsg 	vmid_regs_init(12),
8541bb76ff1Sjsg 	vmid_regs_init(13),
8551bb76ff1Sjsg 	vmid_regs_init(14),
8561bb76ff1Sjsg 	vmid_regs_init(15);
8571bb76ff1Sjsg 
8581bb76ff1Sjsg 	hubbub32_construct(hubbub2, ctx,
8591bb76ff1Sjsg 			&hubbub_reg,
8601bb76ff1Sjsg 			&hubbub_shift,
8611bb76ff1Sjsg 			&hubbub_mask,
8621bb76ff1Sjsg 			ctx->dc->dml.ip.det_buffer_size_kbytes,
8631bb76ff1Sjsg 			ctx->dc->dml.ip.pixel_chunk_size_kbytes,
8641bb76ff1Sjsg 			ctx->dc->dml.ip.config_return_buffer_size_in_kbytes);
8651bb76ff1Sjsg 
8661bb76ff1Sjsg 
8671bb76ff1Sjsg 	for (i = 0; i < res_cap_dcn321.num_vmid; i++) {
8681bb76ff1Sjsg 		struct dcn20_vmid *vmid = &hubbub2->vmid[i];
8691bb76ff1Sjsg 
8701bb76ff1Sjsg 		vmid->ctx = ctx;
8711bb76ff1Sjsg 
8721bb76ff1Sjsg 		vmid->regs = &vmid_regs[i];
8731bb76ff1Sjsg 		vmid->shifts = &vmid_shifts;
8741bb76ff1Sjsg 		vmid->masks = &vmid_masks;
8751bb76ff1Sjsg 	}
8761bb76ff1Sjsg 
8771bb76ff1Sjsg 	return &hubbub2->base;
8781bb76ff1Sjsg }
8791bb76ff1Sjsg 
8801bb76ff1Sjsg static struct hubp *dcn321_hubp_create(
8811bb76ff1Sjsg 	struct dc_context *ctx,
8821bb76ff1Sjsg 	uint32_t inst)
8831bb76ff1Sjsg {
8841bb76ff1Sjsg 	struct dcn20_hubp *hubp2 =
8851bb76ff1Sjsg 		kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
8861bb76ff1Sjsg 
8871bb76ff1Sjsg 	if (!hubp2)
8881bb76ff1Sjsg 		return NULL;
8891bb76ff1Sjsg 
8901bb76ff1Sjsg #undef REG_STRUCT
8911bb76ff1Sjsg #define REG_STRUCT hubp_regs
8921bb76ff1Sjsg 	hubp_regs_init(0),
8931bb76ff1Sjsg 	hubp_regs_init(1),
8941bb76ff1Sjsg 	hubp_regs_init(2),
8951bb76ff1Sjsg 	hubp_regs_init(3);
8961bb76ff1Sjsg 
8971bb76ff1Sjsg 	if (hubp32_construct(hubp2, ctx, inst,
8981bb76ff1Sjsg 			&hubp_regs[inst], &hubp_shift, &hubp_mask))
8991bb76ff1Sjsg 		return &hubp2->base;
9001bb76ff1Sjsg 
9011bb76ff1Sjsg 	BREAK_TO_DEBUGGER();
9021bb76ff1Sjsg 	kfree(hubp2);
9031bb76ff1Sjsg 	return NULL;
9041bb76ff1Sjsg }
9051bb76ff1Sjsg 
9061bb76ff1Sjsg static void dcn321_dpp_destroy(struct dpp **dpp)
9071bb76ff1Sjsg {
9081bb76ff1Sjsg 	kfree(TO_DCN30_DPP(*dpp));
9091bb76ff1Sjsg 	*dpp = NULL;
9101bb76ff1Sjsg }
9111bb76ff1Sjsg 
9121bb76ff1Sjsg static struct dpp *dcn321_dpp_create(
9131bb76ff1Sjsg 	struct dc_context *ctx,
9141bb76ff1Sjsg 	uint32_t inst)
9151bb76ff1Sjsg {
9161bb76ff1Sjsg 	struct dcn3_dpp *dpp3 =
9171bb76ff1Sjsg 		kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
9181bb76ff1Sjsg 
9191bb76ff1Sjsg 	if (!dpp3)
9201bb76ff1Sjsg 		return NULL;
9211bb76ff1Sjsg 
9221bb76ff1Sjsg #undef REG_STRUCT
9231bb76ff1Sjsg #define REG_STRUCT dpp_regs
9241bb76ff1Sjsg 	dpp_regs_init(0),
9251bb76ff1Sjsg 	dpp_regs_init(1),
9261bb76ff1Sjsg 	dpp_regs_init(2),
9271bb76ff1Sjsg 	dpp_regs_init(3);
9281bb76ff1Sjsg 
9291bb76ff1Sjsg 	if (dpp32_construct(dpp3, ctx, inst,
9301bb76ff1Sjsg 			&dpp_regs[inst], &tf_shift, &tf_mask))
9311bb76ff1Sjsg 		return &dpp3->base;
9321bb76ff1Sjsg 
9331bb76ff1Sjsg 	BREAK_TO_DEBUGGER();
9341bb76ff1Sjsg 	kfree(dpp3);
9351bb76ff1Sjsg 	return NULL;
9361bb76ff1Sjsg }
9371bb76ff1Sjsg 
9381bb76ff1Sjsg static struct mpc *dcn321_mpc_create(
9391bb76ff1Sjsg 		struct dc_context *ctx,
9401bb76ff1Sjsg 		int num_mpcc,
9411bb76ff1Sjsg 		int num_rmu)
9421bb76ff1Sjsg {
9431bb76ff1Sjsg 	struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
9441bb76ff1Sjsg 					  GFP_KERNEL);
9451bb76ff1Sjsg 
9461bb76ff1Sjsg 	if (!mpc30)
9471bb76ff1Sjsg 		return NULL;
9481bb76ff1Sjsg 
9491bb76ff1Sjsg #undef REG_STRUCT
9501bb76ff1Sjsg #define REG_STRUCT mpc_regs
9511bb76ff1Sjsg 	dcn_mpc_regs_init();
9521bb76ff1Sjsg 
9531bb76ff1Sjsg 	dcn32_mpc_construct(mpc30, ctx,
9541bb76ff1Sjsg 			&mpc_regs,
9551bb76ff1Sjsg 			&mpc_shift,
9561bb76ff1Sjsg 			&mpc_mask,
9571bb76ff1Sjsg 			num_mpcc,
9581bb76ff1Sjsg 			num_rmu);
9591bb76ff1Sjsg 
9601bb76ff1Sjsg 	return &mpc30->base;
9611bb76ff1Sjsg }
9621bb76ff1Sjsg 
9631bb76ff1Sjsg static struct output_pixel_processor *dcn321_opp_create(
9641bb76ff1Sjsg 	struct dc_context *ctx, uint32_t inst)
9651bb76ff1Sjsg {
9661bb76ff1Sjsg 	struct dcn20_opp *opp2 =
9671bb76ff1Sjsg 		kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
9681bb76ff1Sjsg 
9691bb76ff1Sjsg 	if (!opp2) {
9701bb76ff1Sjsg 		BREAK_TO_DEBUGGER();
9711bb76ff1Sjsg 		return NULL;
9721bb76ff1Sjsg 	}
9731bb76ff1Sjsg 
9741bb76ff1Sjsg #undef REG_STRUCT
9751bb76ff1Sjsg #define REG_STRUCT opp_regs
9761bb76ff1Sjsg 	opp_regs_init(0),
9771bb76ff1Sjsg 	opp_regs_init(1),
9781bb76ff1Sjsg 	opp_regs_init(2),
9791bb76ff1Sjsg 	opp_regs_init(3);
9801bb76ff1Sjsg 
9811bb76ff1Sjsg 	dcn20_opp_construct(opp2, ctx, inst,
9821bb76ff1Sjsg 			&opp_regs[inst], &opp_shift, &opp_mask);
9831bb76ff1Sjsg 	return &opp2->base;
9841bb76ff1Sjsg }
9851bb76ff1Sjsg 
9861bb76ff1Sjsg 
9871bb76ff1Sjsg static struct timing_generator *dcn321_timing_generator_create(
9881bb76ff1Sjsg 		struct dc_context *ctx,
9891bb76ff1Sjsg 		uint32_t instance)
9901bb76ff1Sjsg {
9911bb76ff1Sjsg 	struct optc *tgn10 =
9921bb76ff1Sjsg 		kzalloc(sizeof(struct optc), GFP_KERNEL);
9931bb76ff1Sjsg 
9941bb76ff1Sjsg 	if (!tgn10)
9951bb76ff1Sjsg 		return NULL;
9961bb76ff1Sjsg 
9971bb76ff1Sjsg #undef REG_STRUCT
9981bb76ff1Sjsg #define REG_STRUCT optc_regs
9991bb76ff1Sjsg 	optc_regs_init(0),
10001bb76ff1Sjsg 	optc_regs_init(1),
10011bb76ff1Sjsg 	optc_regs_init(2),
10021bb76ff1Sjsg 	optc_regs_init(3);
10031bb76ff1Sjsg 
10041bb76ff1Sjsg 	tgn10->base.inst = instance;
10051bb76ff1Sjsg 	tgn10->base.ctx = ctx;
10061bb76ff1Sjsg 
10071bb76ff1Sjsg 	tgn10->tg_regs = &optc_regs[instance];
10081bb76ff1Sjsg 	tgn10->tg_shift = &optc_shift;
10091bb76ff1Sjsg 	tgn10->tg_mask = &optc_mask;
10101bb76ff1Sjsg 
10111bb76ff1Sjsg 	dcn32_timing_generator_init(tgn10);
10121bb76ff1Sjsg 
10131bb76ff1Sjsg 	return &tgn10->base;
10141bb76ff1Sjsg }
10151bb76ff1Sjsg 
10161bb76ff1Sjsg static const struct encoder_feature_support link_enc_feature = {
10171bb76ff1Sjsg 		.max_hdmi_deep_color = COLOR_DEPTH_121212,
10181bb76ff1Sjsg 		.max_hdmi_pixel_clock = 600000,
10191bb76ff1Sjsg 		.hdmi_ycbcr420_supported = true,
10201bb76ff1Sjsg 		.dp_ycbcr420_supported = true,
10211bb76ff1Sjsg 		.fec_supported = true,
10221bb76ff1Sjsg 		.flags.bits.IS_HBR2_CAPABLE = true,
10231bb76ff1Sjsg 		.flags.bits.IS_HBR3_CAPABLE = true,
10241bb76ff1Sjsg 		.flags.bits.IS_TPS3_CAPABLE = true,
10251bb76ff1Sjsg 		.flags.bits.IS_TPS4_CAPABLE = true
10261bb76ff1Sjsg };
10271bb76ff1Sjsg 
10281bb76ff1Sjsg static struct link_encoder *dcn321_link_encoder_create(
10291bb76ff1Sjsg 	struct dc_context *ctx,
10301bb76ff1Sjsg 	const struct encoder_init_data *enc_init_data)
10311bb76ff1Sjsg {
10321bb76ff1Sjsg 	struct dcn20_link_encoder *enc20 =
10331bb76ff1Sjsg 		kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
10341bb76ff1Sjsg 
10351bb76ff1Sjsg 	if (!enc20)
10361bb76ff1Sjsg 		return NULL;
10371bb76ff1Sjsg 
10381bb76ff1Sjsg #undef REG_STRUCT
10391bb76ff1Sjsg #define REG_STRUCT link_enc_aux_regs
10401bb76ff1Sjsg 	aux_regs_init(0),
10411bb76ff1Sjsg 	aux_regs_init(1),
10421bb76ff1Sjsg 	aux_regs_init(2),
10431bb76ff1Sjsg 	aux_regs_init(3),
10441bb76ff1Sjsg 	aux_regs_init(4);
10451bb76ff1Sjsg 
10461bb76ff1Sjsg #undef REG_STRUCT
10471bb76ff1Sjsg #define REG_STRUCT link_enc_hpd_regs
10481bb76ff1Sjsg 	hpd_regs_init(0),
10491bb76ff1Sjsg 	hpd_regs_init(1),
10501bb76ff1Sjsg 	hpd_regs_init(2),
10511bb76ff1Sjsg 	hpd_regs_init(3),
10521bb76ff1Sjsg 	hpd_regs_init(4);
10531bb76ff1Sjsg 
10541bb76ff1Sjsg #undef REG_STRUCT
10551bb76ff1Sjsg #define REG_STRUCT link_enc_regs
10561bb76ff1Sjsg 	link_regs_init(0, A),
10571bb76ff1Sjsg 	link_regs_init(1, B),
10581bb76ff1Sjsg 	link_regs_init(2, C),
10591bb76ff1Sjsg 	link_regs_init(3, D),
10601bb76ff1Sjsg 	link_regs_init(4, E);
10611bb76ff1Sjsg 
10621bb76ff1Sjsg 	dcn321_link_encoder_construct(enc20,
10631bb76ff1Sjsg 			enc_init_data,
10641bb76ff1Sjsg 			&link_enc_feature,
10651bb76ff1Sjsg 			&link_enc_regs[enc_init_data->transmitter],
10661bb76ff1Sjsg 			&link_enc_aux_regs[enc_init_data->channel - 1],
10671bb76ff1Sjsg 			&link_enc_hpd_regs[enc_init_data->hpd_source],
10681bb76ff1Sjsg 			&le_shift,
10691bb76ff1Sjsg 			&le_mask);
10701bb76ff1Sjsg 
10711bb76ff1Sjsg 	return &enc20->enc10.base;
10721bb76ff1Sjsg }
10731bb76ff1Sjsg 
10741bb76ff1Sjsg static void read_dce_straps(
10751bb76ff1Sjsg 	struct dc_context *ctx,
10761bb76ff1Sjsg 	struct resource_straps *straps)
10771bb76ff1Sjsg {
10781bb76ff1Sjsg 	generic_reg_get(ctx, ctx->dcn_reg_offsets[regDC_PINSTRAPS_BASE_IDX] + regDC_PINSTRAPS,
10791bb76ff1Sjsg 		FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
10801bb76ff1Sjsg 
10811bb76ff1Sjsg }
10821bb76ff1Sjsg 
10831bb76ff1Sjsg static struct audio *dcn321_create_audio(
10841bb76ff1Sjsg 		struct dc_context *ctx, unsigned int inst)
10851bb76ff1Sjsg {
10861bb76ff1Sjsg 
10871bb76ff1Sjsg #undef REG_STRUCT
10881bb76ff1Sjsg #define REG_STRUCT audio_regs
10891bb76ff1Sjsg 	audio_regs_init(0),
10901bb76ff1Sjsg 	audio_regs_init(1),
10911bb76ff1Sjsg 	audio_regs_init(2),
10921bb76ff1Sjsg 	audio_regs_init(3),
10931bb76ff1Sjsg 	audio_regs_init(4);
10941bb76ff1Sjsg 
10951bb76ff1Sjsg 	return dce_audio_create(ctx, inst,
10961bb76ff1Sjsg 			&audio_regs[inst], &audio_shift, &audio_mask);
10971bb76ff1Sjsg }
10981bb76ff1Sjsg 
10991bb76ff1Sjsg static struct vpg *dcn321_vpg_create(
11001bb76ff1Sjsg 	struct dc_context *ctx,
11011bb76ff1Sjsg 	uint32_t inst)
11021bb76ff1Sjsg {
11031bb76ff1Sjsg 	struct dcn30_vpg *vpg3 = kzalloc(sizeof(struct dcn30_vpg), GFP_KERNEL);
11041bb76ff1Sjsg 
11051bb76ff1Sjsg 	if (!vpg3)
11061bb76ff1Sjsg 		return NULL;
11071bb76ff1Sjsg 
11081bb76ff1Sjsg #undef REG_STRUCT
11091bb76ff1Sjsg #define REG_STRUCT vpg_regs
11101bb76ff1Sjsg 	vpg_regs_init(0),
11111bb76ff1Sjsg 	vpg_regs_init(1),
11121bb76ff1Sjsg 	vpg_regs_init(2),
11131bb76ff1Sjsg 	vpg_regs_init(3),
11141bb76ff1Sjsg 	vpg_regs_init(4),
11151bb76ff1Sjsg 	vpg_regs_init(5),
11161bb76ff1Sjsg 	vpg_regs_init(6),
11171bb76ff1Sjsg 	vpg_regs_init(7),
11181bb76ff1Sjsg 	vpg_regs_init(8),
11191bb76ff1Sjsg 	vpg_regs_init(9);
11201bb76ff1Sjsg 
11211bb76ff1Sjsg 	vpg3_construct(vpg3, ctx, inst,
11221bb76ff1Sjsg 			&vpg_regs[inst],
11231bb76ff1Sjsg 			&vpg_shift,
11241bb76ff1Sjsg 			&vpg_mask);
11251bb76ff1Sjsg 
11261bb76ff1Sjsg 	return &vpg3->base;
11271bb76ff1Sjsg }
11281bb76ff1Sjsg 
11291bb76ff1Sjsg static struct afmt *dcn321_afmt_create(
11301bb76ff1Sjsg 	struct dc_context *ctx,
11311bb76ff1Sjsg 	uint32_t inst)
11321bb76ff1Sjsg {
11331bb76ff1Sjsg 	struct dcn30_afmt *afmt3 = kzalloc(sizeof(struct dcn30_afmt), GFP_KERNEL);
11341bb76ff1Sjsg 
11351bb76ff1Sjsg 	if (!afmt3)
11361bb76ff1Sjsg 		return NULL;
11371bb76ff1Sjsg 
11381bb76ff1Sjsg #undef REG_STRUCT
11391bb76ff1Sjsg #define REG_STRUCT afmt_regs
11401bb76ff1Sjsg 	afmt_regs_init(0),
11411bb76ff1Sjsg 	afmt_regs_init(1),
11421bb76ff1Sjsg 	afmt_regs_init(2),
11431bb76ff1Sjsg 	afmt_regs_init(3),
11441bb76ff1Sjsg 	afmt_regs_init(4),
11451bb76ff1Sjsg 	afmt_regs_init(5);
11461bb76ff1Sjsg 
11471bb76ff1Sjsg 	afmt3_construct(afmt3, ctx, inst,
11481bb76ff1Sjsg 			&afmt_regs[inst],
11491bb76ff1Sjsg 			&afmt_shift,
11501bb76ff1Sjsg 			&afmt_mask);
11511bb76ff1Sjsg 
11521bb76ff1Sjsg 	return &afmt3->base;
11531bb76ff1Sjsg }
11541bb76ff1Sjsg 
11551bb76ff1Sjsg static struct apg *dcn321_apg_create(
11561bb76ff1Sjsg 	struct dc_context *ctx,
11571bb76ff1Sjsg 	uint32_t inst)
11581bb76ff1Sjsg {
11591bb76ff1Sjsg 	struct dcn31_apg *apg31 = kzalloc(sizeof(struct dcn31_apg), GFP_KERNEL);
11601bb76ff1Sjsg 
11611bb76ff1Sjsg 	if (!apg31)
11621bb76ff1Sjsg 		return NULL;
11631bb76ff1Sjsg 
11641bb76ff1Sjsg #undef REG_STRUCT
11651bb76ff1Sjsg #define REG_STRUCT apg_regs
11661bb76ff1Sjsg 	apg_regs_init(0),
11671bb76ff1Sjsg 	apg_regs_init(1),
11681bb76ff1Sjsg 	apg_regs_init(2),
11691bb76ff1Sjsg 	apg_regs_init(3);
11701bb76ff1Sjsg 
11711bb76ff1Sjsg 	apg31_construct(apg31, ctx, inst,
11721bb76ff1Sjsg 			&apg_regs[inst],
11731bb76ff1Sjsg 			&apg_shift,
11741bb76ff1Sjsg 			&apg_mask);
11751bb76ff1Sjsg 
11761bb76ff1Sjsg 	return &apg31->base;
11771bb76ff1Sjsg }
11781bb76ff1Sjsg 
11791bb76ff1Sjsg static struct stream_encoder *dcn321_stream_encoder_create(
11801bb76ff1Sjsg 	enum engine_id eng_id,
11811bb76ff1Sjsg 	struct dc_context *ctx)
11821bb76ff1Sjsg {
11831bb76ff1Sjsg 	struct dcn10_stream_encoder *enc1;
11841bb76ff1Sjsg 	struct vpg *vpg;
11851bb76ff1Sjsg 	struct afmt *afmt;
11861bb76ff1Sjsg 	int vpg_inst;
11871bb76ff1Sjsg 	int afmt_inst;
11881bb76ff1Sjsg 
11891bb76ff1Sjsg 	/* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
11901bb76ff1Sjsg 	if (eng_id <= ENGINE_ID_DIGF) {
11911bb76ff1Sjsg 		vpg_inst = eng_id;
11921bb76ff1Sjsg 		afmt_inst = eng_id;
11931bb76ff1Sjsg 	} else
11941bb76ff1Sjsg 		return NULL;
11951bb76ff1Sjsg 
11961bb76ff1Sjsg 	enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
11971bb76ff1Sjsg 	vpg = dcn321_vpg_create(ctx, vpg_inst);
11981bb76ff1Sjsg 	afmt = dcn321_afmt_create(ctx, afmt_inst);
11991bb76ff1Sjsg 
12001bb76ff1Sjsg 	if (!enc1 || !vpg || !afmt) {
12011bb76ff1Sjsg 		kfree(enc1);
12021bb76ff1Sjsg 		kfree(vpg);
12031bb76ff1Sjsg 		kfree(afmt);
12041bb76ff1Sjsg 		return NULL;
12051bb76ff1Sjsg 	}
12061bb76ff1Sjsg 
12071bb76ff1Sjsg #undef REG_STRUCT
12081bb76ff1Sjsg #define REG_STRUCT stream_enc_regs
12091bb76ff1Sjsg 	stream_enc_regs_init(0),
12101bb76ff1Sjsg 	stream_enc_regs_init(1),
12111bb76ff1Sjsg 	stream_enc_regs_init(2),
12121bb76ff1Sjsg 	stream_enc_regs_init(3),
12131bb76ff1Sjsg 	stream_enc_regs_init(4);
12141bb76ff1Sjsg 
12151bb76ff1Sjsg 	dcn32_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
12161bb76ff1Sjsg 					eng_id, vpg, afmt,
12171bb76ff1Sjsg 					&stream_enc_regs[eng_id],
12181bb76ff1Sjsg 					&se_shift, &se_mask);
12191bb76ff1Sjsg 
12201bb76ff1Sjsg 	return &enc1->base;
12211bb76ff1Sjsg }
12221bb76ff1Sjsg 
12231bb76ff1Sjsg static struct hpo_dp_stream_encoder *dcn321_hpo_dp_stream_encoder_create(
12241bb76ff1Sjsg 	enum engine_id eng_id,
12251bb76ff1Sjsg 	struct dc_context *ctx)
12261bb76ff1Sjsg {
12271bb76ff1Sjsg 	struct dcn31_hpo_dp_stream_encoder *hpo_dp_enc31;
12281bb76ff1Sjsg 	struct vpg *vpg;
12291bb76ff1Sjsg 	struct apg *apg;
12301bb76ff1Sjsg 	uint32_t hpo_dp_inst;
12311bb76ff1Sjsg 	uint32_t vpg_inst;
12321bb76ff1Sjsg 	uint32_t apg_inst;
12331bb76ff1Sjsg 
12341bb76ff1Sjsg 	ASSERT((eng_id >= ENGINE_ID_HPO_DP_0) && (eng_id <= ENGINE_ID_HPO_DP_3));
12351bb76ff1Sjsg 	hpo_dp_inst = eng_id - ENGINE_ID_HPO_DP_0;
12361bb76ff1Sjsg 
12371bb76ff1Sjsg 	/* Mapping of VPG register blocks to HPO DP block instance:
12381bb76ff1Sjsg 	 * VPG[6] -> HPO_DP[0]
12391bb76ff1Sjsg 	 * VPG[7] -> HPO_DP[1]
12401bb76ff1Sjsg 	 * VPG[8] -> HPO_DP[2]
12411bb76ff1Sjsg 	 * VPG[9] -> HPO_DP[3]
12421bb76ff1Sjsg 	 */
12431bb76ff1Sjsg 	vpg_inst = hpo_dp_inst + 6;
12441bb76ff1Sjsg 
12451bb76ff1Sjsg 	/* Mapping of APG register blocks to HPO DP block instance:
12461bb76ff1Sjsg 	 * APG[0] -> HPO_DP[0]
12471bb76ff1Sjsg 	 * APG[1] -> HPO_DP[1]
12481bb76ff1Sjsg 	 * APG[2] -> HPO_DP[2]
12491bb76ff1Sjsg 	 * APG[3] -> HPO_DP[3]
12501bb76ff1Sjsg 	 */
12511bb76ff1Sjsg 	apg_inst = hpo_dp_inst;
12521bb76ff1Sjsg 
12531bb76ff1Sjsg 	/* allocate HPO stream encoder and create VPG sub-block */
12541bb76ff1Sjsg 	hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_stream_encoder), GFP_KERNEL);
12551bb76ff1Sjsg 	vpg = dcn321_vpg_create(ctx, vpg_inst);
12561bb76ff1Sjsg 	apg = dcn321_apg_create(ctx, apg_inst);
12571bb76ff1Sjsg 
12581bb76ff1Sjsg 	if (!hpo_dp_enc31 || !vpg || !apg) {
12591bb76ff1Sjsg 		kfree(hpo_dp_enc31);
12601bb76ff1Sjsg 		kfree(vpg);
12611bb76ff1Sjsg 		kfree(apg);
12621bb76ff1Sjsg 		return NULL;
12631bb76ff1Sjsg 	}
12641bb76ff1Sjsg 
12651bb76ff1Sjsg #undef REG_STRUCT
12661bb76ff1Sjsg #define REG_STRUCT hpo_dp_stream_enc_regs
12671bb76ff1Sjsg 	hpo_dp_stream_encoder_reg_init(0),
12681bb76ff1Sjsg 	hpo_dp_stream_encoder_reg_init(1),
12691bb76ff1Sjsg 	hpo_dp_stream_encoder_reg_init(2),
12701bb76ff1Sjsg 	hpo_dp_stream_encoder_reg_init(3);
12711bb76ff1Sjsg 
12721bb76ff1Sjsg 	dcn31_hpo_dp_stream_encoder_construct(hpo_dp_enc31, ctx, ctx->dc_bios,
12731bb76ff1Sjsg 					hpo_dp_inst, eng_id, vpg, apg,
12741bb76ff1Sjsg 					&hpo_dp_stream_enc_regs[hpo_dp_inst],
12751bb76ff1Sjsg 					&hpo_dp_se_shift, &hpo_dp_se_mask);
12761bb76ff1Sjsg 
12771bb76ff1Sjsg 	return &hpo_dp_enc31->base;
12781bb76ff1Sjsg }
12791bb76ff1Sjsg 
12801bb76ff1Sjsg static struct hpo_dp_link_encoder *dcn321_hpo_dp_link_encoder_create(
12811bb76ff1Sjsg 	uint8_t inst,
12821bb76ff1Sjsg 	struct dc_context *ctx)
12831bb76ff1Sjsg {
12841bb76ff1Sjsg 	struct dcn31_hpo_dp_link_encoder *hpo_dp_enc31;
12851bb76ff1Sjsg 
12861bb76ff1Sjsg 	/* allocate HPO link encoder */
12871bb76ff1Sjsg 	hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL);
1288*4b0e85adSjsg 	if (!hpo_dp_enc31)
1289*4b0e85adSjsg 		return NULL; /* out of memory */
12901bb76ff1Sjsg 
12911bb76ff1Sjsg #undef REG_STRUCT
12921bb76ff1Sjsg #define REG_STRUCT hpo_dp_link_enc_regs
12931bb76ff1Sjsg 	hpo_dp_link_encoder_reg_init(0),
12941bb76ff1Sjsg 	hpo_dp_link_encoder_reg_init(1);
12951bb76ff1Sjsg 
12961bb76ff1Sjsg 	hpo_dp_link_encoder32_construct(hpo_dp_enc31, ctx, inst,
12971bb76ff1Sjsg 					&hpo_dp_link_enc_regs[inst],
12981bb76ff1Sjsg 					&hpo_dp_le_shift, &hpo_dp_le_mask);
12991bb76ff1Sjsg 
13001bb76ff1Sjsg 	return &hpo_dp_enc31->base;
13011bb76ff1Sjsg }
13021bb76ff1Sjsg 
13031bb76ff1Sjsg static struct dce_hwseq *dcn321_hwseq_create(
13041bb76ff1Sjsg 	struct dc_context *ctx)
13051bb76ff1Sjsg {
13061bb76ff1Sjsg 	struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
13071bb76ff1Sjsg 
13081bb76ff1Sjsg #undef REG_STRUCT
13091bb76ff1Sjsg #define REG_STRUCT hwseq_reg
13101bb76ff1Sjsg 	hwseq_reg_init();
13111bb76ff1Sjsg 
13121bb76ff1Sjsg 	if (hws) {
13131bb76ff1Sjsg 		hws->ctx = ctx;
13141bb76ff1Sjsg 		hws->regs = &hwseq_reg;
13151bb76ff1Sjsg 		hws->shifts = &hwseq_shift;
13161bb76ff1Sjsg 		hws->masks = &hwseq_mask;
13171bb76ff1Sjsg 	}
13181bb76ff1Sjsg 	return hws;
13191bb76ff1Sjsg }
13201bb76ff1Sjsg static const struct resource_create_funcs res_create_funcs = {
13211bb76ff1Sjsg 	.read_dce_straps = read_dce_straps,
13221bb76ff1Sjsg 	.create_audio = dcn321_create_audio,
13231bb76ff1Sjsg 	.create_stream_encoder = dcn321_stream_encoder_create,
13241bb76ff1Sjsg 	.create_hpo_dp_stream_encoder = dcn321_hpo_dp_stream_encoder_create,
13251bb76ff1Sjsg 	.create_hpo_dp_link_encoder = dcn321_hpo_dp_link_encoder_create,
13261bb76ff1Sjsg 	.create_hwseq = dcn321_hwseq_create,
13271bb76ff1Sjsg };
13281bb76ff1Sjsg 
13291bb76ff1Sjsg static void dcn321_resource_destruct(struct dcn321_resource_pool *pool)
13301bb76ff1Sjsg {
13311bb76ff1Sjsg 	unsigned int i;
13321bb76ff1Sjsg 
13331bb76ff1Sjsg 	for (i = 0; i < pool->base.stream_enc_count; i++) {
13341bb76ff1Sjsg 		if (pool->base.stream_enc[i] != NULL) {
13351bb76ff1Sjsg 			if (pool->base.stream_enc[i]->vpg != NULL) {
13361bb76ff1Sjsg 				kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
13371bb76ff1Sjsg 				pool->base.stream_enc[i]->vpg = NULL;
13381bb76ff1Sjsg 			}
13391bb76ff1Sjsg 			if (pool->base.stream_enc[i]->afmt != NULL) {
13401bb76ff1Sjsg 				kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
13411bb76ff1Sjsg 				pool->base.stream_enc[i]->afmt = NULL;
13421bb76ff1Sjsg 			}
13431bb76ff1Sjsg 			kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
13441bb76ff1Sjsg 			pool->base.stream_enc[i] = NULL;
13451bb76ff1Sjsg 		}
13461bb76ff1Sjsg 	}
13471bb76ff1Sjsg 
13481bb76ff1Sjsg 	for (i = 0; i < pool->base.hpo_dp_stream_enc_count; i++) {
13491bb76ff1Sjsg 		if (pool->base.hpo_dp_stream_enc[i] != NULL) {
13501bb76ff1Sjsg 			if (pool->base.hpo_dp_stream_enc[i]->vpg != NULL) {
13511bb76ff1Sjsg 				kfree(DCN30_VPG_FROM_VPG(pool->base.hpo_dp_stream_enc[i]->vpg));
13521bb76ff1Sjsg 				pool->base.hpo_dp_stream_enc[i]->vpg = NULL;
13531bb76ff1Sjsg 			}
13541bb76ff1Sjsg 			if (pool->base.hpo_dp_stream_enc[i]->apg != NULL) {
13551bb76ff1Sjsg 				kfree(DCN31_APG_FROM_APG(pool->base.hpo_dp_stream_enc[i]->apg));
13561bb76ff1Sjsg 				pool->base.hpo_dp_stream_enc[i]->apg = NULL;
13571bb76ff1Sjsg 			}
13581bb76ff1Sjsg 			kfree(DCN3_1_HPO_DP_STREAM_ENC_FROM_HPO_STREAM_ENC(pool->base.hpo_dp_stream_enc[i]));
13591bb76ff1Sjsg 			pool->base.hpo_dp_stream_enc[i] = NULL;
13601bb76ff1Sjsg 		}
13611bb76ff1Sjsg 	}
13621bb76ff1Sjsg 
13631bb76ff1Sjsg 	for (i = 0; i < pool->base.hpo_dp_link_enc_count; i++) {
13641bb76ff1Sjsg 		if (pool->base.hpo_dp_link_enc[i] != NULL) {
13651bb76ff1Sjsg 			kfree(DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(pool->base.hpo_dp_link_enc[i]));
13661bb76ff1Sjsg 			pool->base.hpo_dp_link_enc[i] = NULL;
13671bb76ff1Sjsg 		}
13681bb76ff1Sjsg 	}
13691bb76ff1Sjsg 
13701bb76ff1Sjsg 	for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
13711bb76ff1Sjsg 		if (pool->base.dscs[i] != NULL)
13721bb76ff1Sjsg 			dcn20_dsc_destroy(&pool->base.dscs[i]);
13731bb76ff1Sjsg 	}
13741bb76ff1Sjsg 
13751bb76ff1Sjsg 	if (pool->base.mpc != NULL) {
13761bb76ff1Sjsg 		kfree(TO_DCN20_MPC(pool->base.mpc));
13771bb76ff1Sjsg 		pool->base.mpc = NULL;
13781bb76ff1Sjsg 	}
13791bb76ff1Sjsg 	if (pool->base.hubbub != NULL) {
13801bb76ff1Sjsg 		kfree(TO_DCN20_HUBBUB(pool->base.hubbub));
13811bb76ff1Sjsg 		pool->base.hubbub = NULL;
13821bb76ff1Sjsg 	}
13831bb76ff1Sjsg 	for (i = 0; i < pool->base.pipe_count; i++) {
13841bb76ff1Sjsg 		if (pool->base.dpps[i] != NULL)
13851bb76ff1Sjsg 			dcn321_dpp_destroy(&pool->base.dpps[i]);
13861bb76ff1Sjsg 
13871bb76ff1Sjsg 		if (pool->base.ipps[i] != NULL)
13881bb76ff1Sjsg 			pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
13891bb76ff1Sjsg 
13901bb76ff1Sjsg 		if (pool->base.hubps[i] != NULL) {
13911bb76ff1Sjsg 			kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
13921bb76ff1Sjsg 			pool->base.hubps[i] = NULL;
13931bb76ff1Sjsg 		}
13941bb76ff1Sjsg 
13951bb76ff1Sjsg 		if (pool->base.irqs != NULL)
13961bb76ff1Sjsg 			dal_irq_service_destroy(&pool->base.irqs);
13971bb76ff1Sjsg 	}
13981bb76ff1Sjsg 
13991bb76ff1Sjsg 	for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
14001bb76ff1Sjsg 		if (pool->base.engines[i] != NULL)
14011bb76ff1Sjsg 			dce110_engine_destroy(&pool->base.engines[i]);
14021bb76ff1Sjsg 		if (pool->base.hw_i2cs[i] != NULL) {
14031bb76ff1Sjsg 			kfree(pool->base.hw_i2cs[i]);
14041bb76ff1Sjsg 			pool->base.hw_i2cs[i] = NULL;
14051bb76ff1Sjsg 		}
14061bb76ff1Sjsg 		if (pool->base.sw_i2cs[i] != NULL) {
14071bb76ff1Sjsg 			kfree(pool->base.sw_i2cs[i]);
14081bb76ff1Sjsg 			pool->base.sw_i2cs[i] = NULL;
14091bb76ff1Sjsg 		}
14101bb76ff1Sjsg 	}
14111bb76ff1Sjsg 
14121bb76ff1Sjsg 	for (i = 0; i < pool->base.res_cap->num_opp; i++) {
14131bb76ff1Sjsg 		if (pool->base.opps[i] != NULL)
14141bb76ff1Sjsg 			pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
14151bb76ff1Sjsg 	}
14161bb76ff1Sjsg 
14171bb76ff1Sjsg 	for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
14181bb76ff1Sjsg 		if (pool->base.timing_generators[i] != NULL)	{
14191bb76ff1Sjsg 			kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
14201bb76ff1Sjsg 			pool->base.timing_generators[i] = NULL;
14211bb76ff1Sjsg 		}
14221bb76ff1Sjsg 	}
14231bb76ff1Sjsg 
14241bb76ff1Sjsg 	for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
14251bb76ff1Sjsg 		if (pool->base.dwbc[i] != NULL) {
14261bb76ff1Sjsg 			kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
14271bb76ff1Sjsg 			pool->base.dwbc[i] = NULL;
14281bb76ff1Sjsg 		}
14291bb76ff1Sjsg 		if (pool->base.mcif_wb[i] != NULL) {
14301bb76ff1Sjsg 			kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
14311bb76ff1Sjsg 			pool->base.mcif_wb[i] = NULL;
14321bb76ff1Sjsg 		}
14331bb76ff1Sjsg 	}
14341bb76ff1Sjsg 
14351bb76ff1Sjsg 	for (i = 0; i < pool->base.audio_count; i++) {
14361bb76ff1Sjsg 		if (pool->base.audios[i])
14371bb76ff1Sjsg 			dce_aud_destroy(&pool->base.audios[i]);
14381bb76ff1Sjsg 	}
14391bb76ff1Sjsg 
14401bb76ff1Sjsg 	for (i = 0; i < pool->base.clk_src_count; i++) {
14411bb76ff1Sjsg 		if (pool->base.clock_sources[i] != NULL) {
14421bb76ff1Sjsg 			dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
14431bb76ff1Sjsg 			pool->base.clock_sources[i] = NULL;
14441bb76ff1Sjsg 		}
14451bb76ff1Sjsg 	}
14461bb76ff1Sjsg 
14471bb76ff1Sjsg 	for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
14481bb76ff1Sjsg 		if (pool->base.mpc_lut[i] != NULL) {
14491bb76ff1Sjsg 			dc_3dlut_func_release(pool->base.mpc_lut[i]);
14501bb76ff1Sjsg 			pool->base.mpc_lut[i] = NULL;
14511bb76ff1Sjsg 		}
14521bb76ff1Sjsg 		if (pool->base.mpc_shaper[i] != NULL) {
14531bb76ff1Sjsg 			dc_transfer_func_release(pool->base.mpc_shaper[i]);
14541bb76ff1Sjsg 			pool->base.mpc_shaper[i] = NULL;
14551bb76ff1Sjsg 		}
14561bb76ff1Sjsg 	}
14571bb76ff1Sjsg 
14581bb76ff1Sjsg 	if (pool->base.dp_clock_source != NULL) {
14591bb76ff1Sjsg 		dcn20_clock_source_destroy(&pool->base.dp_clock_source);
14601bb76ff1Sjsg 		pool->base.dp_clock_source = NULL;
14611bb76ff1Sjsg 	}
14621bb76ff1Sjsg 
14631bb76ff1Sjsg 	for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
14641bb76ff1Sjsg 		if (pool->base.multiple_abms[i] != NULL)
14651bb76ff1Sjsg 			dce_abm_destroy(&pool->base.multiple_abms[i]);
14661bb76ff1Sjsg 	}
14671bb76ff1Sjsg 
14681bb76ff1Sjsg 	if (pool->base.psr != NULL)
14691bb76ff1Sjsg 		dmub_psr_destroy(&pool->base.psr);
14701bb76ff1Sjsg 
14711bb76ff1Sjsg 	if (pool->base.dccg != NULL)
14721bb76ff1Sjsg 		dcn_dccg_destroy(&pool->base.dccg);
14731bb76ff1Sjsg 
1474f005ef32Sjsg 	if (pool->base.oem_device != NULL) {
1475f005ef32Sjsg 		struct dc *dc = pool->base.oem_device->ctx->dc;
1476f005ef32Sjsg 
1477f005ef32Sjsg 		dc->link_srv->destroy_ddc_service(&pool->base.oem_device);
1478f005ef32Sjsg 	}
14791bb76ff1Sjsg }
14801bb76ff1Sjsg 
14811bb76ff1Sjsg 
14821bb76ff1Sjsg static bool dcn321_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
14831bb76ff1Sjsg {
14841bb76ff1Sjsg 	int i;
14851bb76ff1Sjsg 	uint32_t dwb_count = pool->res_cap->num_dwb;
14861bb76ff1Sjsg 
14871bb76ff1Sjsg 	for (i = 0; i < dwb_count; i++) {
14881bb76ff1Sjsg 		struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
14891bb76ff1Sjsg 						    GFP_KERNEL);
14901bb76ff1Sjsg 
14911bb76ff1Sjsg 		if (!dwbc30) {
14921bb76ff1Sjsg 			dm_error("DC: failed to create dwbc30!\n");
14931bb76ff1Sjsg 			return false;
14941bb76ff1Sjsg 		}
14951bb76ff1Sjsg 
14961bb76ff1Sjsg #undef REG_STRUCT
14971bb76ff1Sjsg #define REG_STRUCT dwbc30_regs
14981bb76ff1Sjsg 		dwbc_regs_dcn3_init(0);
14991bb76ff1Sjsg 
15001bb76ff1Sjsg 		dcn30_dwbc_construct(dwbc30, ctx,
15011bb76ff1Sjsg 				&dwbc30_regs[i],
15021bb76ff1Sjsg 				&dwbc30_shift,
15031bb76ff1Sjsg 				&dwbc30_mask,
15041bb76ff1Sjsg 				i);
15051bb76ff1Sjsg 
15061bb76ff1Sjsg 		pool->dwbc[i] = &dwbc30->base;
15071bb76ff1Sjsg 	}
15081bb76ff1Sjsg 	return true;
15091bb76ff1Sjsg }
15101bb76ff1Sjsg 
15111bb76ff1Sjsg static bool dcn321_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
15121bb76ff1Sjsg {
15131bb76ff1Sjsg 	int i;
15141bb76ff1Sjsg 	uint32_t dwb_count = pool->res_cap->num_dwb;
15151bb76ff1Sjsg 
15161bb76ff1Sjsg 	for (i = 0; i < dwb_count; i++) {
15171bb76ff1Sjsg 		struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
15181bb76ff1Sjsg 						    GFP_KERNEL);
15191bb76ff1Sjsg 
15201bb76ff1Sjsg 		if (!mcif_wb30) {
15211bb76ff1Sjsg 			dm_error("DC: failed to create mcif_wb30!\n");
15221bb76ff1Sjsg 			return false;
15231bb76ff1Sjsg 		}
15241bb76ff1Sjsg 
15251bb76ff1Sjsg #undef REG_STRUCT
15261bb76ff1Sjsg #define REG_STRUCT mcif_wb30_regs
15271bb76ff1Sjsg 		mcif_wb_regs_dcn3_init(0);
15281bb76ff1Sjsg 
15291bb76ff1Sjsg 		dcn32_mmhubbub_construct(mcif_wb30, ctx,
15301bb76ff1Sjsg 				&mcif_wb30_regs[i],
15311bb76ff1Sjsg 				&mcif_wb30_shift,
15321bb76ff1Sjsg 				&mcif_wb30_mask,
15331bb76ff1Sjsg 				i);
15341bb76ff1Sjsg 
15351bb76ff1Sjsg 		pool->mcif_wb[i] = &mcif_wb30->base;
15361bb76ff1Sjsg 	}
15371bb76ff1Sjsg 	return true;
15381bb76ff1Sjsg }
15391bb76ff1Sjsg 
15401bb76ff1Sjsg static struct display_stream_compressor *dcn321_dsc_create(
15411bb76ff1Sjsg 	struct dc_context *ctx, uint32_t inst)
15421bb76ff1Sjsg {
15431bb76ff1Sjsg 	struct dcn20_dsc *dsc =
15441bb76ff1Sjsg 		kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
15451bb76ff1Sjsg 
15461bb76ff1Sjsg 	if (!dsc) {
15471bb76ff1Sjsg 		BREAK_TO_DEBUGGER();
15481bb76ff1Sjsg 		return NULL;
15491bb76ff1Sjsg 	}
15501bb76ff1Sjsg 
15511bb76ff1Sjsg #undef REG_STRUCT
15521bb76ff1Sjsg #define REG_STRUCT dsc_regs
15531bb76ff1Sjsg 	dsc_regsDCN20_init(0),
15541bb76ff1Sjsg 	dsc_regsDCN20_init(1),
15551bb76ff1Sjsg 	dsc_regsDCN20_init(2),
15561bb76ff1Sjsg 	dsc_regsDCN20_init(3);
15571bb76ff1Sjsg 
15581bb76ff1Sjsg 	dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
15591bb76ff1Sjsg 
15601bb76ff1Sjsg 	dsc->max_image_width = 6016;
15611bb76ff1Sjsg 
15621bb76ff1Sjsg 	return &dsc->base;
15631bb76ff1Sjsg }
15641bb76ff1Sjsg 
15651bb76ff1Sjsg static void dcn321_destroy_resource_pool(struct resource_pool **pool)
15661bb76ff1Sjsg {
15671bb76ff1Sjsg 	struct dcn321_resource_pool *dcn321_pool = TO_DCN321_RES_POOL(*pool);
15681bb76ff1Sjsg 
15691bb76ff1Sjsg 	dcn321_resource_destruct(dcn321_pool);
15701bb76ff1Sjsg 	kfree(dcn321_pool);
15711bb76ff1Sjsg 	*pool = NULL;
15721bb76ff1Sjsg }
15731bb76ff1Sjsg 
15741bb76ff1Sjsg static struct dc_cap_funcs cap_funcs = {
15751bb76ff1Sjsg 	.get_dcc_compression_cap = dcn20_get_dcc_compression_cap
15761bb76ff1Sjsg };
15771bb76ff1Sjsg 
15781bb76ff1Sjsg static void dcn321_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params)
15791bb76ff1Sjsg {
15801bb76ff1Sjsg 	DC_FP_START();
15811bb76ff1Sjsg 	dcn321_update_bw_bounding_box_fpu(dc, bw_params);
15821bb76ff1Sjsg 	DC_FP_END();
15831bb76ff1Sjsg }
15841bb76ff1Sjsg 
15851bb76ff1Sjsg static struct resource_funcs dcn321_res_pool_funcs = {
15861bb76ff1Sjsg 	.destroy = dcn321_destroy_resource_pool,
15871bb76ff1Sjsg 	.link_enc_create = dcn321_link_encoder_create,
15881bb76ff1Sjsg 	.link_enc_create_minimal = NULL,
15891bb76ff1Sjsg 	.panel_cntl_create = dcn32_panel_cntl_create,
15901bb76ff1Sjsg 	.validate_bandwidth = dcn32_validate_bandwidth,
15911bb76ff1Sjsg 	.calculate_wm_and_dlg = dcn32_calculate_wm_and_dlg,
15921bb76ff1Sjsg 	.populate_dml_pipes = dcn32_populate_dml_pipes_from_context,
1593f005ef32Sjsg 	.acquire_free_pipe_as_secondary_dpp_pipe = dcn32_acquire_free_pipe_as_secondary_dpp_pipe,
15941bb76ff1Sjsg 	.add_stream_to_ctx = dcn30_add_stream_to_ctx,
15951bb76ff1Sjsg 	.add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
15961bb76ff1Sjsg 	.remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
15971bb76ff1Sjsg 	.populate_dml_writeback_from_context = dcn30_populate_dml_writeback_from_context,
15981bb76ff1Sjsg 	.set_mcif_arb_params = dcn30_set_mcif_arb_params,
15991bb76ff1Sjsg 	.find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
16001bb76ff1Sjsg 	.acquire_post_bldn_3dlut = dcn32_acquire_post_bldn_3dlut,
16011bb76ff1Sjsg 	.release_post_bldn_3dlut = dcn32_release_post_bldn_3dlut,
16021bb76ff1Sjsg 	.update_bw_bounding_box = dcn321_update_bw_bounding_box,
16031bb76ff1Sjsg 	.patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
16041bb76ff1Sjsg 	.update_soc_for_wm_a = dcn30_update_soc_for_wm_a,
16051bb76ff1Sjsg 	.add_phantom_pipes = dcn32_add_phantom_pipes,
16061bb76ff1Sjsg 	.remove_phantom_pipes = dcn32_remove_phantom_pipes,
160761d5f3a6Sjsg 	.retain_phantom_pipes = dcn32_retain_phantom_pipes,
1608f005ef32Sjsg 	.save_mall_state = dcn32_save_mall_state,
1609f005ef32Sjsg 	.restore_mall_state = dcn32_restore_mall_state,
16101bb76ff1Sjsg };
16111bb76ff1Sjsg 
1612a62fadd3Sjsg static uint32_t read_pipe_fuses(struct dc_context *ctx)
1613a62fadd3Sjsg {
1614a62fadd3Sjsg 	uint32_t value = REG_READ(CC_DC_PIPE_DIS);
1615a62fadd3Sjsg 	/* DCN321 support max 4 pipes */
1616a62fadd3Sjsg 	value = value & 0xf;
1617a62fadd3Sjsg 	return value;
1618a62fadd3Sjsg }
1619a62fadd3Sjsg 
16201bb76ff1Sjsg 
16211bb76ff1Sjsg static bool dcn321_resource_construct(
16221bb76ff1Sjsg 	uint8_t num_virtual_links,
16231bb76ff1Sjsg 	struct dc *dc,
16241bb76ff1Sjsg 	struct dcn321_resource_pool *pool)
16251bb76ff1Sjsg {
16261bb76ff1Sjsg 	int i, j;
16271bb76ff1Sjsg 	struct dc_context *ctx = dc->ctx;
16281bb76ff1Sjsg 	struct irq_service_init_data init_data;
16291bb76ff1Sjsg 	struct ddc_service_init_data ddc_init_data = {0};
16301bb76ff1Sjsg 	uint32_t pipe_fuses = 0;
16311bb76ff1Sjsg 	uint32_t num_pipes  = 4;
16321bb76ff1Sjsg 
16331bb76ff1Sjsg #undef REG_STRUCT
16341bb76ff1Sjsg #define REG_STRUCT bios_regs
16351bb76ff1Sjsg 	bios_regs_init();
16361bb76ff1Sjsg 
16371bb76ff1Sjsg #undef REG_STRUCT
16381bb76ff1Sjsg #define REG_STRUCT clk_src_regs
16391bb76ff1Sjsg 	clk_src_regs_init(0, A),
16401bb76ff1Sjsg 	clk_src_regs_init(1, B),
16411bb76ff1Sjsg 	clk_src_regs_init(2, C),
16421bb76ff1Sjsg 	clk_src_regs_init(3, D),
16431bb76ff1Sjsg 	clk_src_regs_init(4, E);
16441bb76ff1Sjsg 
16451bb76ff1Sjsg #undef REG_STRUCT
16461bb76ff1Sjsg #define REG_STRUCT abm_regs
16471bb76ff1Sjsg 	abm_regs_init(0),
16481bb76ff1Sjsg 	abm_regs_init(1),
16491bb76ff1Sjsg 	abm_regs_init(2),
16501bb76ff1Sjsg 	abm_regs_init(3);
16511bb76ff1Sjsg 
16521bb76ff1Sjsg #undef REG_STRUCT
16531bb76ff1Sjsg #define REG_STRUCT dccg_regs
16541bb76ff1Sjsg 	dccg_regs_init();
16551bb76ff1Sjsg 
16561bb76ff1Sjsg 
16571bb76ff1Sjsg 	ctx->dc_bios->regs = &bios_regs;
16581bb76ff1Sjsg 
16591bb76ff1Sjsg 	pool->base.res_cap = &res_cap_dcn321;
16601bb76ff1Sjsg 	/* max number of pipes for ASIC before checking for pipe fuses */
16611bb76ff1Sjsg 	num_pipes  = pool->base.res_cap->num_timing_generator;
1662a62fadd3Sjsg 	pipe_fuses = read_pipe_fuses(ctx);
16631bb76ff1Sjsg 
16641bb76ff1Sjsg 	for (i = 0; i < pool->base.res_cap->num_timing_generator; i++)
16651bb76ff1Sjsg 		if (pipe_fuses & 1 << i)
16661bb76ff1Sjsg 			num_pipes--;
16671bb76ff1Sjsg 
16681bb76ff1Sjsg 	if (pipe_fuses & 1)
16691bb76ff1Sjsg 		ASSERT(0); //Unexpected - Pipe 0 should always be fully functional!
16701bb76ff1Sjsg 
16711bb76ff1Sjsg 	if (pipe_fuses & CC_DC_PIPE_DIS__DC_FULL_DIS_MASK)
16721bb76ff1Sjsg 		ASSERT(0); //Entire DCN is harvested!
16731bb76ff1Sjsg 
16741bb76ff1Sjsg 	/* within dml lib, initial value is hard coded, if ASIC pipe is fused, the
16751bb76ff1Sjsg 	 * value will be changed, update max_num_dpp and max_num_otg for dml.
16761bb76ff1Sjsg 	 */
16771bb76ff1Sjsg 	dcn3_21_ip.max_num_dpp = num_pipes;
16781bb76ff1Sjsg 	dcn3_21_ip.max_num_otg = num_pipes;
16791bb76ff1Sjsg 
16801bb76ff1Sjsg 	pool->base.funcs = &dcn321_res_pool_funcs;
16811bb76ff1Sjsg 
16821bb76ff1Sjsg 	/*************************************************
16831bb76ff1Sjsg 	 *  Resource + asic cap harcoding                *
16841bb76ff1Sjsg 	 *************************************************/
16851bb76ff1Sjsg 	pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
16861bb76ff1Sjsg 	pool->base.timing_generator_count = num_pipes;
16871bb76ff1Sjsg 	pool->base.pipe_count = num_pipes;
16881bb76ff1Sjsg 	pool->base.mpcc_count = num_pipes;
16891bb76ff1Sjsg 	dc->caps.max_downscale_ratio = 600;
16901bb76ff1Sjsg 	dc->caps.i2c_speed_in_khz = 100;
16911bb76ff1Sjsg 	dc->caps.i2c_speed_in_khz_hdcp = 100; /*1.4 w/a applied by default*/
16921bb76ff1Sjsg 	/* TODO: Bring max cursor size back to 256 after subvp cursor corruption is fixed*/
16931bb76ff1Sjsg 	dc->caps.max_cursor_size = 64;
16941bb76ff1Sjsg 	dc->caps.min_horizontal_blanking_period = 80;
16951bb76ff1Sjsg 	dc->caps.dmdata_alloc_size = 2048;
1696cadf119fSjsg 	dc->caps.mall_size_per_mem_channel = 4;
16971bb76ff1Sjsg 	dc->caps.mall_size_total = 0;
16981bb76ff1Sjsg 	dc->caps.cursor_cache_size = dc->caps.max_cursor_size * dc->caps.max_cursor_size * 8;
16991bb76ff1Sjsg 	dc->caps.cache_line_size = 64;
17001bb76ff1Sjsg 	dc->caps.cache_num_ways = 16;
1701cadf119fSjsg 
1702cadf119fSjsg 	/* Calculate the available MALL space */
1703cadf119fSjsg 	dc->caps.max_cab_allocation_bytes = dcn32_calc_num_avail_chans_for_mall(
1704cadf119fSjsg 		dc, dc->ctx->dc_bios->vram_info.num_chans) *
1705cadf119fSjsg 		dc->caps.mall_size_per_mem_channel * 1024 * 1024;
1706cadf119fSjsg 	dc->caps.mall_size_total = dc->caps.max_cab_allocation_bytes;
1707cadf119fSjsg 
17081bb76ff1Sjsg 	dc->caps.subvp_fw_processing_delay_us = 15;
1709f005ef32Sjsg 	dc->caps.subvp_drr_max_vblank_margin_us = 40;
17101bb76ff1Sjsg 	dc->caps.subvp_prefetch_end_to_mall_start_us = 15;
17111bb76ff1Sjsg 	dc->caps.subvp_swath_height_margin_lines = 16;
17121bb76ff1Sjsg 	dc->caps.subvp_pstate_allow_width_us = 20;
17131bb76ff1Sjsg 	dc->caps.subvp_vertical_int_margin_us = 30;
1714f005ef32Sjsg 	dc->caps.subvp_drr_vblank_start_margin_us = 100; // 100us margin
1715f005ef32Sjsg 	dc->caps.max_slave_planes = 2;
1716f005ef32Sjsg 	dc->caps.max_slave_yuv_planes = 2;
1717f005ef32Sjsg 	dc->caps.max_slave_rgb_planes = 2;
17181bb76ff1Sjsg 	dc->caps.post_blend_color_processing = true;
17191bb76ff1Sjsg 	dc->caps.force_dp_tps4_for_cp2520 = true;
17201bb76ff1Sjsg 	dc->caps.dp_hpo = true;
17211bb76ff1Sjsg 	dc->caps.dp_hdmi21_pcon_support = true;
17221bb76ff1Sjsg 	dc->caps.edp_dsc_support = true;
17231bb76ff1Sjsg 	dc->caps.extended_aux_timeout_support = true;
17241bb76ff1Sjsg 	dc->caps.dmcub_support = true;
1725f005ef32Sjsg 	dc->caps.max_v_total = (1 << 15) - 1;
17261bb76ff1Sjsg 
17271bb76ff1Sjsg 	/* Color pipeline capabilities */
17281bb76ff1Sjsg 	dc->caps.color.dpp.dcn_arch = 1;
17291bb76ff1Sjsg 	dc->caps.color.dpp.input_lut_shared = 0;
17301bb76ff1Sjsg 	dc->caps.color.dpp.icsc = 1;
17311bb76ff1Sjsg 	dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
17321bb76ff1Sjsg 	dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
17331bb76ff1Sjsg 	dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
17341bb76ff1Sjsg 	dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
17351bb76ff1Sjsg 	dc->caps.color.dpp.dgam_rom_caps.pq = 1;
17361bb76ff1Sjsg 	dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
17371bb76ff1Sjsg 	dc->caps.color.dpp.post_csc = 1;
17381bb76ff1Sjsg 	dc->caps.color.dpp.gamma_corr = 1;
17391bb76ff1Sjsg 	dc->caps.color.dpp.dgam_rom_for_yuv = 0;
17401bb76ff1Sjsg 
17411bb76ff1Sjsg 	dc->caps.color.dpp.hw_3d_lut = 1;
17421bb76ff1Sjsg 	dc->caps.color.dpp.ogam_ram = 1;
17431bb76ff1Sjsg 	// no OGAM ROM on DCN2 and later ASICs
17441bb76ff1Sjsg 	dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
17451bb76ff1Sjsg 	dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
17461bb76ff1Sjsg 	dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
17471bb76ff1Sjsg 	dc->caps.color.dpp.ogam_rom_caps.pq = 0;
17481bb76ff1Sjsg 	dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
17491bb76ff1Sjsg 	dc->caps.color.dpp.ocsc = 0;
17501bb76ff1Sjsg 
17511bb76ff1Sjsg 	dc->caps.color.mpc.gamut_remap = 1;
17521bb76ff1Sjsg 	dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //4, configurable to be before or after BLND in MPCC
17531bb76ff1Sjsg 	dc->caps.color.mpc.ogam_ram = 1;
17541bb76ff1Sjsg 	dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
17551bb76ff1Sjsg 	dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
17561bb76ff1Sjsg 	dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
17571bb76ff1Sjsg 	dc->caps.color.mpc.ogam_rom_caps.pq = 0;
17581bb76ff1Sjsg 	dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
17591bb76ff1Sjsg 	dc->caps.color.mpc.ocsc = 1;
17601bb76ff1Sjsg 
1761ccec733dSjsg 	/* Use pipe context based otg sync logic */
1762ccec733dSjsg 	dc->config.use_pipe_ctx_sync_logic = true;
1763ccec733dSjsg 
1764f005ef32Sjsg 	dc->config.dc_mode_clk_limit_support = true;
17651bb76ff1Sjsg 	/* read VBIOS LTTPR caps */
17661bb76ff1Sjsg 	{
17671bb76ff1Sjsg 		if (ctx->dc_bios->funcs->get_lttpr_caps) {
17681bb76ff1Sjsg 			enum bp_result bp_query_result;
17691bb76ff1Sjsg 			uint8_t is_vbios_lttpr_enable = 0;
17701bb76ff1Sjsg 
17711bb76ff1Sjsg 			bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
17721bb76ff1Sjsg 			dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
17731bb76ff1Sjsg 		}
17741bb76ff1Sjsg 
17751bb76ff1Sjsg 		/* interop bit is implicit */
17761bb76ff1Sjsg 		{
17771bb76ff1Sjsg 			dc->caps.vbios_lttpr_aware = true;
17781bb76ff1Sjsg 		}
17791bb76ff1Sjsg 	}
17801bb76ff1Sjsg 
17811bb76ff1Sjsg 	if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
17821bb76ff1Sjsg 		dc->debug = debug_defaults_drv;
1783f005ef32Sjsg 
17841bb76ff1Sjsg 	// Init the vm_helper
17851bb76ff1Sjsg 	if (dc->vm_helper)
17861bb76ff1Sjsg 		vm_helper_init(dc->vm_helper, 16);
17871bb76ff1Sjsg 
17881bb76ff1Sjsg 	/*************************************************
17891bb76ff1Sjsg 	 *  Create resources                             *
17901bb76ff1Sjsg 	 *************************************************/
17911bb76ff1Sjsg 
17921bb76ff1Sjsg 	/* Clock Sources for Pixel Clock*/
17931bb76ff1Sjsg 	pool->base.clock_sources[DCN321_CLK_SRC_PLL0] =
17941bb76ff1Sjsg 			dcn321_clock_source_create(ctx, ctx->dc_bios,
17951bb76ff1Sjsg 				CLOCK_SOURCE_COMBO_PHY_PLL0,
17961bb76ff1Sjsg 				&clk_src_regs[0], false);
17971bb76ff1Sjsg 	pool->base.clock_sources[DCN321_CLK_SRC_PLL1] =
17981bb76ff1Sjsg 			dcn321_clock_source_create(ctx, ctx->dc_bios,
17991bb76ff1Sjsg 				CLOCK_SOURCE_COMBO_PHY_PLL1,
18001bb76ff1Sjsg 				&clk_src_regs[1], false);
18011bb76ff1Sjsg 	pool->base.clock_sources[DCN321_CLK_SRC_PLL2] =
18021bb76ff1Sjsg 			dcn321_clock_source_create(ctx, ctx->dc_bios,
18031bb76ff1Sjsg 				CLOCK_SOURCE_COMBO_PHY_PLL2,
18041bb76ff1Sjsg 				&clk_src_regs[2], false);
18051bb76ff1Sjsg 	pool->base.clock_sources[DCN321_CLK_SRC_PLL3] =
18061bb76ff1Sjsg 			dcn321_clock_source_create(ctx, ctx->dc_bios,
18071bb76ff1Sjsg 				CLOCK_SOURCE_COMBO_PHY_PLL3,
18081bb76ff1Sjsg 				&clk_src_regs[3], false);
18091bb76ff1Sjsg 	pool->base.clock_sources[DCN321_CLK_SRC_PLL4] =
18101bb76ff1Sjsg 			dcn321_clock_source_create(ctx, ctx->dc_bios,
18111bb76ff1Sjsg 				CLOCK_SOURCE_COMBO_PHY_PLL4,
18121bb76ff1Sjsg 				&clk_src_regs[4], false);
18131bb76ff1Sjsg 
18141bb76ff1Sjsg 	pool->base.clk_src_count = DCN321_CLK_SRC_TOTAL;
18151bb76ff1Sjsg 
18161bb76ff1Sjsg 	/* todo: not reuse phy_pll registers */
18171bb76ff1Sjsg 	pool->base.dp_clock_source =
18181bb76ff1Sjsg 			dcn321_clock_source_create(ctx, ctx->dc_bios,
18191bb76ff1Sjsg 				CLOCK_SOURCE_ID_DP_DTO,
18201bb76ff1Sjsg 				&clk_src_regs[0], true);
18211bb76ff1Sjsg 
18221bb76ff1Sjsg 	for (i = 0; i < pool->base.clk_src_count; i++) {
18231bb76ff1Sjsg 		if (pool->base.clock_sources[i] == NULL) {
18241bb76ff1Sjsg 			dm_error("DC: failed to create clock sources!\n");
18251bb76ff1Sjsg 			BREAK_TO_DEBUGGER();
18261bb76ff1Sjsg 			goto create_fail;
18271bb76ff1Sjsg 		}
18281bb76ff1Sjsg 	}
18291bb76ff1Sjsg 
18301bb76ff1Sjsg 	/* DCCG */
18311bb76ff1Sjsg 	pool->base.dccg = dccg32_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
18321bb76ff1Sjsg 	if (pool->base.dccg == NULL) {
18331bb76ff1Sjsg 		dm_error("DC: failed to create dccg!\n");
18341bb76ff1Sjsg 		BREAK_TO_DEBUGGER();
18351bb76ff1Sjsg 		goto create_fail;
18361bb76ff1Sjsg 	}
18371bb76ff1Sjsg 
18381bb76ff1Sjsg 	/* DML */
18391bb76ff1Sjsg 	dml_init_instance(&dc->dml, &dcn3_21_soc, &dcn3_21_ip, DML_PROJECT_DCN32);
18401bb76ff1Sjsg 
18411bb76ff1Sjsg 	/* IRQ Service */
18421bb76ff1Sjsg 	init_data.ctx = dc->ctx;
18431bb76ff1Sjsg 	pool->base.irqs = dal_irq_service_dcn32_create(&init_data);
18441bb76ff1Sjsg 	if (!pool->base.irqs)
18451bb76ff1Sjsg 		goto create_fail;
18461bb76ff1Sjsg 
18471bb76ff1Sjsg 	/* HUBBUB */
18481bb76ff1Sjsg 	pool->base.hubbub = dcn321_hubbub_create(ctx);
18491bb76ff1Sjsg 	if (pool->base.hubbub == NULL) {
18501bb76ff1Sjsg 		BREAK_TO_DEBUGGER();
18511bb76ff1Sjsg 		dm_error("DC: failed to create hubbub!\n");
18521bb76ff1Sjsg 		goto create_fail;
18531bb76ff1Sjsg 	}
18541bb76ff1Sjsg 
18551bb76ff1Sjsg 	/* HUBPs, DPPs, OPPs, TGs, ABMs */
18561bb76ff1Sjsg 	for (i = 0, j = 0; i < pool->base.res_cap->num_timing_generator; i++) {
18571bb76ff1Sjsg 
18581bb76ff1Sjsg 		/* if pipe is disabled, skip instance of HW pipe,
18591bb76ff1Sjsg 		 * i.e, skip ASIC register instance
18601bb76ff1Sjsg 		 */
18611bb76ff1Sjsg 		if (pipe_fuses & 1 << i)
18621bb76ff1Sjsg 			continue;
18631bb76ff1Sjsg 
18641bb76ff1Sjsg 		pool->base.hubps[j] = dcn321_hubp_create(ctx, i);
18651bb76ff1Sjsg 		if (pool->base.hubps[j] == NULL) {
18661bb76ff1Sjsg 			BREAK_TO_DEBUGGER();
18671bb76ff1Sjsg 			dm_error(
18681bb76ff1Sjsg 				"DC: failed to create hubps!\n");
18691bb76ff1Sjsg 			goto create_fail;
18701bb76ff1Sjsg 		}
18711bb76ff1Sjsg 
18721bb76ff1Sjsg 		pool->base.dpps[j] = dcn321_dpp_create(ctx, i);
18731bb76ff1Sjsg 		if (pool->base.dpps[j] == NULL) {
18741bb76ff1Sjsg 			BREAK_TO_DEBUGGER();
18751bb76ff1Sjsg 			dm_error(
18761bb76ff1Sjsg 				"DC: failed to create dpps!\n");
18771bb76ff1Sjsg 			goto create_fail;
18781bb76ff1Sjsg 		}
18791bb76ff1Sjsg 
18801bb76ff1Sjsg 		pool->base.opps[j] = dcn321_opp_create(ctx, i);
18811bb76ff1Sjsg 		if (pool->base.opps[j] == NULL) {
18821bb76ff1Sjsg 			BREAK_TO_DEBUGGER();
18831bb76ff1Sjsg 			dm_error(
18841bb76ff1Sjsg 				"DC: failed to create output pixel processor!\n");
18851bb76ff1Sjsg 			goto create_fail;
18861bb76ff1Sjsg 		}
18871bb76ff1Sjsg 
18881bb76ff1Sjsg 		pool->base.timing_generators[j] = dcn321_timing_generator_create(
18891bb76ff1Sjsg 				ctx, i);
18901bb76ff1Sjsg 		if (pool->base.timing_generators[j] == NULL) {
18911bb76ff1Sjsg 			BREAK_TO_DEBUGGER();
18921bb76ff1Sjsg 			dm_error("DC: failed to create tg!\n");
18931bb76ff1Sjsg 			goto create_fail;
18941bb76ff1Sjsg 		}
18951bb76ff1Sjsg 
18961bb76ff1Sjsg 		pool->base.multiple_abms[j] = dmub_abm_create(ctx,
18971bb76ff1Sjsg 				&abm_regs[i],
18981bb76ff1Sjsg 				&abm_shift,
18991bb76ff1Sjsg 				&abm_mask);
19001bb76ff1Sjsg 		if (pool->base.multiple_abms[j] == NULL) {
19011bb76ff1Sjsg 			dm_error("DC: failed to create abm for pipe %d!\n", i);
19021bb76ff1Sjsg 			BREAK_TO_DEBUGGER();
19031bb76ff1Sjsg 			goto create_fail;
19041bb76ff1Sjsg 		}
19051bb76ff1Sjsg 
19061bb76ff1Sjsg 		/* index for resource pool arrays for next valid pipe */
19071bb76ff1Sjsg 		j++;
19081bb76ff1Sjsg 	}
19091bb76ff1Sjsg 
19101bb76ff1Sjsg 	/* PSR */
19111bb76ff1Sjsg 	pool->base.psr = dmub_psr_create(ctx);
19121bb76ff1Sjsg 	if (pool->base.psr == NULL) {
19131bb76ff1Sjsg 		dm_error("DC: failed to create psr obj!\n");
19141bb76ff1Sjsg 		BREAK_TO_DEBUGGER();
19151bb76ff1Sjsg 		goto create_fail;
19161bb76ff1Sjsg 	}
19171bb76ff1Sjsg 
19181bb76ff1Sjsg 	/* MPCCs */
19191bb76ff1Sjsg 	pool->base.mpc = dcn321_mpc_create(ctx,  pool->base.res_cap->num_timing_generator, pool->base.res_cap->num_mpc_3dlut);
19201bb76ff1Sjsg 	if (pool->base.mpc == NULL) {
19211bb76ff1Sjsg 		BREAK_TO_DEBUGGER();
19221bb76ff1Sjsg 		dm_error("DC: failed to create mpc!\n");
19231bb76ff1Sjsg 		goto create_fail;
19241bb76ff1Sjsg 	}
19251bb76ff1Sjsg 
19261bb76ff1Sjsg 	/* DSCs */
19271bb76ff1Sjsg 	for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
19281bb76ff1Sjsg 		pool->base.dscs[i] = dcn321_dsc_create(ctx, i);
19291bb76ff1Sjsg 		if (pool->base.dscs[i] == NULL) {
19301bb76ff1Sjsg 			BREAK_TO_DEBUGGER();
19311bb76ff1Sjsg 			dm_error("DC: failed to create display stream compressor %d!\n", i);
19321bb76ff1Sjsg 			goto create_fail;
19331bb76ff1Sjsg 		}
19341bb76ff1Sjsg 	}
19351bb76ff1Sjsg 
19361bb76ff1Sjsg 	/* DWB */
19371bb76ff1Sjsg 	if (!dcn321_dwbc_create(ctx, &pool->base)) {
19381bb76ff1Sjsg 		BREAK_TO_DEBUGGER();
19391bb76ff1Sjsg 		dm_error("DC: failed to create dwbc!\n");
19401bb76ff1Sjsg 		goto create_fail;
19411bb76ff1Sjsg 	}
19421bb76ff1Sjsg 
19431bb76ff1Sjsg 	/* MMHUBBUB */
19441bb76ff1Sjsg 	if (!dcn321_mmhubbub_create(ctx, &pool->base)) {
19451bb76ff1Sjsg 		BREAK_TO_DEBUGGER();
19461bb76ff1Sjsg 		dm_error("DC: failed to create mcif_wb!\n");
19471bb76ff1Sjsg 		goto create_fail;
19481bb76ff1Sjsg 	}
19491bb76ff1Sjsg 
19501bb76ff1Sjsg 	/* AUX and I2C */
19511bb76ff1Sjsg 	for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
19521bb76ff1Sjsg 		pool->base.engines[i] = dcn321_aux_engine_create(ctx, i);
19531bb76ff1Sjsg 		if (pool->base.engines[i] == NULL) {
19541bb76ff1Sjsg 			BREAK_TO_DEBUGGER();
19551bb76ff1Sjsg 			dm_error(
19561bb76ff1Sjsg 				"DC:failed to create aux engine!!\n");
19571bb76ff1Sjsg 			goto create_fail;
19581bb76ff1Sjsg 		}
19591bb76ff1Sjsg 		pool->base.hw_i2cs[i] = dcn321_i2c_hw_create(ctx, i);
19601bb76ff1Sjsg 		if (pool->base.hw_i2cs[i] == NULL) {
19611bb76ff1Sjsg 			BREAK_TO_DEBUGGER();
19621bb76ff1Sjsg 			dm_error(
19631bb76ff1Sjsg 				"DC:failed to create hw i2c!!\n");
19641bb76ff1Sjsg 			goto create_fail;
19651bb76ff1Sjsg 		}
19661bb76ff1Sjsg 		pool->base.sw_i2cs[i] = NULL;
19671bb76ff1Sjsg 	}
19681bb76ff1Sjsg 
19691bb76ff1Sjsg 	/* Audio, HWSeq, Stream Encoders including HPO and virtual, MPC 3D LUTs */
19701bb76ff1Sjsg 	if (!resource_construct(num_virtual_links, dc, &pool->base,
1971f005ef32Sjsg 			&res_create_funcs))
19721bb76ff1Sjsg 		goto create_fail;
19731bb76ff1Sjsg 
19741bb76ff1Sjsg 	/* HW Sequencer init functions and Plane caps */
19751bb76ff1Sjsg 	dcn32_hw_sequencer_init_functions(dc);
19761bb76ff1Sjsg 
19771bb76ff1Sjsg 	dc->caps.max_planes =  pool->base.pipe_count;
19781bb76ff1Sjsg 
19791bb76ff1Sjsg 	for (i = 0; i < dc->caps.max_planes; ++i)
19801bb76ff1Sjsg 		dc->caps.planes[i] = plane_cap;
19811bb76ff1Sjsg 
19821bb76ff1Sjsg 	dc->cap_funcs = cap_funcs;
19831bb76ff1Sjsg 
19841bb76ff1Sjsg 	if (dc->ctx->dc_bios->fw_info.oem_i2c_present) {
19851bb76ff1Sjsg 		ddc_init_data.ctx = dc->ctx;
19861bb76ff1Sjsg 		ddc_init_data.link = NULL;
19871bb76ff1Sjsg 		ddc_init_data.id.id = dc->ctx->dc_bios->fw_info.oem_i2c_obj_id;
19881bb76ff1Sjsg 		ddc_init_data.id.enum_id = 0;
19891bb76ff1Sjsg 		ddc_init_data.id.type = OBJECT_TYPE_GENERIC;
1990f005ef32Sjsg 		pool->base.oem_device = dc->link_srv->create_ddc_service(&ddc_init_data);
19911bb76ff1Sjsg 	} else {
19921bb76ff1Sjsg 		pool->base.oem_device = NULL;
19931bb76ff1Sjsg 	}
19941bb76ff1Sjsg 
19951bb76ff1Sjsg 	return true;
19961bb76ff1Sjsg 
19971bb76ff1Sjsg create_fail:
19981bb76ff1Sjsg 
19991bb76ff1Sjsg 	dcn321_resource_destruct(pool);
20001bb76ff1Sjsg 
20011bb76ff1Sjsg 	return false;
20021bb76ff1Sjsg }
20031bb76ff1Sjsg 
20041bb76ff1Sjsg struct resource_pool *dcn321_create_resource_pool(
20051bb76ff1Sjsg 		const struct dc_init_data *init_data,
20061bb76ff1Sjsg 		struct dc *dc)
20071bb76ff1Sjsg {
20081bb76ff1Sjsg 	struct dcn321_resource_pool *pool =
20091bb76ff1Sjsg 		kzalloc(sizeof(struct dcn321_resource_pool), GFP_KERNEL);
20101bb76ff1Sjsg 
20111bb76ff1Sjsg 	if (!pool)
20121bb76ff1Sjsg 		return NULL;
20131bb76ff1Sjsg 
20141bb76ff1Sjsg 	if (dcn321_resource_construct(init_data->num_virtual_links, dc, pool))
20151bb76ff1Sjsg 		return &pool->base;
20161bb76ff1Sjsg 
20171bb76ff1Sjsg 	BREAK_TO_DEBUGGER();
20181bb76ff1Sjsg 	kfree(pool);
20191bb76ff1Sjsg 	return NULL;
20201bb76ff1Sjsg }
2021