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