1// SPDX-License-Identifier: GPL-3.0-or-later
2
3#pragma once
4
5#include <mos/string_view.hpp>
6#include <mos/types.hpp>
7
8typedef enum
9{
10 INIT_TARGET_POWER, // Power management subsystem
11 INIT_TARGET_PRE_VFS, // Pre-virtual file system
12 INIT_TARGET_VFS, // Virtual file system
13 INIT_TARGET_SYSFS, // sysfs filesystem
14 INIT_TARGET_KTHREAD, // Kernel threads
15} init_target_t;
16
17typedef struct
18{
19 const char *param;
20 bool (*hook)(mos::string_view arg);
21} mos_cmdline_hook_t;
22
23typedef struct
24{
25 init_target_t target;
26 void (*init_fn)(void);
27} mos_init_t;
28
29#define MOS_EARLY_SETUP(_param, _fn) \
30 static bool _fn(mos::string_view arg); \
31 MOS_PUT_IN_SECTION(".mos.early_setup", mos_cmdline_hook_t, __setup_##_fn, { .param = _param, .hook = _fn }); \
32 static bool _fn(mos::string_view arg)
33
34#define MOS_SETUP(_param, _fn) \
35 static bool _fn(mos::string_view arg); \
36 MOS_PUT_IN_SECTION(".mos.setup", mos_cmdline_hook_t, __setup_##_fn, { .param = _param, .hook = _fn }); \
37 static bool _fn(mos::string_view arg)
38
39#define MOS_INIT(_comp, _fn) \
40 static void _fn(void); \
41 MOS_PUT_IN_SECTION(".mos.init", mos_init_t, __init_##_fn, { .target = INIT_TARGET_##_comp, .init_fn = _fn }); \
42 static void _fn(void)
43
44void startup_invoke_cmdline_hooks(void);
45void startup_invoke_early_cmdline_hooks(void);
46void startup_invoke_autoinit(init_target_t target);
47