xref: /optee_os/core/include/initcall.h (revision e3172f9db6e5cc3092cd787795e255e39c8b80d8)
11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */
203c21dc9SSY Chiu /*
303c21dc9SSY Chiu  * Copyright (c) 2014, Linaro Limited
403c21dc9SSY Chiu  */
503c21dc9SSY Chiu 
603c21dc9SSY Chiu #ifndef INITCALL_H
703c21dc9SSY Chiu #define INITCALL_H
803c21dc9SSY Chiu 
99e592338SJens Wiklander #include <scattered_array.h>
1003c21dc9SSY Chiu #include <tee_api_types.h>
119f0a24daSJens Wiklander #include <trace.h>
1203c21dc9SSY Chiu 
139f0a24daSJens Wiklander struct initcall {
149f0a24daSJens Wiklander 	TEE_Result (*func)(void);
159f0a24daSJens Wiklander #if TRACE_LEVEL >= TRACE_DEBUG
169f0a24daSJens Wiklander 	int level;
179f0a24daSJens Wiklander 	const char *func_name;
189f0a24daSJens Wiklander #endif
199f0a24daSJens Wiklander };
2003c21dc9SSY Chiu 
219f0a24daSJens Wiklander #if TRACE_LEVEL >= TRACE_DEBUG
22*e3172f9dSJens Wiklander #define __define_initcall(type, lvl, fn) \
23*e3172f9dSJens Wiklander 	SCATTERED_ARRAY_DEFINE_PG_ITEM_ORDERED(type ## call, lvl, \
249f0a24daSJens Wiklander 					       struct initcall) = \
259f0a24daSJens Wiklander 		{ .func = (fn), .level = (lvl), .func_name = #fn, }
269f0a24daSJens Wiklander #else
27*e3172f9dSJens Wiklander #define __define_initcall(type, lvl, fn) \
28*e3172f9dSJens Wiklander 	SCATTERED_ARRAY_DEFINE_PG_ITEM_ORDERED(type ## call, lvl, \
299f0a24daSJens Wiklander 					       struct initcall) = \
309f0a24daSJens Wiklander 		{ .func = (fn), }
319f0a24daSJens Wiklander #endif
3203c21dc9SSY Chiu 
339f0a24daSJens Wiklander #define initcall_begin	SCATTERED_ARRAY_BEGIN(initcall, struct initcall)
349f0a24daSJens Wiklander #define initcall_end	SCATTERED_ARRAY_END(initcall, struct initcall)
359e592338SJens Wiklander 
36*e3172f9dSJens Wiklander #define finalcall_begin	SCATTERED_ARRAY_BEGIN(finalcall, struct initcall)
37*e3172f9dSJens Wiklander #define finalcall_end	SCATTERED_ARRAY_END(finalcall, struct initcall)
38*e3172f9dSJens Wiklander 
39*e3172f9dSJens Wiklander #define early_init(fn)			__define_initcall(init, 1, fn)
40*e3172f9dSJens Wiklander #define early_init_late(fn)		__define_initcall(init, 2, fn)
41*e3172f9dSJens Wiklander #define service_init(fn)		__define_initcall(init, 3, fn)
42*e3172f9dSJens Wiklander #define service_init_late(fn)		__define_initcall(init, 4, fn)
43*e3172f9dSJens Wiklander #define driver_init(fn)			__define_initcall(init, 5, fn)
44*e3172f9dSJens Wiklander #define driver_init_late(fn)		__define_initcall(init, 6, fn)
45*e3172f9dSJens Wiklander 
46*e3172f9dSJens Wiklander #define boot_final(fn)			__define_initcall(final, 1, fn)
479e592338SJens Wiklander 
48c5c56024SJens Wiklander void call_initcalls(void);
49*e3172f9dSJens Wiklander void call_finalcalls(void);
5003c21dc9SSY Chiu 
5103c21dc9SSY Chiu #endif
52