xref: /optee_os/core/include/initcall.h (revision 9fc2442cc66c279cb962c90c4375746fc9b28bb9)
1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*
3  * Copyright (c) 2014, Linaro Limited
4  */
5 
6 #ifndef INITCALL_H
7 #define INITCALL_H
8 
9 #include <scattered_array.h>
10 #include <tee_api_types.h>
11 #include <trace.h>
12 
13 struct initcall {
14 	TEE_Result (*func)(void);
15 #if TRACE_LEVEL >= TRACE_DEBUG
16 	int level;
17 	const char *func_name;
18 #endif
19 };
20 
21 #if TRACE_LEVEL >= TRACE_DEBUG
22 #define __define_initcall(type, lvl, fn) \
23 	SCATTERED_ARRAY_DEFINE_PG_ITEM_ORDERED(type ## call, lvl, \
24 					       struct initcall) = \
25 		{ .func = (fn), .level = (lvl), .func_name = #fn, }
26 #else
27 #define __define_initcall(type, lvl, fn) \
28 	SCATTERED_ARRAY_DEFINE_PG_ITEM_ORDERED(type ## call, lvl, \
29 					       struct initcall) = \
30 		{ .func = (fn), }
31 #endif
32 
33 #define initcall_begin	SCATTERED_ARRAY_BEGIN(initcall, struct initcall)
34 #define initcall_end	SCATTERED_ARRAY_END(initcall, struct initcall)
35 
36 #define finalcall_begin	SCATTERED_ARRAY_BEGIN(finalcall, struct initcall)
37 #define finalcall_end	SCATTERED_ARRAY_END(finalcall, struct initcall)
38 
39 #define early_init(fn)			__define_initcall(init, 1, fn)
40 #define early_init_late(fn)		__define_initcall(init, 2, fn)
41 #define service_init(fn)		__define_initcall(init, 3, fn)
42 #define service_init_late(fn)		__define_initcall(init, 4, fn)
43 #define driver_init(fn)			__define_initcall(init, 5, fn)
44 #define driver_init_late(fn)		__define_initcall(init, 6, fn)
45 
46 #define boot_final(fn)			__define_initcall(final, 1, fn)
47 
48 void call_initcalls(void);
49 void call_finalcalls(void);
50 
51 #endif
52