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 GleixnerDEFINE_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 Zijlstravoid 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