xref: /openbmc/linux/arch/x86/kernel/irq_work.c (revision 28b82352)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2e360adbeSPeter Zijlstra /*
3e360adbeSPeter Zijlstra  * x86 specific code for irq_work
4e360adbeSPeter Zijlstra  *
590eec103SPeter Zijlstra  * Copyright (C) 2010 Red Hat, Inc., Peter Zijlstra
6e360adbeSPeter Zijlstra  */
7e360adbeSPeter Zijlstra 
8e360adbeSPeter Zijlstra #include <linux/kernel.h>
9e360adbeSPeter Zijlstra #include <linux/irq_work.h>
10e360adbeSPeter Zijlstra #include <linux/hardirq.h>
11e360adbeSPeter Zijlstra #include <asm/apic.h>
12720909a7SThomas Gleixner #include <asm/idtentry.h>
13cf910e83SSeiji Aguchi #include <asm/trace/irq_vectors.h>
14c4158ff5SDaniel Bristot de Oliveira #include <linux/interrupt.h>
15e360adbeSPeter Zijlstra 
16a45525b5SThomas Gleixner #ifdef CONFIG_X86_LOCAL_APIC
DEFINE_IDTENTRY_SYSVEC(sysvec_irq_work)17720909a7SThomas Gleixner DEFINE_IDTENTRY_SYSVEC(sysvec_irq_work)
18eddc0e92SSeiji Aguchi {
19670c04adSDave Hansen 	apic_eoi();
20cf910e83SSeiji Aguchi 	trace_irq_work_entry(IRQ_WORK_VECTOR);
21daabb8ebSThomas Gleixner 	inc_irq_stat(apic_irq_work_irqs);
22daabb8ebSThomas Gleixner 	irq_work_run();
23cf910e83SSeiji Aguchi 	trace_irq_work_exit(IRQ_WORK_VECTOR);
24cf910e83SSeiji Aguchi }
25cf910e83SSeiji Aguchi 
arch_irq_work_raise(void)26e360adbeSPeter Zijlstra void arch_irq_work_raise(void)
27e360adbeSPeter Zijlstra {
283010279fSFrederic Weisbecker 	if (!arch_irq_work_has_interrupt())
29e360adbeSPeter Zijlstra 		return;
30e360adbeSPeter Zijlstra 
31*28b82352SDave Hansen 	__apic_send_IPI_self(IRQ_WORK_VECTOR);
32e360adbeSPeter Zijlstra 	apic_wait_icr_idle();
33e360adbeSPeter Zijlstra }
34a45525b5SThomas Gleixner #endif
35