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
do_init_calls(const char * type __maybe_unused,const struct initcall * begin,const struct initcall * end)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 */
call_preinitcalls(void)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 */
call_early_initcalls(void)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 */
call_service_initcalls(void)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 */
call_driver_initcalls(void)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 */
call_finalcalls(void)71e3172f9dSJens Wiklander void __weak call_finalcalls(void)
72e3172f9dSJens Wiklander {
73*913d93a4SJens Wiklander DO_INIT_CALLS(finalcall);
74e3172f9dSJens Wiklander }
75