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