hardwaremain: explicitly call cbmem_initialize() early

Over the course of time there have been some implicit assumptions
about cbmem being available for find() or add() operations. However,
the cbmem area was never fully recovered until entering the state
machine: BS_ON_ENTRY into BS_PRE_DEVICE. Correct this assumption
by explicitly calling cbmem_initialize() in the EARLY_CBMEM_INIT
case.

This, however, doesn't fix timestamp_init() showing an error about
not being able to allocate the timestamp table.

Change-Id: Ib93fcc932e202ebd37822f07a278ea9694fe965c
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/9327
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
Aaron Durbin 2015-04-06 16:12:58 -05:00 committed by Aaron Durbin
parent 8c5e4d93db
commit b0d8f5e9cd
2 changed files with 10 additions and 12 deletions

View File

@ -426,18 +426,7 @@ void *cbmem_entry_start(const struct cbmem_entry *entry)
#if !defined(__PRE_RAM__) #if !defined(__PRE_RAM__)
#if IS_ENABLED(CONFIG_EARLY_CBMEM_INIT) #if !IS_ENABLED(CONFIG_EARLY_CBMEM_INIT)
/* selected cbmem can be initialized early in ramstage. Additionally, that
* means cbmem console can be reinitialized early as well. The post_device
* function is empty since cbmem was initialized early in ramstage. */
static void init_cbmem_pre_device(void *unused)
{
cbmem_initialize();
}
BOOT_STATE_INIT_ENTRY(BS_PRE_DEVICE, BS_ON_ENTRY, init_cbmem_pre_device, NULL);
#else
static void init_cbmem_post_device(void *unused) static void init_cbmem_post_device(void *unused)
{ {
if (acpi_is_wakeup()) if (acpi_is_wakeup())

View File

@ -26,6 +26,7 @@
#include <bootstate.h> #include <bootstate.h>
#include <console/console.h> #include <console/console.h>
#include <console/post_codes.h> #include <console/post_codes.h>
#include <cbmem.h>
#include <version.h> #include <version.h>
#include <device/device.h> #include <device/device.h>
#include <device/pci.h> #include <device/pci.h>
@ -433,6 +434,14 @@ static void boot_state_schedule_static_entries(void)
void main(void) void main(void)
{ {
/*
* CBMEM needs to be recovered in the EARLY_CBMEM_INIT case because
* timestamps, APCI, etc rely on the cbmem infrastructure being
* around. Explicitly recover it.
*/
if (IS_ENABLED(CONFIG_EARLY_CBMEM_INIT))
cbmem_initialize();
/* Record current time, try to locate timestamps in CBMEM. */ /* Record current time, try to locate timestamps in CBMEM. */
timestamp_init(timestamp_get()); timestamp_init(timestamp_get());