On Tue, 5 Feb 2019 at 17:33, Eric Auger <[email protected]> wrote: > > In the prospect to introduce an extended memory map supporting more > RAM, let's split the memory map array into two parts: > > - the former a15memmap contains regions below and including the RAM > - extended_memmap, only initialized with entries located after the RAM. > Only the size of the region is initialized there since their base > address will be dynamically computed, depending on the top of the > RAM (initial RAM at the moment), with same alignment as their size. > > This new split will allow to grow the RAM size without changing the > description of the high regions.
This change makes it clear that "a15memmap" is badly misnamed. I think we should change it to "base_memmap" here. > > The patch also moves the memory map setup into machvirt_init(). > The rationale is the memory map will be soon affected by the > kvm_type() call that happens after virt_instance_init() and > before machvirt_init(). > > At that point the memory map is not changed, ie. the initial RAM can "At this point" ? > grow up to 256GiB. Then come the high IO regions with same layout as > before. > > Signed-off-by: Eric Auger <[email protected]> > > --- > v5 -> v6 > - removal of many macros in units.h > - introduce the virt_set_memmap helper > - new computation for offsets of high IO regions > - add comments > --- > hw/arm/virt.c | 45 ++++++++++++++++++++++++++++++++++++++----- > include/hw/arm/virt.h | 14 ++++++++++---- > 2 files changed, 50 insertions(+), 9 deletions(-) > > diff --git a/hw/arm/virt.c b/hw/arm/virt.c > index a1955e7764..2b15839d0b 100644 > --- a/hw/arm/virt.c > +++ b/hw/arm/virt.c > @@ -29,6 +29,7 @@ > */ > > #include "qemu/osdep.h" > +#include "qemu/units.h" > #include "qapi/error.h" > #include "hw/sysbus.h" > #include "hw/arm/arm.h" > @@ -149,11 +150,20 @@ static const MemMapEntry a15memmap[] = { > [VIRT_PCIE_PIO] = { 0x3eff0000, 0x00010000 }, > [VIRT_PCIE_ECAM] = { 0x3f000000, 0x01000000 }, > [VIRT_MEM] = { 0x40000000, RAMLIMIT_BYTES }, > +}; > + > +/* > + * Highmem IO Regions: This memory map is floating, located after the RAM. > + * Each IO region offset will be dynamically computed, depending on the > + * top of the RAM, so that its base get the same alignment as the size, > + * ie. a 512GiB region will be aligned on a 512GiB boundary. I think you should say here that if there is less than 256GiB of RAM then the floating area starts at the 256GiB mark. > + */ > +static MemMapEntry extended_memmap[] = { > /* Additional 64 MB redist region (can contain up to 512 redistributors) > */ > - [VIRT_HIGH_GIC_REDIST2] = { 0x4000000000ULL, 0x4000000 }, > - [VIRT_HIGH_PCIE_ECAM] = { 0x4010000000ULL, 0x10000000 }, > - /* Second PCIe window, 512GB wide at the 512GB boundary */ > - [VIRT_HIGH_PCIE_MMIO] = { 0x8000000000ULL, 0x8000000000ULL }, > + [VIRT_HIGH_GIC_REDIST2] = { 0x0, 64 * MiB }, > + [VIRT_HIGH_PCIE_ECAM] = { 0x0, 256 * MiB }, > + /* Second PCIe window */ > + [VIRT_HIGH_PCIE_MMIO] = { 0x0, 512 * GiB }, > }; > > static const int a15irqmap[] = { > @@ -1354,6 +1364,30 @@ static uint64_t virt_cpu_mp_affinity(VirtMachineState > *vms, int idx) > return arm_cpu_mp_affinity(idx, clustersz); > } Otherwise Reviewed-by: Peter Maydell <[email protected]> thanks -- PMM
