From 02d317a3f47853f6d2c4338a90257739cddd5b41 Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Sat, 7 Feb 2026 14:20:06 +0000 Subject: [PATCH 1/2] arm: add nvic_disable_irq_sync() Disabling an IRQ in the NVIC may not take effect right away; if the IRQ is being disabled to implement a critical section it's necessary to follow up with dsb + isb to serialize the NVIC update. Add a helper function for doing this. Change-Id: Iaaa238ad39997cc3c6d62867d265cf9e9e0e5c4b --- firmware/target/arm/nvic-arm.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/firmware/target/arm/nvic-arm.h b/firmware/target/arm/nvic-arm.h index 57a16f43aa..f695279e8c 100644 --- a/firmware/target/arm/nvic-arm.h +++ b/firmware/target/arm/nvic-arm.h @@ -43,6 +43,13 @@ static inline void nvic_disable_irq(int nr) reg_var(CM_NVIC_ICER(reg)) = BIT_N(bit); } +static inline void nvic_disable_irq_sync(int nr) +{ + nvic_disable_irq(nr); + arm_dsb(); + arm_isb(); +} + static inline void nvic_set_pending_irq(int nr) { int reg = nr / 32; From c9d468d9248f12a9b7f6ae14d17fd2adb1825040 Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Tue, 17 Feb 2026 09:57:46 +0000 Subject: [PATCH 2/2] stm32h7: use nvic_disable_irq_sync for usb interrupt Change-Id: I583b860f4b1696d4be84b0bf858a8b857d891aea --- firmware/target/arm/stm32/usb-stm32h7.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/firmware/target/arm/stm32/usb-stm32h7.c b/firmware/target/arm/stm32/usb-stm32h7.c index 94611c3940..983389b54c 100644 --- a/firmware/target/arm/stm32/usb-stm32h7.c +++ b/firmware/target/arm/stm32/usb-stm32h7.c @@ -172,8 +172,7 @@ void usb_dw_target_enable_irq(void) void usb_dw_target_disable_irq(void) { - nvic_disable_irq(IRQN_USB); - arm_dsb(); + nvic_disable_irq_sync(IRQN_USB); } void usb_dw_target_clear_irq(void)