arm: better handling of IRQ priorities reserved by the kernel

There are now three flags that decide how many priorities are reserved
by the kernel, each one requiring one priority level: Zero Latency
Interrupts, BASEPRI locking (for SVC usage) and faults that are not at
priority -1, so that taking them in an ISR actually triggers the fault
synchronously.

Change-Id: I7f4d760c9110051aeb82dcfd8cd68026a9b74b54
Signed-off-by: Benjamin Walsh <benjamin.walsh@windriver.com>
diff --git a/include/arch/arm/cortex_m/nvic.h b/include/arch/arm/cortex_m/nvic.h
index 1cc0a13..4deaf8e 100644
--- a/include/arch/arm/cortex_m/nvic.h
+++ b/include/arch/arm/cortex_m/nvic.h
@@ -46,12 +46,29 @@
 /* for assembler, only works with constants */
 #define _EXC_PRIO(pri) (((pri) << (8 - CONFIG_NUM_IRQ_PRIO_BITS)) & 0xff)
 
-#if defined(CONFIG_ZERO_LATENCY_IRQS)
-#define _IRQ_PRIO_OFFSET 3
+#ifdef CONFIG_ZERO_LATENCY_IRQS
+#define ZERO_LATENCY_IRQS_RESERVED_PRIO 1
 #else
-#define _IRQ_PRIO_OFFSET 2
+#define ZERO_LATENCY_IRQS_RESERVED_PRIO 0
 #endif
 
+#ifdef CONFIG_CPU_CORTEX_M_HAS_BASEPRI
+#define HAS_BASEPRI_RESERVED_PRIO 1
+#else
+#define HAS_BASEPRI_RESERVED_PRIO 0
+#endif
+
+#ifdef CONFIG_CPU_CORTEX_M_HAS_PROGRAMMABLE_FAULT_PRIOS
+#define HAS_PROGRAMMABLE_FAULT_PRIOS_RESERVED_PRIO 1
+#else
+#define HAS_PROGRAMMABLE_FAULT_PRIOS_RESERVED_PRIO 0
+#endif
+
+#define _IRQ_PRIO_OFFSET \
+	(ZERO_LATENCY_IRQS_RESERVED_PRIO + \
+	 HAS_BASEPRI_RESERVED_PRIO + \
+	 HAS_PROGRAMMABLE_FAULT_PRIOS_RESERVED_PRIO)
+
 #define _EXC_IRQ_DEFAULT_PRIO _EXC_PRIO(_IRQ_PRIO_OFFSET)
 
 /* no exc #0 */