1777e3b71SKarl Li /*
2777e3b71SKarl Li * Copyright (c) 2023, MediaTek Inc. All rights reserved.
3777e3b71SKarl Li *
4777e3b71SKarl Li * SPDX-License-Identifier: BSD-3-Clause
5777e3b71SKarl Li */
6777e3b71SKarl Li
7777e3b71SKarl Li /* TF-A system header */
8777e3b71SKarl Li #include <common/debug.h>
9777e3b71SKarl Li #include <lib/utils_def.h>
10777e3b71SKarl Li
11777e3b71SKarl Li /* Vendor header */
12777e3b71SKarl Li #include "apusys.h"
13777e3b71SKarl Li #include "apusys_devapc.h"
14777e3b71SKarl Li #include "apusys_devapc_def.h"
15777e3b71SKarl Li #include <platform_def.h>
16777e3b71SKarl Li
17777e3b71SKarl Li #define DUMP_APUSYS_DAPC (0)
18777e3b71SKarl Li
19*5986ae57SKarl Li static const struct apc_dom_16 APU_NOC_DAPC_RCX[] = {
20*5986ae57SKarl Li /* ctrl index = 0 */
21*5986ae57SKarl Li SLAVE_MD32_SRAM("slv16-0"),
22*5986ae57SKarl Li SLAVE_MD32_SRAM("slv16-1"),
23*5986ae57SKarl Li SLAVE_MD32_SRAM("slv16-2"),
24*5986ae57SKarl Li SLAVE_MD32_SRAM("slv16-3"),
25*5986ae57SKarl Li SLAVE_MD32_SRAM("slv16-4"),
26*5986ae57SKarl Li };
27*5986ae57SKarl Li
28777e3b71SKarl Li static const struct apc_dom_16 APU_CTRL_DAPC_AO[] = {
29777e3b71SKarl Li /* ctrl index = 0 */
30777e3b71SKarl Li SLAVE_VCORE("apu_ao_ctl_o-0"),
31777e3b71SKarl Li SLAVE_RPC("apu_ao_ctl_o-2"),
32777e3b71SKarl Li SLAVE_PCU("apu_ao_ctl_o-3"),
33777e3b71SKarl Li SLAVE_AO_CTRL("apu_ao_ctl_o-4"),
34777e3b71SKarl Li SLAVE_PLL("apu_ao_ctl_o-5"),
35777e3b71SKarl Li SLAVE_ACC("apu_ao_ctl_o-6"),
36777e3b71SKarl Li SLAVE_SEC("apu_ao_ctl_o-7"),
37777e3b71SKarl Li SLAVE_ARE0("apu_ao_ctl_o-8"),
38777e3b71SKarl Li SLAVE_ARE1("apu_ao_ctl_o-9"),
39777e3b71SKarl Li SLAVE_ARE2("apu_ao_ctl_o-10"),
40777e3b71SKarl Li
41777e3b71SKarl Li /* ctrl index = 10 */
42777e3b71SKarl Li SLAVE_UNKNOWN("apu_ao_ctl_o-11"),
43777e3b71SKarl Li SLAVE_AO_BCRM("apu_ao_ctl_o-12"),
44777e3b71SKarl Li SLAVE_AO_DAPC_WRAP("apu_ao_ctl_o-13"),
45777e3b71SKarl Li SLAVE_AO_DAPC_CON("apu_ao_ctl_o-14"),
46777e3b71SKarl Li SLAVE_RCX_ACX_BULK("apu_ao_ctl_o-15"),
47777e3b71SKarl Li SLAVE_UNKNOWN("apu_ao_ctl_o-16"),
48777e3b71SKarl Li SLAVE_UNKNOWN("apu_ao_ctl_o-17"),
49777e3b71SKarl Li SLAVE_APU_BULK("apu_ao_ctl_o-18"),
50777e3b71SKarl Li SLAVE_ACX0_BCRM("apu_ao_ctl_o-20"),
51777e3b71SKarl Li SLAVE_RPCTOP_LITE_ACX0("apu_ao_ctl_o-21"),
52777e3b71SKarl Li
53777e3b71SKarl Li /* ctrl index = 20 */
54777e3b71SKarl Li SLAVE_ACX1_BCRM("apu_ao_ctl_o-22"),
55777e3b71SKarl Li SLAVE_RPCTOP_LITE_ACX1("apu_ao_ctl_o-23"),
56777e3b71SKarl Li SLAVE_RCX_TO_ACX0_0("apu_rcx2acx0_o-0"),
57777e3b71SKarl Li SLAVE_RCX_TO_ACX0_1("apu_rcx2acx0_o-1"),
58777e3b71SKarl Li SLAVE_SAE_TO_ACX0_0("apu_sae2acx0_o-0"),
59777e3b71SKarl Li SLAVE_SAE_TO_ACX0_1("apu_sae2acx0_o-1"),
60777e3b71SKarl Li SLAVE_RCX_TO_ACX1_0("apu_rcx2acx1_o-0"),
61777e3b71SKarl Li SLAVE_RCX_TO_ACX1_1("apu_rcx2acx1_o-1"),
62777e3b71SKarl Li SLAVE_SAE_TO_ACX1_0("apu_sae2acx1_o-0"),
63777e3b71SKarl Li SLAVE_SAE_TO_ACX1_1("apu_sae2acx1_o-1"),
64777e3b71SKarl Li };
65777e3b71SKarl Li
66*5986ae57SKarl Li static const struct apc_dom_16 APU_CTRL_DAPC_RCX[] = {
67*5986ae57SKarl Li /* ctrl index = 0 */
68*5986ae57SKarl Li SLAVE_MD32_SYSCTRL0("md32_apb_s-0"),
69*5986ae57SKarl Li SLAVE_MD32_SYSCTRL1("md32_apb_s-1"),
70*5986ae57SKarl Li SLAVE_MD32_WDT("md32_apb_s-2"),
71*5986ae57SKarl Li SLAVE_MD32_CACHE("md32_apb_s-3"),
72*5986ae57SKarl Li SLAVE_RPC("apusys_ao-0"),
73*5986ae57SKarl Li SLAVE_PCU("apusys_ao-1"),
74*5986ae57SKarl Li SLAVE_AO_CTRL("apusys_ao-2"),
75*5986ae57SKarl Li SLAVE_PLL("apusys_ao-3"),
76*5986ae57SKarl Li SLAVE_ACC("apusys_ao-4"),
77*5986ae57SKarl Li SLAVE_SEC("apusys_ao-5"),
78*5986ae57SKarl Li
79*5986ae57SKarl Li /* ctrl index = 10 */
80*5986ae57SKarl Li SLAVE_ARE0("apusys_ao-6"),
81*5986ae57SKarl Li SLAVE_ARE1("apusys_ao-7"),
82*5986ae57SKarl Li SLAVE_ARE2("apusys_ao-8"),
83*5986ae57SKarl Li SLAVE_UNKNOWN("apusys_ao-9"),
84*5986ae57SKarl Li SLAVE_AO_BCRM("apusys_ao-10"),
85*5986ae57SKarl Li SLAVE_AO_DAPC_WRAP("apusys_ao-11"),
86*5986ae57SKarl Li SLAVE_AO_DAPC_CON("apusys_ao-12"),
87*5986ae57SKarl Li SLAVE_VCORE("apusys_ao-13"),
88*5986ae57SKarl Li SLAVE_ACX0_BCRM("apusys_ao-15"),
89*5986ae57SKarl Li SLAVE_ACX1_BCRM("apusys_ao-16"),
90*5986ae57SKarl Li
91*5986ae57SKarl Li /* ctrl index = 20 */
92*5986ae57SKarl Li SLAVE_NOC_AXI("noc_axi"),
93*5986ae57SKarl Li SLAVE_MD32_DBG("md32_dbg"),
94*5986ae57SKarl Li SLAVE_DBG_CRTL("apb_infra_dbg"),
95*5986ae57SKarl Li SLAVE_IOMMU0_BANK0("apu_n_mmu_r0"),
96*5986ae57SKarl Li SLAVE_IOMMU0_BANK1("apu_n_mmu_r1"),
97*5986ae57SKarl Li SLAVE_IOMMU0_BANK2("apu_n_mmu_r2"),
98*5986ae57SKarl Li SLAVE_IOMMU0_BANK3("apu_n_mmu_r3"),
99*5986ae57SKarl Li SLAVE_IOMMU0_BANK4("apu_n_mmu_r4"),
100*5986ae57SKarl Li SLAVE_IOMMU1_BANK0("apu_s_mmu_r0"),
101*5986ae57SKarl Li SLAVE_IOMMU1_BANK1("apu_s_mmu_r1"),
102*5986ae57SKarl Li
103*5986ae57SKarl Li /* ctrl index = 30 */
104*5986ae57SKarl Li SLAVE_IOMMU1_BANK2("apu_s_mmu_r2"),
105*5986ae57SKarl Li SLAVE_IOMMU1_BANK3("apu_s_mmu_r3"),
106*5986ae57SKarl Li SLAVE_IOMMU1_BANK4("apu_s_mmu_r4"),
107*5986ae57SKarl Li SLAVE_S0_SSC("apu_s0_ssc_cfg"),
108*5986ae57SKarl Li SLAVE_N0_SSC("apu_n0_ssc_cfg"),
109*5986ae57SKarl Li SLAVE_ACP_SSC("apu_acp_ssc_cfg"),
110*5986ae57SKarl Li SLAVE_S1_SSC("apu_s1_ssc_cfg"),
111*5986ae57SKarl Li SLAVE_N1_SSC("apu_n1_ssc_cfg"),
112*5986ae57SKarl Li SLAVE_CFG("apu_rcx_cfg"),
113*5986ae57SKarl Li SLAVE_SEMA_STIMER("apu_sema_stimer"),
114*5986ae57SKarl Li
115*5986ae57SKarl Li /* ctrl index = 40 */
116*5986ae57SKarl Li SLAVE_EMI_CFG("apu_emi_cfg"),
117*5986ae57SKarl Li SLAVE_LOG("apu_logtop"),
118*5986ae57SKarl Li SLAVE_CPE_SENSOR("apu_cpe_sensor"),
119*5986ae57SKarl Li SLAVE_CPE_COEF("apu_cpe_coef"),
120*5986ae57SKarl Li SLAVE_CPE_CTRL("apu_cpe_ctrl"),
121*5986ae57SKarl Li SLAVE_UNKNOWN("apu_xpu_rsi"),
122*5986ae57SKarl Li SLAVE_DFD_REG_SOC("apu_dfd"),
123*5986ae57SKarl Li SLAVE_SENSOR_WRAP_ACX0_DLA0("apu_sen_ac0_dla0"),
124*5986ae57SKarl Li SLAVE_SENSOR_WRAP_ACX0_DLA1("apu_sen_ac0_dla1"),
125*5986ae57SKarl Li SLAVE_SENSOR_WRAP_ACX0_VPU0("apu_sen_ac0_vpu"),
126*5986ae57SKarl Li
127*5986ae57SKarl Li /* ctrl index = 50 */
128*5986ae57SKarl Li SLAVE_SENSOR_WRAP_ACX1_DLA0("apu_sen_ac1_dla0"),
129*5986ae57SKarl Li SLAVE_SENSOR_WRAP_ACX1_DLA1("apu_sen_ac1_dla1"),
130*5986ae57SKarl Li SLAVE_SENSOR_WRAP_ACX1_VPU0("apu_sen_ac1_vpu"),
131*5986ae57SKarl Li SLAVE_REVISER("noc_cfg-0"),
132*5986ae57SKarl Li SLAVE_NOC("noc_cfg-1"),
133*5986ae57SKarl Li SLAVE_BCRM("infra_bcrm"),
134*5986ae57SKarl Li SLAVE_DAPC_WRAP("infra_dapc_wrap"),
135*5986ae57SKarl Li SLAVE_DAPC_CON("infra_dapc_con"),
136*5986ae57SKarl Li SLAVE_NOC_DAPC_WRAP("noc_dapc_wrap"),
137*5986ae57SKarl Li SLAVE_NOC_DAPC_CON("noc_dapc_con"),
138*5986ae57SKarl Li
139*5986ae57SKarl Li /* ctrl index = 60 */
140*5986ae57SKarl Li SLAVE_NOC_BCRM("noc_bcrm"),
141*5986ae57SKarl Li SLAVE_ACS("apu_rcx_acs"),
142*5986ae57SKarl Li SLAVE_HSE("apu_hse"),
143*5986ae57SKarl Li };
144*5986ae57SKarl Li
set_slave_ao_ctrl_apc(uint32_t slave,enum apusys_apc_domain_id domain_id,enum apusys_apc_perm_type perm)145777e3b71SKarl Li static enum apusys_apc_err_status set_slave_ao_ctrl_apc(uint32_t slave,
146777e3b71SKarl Li enum apusys_apc_domain_id domain_id,
147777e3b71SKarl Li enum apusys_apc_perm_type perm)
148777e3b71SKarl Li {
149777e3b71SKarl Li uint32_t apc_register_index;
150777e3b71SKarl Li uint32_t apc_set_index;
151777e3b71SKarl Li uint32_t base;
152777e3b71SKarl Li uint32_t clr_bit;
153777e3b71SKarl Li uint32_t set_bit;
154777e3b71SKarl Li
155777e3b71SKarl Li if ((perm < 0) || (perm >= PERM_NUM)) {
156777e3b71SKarl Li ERROR(MODULE_TAG "%s: permission type:0x%x is not supported!\n", __func__, perm);
157777e3b71SKarl Li return APUSYS_APC_ERR_GENERIC;
158777e3b71SKarl Li }
159777e3b71SKarl Li
160777e3b71SKarl Li if ((slave >= APU_CTRL_DAPC_AO_SLAVE_NUM) ||
161777e3b71SKarl Li ((domain_id < 0) || (domain_id >= APU_CTRL_DAPC_AO_DOM_NUM))) {
162777e3b71SKarl Li ERROR(MODULE_TAG "%s: out of boundary, slave:0x%x, domain_id:0x%x\n",
163777e3b71SKarl Li __func__, slave, domain_id);
164777e3b71SKarl Li return APUSYS_APC_ERR_GENERIC;
165777e3b71SKarl Li }
166777e3b71SKarl Li
167777e3b71SKarl Li apc_register_index = slave / APU_CTRL_DAPC_AO_SLAVE_NUM_IN_1_DOM;
168777e3b71SKarl Li apc_set_index = slave % APU_CTRL_DAPC_AO_SLAVE_NUM_IN_1_DOM;
169777e3b71SKarl Li
170777e3b71SKarl Li clr_bit = (DEVAPC_MASK << (apc_set_index * DEVAPC_DOM_SHIFT));
171777e3b71SKarl Li set_bit = (uint32_t)perm << (apc_set_index * DEVAPC_DOM_SHIFT);
172777e3b71SKarl Li
173777e3b71SKarl Li base = (APU_CTRL_DAPC_AO_BASE + domain_id * DEVAPC_DOM_SIZE +
174777e3b71SKarl Li apc_register_index * DEVAPC_REG_SIZE);
175777e3b71SKarl Li
176777e3b71SKarl Li mmio_clrsetbits_32(base, clr_bit, set_bit);
177777e3b71SKarl Li return APUSYS_APC_OK;
178777e3b71SKarl Li }
179777e3b71SKarl Li
set_slave_noc_dapc_rcx(uint32_t slave,enum apusys_apc_domain_id domain_id,enum apusys_apc_perm_type perm)180*5986ae57SKarl Li static enum apusys_apc_err_status set_slave_noc_dapc_rcx(uint32_t slave,
181*5986ae57SKarl Li enum apusys_apc_domain_id domain_id,
182*5986ae57SKarl Li enum apusys_apc_perm_type perm)
183*5986ae57SKarl Li {
184*5986ae57SKarl Li uint32_t apc_register_index;
185*5986ae57SKarl Li uint32_t apc_set_index;
186*5986ae57SKarl Li uint32_t base;
187*5986ae57SKarl Li uint32_t clr_bit;
188*5986ae57SKarl Li uint32_t set_bit;
189*5986ae57SKarl Li
190*5986ae57SKarl Li if ((perm >= PERM_NUM) || (perm < 0)) {
191*5986ae57SKarl Li ERROR(MODULE_TAG "%s: permission type:0x%x is not supported!\n", __func__, perm);
192*5986ae57SKarl Li return APUSYS_APC_ERR_GENERIC;
193*5986ae57SKarl Li }
194*5986ae57SKarl Li
195*5986ae57SKarl Li if ((slave >= APU_NOC_DAPC_RCX_SLAVE_NUM) ||
196*5986ae57SKarl Li ((domain_id < 0) || (domain_id >= APU_NOC_DAPC_RCX_DOM_NUM))) {
197*5986ae57SKarl Li ERROR(MODULE_TAG "%s: out of boundary, slave:0x%x, domain_id:0x%x\n",
198*5986ae57SKarl Li __func__, slave, domain_id);
199*5986ae57SKarl Li return APUSYS_APC_ERR_GENERIC;
200*5986ae57SKarl Li }
201*5986ae57SKarl Li
202*5986ae57SKarl Li apc_register_index = slave / APU_NOC_DAPC_RCX_SLAVE_NUM_IN_1_DOM;
203*5986ae57SKarl Li apc_set_index = slave % APU_NOC_DAPC_RCX_SLAVE_NUM_IN_1_DOM;
204*5986ae57SKarl Li
205*5986ae57SKarl Li clr_bit = (DEVAPC_MASK << (apc_set_index * DEVAPC_DOM_SHIFT));
206*5986ae57SKarl Li set_bit = ((uint32_t)perm) << (apc_set_index * DEVAPC_DOM_SHIFT);
207*5986ae57SKarl Li base = (APU_NOC_DAPC_RCX_BASE + domain_id * DEVAPC_DOM_SIZE +
208*5986ae57SKarl Li apc_register_index * DEVAPC_REG_SIZE);
209*5986ae57SKarl Li
210*5986ae57SKarl Li mmio_clrsetbits_32(base, clr_bit, set_bit);
211*5986ae57SKarl Li return APUSYS_APC_OK;
212*5986ae57SKarl Li }
213*5986ae57SKarl Li
set_slave_rcx_ctrl_apc(uint32_t slave,enum apusys_apc_domain_id domain_id,enum apusys_apc_perm_type perm)214*5986ae57SKarl Li static enum apusys_apc_err_status set_slave_rcx_ctrl_apc(uint32_t slave,
215*5986ae57SKarl Li enum apusys_apc_domain_id domain_id,
216*5986ae57SKarl Li enum apusys_apc_perm_type perm)
217*5986ae57SKarl Li {
218*5986ae57SKarl Li uint32_t apc_register_index;
219*5986ae57SKarl Li uint32_t apc_set_index;
220*5986ae57SKarl Li uint32_t base;
221*5986ae57SKarl Li uint32_t clr_bit;
222*5986ae57SKarl Li uint32_t set_bit;
223*5986ae57SKarl Li
224*5986ae57SKarl Li if ((perm < 0) || (perm >= PERM_NUM)) {
225*5986ae57SKarl Li ERROR(MODULE_TAG "%s: permission type:0x%x is not supported!\n", __func__, perm);
226*5986ae57SKarl Li return APUSYS_APC_ERR_GENERIC;
227*5986ae57SKarl Li }
228*5986ae57SKarl Li
229*5986ae57SKarl Li if ((slave >= APU_CTRL_DAPC_RCX_SLAVE_NUM) ||
230*5986ae57SKarl Li ((domain_id < 0) || (domain_id >= APU_CTRL_DAPC_RCX_DOM_NUM))) {
231*5986ae57SKarl Li ERROR(MODULE_TAG "%s: out of boundary, slave:0x%x, domain_id:0x%x\n",
232*5986ae57SKarl Li __func__, slave, domain_id);
233*5986ae57SKarl Li return APUSYS_APC_ERR_GENERIC;
234*5986ae57SKarl Li }
235*5986ae57SKarl Li
236*5986ae57SKarl Li apc_register_index = slave / APU_CTRL_DAPC_RCX_SLAVE_NUM_IN_1_DOM;
237*5986ae57SKarl Li apc_set_index = slave % APU_CTRL_DAPC_RCX_SLAVE_NUM_IN_1_DOM;
238*5986ae57SKarl Li
239*5986ae57SKarl Li clr_bit = (DEVAPC_MASK << (apc_set_index * DEVAPC_DOM_SHIFT));
240*5986ae57SKarl Li set_bit = (uint32_t)perm << (apc_set_index * DEVAPC_DOM_SHIFT);
241*5986ae57SKarl Li base = (APU_CTRL_DAPC_RCX_BASE + domain_id * DEVAPC_DOM_SIZE +
242*5986ae57SKarl Li apc_register_index * DEVAPC_REG_SIZE);
243*5986ae57SKarl Li
244*5986ae57SKarl Li mmio_clrsetbits_32(base, clr_bit, set_bit);
245*5986ae57SKarl Li return APUSYS_APC_OK;
246*5986ae57SKarl Li }
247*5986ae57SKarl Li
apusys_devapc_init(const char * name,uint32_t base)248777e3b71SKarl Li static void apusys_devapc_init(const char *name, uint32_t base)
249777e3b71SKarl Li {
250777e3b71SKarl Li mmio_write_32(APUSYS_DAPC_CON(base), APUSYS_DAPC_CON_VIO_MASK);
251777e3b71SKarl Li }
252777e3b71SKarl Li
apusys_devapc_ao_init(void)253777e3b71SKarl Li int apusys_devapc_ao_init(void)
254777e3b71SKarl Li {
255777e3b71SKarl Li enum apusys_apc_err_status ret;
256777e3b71SKarl Li
257777e3b71SKarl Li apusys_devapc_init("APUAPC_CTRL_AO", APU_CTRL_DAPC_AO_BASE);
258777e3b71SKarl Li
259777e3b71SKarl Li ret = SET_APUSYS_DAPC_V1(APU_CTRL_DAPC_AO, set_slave_ao_ctrl_apc);
260777e3b71SKarl Li if (ret != APUSYS_APC_OK) {
261777e3b71SKarl Li ERROR(MODULE_TAG "%s: set_apusys_ao_ctrl_dap FAILED!\n", __func__);
262777e3b71SKarl Li return -1;
263777e3b71SKarl Li }
264777e3b71SKarl Li
265777e3b71SKarl Li #if DUMP_APUSYS_DAPC
266777e3b71SKarl Li DUMP_APUSYS_DAPC_V1(APU_CTRL_DAPC_AO);
267777e3b71SKarl Li #endif
268777e3b71SKarl Li
269777e3b71SKarl Li return 0;
270777e3b71SKarl Li }
271*5986ae57SKarl Li
apusys_devapc_rcx_init(void)272*5986ae57SKarl Li int apusys_devapc_rcx_init(void)
273*5986ae57SKarl Li {
274*5986ae57SKarl Li enum apusys_apc_err_status ret;
275*5986ae57SKarl Li
276*5986ae57SKarl Li apusys_devapc_init("APUAPC_CTRL_RCX", APU_CTRL_DAPC_RCX_BASE);
277*5986ae57SKarl Li apusys_devapc_init("APUAPC_NOC_RCX", APU_NOC_DAPC_RCX_BASE);
278*5986ae57SKarl Li
279*5986ae57SKarl Li ret = SET_APUSYS_DAPC_V1(APU_CTRL_DAPC_RCX, set_slave_rcx_ctrl_apc);
280*5986ae57SKarl Li if (ret != APUSYS_APC_OK) {
281*5986ae57SKarl Li ERROR(MODULE_TAG "%s: set_slave_rcx_ctrl_apc FAILED!\n", __func__);
282*5986ae57SKarl Li return -1;
283*5986ae57SKarl Li }
284*5986ae57SKarl Li
285*5986ae57SKarl Li #if DUMP_APUSYS_DAPC
286*5986ae57SKarl Li DUMP_APUSYS_DAPC_V1(APU_CTRL_DAPC_RCX);
287*5986ae57SKarl Li #endif
288*5986ae57SKarl Li
289*5986ae57SKarl Li ret = SET_APUSYS_DAPC_V1(APU_NOC_DAPC_RCX, set_slave_noc_dapc_rcx);
290*5986ae57SKarl Li if (ret != APUSYS_APC_OK) {
291*5986ae57SKarl Li ERROR(MODULE_TAG "%s: set_slave_noc_dapc_rcx FAILED\n", __func__);
292*5986ae57SKarl Li return -1;
293*5986ae57SKarl Li }
294*5986ae57SKarl Li
295*5986ae57SKarl Li #if DUMP_APUSYS_DAPC
296*5986ae57SKarl Li DUMP_APUSYS_DAPC_V1(APU_NOC_DAPC_RCX);
297*5986ae57SKarl Li #endif
298*5986ae57SKarl Li
299*5986ae57SKarl Li return 0;
300*5986ae57SKarl Li }
301