1 /* 2 * Copyright (c) 2023-2024, 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 = 0x1000, 18 APUSYS_APC_ERR_INVALID_CMD = 0x1001, 19 APUSYS_APC_ERR_SLAVE_TYPE_NOT_SUPPORTED = 0x1002, 20 APUSYS_APC_ERR_SLAVE_IDX_NOT_SUPPORTED = 0x1003, 21 APUSYS_APC_ERR_DOMAIN_NOT_SUPPORTED = 0x1004, 22 APUSYS_APC_ERR_PERMISSION_NOT_SUPPORTED = 0x1005, 23 APUSYS_APC_ERR_OUT_OF_BOUNDARY = 0x1006, 24 APUSYS_APC_ERR_REQ_TYPE_NOT_SUPPORTED = 0x1007, 25 }; 26 27 enum apusys_apc_perm_type { 28 NO_PROTECTION = 0, 29 SEC_RW_ONLY = 1, 30 SEC_RW_NS_R = 2, 31 FORBIDDEN = 3, 32 PERM_NUM = 4, 33 }; 34 35 enum apusys_apc_domain_id { 36 DOMAIN_0 = 0, 37 DOMAIN_1 = 1, 38 DOMAIN_2 = 2, 39 DOMAIN_3 = 3, 40 DOMAIN_4 = 4, 41 DOMAIN_5 = 5, 42 DOMAIN_6 = 6, 43 DOMAIN_7 = 7, 44 DOMAIN_8 = 8, 45 DOMAIN_9 = 9, 46 DOMAIN_10 = 10, 47 DOMAIN_11 = 11, 48 DOMAIN_12 = 12, 49 DOMAIN_13 = 13, 50 DOMAIN_14 = 14, 51 DOMAIN_15 = 15, 52 }; 53 54 struct apc_dom_16 { 55 unsigned char d0_permission; 56 unsigned char d1_permission; 57 unsigned char d2_permission; 58 unsigned char d3_permission; 59 unsigned char d4_permission; 60 unsigned char d5_permission; 61 unsigned char d6_permission; 62 unsigned char d7_permission; 63 unsigned char d8_permission; 64 unsigned char d9_permission; 65 unsigned char d10_permission; 66 unsigned char d11_permission; 67 unsigned char d12_permission; 68 unsigned char d13_permission; 69 unsigned char d14_permission; 70 unsigned char d15_permission; 71 }; 72 73 #define APUSYS_APC_AO_ATTR(DEV_NAME, \ 74 PERM_ATTR0, PERM_ATTR1, PERM_ATTR2, PERM_ATTR3, \ 75 PERM_ATTR4, PERM_ATTR5, PERM_ATTR6, PERM_ATTR7, \ 76 PERM_ATTR8, PERM_ATTR9, PERM_ATTR10, PERM_ATTR11, \ 77 PERM_ATTR12, PERM_ATTR13, PERM_ATTR14, PERM_ATTR15) \ 78 {(unsigned char)PERM_ATTR0, (unsigned char)PERM_ATTR1, \ 79 (unsigned char)PERM_ATTR2, (unsigned char)PERM_ATTR3, \ 80 (unsigned char)PERM_ATTR4, (unsigned char)PERM_ATTR5, \ 81 (unsigned char)PERM_ATTR6, (unsigned char)PERM_ATTR7, \ 82 (unsigned char)PERM_ATTR8, (unsigned char)PERM_ATTR9, \ 83 (unsigned char)PERM_ATTR10, (unsigned char)PERM_ATTR11, \ 84 (unsigned char)PERM_ATTR12, (unsigned char)PERM_ATTR13, \ 85 (unsigned char)PERM_ATTR14, (unsigned char)PERM_ATTR15} 86 87 typedef enum apusys_apc_err_status (*dapc_cfg_func)(uint32_t slave, 88 enum apusys_apc_domain_id domain_id, 89 enum apusys_apc_perm_type perm); 90 91 /* Register */ 92 #define DEVAPC_DOM_SIZE (0x40) 93 #define DEVAPC_REG_SIZE (4) 94 95 /* APUSYS APC offsets */ 96 #define APUSYS_DAPC_CON_VIO_MASK (0x80000000) 97 #define APUSYS_DAPC_CON(base) ((base) + 0x00f00) 98 99 /****************************************************************************** 100 * DAPC Common Function 101 ******************************************************************************/ 102 #define SET_APUSYS_DAPC_V1(dapc, cfg) \ 103 set_apusys_dapc_v1(dapc, ARRAY_SIZE(dapc), cfg) 104 105 #define DUMP_APUSYS_DAPC_V1(apc) \ 106 dump_apusys_dapc_v1(#apc, apc##_BASE, \ 107 (apc##_SLAVE_NUM / apc##_SLAVE_NUM_IN_1_DOM), apc##_DOM_NUM) 108 109 enum apusys_apc_err_status set_apusys_dapc_v1(const struct apc_dom_16 *dapc, 110 uint32_t size, dapc_cfg_func cfg); 111 112 void dump_apusys_dapc_v1(const char *name, uintptr_t base, uint32_t reg_num, uint32_t dom_num); 113 114 /****************************************************************************** 115 * DAPC Permission Policy 116 ******************************************************************************/ 117 #define SLAVE_FORBID_EXCEPT_D0_SEC_RW(domain) \ 118 APUSYS_APC_AO_ATTR(domain, \ 119 SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 120 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 121 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 122 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 123 124 #define SLAVE_FORBID_EXCEPT_D0_SEC_RW_D5_NO_PROTECT(domain) \ 125 APUSYS_APC_AO_ATTR(domain, \ 126 SEC_RW_ONLY, 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_D5_NO_PROTECT(domain) \ 132 APUSYS_APC_AO_ATTR(domain, \ 133 FORBIDDEN, 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_D0_SEC_RW_NS_R_D5_NO_PROTECT(domain) \ 139 APUSYS_APC_AO_ATTR(domain, \ 140 SEC_RW_NS_R, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 141 FORBIDDEN, NO_PROTECTION, FORBIDDEN, FORBIDDEN, \ 142 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 143 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 144 145 #define SLAVE_FORBID_EXCEPT_D7_NO_PROTECT(domain) \ 146 APUSYS_APC_AO_ATTR(domain, \ 147 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 148 FORBIDDEN, FORBIDDEN, FORBIDDEN, NO_PROTECTION, \ 149 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 150 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 151 152 #define SLAVE_FORBID_EXCEPT_D5_D7_NO_PROTECT(domain) \ 153 APUSYS_APC_AO_ATTR(domain, \ 154 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 155 FORBIDDEN, NO_PROTECTION, FORBIDDEN, NO_PROTECTION, \ 156 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 157 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 158 159 #define SLAVE_FORBID_EXCEPT_D0_D5_NO_PROTECT(domain) \ 160 APUSYS_APC_AO_ATTR(domain, \ 161 NO_PROTECTION, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 162 FORBIDDEN, NO_PROTECTION, FORBIDDEN, FORBIDDEN, \ 163 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 164 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 165 166 #define SLAVE_FORBID_EXCEPT_D0_D11_NO_PROTECT_D3_D5_D8_SEC_RW(domain) \ 167 APUSYS_APC_AO_ATTR(domain, \ 168 NO_PROTECTION, FORBIDDEN, FORBIDDEN, SEC_RW_ONLY, \ 169 FORBIDDEN, SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \ 170 SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, NO_PROTECTION, \ 171 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 172 173 #define SLAVE_FORBID_EXCEPT_D0_SEC_RW_NS_R_D3_D5_SEC_RW(domain) \ 174 APUSYS_APC_AO_ATTR(domain, \ 175 SEC_RW_NS_R, FORBIDDEN, FORBIDDEN, SEC_RW_ONLY, \ 176 FORBIDDEN, SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \ 177 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 178 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 179 180 #define SLAVE_FORBID_EXCEPT_D5_SEC_RW(domain) \ 181 APUSYS_APC_AO_ATTR(domain, \ 182 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 183 FORBIDDEN, SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \ 184 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 185 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 186 187 #define SLAVE_FORBID_EXCEPT_D0_SEC_RW_NS_R_D5_SEC_RW(domain) \ 188 APUSYS_APC_AO_ATTR(domain, \ 189 SEC_RW_NS_R, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 190 FORBIDDEN, SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \ 191 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 192 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 193 194 #define SLAVE_FORBID_EXCEPT_D0_NO_PROTECT_D3_D5_SEC_RW(domain) \ 195 APUSYS_APC_AO_ATTR(domain, \ 196 NO_PROTECTION, FORBIDDEN, FORBIDDEN, SEC_RW_ONLY, \ 197 FORBIDDEN, SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \ 198 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 199 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 200 201 #define SLAVE_FORBID_EXCEPT_D3_D5_SEC_RW_D0_D4_D11_NO_PROTECT(domain) \ 202 APUSYS_APC_AO_ATTR(domain, \ 203 NO_PROTECTION, FORBIDDEN, FORBIDDEN, SEC_RW_ONLY, \ 204 NO_PROTECTION, SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \ 205 FORBIDDEN, FORBIDDEN, FORBIDDEN, NO_PROTECTION, \ 206 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 207 208 #define SLAVE_FORBID_EXCEPT_D5_SEC_RW_D0_NO_PROTECT(domain) \ 209 APUSYS_APC_AO_ATTR(domain, \ 210 NO_PROTECTION, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 211 FORBIDDEN, SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \ 212 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 213 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 214 215 #define SLAVE_FORBID_EXCEPT_D0_D5_SEC_RW(domain) \ 216 APUSYS_APC_AO_ATTR(domain, \ 217 SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 218 FORBIDDEN, SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \ 219 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 220 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 221 222 #define SLAVE_FORBID_EXCEPT_D0_NO_PROTECT_D5_SEC_RW(domain) \ 223 APUSYS_APC_AO_ATTR(domain, \ 224 NO_PROTECTION, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 225 FORBIDDEN, SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \ 226 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 227 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 228 229 #define SLAVE_FORBID_EXCEPT_D3_D5_SEC_RW_D0_D11_NO_PROTECT(domain) \ 230 APUSYS_APC_AO_ATTR(domain, \ 231 NO_PROTECTION, FORBIDDEN, FORBIDDEN, SEC_RW_ONLY, \ 232 FORBIDDEN, SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \ 233 FORBIDDEN, FORBIDDEN, FORBIDDEN, NO_PROTECTION, \ 234 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 235 236 #define SLAVE_FORBID_EXCEPT_D0_NO_PROTECT_D5_D8_SEC_RW(domain) \ 237 APUSYS_APC_AO_ATTR(domain, \ 238 NO_PROTECTION, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 239 FORBIDDEN, SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \ 240 SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 241 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 242 243 #define SLAVE_FORBID_EXCEPT_D0_D3_D5_SEC_RW(domain) \ 244 APUSYS_APC_AO_ATTR(domain, \ 245 SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, SEC_RW_ONLY, \ 246 FORBIDDEN, SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \ 247 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 248 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 249 250 #define SLAVE_FORBID_EXCEPT_D0_SEC_RW_NS_R_D5_D8_SEC_RW(domain) \ 251 APUSYS_APC_AO_ATTR(domain, \ 252 SEC_RW_NS_R, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 253 FORBIDDEN, SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \ 254 SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 255 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 256 257 #define SLAVE_FORBID_EXCEPT_D5_D8_SEC_RW(domain) \ 258 APUSYS_APC_AO_ATTR(domain, \ 259 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 260 FORBIDDEN, SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, \ 261 SEC_RW_ONLY, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 262 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN) 263 264 #define SLAVE_FORBID_EXCEPT_D0_D5_D7_D14_NO_PROTECT(domain) \ 265 APUSYS_APC_AO_ATTR(domain, \ 266 NO_PROTECTION, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 267 FORBIDDEN, NO_PROTECTION, FORBIDDEN, NO_PROTECTION, \ 268 FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, \ 269 FORBIDDEN, FORBIDDEN, NO_PROTECTION, FORBIDDEN) 270 271 #endif /* APUSYS_DAPC_V1_H */ 272