x86: qemu: Support getting high memory size

At present only size of memory that is below 4GiB is retrieved from
QEMU. Add a function that gets size of memory that is above 4GiB.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Aiden Park <aiden.park@intel.com>
diff --git a/arch/x86/cpu/qemu/dram.c b/arch/x86/cpu/qemu/dram.c
index c29b073..6707b7b 100644
--- a/arch/x86/cpu/qemu/dram.c
+++ b/arch/x86/cpu/qemu/dram.c
@@ -22,9 +22,24 @@
 	return ram * 1024;
 }
 
+u64 qemu_get_high_memory_size(void)
+{
+	u64 ram;
+
+	outb(HIGH_HIGHRAM_ADDR, CMOS_ADDR_PORT);
+	ram = ((u64)inb(CMOS_DATA_PORT)) << 22;
+	outb(MID_HIGHRAM_ADDR, CMOS_ADDR_PORT);
+	ram |= ((u64)inb(CMOS_DATA_PORT)) << 14;
+	outb(LOW_HIGHRAM_ADDR, CMOS_ADDR_PORT);
+	ram |= ((u64)inb(CMOS_DATA_PORT)) << 6;
+
+	return ram * 1024;
+}
+
 int dram_init(void)
 {
 	gd->ram_size = qemu_get_low_memory_size();
+	gd->ram_size += qemu_get_high_memory_size();
 	post_code(POST_DRAM);
 
 	return 0;
@@ -32,8 +47,16 @@
 
 int dram_init_banksize(void)
 {
+	u64 high_mem_size;
+
 	gd->bd->bi_dram[0].start = 0;
-	gd->bd->bi_dram[0].size = gd->ram_size;
+	gd->bd->bi_dram[0].size = qemu_get_low_memory_size();
+
+	high_mem_size = qemu_get_high_memory_size();
+	if (high_mem_size) {
+		gd->bd->bi_dram[1].start = SZ_4G;
+		gd->bd->bi_dram[1].size = high_mem_size;
+	}
 
 	return 0;
 }
@@ -48,5 +71,5 @@
  */
 ulong board_get_usable_ram_top(ulong total_size)
 {
-	return gd->ram_size;
+	return qemu_get_low_memory_size();
 }
diff --git a/arch/x86/include/asm/arch-qemu/qemu.h b/arch/x86/include/asm/arch-qemu/qemu.h
index c98deb2..061735b 100644
--- a/arch/x86/include/asm/arch-qemu/qemu.h
+++ b/arch/x86/include/asm/arch-qemu/qemu.h
@@ -32,6 +32,10 @@
 #define LOW_RAM_ADDR		0x34
 #define HIGH_RAM_ADDR		0x35
 
+#define LOW_HIGHRAM_ADDR	0x5b
+#define MID_HIGHRAM_ADDR	0x5c
+#define HIGH_HIGHRAM_ADDR	0x5d
+
 /* PM registers */
 #define PMBA		0x40
 #define PMREGMISC	0x80
@@ -44,4 +48,11 @@
  */
 u32 qemu_get_low_memory_size(void);
 
+/**
+ * qemu_get_high_memory_size() - Get high memory size
+ *
+ * @return:	size of memory above 4GiB
+ */
+u64 qemu_get_high_memory_size(void);
+
 #endif /* _ARCH_QEMU_H_ */