lib/bootmem: tightly couple bootmem_init to bootmem_write_memory_table

In https://review.coreboot.org/25383 people were confused about the
ordering of bootmem calls w.r.t. when entries are exposed to the OS. To
alleviate this add a notion of bootmem being initialized. In addition to
that, only mark bootmem initialized when bootmem_write_memory_table() is
called. Any other calls to bootmem before that will report an error on
the console.

Change-Id: I5bc31f555038ccabb82d902c54f95858679b1695
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: https://review.coreboot.org/25503
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
diff --git a/src/lib/bootmem.c b/src/lib/bootmem.c
index ea02a16..07391a5 100644
--- a/src/lib/bootmem.c
+++ b/src/lib/bootmem.c
@@ -21,14 +21,22 @@
 #include <device/resource.h>
 #include <stdlib.h>
 
+static int initialized;
 static struct memranges bootmem;
 
-void bootmem_init(void)
+static int bootmem_is_initialized(void)
+{
+	return initialized;
+}
+
+static void bootmem_init(void)
 {
 	const unsigned long cacheable = IORESOURCE_CACHEABLE;
 	const unsigned long reserved = IORESOURCE_RESERVE;
 	struct memranges *bm = &bootmem;
 
+	initialized = 1;
+
 	/*
 	 * Fill the memory map out. The order of operations is important in
 	 * that each overlapping range will take over the next. Therefore,
@@ -45,6 +53,11 @@
 
 void bootmem_add_range(uint64_t start, uint64_t size, uint32_t type)
 {
+	if (!bootmem_is_initialized()) {
+		printk(BIOS_ERR, "%s: lib unitialized!\n", __func__);
+		return;
+	}
+
 	memranges_insert(&bootmem, start, size, type);
 }
 
@@ -55,6 +68,7 @@
 
 	lb_r = &mem->map[0];
 
+	bootmem_init();
 	bootmem_dump_ranges();
 
 	memranges_each_entry(r, &bootmem) {
@@ -135,6 +149,11 @@
 	resource_t begin;
 	resource_t end;
 
+	if (!bootmem_is_initialized()) {
+		printk(BIOS_ERR, "%s: lib unitialized!\n", __func__);
+		return NULL;
+	}
+
 	/* 4KiB alignment. */
 	size = ALIGN(size, 4096);
 	region = NULL;
diff --git a/src/lib/coreboot_table.c b/src/lib/coreboot_table.c
index d03b771..e786443 100644
--- a/src/lib/coreboot_table.c
+++ b/src/lib/coreboot_table.c
@@ -524,11 +524,7 @@
 	}
 #endif
 
-	/* Initialize the memory map at boot time. */
-	bootmem_init();
-
-	/* No other memory areas can be added after the memory table has been
-	 * committed as the entries won't show up in the serialize mem table. */
+	/* Serialize resource map into mem table types (LB_MEM_*) */
 	bootmem_write_memory_table(lb_memory(head));
 
 	/* Record our motherboard */