| 1 | |
| 2 | |
| 3 | * Author: Kumar Gala <[email protected]>
|
| 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();
|
| 37 |
|
| 38 | trace_doorbell_exit(regs);
|
| 39 |
|
| 40 | set_irq_regs(old_regs);
|
| 41 | }
|
| 42 | #else
|
| 43 | DEFINE_INTERRUPT_HANDLER_ASYNC(doorbell_exception)
|
| 44 | {
|
| 45 | printk(KERN_WARNING "Received doorbell on non-smp system\n");
|
| 46 | }
|
| 47 | #endif
|