blob: 6dfe366a8804576719196970e8e6c92f84fb1408 [file] [log] [blame]
H. Peter Anvin1965aae2008-10-22 22:26:29 -07001#ifndef _ASM_X86_HW_IRQ_H
2#define _ASM_X86_HW_IRQ_H
Thomas Gleixner2e088432008-05-02 19:00:30 +02003
4/*
5 * (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
6 *
7 * moved some of the old arch/i386/kernel/irq.h to here. VY
8 *
9 * IRQ/IPI changes taken from work by Thomas Radke
10 * <tomsoft@informatik.tu-chemnitz.de>
11 *
12 * hacked by Andi Kleen for x86-64.
13 * unified by tglx
14 */
15
Thomas Gleixner9b7dc562008-05-02 20:10:09 +020016#include <asm/irq_vectors.h>
Thomas Gleixner2e088432008-05-02 19:00:30 +020017
18#ifndef __ASSEMBLY__
19
20#include <linux/percpu.h>
21#include <linux/profile.h>
22#include <linux/smp.h>
23
Arun Sharma600634972011-07-26 16:09:06 -070024#include <linux/atomic.h>
Thomas Gleixner2e088432008-05-02 19:00:30 +020025#include <asm/irq.h>
26#include <asm/sections.h>
27
Thomas Gleixner2e088432008-05-02 19:00:30 +020028/* Interrupt handlers registered during init_IRQ */
Andi Kleen1d9090e2013-08-05 15:02:37 -070029extern asmlinkage void apic_timer_interrupt(void);
30extern asmlinkage void x86_platform_ipi(void);
31extern asmlinkage void kvm_posted_intr_ipi(void);
Feng Wuf6b3c72c2015-05-19 17:07:16 +080032extern asmlinkage void kvm_posted_intr_wakeup_ipi(void);
Wincy Van210f84b2017-04-28 13:13:58 +080033extern asmlinkage void kvm_posted_intr_nested_ipi(void);
Andi Kleen1d9090e2013-08-05 15:02:37 -070034extern asmlinkage void error_interrupt(void);
35extern asmlinkage void irq_work_interrupt(void);
Ingo Molnar241771e2008-12-03 10:39:53 +010036
Andi Kleen1d9090e2013-08-05 15:02:37 -070037extern asmlinkage void spurious_interrupt(void);
38extern asmlinkage void thermal_interrupt(void);
39extern asmlinkage void reschedule_interrupt(void);
Thomas Gleixner2e088432008-05-02 19:00:30 +020040
Andi Kleen1d9090e2013-08-05 15:02:37 -070041extern asmlinkage void irq_move_cleanup_interrupt(void);
42extern asmlinkage void reboot_interrupt(void);
43extern asmlinkage void threshold_interrupt(void);
Aravind Gopalakrishnan24fd78a2015-05-06 06:58:56 -050044extern asmlinkage void deferred_error_interrupt(void);
Thomas Gleixner2e088432008-05-02 19:00:30 +020045
Andi Kleen1d9090e2013-08-05 15:02:37 -070046extern asmlinkage void call_function_interrupt(void);
47extern asmlinkage void call_function_single_interrupt(void);
Thomas Gleixner2e088432008-05-02 19:00:30 +020048
Jiang Liu26011ee2014-10-27 16:11:56 +080049#ifdef CONFIG_X86_LOCAL_APIC
Jiang Liu74afab72014-10-27 16:12:00 +080050struct irq_data;
Jiang Liu947045a2015-04-13 14:11:30 +080051struct pci_dev;
52struct msi_desc;
53
54enum irq_alloc_type {
55 X86_IRQ_ALLOC_TYPE_IOAPIC = 1,
56 X86_IRQ_ALLOC_TYPE_HPET,
57 X86_IRQ_ALLOC_TYPE_MSI,
58 X86_IRQ_ALLOC_TYPE_MSIX,
Jiang Liu0921f1d2015-04-13 14:11:42 +080059 X86_IRQ_ALLOC_TYPE_DMAR,
Jiang Liu43fe1ab2015-04-13 14:11:44 +080060 X86_IRQ_ALLOC_TYPE_UV,
Jiang Liu947045a2015-04-13 14:11:30 +080061};
Jiang Liub5dc8e62015-04-13 14:11:24 +080062
63struct irq_alloc_info {
Jiang Liu947045a2015-04-13 14:11:30 +080064 enum irq_alloc_type type;
Jiang Liub5dc8e62015-04-13 14:11:24 +080065 u32 flags;
66 const struct cpumask *mask; /* CPU mask for vector allocation */
Jiang Liu947045a2015-04-13 14:11:30 +080067 union {
68 int unused;
69#ifdef CONFIG_HPET_TIMER
70 struct {
71 int hpet_id;
72 int hpet_index;
73 void *hpet_data;
74 };
75#endif
76#ifdef CONFIG_PCI_MSI
77 struct {
78 struct pci_dev *msi_dev;
79 irq_hw_number_t msi_hwirq;
80 };
81#endif
82#ifdef CONFIG_X86_IO_APIC
83 struct {
84 int ioapic_id;
85 int ioapic_pin;
86 int ioapic_node;
87 u32 ioapic_trigger : 1;
88 u32 ioapic_polarity : 1;
89 u32 ioapic_valid : 1;
90 struct IO_APIC_route_entry *ioapic_entry;
91 };
92#endif
Jiang Liu0921f1d2015-04-13 14:11:42 +080093#ifdef CONFIG_DMAR_TABLE
94 struct {
95 int dmar_id;
96 void *dmar_data;
97 };
98#endif
Jiang Liu49e07d82015-04-13 14:11:43 +080099#ifdef CONFIG_HT_IRQ
100 struct {
101 int ht_pos;
102 int ht_idx;
103 struct pci_dev *ht_dev;
104 void *ht_update;
105 };
106#endif
Jiang Liu43fe1ab2015-04-13 14:11:44 +0800107#ifdef CONFIG_X86_UV
108 struct {
109 int uv_limit;
110 int uv_blade;
111 unsigned long uv_offset;
112 char *uv_name;
113 };
114#endif
Keith Busch185a3832016-01-12 13:18:10 -0700115#if IS_ENABLED(CONFIG_VMD)
116 struct {
117 struct msi_desc *desc;
118 };
119#endif
Jiang Liu947045a2015-04-13 14:11:30 +0800120 };
Jiang Liub5dc8e62015-04-13 14:11:24 +0800121};
122
Jiang Liu26011ee2014-10-27 16:11:56 +0800123struct irq_cfg {
Jiang Liu5f0052f2015-04-13 14:11:23 +0800124 unsigned int dest_apicid;
Jiang Liu26011ee2014-10-27 16:11:56 +0800125 u8 vector;
Thomas Gleixner551adc62016-03-14 09:40:46 +0100126 u8 old_vector;
Jiang Liu26011ee2014-10-27 16:11:56 +0800127};
128
Jiang Liu55a0e2b2014-10-27 16:11:59 +0800129extern struct irq_cfg *irq_cfg(unsigned int irq);
130extern struct irq_cfg *irqd_cfg(struct irq_data *irq_data);
Jiang Liu74afab72014-10-27 16:12:00 +0800131extern void lock_vector_lock(void);
132extern void unlock_vector_lock(void);
Jiang Liu74afab72014-10-27 16:12:00 +0800133extern void setup_vector_irq(int cpu);
Jiang Liu26011ee2014-10-27 16:11:56 +0800134#ifdef CONFIG_SMP
135extern void send_cleanup_vector(struct irq_cfg *);
Thomas Gleixnerf0e5bf72014-11-05 10:12:27 +0100136extern void irq_complete_move(struct irq_cfg *cfg);
Jiang Liu26011ee2014-10-27 16:11:56 +0800137#else
138static inline void send_cleanup_vector(struct irq_cfg *c) { }
Thomas Gleixnerf0e5bf72014-11-05 10:12:27 +0100139static inline void irq_complete_move(struct irq_cfg *c) { }
Jiang Liu26011ee2014-10-27 16:11:56 +0800140#endif
141
Jiang Liu74afab72014-10-27 16:12:00 +0800142extern void apic_ack_edge(struct irq_data *data);
Jiang Liu74afab72014-10-27 16:12:00 +0800143#else /* CONFIG_X86_LOCAL_APIC */
Jiang Liu26011ee2014-10-27 16:11:56 +0800144static inline void lock_vector_lock(void) {}
145static inline void unlock_vector_lock(void) {}
Jiang Liu74afab72014-10-27 16:12:00 +0800146#endif /* CONFIG_X86_LOCAL_APIC */
Jiang Liu26011ee2014-10-27 16:11:56 +0800147
Thomas Gleixner2e088432008-05-02 19:00:30 +0200148/* Statistics */
149extern atomic_t irq_err_count;
150extern atomic_t irq_mis_count;
151
Paul Gortmakerea6cd252015-05-09 20:27:37 -0400152extern void elcr_set_level_irq(unsigned int irq);
Thomas Gleixner1a331952008-05-03 00:30:50 +0200153
Denys Vlasenko3304c9c2015-04-03 21:49:13 +0200154extern char irq_entries_start[];
Seiji Aguchi25c74b12013-10-30 16:37:00 -0400155#ifdef CONFIG_TRACING
Denys Vlasenko3304c9c2015-04-03 21:49:13 +0200156#define trace_irq_entries_start irq_entries_start
Seiji Aguchi25c74b12013-10-30 16:37:00 -0400157#endif
Eric W. Biedermand388e5f2008-08-09 15:09:02 -0700158
Thomas Gleixnera782a7e2015-08-02 20:38:27 +0000159#define VECTOR_UNUSED NULL
160#define VECTOR_RETRIGGERED ((void *)~0UL)
Prarit Bhargava93450052014-01-05 11:10:52 -0500161
Thomas Gleixnera782a7e2015-08-02 20:38:27 +0000162typedef struct irq_desc* vector_irq_t[NR_VECTORS];
Yinghai Lu497c9a12008-08-19 20:50:28 -0700163DECLARE_PER_CPU(vector_irq_t, vector_irq);
Thomas Gleixner2e088432008-05-02 19:00:30 +0200164
Thomas Gleixner22dc12d2008-05-02 22:10:39 +0200165#endif /* !ASSEMBLY_ */
166
H. Peter Anvin1965aae2008-10-22 22:26:29 -0700167#endif /* _ASM_X86_HW_IRQ_H */