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