powerpc/xmon: Improve output of XIVE interrupts
authorCédric Le Goater <clg@kaod.org>
Tue, 10 Sep 2019 08:18:49 +0000 (10:18 +0200)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 13 Sep 2019 14:58:47 +0000 (00:58 +1000)
When looping on the list of interrupts, add the current value of the
PQ bits with a load on the ESB page. This has the side effect of
faulting the ESB page of all interrupts.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20190910081850.26038-2-clg@kaod.org
arch/powerpc/include/asm/xive.h
arch/powerpc/sysdev/xive/common.c
arch/powerpc/xmon/xmon.c

index 967d6ab..71f52f2 100644 (file)
@@ -99,8 +99,7 @@ extern void xive_flush_interrupt(void);
 
 /* xmon hook */
 extern void xmon_xive_do_dump(int cpu);
-extern int xmon_xive_get_irq_config(u32 irq, u32 *target, u8 *prio,
-                                   u32 *sw_irq);
+extern int xmon_xive_get_irq_config(u32 hw_irq, struct irq_data *d);
 
 /* APIs used by KVM */
 extern u32 xive_native_default_eq_shift(void);
index f75a660..b10919f 100644 (file)
@@ -258,10 +258,33 @@ notrace void xmon_xive_do_dump(int cpu)
 #endif
 }
 
-int xmon_xive_get_irq_config(u32 irq, u32 *target, u8 *prio,
-                            u32 *sw_irq)
+int xmon_xive_get_irq_config(u32 hw_irq, struct irq_data *d)
 {
-       return xive_ops->get_irq_config(irq, target, prio, sw_irq);
+       int rc;
+       u32 target;
+       u8 prio;
+       u32 lirq;
+
+       rc = xive_ops->get_irq_config(hw_irq, &target, &prio, &lirq);
+       if (rc) {
+               xmon_printf("IRQ 0x%08x : no config rc=%d\n", hw_irq, rc);
+               return rc;
+       }
+
+       xmon_printf("IRQ 0x%08x : target=0x%x prio=%02x lirq=0x%x ",
+                   hw_irq, target, prio, lirq);
+
+       if (d) {
+               struct xive_irq_data *xd = irq_data_get_irq_handler_data(d);
+               u64 val = xive_esb_read(xd, XIVE_ESB_GET);
+
+               xmon_printf("PQ=%c%c",
+                           val & XIVE_ESB_VAL_P ? 'P' : '-',
+                           val & XIVE_ESB_VAL_Q ? 'Q' : '-');
+       }
+
+       xmon_printf("\n");
+       return 0;
 }
 
 #endif /* CONFIG_XMON */
index dc9832e..d83364e 100644 (file)
@@ -2572,16 +2572,9 @@ static void dump_all_xives(void)
                dump_one_xive(cpu);
 }
 
-static void dump_one_xive_irq(u32 num)
+static void dump_one_xive_irq(u32 num, struct irq_data *d)
 {
-       int rc;
-       u32 target;
-       u8 prio;
-       u32 lirq;
-
-       rc = xmon_xive_get_irq_config(num, &target, &prio, &lirq);
-       xmon_printf("IRQ 0x%08x : target=0x%x prio=%d lirq=0x%x (rc=%d)\n",
-                   num, target, prio, lirq, rc);
+       xmon_xive_get_irq_config(num, d);
 }
 
 static void dump_all_xive_irq(void)
@@ -2599,7 +2592,7 @@ static void dump_all_xive_irq(void)
                hwirq = (unsigned int)irqd_to_hwirq(d);
                /* IPIs are special (HW number 0) */
                if (hwirq)
-                       dump_one_xive_irq(hwirq);
+                       dump_one_xive_irq(hwirq, d);
        }
 }
 
@@ -2619,7 +2612,7 @@ static void dump_xives(void)
                return;
        } else if (c == 'i') {
                if (scanhex(&num))
-                       dump_one_xive_irq(num);
+                       dump_one_xive_irq(num, NULL);
                else
                        dump_all_xive_irq();
                return;