/* * Copyright (c) 2022, MediaTek Inc. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #ifndef MTK_INIT_H #define MTK_INIT_H #include #include #define INIT_CALL_EXPAND_AS_ENUMERATION(_section_enum, _section_name, _level) \ _section_enum = _level, #define EXPAND_AS_LINK_SECTION(_section_enum, _section_name, _level) \ __##_section_enum##_START__ = .; \ KEEP(*(_section_name##_level)); #define EXPAND_AS_EXTERN(_section_enum, _section_name, _level) \ extern struct initcall __##_section_enum##_START__[]; #define EXPAND_AS_SYMBOL_ARR(_section_enum, _section_name, _level) \ __##_section_enum##_START__, #define DECLARE_MTK_INITCALL(_fn, _level) \ const struct initcall _mtk_initcall_##_fn \ __used \ __aligned(sizeof(void *)) \ __section(".mtk_plat_initcall_"#_level) \ = { \ .name = #_fn, \ .fn = _fn \ } /* initcall helpers */ #define MTK_EARLY_PLAT_INIT(_fn) DECLARE_MTK_INITCALL(_fn, 0) #define MTK_ARCH_INIT(_fn) DECLARE_MTK_INITCALL(_fn, 1) #define MTK_PLAT_SETUP_0_INIT(_fn) DECLARE_MTK_INITCALL(_fn, 2) #define MTK_PLAT_SETUP_1_INIT(_fn) DECLARE_MTK_INITCALL(_fn, 3) #define MTK_PLAT_RUNTIME_INIT(_fn) DECLARE_MTK_INITCALL(_fn, 4) #define MTK_PLAT_BL33_DEFER_INIT(_fn) DECLARE_MTK_INITCALL(_fn, 5) #ifndef __ASSEMBLER__ struct initcall { const char *name; int (*fn)(void); }; enum { INIT_CALL_TABLE(INIT_CALL_EXPAND_AS_ENUMERATION) MTK_INIT_LVL_MAX }; void mtk_init_one_level(unsigned int level); #endif #endif /* MTK_INIT_H */