@samitouri / QOSamiQemu / commits / ee3f2ace6f

hw/arm/aspeed_ast27x0: Move SCU link into AST27x0 coprocessors

The SCU link is only needed by the AST27x0 SSP/TSP coprocessors for their AST2700-specific SCU alias window. Move the link property from the common AspeedCoprocessorState into Aspeed27x0CoprocessorState, so the generic coprocessor model no longer contains an AST2700-specific dependency. Also validate that the SCU link has been provided during device realize before accessing it. No functional change. Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Tested-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com> Link: https://lore.kernel.org/qemu-devel/20260717084559.3477061-4-jamin_lin@aspeedtech.com Signed-off-by: Cédric Le Goater <clg@redhat.com>

Jamin Lin committed Jul 17, 2026 at 08:46 UTC ee3f2ace6fc8c9e079fd49b78ea6f71edb225fdd
4 files changed +35 -12
hw/arm/aspeed_ast27x0-ssp.c
+16 -4
@@ -167,6 +167,12 @@ static void aspeed_soc_ast27x0ssp_realize(DeviceState *dev_soc, Error **errp)
167 return;
168 }
169
170 + if (!a->scu) {
171 + error_setg(errp, TYPE_ASPEED27X0SSP_COPROCESSOR
172 + ": 'scu' link is not set");
173 + return;
174 + }
175 +
176 /* AST27X0 SSP Core */
177 armv7m = DEVICE(&a->armv7m);
178 qdev_prop_set_uint32(armv7m, "num-irq", 256);
@@ -195,11 +201,11 @@ static void aspeed_soc_ast27x0ssp_realize(DeviceState *dev_soc, Error **errp)
201 &s->sram_alias);
202
203 /* SCU */
198 - memory_region_init_alias(&s->scu_alias, OBJECT(s), "scu.alias",
199 - &s->scu->iomem, 0,
200 - memory_region_size(&s->scu->iomem));
204 + memory_region_init_alias(&a->scu_alias, OBJECT(a), "scu.alias",
205 + &a->scu->parent_obj.iomem, 0,
206 + memory_region_size(&a->scu->parent_obj.iomem));
207 memory_region_add_subregion(s->memory, sc->memmap[ASPEED_DEV_SCU],
202 - &s->scu_alias);
208 + &a->scu_alias);
209
210 /* INTC */
211 if (!sysbus_realize(SYS_BUS_DEVICE(&a->intc[0]), errp)) {
@@ -275,6 +281,11 @@ static void aspeed_soc_ast27x0ssp_realize(DeviceState *dev_soc, Error **errp)
281 sc->memmap[ASPEED_DEV_OTP], 0x800);
282 }
283
284 +static const Property aspeed_27x0_coprocessor_properties[] = {
285 + DEFINE_PROP_LINK("scu", Aspeed27x0CoprocessorState, scu,
286 + TYPE_ASPEED_2700_SCU, Aspeed2700SCUState *),
287 +};
288 +
289 static void aspeed_soc_ast27x0ssp_class_init(ObjectClass *klass,
290 const void *data)
291 {
@@ -288,6 +299,7 @@ static void aspeed_soc_ast27x0ssp_class_init(ObjectClass *klass,
299 /* Reason: The Aspeed Coprocessor can only be instantiated from a board */
300 dc->user_creatable = false;
301 dc->realize = aspeed_soc_ast27x0ssp_realize;
302 + device_class_set_props(dc, aspeed_27x0_coprocessor_properties);
303
304 sc->valid_cpu_types = valid_cpu_types;
305 sc->irqmap = aspeed_soc_ast27x0ssp_irqmap;
hw/arm/aspeed_ast27x0-tsp.c
+16 -4
@@ -167,6 +167,12 @@ static void aspeed_soc_ast27x0tsp_realize(DeviceState *dev_soc, Error **errp)
167 return;
168 }
169
170 + if (!a->scu) {
171 + error_setg(errp, TYPE_ASPEED27X0TSP_COPROCESSOR
172 + ": 'scu' link is not set");
173 + return;
174 + }
175 +
176 /* AST27X0 TSP Core */
177 armv7m = DEVICE(&a->armv7m);
178 qdev_prop_set_uint32(armv7m, "num-irq", 256);
@@ -195,11 +201,11 @@ static void aspeed_soc_ast27x0tsp_realize(DeviceState *dev_soc, Error **errp)
201 &s->sram_alias);
202
203 /* SCU */
198 - memory_region_init_alias(&s->scu_alias, OBJECT(s), "scu.alias",
199 - &s->scu->iomem, 0,
200 - memory_region_size(&s->scu->iomem));
204 + memory_region_init_alias(&a->scu_alias, OBJECT(a), "scu.alias",
205 + &a->scu->parent_obj.iomem, 0,
206 + memory_region_size(&a->scu->parent_obj.iomem));
207 memory_region_add_subregion(s->memory, sc->memmap[ASPEED_DEV_SCU],
202 - &s->scu_alias);
208 + &a->scu_alias);
209
210 /* INTC */
211 if (!sysbus_realize(SYS_BUS_DEVICE(&a->intc[0]), errp)) {
@@ -275,6 +281,11 @@ static void aspeed_soc_ast27x0tsp_realize(DeviceState *dev_soc, Error **errp)
281 sc->memmap[ASPEED_DEV_OTP], 0x800);
282 }
283
284 +static const Property aspeed_27x0_coprocessor_properties[] = {
285 + DEFINE_PROP_LINK("scu", Aspeed27x0CoprocessorState, scu,
286 + TYPE_ASPEED_2700_SCU, Aspeed2700SCUState *),
287 +};
288 +
289 static void aspeed_soc_ast27x0tsp_class_init(ObjectClass *klass,
290 const void *data)
291 {
@@ -288,6 +299,7 @@ static void aspeed_soc_ast27x0tsp_class_init(ObjectClass *klass,
299 /* Reason: The Aspeed Coprocessor can only be instantiated from a board */
300 dc->user_creatable = false;
301 dc->realize = aspeed_soc_ast27x0tsp_realize;
302 + device_class_set_props(dc, aspeed_27x0_coprocessor_properties);
303
304 sc->valid_cpu_types = valid_cpu_types;
305 sc->irqmap = aspeed_soc_ast27x0tsp_irqmap;
hw/arm/aspeed_coprocessor_common.c
-2
@@ -27,8 +27,6 @@ static const Property aspeed_coprocessor_properties[] = {
27 TYPE_MEMORY_REGION, MemoryRegion *),
28 DEFINE_PROP_LINK("sram", AspeedCoprocessorState, sram, TYPE_MEMORY_REGION,
29 MemoryRegion *),
30 - DEFINE_PROP_LINK("scu", AspeedCoprocessorState, scu, TYPE_ASPEED_SCU,
31 - AspeedSCUState *),
30 DEFINE_PROP_LINK("uart", AspeedCoprocessorState, uart, TYPE_SERIAL_MM,
31 SerialMM *),
32 DEFINE_PROP_INT32("uart-dev", AspeedCoprocessorState, uart_dev, 0),
include/hw/arm/aspeed_coprocessor.h
+3 -2
@@ -20,10 +20,8 @@ struct AspeedCoprocessorState {
20 MemoryRegion *sram;
21 MemoryRegion sram_alias;
22 MemoryRegion uart_alias;
23 - MemoryRegion scu_alias;
23 Clock *sysclk;
24
26 - AspeedSCUState *scu;
25 AspeedSCUState scuio;
26 AspeedTimerCtrlState timerctrl;
27 SerialMM *uart;
@@ -52,6 +50,9 @@ struct Aspeed27x0CoprocessorState {
50 UnimplementedDeviceState otp;
51
52 ARMv7MState armv7m;
53 +
54 + MemoryRegion scu_alias;
55 + Aspeed2700SCUState *scu;
56 };
57
58 #define TYPE_ASPEED27X0SSP_COPROCESSOR "aspeed27x0ssp-coprocessor"