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