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