Linux Audio

Check our new training course

Loading...
v4.17
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef _ASM_X86_HW_IRQ_H
  3#define _ASM_X86_HW_IRQ_H
  4
  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
 17#include <asm/irq_vectors.h>
 18
 19#define IRQ_MATRIX_BITS		NR_VECTORS
 20
 21#ifndef __ASSEMBLY__
 22
 23#include <linux/percpu.h>
 24#include <linux/profile.h>
 25#include <linux/smp.h>
 26
 27#include <linux/atomic.h>
 28#include <asm/irq.h>
 29#include <asm/sections.h>
 30
 31/* Interrupt handlers registered during init_IRQ */
 32extern asmlinkage void apic_timer_interrupt(void);
 33extern asmlinkage void x86_platform_ipi(void);
 34extern asmlinkage void kvm_posted_intr_ipi(void);
 35extern asmlinkage void kvm_posted_intr_wakeup_ipi(void);
 36extern asmlinkage void kvm_posted_intr_nested_ipi(void);
 37extern asmlinkage void error_interrupt(void);
 38extern asmlinkage void irq_work_interrupt(void);
 39extern asmlinkage void uv_bau_message_intr1(void);
 40
 41extern asmlinkage void spurious_interrupt(void);
 42extern asmlinkage void thermal_interrupt(void);
 43extern asmlinkage void reschedule_interrupt(void);
 44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 45extern asmlinkage void irq_move_cleanup_interrupt(void);
 46extern asmlinkage void reboot_interrupt(void);
 47extern asmlinkage void threshold_interrupt(void);
 48extern asmlinkage void deferred_error_interrupt(void);
 49
 50extern asmlinkage void call_function_interrupt(void);
 51extern asmlinkage void call_function_single_interrupt(void);
 52
 53#ifdef	CONFIG_X86_LOCAL_APIC
 54struct irq_data;
 55struct 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,
 63	X86_IRQ_ALLOC_TYPE_DMAR,
 64	X86_IRQ_ALLOC_TYPE_UV,
 
 
 
 
 
 
 
 
 
 65};
 66
 67struct irq_alloc_info {
 68	enum irq_alloc_type	type;
 69	u32			flags;
 70	const struct cpumask	*mask;	/* CPU mask for vector allocation */
 71	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
 97#ifdef	CONFIG_DMAR_TABLE
 98		struct {
 99			int		dmar_id;
100			void		*dmar_data;
101		};
102#endif
103#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
111#if IS_ENABLED(CONFIG_VMD)
112		struct {
113			struct msi_desc *desc;
114		};
115#endif
116	};
117};
118
 
 
 
 
 
119struct irq_cfg {
120	unsigned int		dest_apicid;
121	unsigned int		vector;
 
 
 
 
 
 
 
 
 
 
122};
123
124extern struct irq_cfg *irq_cfg(unsigned int irq);
125extern struct irq_cfg *irqd_cfg(struct irq_data *irq_data);
126extern void lock_vector_lock(void);
127extern void unlock_vector_lock(void);
128#ifdef CONFIG_SMP
129extern void send_cleanup_vector(struct irq_cfg *);
130extern void irq_complete_move(struct irq_cfg *cfg);
131#else
132static inline void send_cleanup_vector(struct irq_cfg *c) { }
133static inline void irq_complete_move(struct irq_cfg *c) { }
134#endif
135
136extern void apic_ack_edge(struct irq_data *data);
137#else	/*  CONFIG_X86_LOCAL_APIC */
138static inline void lock_vector_lock(void) {}
139static inline void unlock_vector_lock(void) {}
140#endif	/* CONFIG_X86_LOCAL_APIC */
 
 
141
142/* Statistics */
143extern atomic_t irq_err_count;
144extern atomic_t irq_mis_count;
145
146extern void elcr_set_level_irq(unsigned int irq);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
147
148extern char irq_entries_start[];
149#ifdef CONFIG_TRACING
150#define trace_irq_entries_start irq_entries_start
151#endif
152
153#define VECTOR_UNUSED		NULL
154#define VECTOR_RETRIGGERED	((void *)~0UL)
155
156typedef struct irq_desc* vector_irq_t[NR_VECTORS];
157DECLARE_PER_CPU(vector_irq_t, vector_irq);
 
 
 
 
 
 
 
 
 
 
 
