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 /* 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> 94*b51436c2SLevi Yun #include <tools_share/uuid.h> 95*b51436c2SLevi Yun 96*b51436c2SLevi Yun /* 97*b51436c2SLevi Yun * MM Communicate information structure. Required to generate MM Communicate 98*b51436c2SLevi Yun * payload to be shared with Standalone MM. 99*b51436c2SLevi Yun */ 100*b51436c2SLevi Yun typedef struct mm_communicate_header { 101*b51436c2SLevi Yun struct efi_guid header_guid; 102*b51436c2SLevi Yun size_t message_len; 103*b51436c2SLevi Yun uint8_t data[1]; 104*b51436c2SLevi Yun } mm_communicate_header_t; 1050bf9f567SPaul Beesley 1060bf9f567SPaul Beesley int32_t spm_mm_setup(void); 1070bf9f567SPaul Beesley 1080bf9f567SPaul Beesley uint64_t spm_mm_smc_handler(uint32_t smc_fid, 1090bf9f567SPaul Beesley uint64_t x1, 1100bf9f567SPaul Beesley uint64_t x2, 1110bf9f567SPaul Beesley uint64_t x3, 1120bf9f567SPaul Beesley uint64_t x4, 1130bf9f567SPaul Beesley void *cookie, 1140bf9f567SPaul Beesley void *handle, 1150bf9f567SPaul Beesley uint64_t flags); 1160bf9f567SPaul Beesley 1170bf9f567SPaul Beesley /* Helper to enter a secure partition */ 1180bf9f567SPaul Beesley uint64_t spm_mm_sp_call(uint32_t smc_fid, 1190bf9f567SPaul Beesley uint64_t x1, 1200bf9f567SPaul Beesley uint64_t x2, 1210bf9f567SPaul Beesley uint64_t x3); 1220bf9f567SPaul Beesley 1230bf9f567SPaul Beesley #endif /* __ASSEMBLER__ */ 1240bf9f567SPaul Beesley 1250bf9f567SPaul Beesley #endif /* SPM_MM_SVC_H */ 126