xref: /rk3399_ARM-atf/include/common/runtime_svc.h (revision 532ed6183868036e4a4f83cd7a71b93266a3bdb7)
1 /*
2  * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  * Redistributions of source code must retain the above copyright notice, this
8  * list of conditions and the following disclaimer.
9  *
10  * Redistributions in binary form must reproduce the above copyright notice,
11  * this list of conditions and the following disclaimer in the documentation
12  * and/or other materials provided with the distribution.
13  *
14  * Neither the name of ARM nor the names of its contributors may be used
15  * to endorse or promote products derived from this software without specific
16  * prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 #ifndef __RUNTIME_SVC_H__
32 #define __RUNTIME_SVC_H__
33 
34 #include <bl_common.h>		/* to include exception types */
35 #include <smcc_helpers.h>	/* to include SMCC definitions */
36 
37 
38 /*******************************************************************************
39  * Structure definition, typedefs & constants for the runtime service framework
40  ******************************************************************************/
41 
42 /*
43  * Constants to allow the assembler access a runtime service
44  * descriptor
45  */
46 #define RT_SVC_SIZE_LOG2	5
47 #define SIZEOF_RT_SVC_DESC	(1 << RT_SVC_SIZE_LOG2)
48 #define RT_SVC_DESC_INIT	16
49 #define RT_SVC_DESC_HANDLE	24
50 
51 /*
52  * The function identifier has 6 bits for the owning entity number and
53  * single bit for the type of smc call. When taken together these
54  * values limit the maximum number of runtime services to 128.
55  */
56 #define MAX_RT_SVCS		128
57 
58 #ifndef __ASSEMBLY__
59 
60 /* Prototype for runtime service initializing function */
61 typedef int32_t (*rt_svc_init_t)(void);
62 
63 /*
64  * Prototype for runtime service SMC handler function. x0 (SMC Function ID) to
65  * x4 are as passed by the caller. Rest of the arguments to SMC and the context
66  * can be accessed using the handle pointer. The cookie parameter is reserved
67  * for future use
68  */
69 typedef uintptr_t (*rt_svc_handle_t)(uint32_t smc_fid,
70 				  u_register_t x1,
71 				  u_register_t x2,
72 				  u_register_t x3,
73 				  u_register_t x4,
74 				  void *cookie,
75 				  void *handle,
76 				  u_register_t flags);
77 typedef struct rt_svc_desc {
78 	uint8_t start_oen;
79 	uint8_t end_oen;
80 	uint8_t call_type;
81 	const char *name;
82 	rt_svc_init_t init;
83 	rt_svc_handle_t handle;
84 } rt_svc_desc_t;
85 
86 /*
87  * Convenience macro to declare a service descriptor
88  */
89 #define DECLARE_RT_SVC(_name, _start, _end, _type, _setup, _smch) \
90 	static const rt_svc_desc_t __svc_desc_ ## _name \
91 		__section("rt_svc_descs") __used = { \
92 			.start_oen = _start, \
93 			.end_oen = _end, \
94 			.call_type = _type, \
95 			.name = #_name, \
96 			.init = _setup, \
97 			.handle = _smch }
98 
99 /*
100  * Compile time assertions related to the 'rt_svc_desc' structure to:
101  * 1. ensure that the assembler and the compiler view of the size
102  *    of the structure are the same.
103  * 2. ensure that the assembler and the compiler see the initialisation
104  *    routine at the same offset.
105  * 3. ensure that the assembler and the compiler see the handler
106  *    routine at the same offset.
107  */
108 CASSERT((sizeof(rt_svc_desc_t) == SIZEOF_RT_SVC_DESC), \
109 	assert_sizeof_rt_svc_desc_mismatch);
110 CASSERT(RT_SVC_DESC_INIT == __builtin_offsetof(rt_svc_desc_t, init), \
111 	assert_rt_svc_desc_init_offset_mismatch);
112 CASSERT(RT_SVC_DESC_HANDLE == __builtin_offsetof(rt_svc_desc_t, handle), \
113 	assert_rt_svc_desc_handle_offset_mismatch);
114 
115 
116 /*
117  * This macro combines the call type and the owning entity number corresponding
118  * to a runtime service to generate a unique owning entity number. This unique
119  * oen is used to access an entry in the 'rt_svc_descs_indices' array. The entry
120  * contains the index of the service descriptor in the 'rt_svc_descs' array.
121  */
122 #define get_unique_oen(oen, call_type)	((oen & FUNCID_OEN_MASK) |	\
123 					((call_type & FUNCID_TYPE_MASK) \
124 					 << FUNCID_OEN_WIDTH))
125 
126 /*******************************************************************************
127  * Function & variable prototypes
128  ******************************************************************************/
129 void runtime_svc_init(void);
130 extern uintptr_t __RT_SVC_DESCS_START__;
131 extern uintptr_t __RT_SVC_DESCS_END__;
132 void init_crash_reporting(void);
133 
134 #endif /*__ASSEMBLY__*/
135 #endif /* __RUNTIME_SVC_H__ */
136