158
159#endif /* !ASSEMBLY_ */
160
161#endif /* _ASM_X86_HW_IRQ_H */
v3.15
 
  1#ifndef _ASM_X86_HW_IRQ_H
  2#define _ASM_X86_HW_IRQ_H
  3
  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
 16#include <asm/irq_vectors.h>
 17
 
 
 18#ifndef __ASSEMBLY__
 19
 20#include <linux/percpu.h>
 21#include <linux/profile.h>
 22#include <linux/smp.h>
 23
 24#include <linux/atomic.h>
 25#include <asm/irq.h>
 26#include <asm/sections.h>
 27
 28/* Interrupt handlers registered during init_IRQ */
 29extern asmlinkage void apic_timer_interrupt(void);
 30extern asmlinkage void x86_platform_ipi(void);
 31extern asmlinkage void kvm_posted_intr_ipi(void);
 
 
 32extern asmlinkage void error_interrupt(void);
 33extern asmlinkage void irq_work_interrupt(void);
 
 34
 35extern asmlinkage void spurious_interrupt(void);
 36extern asmlinkage void thermal_interrupt(void);
 37extern asmlinkage void reschedule_interrupt(void);
 38
 39extern asmlinkage void invalidate_interrupt(void);
 40extern asmlinkage void invalidate_interrupt0(void);
 41extern asmlinkage void invalidate_interrupt1(void);
 42extern asmlinkage void invalidate_interrupt2(void);
 43extern asmlinkage void invalidate_interrupt3(void);
 44extern asmlinkage void invalidate_interrupt4(void);
 45extern asmlinkage void invalidate_interrupt5(void);
 46extern asmlinkage void invalidate_interrupt6(void);
 47extern asmlinkage void invalidate_interrupt7(void);
 48extern asmlinkage void invalidate_interrupt8(void);
 49extern asmlinkage void invalidate_interrupt9(void);
 50extern asmlinkage void invalidate_interrupt10(void);
 51extern asmlinkage void invalidate_interrupt11(void);
 52extern asmlinkage void invalidate_interrupt12(void);
 53extern asmlinkage void invalidate_interrupt13(void);
 54extern asmlinkage void invalidate_interrupt14(void);
 55extern asmlinkage void invalidate_interrupt15(void);
 56extern asmlinkage void invalidate_interrupt16(void);
 57extern asmlinkage void invalidate_interrupt17(void);
 58extern asmlinkage void invalidate_interrupt18(void);
 59extern asmlinkage void invalidate_interrupt19(void);
 60extern asmlinkage void invalidate_interrupt20(void);
 61extern asmlinkage void invalidate_interrupt21(void);
 62extern asmlinkage void invalidate_interrupt22(void);
 63extern asmlinkage void invalidate_interrupt23(void);
 64extern asmlinkage void invalidate_interrupt24(void);
 65extern asmlinkage void invalidate_interrupt25(void);
 66extern asmlinkage void invalidate_interrupt26(void);
 67extern asmlinkage void invalidate_interrupt27(void);
 68extern asmlinkage void invalidate_interrupt28(void);
 69extern asmlinkage void invalidate_interrupt29(void);
 70extern asmlinkage void invalidate_interrupt30(void);
 71extern asmlinkage void invalidate_interrupt31(void);
 72
 73extern asmlinkage void irq_move_cleanup_interrupt(void);
 74extern asmlinkage void reboot_interrupt(void);
 75extern asmlinkage void threshold_interrupt(void);
 
 76
 77extern asmlinkage void call_function_interrupt(void);
 78extern asmlinkage void call_function_single_interrupt(void);
 79
 80#ifdef CONFIG_TRACING
 81/* Interrupt handlers registered during init_IRQ */
 82extern void trace_apic_timer_interrupt(void);
 83extern void trace_x86_platform_ipi(void);
 84extern void trace_error_interrupt(void);
 85extern void trace_irq_work_interrupt(void);
 86extern void trace_spurious_interrupt(void);
 87extern void trace_thermal_interrupt(void);
 88extern void trace_reschedule_interrupt(void);
 89extern void trace_threshold_interrupt(void);
 90extern void trace_call_function_interrupt(void);
 91extern void trace_call_function_single_interrupt(void);
 92#define trace_irq_move_cleanup_interrupt  irq_move_cleanup_interrupt
 93#define trace_reboot_interrupt  reboot_interrupt
 94#define trace_kvm_posted_intr_ipi kvm_posted_intr_ipi
 95#endif /* CONFIG_TRACING */
 96
 97/* IOAPIC */
 98#define IO_APIC_IRQ(x) (((x) >= NR_IRQS_LEGACY) || ((1<<(x)) & io_apic_irqs))
 99extern unsigned long io_apic_irqs;
