Author: wma
Date: Fri May 19 08:25:40 2017
New Revision: 318525
URL: https://svnweb.freebsd.org/changeset/base/318525

Log:
  Fix MPIC mask/unmask
  
  Before the fix for single interrupt, both percpu and non-percpu routes
  were enabled/disable at the same time.
  
  Submitted by:  Marcin Wojtas <m...@semihalf.com
  Obtained from: Semihalf
  Sponsored by:  Stormshield, Netgate
  Reviewed by:   loos
  Differential revision: https://reviews.freebsd.org/D10716

Modified:
  head/sys/arm/mv/mpic.c

Modified: head/sys/arm/mv/mpic.c
==============================================================================
--- head/sys/arm/mv/mpic.c      Fri May 19 08:24:23 2017        (r318524)
+++ head/sys/arm/mv/mpic.c      Fri May 19 08:25:40 2017        (r318525)
@@ -148,6 +148,7 @@ static void mpic_unmask_irq(uintptr_t nb
 static void    mpic_mask_irq(uintptr_t nb);
 static void    mpic_mask_irq_err(uintptr_t nb);
 static void    mpic_unmask_irq_err(uintptr_t nb);
+static boolean_t mpic_irq_is_percpu(uintptr_t);
 #ifdef INTRNG
 static int     mpic_intr(void *arg);
 #endif
@@ -474,14 +475,24 @@ mpic_mask_irq_err(uintptr_t nb)
        MPIC_CPU_WRITE(mv_mpic_sc, MPIC_ERR_MASK, mask);
 }
 
+static boolean_t
+mpic_irq_is_percpu(uintptr_t nb)
+{
+       if (nb < MPIC_PPI)
+               return TRUE;
+
+       return FALSE;
+}
+
 static void
 mpic_unmask_irq(uintptr_t nb)
 {
 
-       if (nb < ERR_IRQ) {
-               MPIC_WRITE(mv_mpic_sc, MPIC_ISE, nb);
+       if (mpic_irq_is_percpu(nb))
                MPIC_CPU_WRITE(mv_mpic_sc, MPIC_ICM, nb);
-       } else if (nb < MSI_IRQ)
+       else if (nb < ERR_IRQ)
+               MPIC_WRITE(mv_mpic_sc, MPIC_ISE, nb);
+       else if (nb < MSI_IRQ)
                mpic_unmask_irq_err(nb);
 
        if (nb == 0)
@@ -492,10 +503,11 @@ static void
 mpic_mask_irq(uintptr_t nb)
 {
 
-       if (nb < ERR_IRQ) {
-               MPIC_WRITE(mv_mpic_sc, MPIC_ICE, nb);
+       if (mpic_irq_is_percpu(nb))
                MPIC_CPU_WRITE(mv_mpic_sc, MPIC_ISM, nb);
-       } else if (nb < MSI_IRQ)
+       else if (nb < ERR_IRQ)
+               MPIC_WRITE(mv_mpic_sc, MPIC_ICE, nb);
+       else if (nb < MSI_IRQ)
                mpic_mask_irq_err(nb);
 }
 
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to