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