100
101extern void setup_IO_APIC(void);
102extern void disable_IO_APIC(void);
103
104struct io_apic_irq_attr {
105	int ioapic;
106	int ioapic_pin;
107	int trigger;
108	int polarity;
109};
110
111static inline void set_io_apic_irq_attr(struct io_apic_irq_attr *irq_attr,
112					int ioapic, int ioapic_pin,
113					int trigger, int polarity)
114{
115	irq_attr->ioapic	= ioapic;
116	irq_attr->ioapic_pin	= ioapic_pin;
117	irq_attr->trigger	= trigger;
118	irq_attr->polarity	= polarity;
119}
120
121/* Intel specific interrupt remapping information */
122struct irq_2_iommu {
123	struct intel_iommu *iommu;
124	u16 irte_index;
125	u16 sub_handle;
126	u8  irte_mask;
127};
128
129/* AMD specific interrupt remapping information */
130struct irq_2_irte {
131	u16 devid; /* Device ID for IRTE table */
132	u16 index; /* Index into IRTE table*/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133};
134
135/*
136 * This is performance-critical, we want to do it O(1)
137 *
138 * Most irqs are mapped 1:1 with pins.
139 */
140struct irq_cfg {
141	struct irq_pin_list	*irq_2_pin;
142	cpumask_var_t		domain;
143	cpumask_var_t		old_domain;
144	u8			vector;
145	u8			move_in_progress : 1;
146#ifdef CONFIG_IRQ_REMAP
147	u8			remapped : 1;
148	union {
149		struct irq_2_iommu irq_2_iommu;
150		struct irq_2_irte  irq_2_irte;
151	};
152#endif
153};
154
155extern int assign_irq_vector(int, struct irq_cfg *, const struct cpumask *);
 
 
 
 
156extern void send_cleanup_vector(struct irq_cfg *);
 
 
 
 
 
157
158struct irq_data;
159int __ioapic_set_affinity(struct irq_data *, const struct cpumask *,
160			  unsigned int *dest_id);
161extern int IO_APIC_get_PCI_irq_vector(int bus, int devfn, int pin, struct io_apic_irq_attr *irq_attr);
162extern void setup_ioapic_dest(void);
163
164extern void enable_IO_APIC(void);
165
166/* Statistics */
167extern atomic_t irq_err_count;
168extern atomic_t irq_mis_count;
169
170/* EISA */
171extern void eisa_set_level_irq(unsigned int irq);
172
173/* SMP */
174extern __visible void smp_apic_timer_interrupt(struct pt_regs *);
175extern __visible void smp_spurious_interrupt(struct pt_regs *);
176extern __visible void smp_x86_platform_ipi(struct pt_regs *);
177extern __visible void smp_error_interrupt(struct pt_regs *);
178#ifdef CONFIG_X86_IO_APIC
179extern asmlinkage void smp_irq_move_cleanup_interrupt(void);
180#endif
181#ifdef CONFIG_SMP
182extern __visible void smp_reschedule_interrupt(struct pt_regs *);
183extern __visible void smp_call_function_interrupt(struct pt_regs *);
184extern __visible void smp_call_function_single_interrupt(struct pt_regs *);
185extern __visible void smp_invalidate_interrupt(struct pt_regs *);
186#endif
187
188extern void (*__initconst interrupt[NR_VECTORS-FIRST_EXTERNAL_VECTOR])(void);
189#ifdef CONFIG_TRACING
190#define trace_interrupt interrupt
191#endif
192
193#define VECTOR_UNDEFINED	-1
194#define VECTOR_RETRIGGERED	-2
195
196typedef int vector_irq_t[NR_VECTORS];
197DECLARE_PER_CPU(vector_irq_t, vector_irq);
198extern void setup_vector_irq(int cpu);
199
200#ifdef CONFIG_X86_IO_APIC
201extern void lock_vector_lock(void);
202extern void unlock_vector_lock(void);
203extern void __setup_vector_irq(int cpu);
204#else
205static inline void lock_vector_lock(void) {}
206static inline void unlock_vector_lock(void) {}
207static inline void __setup_vector_irq(int cpu) {}
208#endif
209
210#endif /* !ASSEMBLY_ */
211
212#endif /* _ASM_X86_HW_IRQ_H */