@@ -30,6 +30,7 @@ struct TTAtlantisState {
const MemMapEntry *memmap;
MemoryRegion *memory;
+ MemoryRegion *dram;
RISCVHartArrayState cpus;
DeviceState *irqchip;
DesignWareI2CState i2c[TT_ATL_NUM_I2C];
@@ -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;
}
riscv_create_fdt_socket_memory(fdt, s->memmap[TT_ATL_DDR_LO].base,
@@ -486,11 +487,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,
@@ -533,20 +537,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);