x86: qemu: Support getting high memory size
authorBin Meng <bmeng.cn@gmail.com>
Thu, 29 Aug 2019 09:53:05 +0000 (02:53 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Tue, 10 Sep 2019 06:19:39 +0000 (14:19 +0800)
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>
arch/x86/cpu/qemu/dram.c
arch/x86/include/asm/arch-qemu/qemu.h

index c29b073d7c4eaed5b9fa7b973ea931361a3ee2d0..6707b7b363493b4cad1efed46f76cbf99a80cdc6 100644 (file)
@@ -22,9 +22,24 @@ u32 qemu_get_low_memory_size(void)
        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(void)
 
 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 @@ int dram_init_banksize(void)
  */
 ulong board_get_usable_ram_top(ulong total_size)
 {
-       return gd->ram_size;
+       return qemu_get_low_memory_size();
 }
index c98deb2cd2f76ca753fb5fcb6f1447286f91d5f1..061735b29858dc3f9b4c0af56d3f22d859cfe357 100644 (file)
 #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
  */
 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_ */