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