This is an automated email from the ASF dual-hosted git repository.

acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new ff4d461fda mpfs_irq.c: Interrupt claim must be cleared before 
disabling the source
ff4d461fda is described below

commit ff4d461fdaed36db9e6acfe3aabb7b418b0608c2
Author: Ville Juven <[email protected]>
AuthorDate: Tue Feb 18 11:14:05 2025 +0200

    mpfs_irq.c: Interrupt claim must be cleared before disabling the source
    
    From Polarfire SoC TRM:
    
    6.5.8 Interrupt Completion
    
    To signal the completion of executing an interrupt handler, the processor 
core writes the received interrupt ID to the
    Claim/Complete register. The PLIC does not check whether the completion ID 
is the same as the last claim ID for that
    target. If the completion ID does not match an interrupt source that is 
currently enabled for the target, the completion
    is ignored.
    
    The last paragraph clearly states that IRQ completion does not work for
    sources that have been disabled -> must ACK the completion before disable.
    
    Signed-off-by: Ville Juven <[email protected]>
---
 arch/risc-v/src/mpfs/mpfs_irq.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/arch/risc-v/src/mpfs/mpfs_irq.c b/arch/risc-v/src/mpfs/mpfs_irq.c
index 36b48c7d59..b9a7e4a4eb 100644
--- a/arch/risc-v/src/mpfs/mpfs_irq.c
+++ b/arch/risc-v/src/mpfs/mpfs_irq.c
@@ -133,13 +133,22 @@ void up_disable_irq(int irq)
           uintptr_t claim_address =
             mpfs_plic_get_claimbase(riscv_cpuid_to_hartid(i));
 
-          /* Clear enable bit for the irq */
+          /* Clear any already claimed IRQ (this must be done BEFORE
+           * disabling the interrupt source):
+           *
+           * To signal the completion of executing an interrupt handler, the
+           * processor core writes the received interrupt ID to the
+           * Claim/Complete register. The PLIC does not check whether the
+           * completion ID is the same as the last claim ID for that target.
+           * If the completion ID does not match an interrupt source that is
+           * currently enabled for the target, the completion is ignored.
+           */
 
-          modifyreg32(iebase + (4 * (extirq / 32)), 1 << (extirq % 32), 0);
+          putreg32(extirq, claim_address);
 
-          /* Clear any already claimed IRQ */
+          /* Clear enable bit for the irq */
 
-          putreg32(extirq, claim_address);
+          modifyreg32(iebase + (4 * (extirq / 32)), 1 << (extirq % 32), 0);
         }
     }
 }

Reply via email to