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	log.h
9  * @brief	Logging support for libmetal.
10  */
11 
12 #ifndef __METAL_METAL_LOG__H__
13 #define __METAL_METAL_LOG__H__
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
19 /** \defgroup logging Library Logging Interfaces
20  *  @{ */
21 
22 /** Log message priority levels for libmetal. */
23 enum metal_log_level {
24 	METAL_LOG_EMERGENCY,	/**< system is unusable.               */
25 	METAL_LOG_ALERT,	/**< action must be taken immediately. */
26 	METAL_LOG_CRITICAL,	/**< critical conditions.              */
27 	METAL_LOG_ERROR,	/**< error conditions.                 */
28 	METAL_LOG_WARNING,	/**< warning conditions.               */
29 	METAL_LOG_NOTICE,	/**< normal but significant condition. */
30 	METAL_LOG_INFO,		/**< informational messages.           */
31 	METAL_LOG_DEBUG,	/**< debug-level messages.             */
32 };
33 
34 /** Log message handler type. */
35 typedef void (*metal_log_handler)(enum metal_log_level level,
36 				  const char *format, ...);
37 
38 /**
39  * @brief	Set libmetal log handler.
40  * @param[in]	handler	log message handler.
41  * @return	0 on success, or -errno on failure.
42  */
43 extern void metal_set_log_handler(metal_log_handler handler);
44 
45 /**
46  * @brief	Get the current libmetal log handler.
47  * @return	Current log handler.
48  */
49 extern metal_log_handler metal_get_log_handler(void);
50 
51 /**
52  * @brief	Set the level for libmetal logging.
53  * @param[in]	level	log message level.
54  */
55 extern void metal_set_log_level(enum metal_log_level level);
56 
57 /**
58  * @brief	Get the current level for libmetal logging.
59  * @return	Current log level.
60  */
61 extern enum metal_log_level metal_get_log_level(void);
62 
63 /**
64  * @brief	Default libmetal log handler.  This handler prints libmetal log
65  *		mesages to stderr.
66  * @param[in]	level	log message level.
67  * @param[in]	format	log message format string.
68  * @return	0 on success, or -errno on failure.
69  */
70 extern void metal_default_log_handler(enum metal_log_level level,
71 				      const char *format, ...);
72 
73 
74 /**
75  * Emit a log message if the log level permits.
76  *
77  * @param	level	Log level.
78  * @param	...	Format string and arguments.
79  */
80 #define metal_log(level, ...)						       \
81 	((level <= _metal.common.log_level && _metal.common.log_handler) \
82 	       ? (void)_metal.common.log_handler(level, __VA_ARGS__)	       \
83 	       : (void)0)
84 
85 /** @} */
86 
87 #ifdef __cplusplus
88 }
89 #endif
90 
91 #include <metal/system/generic/log.h>
92 
93 #endif /* __METAL_METAL_LOG__H__ */
94