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);


Reply via email to