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