1*31a0b877SKarl Li /* 2*31a0b877SKarl Li * Copyright (c) 2024, MediaTek Inc. All rights reserved. 3*31a0b877SKarl Li * 4*31a0b877SKarl Li * SPDX-License-Identifier: BSD-3-Clause 5*31a0b877SKarl Li */ 6*31a0b877SKarl Li 7*31a0b877SKarl Li #include <common/debug.h> 8*31a0b877SKarl Li #include <lib/utils_def.h> 9*31a0b877SKarl Li #include <platform_def.h> 10*31a0b877SKarl Li 11*31a0b877SKarl Li #include <apusys_devapc.h> 12*31a0b877SKarl Li #include <apusys_devapc_def.h> 13*31a0b877SKarl Li #include <mtk_mmap_pool.h> 14*31a0b877SKarl Li 15*31a0b877SKarl Li /* AO CONTROL DEVAPC - apu_rcx_ao_infra_dapc_con */ 16*31a0b877SKarl Li static const struct apc_dom_16 APUSYS_CTRL_DAPC_AO[] = { 17*31a0b877SKarl Li /* ctrl index = 0 */ 18*31a0b877SKarl Li SLAVE_RCX_BULK0("apu_ao_ctl_o-0"), 19*31a0b877SKarl Li SLAVE_MD32_APB("apu_ao_ctl_o-1"), 20*31a0b877SKarl Li SLAVE_ACP_TCU_SSC("apu_ao_ctl_o-2"), 21*31a0b877SKarl Li SLAVE_PTP_THM("apu_ao_ctl_o-3"), 22*31a0b877SKarl Li SLAVE_VCORE("apu_ao_ctl_o-4"), 23*31a0b877SKarl Li SLAVE_IOMMU0_BANK0("apu_ao_ctl_o-5"), 24*31a0b877SKarl Li SLAVE_IOMMU0_BANK1("apu_ao_ctl_o-6"), 25*31a0b877SKarl Li SLAVE_IOMMU0_BANK2("apu_ao_ctl_o-7"), 26*31a0b877SKarl Li SLAVE_IOMMU0_BANK3("apu_ao_ctl_o-8"), 27*31a0b877SKarl Li SLAVE_IOMMU0_BANK4("apu_ao_ctl_o-9"), 28*31a0b877SKarl Li 29*31a0b877SKarl Li /* ctrl index = 10 */ 30*31a0b877SKarl Li SLAVE_IOMMU1_BANK0("apu_ao_ctl_o-10"), 31*31a0b877SKarl Li SLAVE_IOMMU1_BANK1("apu_ao_ctl_o-11"), 32*31a0b877SKarl Li SLAVE_IOMMU1_BANK2("apu_ao_ctl_o-12"), 33*31a0b877SKarl Li SLAVE_IOMMU1_BANK3("apu_ao_ctl_o-13"), 34*31a0b877SKarl Li SLAVE_IOMMU1_BANK4("apu_ao_ctl_o-14"), 35*31a0b877SKarl Li SLAVE_S0_SSC("apu_ao_ctl_o-15"), 36*31a0b877SKarl Li SLAVE_N0_SSC("apu_ao_ctl_o-16"), 37*31a0b877SKarl Li SLAVE_S1_SSC("apu_ao_ctl_o-17"), 38*31a0b877SKarl Li SLAVE_N1_SSC("apu_ao_ctl_o-18"), 39*31a0b877SKarl Li SLAVE_ACP_SSC("apu_ao_ctl_o-19"), 40*31a0b877SKarl Li 41*31a0b877SKarl Li /* ctrl index = 20 */ 42*31a0b877SKarl Li SLAVE_WDEC("apu_ao_ctl_o-20"), 43*31a0b877SKarl Li SLAVE_SMMU_IP_REG("apu_ao_ctl_o-21"), 44*31a0b877SKarl Li SLAVE_SMMU_NSEC("apu_ao_ctl_o-22"), 45*31a0b877SKarl Li SLAVE_SMMU_SEC("apu_ao_ctl_o-23"), 46*31a0b877SKarl Li SLAVE_ARE0("apu_ao_ctl_o-24"), 47*31a0b877SKarl Li SLAVE_ARE1("apu_ao_ctl_o-25"), 48*31a0b877SKarl Li SLAVE_SONC("apu_ao_ctl_o-26"), 49*31a0b877SKarl Li SLAVE_RPC("apu_ao_ctl_o-28"), 50*31a0b877SKarl Li SLAVE_PCU("apu_ao_ctl_o-29"), 51*31a0b877SKarl Li SLAVE_AO_CTRL("apu_ao_ctl_o-30"), 52*31a0b877SKarl Li 53*31a0b877SKarl Li /* ctrl index = 30 */ 54*31a0b877SKarl Li SLAVE_AO_CTRL("apu_ao_ctl_o-31"), 55*31a0b877SKarl Li SLAVE_ACC("apu_ao_ctl_o-32"), 56*31a0b877SKarl Li SLAVE_SEC("apu_ao_ctl_o-33"), 57*31a0b877SKarl Li SLAVE_PLL("apu_ao_ctl_o-34"), 58*31a0b877SKarl Li SLAVE_RPC_MDLA("apu_ao_ctl_o-35"), 59*31a0b877SKarl Li SLAVE_TOP_PMU("apu_ao_ctl_o-36"), 60*31a0b877SKarl Li SLAVE_AO_BCRM("apu_ao_ctl_o-37"), 61*31a0b877SKarl Li SLAVE_AO_DAPC_WRAP("apu_ao_ctl_o-38"), 62*31a0b877SKarl Li SLAVE_AO_DAPC_CON("apu_ao_ctl_o-39"), 63*31a0b877SKarl Li SLAVE_UNDEFINE0("apu_ao_ctl_o-40"), 64*31a0b877SKarl Li 65*31a0b877SKarl Li /* ctrl index = 40 */ 66*31a0b877SKarl Li SLAVE_UNDEFINE1("apu_ao_ctl_o-41"), 67*31a0b877SKarl Li SLAVE_RCX_BULK0("apu_ao_ctl_o-42"), 68*31a0b877SKarl Li SLAVE_UNDEFINE2("apu_ao_ctl_o-43"), 69*31a0b877SKarl Li SLAVE_UNDEFINE3("apu_ao_ctl_o-44"), 70*31a0b877SKarl Li SLAVE_UNDEFINE4("apu_ao_ctl_o-45"), 71*31a0b877SKarl Li SLAVE_UNDEFINE5("apu_ao_ctl_o-46"), 72*31a0b877SKarl Li SLAVE_UNDEFINE6("apu_ao_ctl_o-47"), 73*31a0b877SKarl Li SLAVE_UNDEFINE7("apu_ao_ctl_o-48"), 74*31a0b877SKarl Li SLAVE_DATA_BULK("apu_ao_ctl_o-49"), 75*31a0b877SKarl Li SLAVE_ACX0_BULK("apu_ao_ctl_o-50"), 76*31a0b877SKarl Li 77*31a0b877SKarl Li /* ctrl index = 50 */ 78*31a0b877SKarl Li SLAVE_ACX0_AO("apu_ao_ctl_o-51"), 79*31a0b877SKarl Li SLAVE_ACX1_BULK("apu_ao_ctl_o-52"), 80*31a0b877SKarl Li SLAVE_ACX1_AO("apu_ao_ctl_o-53"), 81*31a0b877SKarl Li SLAVE_NCX_BULK("apu_ao_ctl_o-54"), 82*31a0b877SKarl Li SLAVE_NCX_AO("apu_ao_ctl_o-55"), 83*31a0b877SKarl Li SLAVE_ACX0_BULK("apu_rcx2acx0_o-0"), 84*31a0b877SKarl Li SLAVE_ACX0_AO("apu_rcx2acx0_o-1"), 85*31a0b877SKarl Li SLAVE_ACX0_BULK("apu_sae2acx0_o-0"), 86*31a0b877SKarl Li SLAVE_ACX0_AO("apu_sae2acx0_o-1"), 87*31a0b877SKarl Li SLAVE_ACX1_BULK("apu_rcx2acx1_o-0"), 88*31a0b877SKarl Li 89*31a0b877SKarl Li /* ctrl index = 60 */ 90*31a0b877SKarl Li SLAVE_ACX1_AO("apu_rcx2acx1_o-1"), 91*31a0b877SKarl Li SLAVE_ACX1_BULK("apu_sae2acx1_o-0"), 92*31a0b877SKarl Li SLAVE_ACX1_AO("apu_sae2acx1_o-1"), 93*31a0b877SKarl Li SLAVE_NCX_BULK("apu_rcx2ncx_o-0"), 94*31a0b877SKarl Li SLAVE_NCX_AO("apu_rcx2ncx_o-1"), 95*31a0b877SKarl Li SLAVE_NCX_BULK("apu_sae2ncx_o-0"), 96*31a0b877SKarl Li SLAVE_NCX_AO("apu_sae2ncx_o-1"), 97*31a0b877SKarl Li }; 98*31a0b877SKarl Li 99*31a0b877SKarl Li static enum apusys_apc_err_status set_slave_ctrl_apc(uint32_t slave, 100*31a0b877SKarl Li enum apusys_apc_type type, 101*31a0b877SKarl Li enum apusys_apc_domain_id domain_id, 102*31a0b877SKarl Li enum apusys_apc_perm_type perm) 103*31a0b877SKarl Li { 104*31a0b877SKarl Li uint32_t apc_register_index; 105*31a0b877SKarl Li uint32_t apc_set_index; 106*31a0b877SKarl Li uint32_t base = 0; 107*31a0b877SKarl Li uint32_t clr_bit; 108*31a0b877SKarl Li uint32_t set_bit; 109*31a0b877SKarl Li uint32_t slave_num_in_1_dom; 110*31a0b877SKarl Li uint32_t slave_num, dom_num; 111*31a0b877SKarl Li uint32_t dapc_base; 112*31a0b877SKarl Li 113*31a0b877SKarl Li if (perm >= PERM_NUM) { 114*31a0b877SKarl Li ERROR("%s: permission type:0x%x is not supported!\n", __func__, perm); 115*31a0b877SKarl Li return APUSYS_APC_ERR_PERMISSION_NOT_SUPPORTED; 116*31a0b877SKarl Li } 117*31a0b877SKarl Li 118*31a0b877SKarl Li switch (type) { 119*31a0b877SKarl Li case DAPC_AO: 120*31a0b877SKarl Li slave_num_in_1_dom = APUSYS_CTRL_DAPC_AO_SLAVE_NUM_IN_1_DOM; 121*31a0b877SKarl Li slave_num = APUSYS_CTRL_DAPC_AO_SLAVE_NUM; 122*31a0b877SKarl Li dom_num = APUSYS_CTRL_DAPC_AO_DOM_NUM; 123*31a0b877SKarl Li dapc_base = APUSYS_CTRL_DAPC_AO_BASE; 124*31a0b877SKarl Li break; 125*31a0b877SKarl Li default: 126*31a0b877SKarl Li ERROR("%s: unsupported devapc type: %u\n", __func__, type); 127*31a0b877SKarl Li return APUSYS_APC_ERR_GENERIC; 128*31a0b877SKarl Li } 129*31a0b877SKarl Li 130*31a0b877SKarl Li apc_register_index = slave / slave_num_in_1_dom; 131*31a0b877SKarl Li apc_set_index = slave % slave_num_in_1_dom; 132*31a0b877SKarl Li 133*31a0b877SKarl Li clr_bit = DEVAPC_MASK << (apc_set_index * DEVAPC_DOM_SHIFT); 134*31a0b877SKarl Li set_bit = (uint32_t)perm << (apc_set_index * DEVAPC_DOM_SHIFT); 135*31a0b877SKarl Li 136*31a0b877SKarl Li if (slave < slave_num && domain_id < dom_num) { 137*31a0b877SKarl Li base = dapc_base + domain_id * DEVAPC_DOM_SIZE 138*31a0b877SKarl Li + apc_register_index * DEVAPC_REG_SIZE; 139*31a0b877SKarl Li } else { 140*31a0b877SKarl Li ERROR("%s: out of boundary, devapc type: %d, slave: 0x%x, domain_id: 0x%x\n", 141*31a0b877SKarl Li __func__, type, slave, domain_id); 142*31a0b877SKarl Li return APUSYS_APC_ERR_OUT_OF_BOUNDARY; 143*31a0b877SKarl Li } 144*31a0b877SKarl Li 145*31a0b877SKarl Li if (!base) 146*31a0b877SKarl Li return APUSYS_APC_ERR_GENERIC; 147*31a0b877SKarl Li 148*31a0b877SKarl Li mmio_clrsetbits_32(base, clr_bit, set_bit); 149*31a0b877SKarl Li return APUSYS_APC_OK; 150*31a0b877SKarl Li } 151*31a0b877SKarl Li 152*31a0b877SKarl Li static enum apusys_apc_err_status set_slave_ao_ctrl_apc(uint32_t slave, 153*31a0b877SKarl Li enum apusys_apc_domain_id domain_id, 154*31a0b877SKarl Li enum apusys_apc_perm_type perm) 155*31a0b877SKarl Li { 156*31a0b877SKarl Li return set_slave_ctrl_apc(slave, DAPC_AO, domain_id, perm); 157*31a0b877SKarl Li } 158*31a0b877SKarl Li 159*31a0b877SKarl Li static void apusys_devapc_init(uint32_t base) 160*31a0b877SKarl Li { 161*31a0b877SKarl Li mmio_write_32(APUSYS_DAPC_CON(base), APUSYS_DAPC_CON_VIO_MASK); 162*31a0b877SKarl Li } 163*31a0b877SKarl Li 164*31a0b877SKarl Li int apusys_devapc_ao_init(void) 165*31a0b877SKarl Li { 166*31a0b877SKarl Li int32_t ret = APUSYS_APC_OK; 167*31a0b877SKarl Li 168*31a0b877SKarl Li apusys_devapc_init(APUSYS_CTRL_DAPC_AO_BASE); 169*31a0b877SKarl Li 170*31a0b877SKarl Li ret = SET_APUSYS_DAPC_V1(APUSYS_CTRL_DAPC_AO, set_slave_ao_ctrl_apc); 171*31a0b877SKarl Li 172*31a0b877SKarl Li if (ret) { 173*31a0b877SKarl Li ERROR("[APUAPC_AO] %s: set_apusys_ao_ctrl_dapc failed\n", __func__); 174*31a0b877SKarl Li return ret; 175*31a0b877SKarl Li } 176*31a0b877SKarl Li 177*31a0b877SKarl Li #ifdef DUMP_CFG 178*31a0b877SKarl Li DUMP_APUSYS_DAPC_V1(APUSYS_CTRL_DAPC_AO); 179*31a0b877SKarl Li #endif 180*31a0b877SKarl Li 181*31a0b877SKarl Li INFO("[APUAPC_AO] %s done\n", __func__); 182*31a0b877SKarl Li 183*31a0b877SKarl Li return ret; 184*31a0b877SKarl Li } 185