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