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