RE: [EXT] Re: [PATCHv3 09/13] hw/arm/fsl-imx8mm: Adding support for Watchdog Timers

2025-12-01 Thread Gaurav Sharma
> >  include/hw/arm/fsl-imx8mm.h|  7 +++
> 
> > @@ -198,6 +201,10 @@ enum FslImx8mmIrqs {
> >  FSL_IMX8MM_GPIO5_LOW_IRQ  = 72,
> >  FSL_IMX8MM_GPIO5_HIGH_IRQ = 73,
> >
> > +FSL_IMX8MM_WDOG1_IRQ= 78,
> > +FSL_IMX8MM_WDOG2_IRQ= 79,
> > +FSL_IMX8MM_WDOG3_IRQ= 10,
> 
> Is this definitely 10, and not a typo for 80 ?
> 
> > +
> >  FSL_IMX8MM_PCI_INTA_IRQ = 122,
> >  FSL_IMX8MM_PCI_INTB_IRQ = 123,
> >  FSL_IMX8MM_PCI_INTC_IRQ = 124,
> > --
> 
> otherwise
> Reviewed-by: Peter Maydell 


yes, this IRQ number is 10. It is not a typo.


Re: [PATCHv3 09/13] hw/arm/fsl-imx8mm: Adding support for Watchdog Timers

2025-12-01 Thread Peter Maydell
On Wed, 19 Nov 2025 at 13:00, Gaurav Sharma  wrote:
>
> It enables emulation of WDT in iMX8MM
> Added WDT IRQ lines
>
> Signed-off-by: Gaurav Sharma 
> ---
>  docs/system/arm/imx8mm-evk.rst |  1 +
>  hw/arm/Kconfig |  1 +
>  hw/arm/fsl-imx8mm.c| 28 
>  include/hw/arm/fsl-imx8mm.h|  7 +++

> @@ -198,6 +201,10 @@ enum FslImx8mmIrqs {
>  FSL_IMX8MM_GPIO5_LOW_IRQ  = 72,
>  FSL_IMX8MM_GPIO5_HIGH_IRQ = 73,
>
> +FSL_IMX8MM_WDOG1_IRQ= 78,
> +FSL_IMX8MM_WDOG2_IRQ= 79,
> +FSL_IMX8MM_WDOG3_IRQ= 10,

Is this definitely 10, and not a typo for 80 ?

> +
>  FSL_IMX8MM_PCI_INTA_IRQ = 122,
>  FSL_IMX8MM_PCI_INTB_IRQ = 123,
>  FSL_IMX8MM_PCI_INTC_IRQ = 124,
> --

otherwise
Reviewed-by: Peter Maydell 

thanks
-- PMM



[PATCHv3 09/13] hw/arm/fsl-imx8mm: Adding support for Watchdog Timers

2025-11-19 Thread Gaurav Sharma
It enables emulation of WDT in iMX8MM
Added WDT IRQ lines

Signed-off-by: Gaurav Sharma 
---
 docs/system/arm/imx8mm-evk.rst |  1 +
 hw/arm/Kconfig |  1 +
 hw/arm/fsl-imx8mm.c| 28 
 include/hw/arm/fsl-imx8mm.h|  7 +++
 4 files changed, 37 insertions(+)

diff --git a/docs/system/arm/imx8mm-evk.rst b/docs/system/arm/imx8mm-evk.rst
index fb74950e28..b7034ff472 100644
--- a/docs/system/arm/imx8mm-evk.rst
+++ b/docs/system/arm/imx8mm-evk.rst
@@ -17,6 +17,7 @@ The ``imx8mm-evk`` machine implements the following devices:
  * 5 GPIO Controllers
  * 6 I2C Controllers
  * 3 SPI Controllers
+ * 3 Watchdogs
  * Secure Non-Volatile Storage (SNVS) including an RTC
  * Clock Tree
 
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
index d442ea0624..9498a96f30 100644
--- a/hw/arm/Kconfig
+++ b/hw/arm/Kconfig
@@ -638,6 +638,7 @@ config FSL_IMX8MM
 select SDHCI
 select PCI_EXPRESS_DESIGNWARE
 select PCI_EXPRESS_FSL_IMX8M_PHY
+select WDT_IMX2
 
 config FSL_IMX8MM_EVK
 bool
diff --git a/hw/arm/fsl-imx8mm.c b/hw/arm/fsl-imx8mm.c
index a9017c90a0..0a3e057bf3 100644
--- a/hw/arm/fsl-imx8mm.c
+++ b/hw/arm/fsl-imx8mm.c
@@ -197,6 +197,11 @@ static void fsl_imx8mm_init(Object *obj)
 object_initialize_child(obj, name, &s->spi[i], TYPE_IMX_SPI);
 }
 
+for (i = 0; i < FSL_IMX8MM_NUM_WDTS; i++) {
+g_autofree char *name = g_strdup_printf("wdt%d", i);
+object_initialize_child(obj, name, &s->wdt[i], TYPE_IMX2_WDT);
+}
+
 object_initialize_child(obj, "pcie", &s->pcie, TYPE_DESIGNWARE_PCIE_HOST);
 object_initialize_child(obj, "pcie_phy", &s->pcie_phy,
 TYPE_FSL_IMX8M_PCIE_PHY);
@@ -481,6 +486,28 @@ static void fsl_imx8mm_realize(DeviceState *dev, Error 
**errp)
 sysbus_mmio_map(SYS_BUS_DEVICE(&s->snvs), 0,
 fsl_imx8mm_memmap[FSL_IMX8MM_SNVS_HP].addr);
 
+/* Watchdogs */
+for (i = 0; i < FSL_IMX8MM_NUM_WDTS; i++) {
+static const struct {
+hwaddr addr;
+unsigned int irq;
+} wdog_table[FSL_IMX8MM_NUM_WDTS] = {
+{ fsl_imx8mm_memmap[FSL_IMX8MM_WDOG1].addr, FSL_IMX8MM_WDOG1_IRQ },
+{ fsl_imx8mm_memmap[FSL_IMX8MM_WDOG2].addr, FSL_IMX8MM_WDOG2_IRQ },
+{ fsl_imx8mm_memmap[FSL_IMX8MM_WDOG3].addr, FSL_IMX8MM_WDOG3_IRQ },
+};
+
+object_property_set_bool(OBJECT(&s->wdt[i]), "pretimeout-support",
+ true, &error_abort);
+if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), errp)) {
+return;
+}
+
+sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0, wdog_table[i].addr);
+sysbus_connect_irq(SYS_BUS_DEVICE(&s->wdt[i]), 0,
+   qdev_get_gpio_in(gicdev, wdog_table[i].irq));
+}
+
 /* PCIe */
 if (!sysbus_realize(SYS_BUS_DEVICE(&s->pcie), errp)) {
 return;
@@ -521,6 +548,7 @@ static void fsl_imx8mm_realize(DeviceState *dev, Error 
**errp)
 case FSL_IMX8MM_SNVS_HP:
 case FSL_IMX8MM_UART1 ... FSL_IMX8MM_UART4:
 case FSL_IMX8MM_USDHC1 ... FSL_IMX8MM_USDHC3:
+case FSL_IMX8MM_WDOG1 ... FSL_IMX8MM_WDOG3:
 /* device implemented and treated above */
 break;
 
diff --git a/include/hw/arm/fsl-imx8mm.h b/include/hw/arm/fsl-imx8mm.h
index f3a3304565..7107e932c6 100644
--- a/include/hw/arm/fsl-imx8mm.h
+++ b/include/hw/arm/fsl-imx8mm.h
@@ -21,6 +21,7 @@
 #include "hw/pci-host/fsl_imx8m_phy.h"
 #include "hw/sd/sdhci.h"
 #include "hw/ssi/imx_spi.h"
+#include "hw/watchdog/wdt_imx2.h"
 #include "qom/object.h"
 #include "qemu/units.h"
 
@@ -38,6 +39,7 @@ enum FslImx8mmConfiguration {
 FSL_IMX8MM_NUM_IRQS = 128,
 FSL_IMX8MM_NUM_UARTS= 4,
 FSL_IMX8MM_NUM_USDHCS   = 3,
+FSL_IMX8MM_NUM_WDTS = 3,
 };
 
 struct FslImx8mmState {
@@ -53,6 +55,7 @@ struct FslImx8mmState {
 IMXI2CStatei2c[FSL_IMX8MM_NUM_I2CS];
 IMXSerialState uart[FSL_IMX8MM_NUM_UARTS];
 SDHCIState usdhc[FSL_IMX8MM_NUM_USDHCS];
+IMX2WdtState   wdt[FSL_IMX8MM_NUM_WDTS];
 DesignwarePCIEHost pcie;
 FslImx8mPciePhyState   pcie_phy;
 };
@@ -198,6 +201,10 @@ enum FslImx8mmIrqs {
 FSL_IMX8MM_GPIO5_LOW_IRQ  = 72,
 FSL_IMX8MM_GPIO5_HIGH_IRQ = 73,
 
+FSL_IMX8MM_WDOG1_IRQ= 78,
+FSL_IMX8MM_WDOG2_IRQ= 79,
+FSL_IMX8MM_WDOG3_IRQ= 10,
+
 FSL_IMX8MM_PCI_INTA_IRQ = 122,
 FSL_IMX8MM_PCI_INTB_IRQ = 123,
 FSL_IMX8MM_PCI_INTC_IRQ = 124,
-- 
2.34.1