blob: 04538760012c8bb87bf8c25591a830454cc1f43e [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001/* SPDX-License-Identifier: GPL-2.0+ */
Simon Glass9054a022017-12-04 13:48:20 -07002/*
3 * Logging support
4 *
5 * Copyright (c) 2017 Google, Inc
6 * Written by Simon Glass <sjg@chromium.org>
Simon Glass9054a022017-12-04 13:48:20 -07007 */
8
9#ifndef __LOG_H
10#define __LOG_H
11
Sean Anderson046e8812019-12-24 23:54:54 -050012#include <command.h>
Simon Glassd95645d2017-12-04 13:48:24 -070013#include <dm/uclass-id.h>
14#include <linux/list.h>
15
16/** Log levels supported, ranging from most to least important */
17enum log_level_t {
Simon Glass6e455c32019-02-16 20:24:34 -070018 LOGL_EMERG = 0, /* U-Boot is unstable */
Simon Glassd95645d2017-12-04 13:48:24 -070019 LOGL_ALERT, /* Action must be taken immediately */
20 LOGL_CRIT, /* Critical conditions */
21 LOGL_ERR, /* Error that prevents something from working */
22 LOGL_WARNING, /* Warning may prevent optimial operation */
23 LOGL_NOTICE, /* Normal but significant condition, printf() */
24 LOGL_INFO, /* General information message */
25 LOGL_DEBUG, /* Basic debug-level message */
26 LOGL_DEBUG_CONTENT, /* Debug message showing full message content */
27 LOGL_DEBUG_IO, /* Debug message showing hardware I/O access */
28
29 LOGL_COUNT,
Simon Glass4f0fdb72017-12-28 13:14:16 -070030 LOGL_NONE,
31
Simon Glassd95645d2017-12-04 13:48:24 -070032 LOGL_FIRST = LOGL_EMERG,
Simon Glass4f0fdb72017-12-28 13:14:16 -070033 LOGL_MAX = LOGL_DEBUG_IO,
Simon Glassd95645d2017-12-04 13:48:24 -070034};
35
36/**
37 * Log categories supported. Most of these correspond to uclasses (i.e.
38 * enum uclass_id) but there are also some more generic categories
39 */
40enum log_category_t {
41 LOGC_FIRST = 0, /* First part mirrors UCLASS_... */
42
Simon Glassd5063fd2018-10-01 12:22:32 -060043 LOGC_NONE = UCLASS_COUNT, /* First number is after all uclasses */
44 LOGC_ARCH, /* Related to arch-specific code */
45 LOGC_BOARD, /* Related to board-specific code */
46 LOGC_CORE, /* Related to core features (non-driver-model) */
Simon Glass4f0fdb72017-12-28 13:14:16 -070047 LOGC_DM, /* Core driver-model */
48 LOGC_DT, /* Device-tree */
Heinrich Schuchardt9bb2ba32018-03-23 21:12:17 +010049 LOGC_EFI, /* EFI implementation */
Simon Glass3b4b3402018-10-01 11:55:13 -060050 LOGC_ALLOC, /* Memory allocation */
Simon Glass541b2b82018-11-06 15:21:24 -070051 LOGC_SANDBOX, /* Related to the sandbox board */
Simon Glass712bd2d2018-11-15 18:43:50 -070052 LOGC_BLOBLIST, /* Bloblist */
Simon Glass8a8fe1b2019-12-29 21:19:24 -070053 LOGC_DEVRES, /* Device resources (devres_... functions) */
Simon Glassd95645d2017-12-04 13:48:24 -070054
Simon Glassd5063fd2018-10-01 12:22:32 -060055 LOGC_COUNT, /* Number of log categories */
56 LOGC_END, /* Sentinel value for a list of log categories */
Simon Glassd95645d2017-12-04 13:48:24 -070057};
58
59/* Helper to cast a uclass ID to a log category */
60static inline int log_uc_cat(enum uclass_id id)
61{
62 return (enum log_category_t)id;
63}
64
65/**
66 * _log() - Internal function to emit a new log record
67 *
68 * @cat: Category of log record (indicating which subsystem generated it)
69 * @level: Level of log record (indicating its severity)
70 * @file: File name of file where log record was generated
71 * @line: Line number in file where log record was generated
72 * @func: Function where log record was generated
73 * @fmt: printf() format string for log record
74 * @...: Optional parameters, according to the format string @fmt
75 * @return 0 if log record was emitted, -ve on error
76 */
77int _log(enum log_category_t cat, enum log_level_t level, const char *file,
Simon Glassbd923322019-01-07 16:44:19 -070078 int line, const char *func, const char *fmt, ...)
79 __attribute__ ((format (__printf__, 6, 7)));
Simon Glassd95645d2017-12-04 13:48:24 -070080
Simon Glass9ba72ef2019-09-25 08:56:23 -060081static inline int _log_nop(enum log_category_t cat, enum log_level_t level,
82 const char *file, int line, const char *func,
83 const char *fmt, ...)
84 __attribute__ ((format (__printf__, 6, 7)));
85
86static inline int _log_nop(enum log_category_t cat, enum log_level_t level,
87 const char *file, int line, const char *func,
88 const char *fmt, ...)
89{
90 return 0;
91}
92
Simon Glassd95645d2017-12-04 13:48:24 -070093/* Define this at the top of a file to add a prefix to debug messages */
94#ifndef pr_fmt
95#define pr_fmt(fmt) fmt
96#endif
97
98/* Use a default category if this file does not supply one */
99#ifndef LOG_CATEGORY
100#define LOG_CATEGORY LOGC_NONE
101#endif
102
103/*
104 * This header may be including when CONFIG_LOG is disabled, in which case
105 * CONFIG_LOG_MAX_LEVEL is not defined. Add a check for this.
106 */
107#if CONFIG_IS_ENABLED(LOG)
108#define _LOG_MAX_LEVEL CONFIG_VAL(LOG_MAX_LEVEL)
Simon Glass1b69a992018-10-01 11:55:06 -0600109#define log_err(_fmt...) log(LOG_CATEGORY, LOGL_ERR, ##_fmt)
110#define log_warning(_fmt...) log(LOG_CATEGORY, LOGL_WARNING, ##_fmt)
111#define log_notice(_fmt...) log(LOG_CATEGORY, LOGL_NOTICE, ##_fmt)
112#define log_info(_fmt...) log(LOG_CATEGORY, LOGL_INFO, ##_fmt)
113#define log_debug(_fmt...) log(LOG_CATEGORY, LOGL_DEBUG, ##_fmt)
114#define log_content(_fmt...) log(LOG_CATEGORY, LOGL_DEBUG_CONTENT, ##_fmt)
115#define log_io(_fmt...) log(LOG_CATEGORY, LOGL_DEBUG_IO, ##_fmt)
Simon Glassd95645d2017-12-04 13:48:24 -0700116#else
117#define _LOG_MAX_LEVEL LOGL_INFO
Heinrich Schuchardte393e4a2020-02-26 21:48:17 +0100118#define log_err(_fmt, ...) printf(_fmt, ##__VA_ARGS__)
119#define log_warning(_fmt, ...) printf(_fmt, ##__VA_ARGS__)
120#define log_notice(_fmt, ...) printf(_fmt, ##__VA_ARGS__)
121#define log_info(_fmt, ...) printf(_fmt, ##__VA_ARGS__)
122#define log_debug(_fmt, ...) debug(_fmt, ##__VA_ARGS__)
Simon Glass9ba72ef2019-09-25 08:56:23 -0600123#define log_content(_fmt...) log_nop(LOG_CATEGORY, \
124 LOGL_DEBUG_CONTENT, ##_fmt)
125#define log_io(_fmt...) log_nop(LOG_CATEGORY, LOGL_DEBUG_IO, ##_fmt)
Simon Glassd95645d2017-12-04 13:48:24 -0700126#endif
127
Simon Glassb56cdc02018-11-15 18:43:49 -0700128#if CONFIG_IS_ENABLED(LOG)
Simon Glasse0144f22019-02-16 20:24:37 -0700129#ifdef LOG_DEBUG
130#define _LOG_DEBUG 1
131#else
132#define _LOG_DEBUG 0
133#endif
Simon Glassb56cdc02018-11-15 18:43:49 -0700134
Simon Glassd95645d2017-12-04 13:48:24 -0700135/* Emit a log record if the level is less that the maximum */
136#define log(_cat, _level, _fmt, _args...) ({ \
137 int _l = _level; \
Simon Glasse0144f22019-02-16 20:24:37 -0700138 if (CONFIG_IS_ENABLED(LOG) && (_l <= _LOG_MAX_LEVEL || _LOG_DEBUG)) \
Simon Glassd95645d2017-12-04 13:48:24 -0700139 _log((enum log_category_t)(_cat), _l, __FILE__, __LINE__, \
140 __func__, \
141 pr_fmt(_fmt), ##_args); \
142 })
Simon Glassb56cdc02018-11-15 18:43:49 -0700143#else
144#define log(_cat, _level, _fmt, _args...)
145#endif
Simon Glassd95645d2017-12-04 13:48:24 -0700146
Simon Glass9ba72ef2019-09-25 08:56:23 -0600147#define log_nop(_cat, _level, _fmt, _args...) ({ \
148 int _l = _level; \
149 _log_nop((enum log_category_t)(_cat), _l, __FILE__, __LINE__, \
150 __func__, pr_fmt(_fmt), ##_args); \
151})
152
Simon Glass9054a022017-12-04 13:48:20 -0700153#ifdef DEBUG
154#define _DEBUG 1
155#else
156#define _DEBUG 0
157#endif
158
159#ifdef CONFIG_SPL_BUILD
160#define _SPL_BUILD 1
161#else
162#define _SPL_BUILD 0
163#endif
164
Simon Glassd95645d2017-12-04 13:48:24 -0700165#if !_DEBUG && CONFIG_IS_ENABLED(LOG)
166
167#define debug_cond(cond, fmt, args...) \
168 do { \
169 if (1) \
170 log(LOG_CATEGORY, LOGL_DEBUG, fmt, ##args); \
171 } while (0)
172
173#else /* _DEBUG */
174
Simon Glass9054a022017-12-04 13:48:20 -0700175/*
176 * Output a debug text when condition "cond" is met. The "cond" should be
177 * computed by a preprocessor in the best case, allowing for the best
178 * optimization.
179 */
180#define debug_cond(cond, fmt, args...) \
181 do { \
182 if (cond) \
183 printf(pr_fmt(fmt), ##args); \
184 } while (0)
185
Simon Glassd95645d2017-12-04 13:48:24 -0700186#endif /* _DEBUG */
187
Simon Glass9054a022017-12-04 13:48:20 -0700188/* Show a message if DEBUG is defined in a file */
189#define debug(fmt, args...) \
190 debug_cond(_DEBUG, fmt, ##args)
191
192/* Show a message if not in SPL */
193#define warn_non_spl(fmt, args...) \
194 debug_cond(!_SPL_BUILD, fmt, ##args)
195
196/*
197 * An assertion is run-time check done in debug mode only. If DEBUG is not
198 * defined then it is skipped. If DEBUG is defined and the assertion fails,
199 * then it calls panic*( which may or may not reset/halt U-Boot (see
200 * CONFIG_PANIC_HANG), It is hoped that all failing assertions are found
201 * before release, and after release it is hoped that they don't matter. But
202 * in any case these failing assertions cannot be fixed with a reset (which
203 * may just do the same assertion again).
204 */
205void __assert_fail(const char *assertion, const char *file, unsigned int line,
206 const char *function);
Heinrich Schuchardt7c395c92019-07-27 20:21:06 +0200207
208/**
209 * assert() - assert expression is true
210 *
211 * If the expression x evaluates to false and _DEBUG evaluates to true, a panic
212 * message is written and the system stalls. The value of _DEBUG is set to true
213 * if DEBUG is defined before including common.h.
214 *
215 * The expression x is always executed irrespective of the value of _DEBUG.
216 *
217 * @x: expression to test
218 */
Simon Glass9054a022017-12-04 13:48:20 -0700219#define assert(x) \
220 ({ if (!(x) && _DEBUG) \
221 __assert_fail(#x, __FILE__, __LINE__, __func__); })
222
Simon Glasse1277ff2019-12-29 21:19:10 -0700223/*
224 * This one actually gets compiled in even without DEBUG. It doesn't include the
225 * full pathname as it may be huge. Only use this when the user should be
226 * warning, similar to BUG_ON() in linux.
227 *
228 * @return true if assertion succeeded (condition is true), else false
229 */
230#define assert_noisy(x) \
231 ({ bool _val = (x); \
232 if (!_val) \
233 __assert_fail(#x, "?", __LINE__, __func__); \
234 _val; \
235 })
236
Simon Glassb56cdc02018-11-15 18:43:49 -0700237#if CONFIG_IS_ENABLED(LOG) && defined(CONFIG_LOG_ERROR_RETURN)
238/*
239 * Log an error return value, possibly with a message. Usage:
240 *
241 * return log_ret(fred_call());
242 *
243 * or:
244 *
245 * return log_msg_ret("fred failed", fred_call());
246 */
Simon Glassaa1d73b2017-12-28 13:14:23 -0700247#define log_ret(_ret) ({ \
248 int __ret = (_ret); \
249 if (__ret < 0) \
250 log(LOG_CATEGORY, LOGL_ERR, "returning err=%d\n", __ret); \
251 __ret; \
252 })
Simon Glassbfad6ed2018-06-11 13:07:14 -0600253#define log_msg_ret(_msg, _ret) ({ \
254 int __ret = (_ret); \
255 if (__ret < 0) \
256 log(LOG_CATEGORY, LOGL_ERR, "%s: returning err=%d\n", _msg, \
257 __ret); \
258 __ret; \
259 })
Simon Glassaa1d73b2017-12-28 13:14:23 -0700260#else
Simon Glassb56cdc02018-11-15 18:43:49 -0700261/* Non-logging versions of the above which just return the error code */
Simon Glassaa1d73b2017-12-28 13:14:23 -0700262#define log_ret(_ret) (_ret)
Simon Glassb56cdc02018-11-15 18:43:49 -0700263#define log_msg_ret(_msg, _ret) ((void)(_msg), _ret)
Simon Glassaa1d73b2017-12-28 13:14:23 -0700264#endif
265
Simon Glassd95645d2017-12-04 13:48:24 -0700266/**
267 * struct log_rec - a single log record
268 *
269 * Holds information about a single record in the log
270 *
271 * Members marked as 'not allocated' are stored as pointers and the caller is
272 * responsible for making sure that the data pointed to is not overwritten.
273 * Memebers marked as 'allocated' are allocated (e.g. via strdup()) by the log
274 * system.
275 *
276 * @cat: Category, representing a uclass or part of U-Boot
277 * @level: Severity level, less severe is higher
278 * @file: Name of file where the log record was generated (not allocated)
279 * @line: Line number where the log record was generated
280 * @func: Function where the log record was generated (not allocated)
281 * @msg: Log message (allocated)
282 */
283struct log_rec {
284 enum log_category_t cat;
285 enum log_level_t level;
286 const char *file;
287 int line;
288 const char *func;
289 const char *msg;
290};
291
292struct log_device;
293
294/**
295 * struct log_driver - a driver which accepts and processes log records
296 *
297 * @name: Name of driver
298 */
299struct log_driver {
300 const char *name;
301 /**
302 * emit() - emit a log record
303 *
304 * Called by the log system to pass a log record to a particular driver
305 * for processing. The filter is checked before calling this function.
306 */
307 int (*emit)(struct log_device *ldev, struct log_rec *rec);
308};
309
310/**
311 * struct log_device - an instance of a log driver
312 *
313 * Since drivers are set up at build-time we need to have a separate device for
314 * the run-time aspects of drivers (currently just a list of filters to apply
315 * to records send to this device).
316 *
317 * @next_filter_num: Seqence number of next filter filter added (0=no filters
318 * yet). This increments with each new filter on the device, but never
319 * decrements
320 * @drv: Pointer to driver for this device
321 * @filter_head: List of filters for this device
322 * @sibling_node: Next device in the list of all devices
323 */
324struct log_device {
325 int next_filter_num;
326 struct log_driver *drv;
327 struct list_head filter_head;
328 struct list_head sibling_node;
329};
330
331enum {
332 LOGF_MAX_CATEGORIES = 5, /* maximum categories per filter */
333};
334
335enum log_filter_flags {
336 LOGFF_HAS_CAT = 1 << 0, /* Filter has a category list */
337};
338
339/**
340 * struct log_filter - criterial to filter out log messages
341 *
342 * @filter_num: Sequence number of this filter. This is returned when adding a
343 * new filter, and must be provided when removing a previously added
344 * filter.
345 * @flags: Flags for this filter (LOGFF_...)
346 * @cat_list: List of categories to allow (terminated by LOGC_none). If empty
347 * then all categories are permitted. Up to LOGF_MAX_CATEGORIES entries
348 * can be provided
349 * @max_level: Maximum log level to allow
350 * @file_list: List of files to allow, separated by comma. If NULL then all
351 * files are permitted
352 * @sibling_node: Next filter in the list of filters for this log device
353 */
354struct log_filter {
355 int filter_num;
356 int flags;
357 enum log_category_t cat_list[LOGF_MAX_CATEGORIES];
358 enum log_level_t max_level;
359 const char *file_list;
360 struct list_head sibling_node;
361};
362
363#define LOG_DRIVER(_name) \
364 ll_entry_declare(struct log_driver, _name, log_driver)
365
Simon Glass4f0fdb72017-12-28 13:14:16 -0700366/**
367 * log_get_cat_name() - Get the name of a category
368 *
369 * @cat: Category to look up
Simon Glass89096562018-06-12 00:04:55 -0600370 * @return category name (which may be a uclass driver name) if found, or
371 * "<invalid>" if invalid, or "<missing>" if not found
Simon Glass4f0fdb72017-12-28 13:14:16 -0700372 */
373const char *log_get_cat_name(enum log_category_t cat);
374
375/**
376 * log_get_cat_by_name() - Look up a category by name
377 *
378 * @name: Name to look up
379 * @return category ID, or LOGC_NONE if not found
380 */
381enum log_category_t log_get_cat_by_name(const char *name);
382
383/**
384 * log_get_level_name() - Get the name of a log level
385 *
386 * @level: Log level to look up
387 * @return log level name (in ALL CAPS)
388 */
389const char *log_get_level_name(enum log_level_t level);
390
391/**
392 * log_get_level_by_name() - Look up a log level by name
393 *
394 * @name: Name to look up
395 * @return log level ID, or LOGL_NONE if not found
396 */
397enum log_level_t log_get_level_by_name(const char *name);
398
Simon Glass1fe93012017-12-28 13:14:17 -0700399/* Log format flags (bit numbers) for gd->log_fmt. See log_fmt_chars */
400enum log_fmt {
401 LOGF_CAT = 0,
402 LOGF_LEVEL,
403 LOGF_FILE,
404 LOGF_LINE,
405 LOGF_FUNC,
406 LOGF_MSG,
407
408 LOGF_COUNT,
409 LOGF_DEFAULT = (1 << LOGF_FUNC) | (1 << LOGF_MSG),
410 LOGF_ALL = 0x3f,
411};
412
Simon Glass14c8a062017-12-04 13:48:27 -0700413/* Handle the 'log test' command */
414int do_log_test(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]);
415
Simon Glassd95645d2017-12-04 13:48:24 -0700416/**
417 * log_add_filter() - Add a new filter to a log device
418 *
419 * @drv_name: Driver name to add the filter to (since each driver only has a
420 * single device)
421 * @cat_list: List of categories to allow (terminated by LOGC_none). If empty
422 * then all categories are permitted. Up to LOGF_MAX_CATEGORIES entries
423 * can be provided
424 * @max_level: Maximum log level to allow
425 * @file_list: List of files to allow, separated by comma. If NULL then all
426 * files are permitted
427 * @return the sequence number of the new filter (>=0) if the filter was added,
428 * or a -ve value on error
429 */
430int log_add_filter(const char *drv_name, enum log_category_t cat_list[],
431 enum log_level_t max_level, const char *file_list);
432
433/**
434 * log_remove_filter() - Remove a filter from a log device
435 *
436 * @drv_name: Driver name to remove the filter from (since each driver only has
437 * a single device)
438 * @filter_num: Filter number to remove (as returned by log_add_filter())
439 * @return 0 if the filter was removed, -ENOENT if either the driver or the
440 * filter number was not found
441 */
442int log_remove_filter(const char *drv_name, int filter_num);
443
444#if CONFIG_IS_ENABLED(LOG)
445/**
446 * log_init() - Set up the log system ready for use
447 *
448 * @return 0 if OK, -ENOMEM if out of memory
449 */
450int log_init(void);
451#else
452static inline int log_init(void)
453{
454 return 0;
455}
456#endif
457
Simon Glass9054a022017-12-04 13:48:20 -0700458#endif