1 /* 2 * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 /* 8 * @file sys.h 9 * @brief System primitives for libmetal. 10 * @brief Top level include internal to libmetal library code. 11 */ 12 13 #ifndef __METAL_SYS__H__ 14 #define __METAL_SYS__H__ 15 16 #include <stdlib.h> 17 18 #include <metal/log.h> 19 #include <metal/list.h> 20 21 #ifdef __cplusplus 22 extern "C" { 23 #endif 24 25 /** \defgroup system Top Level Interfaces 26 * @{ 27 */ 28 29 /** Physical address type. */ 30 typedef unsigned long metal_phys_addr_t; 31 32 /** Interrupt request number. */ 33 typedef int metal_irq_t; 34 35 /** Bad offset into shared memory or I/O region. */ 36 #define METAL_BAD_OFFSET ((unsigned long)-1) 37 38 /** Bad physical address value. */ 39 #define METAL_BAD_PHYS ((metal_phys_addr_t)-1) 40 41 /** Bad virtual address value. */ 42 #define METAL_BAD_VA ((void *)-1) 43 44 /** Bad IRQ. */ 45 #define METAL_BAD_IRQ ((metal_irq_t)-1) 46 47 /** 48 * Initialization configuration for libmetal. 49 */ 50 struct metal_init_params { 51 52 /** log message handler (defaults to stderr). */ 53 metal_log_handler log_handler; 54 55 /** default log message level (defaults to emergency). */ 56 enum metal_log_level log_level; 57 }; 58 59 /** 60 * System independent runtime state for libmetal. This is part of a system 61 * specific singleton data structure (@see _metal). 62 */ 63 struct metal_common_state { 64 /** reference count to track metal_init/metal_finish. */ 65 int ref_count; 66 67 /** Current log level. */ 68 enum metal_log_level log_level; 69 70 /** Current log handler (null for none). */ 71 metal_log_handler log_handler; 72 73 /** List of registered buses. */ 74 struct metal_list bus_list; 75 76 /** Generic statically defined shared memory segments. */ 77 struct metal_list generic_shmem_list; 78 79 /** Generic statically defined devices. */ 80 struct metal_list generic_device_list; 81 }; 82 83 struct metal_state; 84 85 #include <metal/system/@PROJECT_SYSTEM@/sys.h> 86 87 #ifndef METAL_INIT_DEFAULTS 88 #define METAL_INIT_DEFAULTS \ 89 { \ 90 .log_handler = metal_default_log_handler, \ 91 .log_level = METAL_LOG_INFO, \ 92 } 93 #endif 94 95 /** System specific runtime data. */ 96 extern struct metal_state _metal; 97 98 /** 99 * @brief Initialize libmetal. 100 * 101 * Initialize the libmetal library. 102 * 103 * @param[in] params Initialization params (@see metal_init_params). 104 * 105 * @return 0 on success, or -errno on failure. 106 * 107 * @see metal_finish 108 */ 109 int metal_init(const struct metal_init_params *params); 110 111 /** 112 * @brief Shutdown libmetal. 113 * 114 * Shutdown the libmetal library, and release all reserved resources. 115 * 116 * @see metal_init 117 */ 118 void metal_finish(void); 119 120 #ifdef METAL_INTERNAL 121 122 /** 123 * @brief libmetal system initialization. 124 * 125 * This function initializes libmetal on Linux or Generic platforms. This 126 * involves obtaining necessary pieces of system information (sysfs mount path, 127 * page size, etc.). 128 * 129 * @param[in] params Initialization parameters (@see metal_init_params). 130 * @return 0 on success, or -errno on failure. 131 */ 132 int metal_sys_init(const struct metal_init_params *params); 133 134 /** 135 * @brief libmetal system shutdown. 136 * 137 * This function shuts down and releases resources held by libmetal Linux or 138 * Generic platform layers. 139 * 140 * @see metal_sys_init 141 */ 142 void metal_sys_finish(void); 143 144 #endif 145 146 /** @} */ 147 148 #ifdef __cplusplus 149 } 150 #endif 151 152 #endif /* __METAL_SYS__H__ */ 153