summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cpu/x86/Kconfig12
-rw-r--r--src/cpu/x86/smm/smm_module_handler.c7
-rw-r--r--src/cpu/x86/smm/smm_module_loader.c5
-rw-r--r--src/include/cpu/x86/smm.h2
4 files changed, 26 insertions, 0 deletions
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 {