summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/x86/postcar.c4
-rw-r--r--src/include/cbmem.h14
-rw-r--r--src/include/console/cbmem_console.h2
-rw-r--r--src/lib/Makefile.inc1
-rw-r--r--src/lib/cbmem_console.c3
-rw-r--r--src/lib/imd_cbmem.c3
-rw-r--r--src/lib/program.ld2
7 files changed, 25 insertions, 4 deletions
diff --git a/src/arch/x86/postcar.c b/src/arch/x86/postcar.c
index 8c3ea43f46..b6ae09a668 100644
--- a/src/arch/x86/postcar.c
+++ b/src/arch/x86/postcar.c
@@ -13,6 +13,7 @@
* GNU General Public License for more details.
*/
+#include <cbmem.h>
#include <console/console.h>
#include <main_decl.h>
#include <program_loading.h>
@@ -22,6 +23,9 @@ void main(void)
{
console_init();
+ /* Recover cbmem so infrastruture using it is functional. */
+ cbmem_initialize();
+
/* Display the MTRRs */
if (IS_ENABLED(CONFIG_DISPLAY_MTRRS))
soc_display_mtrrs();
diff --git a/src/include/cbmem.h b/src/include/cbmem.h
index 6a41ec7615..5c4b7c7189 100644
--- a/src/include/cbmem.h
+++ b/src/include/cbmem.h
@@ -117,17 +117,31 @@ void cbmem_add_records_to_cbtable(struct lb_header *header);
#define RAMSTAGE_CBMEM_INIT_HOOK(init_fn_) \
static cbmem_init_hook_t init_fn_ ## _ptr_ __attribute__((used, \
section(".rodata.cbmem_init_hooks"))) = init_fn_;
+#define POSTCAR_CBMEM_INIT_HOOK(init_fn_) static cbmem_init_hook_t \
+ init_fn_ ## _unused2_ __attribute__((unused)) = init_fn_;
#elif ENV_ROMSTAGE
#define ROMSTAGE_CBMEM_INIT_HOOK(init_fn_) \
static cbmem_init_hook_t init_fn_ ## _ptr_ __attribute__((used, \
section(".rodata.cbmem_init_hooks"))) = init_fn_;
#define RAMSTAGE_CBMEM_INIT_HOOK(init_fn_) static cbmem_init_hook_t \
init_fn_ ## _unused_ __attribute__((unused)) = init_fn_;
+#define POSTCAR_CBMEM_INIT_HOOK(init_fn_) static cbmem_init_hook_t \
+ init_fn_ ## _unused2_ __attribute__((unused)) = init_fn_;
+#elif ENV_POSTCAR
+#define ROMSTAGE_CBMEM_INIT_HOOK(init_fn_) static cbmem_init_hook_t \
+ init_fn_ ## _unused2_ __attribute__((unused)) = init_fn_;
+#define RAMSTAGE_CBMEM_INIT_HOOK(init_fn_) static cbmem_init_hook_t \
+ init_fn_ ## _unused_ __attribute__((unused)) = init_fn_;
+#define POSTCAR_CBMEM_INIT_HOOK(init_fn_) \
+ static cbmem_init_hook_t init_fn_ ## _ptr_ __attribute__((used, \
+ section(".rodata.cbmem_init_hooks"))) = init_fn_;
#else
#define ROMSTAGE_CBMEM_INIT_HOOK(init_fn_) static cbmem_init_hook_t \
init_fn_ ## _unused_ __attribute__((unused)) = init_fn_;
#define RAMSTAGE_CBMEM_INIT_HOOK(init_fn_) static cbmem_init_hook_t \
init_fn_ ## _unused2_ __attribute__((unused)) = init_fn_;
+#define POSTCAR_CBMEM_INIT_HOOK(init_fn_) static cbmem_init_hook_t \
+ init_fn_ ## _unused3_ __attribute__((unused)) = init_fn_;
#endif /* ENV_RAMSTAGE */
diff --git a/src/include/console/cbmem_console.h b/src/include/console/cbmem_console.h
index e8b4d3a23b..de1144b272 100644
--- a/src/include/console/cbmem_console.h
+++ b/src/include/console/cbmem_console.h
@@ -22,7 +22,7 @@ void cbmemc_init(void);
void cbmemc_tx_byte(unsigned char data);
#define __CBMEM_CONSOLE_ENABLE__ CONFIG_CONSOLE_CBMEM && \
- (ENV_RAMSTAGE || ENV_VERSTAGE || \
+ (ENV_RAMSTAGE || ENV_VERSTAGE || ENV_POSTCAR || \
(IS_ENABLED(CONFIG_EARLY_CBMEM_INIT) && \
(ENV_ROMSTAGE || (ENV_BOOTBLOCK && CONFIG_BOOTBLOCK_CONSOLE)))\
)
diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc
index dec608fa41..394491c769 100644
--- a/src/lib/Makefile.inc
+++ b/src/lib/Makefile.inc
@@ -142,6 +142,7 @@ ramstage-y += imd_cbmem.c
ramstage-y += imd.c
postcar-y += cbmem_common.c
+postcar-$(CONFIG_CONSOLE_CBMEM) += cbmem_console.c
postcar-y += imd_cbmem.c
postcar-y += imd.c
diff --git a/src/lib/cbmem_console.c b/src/lib/cbmem_console.c
index 49c11eb65b..06f34af990 100644
--- a/src/lib/cbmem_console.c
+++ b/src/lib/cbmem_console.c
@@ -228,7 +228,7 @@ static void cbmemc_reinit(int is_recovery)
/* No appending when no preram console available and adding for
* the first time. */
- if (!ENV_RAMSTAGE && _preram_cbmem_console_size == 0)
+ if (!ENV_RAMSTAGE && !ENV_POSTCAR && _preram_cbmem_console_size == 0)
flags = CBMEMC_RESET;
/* Need to reset the newly added cbmem console in romstage. */
@@ -247,6 +247,7 @@ static void cbmemc_reinit(int is_recovery)
}
ROMSTAGE_CBMEM_INIT_HOOK(cbmemc_reinit)
RAMSTAGE_CBMEM_INIT_HOOK(cbmemc_reinit)
+POSTCAR_CBMEM_INIT_HOOK(cbmemc_reinit)
#if IS_ENABLED(CONFIG_CONSOLE_CBMEM_DUMP_TO_UART)
void cbmem_dump_console(void)
diff --git a/src/lib/imd_cbmem.c b/src/lib/imd_cbmem.c
index d72f0b034a..b0273f4d56 100644
--- a/src/lib/imd_cbmem.c
+++ b/src/lib/imd_cbmem.c
@@ -38,7 +38,8 @@
* burden on board or chipset code to tell us by returning NULL from cbmem_top()
* before that point.
*/
-#define CAN_USE_GLOBALS (!IS_ENABLED(CONFIG_ARCH_X86) || ENV_RAMSTAGE)
+#define CAN_USE_GLOBALS \
+ (!IS_ENABLED(CONFIG_ARCH_X86) || ENV_RAMSTAGE || ENV_POSTCAR)
static inline struct imd *cbmem_get_imd(void)
{
diff --git a/src/lib/program.ld b/src/lib/program.ld
index 77adb3ced8..4668aea2c6 100644
--- a/src/lib/program.ld
+++ b/src/lib/program.ld
@@ -38,7 +38,7 @@
*(.text);
*(.text.*);
-#if ENV_RAMSTAGE || ENV_ROMSTAGE
+#if ENV_RAMSTAGE || ENV_ROMSTAGE || ENV_POSTCAR
. = ALIGN(ARCH_POINTER_ALIGN_SIZE);
_cbmem_init_hooks = .;
KEEP(*(.rodata.cbmem_init_hooks));