xref: /rk3399_ARM-atf/include/services/spm_mm_svc.h (revision 63696d003511005569a1a5ea0d0958d638c7a897)
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