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