On 8/26/2026 7:11 PM, Joel Stanley wrote:
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.
What you're doing here is basically replacing MACHINE(s)->ram_size to
memory_region_size(machine->ram).
This is fine, in particular during init time. Just be aware that those
2 values are not always the same when we consider stuff like memory
hotplug/unplug (ms->ram_size is defined during init,
memory_region_size(machine->ram)
will differ).
I don't think we have adequate support for hotplug/unplug in general in RISC-V
yet so this might be a non-issue. Worth keeping it in mind though.
Reviewed-by: Daniel Henrique Barboza <[email protected]>
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);