xref: /arm-trusted-firmware/plat/mediatek/drivers/apusys/devapc/apusys_dapc_v1.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2023, MediaTek Inc. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef APUSYS_DAPC_V1_H
8*91f16700Schasinglulu #define APUSYS_DAPC_V1_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <lib/mmio.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu /******************************************************************************
13*91f16700Schasinglulu  * STRUCTURE DEFINITION
14*91f16700Schasinglulu  ******************************************************************************/
15*91f16700Schasinglulu enum apusys_apc_err_status {
16*91f16700Schasinglulu 	APUSYS_APC_OK		= 0x0,
17*91f16700Schasinglulu 	APUSYS_APC_ERR_GENERIC	= 0x1,
18*91f16700Schasinglulu };
19*91f16700Schasinglulu 
20*91f16700Schasinglulu enum apusys_apc_perm_type {
21*91f16700Schasinglulu 	NO_PROTECTION	= 0,
22*91f16700Schasinglulu 	SEC_RW_ONLY	= 1,
23*91f16700Schasinglulu 	SEC_RW_NS_R	= 2,
24*91f16700Schasinglulu 	FORBIDDEN	= 3,
25*91f16700Schasinglulu 	PERM_NUM	= 4,
26*91f16700Schasinglulu };
27*91f16700Schasinglulu 
28*91f16700Schasinglulu enum apusys_apc_domain_id {
29*91f16700Schasinglulu 	DOMAIN_0	=  0,
30*91f16700Schasinglulu 	DOMAIN_1	=  1,
31*91f16700Schasinglulu 	DOMAIN_2	=  2,
32*91f16700Schasinglulu 	DOMAIN_3	=  3,
33*91f16700Schasinglulu 	DOMAIN_4	=  4,
34*91f16700Schasinglulu 	DOMAIN_5	=  5,
35*91f16700Schasinglulu 	DOMAIN_6	=  6,
36*91f16700Schasinglulu 	DOMAIN_7	=  7,
37*91f16700Schasinglulu 	DOMAIN_8	=  8,
38*91f16700Schasinglulu 	DOMAIN_9	=  9,
39*91f16700Schasinglulu 	DOMAIN_10	= 10,
40*91f16700Schasinglulu 	DOMAIN_11	= 11,
41*91f16700Schasinglulu 	DOMAIN_12	= 12,
42*91f16700Schasinglulu 	DOMAIN_13	= 13,
43*91f16700Schasinglulu 	DOMAIN_14	= 14,
44*91f16700Schasinglulu 	DOMAIN_15	= 15,
45*91f16700Schasinglulu };
46*91f16700Schasinglulu 
47*91f16700Schasinglulu struct apc_dom_16 {
48*91f16700Schasinglulu 	unsigned char d0_permission;
49*91f16700Schasinglulu 	unsigned char d1_permission;
50*91f16700Schasinglulu 	unsigned char d2_permission;
51*91f16700Schasinglulu 	unsigned char d3_permission;
52*91f16700Schasinglulu 	unsigned char d4_permission;
53*91f16700Schasinglulu 	unsigned char d5_permission;
54*91f16700Schasinglulu 	unsigned char d6_permission;
55*91f16700Schasinglulu 	unsigned char d7_permission;
56*91f16700Schasinglulu 	unsigned char d8_permission;
57*91f16700Schasinglulu 	unsigned char d9_permission;
58*91f16700Schasinglulu 	unsigned char d10_permission;
59*91f16700Schasinglulu 	unsigned char d11_permission;
60*91f16700Schasinglulu 	unsigned char d12_permission;
61*91f16700Schasinglulu 	unsigned char d13_permission;
62*91f16700Schasinglulu 	unsigned char d14_permission;
63*91f16700Schasinglulu 	unsigned char d15_permission;
64*91f16700Schasinglulu };
65*91f16700Schasinglulu 
66*91f16700Schasinglulu #define APUSYS_APC_AO_ATTR(DEV_NAME,					       \
67*91f16700Schasinglulu 			   PERM_ATTR0,  PERM_ATTR1,  PERM_ATTR2,  PERM_ATTR3,  \
68*91f16700Schasinglulu 			   PERM_ATTR4,  PERM_ATTR5,  PERM_ATTR6,  PERM_ATTR7,  \
69*91f16700Schasinglulu 			   PERM_ATTR8,  PERM_ATTR9,  PERM_ATTR10, PERM_ATTR11, \
70*91f16700Schasinglulu 			   PERM_ATTR12, PERM_ATTR13, PERM_ATTR14, PERM_ATTR15) \
71*91f16700Schasinglulu 	{(unsigned char)PERM_ATTR0,  (unsigned char)PERM_ATTR1,  \
72*91f16700Schasinglulu 	 (unsigned char)PERM_ATTR2,  (unsigned char)PERM_ATTR3,  \
73*91f16700Schasinglulu 	 (unsigned char)PERM_ATTR4,  (unsigned char)PERM_ATTR5,  \
74*91f16700Schasinglulu 	 (unsigned char)PERM_ATTR6,  (unsigned char)PERM_ATTR7,  \
75*91f16700Schasinglulu 	 (unsigned char)PERM_ATTR8,  (unsigned char)PERM_ATTR9,  \
76*91f16700Schasinglulu 	 (unsigned char)PERM_ATTR10, (unsigned char)PERM_ATTR11, \
77*91f16700Schasinglulu 	 (unsigned char)PERM_ATTR12, (unsigned char)PERM_ATTR13, \
78*91f16700Schasinglulu 	 (unsigned char)PERM_ATTR14, (unsigned char)PERM_ATTR15}
79*91f16700Schasinglulu 
80*91f16700Schasinglulu typedef enum apusys_apc_err_status (*dapc_cfg_func)(uint32_t slave,
81*91f16700Schasinglulu 						    enum apusys_apc_domain_id domain_id,
82*91f16700Schasinglulu 						    enum apusys_apc_perm_type perm);
83*91f16700Schasinglulu 
84*91f16700Schasinglulu /* Register */
85*91f16700Schasinglulu #define DEVAPC_DOM_SIZE			(0x40)
86*91f16700Schasinglulu #define DEVAPC_REG_SIZE			(4)
87*91f16700Schasinglulu 
88*91f16700Schasinglulu /* APUSYS APC offsets */
89*91f16700Schasinglulu #define APUSYS_DAPC_CON_VIO_MASK	(0x80000000)
90*91f16700Schasinglulu #define APUSYS_DAPC_CON(base)		((base) + 0x00f00)
91*91f16700Schasinglulu 
92*91f16700Schasinglulu /******************************************************************************
93*91f16700Schasinglulu  * DAPC Common Function
94*91f16700Schasinglulu  ******************************************************************************/
95*91f16700Schasinglulu #define SET_APUSYS_DAPC_V1(dapc, cfg) \
96*91f16700Schasinglulu 	set_apusys_dapc_v1(dapc, ARRAY_SIZE(dapc), cfg)
97*91f16700Schasinglulu 
98*91f16700Schasinglulu #define DUMP_APUSYS_DAPC_V1(apc) \
99*91f16700Schasinglulu 	dump_apusys_dapc_v1(#apc, apc##_BASE, \
100*91f16700Schasinglulu 			    (apc##_SLAVE_NUM / apc##_SLAVE_NUM_IN_1_DOM), apc##_DOM_NUM)
101*91f16700Schasinglulu 
102*91f16700Schasinglulu enum apusys_apc_err_status set_apusys_dapc_v1(const struct apc_dom_16 *dapc,
103*91f16700Schasinglulu 					      uint32_t size, dapc_cfg_func cfg);
104*91f16700Schasinglulu 
105*91f16700Schasinglulu void dump_apusys_dapc_v1(const char *name, uintptr_t base, uint32_t reg_num, uint32_t dom_num);
106*91f16700Schasinglulu 
107*91f16700Schasinglulu /******************************************************************************
108*91f16700Schasinglulu  * DAPC Permission Policy
109*91f16700Schasinglulu  ******************************************************************************/
110*91f16700Schasinglulu #define SLAVE_FORBID_EXCEPT_D0_SEC_RW(domain)				 \
111*91f16700Schasinglulu 	APUSYS_APC_AO_ATTR(domain,					 \
112*91f16700Schasinglulu 			   SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, FORBIDDEN, \
113*91f16700Schasinglulu 			   FORBIDDEN,   FORBIDDEN, FORBIDDEN, FORBIDDEN, \
114*91f16700Schasinglulu 			   FORBIDDEN,   FORBIDDEN, FORBIDDEN, FORBIDDEN, \
115*91f16700Schasinglulu 			   FORBIDDEN,   FORBIDDEN, FORBIDDEN, FORBIDDEN)
116*91f16700Schasinglulu 
117*91f16700Schasinglulu #define SLAVE_FORBID_EXCEPT_D0_SEC_RW_D5_NO_PROTECT(domain)		     \
118*91f16700Schasinglulu 	APUSYS_APC_AO_ATTR(domain,					     \
119*91f16700Schasinglulu 			   SEC_RW_ONLY, FORBIDDEN,     FORBIDDEN, FORBIDDEN, \
120*91f16700Schasinglulu 			   FORBIDDEN,   NO_PROTECTION, FORBIDDEN, FORBIDDEN, \
121*91f16700Schasinglulu 			   FORBIDDEN,   FORBIDDEN,     FORBIDDEN, FORBIDDEN, \
122*91f16700Schasinglulu 			   FORBIDDEN,   FORBIDDEN,     FORBIDDEN, FORBIDDEN)
123*91f16700Schasinglulu 
124*91f16700Schasinglulu #define SLAVE_FORBID_EXCEPT_D5_NO_PROTECT(domain)			   \
125*91f16700Schasinglulu 	APUSYS_APC_AO_ATTR(domain,					   \
126*91f16700Schasinglulu 			   FORBIDDEN, FORBIDDEN,     FORBIDDEN, FORBIDDEN, \
127*91f16700Schasinglulu 			   FORBIDDEN, NO_PROTECTION, FORBIDDEN, FORBIDDEN, \
128*91f16700Schasinglulu 			   FORBIDDEN, FORBIDDEN,     FORBIDDEN, FORBIDDEN, \
129*91f16700Schasinglulu 			   FORBIDDEN, FORBIDDEN,     FORBIDDEN, FORBIDDEN)
130*91f16700Schasinglulu 
131*91f16700Schasinglulu #define SLAVE_FORBID_EXCEPT_D0_SEC_RW_NS_R_D5_NO_PROTECT(domain)	     \
132*91f16700Schasinglulu 	APUSYS_APC_AO_ATTR(domain,					     \
133*91f16700Schasinglulu 			   SEC_RW_NS_R, FORBIDDEN,     FORBIDDEN, FORBIDDEN, \
134*91f16700Schasinglulu 			   FORBIDDEN,   NO_PROTECTION, FORBIDDEN, FORBIDDEN, \
135*91f16700Schasinglulu 			   FORBIDDEN,   FORBIDDEN,     FORBIDDEN, FORBIDDEN, \
136*91f16700Schasinglulu 			   FORBIDDEN,   FORBIDDEN,     FORBIDDEN, FORBIDDEN)
137*91f16700Schasinglulu 
138*91f16700Schasinglulu #define SLAVE_FORBID_EXCEPT_D7_NO_PROTECT(domain)			   \
139*91f16700Schasinglulu 	APUSYS_APC_AO_ATTR(domain,					   \
140*91f16700Schasinglulu 			   FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN,     \
141*91f16700Schasinglulu 			   FORBIDDEN, FORBIDDEN, FORBIDDEN, NO_PROTECTION, \
142*91f16700Schasinglulu 			   FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN,     \
143*91f16700Schasinglulu 			   FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN)
144*91f16700Schasinglulu 
145*91f16700Schasinglulu #define SLAVE_FORBID_EXCEPT_D5_D7_NO_PROTECT(domain)			       \
146*91f16700Schasinglulu 	APUSYS_APC_AO_ATTR(domain,					       \
147*91f16700Schasinglulu 			   FORBIDDEN, FORBIDDEN,     FORBIDDEN, FORBIDDEN,     \
148*91f16700Schasinglulu 			   FORBIDDEN, NO_PROTECTION, FORBIDDEN, NO_PROTECTION, \
149*91f16700Schasinglulu 			   FORBIDDEN, FORBIDDEN,     FORBIDDEN, FORBIDDEN,     \
150*91f16700Schasinglulu 			   FORBIDDEN, FORBIDDEN,     FORBIDDEN, FORBIDDEN)
151*91f16700Schasinglulu 
152*91f16700Schasinglulu #define SLAVE_FORBID_EXCEPT_D0_D5_NO_PROTECT(domain)			       \
153*91f16700Schasinglulu 	APUSYS_APC_AO_ATTR(domain,					       \
154*91f16700Schasinglulu 			   NO_PROTECTION, FORBIDDEN,     FORBIDDEN, FORBIDDEN, \
155*91f16700Schasinglulu 			   FORBIDDEN,     NO_PROTECTION, FORBIDDEN, FORBIDDEN, \
156*91f16700Schasinglulu 			   FORBIDDEN,     FORBIDDEN,     FORBIDDEN, FORBIDDEN, \
157*91f16700Schasinglulu 			   FORBIDDEN,     FORBIDDEN,     FORBIDDEN, FORBIDDEN)
158*91f16700Schasinglulu #endif /* APUSYS_DAPC_V1_H */
159