xref: /arm-trusted-firmware/plat/mediatek/include/lib/mtk_init/mtk_init.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2022, MediaTek Inc. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef MTK_INIT_H
8*91f16700Schasinglulu #define MTK_INIT_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <cdefs.h>
11*91f16700Schasinglulu #include <lib/mtk_init/mtk_init_def.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu #define INIT_CALL_EXPAND_AS_ENUMERATION(_section_enum, _section_name, _level) \
14*91f16700Schasinglulu 	_section_enum = _level,
15*91f16700Schasinglulu 
16*91f16700Schasinglulu #define EXPAND_AS_LINK_SECTION(_section_enum, _section_name, _level) \
17*91f16700Schasinglulu 	__##_section_enum##_START__ = .; \
18*91f16700Schasinglulu 	KEEP(*(_section_name##_level));
19*91f16700Schasinglulu 
20*91f16700Schasinglulu #define EXPAND_AS_EXTERN(_section_enum, _section_name, _level) \
21*91f16700Schasinglulu 	extern struct initcall __##_section_enum##_START__[];
22*91f16700Schasinglulu 
23*91f16700Schasinglulu #define EXPAND_AS_SYMBOL_ARR(_section_enum, _section_name, _level) \
24*91f16700Schasinglulu 	__##_section_enum##_START__,
25*91f16700Schasinglulu 
26*91f16700Schasinglulu #define DECLARE_MTK_INITCALL(_fn, _level) \
27*91f16700Schasinglulu 	const struct initcall _mtk_initcall_##_fn \
28*91f16700Schasinglulu 	__used \
29*91f16700Schasinglulu 	__aligned(sizeof(void *)) \
30*91f16700Schasinglulu 	__section(".mtk_plat_initcall_"#_level) \
31*91f16700Schasinglulu 	= { \
32*91f16700Schasinglulu 		.name = #_fn, \
33*91f16700Schasinglulu 		.fn = _fn \
34*91f16700Schasinglulu 	}
35*91f16700Schasinglulu 
36*91f16700Schasinglulu /* initcall helpers  */
37*91f16700Schasinglulu #define MTK_EARLY_PLAT_INIT(_fn) DECLARE_MTK_INITCALL(_fn, 0)
38*91f16700Schasinglulu #define MTK_ARCH_INIT(_fn) DECLARE_MTK_INITCALL(_fn, 1)
39*91f16700Schasinglulu #define MTK_PLAT_SETUP_0_INIT(_fn) DECLARE_MTK_INITCALL(_fn, 2)
40*91f16700Schasinglulu #define MTK_PLAT_SETUP_1_INIT(_fn) DECLARE_MTK_INITCALL(_fn, 3)
41*91f16700Schasinglulu #define MTK_PLAT_RUNTIME_INIT(_fn) DECLARE_MTK_INITCALL(_fn, 4)
42*91f16700Schasinglulu #define MTK_PLAT_BL33_DEFER_INIT(_fn) DECLARE_MTK_INITCALL(_fn, 5)
43*91f16700Schasinglulu 
44*91f16700Schasinglulu #ifndef __ASSEMBLER__
45*91f16700Schasinglulu struct initcall {
46*91f16700Schasinglulu 	const char *name;
47*91f16700Schasinglulu 	int (*fn)(void);
48*91f16700Schasinglulu };
49*91f16700Schasinglulu 
50*91f16700Schasinglulu enum {
51*91f16700Schasinglulu 	INIT_CALL_TABLE(INIT_CALL_EXPAND_AS_ENUMERATION)
52*91f16700Schasinglulu 	MTK_INIT_LVL_MAX
53*91f16700Schasinglulu };
54*91f16700Schasinglulu 
55*91f16700Schasinglulu void mtk_init_one_level(unsigned int level);
56*91f16700Schasinglulu #endif
57*91f16700Schasinglulu 
58*91f16700Schasinglulu #endif /* MTK_INIT_H */
59