[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) {