Hi Cédric
> Subject: Re: [SPAM] [PATCH v1 06/21] hw/arm/ast27x0: Add SRAM alias for SSP
> and ensure correct device realization order
>
> On 7/17/25 05:40, Jamin Lin wrote:
> > AST2700 has a 128KB SRAM, physically mapped at 0x10000000–0x1001FFFF
> > for the main CA35 processor. The SSP coprocessor accesses this same
> > memory at a different memory address: 0x70000000–0x7001FFFF.
> >
> > To support this shared memory model, this commit introduces
> > "ssp.sram_mr_alias", a "MemoryRegion" alias of the original SRAM
> > region ("s->sram"). The alias is realized during SSP SoC setup and mapped
> into the SSP's SoC memory map.
> >
> > Additionally, because the SRAM must be realized before the SSP can
> > create an alias to it, the device realization order is explicitly managed:
> > "aspeed_soc_ast2700_ssp_realize()" is invoked after SRAM is initialized.
> >
> > This ensures that SSP’s access to shared SRAM functions correctly.
>
> Could the 'sram' MemoryRegion of main SoC be passed to the coprocessors
> using a property ? Like done for dram. This would be simpler I think.
>
Will do.
Thanks for your review and suggestion.
Jamin
> Thanks,
>
> C.
>
>
>
> > Signed-off-by: Jamin Lin <[email protected]>
> > ---
> > include/hw/arm/aspeed_soc.h | 1 +
> > hw/arm/aspeed_ast27x0-ssp.c | 5 +++++
> > hw/arm/aspeed_ast27x0.c | 15 ++++++++++++++-
> > 3 files changed, 20 insertions(+), 1 deletion(-)
> >
> > diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
> > index 3dd317cfee..9b935b9bca 100644
> > --- a/include/hw/arm/aspeed_soc.h
> > +++ b/include/hw/arm/aspeed_soc.h
> > @@ -134,6 +134,7 @@ struct Aspeed27x0SSPSoCState {
> > UnimplementedDeviceState ipc[2];
> > UnimplementedDeviceState scuio;
> > MemoryRegion memory;
> > + MemoryRegion sram_mr_alias;
> >
> > ARMv7MState armv7m;
> > };
> > diff --git a/hw/arm/aspeed_ast27x0-ssp.c b/hw/arm/aspeed_ast27x0-ssp.c
> > index 9641e27de1..b7b886f4bf 100644
> > --- a/hw/arm/aspeed_ast27x0-ssp.c
> > +++ b/hw/arm/aspeed_ast27x0-ssp.c
> > @@ -19,6 +19,7 @@
> >
> > static const hwaddr aspeed_soc_ast27x0ssp_memmap[] = {
> > [ASPEED_DEV_SDRAM] = 0x00000000,
> > + [ASPEED_DEV_SRAM] = 0x70000000,
> > [ASPEED_DEV_INTC] = 0x72100000,
> > [ASPEED_DEV_SCU] = 0x72C02000,
> > [ASPEED_DEV_SCUIO] = 0x74C02000,
> > @@ -192,6 +193,10 @@ static void
> aspeed_soc_ast27x0ssp_realize(DeviceState *dev_soc, Error **errp)
> >
> sc->memmap[ASPEED_DEV_SDRAM],
> > &s->dram_container);
> >
> > + /* SRAM */
> > + memory_region_add_subregion(s->memory,
> sc->memmap[ASPEED_DEV_SRAM],
> > + &a->sram_mr_alias);
> > +
> > /* SCU */
> > if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
> > return;
> > diff --git a/hw/arm/aspeed_ast27x0.c b/hw/arm/aspeed_ast27x0.c index
> > 665627f788..9064249bed 100644
> > --- a/hw/arm/aspeed_ast27x0.c
> > +++ b/hw/arm/aspeed_ast27x0.c
> > @@ -624,6 +624,7 @@ static bool
> aspeed_soc_ast2700_ssp_realize(DeviceState *dev, Error **errp)
> > {
> > Aspeed27x0SoCState *a = ASPEED27X0_SOC(dev);
> > AspeedSoCState *s = ASPEED_SOC(dev);
> > + MemoryRegion *mr;
> > Clock *sysclk;
> >
> > sysclk = clock_new(OBJECT(s), "SSP_SYSCLK"); @@ -637,6 +638,9
> @@
> > static bool aspeed_soc_ast2700_ssp_realize(DeviceState *dev, Error **errp)
> > return false;
> > }
> >
> > + mr = &s->sram;
> > + memory_region_init_alias(&a->ssp.sram_mr_alias, OBJECT(s),
> "ssp.sram.alias",
> > + mr, 0, memory_region_size(mr));
> > if (!qdev_realize(DEVICE(&a->ssp), NULL, &error_abort)) {
> > return false;
> > }
> > @@ -779,7 +783,16 @@ static void
> aspeed_soc_ast2700_realize(DeviceState *dev, Error **errp)
> > aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->scuio), 0,
> > sc->memmap[ASPEED_DEV_SCUIO]);
> >
> > - /* Coprocessors */
> > + /*
> > + * Coprocessors must be realized after the SRAM region.
> > + *
> > + * The SRAM is used for shared memory between the main CPU (PSP)
> and
> > + * coprocessors. The coprocessors accesses this shared SRAM region
> > + * through a memory alias mapped to a different physical address.
> > + *
> > + * Therefore, the SRAM must be fully initialized before the
> coprocessors
> > + * can create aliases pointing to it.
> > + */
> > if (mc->default_cpus > sc->num_cpus) {
> > if (!aspeed_soc_ast2700_ssp_realize(dev, errp)) {
> > return;