|
@@ -143,9 +143,10 @@ notrace unsigned int __check_irq_replay(void)
|
|
|
*/
|
|
|
unsigned char happened = local_paca->irq_happened;
|
|
|
|
|
|
- /* Clear bit 0 which we wouldn't clear otherwise */
|
|
|
- local_paca->irq_happened &= ~PACA_IRQ_HARD_DIS;
|
|
|
if (happened & PACA_IRQ_HARD_DIS) {
|
|
|
+ /* Clear bit 0 which we wouldn't clear otherwise */
|
|
|
+ local_paca->irq_happened &= ~PACA_IRQ_HARD_DIS;
|
|
|
+
|
|
|
/*
|
|
|
* We may have missed a decrementer interrupt if hard disabled.
|
|
|
* Check the decrementer register in case we had a rollover
|
|
@@ -173,39 +174,39 @@ notrace unsigned int __check_irq_replay(void)
|
|
|
* This is a higher priority interrupt than the others, so
|
|
|
* replay it first.
|
|
|
*/
|
|
|
- local_paca->irq_happened &= ~PACA_IRQ_HMI;
|
|
|
- if (happened & PACA_IRQ_HMI)
|
|
|
+ if (happened & PACA_IRQ_HMI) {
|
|
|
+ local_paca->irq_happened &= ~PACA_IRQ_HMI;
|
|
|
return 0xe60;
|
|
|
+ }
|
|
|
|
|
|
- /*
|
|
|
- * We may have missed a decrementer interrupt. We check the
|
|
|
- * decrementer itself rather than the paca irq_happened field
|
|
|
- * in case we also had a rollover while hard disabled
|
|
|
- */
|
|
|
- local_paca->irq_happened &= ~PACA_IRQ_DEC;
|
|
|
- if (happened & PACA_IRQ_DEC)
|
|
|
+ if (happened & PACA_IRQ_DEC) {
|
|
|
+ local_paca->irq_happened &= ~PACA_IRQ_DEC;
|
|
|
return 0x900;
|
|
|
+ }
|
|
|
|
|
|
- /* Finally check if an external interrupt happened */
|
|
|
- local_paca->irq_happened &= ~PACA_IRQ_EE;
|
|
|
- if (happened & PACA_IRQ_EE)
|
|
|
+ if (happened & PACA_IRQ_EE) {
|
|
|
+ local_paca->irq_happened &= ~PACA_IRQ_EE;
|
|
|
return 0x500;
|
|
|
+ }
|
|
|
|
|
|
#ifdef CONFIG_PPC_BOOK3E
|
|
|
- /* Finally check if an EPR external interrupt happened
|
|
|
- * this bit is typically set if we need to handle another
|
|
|
- * "edge" interrupt from within the MPIC "EPR" handler
|
|
|
+ /*
|
|
|
+ * Check if an EPR external interrupt happened this bit is typically
|
|
|
+ * set if we need to handle another "edge" interrupt from within the
|
|
|
+ * MPIC "EPR" handler.
|
|
|
*/
|
|
|
- local_paca->irq_happened &= ~PACA_IRQ_EE_EDGE;
|
|
|
- if (happened & PACA_IRQ_EE_EDGE)
|
|
|
+ if (happened & PACA_IRQ_EE_EDGE) {
|
|
|
+ local_paca->irq_happened &= ~PACA_IRQ_EE_EDGE;
|
|
|
return 0x500;
|
|
|
+ }
|
|
|
|
|
|
- local_paca->irq_happened &= ~PACA_IRQ_DBELL;
|
|
|
- if (happened & PACA_IRQ_DBELL)
|
|
|
+ if (happened & PACA_IRQ_DBELL) {
|
|
|
+ local_paca->irq_happened &= ~PACA_IRQ_DBELL;
|
|
|
return 0x280;
|
|
|
+ }
|
|
|
#else
|
|
|
- local_paca->irq_happened &= ~PACA_IRQ_DBELL;
|
|
|
if (happened & PACA_IRQ_DBELL) {
|
|
|
+ local_paca->irq_happened &= ~PACA_IRQ_DBELL;
|
|
|
if (cpu_has_feature(CPU_FTR_HVMODE))
|
|
|
return 0xe80;
|
|
|
return 0xa00;
|