Skip to content

Commit

Permalink
irqchip/sifive-plic: Fix syscore registration for multi-socket systems
Browse files Browse the repository at this point in the history
Multi-socket systems have a separate PLIC in each socket, so __plic_init()
is invoked for each PLIC. __plic_init() registers syscore operations, which
obviously fails on the second invocation.

Move it into the already existing condition for installing the CPU hotplug
state so it is only invoked once when the first PLIC is initialized.

[ tglx: Massaged changelog ]

Fixes: e80f0b6 ("irqchip/irq-sifive-plic: Add syscore callbacks for hibernation")
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20231025142820.390238-4-apatel@ventanamicro.com
  • Loading branch information
avpatel authored and Thomas Gleixner committed Oct 27, 2023
1 parent 08d4c17 commit f99b926
Showing 1 changed file with 4 additions and 3 deletions.
7 changes: 4 additions & 3 deletions drivers/irqchip/irq-sifive-plic.c
Expand Up @@ -532,17 +532,18 @@ static int __init __plic_init(struct device_node *node,
}

/*
* We can have multiple PLIC instances so setup cpuhp state only
* when context handler for current/boot CPU is present.
* We can have multiple PLIC instances so setup cpuhp state
* and register syscore operations only when context handler
* for current/boot CPU is present.
*/
handler = this_cpu_ptr(&plic_handlers);
if (handler->present && !plic_cpuhp_setup_done) {
cpuhp_setup_state(CPUHP_AP_IRQ_SIFIVE_PLIC_STARTING,
"irqchip/sifive/plic:starting",
plic_starting_cpu, plic_dying_cpu);
register_syscore_ops(&plic_irq_syscore_ops);
plic_cpuhp_setup_done = true;
}
register_syscore_ops(&plic_irq_syscore_ops);

pr_info("%pOFP: mapped %d interrupts with %d handlers for"
" %d contexts.\n", node, nr_irqs, nr_handlers, nr_contexts);
Expand Down

0 comments on commit f99b926

Please sign in to comment.