1 | // SPDX-License-Identifier: GPL-2.0-or-later |
---|---|
2 | /* |
3 | * Author: Kumar Gala <galak@kernel.crashing.org> |
4 | * |
5 | * Copyright 2009 Freescale Semiconductor Inc. |
6 | */ |
7 | |
8 | #include <linux/stddef.h> |
9 | #include <linux/kernel.h> |
10 | #include <linux/smp.h> |
11 | #include <linux/threads.h> |
12 | #include <linux/hardirq.h> |
13 | |
14 | #include <asm/dbell.h> |
15 | #include <asm/interrupt.h> |
16 | #include <asm/irq_regs.h> |
17 | #include <asm/kvm_ppc.h> |
18 | #include <asm/trace.h> |
19 | |
20 | #ifdef CONFIG_SMP |
21 | |
22 | DEFINE_INTERRUPT_HANDLER_ASYNC(doorbell_exception) |
23 | { |
24 | struct pt_regs *old_regs = set_irq_regs(regs); |
25 | |
26 | trace_doorbell_entry(regs); |
27 | |
28 | ppc_msgsync(); |
29 | |
30 | if (should_hard_irq_enable(regs)) |
31 | do_hard_irq_enable(); |
32 | |
33 | kvmppc_clear_host_ipi(smp_processor_id()); |
34 | __this_cpu_inc(irq_stat.doorbell_irqs); |
35 | |
36 | smp_ipi_demux_relaxed(); /* already performed the barrier */ |
37 | |
38 | trace_doorbell_exit(regs); |
39 | |
40 | set_irq_regs(old_regs); |
41 | } |
42 | #else /* CONFIG_SMP */ |
43 | DEFINE_INTERRUPT_HANDLER_ASYNC(doorbell_exception) |
44 | { |
45 | printk(KERN_WARNING "Received doorbell on non-smp system\n"); |
46 | } |
47 | #endif /* CONFIG_SMP */ |
48 |