1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #ifndef SPM_MM_SVC_H 8*91f16700Schasinglulu #define SPM_MM_SVC_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <lib/utils_def.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu /* 13*91f16700Schasinglulu * The MM_VERSION_XXX definitions are used when responding to the 14*91f16700Schasinglulu * MM_VERSION_AARCH32 service request. The version returned is different between 15*91f16700Schasinglulu * this request and the SPM_MM_VERSION_AARCH32 request - both have been retained 16*91f16700Schasinglulu * for compatibility. 17*91f16700Schasinglulu */ 18*91f16700Schasinglulu #define MM_VERSION_MAJOR U(1) 19*91f16700Schasinglulu #define MM_VERSION_MAJOR_SHIFT 16 20*91f16700Schasinglulu #define MM_VERSION_MAJOR_MASK U(0x7FFF) 21*91f16700Schasinglulu #define MM_VERSION_MINOR U(0) 22*91f16700Schasinglulu #define MM_VERSION_MINOR_SHIFT 0 23*91f16700Schasinglulu #define MM_VERSION_MINOR_MASK U(0xFFFF) 24*91f16700Schasinglulu #define MM_VERSION_FORM(major, minor) ((major << MM_VERSION_MAJOR_SHIFT) | \ 25*91f16700Schasinglulu (minor)) 26*91f16700Schasinglulu #define MM_VERSION_COMPILED MM_VERSION_FORM(MM_VERSION_MAJOR, \ 27*91f16700Schasinglulu MM_VERSION_MINOR) 28*91f16700Schasinglulu 29*91f16700Schasinglulu #define SPM_MM_VERSION_MAJOR U(0) 30*91f16700Schasinglulu #define SPM_MM_VERSION_MAJOR_SHIFT 16 31*91f16700Schasinglulu #define SPM_MM_VERSION_MAJOR_MASK U(0x7FFF) 32*91f16700Schasinglulu #define SPM_MM_VERSION_MINOR U(1) 33*91f16700Schasinglulu #define SPM_MM_VERSION_MINOR_SHIFT 0 34*91f16700Schasinglulu #define SPM_MM_VERSION_MINOR_MASK U(0xFFFF) 35*91f16700Schasinglulu #define SPM_MM_VERSION_FORM(major, minor) ((major << \ 36*91f16700Schasinglulu SPM_MM_VERSION_MAJOR_SHIFT) | \ 37*91f16700Schasinglulu (minor)) 38*91f16700Schasinglulu #define SPM_MM_VERSION_COMPILED SPM_MM_VERSION_FORM(SPM_MM_VERSION_MAJOR, \ 39*91f16700Schasinglulu SPM_MM_VERSION_MINOR) 40*91f16700Schasinglulu 41*91f16700Schasinglulu /* These macros are used to identify SPM-MM calls using the SMC function ID */ 42*91f16700Schasinglulu #define SPM_MM_FID_MASK U(0xffff) 43*91f16700Schasinglulu #define SPM_MM_FID_MIN_VALUE U(0x40) 44*91f16700Schasinglulu #define SPM_MM_FID_MAX_VALUE U(0x7f) 45*91f16700Schasinglulu #define is_spm_mm_fid(_fid) \ 46*91f16700Schasinglulu ((((_fid) & SPM_MM_FID_MASK) >= SPM_MM_FID_MIN_VALUE) && \ 47*91f16700Schasinglulu (((_fid) & SPM_MM_FID_MASK) <= SPM_MM_FID_MAX_VALUE)) 48*91f16700Schasinglulu 49*91f16700Schasinglulu /* 50*91f16700Schasinglulu * SMC IDs defined in [1] for accessing MM services from the Non-secure world. 51*91f16700Schasinglulu * These FIDs occupy the range 0x40 - 0x5f. 52*91f16700Schasinglulu * [1] DEN0060A_ARM_MM_Interface_Specification.pdf 53*91f16700Schasinglulu */ 54*91f16700Schasinglulu #define MM_VERSION_AARCH32 U(0x84000040) 55*91f16700Schasinglulu #define MM_COMMUNICATE_AARCH64 U(0xC4000041) 56*91f16700Schasinglulu #define MM_COMMUNICATE_AARCH32 U(0x84000041) 57*91f16700Schasinglulu 58*91f16700Schasinglulu /* 59*91f16700Schasinglulu * SMC IDs defined for accessing services implemented by the Secure Partition 60*91f16700Schasinglulu * Manager from the Secure Partition(s). These services enable a partition to 61*91f16700Schasinglulu * handle delegated events and request privileged operations from the manager. 62*91f16700Schasinglulu * They occupy the range 0x60-0x7f. 63*91f16700Schasinglulu */ 64*91f16700Schasinglulu #define SPM_MM_VERSION_AARCH32 U(0x84000060) 65*91f16700Schasinglulu #define MM_SP_EVENT_COMPLETE_AARCH64 U(0xC4000061) 66*91f16700Schasinglulu #define MM_SP_MEMORY_ATTRIBUTES_GET_AARCH64 U(0xC4000064) 67*91f16700Schasinglulu #define MM_SP_MEMORY_ATTRIBUTES_SET_AARCH64 U(0xC4000065) 68*91f16700Schasinglulu 69*91f16700Schasinglulu /* 70*91f16700Schasinglulu * Macros used by MM_SP_MEMORY_ATTRIBUTES_SET_AARCH64. 71*91f16700Schasinglulu */ 72*91f16700Schasinglulu 73*91f16700Schasinglulu #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_NOACCESS U(0) 74*91f16700Schasinglulu #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_RW U(1) 75*91f16700Schasinglulu /* Value U(2) is reserved. */ 76*91f16700Schasinglulu #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_RO U(3) 77*91f16700Schasinglulu #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_MASK U(3) 78*91f16700Schasinglulu #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_SHIFT 0 79*91f16700Schasinglulu 80*91f16700Schasinglulu #define MM_SP_MEMORY_ATTRIBUTES_EXEC (U(0) << 2) 81*91f16700Schasinglulu #define MM_SP_MEMORY_ATTRIBUTES_NON_EXEC (U(1) << 2) 82*91f16700Schasinglulu 83*91f16700Schasinglulu 84*91f16700Schasinglulu /* SPM error codes. */ 85*91f16700Schasinglulu #define SPM_MM_SUCCESS 0 86*91f16700Schasinglulu #define SPM_MM_NOT_SUPPORTED -1 87*91f16700Schasinglulu #define SPM_MM_INVALID_PARAMETER -2 88*91f16700Schasinglulu #define SPM_MM_DENIED -3 89*91f16700Schasinglulu #define SPM_MM_NO_MEMORY -5 90*91f16700Schasinglulu 91*91f16700Schasinglulu #ifndef __ASSEMBLER__ 92*91f16700Schasinglulu 93*91f16700Schasinglulu #include <stdint.h> 94*91f16700Schasinglulu 95*91f16700Schasinglulu int32_t spm_mm_setup(void); 96*91f16700Schasinglulu 97*91f16700Schasinglulu uint64_t spm_mm_smc_handler(uint32_t smc_fid, 98*91f16700Schasinglulu uint64_t x1, 99*91f16700Schasinglulu uint64_t x2, 100*91f16700Schasinglulu uint64_t x3, 101*91f16700Schasinglulu uint64_t x4, 102*91f16700Schasinglulu void *cookie, 103*91f16700Schasinglulu void *handle, 104*91f16700Schasinglulu uint64_t flags); 105*91f16700Schasinglulu 106*91f16700Schasinglulu /* Helper to enter a secure partition */ 107*91f16700Schasinglulu uint64_t spm_mm_sp_call(uint32_t smc_fid, 108*91f16700Schasinglulu uint64_t x1, 109*91f16700Schasinglulu uint64_t x2, 110*91f16700Schasinglulu uint64_t x3); 111*91f16700Schasinglulu 112*91f16700Schasinglulu #endif /* __ASSEMBLER__ */ 113*91f16700Schasinglulu 114*91f16700Schasinglulu #endif /* SPM_MM_SVC_H */ 115