summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cpu/x86/smm/smm_module_handler.c7
-rw-r--r--src/cpu/x86/smm/smm_module_loader.c12
-rw-r--r--src/include/console/cbmem_console.h6
-rw-r--r--src/include/cpu/x86/smm.h2
-rw-r--r--src/lib/Makefile.inc3
-rw-r--r--src/lib/cbmem_console.c7
6 files changed, 36 insertions, 1 deletions
diff --git a/src/cpu/x86/smm/smm_module_handler.c b/src/cpu/x86/smm/smm_module_handler.c
index cab691d974..bd4149a797 100644
--- a/src/cpu/x86/smm/smm_module_handler.c
+++ b/src/cpu/x86/smm/smm_module_handler.c
@@ -1,6 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <arch/io.h>
+#include <console/cbmem_console.h>
#include <console/console.h>
#include <commonlib/region.h>
#include <cpu/x86/smm.h>
@@ -48,6 +49,12 @@ static void smi_release_lock(void)
);
}
+void smm_get_cbmemc_buffer(void **buffer_out, size_t *size_out)
+{
+ *buffer_out = smm_runtime.cbmemc;
+ *size_out = smm_runtime.cbmemc_size;
+}
+
void io_trap_handler(int smif)
{
/* If a handler function handled a given IO trap, it
diff --git a/src/cpu/x86/smm/smm_module_loader.c b/src/cpu/x86/smm/smm_module_loader.c
index 14e2aa3b74..17c6779122 100644
--- a/src/cpu/x86/smm/smm_module_loader.c
+++ b/src/cpu/x86/smm/smm_module_loader.c
@@ -5,6 +5,7 @@
#include <stdint.h>
#include <string.h>
#include <rmodule.h>
+#include <cbmem.h>
#include <cpu/x86/smm.h>
#include <commonlib/helpers.h>
#include <console/console.h>
@@ -479,6 +480,7 @@ int smm_load_module(const uintptr_t smram_base, const size_t smram_size,
void *fxsave_area;
size_t total_size = 0;
uintptr_t base; /* The base for the permanent handler */
+ const struct cbmem_entry *cbmemc;
if (CONFIG(SMM_ASEG))
return smm_load_module_aseg(smram_base, smram_size, params);
@@ -557,6 +559,14 @@ int smm_load_module(const uintptr_t smram_base, const size_t smram_size,
handler_mod_params->num_cpus = params->num_cpus;
handler_mod_params->gnvs_ptr = (uintptr_t)acpi_get_gnvs();
+ if (CONFIG(CONSOLE_CBMEM) && (cbmemc = cbmem_entry_find(CBMEM_ID_CONSOLE))) {
+ handler_mod_params->cbmemc = cbmem_entry_start(cbmemc);
+ handler_mod_params->cbmemc_size = cbmem_entry_size(cbmemc);
+ } else {
+ handler_mod_params->cbmemc = 0;
+ handler_mod_params->cbmemc_size = 0;
+ }
+
printk(BIOS_DEBUG, "%s: smram_start: 0x%lx\n", __func__, smram_base);
printk(BIOS_DEBUG, "%s: smram_end: %lx\n", __func__, smram_base + smram_size);
printk(BIOS_DEBUG, "%s: handler start %p\n",
@@ -577,6 +587,8 @@ int smm_load_module(const uintptr_t smram_base, const size_t smram_size,
printk(BIOS_DEBUG, "%s: per_cpu_save_state_size = 0x%x\n", __func__,
handler_mod_params->save_state_size);
printk(BIOS_DEBUG, "%s: num_cpus = 0x%x\n", __func__, handler_mod_params->num_cpus);
+ printk(BIOS_DEBUG, "%s: cbmemc = %p, cbmemc_size = %#x\n", __func__,
+ handler_mod_params->cbmemc, handler_mod_params->cbmemc_size);
printk(BIOS_DEBUG, "%s: total_save_state_size = 0x%x\n", __func__,
(handler_mod_params->save_state_size * handler_mod_params->num_cpus));
diff --git a/src/include/console/cbmem_console.h b/src/include/console/cbmem_console.h
index 4f03a45e74..9a814b9a54 100644
--- a/src/include/console/cbmem_console.h
+++ b/src/include/console/cbmem_console.h
@@ -10,7 +10,8 @@ void cbmemc_tx_byte(unsigned char data);
#define __CBMEM_CONSOLE_ENABLE__ (CONFIG(CONSOLE_CBMEM) && \
(ENV_RAMSTAGE || ENV_SEPARATE_VERSTAGE || ENV_POSTCAR || \
- ENV_ROMSTAGE || (ENV_BOOTBLOCK && CONFIG(BOOTBLOCK_CONSOLE))))
+ ENV_ROMSTAGE || (ENV_BOOTBLOCK && CONFIG(BOOTBLOCK_CONSOLE)) || \
+ (ENV_SMM && CONFIG(DEBUG_SMI))))
#if __CBMEM_CONSOLE_ENABLE__
static inline void __cbmemc_init(void) { cbmemc_init(); }
@@ -28,3 +29,6 @@ void cbmemc_copy_in(void *buffer, size_t size);
void cbmem_dump_console_to_uart(void);
void cbmem_dump_console(void);
#endif
+
+/* Retrieves the location of the CBMEM Console buffer in SMM mode */
+void smm_get_cbmemc_buffer(void **buffer_out, size_t *size_out);
diff --git a/src/include/cpu/x86/smm.h b/src/include/cpu/x86/smm.h
index 8ea8336a2d..28d95e11a5 100644
--- a/src/include/cpu/x86/smm.h
+++ b/src/include/cpu/x86/smm.h
@@ -61,6 +61,8 @@ struct smm_runtime {
u32 save_state_size;
u32 num_cpus;
u32 gnvs_ptr;
+ u32 cbmemc_size;
+ void *cbmemc;
uintptr_t save_state_top[CONFIG_MAX_CPUS];
} __packed;
diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc
index 5e3ce50e7f..f3da503b8b 100644
--- a/src/lib/Makefile.inc
+++ b/src/lib/Makefile.inc
@@ -220,6 +220,9 @@ smm-y += delay.c
smm-y += fmap.c
smm-y += cbfs.c memcmp.c
smm-$(CONFIG_GENERIC_UDELAY) += timer.c
+ifeq ($(CONFIG_DEBUG_SMI),y)
+smm-$(CONFIG_CONSOLE_CBMEM) += cbmem_console.c
+endif
bootblock-y += version.c
romstage-y += version.c
diff --git a/src/lib/cbmem_console.c b/src/lib/cbmem_console.c
index 0c56095732..783f336b9c 100644
--- a/src/lib/cbmem_console.c
+++ b/src/lib/cbmem_console.c
@@ -84,6 +84,13 @@ void cbmemc_init(void)
if (ENV_ROMSTAGE_OR_BEFORE) {
/* Pre-RAM environments use special buffer placed by linker script. */
init_console_ptr(_preram_cbmem_console, REGION_SIZE(preram_cbmem_console));
+ } else if (ENV_SMM) {
+ void *cbmemc = NULL;
+ size_t cbmemc_size = 0;
+
+ smm_get_cbmemc_buffer(&cbmemc, &cbmemc_size);
+
+ init_console_ptr(cbmemc, cbmemc_size);
} else {
/* Post-RAM uses static (BSS) buffer before CBMEM is reinitialized. */
init_console_ptr(static_console, sizeof(static_console));