xref: /rk3399_ARM-atf/plat/mediatek/drivers/apusys/mt8188/apusys_devapc.c (revision 777e3b71bb0a37f98b4105af657d97c2afc2d0bc)
1*777e3b71SKarl Li /*
2*777e3b71SKarl Li  * Copyright (c) 2023, MediaTek Inc. All rights reserved.
3*777e3b71SKarl Li  *
4*777e3b71SKarl Li  * SPDX-License-Identifier: BSD-3-Clause
5*777e3b71SKarl Li  */
6*777e3b71SKarl Li 
7*777e3b71SKarl Li /* TF-A system header */
8*777e3b71SKarl Li #include <common/debug.h>
9*777e3b71SKarl Li #include <lib/utils_def.h>
10*777e3b71SKarl Li 
11*777e3b71SKarl Li /* Vendor header */
12*777e3b71SKarl Li #include "apusys.h"
13*777e3b71SKarl Li #include "apusys_devapc.h"
14*777e3b71SKarl Li #include "apusys_devapc_def.h"
15*777e3b71SKarl Li #include <platform_def.h>
16*777e3b71SKarl Li 
17*777e3b71SKarl Li #define DUMP_APUSYS_DAPC	(0)
18*777e3b71SKarl Li 
19*777e3b71SKarl Li static const struct apc_dom_16 APU_CTRL_DAPC_AO[] = {
20*777e3b71SKarl Li 	/* ctrl index = 0 */
21*777e3b71SKarl Li 	SLAVE_VCORE("apu_ao_ctl_o-0"),
22*777e3b71SKarl Li 	SLAVE_RPC("apu_ao_ctl_o-2"),
23*777e3b71SKarl Li 	SLAVE_PCU("apu_ao_ctl_o-3"),
24*777e3b71SKarl Li 	SLAVE_AO_CTRL("apu_ao_ctl_o-4"),
25*777e3b71SKarl Li 	SLAVE_PLL("apu_ao_ctl_o-5"),
26*777e3b71SKarl Li 	SLAVE_ACC("apu_ao_ctl_o-6"),
27*777e3b71SKarl Li 	SLAVE_SEC("apu_ao_ctl_o-7"),
28*777e3b71SKarl Li 	SLAVE_ARE0("apu_ao_ctl_o-8"),
29*777e3b71SKarl Li 	SLAVE_ARE1("apu_ao_ctl_o-9"),
30*777e3b71SKarl Li 	SLAVE_ARE2("apu_ao_ctl_o-10"),
31*777e3b71SKarl Li 
32*777e3b71SKarl Li 	/* ctrl index = 10 */
33*777e3b71SKarl Li 	SLAVE_UNKNOWN("apu_ao_ctl_o-11"),
34*777e3b71SKarl Li 	SLAVE_AO_BCRM("apu_ao_ctl_o-12"),
35*777e3b71SKarl Li 	SLAVE_AO_DAPC_WRAP("apu_ao_ctl_o-13"),
36*777e3b71SKarl Li 	SLAVE_AO_DAPC_CON("apu_ao_ctl_o-14"),
37*777e3b71SKarl Li 	SLAVE_RCX_ACX_BULK("apu_ao_ctl_o-15"),
38*777e3b71SKarl Li 	SLAVE_UNKNOWN("apu_ao_ctl_o-16"),
39*777e3b71SKarl Li 	SLAVE_UNKNOWN("apu_ao_ctl_o-17"),
40*777e3b71SKarl Li 	SLAVE_APU_BULK("apu_ao_ctl_o-18"),
41*777e3b71SKarl Li 	SLAVE_ACX0_BCRM("apu_ao_ctl_o-20"),
42*777e3b71SKarl Li 	SLAVE_RPCTOP_LITE_ACX0("apu_ao_ctl_o-21"),
43*777e3b71SKarl Li 
44*777e3b71SKarl Li 	/* ctrl index = 20 */
45*777e3b71SKarl Li 	SLAVE_ACX1_BCRM("apu_ao_ctl_o-22"),
46*777e3b71SKarl Li 	SLAVE_RPCTOP_LITE_ACX1("apu_ao_ctl_o-23"),
47*777e3b71SKarl Li 	SLAVE_RCX_TO_ACX0_0("apu_rcx2acx0_o-0"),
48*777e3b71SKarl Li 	SLAVE_RCX_TO_ACX0_1("apu_rcx2acx0_o-1"),
49*777e3b71SKarl Li 	SLAVE_SAE_TO_ACX0_0("apu_sae2acx0_o-0"),
50*777e3b71SKarl Li 	SLAVE_SAE_TO_ACX0_1("apu_sae2acx0_o-1"),
51*777e3b71SKarl Li 	SLAVE_RCX_TO_ACX1_0("apu_rcx2acx1_o-0"),
52*777e3b71SKarl Li 	SLAVE_RCX_TO_ACX1_1("apu_rcx2acx1_o-1"),
53*777e3b71SKarl Li 	SLAVE_SAE_TO_ACX1_0("apu_sae2acx1_o-0"),
54*777e3b71SKarl Li 	SLAVE_SAE_TO_ACX1_1("apu_sae2acx1_o-1"),
55*777e3b71SKarl Li };
56*777e3b71SKarl Li 
57*777e3b71SKarl Li static enum apusys_apc_err_status set_slave_ao_ctrl_apc(uint32_t slave,
58*777e3b71SKarl Li 							enum apusys_apc_domain_id domain_id,
59*777e3b71SKarl Li 							enum apusys_apc_perm_type perm)
60*777e3b71SKarl Li {
61*777e3b71SKarl Li 	uint32_t apc_register_index;
62*777e3b71SKarl Li 	uint32_t apc_set_index;
63*777e3b71SKarl Li 	uint32_t base;
64*777e3b71SKarl Li 	uint32_t clr_bit;
65*777e3b71SKarl Li 	uint32_t set_bit;
66*777e3b71SKarl Li 
67*777e3b71SKarl Li 	if ((perm < 0) || (perm >= PERM_NUM)) {
68*777e3b71SKarl Li 		ERROR(MODULE_TAG "%s: permission type:0x%x is not supported!\n", __func__, perm);
69*777e3b71SKarl Li 		return APUSYS_APC_ERR_GENERIC;
70*777e3b71SKarl Li 	}
71*777e3b71SKarl Li 
72*777e3b71SKarl Li 	if ((slave >= APU_CTRL_DAPC_AO_SLAVE_NUM) ||
73*777e3b71SKarl Li 	    ((domain_id < 0) || (domain_id >= APU_CTRL_DAPC_AO_DOM_NUM))) {
74*777e3b71SKarl Li 		ERROR(MODULE_TAG "%s: out of boundary, slave:0x%x, domain_id:0x%x\n",
75*777e3b71SKarl Li 		      __func__, slave, domain_id);
76*777e3b71SKarl Li 		return APUSYS_APC_ERR_GENERIC;
77*777e3b71SKarl Li 	}
78*777e3b71SKarl Li 
79*777e3b71SKarl Li 	apc_register_index = slave / APU_CTRL_DAPC_AO_SLAVE_NUM_IN_1_DOM;
80*777e3b71SKarl Li 	apc_set_index = slave % APU_CTRL_DAPC_AO_SLAVE_NUM_IN_1_DOM;
81*777e3b71SKarl Li 
82*777e3b71SKarl Li 	clr_bit = (DEVAPC_MASK << (apc_set_index * DEVAPC_DOM_SHIFT));
83*777e3b71SKarl Li 	set_bit = (uint32_t)perm << (apc_set_index * DEVAPC_DOM_SHIFT);
84*777e3b71SKarl Li 
85*777e3b71SKarl Li 	base = (APU_CTRL_DAPC_AO_BASE + domain_id * DEVAPC_DOM_SIZE +
86*777e3b71SKarl Li 		apc_register_index * DEVAPC_REG_SIZE);
87*777e3b71SKarl Li 
88*777e3b71SKarl Li 	mmio_clrsetbits_32(base, clr_bit, set_bit);
89*777e3b71SKarl Li 	return APUSYS_APC_OK;
90*777e3b71SKarl Li }
91*777e3b71SKarl Li 
92*777e3b71SKarl Li static void apusys_devapc_init(const char *name, uint32_t base)
93*777e3b71SKarl Li {
94*777e3b71SKarl Li 	mmio_write_32(APUSYS_DAPC_CON(base), APUSYS_DAPC_CON_VIO_MASK);
95*777e3b71SKarl Li }
96*777e3b71SKarl Li 
97*777e3b71SKarl Li int apusys_devapc_ao_init(void)
98*777e3b71SKarl Li {
99*777e3b71SKarl Li 	enum apusys_apc_err_status ret;
100*777e3b71SKarl Li 
101*777e3b71SKarl Li 	apusys_devapc_init("APUAPC_CTRL_AO", APU_CTRL_DAPC_AO_BASE);
102*777e3b71SKarl Li 
103*777e3b71SKarl Li 	ret = SET_APUSYS_DAPC_V1(APU_CTRL_DAPC_AO, set_slave_ao_ctrl_apc);
104*777e3b71SKarl Li 	if (ret != APUSYS_APC_OK) {
105*777e3b71SKarl Li 		ERROR(MODULE_TAG "%s: set_apusys_ao_ctrl_dap FAILED!\n", __func__);
106*777e3b71SKarl Li 		return -1;
107*777e3b71SKarl Li 	}
108*777e3b71SKarl Li 
109*777e3b71SKarl Li #if DUMP_APUSYS_DAPC
110*777e3b71SKarl Li 	DUMP_APUSYS_DAPC_V1(APU_CTRL_DAPC_AO);
111*777e3b71SKarl Li #endif
112*777e3b71SKarl Li 
113*777e3b71SKarl Li 	return 0;
114*777e3b71SKarl Li }
115