summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaul E Rangel <rrangel@chromium.org>2022-01-13 09:46:21 -0700
committerRaul Rangel <rrangel@chromium.org>2022-01-23 16:42:38 +0000
commit1e1aa0ca4d4d5ae9d0b4917220cc72f9c441b8a2 (patch)
tree1441b7957acbd076ad938dd95bfa49d37118566c
parent5be92e6f33805949325614f3d8605e7c907d920b (diff)
lib/cbmem_console: Add cbmemc_copy_in function
When running in verstage before bootblock, the PSP (ARM co-processor) is running with limited SRAM. It needs to stash the verstage console data internally until DRAM is brought up. Once DRAM is brought up the data is stashed in a "transfer buffer" region. In the current design, we are using the same region for the transfer buffer and the preram_cbmem_console region. This has the following downsides: 1) The pre-x86 buffer needs to be large enough to hold all the verstage, bootblock and romstage console logs. 2) On AMD platforms, the PSP verstage is signed. Changing the size of preram_cbmem_console after the fact will result in a mismatch of the transfer buffer between verstage and bootblock. This CL adds a new method that allows SoC specific code to copy the CBMEM console in the transfer buffer to the active CBMEM console. BUG=b:213828947 TEST=Boot guybrush and no longer see *** Pre-CBMEM romstage console overflowed, log truncated! Signed-off-by: Raul E Rangel <rrangel@chromium.org> Change-Id: Idc0ab8090db740e0d1b3d21d8968f26471f2e930 Reviewed-on: https://review.coreboot.org/c/coreboot/+/61099 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Kangheui Won <khwon@chromium.org> Reviewed-by: Julius Werner <jwerner@chromium.org>
-rw-r--r--src/include/console/cbmem_console.h6
-rw-r--r--src/lib/cbmem_console.c10
2 files changed, 16 insertions, 0 deletions
diff --git a/src/include/console/cbmem_console.h b/src/include/console/cbmem_console.h
index 65cf59c4c5..4f03a45e74 100644
--- a/src/include/console/cbmem_console.h
+++ b/src/include/console/cbmem_console.h
@@ -3,6 +3,7 @@
#define _CONSOLE_CBMEM_CONSOLE_H_
#include <stdint.h>
+#include <stddef.h>
void cbmemc_init(void);
void cbmemc_tx_byte(unsigned char data);
@@ -19,6 +20,11 @@ static inline void __cbmemc_init(void) {}
static inline void __cbmemc_tx_byte(u8 data) {}
#endif
+/*
+ * Copy an external cbmem_console into the active cbmem_console.
+ */
+void cbmemc_copy_in(void *buffer, size_t size);
+
void cbmem_dump_console_to_uart(void);
void cbmem_dump_console(void);
#endif
diff --git a/src/lib/cbmem_console.c b/src/lib/cbmem_console.c
index 02de8045c2..8e190d7264 100644
--- a/src/lib/cbmem_console.c
+++ b/src/lib/cbmem_console.c
@@ -139,6 +139,16 @@ static void copy_console_buffer(struct cbmem_console *src_cons_p)
src_cons_p->size = 0;
}
+void cbmemc_copy_in(void *buffer, size_t size)
+{
+ struct cbmem_console *previous = (void *)buffer;
+
+ if (!buffer_valid(previous, size))
+ return;
+
+ copy_console_buffer(previous);
+}
+
static void cbmemc_reinit(int is_recovery)
{
const size_t size = CONFIG_CONSOLE_CBMEM_BUFFER_SIZE;