spl: Add support for logging in SPL and TPL

It is sometimes useful to log information in SPL and TPL. Add support for
this.

Reviewed-by: Tom Rini <trini@konsulko.com>
Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2018-11-15 18:43:49 -07:00 committed by Tom Rini
parent 734e207c5e
commit 4d8d3056f8
4 changed files with 60 additions and 6 deletions

View File

@ -299,6 +299,10 @@ config SPL_LOGLEVEL
int
default LOGLEVEL
config TPL_LOGLEVEL
int
default LOGLEVEL
config SILENT_CONSOLE
bool "Support a silent console"
help
@ -505,6 +509,24 @@ config SPL_LOG_MAX_LEVEL
6 - detail
7 - debug
config TPL_LOG_MAX_LEVEL
int "Maximum log level to record in TPL"
depends on TPL_LOG
default 3
help
This selects the maximum log level that will be recorded. Any value
higher than this will be ignored. If possible log statements below
this level will be discarded at build time. Levels:
0 - panic
1 - critical
2 - error
3 - warning
4 - note
5 - info
6 - detail
7 - debug
config LOG_CONSOLE
bool "Allow log output to the console"
depends on LOG
@ -515,9 +537,19 @@ config LOG_CONSOLE
log message is shown - other details like level, category, file and
line number are omitted.
config LOG_SPL_CONSOLE
config SPL_LOG_CONSOLE
bool "Allow log output to the console in SPL"
depends on LOG_SPL
depends on SPL_LOG
default y
help
Enables a log driver which writes log records to the console.
Generally the console is the serial port or LCD display. Only the
log message is shown - other details like level, category, file and
line number are omitted.
config TPL_LOG_CONSOLE
bool "Allow log output to the console in SPL"
depends on TPL_LOG
default y
help
Enables a log driver which writes log records to the console.

View File

@ -122,8 +122,8 @@ obj-y += cli.o
obj-$(CONFIG_FSL_DDR_INTERACTIVE) += cli_simple.o cli_readline.o
obj-$(CONFIG_DFU_OVER_USB) += dfu.o
obj-y += command.o
obj-$(CONFIG_$(SPL_)LOG) += log.o
obj-$(CONFIG_$(SPL_)LOG_CONSOLE) += log_console.o
obj-$(CONFIG_$(SPL_TPL_)LOG) += log.o
obj-$(CONFIG_$(SPL_TPL_)LOG_CONSOLE) += log_console.o
obj-y += s_record.o
obj-$(CONFIG_CMD_LOADB) += xyzModem.o
obj-$(CONFIG_$(SPL_TPL_)YMODEM_SUPPORT) += xyzModem.o

View File

@ -336,6 +336,13 @@ static int spl_common_init(bool setup_malloc)
return ret;
}
bootstage_mark_name(BOOTSTAGE_ID_START_SPL, "spl");
#if CONFIG_IS_ENABLED(LOG)
ret = log_init();
if (ret) {
debug("%s: Failed to set up logging\n", __func__);
return ret;
}
#endif
if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) {
ret = fdtdec_setup();
if (ret) {

View File

@ -108,6 +108,8 @@ int _log(enum log_category_t cat, enum log_level_t level, const char *file,
#define log_io(_fmt...)
#endif
#if CONFIG_IS_ENABLED(LOG)
/* Emit a log record if the level is less that the maximum */
#define log(_cat, _level, _fmt, _args...) ({ \
int _l = _level; \
@ -116,6 +118,9 @@ int _log(enum log_category_t cat, enum log_level_t level, const char *file,
__func__, \
pr_fmt(_fmt), ##_args); \
})
#else
#define log(_cat, _level, _fmt, _args...)
#endif
#ifdef DEBUG
#define _DEBUG 1
@ -175,7 +180,16 @@ void __assert_fail(const char *assertion, const char *file, unsigned int line,
({ if (!(x) && _DEBUG) \
__assert_fail(#x, __FILE__, __LINE__, __func__); })
#ifdef CONFIG_LOG_ERROR_RETURN
#if CONFIG_IS_ENABLED(LOG) && defined(CONFIG_LOG_ERROR_RETURN)
/*
* Log an error return value, possibly with a message. Usage:
*
* return log_ret(fred_call());
*
* or:
*
* return log_msg_ret("fred failed", fred_call());
*/
#define log_ret(_ret) ({ \
int __ret = (_ret); \
if (__ret < 0) \
@ -190,8 +204,9 @@ void __assert_fail(const char *assertion, const char *file, unsigned int line,
__ret; \
})
#else
/* Non-logging versions of the above which just return the error code */
#define log_ret(_ret) (_ret)
#define log_msg_ret(_msg, _ret) (_ret)
#define log_msg_ret(_msg, _ret) ((void)(_msg), _ret)
#endif
/**