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