powerpc/book3s: Add basic infrastructure to handle HMI in Linux.
[cascardo/linux.git] / arch / powerpc / kernel / irq.c
index 248ee7e..4c5891d 100644 (file)
@@ -189,6 +189,11 @@ notrace unsigned int __check_irq_replay(void)
        }
 #endif /* CONFIG_PPC_BOOK3E */
 
+       /* Check if an hypervisor Maintenance interrupt happened */
+       local_paca->irq_happened &= ~PACA_IRQ_HMI;
+       if (happened & PACA_IRQ_HMI)
+               return 0xe60;
+
        /* There should be nothing left ! */
        BUG_ON(local_paca->irq_happened != 0);
 
@@ -377,6 +382,14 @@ int arch_show_interrupts(struct seq_file *p, int prec)
                seq_printf(p, "%10u ", per_cpu(irq_stat, j).mce_exceptions);
        seq_printf(p, "  Machine check exceptions\n");
 
+       if (cpu_has_feature(CPU_FTR_HVMODE)) {
+               seq_printf(p, "%*s: ", prec, "HMI");
+               for_each_online_cpu(j)
+                       seq_printf(p, "%10u ",
+                                       per_cpu(irq_stat, j).hmi_exceptions);
+               seq_printf(p, "  Hypervisor Maintenance Interrupts\n");
+       }
+
 #ifdef CONFIG_PPC_DOORBELL
        if (cpu_has_feature(CPU_FTR_DBELL)) {
                seq_printf(p, "%*s: ", prec, "DBL");
@@ -400,6 +413,7 @@ u64 arch_irq_stat_cpu(unsigned int cpu)
        sum += per_cpu(irq_stat, cpu).mce_exceptions;
        sum += per_cpu(irq_stat, cpu).spurious_irqs;
        sum += per_cpu(irq_stat, cpu).timer_irqs_others;
+       sum += per_cpu(irq_stat, cpu).hmi_exceptions;
 #ifdef CONFIG_PPC_DOORBELL
        sum += per_cpu(irq_stat, cpu).doorbell_irqs;
 #endif