18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Author: Kumar Gala <galak@kernel.crashing.org> 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright 2009 Freescale Semiconductor Inc. 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/stddef.h> 98c2ecf20Sopenharmony_ci#include <linux/kernel.h> 108c2ecf20Sopenharmony_ci#include <linux/smp.h> 118c2ecf20Sopenharmony_ci#include <linux/threads.h> 128c2ecf20Sopenharmony_ci#include <linux/hardirq.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <asm/dbell.h> 158c2ecf20Sopenharmony_ci#include <asm/irq_regs.h> 168c2ecf20Sopenharmony_ci#include <asm/kvm_ppc.h> 178c2ecf20Sopenharmony_ci#include <asm/trace.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_civoid doorbell_exception(struct pt_regs *regs) 228c2ecf20Sopenharmony_ci{ 238c2ecf20Sopenharmony_ci struct pt_regs *old_regs = set_irq_regs(regs); 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci irq_enter(); 268c2ecf20Sopenharmony_ci trace_doorbell_entry(regs); 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci ppc_msgsync(); 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci may_hard_irq_enable(); 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci kvmppc_clear_host_ipi(smp_processor_id()); 338c2ecf20Sopenharmony_ci __this_cpu_inc(irq_stat.doorbell_irqs); 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci smp_ipi_demux_relaxed(); /* already performed the barrier */ 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci trace_doorbell_exit(regs); 388c2ecf20Sopenharmony_ci irq_exit(); 398c2ecf20Sopenharmony_ci set_irq_regs(old_regs); 408c2ecf20Sopenharmony_ci} 418c2ecf20Sopenharmony_ci#else /* CONFIG_SMP */ 428c2ecf20Sopenharmony_civoid doorbell_exception(struct pt_regs *regs) 438c2ecf20Sopenharmony_ci{ 448c2ecf20Sopenharmony_ci printk(KERN_WARNING "Received doorbell on non-smp system\n"); 458c2ecf20Sopenharmony_ci} 468c2ecf20Sopenharmony_ci#endif /* CONFIG_SMP */ 478c2ecf20Sopenharmony_ci 48