[PATCH v2 17/17] hw/arm/aspeed: Model AST1700 PWM block as unimplemented device

Kane Chen via posted 17 patches 1 week, 2 days ago
Maintainers: "Cédric Le Goater" <clg@kaod.org>, Peter Maydell <peter.maydell@linaro.org>, Steven Lee <steven_lee@aspeedtech.com>, Troy Lee <leetroy@gmail.com>, Jamin Lin <jamin_lin@aspeedtech.com>, Andrew Jeffery <andrew@codeconstruct.com.au>, Joel Stanley <joel@jms.id.au>
[PATCH v2 17/17] hw/arm/aspeed: Model AST1700 PWM block as unimplemented device
Posted by Kane Chen via 1 week, 2 days ago
From: Kane-Chen-AS <kane_chen@aspeedtech.com>

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 <kane_chen@aspeedtech.com>
---
 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
Re: [PATCH v2 17/17] hw/arm/aspeed: Model AST1700 PWM block as unimplemented device
Posted by Cédric Le Goater 3 days, 23 hours ago
On 11/5/25 04:58, Kane Chen wrote:
> From: Kane-Chen-AS <kane_chen@aspeedtech.com>
> 
> AST1700 includes an PWM block, but QEMU has no functional model for
> aspeed product yet. 

We could start with a dummy PWM model :

   https://github.com/legoater/qemu/commit/9d77c84b04c2d9ae5685b3ccb5c434873666ca78

Feel free to add to your series.

Thanks,

C.



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 <kane_chen@aspeedtech.com>
> ---
>   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);
RE: [PATCH v2 17/17] hw/arm/aspeed: Model AST1700 PWM block as unimplemented device
Posted by Kane Chen 3 days, 13 hours ago
Hi Cédric,

Thanks for the information. I'll try integrating this PWM model.

Best Regards,
Kane
> -----Original Message-----
> From: Cédric Le Goater <clg@kaod.org>
> Sent: Tuesday, November 11, 2025 12:17 AM
> To: Kane Chen <kane_chen@aspeedtech.com>; Peter Maydell
> <peter.maydell@linaro.org>; Steven Lee <steven_lee@aspeedtech.com>; Troy
> Lee <leetroy@gmail.com>; Jamin Lin <jamin_lin@aspeedtech.com>; Andrew
> Jeffery <andrew@codeconstruct.com.au>; Joel Stanley <joel@jms.id.au>;
> open list:ASPEED BMCs <qemu-arm@nongnu.org>; open list:All patches CC
> here <qemu-devel@nongnu.org>
> Cc: Troy Lee <troy_lee@aspeedtech.com>
> Subject: Re: [PATCH v2 17/17] hw/arm/aspeed: Model AST1700 PWM block as
> unimplemented device
> 
> On 11/5/25 04:58, Kane Chen wrote:
> > From: Kane-Chen-AS <kane_chen@aspeedtech.com>
> >
> > AST1700 includes an PWM block, but QEMU has no functional model for
> > aspeed product yet.
> 
> We could start with a dummy PWM model :
> 
> 
> https://github.com/legoater/qemu/commit/9d77c84b04c2d9ae5685b3ccb5c4
> 34873666ca78
> 
> Feel free to add to your series.
> 
> Thanks,
> 
> C.
> 
> 
> 
> 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 <kane_chen@aspeedtech.com>
> > ---
> >   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);