10bf9f567SPaul Beesley /* 20bf9f567SPaul Beesley * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved. 30bf9f567SPaul Beesley * 40bf9f567SPaul Beesley * SPDX-License-Identifier: BSD-3-Clause 50bf9f567SPaul Beesley */ 60bf9f567SPaul Beesley 70bf9f567SPaul Beesley #ifndef SPM_MM_SVC_H 80bf9f567SPaul Beesley #define SPM_MM_SVC_H 90bf9f567SPaul Beesley 100bf9f567SPaul Beesley #include <lib/utils_def.h> 110bf9f567SPaul Beesley 12*962c44e7SPaul Beesley /* 13*962c44e7SPaul Beesley * The MM_VERSION_XXX definitions are used when responding to the 14*962c44e7SPaul Beesley * MM_VERSION_AARCH32 service request. The version returned is different between 15*962c44e7SPaul Beesley * this request and the SPM_MM_VERSION_AARCH32 request - both have been retained 16*962c44e7SPaul Beesley * for compatibility. 17*962c44e7SPaul Beesley */ 18*962c44e7SPaul Beesley #define MM_VERSION_MAJOR U(1) 19*962c44e7SPaul Beesley #define MM_VERSION_MAJOR_SHIFT 16 20*962c44e7SPaul Beesley #define MM_VERSION_MAJOR_MASK U(0x7FFF) 21*962c44e7SPaul Beesley #define MM_VERSION_MINOR U(0) 22*962c44e7SPaul Beesley #define MM_VERSION_MINOR_SHIFT 0 23*962c44e7SPaul Beesley #define MM_VERSION_MINOR_MASK U(0xFFFF) 24*962c44e7SPaul Beesley #define MM_VERSION_FORM(major, minor) ((major << MM_VERSION_MAJOR_SHIFT) | \ 25*962c44e7SPaul Beesley (minor)) 26*962c44e7SPaul Beesley #define MM_VERSION_COMPILED MM_VERSION_FORM(MM_VERSION_MAJOR, \ 27*962c44e7SPaul Beesley MM_VERSION_MINOR) 28*962c44e7SPaul Beesley 290bf9f567SPaul Beesley #define SPM_MM_VERSION_MAJOR U(0) 300bf9f567SPaul Beesley #define SPM_MM_VERSION_MAJOR_SHIFT 16 310bf9f567SPaul Beesley #define SPM_MM_VERSION_MAJOR_MASK U(0x7FFF) 320bf9f567SPaul Beesley #define SPM_MM_VERSION_MINOR U(1) 330bf9f567SPaul Beesley #define SPM_MM_VERSION_MINOR_SHIFT 0 340bf9f567SPaul Beesley #define SPM_MM_VERSION_MINOR_MASK U(0xFFFF) 350bf9f567SPaul Beesley #define SPM_MM_VERSION_FORM(major, minor) ((major << \ 360bf9f567SPaul Beesley SPM_MM_VERSION_MAJOR_SHIFT) | \ 370bf9f567SPaul Beesley (minor)) 380bf9f567SPaul Beesley #define SPM_MM_VERSION_COMPILED SPM_MM_VERSION_FORM(SPM_MM_VERSION_MAJOR, \ 390bf9f567SPaul Beesley SPM_MM_VERSION_MINOR) 400bf9f567SPaul Beesley 410bf9f567SPaul Beesley /* These macros are used to identify SPM-MM calls using the SMC function ID */ 420bf9f567SPaul Beesley #define SPM_MM_FID_MASK U(0xffff) 430bf9f567SPaul Beesley #define SPM_MM_FID_MIN_VALUE U(0x40) 440bf9f567SPaul Beesley #define SPM_MM_FID_MAX_VALUE U(0x7f) 450bf9f567SPaul Beesley #define is_spm_mm_fid(_fid) \ 460bf9f567SPaul Beesley ((((_fid) & SPM_MM_FID_MASK) >= SPM_MM_FID_MIN_VALUE) && \ 470bf9f567SPaul Beesley (((_fid) & SPM_MM_FID_MASK) <= SPM_MM_FID_MAX_VALUE)) 480bf9f567SPaul Beesley 490bf9f567SPaul Beesley /* 50*962c44e7SPaul Beesley * SMC IDs defined in [1] for accessing MM services from the Non-secure world. 51*962c44e7SPaul Beesley * These FIDs occupy the range 0x40 - 0x5f. 52*962c44e7SPaul Beesley * [1] DEN0060A_ARM_MM_Interface_Specification.pdf 53*962c44e7SPaul Beesley */ 54*962c44e7SPaul Beesley #define MM_VERSION_AARCH32 U(0x84000040) 55*962c44e7SPaul Beesley #define MM_COMMUNICATE_AARCH64 U(0xC4000041) 56*962c44e7SPaul Beesley #define MM_COMMUNICATE_AARCH32 U(0x84000041) 57*962c44e7SPaul Beesley 58*962c44e7SPaul Beesley /* 590bf9f567SPaul Beesley * SMC IDs defined for accessing services implemented by the Secure Partition 600bf9f567SPaul Beesley * Manager from the Secure Partition(s). These services enable a partition to 610bf9f567SPaul Beesley * handle delegated events and request privileged operations from the manager. 620bf9f567SPaul Beesley * They occupy the range 0x60-0x7f. 630bf9f567SPaul Beesley */ 640bf9f567SPaul Beesley #define SPM_MM_VERSION_AARCH32 U(0x84000060) 650bf9f567SPaul Beesley #define MM_SP_EVENT_COMPLETE_AARCH64 U(0xC4000061) 660bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_GET_AARCH64 U(0xC4000064) 670bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_SET_AARCH64 U(0xC4000065) 680bf9f567SPaul Beesley 690bf9f567SPaul Beesley /* 700bf9f567SPaul Beesley * Macros used by MM_SP_MEMORY_ATTRIBUTES_SET_AARCH64. 710bf9f567SPaul Beesley */ 720bf9f567SPaul Beesley 730bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_NOACCESS U(0) 740bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_RW U(1) 750bf9f567SPaul Beesley /* Value U(2) is reserved. */ 760bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_RO U(3) 770bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_MASK U(3) 780bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_SHIFT 0 790bf9f567SPaul Beesley 800bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_EXEC (U(0) << 2) 810bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_NON_EXEC (U(1) << 2) 820bf9f567SPaul Beesley 830bf9f567SPaul Beesley 840bf9f567SPaul Beesley /* SPM error codes. */ 850bf9f567SPaul Beesley #define SPM_MM_SUCCESS 0 860bf9f567SPaul Beesley #define SPM_MM_NOT_SUPPORTED -1 870bf9f567SPaul Beesley #define SPM_MM_INVALID_PARAMETER -2 880bf9f567SPaul Beesley #define SPM_MM_DENIED -3 890bf9f567SPaul Beesley #define SPM_MM_NO_MEMORY -5 900bf9f567SPaul Beesley 910bf9f567SPaul Beesley #ifndef __ASSEMBLER__ 920bf9f567SPaul Beesley 930bf9f567SPaul Beesley #include <stdint.h> 940bf9f567SPaul Beesley 950bf9f567SPaul Beesley int32_t spm_mm_setup(void); 960bf9f567SPaul Beesley 970bf9f567SPaul Beesley uint64_t spm_mm_smc_handler(uint32_t smc_fid, 980bf9f567SPaul Beesley uint64_t x1, 990bf9f567SPaul Beesley uint64_t x2, 1000bf9f567SPaul Beesley uint64_t x3, 1010bf9f567SPaul Beesley uint64_t x4, 1020bf9f567SPaul Beesley void *cookie, 1030bf9f567SPaul Beesley void *handle, 1040bf9f567SPaul Beesley uint64_t flags); 1050bf9f567SPaul Beesley 1060bf9f567SPaul Beesley /* Helper to enter a secure partition */ 1070bf9f567SPaul Beesley uint64_t spm_mm_sp_call(uint32_t smc_fid, 1080bf9f567SPaul Beesley uint64_t x1, 1090bf9f567SPaul Beesley uint64_t x2, 1100bf9f567SPaul Beesley uint64_t x3); 1110bf9f567SPaul Beesley 1120bf9f567SPaul Beesley #endif /* __ASSEMBLER__ */ 1130bf9f567SPaul Beesley 1140bf9f567SPaul Beesley #endif /* SPM_MM_SVC_H */ 115