/* * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #ifndef SPM_MM_SVC_H #define SPM_MM_SVC_H #include /* * The MM_VERSION_XXX definitions are used when responding to the * MM_VERSION_AARCH32 service request. The version returned is different between * this request and the SPM_MM_VERSION_AARCH32 request - both have been retained * for compatibility. */ #define MM_VERSION_MAJOR U(1) #define MM_VERSION_MAJOR_SHIFT 16 #define MM_VERSION_MAJOR_MASK U(0x7FFF) #define MM_VERSION_MINOR U(0) #define MM_VERSION_MINOR_SHIFT 0 #define MM_VERSION_MINOR_MASK U(0xFFFF) #define MM_VERSION_FORM(major, minor) ((major << MM_VERSION_MAJOR_SHIFT) | \ (minor)) #define MM_VERSION_COMPILED MM_VERSION_FORM(MM_VERSION_MAJOR, \ MM_VERSION_MINOR) #define SPM_MM_VERSION_MAJOR U(0) #define SPM_MM_VERSION_MAJOR_SHIFT 16 #define SPM_MM_VERSION_MAJOR_MASK U(0x7FFF) #define SPM_MM_VERSION_MINOR U(1) #define SPM_MM_VERSION_MINOR_SHIFT 0 #define SPM_MM_VERSION_MINOR_MASK U(0xFFFF) #define SPM_MM_VERSION_FORM(major, minor) ((major << \ SPM_MM_VERSION_MAJOR_SHIFT) | \ (minor)) #define SPM_MM_VERSION_COMPILED SPM_MM_VERSION_FORM(SPM_MM_VERSION_MAJOR, \ SPM_MM_VERSION_MINOR) /* These macros are used to identify SPM-MM calls using the SMC function ID */ #define SPM_MM_FID_MASK U(0xffff) #define SPM_MM_FID_MIN_VALUE U(0x40) #define SPM_MM_FID_MAX_VALUE U(0x7f) #define is_spm_mm_fid(_fid) \ ((((_fid) & SPM_MM_FID_MASK) >= SPM_MM_FID_MIN_VALUE) && \ (((_fid) & SPM_MM_FID_MASK) <= SPM_MM_FID_MAX_VALUE)) /* * SMC IDs defined in [1] for accessing MM services from the Non-secure world. * These FIDs occupy the range 0x40 - 0x5f. * [1] DEN0060A_ARM_MM_Interface_Specification.pdf */ #define MM_VERSION_AARCH32 U(0x84000040) #define MM_COMMUNICATE_AARCH64 U(0xC4000041) #define MM_COMMUNICATE_AARCH32 U(0x84000041) /* * SMC IDs defined for accessing services implemented by the Secure Partition * Manager from the Secure Partition(s). These services enable a partition to * handle delegated events and request privileged operations from the manager. * They occupy the range 0x60-0x7f. */ #define SPM_MM_VERSION_AARCH32 U(0x84000060) #define MM_SP_EVENT_COMPLETE_AARCH64 U(0xC4000061) #define MM_SP_MEMORY_ATTRIBUTES_GET_AARCH64 U(0xC4000064) #define MM_SP_MEMORY_ATTRIBUTES_SET_AARCH64 U(0xC4000065) /* * Macros used by MM_SP_MEMORY_ATTRIBUTES_SET_AARCH64. */ #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_NOACCESS U(0) #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_RW U(1) /* Value U(2) is reserved. */ #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_RO U(3) #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_MASK U(3) #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_SHIFT 0 #define MM_SP_MEMORY_ATTRIBUTES_EXEC (U(0) << 2) #define MM_SP_MEMORY_ATTRIBUTES_NON_EXEC (U(1) << 2) /* SPM error codes. */ #define SPM_MM_SUCCESS 0 #define SPM_MM_NOT_SUPPORTED -1 #define SPM_MM_INVALID_PARAMETER -2 #define SPM_MM_DENIED -3 #define SPM_MM_NO_MEMORY -5 #ifndef __ASSEMBLER__ #include int32_t spm_mm_setup(void); uint64_t spm_mm_smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, uint64_t x4, void *cookie, void *handle, uint64_t flags); /* Helper to enter a secure partition */ uint64_t spm_mm_sp_call(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3); #endif /* __ASSEMBLER__ */ #endif /* SPM_MM_SVC_H */