Move debug and logging support to a separate header
[oweals/u-boot.git] / include / log.h
1 /*
2  * Logging support
3  *
4  * Copyright (c) 2017 Google, Inc
5  * Written by Simon Glass <sjg@chromium.org>
6  *
7  * SPDX-License-Identifier:     GPL-2.0+
8  */
9
10 #ifndef __LOG_H
11 #define __LOG_H
12
13 #ifdef DEBUG
14 #define _DEBUG  1
15 #else
16 #define _DEBUG  0
17 #endif
18
19 #ifdef CONFIG_SPL_BUILD
20 #define _SPL_BUILD      1
21 #else
22 #define _SPL_BUILD      0
23 #endif
24
25 /*
26  * Output a debug text when condition "cond" is met. The "cond" should be
27  * computed by a preprocessor in the best case, allowing for the best
28  * optimization.
29  */
30 #define debug_cond(cond, fmt, args...)                  \
31         do {                                            \
32                 if (cond)                               \
33                         printf(pr_fmt(fmt), ##args);    \
34         } while (0)
35
36 /* Show a message if DEBUG is defined in a file */
37 #define debug(fmt, args...)                     \
38         debug_cond(_DEBUG, fmt, ##args)
39
40 /* Show a message if not in SPL */
41 #define warn_non_spl(fmt, args...)                      \
42         debug_cond(!_SPL_BUILD, fmt, ##args)
43
44 /*
45  * An assertion is run-time check done in debug mode only. If DEBUG is not
46  * defined then it is skipped. If DEBUG is defined and the assertion fails,
47  * then it calls panic*( which may or may not reset/halt U-Boot (see
48  * CONFIG_PANIC_HANG), It is hoped that all failing assertions are found
49  * before release, and after release it is hoped that they don't matter. But
50  * in any case these failing assertions cannot be fixed with a reset (which
51  * may just do the same assertion again).
52  */
53 void __assert_fail(const char *assertion, const char *file, unsigned int line,
54                    const char *function);
55 #define assert(x) \
56         ({ if (!(x) && _DEBUG) \
57                 __assert_fail(#x, __FILE__, __LINE__, __func__); })
58
59 #endif