xref: /rk3399_ARM-atf/plat/mediatek/drivers/apusys/mt8196/apusys_devapc.c (revision 6d415de83fe084c08558895837d0eb90210420a9)
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 
100 /* RCX CONTROL DEVAPC - apu_rcx_infra_dapc_con */
101 static const struct apc_dom_16 APUSYS_CTRL_DAPC_RCX[] = {
102 	/* ctrl index = 0 */
103 	SLAVE_ACX0_BULK("acx0_apbs-0"),
104 	SLAVE_ACX0_RPC("acx0_apbs-1"),
105 	SLAVE_ACX0_AO_CTRL("acx0_apbs-2"),
106 	SLAVE_UNDEFINE8("acx0_apbs-3"),
107 	SLAVE_ACX1_BULK("acx1_apbs-0"),
108 	SLAVE_ACX1_RPC("acx1_apbs-1"),
109 	SLAVE_ACX1_AO_CTRL("acx1_apbs-2"),
110 	SLAVE_UNDEFINE9("acx1_apbs-3"),
111 	SLAVE_NCX_BULK("ncx_apbs-0"),
112 	SLAVE_NCX_RPC("ncx_apbs-1"),
113 
114 	/* ctrl index = 10 */
115 	SLAVE_NCX_AO_CTRL("ncx_apbs-2"),
116 	SLAVE_UNDEFINE10("ncx_apbs-3"),
117 	SLAVE_MD32_SYSCTRL("md32_apb_s-0"),
118 	SLAVE_MD32_PMU("md32_apb_s-1"),
119 	SLAVE_MD32_WDT("md32_apb_s-2"),
120 	SLAVE_MD32_CACHE("md32_apb_s-3"),
121 	SLAVE_ARE0("apusys_ao-0"),
122 	SLAVE_ARE1("apusys_ao-1"),
123 	SLAVE_SONC("apusys_ao-2"),
124 	SLAVE_RPC("apusys_ao-3"),
125 
126 	/* ctrl index = 20 */
127 	SLAVE_PCU("apusys_ao-4"),
128 	SLAVE_AO_CTRL("apusys_ao-5"),
129 	SLAVE_AO_CTRL("apusys_ao-6"),
130 	SLAVE_SEC("apusys_ao-7"),
131 	SLAVE_PLL("apusys_ao-8"),
132 	SLAVE_RPC_MDLA("apusys_ao-9"),
133 	SLAVE_TOP_PMU("apusys_ao-10"),
134 	SLAVE_AO_BCRM("apusys_ao-11"),
135 	SLAVE_AO_DAPC_WRAP("apusys_ao-12"),
136 	SLAVE_AO_DAPC_CON("apusys_ao-13"),
137 
138 	/* ctrl index = 30 */
139 	SLAVE_VCORE("apusys_ao-14"),
140 	SLAVE_IOMMU0_BANK0("apusys_ao-15"),
141 	SLAVE_IOMMU0_BANK1("apusys_ao-16"),
142 	SLAVE_IOMMU0_BANK2("apusys_ao-17"),
143 	SLAVE_IOMMU0_BANK3("apusys_ao-18"),
144 	SLAVE_IOMMU0_BANK4("apusys_ao-19"),
145 	SLAVE_IOMMU1_BANK0("apu_ao_ctl_o-20"),
146 	SLAVE_IOMMU1_BANK1("apu_ao_ctl_o-21"),
147 	SLAVE_IOMMU1_BANK2("apu_ao_ctl_o-22"),
148 	SLAVE_IOMMU1_BANK3("apu_ao_ctl_o-23"),
149 
150 	/* ctrl index = 40 */
151 	SLAVE_IOMMU1_BANK4("apu_ao_ctl_o-24"),
152 	SLAVE_S0_SSC("apu_ao_ctl_o-25"),
153 	SLAVE_N0_SSC("apu_ao_ctl_o-26"),
154 	SLAVE_S1_SSC("apu_ao_ctl_o-27"),
155 	SLAVE_N1_SSC("apu_ao_ctl_o-28"),
156 	SLAVE_ACP_SSC("apu_ao_ctl_o-29"),
157 	SLAVE_ACP_TCU_SSC("apu_ao_ctl_o-30"),
158 	SLAVE_PTP_THM("apu_ao_ctl_o-31"),
159 	SLAVE_WDEC("apu_ao_ctl_o-32"),
160 	SLAVE_SMMU_IP_REG("apu_ao_ctl_o-33"),
161 
162 	/* ctrl index = 50 */
163 	SLAVE_SMMU_NSEC("apu_ao_ctl_o-34"),
164 	SLAVE_SMMU_SEC("apu_ao_ctl_o-35"),
165 	SLAVE_DATA_BULK("noc_axi"),
166 	SLAVE_MD32_DBG("md32_dbg"),
167 	SLAVE_MDLA_DBG("mdla_dbg"),
168 	SLAVE_INFRA_DBG("apb_infra_dbg"),
169 	SLAVE_LOG_TOP0("apu_logtop-0"),
170 	SLAVE_LOG_TOP1("apu_logtop-1"),
171 	SLAVE_RCX_CFG("apu_rcx_cfg"),
172 	SLAVE_ACX_IPS("apu_acx_ips"),
173 
174 	/* ctrl index = 60 */
175 	SLAVE_SEMA_STIMER("apu_sema_stimer"),
176 	SLAVE_EMI_CFG("apu_emi_cfg"),
177 	SLAVE_CPE_SENSOR("apu_cpe_sensor"),
178 	SLAVE_CPE_COEF("apu_cpe_coef"),
179 	SLAVE_CPE_CTRL("apu_cpe_ctrl"),
180 	SLAVE_TPPA("apu_dfd"),
181 	SLAVE_SENSOR_ACX0_DLA0("apu_sen_acx0_dla0"),
182 	SLAVE_SENSOR_ACX0_VPU("apu_sen_acx0_vpu"),
183 	SLAVE_SENSOR_ACX1_DLA0("apu_sen_acx1_dla0"),
184 	SLAVE_SENSOR_ACX1_VPU("apu_sen_acx1_vpu"),
185 
186 	/* ctrl index = 70 */
187 	SLAVE_SENSOR_NCX_DLA0("apu_sen_ncx_dla0"),
188 	SLAVE_SENSOR_NCX_NVE("apu_sen_ncx_nve"),
189 	SLAVE_RCX_TCU0("noc_cfg-0"),
190 	SLAVE_RCX_TCU1("noc_cfg-1"),
191 	SLAVE_RCX_TCU2("noc_cfg-2"),
192 	SLAVE_RCX_TCU3("noc_cfg-3"),
193 	SLAVE_RCX_TCU4("noc_cfg-4"),
194 	SLAVE_RCX_TCU5("noc_cfg-5"),
195 	SLAVE_RCX_TCU6("noc_cfg-6"),
196 	SLAVE_RCX_NOC_CFG("noc_cfg-7"),
197 
198 	/* ctrl index = 80 */
199 	SLAVE_SCMDQ("apu_hse-0"),
200 	SLAVE_HSE("apu_hse-1"),
201 	SLAVE_MDLA_CORE_CTRL("mdla_cfg-0"),
202 	SLAVE_MDLA_BIU("mdla_cfg-1"),
203 	SLAVE_MDLA_PMU("mdla_cfg-2"),
204 	SLAVE_MDLA_CMDE("mdla_cfg-3"),
205 	SLAVE_EDPA0("apu_edpa-0"),
206 	SLAVE_EDPA1("apu_edpa-1"),
207 	SLAVE_RCX_BCRM("infra_bcrm"),
208 	SLAVE_RCX_DAPC_WRAP("infra_dpac_wrap"),
209 
210 	/* ctrl index = 90 */
211 	SLAVE_RCX_DAPC_CON("infra_dapc_con"),
212 	SLAVE_RCX_CMU("rcx_cmu"),
213 	SLAVE_RCX_ACS("apu_rcx_acs"),
214 	SLAVE_RCX_CBFC("rcx_cbfc"),
215 	SLAVE_ACC("acc"),
216 };
217 
218 static enum apusys_apc_err_status set_slave_ctrl_apc(uint32_t slave,
219 						     enum apusys_apc_type type,
220 						     enum apusys_apc_domain_id domain_id,
221 						     enum apusys_apc_perm_type perm)
222 {
223 	uint32_t apc_register_index;
224 	uint32_t apc_set_index;
225 	uint32_t base = 0;
226 	uint32_t clr_bit;
227 	uint32_t set_bit;
228 	uint32_t slave_num_in_1_dom;
229 	uint32_t slave_num, dom_num;
230 	uint32_t dapc_base;
231 
232 	if (perm >= PERM_NUM) {
233 		ERROR("%s: permission type:0x%x is not supported!\n", __func__, perm);
234 		return APUSYS_APC_ERR_PERMISSION_NOT_SUPPORTED;
235 	}
236 
237 	switch (type) {
238 	case DAPC_AO:
239 		slave_num_in_1_dom = APUSYS_CTRL_DAPC_AO_SLAVE_NUM_IN_1_DOM;
240 		slave_num = APUSYS_CTRL_DAPC_AO_SLAVE_NUM;
241 		dom_num = APUSYS_CTRL_DAPC_AO_DOM_NUM;
242 		dapc_base = APUSYS_CTRL_DAPC_AO_BASE;
243 		break;
244 	case DAPC_RCX:
245 		slave_num_in_1_dom = APUSYS_CTRL_DAPC_RCX_SLAVE_NUM_IN_1_DOM;
246 		slave_num = APUSYS_CTRL_DAPC_RCX_SLAVE_NUM;
247 		dom_num = APUSYS_CTRL_DAPC_RCX_DOM_NUM;
248 		dapc_base = APUSYS_CTRL_DAPC_RCX_BASE;
249 		break;
250 	default:
251 		ERROR("%s: unsupported devapc type: %u\n", __func__, type);
252 		return APUSYS_APC_ERR_GENERIC;
253 	}
254 
255 	apc_register_index = slave / slave_num_in_1_dom;
256 	apc_set_index = slave % slave_num_in_1_dom;
257 
258 	clr_bit = DEVAPC_MASK << (apc_set_index * DEVAPC_DOM_SHIFT);
259 	set_bit = (uint32_t)perm << (apc_set_index * DEVAPC_DOM_SHIFT);
260 
261 	if (slave < slave_num && domain_id < dom_num) {
262 		base = dapc_base + domain_id * DEVAPC_DOM_SIZE
263 		       + apc_register_index * DEVAPC_REG_SIZE;
264 	} else {
265 		ERROR("%s: out of boundary, devapc type: %d, slave: 0x%x, domain_id: 0x%x\n",
266 			__func__, type, slave, domain_id);
267 		return APUSYS_APC_ERR_OUT_OF_BOUNDARY;
268 	}
269 
270 	if (!base)
271 		return APUSYS_APC_ERR_GENERIC;
272 
273 	mmio_clrsetbits_32(base, clr_bit, set_bit);
274 	return APUSYS_APC_OK;
275 }
276 
277 static enum apusys_apc_err_status set_slave_ao_ctrl_apc(uint32_t slave,
278 							enum apusys_apc_domain_id domain_id,
279 							enum apusys_apc_perm_type perm)
280 {
281 	return set_slave_ctrl_apc(slave, DAPC_AO, domain_id, perm);
282 }
283 
284 static enum apusys_apc_err_status set_slave_rcx_ctrl_apc(uint32_t slave,
285 							 enum apusys_apc_domain_id domain_id,
286 							 enum apusys_apc_perm_type perm)
287 {
288 	return set_slave_ctrl_apc(slave, DAPC_RCX, domain_id, perm);
289 }
290 
291 static void apusys_devapc_init(uint32_t base)
292 {
293 	mmio_write_32(APUSYS_DAPC_CON(base), APUSYS_DAPC_CON_VIO_MASK);
294 }
295 
296 int apusys_devapc_ao_init(void)
297 {
298 	int32_t ret = APUSYS_APC_OK;
299 
300 	apusys_devapc_init(APUSYS_CTRL_DAPC_AO_BASE);
301 
302 	ret = SET_APUSYS_DAPC_V1(APUSYS_CTRL_DAPC_AO, set_slave_ao_ctrl_apc);
303 
304 	if (ret) {
305 		ERROR("[APUAPC_AO] %s: set_apusys_ao_ctrl_dapc failed\n", __func__);
306 		return ret;
307 	}
308 
309 #ifdef DUMP_CFG
310 	DUMP_APUSYS_DAPC_V1(APUSYS_CTRL_DAPC_AO);
311 #endif
312 
313 	INFO("[APUAPC_AO] %s done\n", __func__);
314 
315 	return ret;
316 }
317 
318 int apusys_devapc_rcx_init(void)
319 {
320 	int32_t ret = APUSYS_APC_OK;
321 
322 	apusys_devapc_init(APUSYS_CTRL_DAPC_RCX_BASE);
323 
324 	ret = SET_APUSYS_DAPC_V1(APUSYS_CTRL_DAPC_RCX, set_slave_rcx_ctrl_apc);
325 	if (ret) {
326 		ERROR("[APUAPC_RCX] %s: set_slave_rcx_ctrl_apc failed\n", __func__);
327 		return ret;
328 	}
329 
330 #ifdef DUMP_CFG
331 	DUMP_APUSYS_DAPC_V1(APUSYS_CTRL_DAPC_RCX);
332 #endif
333 
334 	INFO("[APUAPC_RCX] %s done\n", __func__);
335 
336 	return ret;
337 }
338