xref: /rk3399_ARM-atf/plat/mediatek/drivers/apusys/mt8196/apusys_devapc.c (revision 31a0b877566b0ebac6d11f2f8711cc11c0665e44)
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