From: Kane-Chen-AS <[email protected]> AST1700 includes an PWM block, but QEMU has no functional model for aspeed product yet. Expose it as an unimplemented device so the address space is reserved and the missing functionality is explicit to users/guests.
Signed-off-by: Kane-Chen-AS <[email protected]> --- include/hw/misc/aspeed_ast1700.h | 1 + hw/misc/aspeed_ast1700.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/include/hw/misc/aspeed_ast1700.h b/include/hw/misc/aspeed_ast1700.h index 8ada3a7775..9d432a7db0 100644 --- a/include/hw/misc/aspeed_ast1700.h +++ b/include/hw/misc/aspeed_ast1700.h @@ -45,6 +45,7 @@ struct AspeedAST1700SoCState { UnimplementedDeviceState i3c; UnimplementedDeviceState sgpiom; + UnimplementedDeviceState pwm; }; #endif /* ASPEED_AST1700_H */ diff --git a/hw/misc/aspeed_ast1700.c b/hw/misc/aspeed_ast1700.c index 66a5f21d27..3d9a920a7a 100644 --- a/hw/misc/aspeed_ast1700.c +++ b/hw/misc/aspeed_ast1700.c @@ -20,9 +20,11 @@ #define AST1700_SOC_SRAM_SIZE 0x00040000 #define AST1700_SOC_I3C_SIZE 0x00010000 #define AST1700_SOC_SGPIOM_SIZE 0x00002000 +#define AST1700_SOC_PWM_SIZE 0x00000200 enum { ASPEED_AST1700_DEV_SPI0, + ASPEED_AST1700_DEV_PWM, ASPEED_AST1700_DEV_SRAM, ASPEED_AST1700_DEV_ADC, ASPEED_AST1700_DEV_SCU, @@ -38,6 +40,7 @@ enum { static const hwaddr aspeed_ast1700_io_memmap[] = { [ASPEED_AST1700_DEV_SPI0] = 0x00030000, + [ASPEED_AST1700_DEV_PWM] = 0x000C0000, [ASPEED_AST1700_DEV_SRAM] = 0x00BC0000, [ASPEED_AST1700_DEV_ADC] = 0x00C00000, [ASPEED_AST1700_DEV_SCU] = 0x00C02000, @@ -174,6 +177,15 @@ static void aspeed_ast1700_realize(DeviceState *dev, Error **errp) sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->sgpiom), 0), -1000); + /* PWM */ + qdev_prop_set_string(DEVICE(&s->pwm), "name", "ioexp-pwm"); + qdev_prop_set_uint64(DEVICE(&s->pwm), "size", AST1700_SOC_PWM_SIZE); + sysbus_realize(SYS_BUS_DEVICE(&s->pwm), errp); + memory_region_add_subregion_overlap(&s->iomem, + aspeed_ast1700_io_memmap[ASPEED_AST1700_DEV_PWM], + sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->pwm), 0), + -1000); + /* WDT */ for (i = 0; i < AST1700_WDT_NUM; i++) { AspeedWDTClass *awc = ASPEED_WDT_GET_CLASS(&s->wdt[i]); @@ -241,6 +253,10 @@ static void aspeed_ast1700_instance_init(Object *obj) object_initialize_child(obj, "ioexp-sgpiom[*]", &s->sgpiom, TYPE_UNIMPLEMENTED_DEVICE); + /* PWM */ + object_initialize_child(obj, "ioexp-pwm", &s->pwm, + TYPE_UNIMPLEMENTED_DEVICE); + /* WDT */ for (i = 0; i < AST1700_WDT_NUM; i++) { snprintf(typename, sizeof(typename), "aspeed.wdt-%s", socname); -- 2.43.0
