xref: /rk3399_ARM-atf/plat/mediatek/mt8195/drivers/emi_mpu/emi_mpu.h (revision 5fdb2e5471c6ae564ea60d986505418134e7516f)
175edd34aSPenny Jan /*
2*ccc61e10SBo-Chen Chen  * Copyright (c) 2021-2023, ARM Limited and Contributors. All rights reserved.
375edd34aSPenny Jan  *
475edd34aSPenny Jan  * SPDX-License-Identifier: BSD-3-Clause
575edd34aSPenny Jan  */
675edd34aSPenny Jan 
775edd34aSPenny Jan #ifndef EMI_MPU_H
875edd34aSPenny Jan #define EMI_MPU_H
975edd34aSPenny Jan 
1075edd34aSPenny Jan #include <platform_def.h>
1175edd34aSPenny Jan 
1275edd34aSPenny Jan #define ENABLE_EMI_MPU_SW_LOCK		1
1375edd34aSPenny Jan 
1475edd34aSPenny Jan #define EMI_MPU_CTRL			(EMI_MPU_BASE + 0x000)
1575edd34aSPenny Jan #define EMI_MPU_DBG			(EMI_MPU_BASE + 0x004)
1675edd34aSPenny Jan #define EMI_MPU_SA0			(EMI_MPU_BASE + 0x100)
1775edd34aSPenny Jan #define EMI_MPU_EA0			(EMI_MPU_BASE + 0x200)
1875edd34aSPenny Jan #define EMI_MPU_SA(region)		(EMI_MPU_SA0 + (region * 4))
1975edd34aSPenny Jan #define EMI_MPU_EA(region)		(EMI_MPU_EA0 + (region * 4))
2075edd34aSPenny Jan #define EMI_MPU_APC0			(EMI_MPU_BASE + 0x300)
2175edd34aSPenny Jan #define EMI_MPU_APC(region, dgroup)	(EMI_MPU_APC0 + (region * 4) + (dgroup * 0x100))
2275edd34aSPenny Jan #define EMI_MPU_CTRL_D0			(EMI_MPU_BASE + 0x800)
2375edd34aSPenny Jan #define EMI_MPU_CTRL_D(domain)		(EMI_MPU_CTRL_D0 + (domain * 4))
2475edd34aSPenny Jan #define EMI_RG_MASK_D0			(EMI_MPU_BASE + 0x900)
2575edd34aSPenny Jan #define EMI_RG_MASK_D(domain)		(EMI_RG_MASK_D0 + (domain * 4))
2675edd34aSPenny Jan #define EMI_MPU_START			(0x000)
2775edd34aSPenny Jan #define EMI_MPU_END			(0x93C)
2875edd34aSPenny Jan 
2975edd34aSPenny Jan #define SUB_EMI_MPU_CTRL		(SUB_EMI_MPU_BASE + 0x000)
3075edd34aSPenny Jan #define SUB_EMI_MPU_DBG			(SUB_EMI_MPU_BASE + 0x004)
3175edd34aSPenny Jan #define SUB_EMI_MPU_SA0			(SUB_EMI_MPU_BASE + 0x100)
3275edd34aSPenny Jan #define SUB_EMI_MPU_EA0			(SUB_EMI_MPU_BASE + 0x200)
3375edd34aSPenny Jan #define SUB_EMI_MPU_SA(region)		(SUB_EMI_MPU_SA0 + (region * 4))
3475edd34aSPenny Jan #define SUB_EMI_MPU_EA(region)		(SUB_EMI_MPU_EA0 + (region * 4))
3575edd34aSPenny Jan #define SUB_EMI_MPU_APC0		(SUB_EMI_MPU_BASE + 0x300)
3675edd34aSPenny Jan #define SUB_EMI_MPU_APC(region, dgroup)	(SUB_EMI_MPU_APC0 + (region * 4) + (dgroup * 0x100))
3775edd34aSPenny Jan #define SUB_EMI_MPU_CTRL_D0		(SUB_EMI_MPU_BASE + 0x800)
3875edd34aSPenny Jan #define SUB_EMI_MPU_CTRL_D(domain)	(SUB_EMI_MPU_CTRL_D0 + (domain * 4))
3975edd34aSPenny Jan #define SUB_EMI_RG_MASK_D0		(SUB_EMI_MPU_BASE + 0x900)
4075edd34aSPenny Jan #define SUB_EMI_RG_MASK_D(domain)	(SUB_EMI_RG_MASK_D0 + (domain * 4))
4175edd34aSPenny Jan 
4275edd34aSPenny Jan #define EMI_MPU_DOMAIN_NUM		(16)
4375edd34aSPenny Jan #define EMI_MPU_REGION_NUM		(32)
4475edd34aSPenny Jan #define EMI_MPU_ALIGN_BITS		(16)
4575edd34aSPenny Jan #define DRAM_OFFSET			(0x40000000 >> EMI_MPU_ALIGN_BITS)
4675edd34aSPenny Jan 
4775edd34aSPenny Jan #define NO_PROTECTION			0
4875edd34aSPenny Jan #define SEC_RW				1
4975edd34aSPenny Jan #define SEC_RW_NSEC_R			2
5075edd34aSPenny Jan #define SEC_RW_NSEC_W			3
5175edd34aSPenny Jan #define SEC_R_NSEC_R			4
5275edd34aSPenny Jan #define FORBIDDEN			5
5375edd34aSPenny Jan #define SEC_R_NSEC_RW			6
5475edd34aSPenny Jan 
5575edd34aSPenny Jan #define LOCK				1
5675edd34aSPenny Jan #define UNLOCK				0
5775edd34aSPenny Jan 
5875edd34aSPenny Jan #define EMI_MPU_DGROUP_NUM		(EMI_MPU_DOMAIN_NUM / 8)
5975edd34aSPenny Jan 
6075edd34aSPenny Jan #if (EMI_MPU_DGROUP_NUM == 1)
6175edd34aSPenny Jan #define SET_ACCESS_PERMISSION(apc_ary, lock, d7, d6, d5, d4, d3, d2, d1, d0) \
6275edd34aSPenny Jan do { \
6375edd34aSPenny Jan 	apc_ary[1] = 0; \
6475edd34aSPenny Jan 	apc_ary[0] = \
6575edd34aSPenny Jan 		(((unsigned int)  d7) << 21) | (((unsigned int)  d6) << 18) | \
6675edd34aSPenny Jan 		(((unsigned int)  d5) << 15) | (((unsigned int)  d4) << 12) | \
6775edd34aSPenny Jan 		(((unsigned int)  d3) <<  9) | (((unsigned int)  d2) <<  6) | \
6875edd34aSPenny Jan 		(((unsigned int)  d1) <<  3) |  ((unsigned int)  d0) | \
6975edd34aSPenny Jan 		((unsigned int) lock << 31); \
7075edd34aSPenny Jan } while (0)
7175edd34aSPenny Jan #elif (EMI_MPU_DGROUP_NUM == 2)
7275edd34aSPenny Jan #define SET_ACCESS_PERMISSION(apc_ary, lock, d15, d14, d13, d12, d11, d10, \
7375edd34aSPenny Jan 				d9, d8, d7, d6, d5, d4, d3, d2, d1, d0) \
7475edd34aSPenny Jan do { \
7575edd34aSPenny Jan 	apc_ary[1] = \
7675edd34aSPenny Jan 		(((unsigned int) d15) << 21) | (((unsigned int) d14) << 18) | \
7775edd34aSPenny Jan 		(((unsigned int) d13) << 15) | (((unsigned int) d12) << 12) | \
7875edd34aSPenny Jan 		(((unsigned int) d11) <<  9) | (((unsigned int) d10) <<  6) | \
7975edd34aSPenny Jan 		(((unsigned int)  d9) <<  3) |  ((unsigned int)  d8); \
8075edd34aSPenny Jan 	apc_ary[0] = \
8175edd34aSPenny Jan 		(((unsigned int)  d7) << 21) | (((unsigned int)  d6) << 18) | \
8275edd34aSPenny Jan 		(((unsigned int)  d5) << 15) | (((unsigned int)  d4) << 12) | \
8375edd34aSPenny Jan 		(((unsigned int)  d3) <<  9) | (((unsigned int)  d2) <<  6) | \
8475edd34aSPenny Jan 		(((unsigned int)  d1) <<  3) |  ((unsigned int)  d0) | \
8575edd34aSPenny Jan 		((unsigned int) lock << 31); \
8675edd34aSPenny Jan } while (0)
8775edd34aSPenny Jan #endif
8875edd34aSPenny Jan 
8975edd34aSPenny Jan struct emi_region_info_t {
9075edd34aSPenny Jan 	unsigned long long start;
9175edd34aSPenny Jan 	unsigned long long end;
9275edd34aSPenny Jan 	unsigned int region;
9375edd34aSPenny Jan 	unsigned int apc[EMI_MPU_DGROUP_NUM];
9475edd34aSPenny Jan };
9575edd34aSPenny Jan 
96*ccc61e10SBo-Chen Chen enum MPU_REQ_ORIGIN_ZONE_ID {
97*ccc61e10SBo-Chen Chen 	MPU_REQ_ORIGIN_TEE_ZONE_SVP = 0,
98*ccc61e10SBo-Chen Chen 	MPU_REQ_ORIGIN_TEE_ZONE_TUI = 1,
99*ccc61e10SBo-Chen Chen 	MPU_REQ_ORIGIN_TEE_ZONE_WFD = 2,
100*ccc61e10SBo-Chen Chen 	MPU_REQ_ORIGIN_TEE_ZONE_MAX = 3,
101*ccc61e10SBo-Chen Chen 	MPU_REQ_ORIGIN_ZONE_INVALID = 0x7FFFFFFF,
102*ccc61e10SBo-Chen Chen };
103*ccc61e10SBo-Chen Chen 
10475edd34aSPenny Jan void emi_mpu_init(void);
105*ccc61e10SBo-Chen Chen int32_t emi_mpu_sip_handler(uint64_t encoded_addr, uint64_t zone_size, uint64_t zone_info);
10675edd34aSPenny Jan 
10775edd34aSPenny Jan #endif
108