Commit c80198a2 authored by Cédric Le Goater's avatar Cédric Le Goater Committed by Michael Ellerman

powerpc/xics: Fix IRQ migration

desc->irq_data points to the top level IRQ data descriptor which is
not necessarily in the XICS IRQ domain. MSIs are in another domain for
instance. Fix that by looking for a mapping on the low level XICS IRQ
domain.
Signed-off-by: default avatarCédric Le Goater <clg@kaod.org>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210701132750.1475580-28-clg@kaod.org
parent f1a377f8
...@@ -183,6 +183,8 @@ void xics_migrate_irqs_away(void) ...@@ -183,6 +183,8 @@ void xics_migrate_irqs_away(void)
unsigned int irq, virq; unsigned int irq, virq;
struct irq_desc *desc; struct irq_desc *desc;
pr_debug("%s: CPU %u\n", __func__, cpu);
/* If we used to be the default server, move to the new "boot_cpuid" */ /* If we used to be the default server, move to the new "boot_cpuid" */
if (hw_cpu == xics_default_server) if (hw_cpu == xics_default_server)
xics_update_irq_servers(); xics_update_irq_servers();
...@@ -197,6 +199,7 @@ void xics_migrate_irqs_away(void) ...@@ -197,6 +199,7 @@ void xics_migrate_irqs_away(void)
struct irq_chip *chip; struct irq_chip *chip;
long server; long server;
unsigned long flags; unsigned long flags;
struct irq_data *irqd;
/* We can't set affinity on ISA interrupts */ /* We can't set affinity on ISA interrupts */
if (virq < NR_IRQS_LEGACY) if (virq < NR_IRQS_LEGACY)
...@@ -204,9 +207,11 @@ void xics_migrate_irqs_away(void) ...@@ -204,9 +207,11 @@ void xics_migrate_irqs_away(void)
/* We only need to migrate enabled IRQS */ /* We only need to migrate enabled IRQS */
if (!desc->action) if (!desc->action)
continue; continue;
if (desc->irq_data.domain != xics_host) /* We need a mapping in the XICS IRQ domain */
irqd = irq_domain_get_irq_data(xics_host, virq);
if (!irqd)
continue; continue;
irq = desc->irq_data.hwirq; irq = irqd_to_hwirq(irqd);
/* We need to get IPIs still. */ /* We need to get IPIs still. */
if (irq == XICS_IPI || irq == XICS_IRQ_SPURIOUS) if (irq == XICS_IPI || irq == XICS_IRQ_SPURIOUS)
continue; continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment