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