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 12962c44e7SPaul Beesley /* 13962c44e7SPaul Beesley * The MM_VERSION_XXX definitions are used when responding to the 14962c44e7SPaul Beesley * MM_VERSION_AARCH32 service request. The version returned is different between 15962c44e7SPaul Beesley * this request and the SPM_MM_VERSION_AARCH32 request - both have been retained 16962c44e7SPaul Beesley * for compatibility. 17962c44e7SPaul Beesley */ 18962c44e7SPaul Beesley #define MM_VERSION_MAJOR U(1) 19962c44e7SPaul Beesley #define MM_VERSION_MAJOR_SHIFT 16 20962c44e7SPaul Beesley #define MM_VERSION_MAJOR_MASK U(0x7FFF) 21962c44e7SPaul Beesley #define MM_VERSION_MINOR U(0) 22962c44e7SPaul Beesley #define MM_VERSION_MINOR_SHIFT 0 23962c44e7SPaul Beesley #define MM_VERSION_MINOR_MASK U(0xFFFF) 24962c44e7SPaul Beesley #define MM_VERSION_FORM(major, minor) ((major << MM_VERSION_MAJOR_SHIFT) | \ 25962c44e7SPaul Beesley (minor)) 26962c44e7SPaul Beesley #define MM_VERSION_COMPILED MM_VERSION_FORM(MM_VERSION_MAJOR, \ 27962c44e7SPaul Beesley MM_VERSION_MINOR) 28962c44e7SPaul 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 /* 50962c44e7SPaul Beesley * SMC IDs defined in [1] for accessing MM services from the Non-secure world. 51962c44e7SPaul Beesley * These FIDs occupy the range 0x40 - 0x5f. 52962c44e7SPaul Beesley * [1] DEN0060A_ARM_MM_Interface_Specification.pdf 53962c44e7SPaul Beesley */ 54962c44e7SPaul Beesley #define MM_VERSION_AARCH32 U(0x84000040) 55962c44e7SPaul Beesley #define MM_COMMUNICATE_AARCH64 U(0xC4000041) 56962c44e7SPaul Beesley #define MM_COMMUNICATE_AARCH32 U(0x84000041) 57962c44e7SPaul Beesley 58962c44e7SPaul 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 /* 70*96546b5cSManish Pandey * Vendor-specific EL3 range SMC IDs defined for TPM start method for pre-FFA 71*96546b5cSManish Pandey * configuration. These SMCs are converted to MM_COMMUNICATE calls. 72*96546b5cSManish Pandey */ 73*96546b5cSManish Pandey #define TPM_START_SMC_32 U(0x87000040) 74*96546b5cSManish Pandey #define TPM_START_SMC_64 U(0xC7000040) 75*96546b5cSManish Pandey 76*96546b5cSManish Pandey /* 770bf9f567SPaul Beesley * Macros used by MM_SP_MEMORY_ATTRIBUTES_SET_AARCH64. 780bf9f567SPaul Beesley */ 790bf9f567SPaul Beesley 800bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_NOACCESS U(0) 810bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_RW U(1) 820bf9f567SPaul Beesley /* Value U(2) is reserved. */ 830bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_RO U(3) 840bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_MASK U(3) 850bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_ACCESS_SHIFT 0 860bf9f567SPaul Beesley 870bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_EXEC (U(0) << 2) 880bf9f567SPaul Beesley #define MM_SP_MEMORY_ATTRIBUTES_NON_EXEC (U(1) << 2) 890bf9f567SPaul Beesley 900bf9f567SPaul Beesley 910bf9f567SPaul Beesley /* SPM error codes. */ 920bf9f567SPaul Beesley #define SPM_MM_SUCCESS 0 930bf9f567SPaul Beesley #define SPM_MM_NOT_SUPPORTED -1 940bf9f567SPaul Beesley #define SPM_MM_INVALID_PARAMETER -2 950bf9f567SPaul Beesley #define SPM_MM_DENIED -3 960bf9f567SPaul Beesley #define SPM_MM_NO_MEMORY -5 970bf9f567SPaul Beesley 980bf9f567SPaul Beesley #ifndef __ASSEMBLER__ 990bf9f567SPaul Beesley 1000bf9f567SPaul Beesley #include <stdint.h> 101b51436c2SLevi Yun #include <tools_share/uuid.h> 102b51436c2SLevi Yun 103b51436c2SLevi Yun /* 104b51436c2SLevi Yun * MM Communicate information structure. Required to generate MM Communicate 105b51436c2SLevi Yun * payload to be shared with Standalone MM. 106b51436c2SLevi Yun */ 107b51436c2SLevi Yun typedef struct mm_communicate_header { 108b51436c2SLevi Yun struct efi_guid header_guid; 109b51436c2SLevi Yun size_t message_len; 110b51436c2SLevi Yun uint8_t data[1]; 111b51436c2SLevi Yun } mm_communicate_header_t; 1120bf9f567SPaul Beesley 1130bf9f567SPaul Beesley int32_t spm_mm_setup(void); 1140bf9f567SPaul Beesley 1150bf9f567SPaul Beesley uint64_t spm_mm_smc_handler(uint32_t smc_fid, 1160bf9f567SPaul Beesley uint64_t x1, 1170bf9f567SPaul Beesley uint64_t x2, 1180bf9f567SPaul Beesley uint64_t x3, 1190bf9f567SPaul Beesley uint64_t x4, 1200bf9f567SPaul Beesley void *cookie, 1210bf9f567SPaul Beesley void *handle, 1220bf9f567SPaul Beesley uint64_t flags); 1230bf9f567SPaul Beesley 1240bf9f567SPaul Beesley /* Helper to enter a secure partition */ 1250bf9f567SPaul Beesley uint64_t spm_mm_sp_call(uint32_t smc_fid, 1260bf9f567SPaul Beesley uint64_t x1, 1270bf9f567SPaul Beesley uint64_t x2, 1280bf9f567SPaul Beesley uint64_t x3); 1290bf9f567SPaul Beesley 130*96546b5cSManish Pandey /* Helper to handle TPM Start SVC call */ 131*96546b5cSManish Pandey uint64_t spm_mm_tpm_start_handler(uint32_t smc_fid, 132*96546b5cSManish Pandey uint64_t x1, 133*96546b5cSManish Pandey uint64_t x2, 134*96546b5cSManish Pandey uint64_t x3, 135*96546b5cSManish Pandey uint64_t x4, 136*96546b5cSManish Pandey void *cookie, 137*96546b5cSManish Pandey void *handle, 138*96546b5cSManish Pandey uint64_t flags); 139*96546b5cSManish Pandey 1400bf9f567SPaul Beesley #endif /* __ASSEMBLER__ */ 1410bf9f567SPaul Beesley 1420bf9f567SPaul Beesley #endif /* SPM_MM_SVC_H */ 143