[dif] Add autogen'd `*_irq_acknowledge_all()` DIFs.

This partially addresses #8142, by adding an auto-generated IRQ DIF to
all IP's DIF libraries that can acknowledge (clear) all pending IRQs of
an IP. This commit:

1. updates the autogen DIF templates, including the .c, .h, and (unit
   test) .cc templates, and
2. re-generates all autogen'd DIF libs.

Signed-off-by: Timothy Trippel <ttrippel@google.com>
diff --git a/sw/device/lib/dif/autogen/dif_adc_ctrl_autogen.c b/sw/device/lib/dif/autogen/dif_adc_ctrl_autogen.c
index 114b932..cc4ee46 100644
--- a/sw/device/lib/dif/autogen/dif_adc_ctrl_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_adc_ctrl_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_adc_ctrl_autogen.h"
+#include <stdint.h>
 
 #include "adc_ctrl_regs.h"  // Generated.
 
@@ -75,6 +76,19 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_adc_ctrl_irq_acknowledge_all(const dif_adc_ctrl_t *adc_ctrl) {
+  if (adc_ctrl == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(adc_ctrl->base_addr, ADC_CTRL_INTR_STATE_REG_OFFSET,
+                      UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_adc_ctrl_irq_acknowledge(const dif_adc_ctrl_t *adc_ctrl,
                                           dif_adc_ctrl_irq_t irq) {
   if (adc_ctrl == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_adc_ctrl_autogen.h b/sw/device/lib/dif/autogen/dif_adc_ctrl_autogen.h
index f1d4710..0d9938a 100644
--- a/sw/device/lib/dif/autogen/dif_adc_ctrl_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_adc_ctrl_autogen.h
@@ -92,6 +92,16 @@
                                          bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param adc_ctrl A adc_ctrl handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_adc_ctrl_irq_acknowledge_all(const dif_adc_ctrl_t *adc_ctrl);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_adc_ctrl_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_adc_ctrl_autogen_unittest.cc
index 3b6463b..1ff1489 100644
--- a/sw/device/lib/dif/autogen/dif_adc_ctrl_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_adc_ctrl_autogen_unittest.cc
@@ -104,6 +104,19 @@
   EXPECT_TRUE(irq_state);
 }
 
+class AcknowledgeAllTest : public AdcCtrlTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_adc_ctrl_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(ADC_CTRL_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_adc_ctrl_irq_acknowledge_all(&adc_ctrl_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public AdcCtrlTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_aes_autogen.c b/sw/device/lib/dif/autogen/dif_aes_autogen.c
index f4fdd1a..a62e5bb 100644
--- a/sw/device/lib/dif/autogen/dif_aes_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_aes_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_aes_autogen.h"
+#include <stdint.h>
 
 #include "aes_regs.h"  // Generated.
 
diff --git a/sw/device/lib/dif/autogen/dif_alert_handler_autogen.c b/sw/device/lib/dif/autogen/dif_alert_handler_autogen.c
index 8cec044..56f78f6 100644
--- a/sw/device/lib/dif/autogen/dif_alert_handler_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_alert_handler_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_alert_handler_autogen.h"
+#include <stdint.h>
 
 #include "alert_handler_regs.h"  // Generated.
 
@@ -84,6 +85,20 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_alert_handler_irq_acknowledge_all(
+    const dif_alert_handler_t *alert_handler) {
+  if (alert_handler == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(alert_handler->base_addr,
+                      ALERT_HANDLER_INTR_STATE_REG_OFFSET, UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_alert_handler_irq_acknowledge(
     const dif_alert_handler_t *alert_handler, dif_alert_handler_irq_t irq) {
   if (alert_handler == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_alert_handler_autogen.h b/sw/device/lib/dif/autogen/dif_alert_handler_autogen.h
index 4ae5615..a957e05 100644
--- a/sw/device/lib/dif/autogen/dif_alert_handler_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_alert_handler_autogen.h
@@ -109,6 +109,17 @@
     bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param alert_handler A alert_handler handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_alert_handler_irq_acknowledge_all(
+    const dif_alert_handler_t *alert_handler);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_alert_handler_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_alert_handler_autogen_unittest.cc
index 8084450..781e2e8 100644
--- a/sw/device/lib/dif/autogen/dif_alert_handler_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_alert_handler_autogen_unittest.cc
@@ -119,6 +119,19 @@
   EXPECT_FALSE(irq_state);
 }
 
+class AcknowledgeAllTest : public AlertHandlerTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_alert_handler_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(ALERT_HANDLER_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_alert_handler_irq_acknowledge_all(&alert_handler_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public AlertHandlerTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_aon_timer_autogen.c b/sw/device/lib/dif/autogen/dif_aon_timer_autogen.c
index 94d583e..3d4a559 100644
--- a/sw/device/lib/dif/autogen/dif_aon_timer_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_aon_timer_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_aon_timer_autogen.h"
+#include <stdint.h>
 
 #include "aon_timer_regs.h"  // Generated.
 
@@ -86,6 +87,20 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_aon_timer_irq_acknowledge_all(
+    const dif_aon_timer_t *aon_timer) {
+  if (aon_timer == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(aon_timer->base_addr, AON_TIMER_INTR_STATE_REG_OFFSET,
+                      UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_aon_timer_irq_acknowledge(const dif_aon_timer_t *aon_timer,
                                            dif_aon_timer_irq_t irq) {
   if (aon_timer == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_aon_timer_autogen.h b/sw/device/lib/dif/autogen/dif_aon_timer_autogen.h
index b147f92..4d4d5c3 100644
--- a/sw/device/lib/dif/autogen/dif_aon_timer_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_aon_timer_autogen.h
@@ -97,6 +97,17 @@
                                           bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param aon_timer A aon_timer handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_aon_timer_irq_acknowledge_all(
+    const dif_aon_timer_t *aon_timer);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_aon_timer_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_aon_timer_autogen_unittest.cc
index 4e1d8f9..81a5fa3 100644
--- a/sw/device/lib/dif/autogen/dif_aon_timer_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_aon_timer_autogen_unittest.cc
@@ -113,6 +113,19 @@
   EXPECT_FALSE(irq_state);
 }
 
+class AcknowledgeAllTest : public AonTimerTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_aon_timer_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(AON_TIMER_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_aon_timer_irq_acknowledge_all(&aon_timer_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public AonTimerTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_clkmgr_autogen.c b/sw/device/lib/dif/autogen/dif_clkmgr_autogen.c
index 68854a4..4bbc169 100644
--- a/sw/device/lib/dif/autogen/dif_clkmgr_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_clkmgr_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_clkmgr_autogen.h"
+#include <stdint.h>
 
 #include "clkmgr_regs.h"  // Generated.
 
diff --git a/sw/device/lib/dif/autogen/dif_csrng_autogen.c b/sw/device/lib/dif/autogen/dif_csrng_autogen.c
index 3122917..7470c84 100644
--- a/sw/device/lib/dif/autogen/dif_csrng_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_csrng_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_csrng_autogen.h"
+#include <stdint.h>
 
 #include "csrng_regs.h"  // Generated.
 
@@ -80,6 +81,19 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_csrng_irq_acknowledge_all(const dif_csrng_t *csrng) {
+  if (csrng == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(csrng->base_addr, CSRNG_INTR_STATE_REG_OFFSET,
+                      UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_csrng_irq_acknowledge(const dif_csrng_t *csrng,
                                        dif_csrng_irq_t irq) {
   if (csrng == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_csrng_autogen.h b/sw/device/lib/dif/autogen/dif_csrng_autogen.h
index 35989e0..ad5760f 100644
--- a/sw/device/lib/dif/autogen/dif_csrng_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_csrng_autogen.h
@@ -103,6 +103,16 @@
                                       dif_csrng_irq_t irq, bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param csrng A csrng handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_csrng_irq_acknowledge_all(const dif_csrng_t *csrng);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_csrng_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_csrng_autogen_unittest.cc
index 45b5c63..43a8420 100644
--- a/sw/device/lib/dif/autogen/dif_csrng_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_csrng_autogen_unittest.cc
@@ -111,6 +111,19 @@
   EXPECT_FALSE(irq_state);
 }
 
+class AcknowledgeAllTest : public CsrngTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_csrng_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(CSRNG_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_csrng_irq_acknowledge_all(&csrng_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public CsrngTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_edn_autogen.c b/sw/device/lib/dif/autogen/dif_edn_autogen.c
index c94f8c4..fb3d678 100644
--- a/sw/device/lib/dif/autogen/dif_edn_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_edn_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_edn_autogen.h"
+#include <stdint.h>
 
 #include "edn_regs.h"  // Generated.
 
@@ -74,6 +75,18 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_edn_irq_acknowledge_all(const dif_edn_t *edn) {
+  if (edn == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(edn->base_addr, EDN_INTR_STATE_REG_OFFSET, UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_edn_irq_acknowledge(const dif_edn_t *edn, dif_edn_irq_t irq) {
   if (edn == NULL) {
     return kDifBadArg;
diff --git a/sw/device/lib/dif/autogen/dif_edn_autogen.h b/sw/device/lib/dif/autogen/dif_edn_autogen.h
index c597a72..2eb73fa 100644
--- a/sw/device/lib/dif/autogen/dif_edn_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_edn_autogen.h
@@ -93,6 +93,16 @@
                                     bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param edn A edn handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_edn_irq_acknowledge_all(const dif_edn_t *edn);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_edn_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_edn_autogen_unittest.cc
index 94b2507..4f97d66 100644
--- a/sw/device/lib/dif/autogen/dif_edn_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_edn_autogen_unittest.cc
@@ -107,6 +107,19 @@
   EXPECT_FALSE(irq_state);
 }
 
+class AcknowledgeAllTest : public EdnTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_edn_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(EDN_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_edn_irq_acknowledge_all(&edn_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public EdnTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_entropy_src_autogen.c b/sw/device/lib/dif/autogen/dif_entropy_src_autogen.c
index 3c778c4..16637b0 100644
--- a/sw/device/lib/dif/autogen/dif_entropy_src_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_entropy_src_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_entropy_src_autogen.h"
+#include <stdint.h>
 
 #include "entropy_src_regs.h"  // Generated.
 
@@ -84,6 +85,20 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_entropy_src_irq_acknowledge_all(
+    const dif_entropy_src_t *entropy_src) {
+  if (entropy_src == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(entropy_src->base_addr, ENTROPY_SRC_INTR_STATE_REG_OFFSET,
+                      UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_entropy_src_irq_acknowledge(
     const dif_entropy_src_t *entropy_src, dif_entropy_src_irq_t irq) {
   if (entropy_src == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_entropy_src_autogen.h b/sw/device/lib/dif/autogen/dif_entropy_src_autogen.h
index cb4dcbb..1737759 100644
--- a/sw/device/lib/dif/autogen/dif_entropy_src_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_entropy_src_autogen.h
@@ -106,6 +106,17 @@
     bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param entropy_src A entropy_src handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_entropy_src_irq_acknowledge_all(
+    const dif_entropy_src_t *entropy_src);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_entropy_src_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_entropy_src_autogen_unittest.cc
index 0bd92c0..ba94362 100644
--- a/sw/device/lib/dif/autogen/dif_entropy_src_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_entropy_src_autogen_unittest.cc
@@ -116,6 +116,19 @@
   EXPECT_FALSE(irq_state);
 }
 
+class AcknowledgeAllTest : public EntropySrcTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_entropy_src_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(ENTROPY_SRC_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_entropy_src_irq_acknowledge_all(&entropy_src_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public EntropySrcTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_flash_ctrl_autogen.c b/sw/device/lib/dif/autogen/dif_flash_ctrl_autogen.c
index 2821933..1bb5414 100644
--- a/sw/device/lib/dif/autogen/dif_flash_ctrl_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_flash_ctrl_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_flash_ctrl_autogen.h"
+#include <stdint.h>
 
 #include "flash_ctrl_regs.h"  // Generated.
 
@@ -90,6 +91,20 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_flash_ctrl_irq_acknowledge_all(
+    const dif_flash_ctrl_t *flash_ctrl) {
+  if (flash_ctrl == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(flash_ctrl->base_addr, FLASH_CTRL_INTR_STATE_REG_OFFSET,
+                      UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_flash_ctrl_irq_acknowledge(const dif_flash_ctrl_t *flash_ctrl,
                                             dif_flash_ctrl_irq_t irq) {
   if (flash_ctrl == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_flash_ctrl_autogen.h b/sw/device/lib/dif/autogen/dif_flash_ctrl_autogen.h
index 6c00255..53138e6 100644
--- a/sw/device/lib/dif/autogen/dif_flash_ctrl_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_flash_ctrl_autogen.h
@@ -113,6 +113,17 @@
                                            bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param flash_ctrl A flash_ctrl handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_flash_ctrl_irq_acknowledge_all(
+    const dif_flash_ctrl_t *flash_ctrl);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_flash_ctrl_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_flash_ctrl_autogen_unittest.cc
index da13e31..aee21d3 100644
--- a/sw/device/lib/dif/autogen/dif_flash_ctrl_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_flash_ctrl_autogen_unittest.cc
@@ -114,6 +114,19 @@
   EXPECT_FALSE(irq_state);
 }
 
+class AcknowledgeAllTest : public FlashCtrlTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_flash_ctrl_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(FLASH_CTRL_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_flash_ctrl_irq_acknowledge_all(&flash_ctrl_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public FlashCtrlTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_gpio_autogen.c b/sw/device/lib/dif/autogen/dif_gpio_autogen.c
index dedf0e5..96ec467 100644
--- a/sw/device/lib/dif/autogen/dif_gpio_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_gpio_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_gpio_autogen.h"
+#include <stdint.h>
 
 #include "gpio_regs.h"  // Generated.
 
@@ -164,6 +165,18 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_gpio_irq_acknowledge_all(const dif_gpio_t *gpio) {
+  if (gpio == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(gpio->base_addr, GPIO_INTR_STATE_REG_OFFSET, UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_gpio_irq_acknowledge(const dif_gpio_t *gpio,
                                       dif_gpio_irq_t irq) {
   if (gpio == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_gpio_autogen.h b/sw/device/lib/dif/autogen/dif_gpio_autogen.h
index e882b5b..8f6f8dd 100644
--- a/sw/device/lib/dif/autogen/dif_gpio_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_gpio_autogen.h
@@ -120,6 +120,16 @@
                                      bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param gpio A gpio handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_gpio_irq_acknowledge_all(const dif_gpio_t *gpio);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_gpio_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_gpio_autogen_unittest.cc
index 53fb5d3..e339928 100644
--- a/sw/device/lib/dif/autogen/dif_gpio_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_gpio_autogen_unittest.cc
@@ -104,6 +104,19 @@
   EXPECT_FALSE(irq_state);
 }
 
+class AcknowledgeAllTest : public GpioTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_gpio_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(GPIO_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_gpio_irq_acknowledge_all(&gpio_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public GpioTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_hmac_autogen.c b/sw/device/lib/dif/autogen/dif_hmac_autogen.c
index 8be734b..fd4b395 100644
--- a/sw/device/lib/dif/autogen/dif_hmac_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_hmac_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_hmac_autogen.h"
+#include <stdint.h>
 
 #include "hmac_regs.h"  // Generated.
 
@@ -77,6 +78,18 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_hmac_irq_acknowledge_all(const dif_hmac_t *hmac) {
+  if (hmac == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(hmac->base_addr, HMAC_INTR_STATE_REG_OFFSET, UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_hmac_irq_acknowledge(const dif_hmac_t *hmac,
                                       dif_hmac_irq_t irq) {
   if (hmac == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_hmac_autogen.h b/sw/device/lib/dif/autogen/dif_hmac_autogen.h
index 8cda212..751f6fe 100644
--- a/sw/device/lib/dif/autogen/dif_hmac_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_hmac_autogen.h
@@ -97,6 +97,16 @@
                                      bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param hmac A hmac handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_hmac_irq_acknowledge_all(const dif_hmac_t *hmac);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_hmac_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_hmac_autogen_unittest.cc
index 0248b23..61fdbe3 100644
--- a/sw/device/lib/dif/autogen/dif_hmac_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_hmac_autogen_unittest.cc
@@ -106,6 +106,19 @@
   EXPECT_FALSE(irq_state);
 }
 
+class AcknowledgeAllTest : public HmacTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_hmac_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(HMAC_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_hmac_irq_acknowledge_all(&hmac_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public HmacTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_i2c_autogen.c b/sw/device/lib/dif/autogen/dif_i2c_autogen.c
index 50e1486..9c2228f 100644
--- a/sw/device/lib/dif/autogen/dif_i2c_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_i2c_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_i2c_autogen.h"
+#include <stdint.h>
 
 #include "i2c_regs.h"  // Generated.
 
@@ -116,6 +117,18 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_i2c_irq_acknowledge_all(const dif_i2c_t *i2c) {
+  if (i2c == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(i2c->base_addr, I2C_INTR_STATE_REG_OFFSET, UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_i2c_irq_acknowledge(const dif_i2c_t *i2c, dif_i2c_irq_t irq) {
   if (i2c == NULL) {
     return kDifBadArg;
diff --git a/sw/device/lib/dif/autogen/dif_i2c_autogen.h b/sw/device/lib/dif/autogen/dif_i2c_autogen.h
index 8dcdf71..4ae2e73 100644
--- a/sw/device/lib/dif/autogen/dif_i2c_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_i2c_autogen.h
@@ -152,6 +152,16 @@
                                     bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param i2c A i2c handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_i2c_irq_acknowledge_all(const dif_i2c_t *i2c);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_i2c_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_i2c_autogen_unittest.cc
index bfa0d2f..ae31c3e 100644
--- a/sw/device/lib/dif/autogen/dif_i2c_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_i2c_autogen_unittest.cc
@@ -107,6 +107,19 @@
   EXPECT_FALSE(irq_state);
 }
 
+class AcknowledgeAllTest : public I2cTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_i2c_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(I2C_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_i2c_irq_acknowledge_all(&i2c_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public I2cTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_keymgr_autogen.c b/sw/device/lib/dif/autogen/dif_keymgr_autogen.c
index 4eae9c2..41334ce 100644
--- a/sw/device/lib/dif/autogen/dif_keymgr_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_keymgr_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_keymgr_autogen.h"
+#include <stdint.h>
 
 #include "keymgr_regs.h"  // Generated.
 
@@ -72,6 +73,19 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_keymgr_irq_acknowledge_all(const dif_keymgr_t *keymgr) {
+  if (keymgr == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(keymgr->base_addr, KEYMGR_INTR_STATE_REG_OFFSET,
+                      UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_keymgr_irq_acknowledge(const dif_keymgr_t *keymgr,
                                         dif_keymgr_irq_t irq) {
   if (keymgr == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_keymgr_autogen.h b/sw/device/lib/dif/autogen/dif_keymgr_autogen.h
index 1524adc..1fdb422 100644
--- a/sw/device/lib/dif/autogen/dif_keymgr_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_keymgr_autogen.h
@@ -89,6 +89,16 @@
                                        dif_keymgr_irq_t irq, bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param keymgr A keymgr handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_keymgr_irq_acknowledge_all(const dif_keymgr_t *keymgr);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_keymgr_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_keymgr_autogen_unittest.cc
index c9e39b8..6042dce 100644
--- a/sw/device/lib/dif/autogen/dif_keymgr_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_keymgr_autogen_unittest.cc
@@ -101,6 +101,19 @@
   EXPECT_TRUE(irq_state);
 }
 
+class AcknowledgeAllTest : public KeymgrTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_keymgr_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(KEYMGR_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_keymgr_irq_acknowledge_all(&keymgr_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public KeymgrTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_kmac_autogen.c b/sw/device/lib/dif/autogen/dif_kmac_autogen.c
index e5fe7c6..ccaf16e 100644
--- a/sw/device/lib/dif/autogen/dif_kmac_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_kmac_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_kmac_autogen.h"
+#include <stdint.h>
 
 #include "kmac_regs.h"  // Generated.
 
@@ -77,6 +78,18 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_kmac_irq_acknowledge_all(const dif_kmac_t *kmac) {
+  if (kmac == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(kmac->base_addr, KMAC_INTR_STATE_REG_OFFSET, UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_kmac_irq_acknowledge(const dif_kmac_t *kmac,
                                       dif_kmac_irq_t irq) {
   if (kmac == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_kmac_autogen.h b/sw/device/lib/dif/autogen/dif_kmac_autogen.h
index 133f422..e8d8086 100644
--- a/sw/device/lib/dif/autogen/dif_kmac_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_kmac_autogen.h
@@ -97,6 +97,16 @@
                                      bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param kmac A kmac handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_kmac_irq_acknowledge_all(const dif_kmac_t *kmac);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_kmac_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_kmac_autogen_unittest.cc
index 08e9a3e..ebb6118 100644
--- a/sw/device/lib/dif/autogen/dif_kmac_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_kmac_autogen_unittest.cc
@@ -106,6 +106,19 @@
   EXPECT_FALSE(irq_state);
 }
 
+class AcknowledgeAllTest : public KmacTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_kmac_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(KMAC_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_kmac_irq_acknowledge_all(&kmac_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public KmacTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_lc_ctrl_autogen.c b/sw/device/lib/dif/autogen/dif_lc_ctrl_autogen.c
index e3cafbc..38a1fcc 100644
--- a/sw/device/lib/dif/autogen/dif_lc_ctrl_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_lc_ctrl_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_lc_ctrl_autogen.h"
+#include <stdint.h>
 
 #include "lc_ctrl_regs.h"  // Generated.
 
diff --git a/sw/device/lib/dif/autogen/dif_otbn_autogen.c b/sw/device/lib/dif/autogen/dif_otbn_autogen.c
index fec68e1..885a1d6 100644
--- a/sw/device/lib/dif/autogen/dif_otbn_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_otbn_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_otbn_autogen.h"
+#include <stdint.h>
 
 #include "otbn_regs.h"  // Generated.
 
@@ -71,6 +72,18 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_otbn_irq_acknowledge_all(const dif_otbn_t *otbn) {
+  if (otbn == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(otbn->base_addr, OTBN_INTR_STATE_REG_OFFSET, UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_otbn_irq_acknowledge(const dif_otbn_t *otbn,
                                       dif_otbn_irq_t irq) {
   if (otbn == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_otbn_autogen.h b/sw/device/lib/dif/autogen/dif_otbn_autogen.h
index c223364..63e4ea3 100644
--- a/sw/device/lib/dif/autogen/dif_otbn_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_otbn_autogen.h
@@ -89,6 +89,16 @@
                                      bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param otbn A otbn handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_otbn_irq_acknowledge_all(const dif_otbn_t *otbn);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_otbn_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_otbn_autogen_unittest.cc
index 041d35f..7740e0f 100644
--- a/sw/device/lib/dif/autogen/dif_otbn_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_otbn_autogen_unittest.cc
@@ -97,6 +97,19 @@
   EXPECT_TRUE(irq_state);
 }
 
+class AcknowledgeAllTest : public OtbnTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_otbn_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(OTBN_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_otbn_irq_acknowledge_all(&otbn_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public OtbnTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_otp_ctrl_autogen.c b/sw/device/lib/dif/autogen/dif_otp_ctrl_autogen.c
index 115e81e..4b4d545 100644
--- a/sw/device/lib/dif/autogen/dif_otp_ctrl_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_otp_ctrl_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_otp_ctrl_autogen.h"
+#include <stdint.h>
 
 #include "otp_ctrl_regs.h"  // Generated.
 
@@ -78,6 +79,19 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_otp_ctrl_irq_acknowledge_all(const dif_otp_ctrl_t *otp_ctrl) {
+  if (otp_ctrl == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(otp_ctrl->base_addr, OTP_CTRL_INTR_STATE_REG_OFFSET,
+                      UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_otp_ctrl_irq_acknowledge(const dif_otp_ctrl_t *otp_ctrl,
                                           dif_otp_ctrl_irq_t irq) {
   if (otp_ctrl == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_otp_ctrl_autogen.h b/sw/device/lib/dif/autogen/dif_otp_ctrl_autogen.h
index ca53edf..d5f6a10 100644
--- a/sw/device/lib/dif/autogen/dif_otp_ctrl_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_otp_ctrl_autogen.h
@@ -97,6 +97,16 @@
                                          bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param otp_ctrl A otp_ctrl handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_otp_ctrl_irq_acknowledge_all(const dif_otp_ctrl_t *otp_ctrl);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_otp_ctrl_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_otp_ctrl_autogen_unittest.cc
index 62b7400..bd3ef54 100644
--- a/sw/device/lib/dif/autogen/dif_otp_ctrl_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_otp_ctrl_autogen_unittest.cc
@@ -113,6 +113,19 @@
   EXPECT_FALSE(irq_state);
 }
 
+class AcknowledgeAllTest : public OtpCtrlTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_otp_ctrl_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(OTP_CTRL_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_otp_ctrl_irq_acknowledge_all(&otp_ctrl_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public OtpCtrlTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_pattgen_autogen.c b/sw/device/lib/dif/autogen/dif_pattgen_autogen.c
index 03dfc0a..c0f7966 100644
--- a/sw/device/lib/dif/autogen/dif_pattgen_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_pattgen_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_pattgen_autogen.h"
+#include <stdint.h>
 
 #include "pattgen_regs.h"  // Generated.
 
@@ -76,6 +77,19 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_pattgen_irq_acknowledge_all(const dif_pattgen_t *pattgen) {
+  if (pattgen == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(pattgen->base_addr, PATTGEN_INTR_STATE_REG_OFFSET,
+                      UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_pattgen_irq_acknowledge(const dif_pattgen_t *pattgen,
                                          dif_pattgen_irq_t irq) {
   if (pattgen == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_pattgen_autogen.h b/sw/device/lib/dif/autogen/dif_pattgen_autogen.h
index 13764a4..8cc82e2 100644
--- a/sw/device/lib/dif/autogen/dif_pattgen_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_pattgen_autogen.h
@@ -94,6 +94,16 @@
                                         bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param pattgen A pattgen handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_pattgen_irq_acknowledge_all(const dif_pattgen_t *pattgen);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_pattgen_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_pattgen_autogen_unittest.cc
index d7f6fb9..8756473 100644
--- a/sw/device/lib/dif/autogen/dif_pattgen_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_pattgen_autogen_unittest.cc
@@ -111,6 +111,19 @@
   EXPECT_FALSE(irq_state);
 }
 
+class AcknowledgeAllTest : public PattgenTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_pattgen_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(PATTGEN_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_pattgen_irq_acknowledge_all(&pattgen_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public PattgenTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_pinmux_autogen.c b/sw/device/lib/dif/autogen/dif_pinmux_autogen.c
index aa49412..90f5901 100644
--- a/sw/device/lib/dif/autogen/dif_pinmux_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_pinmux_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_pinmux_autogen.h"
+#include <stdint.h>
 
 #include "pinmux_regs.h"  // Generated.
 
diff --git a/sw/device/lib/dif/autogen/dif_pwrmgr_autogen.c b/sw/device/lib/dif/autogen/dif_pwrmgr_autogen.c
index d466a00..822cf37 100644
--- a/sw/device/lib/dif/autogen/dif_pwrmgr_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_pwrmgr_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_pwrmgr_autogen.h"
+#include <stdint.h>
 
 #include "pwrmgr_regs.h"  // Generated.
 
@@ -72,6 +73,19 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_pwrmgr_irq_acknowledge_all(const dif_pwrmgr_t *pwrmgr) {
+  if (pwrmgr == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(pwrmgr->base_addr, PWRMGR_INTR_STATE_REG_OFFSET,
+                      UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_pwrmgr_irq_acknowledge(const dif_pwrmgr_t *pwrmgr,
                                         dif_pwrmgr_irq_t irq) {
   if (pwrmgr == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_pwrmgr_autogen.h b/sw/device/lib/dif/autogen/dif_pwrmgr_autogen.h
index aac2334..9cbe87c 100644
--- a/sw/device/lib/dif/autogen/dif_pwrmgr_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_pwrmgr_autogen.h
@@ -89,6 +89,16 @@
                                        dif_pwrmgr_irq_t irq, bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param pwrmgr A pwrmgr handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_pwrmgr_irq_acknowledge_all(const dif_pwrmgr_t *pwrmgr);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_pwrmgr_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_pwrmgr_autogen_unittest.cc
index b1afe02..029e4b7 100644
--- a/sw/device/lib/dif/autogen/dif_pwrmgr_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_pwrmgr_autogen_unittest.cc
@@ -101,6 +101,19 @@
   EXPECT_TRUE(irq_state);
 }
 
+class AcknowledgeAllTest : public PwrmgrTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_pwrmgr_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(PWRMGR_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_pwrmgr_irq_acknowledge_all(&pwrmgr_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public PwrmgrTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_rstmgr_autogen.c b/sw/device/lib/dif/autogen/dif_rstmgr_autogen.c
index 75ce85e..23cf29a 100644
--- a/sw/device/lib/dif/autogen/dif_rstmgr_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_rstmgr_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_rstmgr_autogen.h"
+#include <stdint.h>
 
 #include "rstmgr_regs.h"  // Generated.
 
diff --git a/sw/device/lib/dif/autogen/dif_rv_plic_autogen.c b/sw/device/lib/dif/autogen/dif_rv_plic_autogen.c
index 0420518..4227b31 100644
--- a/sw/device/lib/dif/autogen/dif_rv_plic_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_rv_plic_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_rv_plic_autogen.h"
+#include <stdint.h>
 
 #include "rv_plic_regs.h"  // Generated.
 
diff --git a/sw/device/lib/dif/autogen/dif_rv_timer_autogen.c b/sw/device/lib/dif/autogen/dif_rv_timer_autogen.c
index 588d0a0..e0b43e0 100644
--- a/sw/device/lib/dif/autogen/dif_rv_timer_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_rv_timer_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_rv_timer_autogen.h"
+#include <stdint.h>
 
 #include "rv_timer_regs.h"  // Generated.
 
@@ -135,6 +136,27 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_rv_timer_irq_acknowledge_all(const dif_rv_timer_t *rv_timer,
+                                              uint32_t hart_id) {
+  if (rv_timer == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  switch (hart_id) {
+    case 0:
+      mmio_region_write32(rv_timer->base_addr, RV_TIMER_INTR_STATE0_REG_OFFSET,
+                          UINT32_MAX);
+
+      break;
+    default:
+      return kDifBadArg;
+  }
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_rv_timer_irq_acknowledge(const dif_rv_timer_t *rv_timer,
                                           dif_rv_timer_irq_t irq) {
   if (rv_timer == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_rv_timer_autogen.h b/sw/device/lib/dif/autogen/dif_rv_timer_autogen.h
index 418eaad..0a9a8ae 100644
--- a/sw/device/lib/dif/autogen/dif_rv_timer_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_rv_timer_autogen.h
@@ -93,6 +93,17 @@
                                          bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param rv_timer A rv_timer handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_rv_timer_irq_acknowledge_all(const dif_rv_timer_t *rv_timer,
+                                              uint32_t hart_id);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_rv_timer_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_rv_timer_autogen_unittest.cc
index 093419f..1070e96 100644
--- a/sw/device/lib/dif/autogen/dif_rv_timer_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_rv_timer_autogen_unittest.cc
@@ -103,6 +103,23 @@
   EXPECT_TRUE(irq_state);
 }
 
+class AcknowledgeAllTest : public RvTimerTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_rv_timer_irq_acknowledge_all(nullptr, 0), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, BadHartId) {
+  EXPECT_EQ(dif_rv_timer_irq_acknowledge_all(nullptr, 1), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(RV_TIMER_INTR_STATE0_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_rv_timer_irq_acknowledge_all(&rv_timer_, 0), kDifOk);
+}
+
 class IrqAcknowledgeTest : public RvTimerTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_spi_device_autogen.c b/sw/device/lib/dif/autogen/dif_spi_device_autogen.c
index 9b730c6..3b5c40d 100644
--- a/sw/device/lib/dif/autogen/dif_spi_device_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_spi_device_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_spi_device_autogen.h"
+#include <stdint.h>
 
 #include "spi_device_regs.h"  // Generated.
 
@@ -93,6 +94,20 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_spi_device_irq_acknowledge_all(
+    const dif_spi_device_t *spi_device) {
+  if (spi_device == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(spi_device->base_addr, SPI_DEVICE_INTR_STATE_REG_OFFSET,
+                      UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_spi_device_irq_acknowledge(const dif_spi_device_t *spi_device,
                                             dif_spi_device_irq_t irq) {
   if (spi_device == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_spi_device_autogen.h b/sw/device/lib/dif/autogen/dif_spi_device_autogen.h
index 1db65bf..4e99b8e 100644
--- a/sw/device/lib/dif/autogen/dif_spi_device_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_spi_device_autogen.h
@@ -117,6 +117,17 @@
                                            bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param spi_device A spi_device handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_spi_device_irq_acknowledge_all(
+    const dif_spi_device_t *spi_device);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_spi_device_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_spi_device_autogen_unittest.cc
index 151f208..00a3220 100644
--- a/sw/device/lib/dif/autogen/dif_spi_device_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_spi_device_autogen_unittest.cc
@@ -114,6 +114,19 @@
   EXPECT_FALSE(irq_state);
 }
 
+class AcknowledgeAllTest : public SpiDeviceTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_spi_device_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(SPI_DEVICE_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_spi_device_irq_acknowledge_all(&spi_device_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public SpiDeviceTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_spi_host_autogen.c b/sw/device/lib/dif/autogen/dif_spi_host_autogen.c
index d809857..37c6570 100644
--- a/sw/device/lib/dif/autogen/dif_spi_host_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_spi_host_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_spi_host_autogen.h"
+#include <stdint.h>
 
 #include "spi_host_regs.h"  // Generated.
 
@@ -78,6 +79,19 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_spi_host_irq_acknowledge_all(const dif_spi_host_t *spi_host) {
+  if (spi_host == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(spi_host->base_addr, SPI_HOST_INTR_STATE_REG_OFFSET,
+                      UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_spi_host_irq_acknowledge(const dif_spi_host_t *spi_host,
                                           dif_spi_host_irq_t irq) {
   if (spi_host == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_spi_host_autogen.h b/sw/device/lib/dif/autogen/dif_spi_host_autogen.h
index eb1813c..fe91aac 100644
--- a/sw/device/lib/dif/autogen/dif_spi_host_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_spi_host_autogen.h
@@ -96,6 +96,16 @@
                                          bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param spi_host A spi_host handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_spi_host_irq_acknowledge_all(const dif_spi_host_t *spi_host);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_spi_host_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_spi_host_autogen_unittest.cc
index 32a96de..34842b6 100644
--- a/sw/device/lib/dif/autogen/dif_spi_host_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_spi_host_autogen_unittest.cc
@@ -112,6 +112,19 @@
   EXPECT_FALSE(irq_state);
 }
 
+class AcknowledgeAllTest : public SpiHostTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_spi_host_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(SPI_HOST_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_spi_host_irq_acknowledge_all(&spi_host_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public SpiHostTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_sram_ctrl_autogen.c b/sw/device/lib/dif/autogen/dif_sram_ctrl_autogen.c
index bb61bcf..622c741 100644
--- a/sw/device/lib/dif/autogen/dif_sram_ctrl_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_sram_ctrl_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_sram_ctrl_autogen.h"
+#include <stdint.h>
 
 #include "sram_ctrl_regs.h"  // Generated.
 
diff --git a/sw/device/lib/dif/autogen/dif_sysrst_ctrl_autogen.c b/sw/device/lib/dif/autogen/dif_sysrst_ctrl_autogen.c
index 2e2fb5e..eb83c0c 100644
--- a/sw/device/lib/dif/autogen/dif_sysrst_ctrl_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_sysrst_ctrl_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_sysrst_ctrl_autogen.h"
+#include <stdint.h>
 
 #include "sysrst_ctrl_regs.h"  // Generated.
 
@@ -75,6 +76,20 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_sysrst_ctrl_irq_acknowledge_all(
+    const dif_sysrst_ctrl_t *sysrst_ctrl) {
+  if (sysrst_ctrl == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(sysrst_ctrl->base_addr, SYSRST_CTRL_INTR_STATE_REG_OFFSET,
+                      UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_sysrst_ctrl_irq_acknowledge(
     const dif_sysrst_ctrl_t *sysrst_ctrl, dif_sysrst_ctrl_irq_t irq) {
   if (sysrst_ctrl == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_sysrst_ctrl_autogen.h b/sw/device/lib/dif/autogen/dif_sysrst_ctrl_autogen.h
index 1e6d0ad..f4ae2f5 100644
--- a/sw/device/lib/dif/autogen/dif_sysrst_ctrl_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_sysrst_ctrl_autogen.h
@@ -93,6 +93,17 @@
     bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param sysrst_ctrl A sysrst_ctrl handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_sysrst_ctrl_irq_acknowledge_all(
+    const dif_sysrst_ctrl_t *sysrst_ctrl);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_sysrst_ctrl_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_sysrst_ctrl_autogen_unittest.cc
index 1ea17d9..e84023c 100644
--- a/sw/device/lib/dif/autogen/dif_sysrst_ctrl_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_sysrst_ctrl_autogen_unittest.cc
@@ -107,6 +107,19 @@
   EXPECT_TRUE(irq_state);
 }
 
+class AcknowledgeAllTest : public SysrstCtrlTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_sysrst_ctrl_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(SYSRST_CTRL_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_sysrst_ctrl_irq_acknowledge_all(&sysrst_ctrl_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public SysrstCtrlTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_uart_autogen.c b/sw/device/lib/dif/autogen/dif_uart_autogen.c
index 9cab168..6eb7cbe 100644
--- a/sw/device/lib/dif/autogen/dif_uart_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_uart_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_uart_autogen.h"
+#include <stdint.h>
 
 #include "uart_regs.h"  // Generated.
 
@@ -92,6 +93,18 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_uart_irq_acknowledge_all(const dif_uart_t *uart) {
+  if (uart == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(uart->base_addr, UART_INTR_STATE_REG_OFFSET, UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_uart_irq_acknowledge(const dif_uart_t *uart,
                                       dif_uart_irq_t irq) {
   if (uart == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_uart_autogen.h b/sw/device/lib/dif/autogen/dif_uart_autogen.h
index 880e1ab..29fed35 100644
--- a/sw/device/lib/dif/autogen/dif_uart_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_uart_autogen.h
@@ -118,6 +118,16 @@
                                      bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param uart A uart handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_uart_irq_acknowledge_all(const dif_uart_t *uart);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_uart_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_uart_autogen_unittest.cc
index e439237..bbc01e2 100644
--- a/sw/device/lib/dif/autogen/dif_uart_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_uart_autogen_unittest.cc
@@ -107,6 +107,19 @@
   EXPECT_FALSE(irq_state);
 }
 
+class AcknowledgeAllTest : public UartTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_uart_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(UART_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_uart_irq_acknowledge_all(&uart_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public UartTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/sw/device/lib/dif/autogen/dif_usbdev_autogen.c b/sw/device/lib/dif/autogen/dif_usbdev_autogen.c
index c25af29..2d9e1dd 100644
--- a/sw/device/lib/dif/autogen/dif_usbdev_autogen.c
+++ b/sw/device/lib/dif/autogen/dif_usbdev_autogen.c
@@ -5,6 +5,7 @@
 // This file is auto-generated.
 
 #include "sw/device/lib/dif/autogen/dif_usbdev_autogen.h"
+#include <stdint.h>
 
 #include "usbdev_regs.h"  // Generated.
 
@@ -120,6 +121,19 @@
 }
 
 OT_WARN_UNUSED_RESULT
+dif_result_t dif_usbdev_irq_acknowledge_all(const dif_usbdev_t *usbdev) {
+  if (usbdev == NULL) {
+    return kDifBadArg;
+  }
+
+  // Writing to the register clears the corresponding bits (Write-one clear).
+  mmio_region_write32(usbdev->base_addr, USBDEV_INTR_STATE_REG_OFFSET,
+                      UINT32_MAX);
+
+  return kDifOk;
+}
+
+OT_WARN_UNUSED_RESULT
 dif_result_t dif_usbdev_irq_acknowledge(const dif_usbdev_t *usbdev,
                                         dif_usbdev_irq_t irq) {
   if (usbdev == NULL) {
diff --git a/sw/device/lib/dif/autogen/dif_usbdev_autogen.h b/sw/device/lib/dif/autogen/dif_usbdev_autogen.h
index 7322ec4..f5cf67f 100644
--- a/sw/device/lib/dif/autogen/dif_usbdev_autogen.h
+++ b/sw/device/lib/dif/autogen/dif_usbdev_autogen.h
@@ -165,6 +165,16 @@
                                        dif_usbdev_irq_t irq, bool *is_pending);
 
 /**
+ * Acknowledges all interrupts, indicating to the hardware that all
+ * interrupts have been successfully serviced.
+ *
+ * @param usbdev A usbdev handle.
+ * @return The result of the operation.
+ */
+OT_WARN_UNUSED_RESULT
+dif_result_t dif_usbdev_irq_acknowledge_all(const dif_usbdev_t *usbdev);
+
+/**
  * Acknowledges a particular interrupt, indicating to the hardware that it has
  * been successfully serviced.
  *
diff --git a/sw/device/lib/dif/autogen/dif_usbdev_autogen_unittest.cc b/sw/device/lib/dif/autogen/dif_usbdev_autogen_unittest.cc
index 3edaf90..281d952 100644
--- a/sw/device/lib/dif/autogen/dif_usbdev_autogen_unittest.cc
+++ b/sw/device/lib/dif/autogen/dif_usbdev_autogen_unittest.cc
@@ -112,6 +112,19 @@
   EXPECT_FALSE(irq_state);
 }
 
+class AcknowledgeAllTest : public UsbdevTest {};
+
+TEST_F(AcknowledgeAllTest, NullArgs) {
+  EXPECT_EQ(dif_usbdev_irq_acknowledge_all(nullptr), kDifBadArg);
+}
+
+TEST_F(AcknowledgeAllTest, Success) {
+  EXPECT_WRITE32(USBDEV_INTR_STATE_REG_OFFSET,
+                 std::numeric_limits<uint32_t>::max());
+
+  EXPECT_EQ(dif_usbdev_irq_acknowledge_all(&usbdev_), kDifOk);
+}
+
 class IrqAcknowledgeTest : public UsbdevTest {};
 
 TEST_F(IrqAcknowledgeTest, NullArgs) {
diff --git a/util/make_new_dif/dif_autogen.c.tpl b/util/make_new_dif/dif_autogen.c.tpl
index 847735c..56211f5 100644
--- a/util/make_new_dif/dif_autogen.c.tpl
+++ b/util/make_new_dif/dif_autogen.c.tpl
@@ -26,6 +26,7 @@
 
 // This file is auto-generated.
 
+#include <stdint.h>
 #include "sw/device/lib/dif/autogen/dif_${ip.name_snake}_autogen.h"
 
 #include "${ip.name_snake}_regs.h"  // Generated.
@@ -206,6 +207,36 @@
   }
 
   OT_WARN_UNUSED_RESULT
+  dif_result_t dif_${ip.name_snake}_irq_acknowledge_all(
+    const dif_${ip.name_snake}_t *${ip.name_snake}
+  % if ip.name_snake == "rv_timer":
+    , uint32_t hart_id
+  % endif
+    ) {
+
+    if (${ip.name_snake} == NULL) {
+      return kDifBadArg;
+    }
+
+    // Writing to the register clears the corresponding bits (Write-one clear).
+  % if ip.name_snake == "rv_timer":
+    switch (hart_id) {
+      % for hart_id in range(int(ip.parameters["N_HARTS"].default)):
+        case ${hart_id}:
+          ${mmio_region_write32("RV_TIMER_INTR_STATE%d_REG_OFFSET" % hart_id, "UINT32_MAX")}
+          break;
+      % endfor
+      default:
+        return kDifBadArg;
+    }
+  % else:
+    ${mmio_region_write32(ip.name_upper + "_INTR_STATE_REG_OFFSET", "UINT32_MAX")}
+  % endif
+
+    return kDifOk;
+  }
+
+  OT_WARN_UNUSED_RESULT
   dif_result_t dif_${ip.name_snake}_irq_acknowledge(
     const dif_${ip.name_snake}_t *${ip.name_snake},
     dif_${ip.name_snake}_irq_t irq) {
diff --git a/util/make_new_dif/dif_autogen.h.tpl b/util/make_new_dif/dif_autogen.h.tpl
index af12dc1..55167d4 100644
--- a/util/make_new_dif/dif_autogen.h.tpl
+++ b/util/make_new_dif/dif_autogen.h.tpl
@@ -130,6 +130,21 @@
     bool *is_pending);
 
   /**
+   * Acknowledges all interrupts, indicating to the hardware that all
+   * interrupts have been successfully serviced.
+   *
+   * @param ${ip.name_snake} A ${ip.name_snake} handle.
+   * @return The result of the operation.
+   */
+  OT_WARN_UNUSED_RESULT
+  dif_result_t dif_${ip.name_snake}_irq_acknowledge_all(
+    const dif_${ip.name_snake}_t *${ip.name_snake}
+  % if ip.name_snake == "rv_timer":
+    , uint32_t hart_id
+  % endif
+    );
+
+  /**
    * Acknowledges a particular interrupt, indicating to the hardware that it has
    * been successfully serviced.
    *
diff --git a/util/make_new_dif/dif_autogen_unittest.cc.tpl b/util/make_new_dif/dif_autogen_unittest.cc.tpl
index cd3ecf8..7017614 100644
--- a/util/make_new_dif/dif_autogen_unittest.cc.tpl
+++ b/util/make_new_dif/dif_autogen_unittest.cc.tpl
@@ -221,6 +221,43 @@
   % endif
   }
 
+  class AcknowledgeAllTest : public ${ip.name_camel}Test {};
+
+  TEST_F(AcknowledgeAllTest, NullArgs) {
+    EXPECT_EQ(dif_${ip.name_snake}_irq_acknowledge_all(
+        nullptr 
+      % if ip.name_snake == "rv_timer":
+        , 0
+      % endif
+        ),
+      kDifBadArg);
+  }
+
+  % if ip.name_snake == "rv_timer":
+  TEST_F(AcknowledgeAllTest, BadHartId) {
+    EXPECT_EQ(dif_${ip.name_snake}_irq_acknowledge_all(
+        nullptr, ${ip.parameters["N_HARTS"].default}),
+      kDifBadArg);
+  }
+  % endif
+
+  TEST_F(AcknowledgeAllTest, Success) {
+  % if ip.name_snake == "rv_timer":
+    EXPECT_WRITE32(${ip.name_upper}_INTR_STATE0_REG_OFFSET, 
+  % else:
+    EXPECT_WRITE32(${ip.name_upper}_INTR_STATE_REG_OFFSET,
+  % endif
+      std::numeric_limits<uint32_t>::max());
+
+    EXPECT_EQ(dif_${ip.name_snake}_irq_acknowledge_all(
+        &${ip.name_snake}_ 
+      % if ip.name_snake == "rv_timer":
+        , 0
+      % endif
+        ),
+      kDifOk);
+  }
+
   class IrqAcknowledgeTest : public ${ip.name_camel}Test {};
 
   TEST_F(IrqAcknowledgeTest, NullArgs) {