hw/arm/aspeed_ast27x0: Add unimplemented OTP controller MMIO regions for SSP/TSP
The AST2700 SSP/TSP firmware accesses OTP MMIO regions that are not yet implemented in QEMU. This change adds unimplemented MMIO devices for the OTP and maps them to their corresponding physical addresses in the SSP/TSP address space. These stub devices allow QEMU to safely handle firmware accesses and prevent spurious exceptions, while accurately reflecting the hardware memory map. No functional changes. Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com> Link: https://lore.kernel.org/qemu-devel/20260706052701.1141740-6-jamin_lin@aspeedtech.com Signed-off-by: Cédric Le Goater <clg@redhat.com>
Jamin Lin committed
Jul 6, 2026 at 05:27 UTC
21eac78874d3404cb26c83f261af25e0cdcb9686
4 files changed
+14
hw/arm/aspeed_ast27x0-ssp.c
+6
@@ -29,6 +29,7 @@ static const hwaddr aspeed_soc_ast27x0ssp_memmap[] = {
29
[ASPEED_DEV_IPC0] = 0x72C1C000,
30
[ASPEED_DEV_PRIC1] = 0x74100000,
31
[ASPEED_DEV_SCUIO] = 0x74C02000,
32
+ [ASPEED_DEV_OTP] = 0x74C07000,
33
[ASPEED_DEV_INTCIO] = 0x74C18000,
34
[ASPEED_DEV_UART0] = 0x74C33000,
35
[ASPEED_DEV_UART1] = 0x74C33100,
@@ -147,6 +148,8 @@ static void aspeed_soc_ast27x0ssp_init(Object *obj)
148
TYPE_UNIMPLEMENTED_DEVICE);
149
object_initialize_child(obj, "pric1", &a->pric[1],
150
TYPE_UNIMPLEMENTED_DEVICE);
151
+ object_initialize_child(obj, "otp", &a->otp,
152
+ TYPE_UNIMPLEMENTED_DEVICE);
153
}
154
155
static void aspeed_soc_ast27x0ssp_realize(DeviceState *dev_soc, Error **errp)
@@ -267,6 +270,9 @@ static void aspeed_soc_ast27x0ssp_realize(DeviceState *dev_soc, Error **errp)
270
aspeed_mmio_map_unimplemented(s->memory, SYS_BUS_DEVICE(&a->pric[1]),
271
"aspeed.pric1",
272
sc->memmap[ASPEED_DEV_PRIC1], 0x1000);
273
+ aspeed_mmio_map_unimplemented(s->memory, SYS_BUS_DEVICE(&a->otp),
274
+ "aspeed.otp",
275
+ sc->memmap[ASPEED_DEV_OTP], 0x800);
276
}
277
278
static void aspeed_soc_ast27x0ssp_class_init(ObjectClass *klass,
hw/arm/aspeed_ast27x0-tsp.c
+6
@@ -29,6 +29,7 @@ static const hwaddr aspeed_soc_ast27x0tsp_memmap[] = {
29
[ASPEED_DEV_IPC0] = 0x72C1C000,
30
[ASPEED_DEV_PRIC1] = 0x74100000,
31
[ASPEED_DEV_SCUIO] = 0x74C02000,
32
+ [ASPEED_DEV_OTP] = 0x74C07000,
33
[ASPEED_DEV_INTCIO] = 0x74C18000,
34
[ASPEED_DEV_UART0] = 0x74C33000,
35
[ASPEED_DEV_UART1] = 0x74C33100,
@@ -147,6 +148,8 @@ static void aspeed_soc_ast27x0tsp_init(Object *obj)
148
TYPE_UNIMPLEMENTED_DEVICE);
149
object_initialize_child(obj, "pric1", &a->pric[1],
150
TYPE_UNIMPLEMENTED_DEVICE);
151
+ object_initialize_child(obj, "otp", &a->otp,
152
+ TYPE_UNIMPLEMENTED_DEVICE);
153
}
154
155
static void aspeed_soc_ast27x0tsp_realize(DeviceState *dev_soc, Error **errp)
@@ -267,6 +270,9 @@ static void aspeed_soc_ast27x0tsp_realize(DeviceState *dev_soc, Error **errp)
270
aspeed_mmio_map_unimplemented(s->memory, SYS_BUS_DEVICE(&a->pric[1]),
271
"aspeed.pric1",
272
sc->memmap[ASPEED_DEV_PRIC1], 0x1000);
273
+ aspeed_mmio_map_unimplemented(s->memory, SYS_BUS_DEVICE(&a->otp),
274
+ "aspeed.otp",
275
+ sc->memmap[ASPEED_DEV_OTP], 0x800);
276
}
277
278
static void aspeed_soc_ast27x0tsp_class_init(ObjectClass *klass,
include/hw/arm/aspeed_coprocessor.h
+1
@@ -49,6 +49,7 @@ struct Aspeed27x0CoprocessorState {
49
UnimplementedDeviceState ipc[2];
50
UnimplementedDeviceState scuio;
51
UnimplementedDeviceState pric[2];
52
+ UnimplementedDeviceState otp;
53
54
ARMv7MState armv7m;
55
};
include/hw/arm/aspeed_soc.h
+1
@@ -297,6 +297,7 @@ enum {
297
ASPEED_DEV_IOEXP1_I3C,
298
ASPEED_DEV_PRIC0,
299
ASPEED_DEV_PRIC1,
300
+ ASPEED_DEV_OTP,
301
};
302
303
const char *aspeed_soc_cpu_type(const char * const *valid_cpu_types);