1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause 2*a6dbe372Spaul luse * Copyright (C) 2021 Intel Corporation. All rights reserved. 3af935f76SBen Walker */ 4af935f76SBen Walker 5dc9374ddSBen Walker #ifndef SPDK_INIT_INTERNAL_H 6dc9374ddSBen Walker #define SPDK_INIT_INTERNAL_H 7af935f76SBen Walker 8af935f76SBen Walker #include "spdk/stdinc.h" 9af935f76SBen Walker #include "spdk/queue.h" 10af935f76SBen Walker 11af935f76SBen Walker struct spdk_json_write_ctx; 12af935f76SBen Walker 13af935f76SBen Walker struct spdk_subsystem { 14af935f76SBen Walker const char *name; 15af935f76SBen Walker /* User must call spdk_subsystem_init_next() when they are done with their initialization. */ 16af935f76SBen Walker void (*init)(void); 17af935f76SBen Walker void (*fini)(void); 18af935f76SBen Walker 19af935f76SBen Walker /** 20af935f76SBen Walker * Write JSON configuration handler. 21af935f76SBen Walker * 22af935f76SBen Walker * \param w JSON write context 23af935f76SBen Walker */ 24af935f76SBen Walker void (*write_config_json)(struct spdk_json_write_ctx *w); 25af935f76SBen Walker TAILQ_ENTRY(spdk_subsystem) tailq; 26af935f76SBen Walker }; 27af935f76SBen Walker 28af935f76SBen Walker struct spdk_subsystem_depend { 29af935f76SBen Walker const char *name; 30af935f76SBen Walker const char *depends_on; 31af935f76SBen Walker TAILQ_ENTRY(spdk_subsystem_depend) tailq; 32af935f76SBen Walker }; 33af935f76SBen Walker 34af935f76SBen Walker void spdk_add_subsystem(struct spdk_subsystem *subsystem); 35af935f76SBen Walker void spdk_add_subsystem_depend(struct spdk_subsystem_depend *depend); 36af935f76SBen Walker 37af935f76SBen Walker void spdk_subsystem_init_next(int rc); 38af935f76SBen Walker void spdk_subsystem_fini_next(void); 39af935f76SBen Walker 40af935f76SBen Walker /** 41af935f76SBen Walker * \brief Register a new subsystem 42af935f76SBen Walker */ 43af935f76SBen Walker #define SPDK_SUBSYSTEM_REGISTER(_name) \ 44af935f76SBen Walker __attribute__((constructor)) static void _name ## _register(void) \ 45af935f76SBen Walker { \ 46af935f76SBen Walker spdk_add_subsystem(&_name); \ 47af935f76SBen Walker } 48af935f76SBen Walker 49af935f76SBen Walker /** 50af935f76SBen Walker * \brief Declare that a subsystem depends on another subsystem. 51af935f76SBen Walker */ 52af935f76SBen Walker #define SPDK_SUBSYSTEM_DEPEND(_name, _depends_on) \ 53af935f76SBen Walker static struct spdk_subsystem_depend __subsystem_ ## _name ## _depend_on ## _depends_on = { \ 54af935f76SBen Walker .name = #_name, \ 55af935f76SBen Walker .depends_on = #_depends_on, \ 56af935f76SBen Walker }; \ 57af935f76SBen Walker __attribute__((constructor)) static void _name ## _depend_on ## _depends_on(void) \ 58af935f76SBen Walker { \ 59af935f76SBen Walker spdk_add_subsystem_depend(&__subsystem_ ## _name ## _depend_on ## _depends_on); \ 60af935f76SBen Walker } 61af935f76SBen Walker 62af935f76SBen Walker #endif 63