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