Use the efi_printk function in efi_info/efi_err, and add efi_debug. This allows formatted output at different log levels. Add the notion of a loglevel instead of just quiet/not-quiet, and parse the debug kernel parameter in addition to quiet. Signed-off-by: Arvind Sankar <nivedita@xxxxxxxxxxxx> --- .../firmware/efi/libstub/efi-stub-helper.c | 29 +++++++++++++++++-- drivers/firmware/efi/libstub/efistub.h | 14 +++++---- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/drivers/firmware/efi/libstub/efi-stub-helper.c b/drivers/firmware/efi/libstub/efi-stub-helper.c index 5ecafc57619a..c0278a8063b7 100644 --- a/drivers/firmware/efi/libstub/efi-stub-helper.c +++ b/drivers/firmware/efi/libstub/efi-stub-helper.c @@ -11,6 +11,7 @@ #include <linux/efi.h> #include <linux/kernel.h> +#include <linux/printk.h> /* For CONSOLE_LOGLEVEL_* */ #include <asm/efi.h> #include "efistub.h" @@ -18,7 +19,7 @@ bool efi_nochunk; bool efi_nokaslr; bool efi_noinitrd; -bool efi_quiet; +int efi_loglevel = CONSOLE_LOGLEVEL_DEFAULT; bool efi_novamap; static bool efi_nosoftreserve; @@ -58,6 +59,28 @@ int efi_printk(const char *fmt, ...) char printf_buf[256]; va_list args; int printed; + int loglevel = printk_get_level(fmt); + + switch (loglevel) { + case '0' ... '9': + loglevel -= '0'; + break; + default: + /* + * Use loglevel -1 for cases where we just want to print to + * the screen. + */ + loglevel = -1; + break; + } + + if (loglevel >= efi_loglevel) + return 0; + + if (loglevel >= 0) + efi_puts("EFI stub: "); + + fmt = printk_skip_level(fmt); va_start(args, fmt); printed = vsnprintf(printf_buf, sizeof(printf_buf), fmt, args); @@ -100,7 +123,9 @@ efi_status_t efi_parse_options(char const *cmdline) if (!strcmp(param, "nokaslr")) { efi_nokaslr = true; } else if (!strcmp(param, "quiet")) { - efi_quiet = true; + efi_loglevel = CONSOLE_LOGLEVEL_QUIET; + } else if (!strcmp(param, "debug")) { + efi_loglevel = CONSOLE_LOGLEVEL_DEBUG; } else if (!strcmp(param, "noinitrd")) { efi_noinitrd = true; } else if (!strcmp(param, "efi") && val) { diff --git a/drivers/firmware/efi/libstub/efistub.h b/drivers/firmware/efi/libstub/efistub.h index caa7dcc71c69..3a323a009836 100644 --- a/drivers/firmware/efi/libstub/efistub.h +++ b/drivers/firmware/efi/libstub/efistub.h @@ -6,6 +6,7 @@ #include <linux/compiler.h> #include <linux/efi.h> #include <linux/kernel.h> +#include <linux/kern_levels.h> #include <linux/types.h> #include <asm/efi.h> @@ -34,7 +35,7 @@ extern bool efi_nochunk; extern bool efi_nokaslr; extern bool efi_noinitrd; -extern bool efi_quiet; +extern int efi_loglevel; extern bool efi_novamap; extern const efi_system_table_t *efi_system_table; @@ -49,11 +50,12 @@ extern const efi_system_table_t *efi_system_table; #endif -#define efi_info(msg) do { \ - if (!efi_quiet) efi_puts("EFI stub: "msg); \ -} while (0) - -#define efi_err(msg) efi_puts("EFI stub: ERROR: "msg) +#define efi_info(fmt, ...) \ + efi_printk(KERN_INFO fmt, ##__VA_ARGS__) +#define efi_err(fmt, ...) \ + efi_printk(KERN_ERR "ERROR: " fmt, ##__VA_ARGS__) +#define efi_debug(fmt, ...) \ + efi_printk(KERN_DEBUG "DEBUG: " fmt, ##__VA_ARGS__) /* Helper macros for the usual case of using simple C variables: */ #ifndef fdt_setprop_inplace_var -- 2.26.2