]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
powerpc/xive: Add a debugfs file to dump EQs
authorCédric Le Goater <clg@kaod.org>
Fri, 5 Nov 2021 10:26:32 +0000 (11:26 +0100)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 25 Nov 2021 00:25:30 +0000 (11:25 +1100)
The XIVE driver under Linux uses a single interrupt priority and only
one event queue is configured per CPU. Expose the contents under
a 'xive/eqs/cpuX' debugfs file.

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/20211105102636.1016378-8-clg@kaod.org
arch/powerpc/sysdev/xive/common.c

index 3ef3cc413b31d50b62d002a71533cb3b22f762b1..ff6a2d1ed41d9c08ef478089bb0360a7d0a8c37c 100644 (file)
@@ -1774,9 +1774,40 @@ static int xive_ipi_debug_show(struct seq_file *m, void *private)
 }
 DEFINE_SHOW_ATTRIBUTE(xive_ipi_debug);
 
+static void xive_eq_debug_show_one(struct seq_file *m, struct xive_q *q, u8 prio)
+{
+       int i;
+
+       seq_printf(m, "EQ%d idx=%d T=%d\n", prio, q->idx, q->toggle);
+       if (q->qpage) {
+               for (i = 0; i < q->msk + 1; i++) {
+                       if (!(i % 8))
+                               seq_printf(m, "%05d ", i);
+                       seq_printf(m, "%08x%s", be32_to_cpup(q->qpage + i),
+                                  (i + 1) % 8 ? " " : "\n");
+               }
+       }
+       seq_puts(m, "\n");
+}
+
+static int xive_eq_debug_show(struct seq_file *m, void *private)
+{
+       int cpu = (long)m->private;
+       struct xive_cpu *xc = per_cpu(xive_cpu, cpu);
+
+       if (xc)
+               xive_eq_debug_show_one(m, &xc->queue[xive_irq_priority],
+                                      xive_irq_priority);
+       return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(xive_eq_debug);
+
 static void xive_core_debugfs_create(void)
 {
        struct dentry *xive_dir;
+       struct dentry *xive_eq_dir;
+       long cpu;
+       char name[16];
 
        xive_dir = debugfs_create_dir("xive", arch_debugfs_dir);
        if (IS_ERR(xive_dir))
@@ -1786,6 +1817,12 @@ static void xive_core_debugfs_create(void)
                            NULL, &xive_ipi_debug_fops);
        debugfs_create_file("interrupts", 0400, xive_dir,
                            NULL, &xive_irq_debug_fops);
+       xive_eq_dir = debugfs_create_dir("eqs", xive_dir);
+       for_each_possible_cpu(cpu) {
+               snprintf(name, sizeof(name), "cpu%ld", cpu);
+               debugfs_create_file(name, 0400, xive_eq_dir, (void *)cpu,
+                                   &xive_eq_debug_fops);
+       }
 }
 #else
 static inline void xive_core_debugfs_create(void) { }