xref: /arm-trusted-firmware/plat/mediatek/drivers/emi_mpu/emi_mpu.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2022-2023, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef EMI_MPU_H
8*91f16700Schasinglulu #define EMI_MPU_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <emi_mpu_priv.h>
11*91f16700Schasinglulu #include <platform_def.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu #define NO_PROTECTION			(0)
14*91f16700Schasinglulu #define SEC_RW				(1)
15*91f16700Schasinglulu #define SEC_RW_NSEC_R			(2)
16*91f16700Schasinglulu #define SEC_RW_NSEC_W			(3)
17*91f16700Schasinglulu #define SEC_R_NSEC_R			(4)
18*91f16700Schasinglulu #define FORBIDDEN			(5)
19*91f16700Schasinglulu #define SEC_R_NSEC_RW			(6)
20*91f16700Schasinglulu 
21*91f16700Schasinglulu #define LOCK				(1)
22*91f16700Schasinglulu #define UNLOCK				(0)
23*91f16700Schasinglulu 
24*91f16700Schasinglulu #if (EMI_MPU_DGROUP_NUM == 1)
25*91f16700Schasinglulu #define SET_ACCESS_PERMISSION(apc_ary, lock, d7, d6, d5, d4, d3, d2, d1, d0) \
26*91f16700Schasinglulu do { \
27*91f16700Schasinglulu 	apc_ary[1] = 0; \
28*91f16700Schasinglulu 	apc_ary[0] = \
29*91f16700Schasinglulu 		(((unsigned int)  d7) << 21) | (((unsigned int)  d6) << 18) | \
30*91f16700Schasinglulu 		(((unsigned int)  d5) << 15) | (((unsigned int)  d4) << 12) | \
31*91f16700Schasinglulu 		(((unsigned int)  d3) <<  9) | (((unsigned int)  d2) <<  6) | \
32*91f16700Schasinglulu 		(((unsigned int)  d1) <<  3) |  ((unsigned int)  d0) | \
33*91f16700Schasinglulu 		((unsigned int) lock << 31); \
34*91f16700Schasinglulu } while (0)
35*91f16700Schasinglulu #elif (EMI_MPU_DGROUP_NUM == 2)
36*91f16700Schasinglulu #define SET_ACCESS_PERMISSION(apc_ary, lock, d15, d14, d13, d12, d11, d10, \
37*91f16700Schasinglulu 				d9, d8, d7, d6, d5, d4, d3, d2, d1, d0) \
38*91f16700Schasinglulu do { \
39*91f16700Schasinglulu 	apc_ary[1] = \
40*91f16700Schasinglulu 		(((unsigned int) d15) << 21) | (((unsigned int) d14) << 18) | \
41*91f16700Schasinglulu 		(((unsigned int) d13) << 15) | (((unsigned int) d12) << 12) | \
42*91f16700Schasinglulu 		(((unsigned int) d11) <<  9) | (((unsigned int) d10) <<  6) | \
43*91f16700Schasinglulu 		(((unsigned int)  d9) <<  3) |  ((unsigned int)  d8); \
44*91f16700Schasinglulu 	apc_ary[0] = \
45*91f16700Schasinglulu 		(((unsigned int)  d7) << 21) | (((unsigned int)  d6) << 18) | \
46*91f16700Schasinglulu 		(((unsigned int)  d5) << 15) | (((unsigned int)  d4) << 12) | \
47*91f16700Schasinglulu 		(((unsigned int)  d3) <<  9) | (((unsigned int)  d2) <<  6) | \
48*91f16700Schasinglulu 		(((unsigned int)  d1) <<  3) |  ((unsigned int)  d0) | \
49*91f16700Schasinglulu 		((unsigned int) lock << 31); \
50*91f16700Schasinglulu } while (0)
51*91f16700Schasinglulu #endif
52*91f16700Schasinglulu 
53*91f16700Schasinglulu struct emi_region_info_t {
54*91f16700Schasinglulu 	unsigned long long start;
55*91f16700Schasinglulu 	unsigned long long end;
56*91f16700Schasinglulu 	unsigned int region;
57*91f16700Schasinglulu 	unsigned int apc[EMI_MPU_DGROUP_NUM];
58*91f16700Schasinglulu };
59*91f16700Schasinglulu 
60*91f16700Schasinglulu enum MPU_REQ_ORIGIN_ZONE_ID {
61*91f16700Schasinglulu 	MPU_REQ_ORIGIN_TEE_ZONE_SVP = 0,
62*91f16700Schasinglulu 	MPU_REQ_ORIGIN_TEE_ZONE_TUI = 1,
63*91f16700Schasinglulu 	MPU_REQ_ORIGIN_TEE_ZONE_WFD = 2,
64*91f16700Schasinglulu 	MPU_REQ_ORIGIN_TEE_ZONE_MAX = 3,
65*91f16700Schasinglulu 	MPU_REQ_ORIGIN_ZONE_INVALID = 0x7FFFFFFF,
66*91f16700Schasinglulu };
67*91f16700Schasinglulu 
68*91f16700Schasinglulu int emi_mpu_init(void);
69*91f16700Schasinglulu int emi_mpu_optee_handler(uint64_t encoded_addr, uint64_t zone_size,
70*91f16700Schasinglulu 						  uint64_t zone_info);
71*91f16700Schasinglulu int emi_mpu_set_protection(struct emi_region_info_t *region_info);
72*91f16700Schasinglulu void set_emi_mpu_regions(void);
73*91f16700Schasinglulu int set_apu_emi_mpu_region(void);
74*91f16700Schasinglulu #endif
75