dbell.c 1006 B

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