xref: /rk3399_ARM-atf/plat/mediatek/drivers/emi_mpu/emi_mpu.h (revision 31309da01692802f7cd62162adef9167611f3173)
18454f0d6SDawei Chien /*
2176846a5SChungying Lu  * Copyright (c) 2022-2023, ARM Limited and Contributors. All rights reserved.
38454f0d6SDawei Chien  *
48454f0d6SDawei Chien  * SPDX-License-Identifier: BSD-3-Clause
58454f0d6SDawei Chien  */
68454f0d6SDawei Chien 
78454f0d6SDawei Chien #ifndef EMI_MPU_H
88454f0d6SDawei Chien #define EMI_MPU_H
98454f0d6SDawei Chien 
108454f0d6SDawei Chien #include <emi_mpu_priv.h>
118454f0d6SDawei Chien #include <platform_def.h>
128454f0d6SDawei Chien 
138454f0d6SDawei Chien #define NO_PROTECTION			(0)
148454f0d6SDawei Chien #define SEC_RW				(1)
158454f0d6SDawei Chien #define SEC_RW_NSEC_R			(2)
168454f0d6SDawei Chien #define SEC_RW_NSEC_W			(3)
178454f0d6SDawei Chien #define SEC_R_NSEC_R			(4)
188454f0d6SDawei Chien #define FORBIDDEN			(5)
198454f0d6SDawei Chien #define SEC_R_NSEC_RW			(6)
208454f0d6SDawei Chien 
21*fc77c69aSHaohao Sun #define LOCK				(1UL)
228454f0d6SDawei Chien #define UNLOCK				(0)
238454f0d6SDawei Chien 
248454f0d6SDawei Chien #if (EMI_MPU_DGROUP_NUM == 1)
258454f0d6SDawei Chien #define SET_ACCESS_PERMISSION(apc_ary, lock, d7, d6, d5, d4, d3, d2, d1, d0) \
268454f0d6SDawei Chien do { \
278454f0d6SDawei Chien 	apc_ary[1] = 0; \
288454f0d6SDawei Chien 	apc_ary[0] = \
298454f0d6SDawei Chien 		(((unsigned int)  d7) << 21) | (((unsigned int)  d6) << 18) | \
308454f0d6SDawei Chien 		(((unsigned int)  d5) << 15) | (((unsigned int)  d4) << 12) | \
318454f0d6SDawei Chien 		(((unsigned int)  d3) <<  9) | (((unsigned int)  d2) <<  6) | \
328454f0d6SDawei Chien 		(((unsigned int)  d1) <<  3) |  ((unsigned int)  d0) | \
338454f0d6SDawei Chien 		((unsigned int) lock << 31); \
348454f0d6SDawei Chien } while (0)
358454f0d6SDawei Chien #elif (EMI_MPU_DGROUP_NUM == 2)
368454f0d6SDawei Chien #define SET_ACCESS_PERMISSION(apc_ary, lock, d15, d14, d13, d12, d11, d10, \
378454f0d6SDawei Chien 				d9, d8, d7, d6, d5, d4, d3, d2, d1, d0) \
388454f0d6SDawei Chien do { \
398454f0d6SDawei Chien 	apc_ary[1] = \
408454f0d6SDawei Chien 		(((unsigned int) d15) << 21) | (((unsigned int) d14) << 18) | \
418454f0d6SDawei Chien 		(((unsigned int) d13) << 15) | (((unsigned int) d12) << 12) | \
428454f0d6SDawei Chien 		(((unsigned int) d11) <<  9) | (((unsigned int) d10) <<  6) | \
438454f0d6SDawei Chien 		(((unsigned int)  d9) <<  3) |  ((unsigned int)  d8); \
448454f0d6SDawei Chien 	apc_ary[0] = \
458454f0d6SDawei Chien 		(((unsigned int)  d7) << 21) | (((unsigned int)  d6) << 18) | \
468454f0d6SDawei Chien 		(((unsigned int)  d5) << 15) | (((unsigned int)  d4) << 12) | \
478454f0d6SDawei Chien 		(((unsigned int)  d3) <<  9) | (((unsigned int)  d2) <<  6) | \
488454f0d6SDawei Chien 		(((unsigned int)  d1) <<  3) |  ((unsigned int)  d0) | \
498454f0d6SDawei Chien 		((unsigned int) lock << 31); \
508454f0d6SDawei Chien } while (0)
518454f0d6SDawei Chien #endif
528454f0d6SDawei Chien 
538454f0d6SDawei Chien struct emi_region_info_t {
548454f0d6SDawei Chien 	unsigned long long start;
558454f0d6SDawei Chien 	unsigned long long end;
568454f0d6SDawei Chien 	unsigned int region;
578454f0d6SDawei Chien 	unsigned int apc[EMI_MPU_DGROUP_NUM];
588454f0d6SDawei Chien };
598454f0d6SDawei Chien 
6034d9d619SDawei Chien enum MPU_REQ_ORIGIN_ZONE_ID {
6134d9d619SDawei Chien 	MPU_REQ_ORIGIN_TEE_ZONE_SVP = 0,
6234d9d619SDawei Chien 	MPU_REQ_ORIGIN_TEE_ZONE_TUI = 1,
6334d9d619SDawei Chien 	MPU_REQ_ORIGIN_TEE_ZONE_WFD = 2,
6434d9d619SDawei Chien 	MPU_REQ_ORIGIN_TEE_ZONE_MAX = 3,
6534d9d619SDawei Chien 	MPU_REQ_ORIGIN_ZONE_INVALID = 0x7FFFFFFF,
6634d9d619SDawei Chien };
6734d9d619SDawei Chien 
688454f0d6SDawei Chien int emi_mpu_init(void);
6934d9d619SDawei Chien int emi_mpu_optee_handler(uint64_t encoded_addr, uint64_t zone_size,
7034d9d619SDawei Chien 						  uint64_t zone_info);
718454f0d6SDawei Chien int emi_mpu_set_protection(struct emi_region_info_t *region_info);
72*fc77c69aSHaohao Sun int emi_mpu_clear_protection(unsigned int region);
738454f0d6SDawei Chien void set_emi_mpu_regions(void);
74176846a5SChungying Lu int set_apu_emi_mpu_region(void);
758454f0d6SDawei Chien #endif
76