jlaitine opened a new pull request, #15878:
URL: https://github.com/apache/nuttx/pull/15878

   
   ## Summary
   
   - Move PLIC interrupt enable and disable functions into mpfs_plic.c
   - Remove race conditions between irq enable/disable by adding spinlock
     - An interrupt may trigger on one hart in the middle of enabling the 
interrupts - then the interrupt handler might call up_disable_irq.
   
   - When enabling interrupts, always clear pending interrupt:
   
   A pending interrupt would trigger immediately when enabling the interrupt 
source, but this is not expected. The interrupt source is level sensitive, so 
it should only trigger if the source is active at the time when it is enabled. 
Not if it was active sometime in the past but inactive at the time when the IRQ 
is enabled.
   
   The issue becomes with devices where the interrupt source (the line 
connected to the PLIC) can't be masked / controlled, but the IRQ itself needs 
to be just enabled/disabled at the times when you know the line status is 
valid. If the source toggles while the PLIC interrupt is disabled or the 
interrupt is disabled when the line is active, the interrupt would always 
trigger right away when next time enabling the IRQ even if the irq source is 
inactive at that time.
   
   The way how PLIC is designed is such that a pending interrupt can't be 
cleared. Clearing a pending interrupt can only be done by handling the 
interrupt (claiming it, and then acking it). Claiming an interrupt is only 
legal when the interrupt is enabled.
   
   The issue with such pending interrupts is now handled as follows:
   
   1. When enabling interrupts, check if there is a pending one, and do the 
following steps for the pending irq
   2. Raise the priority of the pending interrupt to the maximum. This moves 
the pending irq to the head of the claim queue in PLIC when the source is 
enabled
   3. Enable the PLIC irq source for the pending one on the current hart (the 
irq suorce needs to be enabled for steps 4. and 5)
   4. Claim the next interrupt from PLIC (this is now always the pending one, 
due to 2. and no other hart has claimed it since all sources on other harts are 
disabled)
   5. Ack the pending IRQ
   6. Lower the PLIC IRQ priority back to normal
   7. Proceed on enabling the interrupts on the other harts.
   
   ## Impact
   
   Impacts only MPFS targets. Fixes issues when trying to disable PLIC 
interrupt from interrupt handler, and issues of receiving an extra interrupt 
when enabling interrupts.
   
   ## Testing
   
   Desk-tested on a custom MPFS board and on a Microchip MPFS Icicle board, 
using CONFIG_BUILD_FLAT and both CONFIG_SMP=y and CONFIG_SMP=n
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to