1c5c56024SJens Wiklander // SPDX-License-Identifier: BSD-2-Clause 2c5c56024SJens Wiklander /* 3c5c56024SJens Wiklander * Copyright (c) 2020, Linaro Limited 4c5c56024SJens Wiklander * Copyright (c) 2014, STMicroelectronics International N.V. 5c5c56024SJens Wiklander */ 6c5c56024SJens Wiklander 7c5c56024SJens Wiklander #include <initcall.h> 8c5c56024SJens Wiklander #include <trace.h> 9c5c56024SJens Wiklander #include <kernel/linker.h> 10c5c56024SJens Wiklander 11*913d93a4SJens Wiklander static void do_init_calls(const char *type __maybe_unused, 12*913d93a4SJens Wiklander const struct initcall *begin, 13*913d93a4SJens Wiklander const struct initcall *end) 14*913d93a4SJens Wiklander { 15*913d93a4SJens Wiklander const struct initcall *call = NULL; 16*913d93a4SJens Wiklander TEE_Result ret = TEE_SUCCESS; 17*913d93a4SJens Wiklander 18*913d93a4SJens Wiklander for (call = begin; call < end; call++) { 19*913d93a4SJens Wiklander DMSG("%s level %d %s()", type, call->level, call->func_name); 20*913d93a4SJens Wiklander ret = call->func(); 21*913d93a4SJens Wiklander if (ret) { 22*913d93a4SJens Wiklander EMSG("%s __text_start + 0x%08"PRIxVA" failed", 23*913d93a4SJens Wiklander type, (vaddr_t)call - VCORE_START_VA); 24*913d93a4SJens Wiklander } 25*913d93a4SJens Wiklander } 26*913d93a4SJens Wiklander } 27*913d93a4SJens Wiklander 28*913d93a4SJens Wiklander #define DO_INIT_CALLS(name) \ 29*913d93a4SJens Wiklander do_init_calls(#name, name##_begin, name##_end) 30*913d93a4SJens Wiklander 31c5c56024SJens Wiklander /* 32c5c56024SJens Wiklander * Note: this function is weak just to make it possible to exclude it from 33c5c56024SJens Wiklander * the unpaged area. 34c5c56024SJens Wiklander */ 35bd59a6adSJens Wiklander void __weak call_preinitcalls(void) 36bd59a6adSJens Wiklander { 37*913d93a4SJens Wiklander DO_INIT_CALLS(preinitcall); 38*913d93a4SJens Wiklander } 39bd59a6adSJens Wiklander 40*913d93a4SJens Wiklander /* 41*913d93a4SJens Wiklander * Note: this function is weak just to make it possible to exclude it from 42*913d93a4SJens Wiklander * the unpaged area. 43*913d93a4SJens Wiklander */ 44*913d93a4SJens Wiklander void __weak call_early_initcalls(void) 45*913d93a4SJens Wiklander { 46*913d93a4SJens Wiklander DO_INIT_CALLS(early_initcall); 47bd59a6adSJens Wiklander } 48*913d93a4SJens Wiklander 49*913d93a4SJens Wiklander /* 50*913d93a4SJens Wiklander * Note: this function is weak just to make it possible to exclude it from 51*913d93a4SJens Wiklander * the unpaged area. 52*913d93a4SJens Wiklander */ 53*913d93a4SJens Wiklander void __weak call_service_initcalls(void) 54*913d93a4SJens Wiklander { 55*913d93a4SJens Wiklander DO_INIT_CALLS(service_initcall); 56bd59a6adSJens Wiklander } 57*913d93a4SJens Wiklander 58*913d93a4SJens Wiklander /* 59*913d93a4SJens Wiklander * Note: this function is weak just to make it possible to exclude it from 60*913d93a4SJens Wiklander * the unpaged area. 61*913d93a4SJens Wiklander */ 62*913d93a4SJens Wiklander void __weak call_driver_initcalls(void) 63*913d93a4SJens Wiklander { 64*913d93a4SJens Wiklander DO_INIT_CALLS(driver_initcall); 65bd59a6adSJens Wiklander } 66bd59a6adSJens Wiklander 67bd59a6adSJens Wiklander /* 68bd59a6adSJens Wiklander * Note: this function is weak just to make it possible to exclude it from 69bd59a6adSJens Wiklander * the unpaged area. 70bd59a6adSJens Wiklander */ 71c5c56024SJens Wiklander void __weak call_initcalls(void) 72c5c56024SJens Wiklander { 73*913d93a4SJens Wiklander call_early_initcalls(); 74*913d93a4SJens Wiklander call_service_initcalls(); 75*913d93a4SJens Wiklander call_driver_initcalls(); 76c5c56024SJens Wiklander } 77e3172f9dSJens Wiklander 78e3172f9dSJens Wiklander /* 79e3172f9dSJens Wiklander * Note: this function is weak just to make it possible to exclude it from 80e3172f9dSJens Wiklander * the unpaged area. 81e3172f9dSJens Wiklander */ 82e3172f9dSJens Wiklander void __weak call_finalcalls(void) 83e3172f9dSJens Wiklander { 84*913d93a4SJens Wiklander DO_INIT_CALLS(finalcall); 85e3172f9dSJens Wiklander } 86