1*0bf9f567SPaul Beesley /* 2*0bf9f567SPaul Beesley * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved. 3*0bf9f567SPaul Beesley * 4*0bf9f567SPaul Beesley * SPDX-License-Identifier: BSD-3-Clause 5*0bf9f567SPaul Beesley */ 6*0bf9f567SPaul Beesley 7*0bf9f567SPaul Beesley #ifndef SPM_MM_SVC_H 8*0bf9f567SPaul Beesley #define SPM_MM_SVC_H 9*0bf9f567SPaul Beesley 10*0bf9f567SPaul Beesley #include <lib/utils_def.h> 11*0bf9f567SPaul Beesley 12*0bf9f567SPaul Beesley #define SPM_MM_VERSION_MAJOR U(0) 13*0bf9f567SPaul Beesley #define SPM_MM_VERSION_MAJOR_SHIFT 16 14*0bf9f567SPaul Beesley #define SPM_MM_VERSION_MAJOR_MASK U(0x7FFF) 15*0bf9f567SPaul Beesley #define SPM_MM_VERSION_MINOR U(1) 16*0bf9f567SPaul Beesley #define SPM_MM_VERSION_MINOR_SHIFT 0 17*0bf9f567SPaul Beesley #define SPM_MM_VERSION_MINOR_MASK U(0xFFFF) 18*0bf9f567SPaul Beesley #define SPM_MM_VERSION_FORM(major, minor) ((major << \ 19*0bf9f567SPaul Beesley SPM_MM_VERSION_MAJOR_SHIFT) | \ 20*0bf9f567SPaul Beesley (minor)) 21*0bf9f567SPaul Beesley #define SPM_MM_VERSION_COMPILED SPM_MM_VERSION_FORM(SPM_MM_VERSION_MAJOR, \ 22*0bf9f567SPaul Beesley SPM_MM_VERSION_MINOR) 23*0bf9f567SPaul Beesley 24*0bf9f567SPaul Beesley /* These macros are used to identify SPM-MM calls using the SMC function ID */ 25*0bf9f567SPaul Beesley #define SPM_MM_FID_MASK U(0xffff) 26*0bf9f567SPaul Beesley #define SPM_MM_FID_MIN_VALUE U(0x40) 27*0bf9f567SPaul Beesley #define SPM_MM_FID_MAX_VALUE U(0x7f) 28*0bf9f567SPaul Beesley #define is_spm_mm_fid(_fid) \ 29*0bf9f567SPaul Beesley ((((_fid) & SPM_MM_FID_MASK) >= SPM_MM_FID_MIN_VALUE) && \ 30*0bf9f567SPaul Beesley (((_fid) & SPM_MM_FID_MASK) <= SPM_MM_FID_MAX_VALUE)) 31*0bf9f567SPaul Beesley 32*0bf9f567SPaul Beesley /* 33*0bf9f567SPaul Beesley * SMC IDs defined for accessing services implemented by the Secure Partition 34*0bf9f567SPaul Beesley * Manager from the Secure Partition(s). These services enable a partition to 35*0bf9f567SPaul Beesley * handle delegated events and request privileged operations from the manager. 36*0bf9f567SPaul Beesley * They occupy the range 0x60-0x7f. 37*0bf9f567SPaul Beesley */ 38*0bf9f567SPaul Beesley #define SPM_MM_VERSION_AARCH32 U(0x84000060) 39*0bf9f567SPaul Beesley #define MM_SP_EVENT_COMPLETE_AARCH64 U(0xC4000061) 40*0bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_GET_AARCH64 U(0xC4000064) 41*0bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_SET_AARCH64 U(0xC4000065) 42*0bf9f567SPaul Beesley 43*0bf9f567SPaul Beesley /* 44*0bf9f567SPaul Beesley * Macros used by MM_SP_MEMORY_ATTRIBUTES_SET_AARCH64. 45*0bf9f567SPaul Beesley */ 46*0bf9f567SPaul Beesley 47*0bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_NOACCESS U(0) 48*0bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_RW U(1) 49*0bf9f567SPaul Beesley /* Value U(2) is reserved. */ 50*0bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_RO U(3) 51*0bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_MASK U(3) 52*0bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_SHIFT 0 53*0bf9f567SPaul Beesley 54*0bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_EXEC (U(0) << 2) 55*0bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_NON_EXEC (U(1) << 2) 56*0bf9f567SPaul Beesley 57*0bf9f567SPaul Beesley 58*0bf9f567SPaul Beesley /* SPM error codes. */ 59*0bf9f567SPaul Beesley #define SPM_MM_SUCCESS 0 60*0bf9f567SPaul Beesley #define SPM_MM_NOT_SUPPORTED -1 61*0bf9f567SPaul Beesley #define SPM_MM_INVALID_PARAMETER -2 62*0bf9f567SPaul Beesley #define SPM_MM_DENIED -3 63*0bf9f567SPaul Beesley #define SPM_MM_NO_MEMORY -5 64*0bf9f567SPaul Beesley 65*0bf9f567SPaul Beesley #ifndef __ASSEMBLER__ 66*0bf9f567SPaul Beesley 67*0bf9f567SPaul Beesley #include <stdint.h> 68*0bf9f567SPaul Beesley 69*0bf9f567SPaul Beesley int32_t spm_mm_setup(void); 70*0bf9f567SPaul Beesley 71*0bf9f567SPaul Beesley uint64_t spm_mm_smc_handler(uint32_t smc_fid, 72*0bf9f567SPaul Beesley uint64_t x1, 73*0bf9f567SPaul Beesley uint64_t x2, 74*0bf9f567SPaul Beesley uint64_t x3, 75*0bf9f567SPaul Beesley uint64_t x4, 76*0bf9f567SPaul Beesley void *cookie, 77*0bf9f567SPaul Beesley void *handle, 78*0bf9f567SPaul Beesley uint64_t flags); 79*0bf9f567SPaul Beesley 80*0bf9f567SPaul Beesley /* Helper to enter a secure partition */ 81*0bf9f567SPaul Beesley uint64_t spm_mm_sp_call(uint32_t smc_fid, 82*0bf9f567SPaul Beesley uint64_t x1, 83*0bf9f567SPaul Beesley uint64_t x2, 84*0bf9f567SPaul Beesley uint64_t x3); 85*0bf9f567SPaul Beesley 86*0bf9f567SPaul Beesley #endif /* __ASSEMBLER__ */ 87*0bf9f567SPaul Beesley 88*0bf9f567SPaul Beesley #endif /* SPM_MM_SVC_H */ 89