On Sat, Jul 02, 2022 at 08:01:14AM +0200, Cédric Le Goater wrote: > On 7/1/22 20:06, Peter Delevoryas wrote: > > To support multiple SoC's running simultaneously, we need a unique name for > > each RAM region. DRAM is created by the machine, but SRAM is created by the > > SoC, since in hardware it is part of the SoC's internals. > > > > We need a way to uniquely identify each SRAM region though, for VM > > migration. Since each of the SoC's CPU's has an index which identifies it > > uniquely from other CPU's in the machine, we can use the index of any of the > > CPU's in the SoC to uniquely identify differentiate the SRAM name from other > > SoC SRAM's. In this change, I just elected to use the index of the first CPU > > in each SoC. > > hopefully the index is allocated. Did you check ?
You mean the CpuState.cpu_index? I think it's allocated at this point, I actually had to do some debugging just to get it working cause I typo'd the CPU(...) cast at first. I also tried it with the multi-SoC board in your aspeed-7.1 branch: (qemu) qom-get /machine/bmc aspeed.sram.0[0] "/machine/bmc/aspeed.sram.0[0]" (qemu) qom-get /machine/unattached aspeed.sram.2[0] "/machine/unattached/aspeed.sram.2[0]" I think the SRAM in the ast1030 is initialized without a parent object (memory_region_init_ram(..., NULL, ...)) so that's why it's in the unattached area. But we could fix that, maybe I should send a v2 with that too? > > > > Signed-off-by: Peter Delevoryas <m...@pjd.dev> > > --- > > hw/arm/aspeed_ast10x0.c | 5 ++++- > > hw/arm/aspeed_ast2600.c | 5 +++-- > > hw/arm/aspeed_soc.c | 5 +++-- > > 3 files changed, 10 insertions(+), 5 deletions(-) > > > > diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c > > index 33ef331771..b6b6f0d053 100644 > > --- a/hw/arm/aspeed_ast10x0.c > > +++ b/hw/arm/aspeed_ast10x0.c > > @@ -159,6 +159,7 @@ static void aspeed_soc_ast1030_realize(DeviceState > > *dev_soc, Error **errp) > > DeviceState *armv7m; > > Error *err = NULL; > > int i; > > + char name[64]; > > if (!clock_has_source(s->sysclk)) { > > error_setg(errp, "sysclk clock must be wired up by the board > > code"); > > @@ -183,7 +184,9 @@ static void aspeed_soc_ast1030_realize(DeviceState > > *dev_soc, Error **errp) > > sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &error_abort); > > /* Internal SRAM */ > > - memory_region_init_ram(&s->sram, NULL, "aspeed.sram", sc->sram_size, > > &err); > > + snprintf(name, sizeof(name), "aspeed.sram.%d", > > + CPU(s->armv7m.cpu)->cpu_index); > > + memory_region_init_ram(&s->sram, NULL, name, sc->sram_size, &err); > > if (err != NULL) { > > error_propagate(errp, err); > > return; > > diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c > > index 3f0611ac11..7efb9f888a 100644 > > --- a/hw/arm/aspeed_ast2600.c > > +++ b/hw/arm/aspeed_ast2600.c > > @@ -276,6 +276,7 @@ static void aspeed_soc_ast2600_realize(DeviceState > > *dev, Error **errp) > > AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); > > Error *err = NULL; > > qemu_irq irq; > > + char name[64]; > > May be ? > > g_autofree char *sram_name = > g_strdup_printf("aspeed.sram.%d", CPU(&s->cpu[0])->cpu_index); Hmmm yeah sure why not, I can fix the unattached AST1030 SRAM too. I always wanted to use g_autofree some day hehe. > > > Thanks, > > C. > > > > /* IO space */ > > aspeed_mmio_map_unimplemented(s, SYS_BUS_DEVICE(&s->iomem), > > "aspeed.io", > > @@ -335,8 +336,8 @@ static void aspeed_soc_ast2600_realize(DeviceState > > *dev, Error **errp) > > } > > /* SRAM */ > > - memory_region_init_ram(&s->sram, OBJECT(dev), "aspeed.sram", > > - sc->sram_size, &err); > > + snprintf(name, sizeof(name), "aspeed.sram.%d", > > CPU(&s->cpu[0])->cpu_index); > > + memory_region_init_ram(&s->sram, OBJECT(dev), name, sc->sram_size, > > &err); > > if (err) { > > error_propagate(errp, err); > > return; > > diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c > > index 0f675e7fcd..1ddba33d2a 100644 > > --- a/hw/arm/aspeed_soc.c > > +++ b/hw/arm/aspeed_soc.c > > @@ -239,6 +239,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error > > **errp) > > AspeedSoCState *s = ASPEED_SOC(dev); > > AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s); > > Error *err = NULL; > > + char name[64]; > > /* IO space */ > > aspeed_mmio_map_unimplemented(s, SYS_BUS_DEVICE(&s->iomem), > > "aspeed.io", > > @@ -259,8 +260,8 @@ static void aspeed_soc_realize(DeviceState *dev, Error > > **errp) > > } > > /* SRAM */ > > - memory_region_init_ram(&s->sram, OBJECT(dev), "aspeed.sram", > > - sc->sram_size, &err); > > + snprintf(name, sizeof(name), "aspeed.sram.%d", > > CPU(&s->cpu[0])->cpu_index); > > + memory_region_init_ram(&s->sram, OBJECT(dev), name, sc->sram_size, > > &err); > > if (err) { > > error_propagate(errp, err); > > return; >