[U-Boot] [PATCH 3/4] x86: qemu: Support getting high memory size
Bin Meng
bmeng.cn at gmail.com
Tue Sep 10 06:17:24 UTC 2019
On Wed, Sep 4, 2019 at 12:55 AM Park, Aiden <aiden.park at intel.com> wrote:
>
>
>
> > -----Original Message-----
> > From: Bin Meng [mailto:bmeng.cn at gmail.com]
> > Sent: Thursday, August 29, 2019 2:53 AM
> > To: Simon Glass <sjg at chromium.org>; Park, Aiden <aiden.park at intel.com>;
> > U-Boot Mailing List <u-boot at lists.denx.de>
> > Cc: Heinrich Schuchardt <xypron.glpk at gmx.de>
> > Subject: [PATCH 3/4] 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 at gmail.com>
> > ---
> >
> > arch/x86/cpu/qemu/dram.c | 27 +++++++++++++++++++++++++--
> > arch/x86/include/asm/arch-qemu/qemu.h | 11 +++++++++++
> > 2 files changed, 36 insertions(+), 2 deletions(-)
> >
> > 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 @@ 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();
> > }
> > 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_ */
> > --
> > 2.7.4
>
> Reviewed-by: Aiden Park <aiden.park at intel.com>
applied to u-boot-x86, thanks!
More information about the U-Boot
mailing list