Julius Werner (jwerner@chromium.org) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/16273
-gerrit
commit ad3eadf18968d409c87717c9aab54f9c12650168 Author: Julius Werner jwerner@chromium.org Date: Fri Aug 19 16:20:40 2016 -0700
HACK/RFC: Make cbmem_find() fail cleanly before cbmem_initialize()
Right now, calling cbmem_find() on my ARM64 system in romstage before DRAM has been initialized will cause the IMD/CBMEM code to immediately initialize CBMEM (which hangs the system). The code from vb2_selected_region() suggests that this is not intended and it's supposed to cleanly return NULL instead.
There is probably a more appropriate way to do this than just adding a global (and it would need to be a CAR_GLOBAL, at least), but I'm not really familiar enough with this code. Can somebody point me in the right direction?
Alternatively, we can declare that cbmem_find() is not allowed before cbmem_initialize() and instead add an extra CAR_GLOBAL to the vboot code to keep track of whether the CBMEM handoff has been initialized.
Change-Id: Ia6c1db00ae01dee485d5e96e4315cb399dc63696 Signed-off-by: Julius Werner jwerner@chromium.org --- src/lib/imd_cbmem.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/src/lib/imd_cbmem.c b/src/lib/imd_cbmem.c index 3e3e2b0..538756b 100644 --- a/src/lib/imd_cbmem.c +++ b/src/lib/imd_cbmem.c @@ -26,6 +26,8 @@ #include <arch/acpi.h> #endif
+static int haxxor = 0; + static inline struct imd *cbmem_get_imd(void) { /* Only supply a backing store for imd in ramstage. */ @@ -75,6 +77,7 @@ static struct imd *imd_init_backing(struct imd *backing) static struct imd *imd_init_backing_with_recover(struct imd *backing) { struct imd *imd; + haxxor = 1;
imd = imd_init_backing(backing); if (!ENV_RAMSTAGE) { @@ -221,6 +224,9 @@ void *cbmem_find(u32 id) struct imd imd_backing; const struct imd_entry *e;
+ if (!haxxor) + return NULL; + imd = imd_init_backing_with_recover(&imd_backing);
e = imd_entry_find(imd, id);