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