blob: 32e666e1231e77f128252b2f9354f708081cafdb [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
H. Peter Anvin1965aae2008-10-22 22:26:29 -07002#ifndef _ASM_X86_HW_IRQ_H
3#define _ASM_X86_HW_IRQ_H
Thomas Gleixner2e088432008-05-02 19:00:30 +02004
5/*
6 * (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
7 *
8 * moved some of the old arch/i386/kernel/irq.h to here. VY
9 *
10 * IRQ/IPI changes taken from work by Thomas Radke
11 * <tomsoft@informatik.tu-chemnitz.de>
12 *
13 * hacked by Andi Kleen for x86-64.
14 * unified by tglx
15 */
16
Thomas Gleixner9b7dc562008-05-02 20:10:09 +020017#include <asm/irq_vectors.h>
Thomas Gleixner2e088432008-05-02 19:00:30 +020018
Thomas Gleixner0fa115d2017-09-13 23:29:38 +020019#define IRQ_MATRIX_BITS NR_VECTORS
20
Thomas Gleixner2e088432008-05-02 19:00:30 +020021#ifndef __ASSEMBLY__
22
23#include <linux/percpu.h>
24#include <linux/profile.h>
25#include <linux/smp.h>
26
Arun Sharma600634972011-07-26 16:09:06 -070027#include <linux/atomic.h>
Thomas Gleixner2e088432008-05-02 19:00:30 +020028#include <asm/irq.h>
29#include <asm/sections.h>
30
Thomas Gleixner2e088432008-05-02 19:00:30 +020031/* Interrupt handlers registered during init_IRQ */
Andi Kleen1d9090e2013-08-05 15:02:37 -070032extern asmlinkage void apic_timer_interrupt(void);
33extern asmlinkage void x86_platform_ipi(void);
34extern asmlinkage void kvm_posted_intr_ipi(void);
Feng Wuf6b3c72c2015-05-19 17:07:16 +080035extern asmlinkage void kvm_posted_intr_wakeup_ipi(void);
Wincy Van210f84b2017-04-28 13:13:58 +080036extern asmlinkage void kvm_posted_intr_nested_ipi(void);
Andi Kleen1d9090e2013-08-05 15:02:37 -070037extern asmlinkage void error_interrupt(void);
38extern asmlinkage void irq_work_interrupt(void);
Andrew Banman151ad172018-03-27 17:09:06 -050039extern asmlinkage void uv_bau_message_intr1(void);
Ingo Molnar241771e2008-12-03 10:39:53 +010040
Andi Kleen1d9090e2013-08-05 15:02:37 -070041extern asmlinkage void spurious_interrupt(void);
42extern asmlinkage void thermal_interrupt(void);
43extern asmlinkage void reschedule_interrupt(void);
Thomas Gleixner2e088432008-05-02 19:00:30 +020044
Andi Kleen1d9090e2013-08-05 15:02:37 -070045extern asmlinkage void irq_move_cleanup_interrupt(void);
46extern asmlinkage void reboot_interrupt(void);
47extern asmlinkage void threshold_interrupt(void);
Aravind Gopalakrishnan24fd78a2015-05-06 06:58:56 -050048extern asmlinkage void deferred_error_interrupt(void);
Thomas Gleixner2e088432008-05-02 19:00:30 +020049
Andi Kleen1d9090e2013-08-05 15:02:37 -070050extern asmlinkage void call_function_interrupt(void);
51extern asmlinkage void call_function_single_interrupt(void);
Thomas Gleixner2e088432008-05-02 19:00:30 +020052
Jiang Liu26011ee2014-10-27 16:11:56 +080053#ifdef CONFIG_X86_LOCAL_APIC
Jiang Liu74afab72014-10-27 16:12:00 +080054struct irq_data;
Jiang Liu947045a2015-04-13 14:11:30 +080055struct pci_dev;
56struct msi_desc;
57
58enum irq_alloc_type {
59 X86_IRQ_ALLOC_TYPE_IOAPIC = 1,
60 X86_IRQ_ALLOC_TYPE_HPET,
61 X86_IRQ_ALLOC_TYPE_MSI,
62 X86_IRQ_ALLOC_TYPE_MSIX,
Jiang Liu0921f1d2015-04-13 14:11:42 +080063 X86_IRQ_ALLOC_TYPE_DMAR,
Jiang Liu43fe1ab2015-04-13 14:11:44 +080064 X86_IRQ_ALLOC_TYPE_UV,
Jiang Liu947045a2015-04-13 14:11:30 +080065};
Jiang Liub5dc8e62015-04-13 14:11:24 +080066
67struct irq_alloc_info {
Jiang Liu947045a2015-04-13 14:11:30 +080068 enum irq_alloc_type type;
Jiang Liub5dc8e62015-04-13 14:11:24 +080069 u32 flags;
70 const struct cpumask *mask; /* CPU mask for vector allocation */
Jiang Liu947045a2015-04-13 14:11:30 +080071 union {
72 int unused;
73#ifdef CONFIG_HPET_TIMER
74 struct {
75 int hpet_id;
76 int hpet_index;
77 void *hpet_data;
78 };
79#endif
80#ifdef CONFIG_PCI_MSI
81 struct {
82 struct pci_dev *msi_dev;
83 irq_hw_number_t msi_hwirq;
84 };
85#endif
86#ifdef CONFIG_X86_IO_APIC
87 struct {
88 int ioapic_id;
89 int ioapic_pin;
90 int ioapic_node;
91 u32 ioapic_trigger : 1;
92 u32 ioapic_polarity : 1;
93 u32 ioapic_valid : 1;
94 struct IO_APIC_route_entry *ioapic_entry;
95 };
96#endif
Jiang Liu0921f1d2015-04-13 14:11:42 +080097#ifdef CONFIG_DMAR_TABLE
98 struct {
99 int dmar_id;
100 void *dmar_data;
101 };
102#endif
Jiang Liu43fe1ab2015-04-13 14:11:44 +0800103#ifdef CONFIG_X86_UV
104 struct {
105 int uv_limit;
106 int uv_blade;
107 unsigned long uv_offset;
108 char *uv_name;
109 };
110#endif
Keith Busch185a3832016-01-12 13:18:10 -0700111#if IS_ENABLED(CONFIG_VMD)
112 struct {
113 struct msi_desc *desc;
114 };
115#endif
Jiang Liu947045a2015-04-13 14:11:30 +0800116 };
Jiang Liub5dc8e62015-04-13 14:11:24 +0800117};
118
Jiang Liu26011ee2014-10-27 16:11:56 +0800119struct irq_cfg {
Jiang Liu5f0052f2015-04-13 14:11:23 +0800120 unsigned int dest_apicid;
Thomas Gleixnerba224fe2017-09-13 23:29:45 +0200121 unsigned int vector;
Jiang Liu26011ee2014-10-27 16:11:56 +0800122};
123
Jiang Liu55a0e2b2014-10-27 16:11:59 +0800124extern struct irq_cfg *irq_cfg(unsigned int irq);
125extern struct irq_cfg *irqd_cfg(struct irq_data *irq_data);
Jiang Liu74afab72014-10-27 16:12:00 +0800126extern void lock_vector_lock(void);
127extern void unlock_vector_lock(void);
Jiang Liu26011ee2014-10-27 16:11:56 +0800128#ifdef CONFIG_SMP
129extern void send_cleanup_vector(struct irq_cfg *);
Thomas Gleixnerf0e5bf72014-11-05 10:12:27 +0100130extern void irq_complete_move(struct irq_cfg *cfg);
Jiang Liu26011ee2014-10-27 16:11:56 +0800131#else
132static inline void send_cleanup_vector(struct irq_cfg *c) { }
Thomas Gleixnerf0e5bf72014-11-05 10:12:27 +0100133static inline void irq_complete_move(struct irq_cfg *c) { }
Jiang Liu26011ee2014-10-27 16:11:56 +0800134#endif
135
Jiang Liu74afab72014-10-27 16:12:00 +0800136extern void apic_ack_edge(struct irq_data *data);
Jiang Liu74afab72014-10-27 16:12:00 +0800137#else /* CONFIG_X86_LOCAL_APIC */
Jiang Liu26011ee2014-10-27 16:11:56 +0800138static inline void lock_vector_lock(void) {}
139static inline void unlock_vector_lock(void) {}
Jiang Liu74afab72014-10-27 16:12:00 +0800140#endif /* CONFIG_X86_LOCAL_APIC */
Jiang Liu26011ee2014-10-27 16:11:56 +0800141
Thomas Gleixner2e088432008-05-02 19:00:30 +0200142/* Statistics */
143extern atomic_t irq_err_count;
144extern atomic_t irq_mis_count;
145
Paul Gortmakerea6cd252015-05-09 20:27:37 -0400146extern void elcr_set_level_irq(unsigned int irq);
Thomas Gleixner1a331952008-05-03 00:30:50 +0200147
Denys Vlasenko3304c9c2015-04-03 21:49:13 +0200148extern char irq_entries_start[];
Seiji Aguchi25c74b12013-10-30 16:37:00 -0400149#ifdef CONFIG_TRACING
Denys Vlasenko3304c9c2015-04-03 21:49:13 +0200150#define trace_irq_entries_start irq_entries_start
Seiji Aguchi25c74b12013-10-30 16:37:00 -0400151#endif
Eric W. Biedermand388e5f2008-08-09 15:09:02 -0700152
Thomas Gleixnera782a7e2015-08-02 20:38:27 +0000153#define VECTOR_UNUSED NULL
154#define VECTOR_RETRIGGERED ((void *)~0UL)
Prarit Bhargava93450052014-01-05 11:10:52 -0500155
Thomas Gleixnera782a7e2015-08-02 20:38:27 +0000156typedef struct irq_desc* vector_irq_t[NR_VECTORS];
Yinghai Lu497c9a12008-08-19 20:50:28 -0700157DECLARE_PER_CPU(vector_irq_t, vector_irq);
Thomas Gleixner2e088432008-05-02 19:00:30 +0200158
Thomas Gleixner22dc12d2008-05-02 22:10:39 +0200159#endif /* !ASSEMBLY_ */
160
H. Peter Anvin1965aae2008-10-22 22:26:29 -0700161#endif /* _ASM_X86_HW_IRQ_H */