Keep a reference to the machine's RAM MemoryRegion in TTAtlantisState, and get the MemoryRegion's size where the configured RAM size is required.
This allows reading the RAM size without needing a pointer to MachineState, decoupling the memory layout setup from the machine. Signed-off-by: Joel Stanley <[email protected]> --- include/hw/riscv/tt_atlantis.h | 1 + hw/riscv/tt_atlantis.c | 20 ++++++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/include/hw/riscv/tt_atlantis.h b/include/hw/riscv/tt_atlantis.h index a29c67c1cfcf..2ec283d0fd7b 100644 --- a/include/hw/riscv/tt_atlantis.h +++ b/include/hw/riscv/tt_atlantis.h @@ -30,6 +30,7 @@ struct TTAtlantisState { const MemMapEntry *memmap; MemoryRegion *memory; + MemoryRegion *dram; RISCVHartArrayState cpus; DeviceState *irqchip; DesignWareI2CState i2c[TT_ATL_NUM_I2C]; diff --git a/hw/riscv/tt_atlantis.c b/hw/riscv/tt_atlantis.c index 1c75fb5d8d57..7a9f5872c7c0 100644 --- a/hw/riscv/tt_atlantis.c +++ b/hw/riscv/tt_atlantis.c @@ -82,12 +82,13 @@ static uint32_t next_phandle(void) static void create_fdt_memory(void *fdt, TTAtlantisState *s) { - hwaddr size_lo = MACHINE(s)->ram_size; + hwaddr ram_size = memory_region_size(s->dram); + hwaddr size_lo = ram_size; hwaddr size_hi = 0; if (size_lo > s->memmap[TT_ATL_DDR_LO].size) { size_lo = s->memmap[TT_ATL_DDR_LO].size; - size_hi = MACHINE(s)->ram_size - size_lo; + size_hi = ram_size - size_lo; } create_fdt_socket_memory(fdt, s->memmap[TT_ATL_DDR_LO].base, size_lo, @@ -485,11 +486,14 @@ static void tt_atlantis_machine_init(MachineState *machine) MemoryRegion *ram_hi = g_new(MemoryRegion, 1); MemoryRegion *ram_lo = g_new(MemoryRegion, 1); MemoryRegion *bootrom = g_new(MemoryRegion, 1); - ram_addr_t lo_ram_size; + ram_addr_t lo_ram_size, ram_size; int hart_count = machine->smp.cpus; s->memory = get_system_memory(); + s->dram = machine->ram; + ram_size = memory_region_size(s->dram); + s->memmap = tt_atlantis_memmap; object_initialize_child(OBJECT(machine), "soc", &s->cpus, @@ -532,20 +536,20 @@ static void tt_atlantis_machine_init(MachineState *machine) * The high address is where RAM lives. It is always present and may be * up to 64GB. The low address is an alias of the first 2GB of that RAM. */ - if (machine->ram_size > s->memmap[TT_ATL_DDR_HI].size) { + if (ram_size > s->memmap[TT_ATL_DDR_HI].size) { char *sz = size_to_str(s->memmap[TT_ATL_DDR_HI].size); error_report("RAM size is too large, maximum is %s", sz); g_free(sz); exit(EXIT_FAILURE); } - memory_region_init_alias(ram_hi, OBJECT(machine), "ram.high", machine->ram, - 0, machine->ram_size); + memory_region_init_alias(ram_hi, OBJECT(machine), "ram.high", s->dram, + 0, ram_size); memory_region_add_subregion(s->memory, s->memmap[TT_ATL_DDR_HI].base, ram_hi); - lo_ram_size = MIN(machine->ram_size, s->memmap[TT_ATL_DDR_LO].size); - memory_region_init_alias(ram_lo, OBJECT(machine), "ram.low", machine->ram, + lo_ram_size = MIN(ram_size, s->memmap[TT_ATL_DDR_LO].size); + memory_region_init_alias(ram_lo, OBJECT(machine), "ram.low", s->dram, 0, lo_ram_size); memory_region_add_subregion(s->memory, s->memmap[TT_ATL_DDR_LO].base, ram_lo); -- 2.47.3
