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