diff --git a/src/cpu/x86/Kconfig b/src/cpu/x86/Kconfig index 1a7d8c6dd6..edba27bd40 100644 --- a/src/cpu/x86/Kconfig +++ b/src/cpu/x86/Kconfig @@ -209,4 +209,16 @@ config AP_STACK_SIZE This is the amount of stack each AP needs. The BSP stack size can be larger and is set with STACK_SIZE. +config RUNTIME_CONFIGURABLE_SMM_LOGLEVEL + bool + default n + depends on DEBUG_SMI && CONSOLE_OVERRIDE_LOGLEVEL + help + This enables setting the SMM console log level at runtime for more + flexibility to use different log levels for each stage. Another reason + is that reading the log level from non-volatile memory such as flash + VPD or CMOS is not very ideal to be done in SMM, with this option the + value can be passed via the member variable in struct smm_runtime and + be referenced directly in SMM. + endif # ARCH_X86 diff --git a/src/cpu/x86/smm/smm_module_handler.c b/src/cpu/x86/smm/smm_module_handler.c index a976521e65..1b3c93b780 100644 --- a/src/cpu/x86/smm/smm_module_handler.c +++ b/src/cpu/x86/smm/smm_module_handler.c @@ -52,6 +52,13 @@ static void smi_release_lock(void) ); } +#if CONFIG(RUNTIME_CONFIGURABLE_SMM_LOGLEVEL) +int get_console_loglevel(void) +{ + return smm_runtime.smm_log_level; +} +#endif + void smm_get_cbmemc_buffer(void **buffer_out, size_t *size_out) { *buffer_out = smm_runtime.cbmemc; diff --git a/src/cpu/x86/smm/smm_module_loader.c b/src/cpu/x86/smm/smm_module_loader.c index 6924f08e78..1b04e8894d 100644 --- a/src/cpu/x86/smm/smm_module_loader.c +++ b/src/cpu/x86/smm/smm_module_loader.c @@ -338,6 +338,11 @@ static void setup_smihandler_params(struct smm_runtime *mod_params, for (int i = 0; i < loader_params->num_cpus; i++) mod_params->save_state_top[i] = region_end(&cpus[i].ss); + + if (CONFIG(RUNTIME_CONFIGURABLE_SMM_LOGLEVEL)) + mod_params->smm_log_level = mainboard_set_smm_log_level(); + else + mod_params->smm_log_level = 0; } static void print_region(const char *name, const struct region region) diff --git a/src/include/cpu/x86/smm.h b/src/include/cpu/x86/smm.h index 79149675cc..4ab9f213f4 100644 --- a/src/include/cpu/x86/smm.h +++ b/src/include/cpu/x86/smm.h @@ -49,6 +49,7 @@ void mainboard_smi_gpi(u32 gpi_sts); int mainboard_smi_apmc(u8 data); void mainboard_smi_sleep(u8 slp_typ); void mainboard_smi_finalize(void); +int mainboard_set_smm_log_level(void); void smm_soc_early_init(void); void smm_soc_exit(void); @@ -66,6 +67,7 @@ struct smm_runtime { u32 cbmemc_size; void *cbmemc; uintptr_t save_state_top[CONFIG_MAX_CPUS]; + int smm_log_level; } __packed; struct smm_module_params {