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