mb/emulation/qemu-i440fx: use e820 in romstage

Use memory map from fw_cfg e820 map to find cbmem_top in romstage to
avoid conflicts with CMOS option table. Keep qemu_gwt_memory_size() as
fallback.

Change-Id: I6465085020125fc790257f09eb157030c6ceabcb
Signed-off-by: Thomas Heijligen <thomas.heijligen@secunet.com>
Reviewed-on: https://review.coreboot.org/c/30850
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Patrick Rudolph <siro@das-labor.org>
diff --git a/src/mainboard/emulation/qemu-i440fx/Makefile.inc b/src/mainboard/emulation/qemu-i440fx/Makefile.inc
index 9e2880a..8c19afc 100644
--- a/src/mainboard/emulation/qemu-i440fx/Makefile.inc
+++ b/src/mainboard/emulation/qemu-i440fx/Makefile.inc
@@ -1,4 +1,5 @@
 ramstage-y += northbridge.c
 ramstage-y += fw_cfg.c
+romstage-y += fw_cfg.c
 romstage-y += memory.c
 ramstage-y += memory.c
diff --git a/src/mainboard/emulation/qemu-i440fx/memory.c b/src/mainboard/emulation/qemu-i440fx/memory.c
index dea96f2..aa1ceba 100644
--- a/src/mainboard/emulation/qemu-i440fx/memory.c
+++ b/src/mainboard/emulation/qemu-i440fx/memory.c
@@ -16,6 +16,7 @@
 #include <cbmem.h>
 #include <arch/io.h>
 #include "memory.h"
+#include "fw_cfg.h"
 
 #define CMOS_ADDR_PORT 0x70
 #define CMOS_DATA_PORT 0x71
@@ -52,5 +53,11 @@
 
 void *cbmem_top(void)
 {
-	return (void *) (qemu_get_memory_size() * 1024);
+	uintptr_t top = 0;
+
+	top = fw_cfg_tolud();
+	if (!top)
+		top = (uintptr_t)qemu_get_memory_size() * 1024;
+
+	return (void *)top;
 }
diff --git a/src/mainboard/emulation/qemu-q35/Makefile.inc b/src/mainboard/emulation/qemu-q35/Makefile.inc
index 1503220..a52aad4 100644
--- a/src/mainboard/emulation/qemu-q35/Makefile.inc
+++ b/src/mainboard/emulation/qemu-q35/Makefile.inc
@@ -2,4 +2,5 @@
 ramstage-y += ../qemu-i440fx/memory.c
 ramstage-y += ../qemu-i440fx/fw_cfg.c
 romstage-y += ../qemu-i440fx/memory.c
+romstage-y += ../qemu-i440fx/fw_cfg.c
 bootblock-y += bootblock.c