blob: 2851077b6051b257e710dd437e2cdba7b1516e56 [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);
Ingo Molnar241771e2008-12-03 10:39:53 +010039
Andi Kleen1d9090e2013-08-05 15:02:37 -070040extern asmlinkage void spurious_interrupt(void);
41extern asmlinkage void thermal_interrupt(void);
42extern asmlinkage void reschedule_interrupt(void);
Thomas Gleixner2e088432008-05-02 19:00:30 +020043
Andi Kleen1d9090e2013-08-05 15:02:37 -070044extern asmlinkage void irq_move_cleanup_interrupt(void);
45extern asmlinkage void reboot_interrupt(void);
46extern asmlinkage void threshold_interrupt(void);
Aravind Gopalakrishnan24fd78a2015-05-06 06:58:56 -050047extern asmlinkage void deferred_error_interrupt(void);
Thomas Gleixner2e088432008-05-02 19:00:30 +020048
Andi Kleen1d9090e2013-08-05 15:02:37 -070049extern asmlinkage void call_function_interrupt(void);
50extern asmlinkage void call_function_single_interrupt(void);
Thomas Gleixner2e088432008-05-02 19:00:30 +020051
Jiang Liu26011ee2014-10-27 16:11:56 +080052#ifdef CONFIG_X86_LOCAL_APIC
Jiang Liu74afab72014-10-27 16:12:00 +080053struct irq_data;
Jiang Liu947045a2015-04-13 14:11:30 +080054struct pci_dev;
55struct msi_desc;
56
57enum irq_alloc_type {
58 X86_IRQ_ALLOC_TYPE_IOAPIC = 1,
59 X86_IRQ_ALLOC_TYPE_HPET,
60 X86_IRQ_ALLOC_TYPE_MSI,
61 X86_IRQ_ALLOC_TYPE_MSIX,
Jiang Liu0921f1d2015-04-13 14:11:42 +080062 X86_IRQ_ALLOC_TYPE_DMAR,
Jiang Liu43fe1ab2015-04-13 14:11:44 +080063 X86_IRQ_ALLOC_TYPE_UV,
Jiang Liu947045a2015-04-13 14:11:30 +080064};
Jiang Liub5dc8e62015-04-13 14:11:24 +080065
66struct irq_alloc_info {
Jiang Liu947045a2015-04-13 14:11:30 +080067 enum irq_alloc_type type;
Jiang Liub5dc8e62015-04-13 14:11:24 +080068 u32 flags;
69 const struct cpumask *mask; /* CPU mask for vector allocation */
Jiang Liu947045a2015-04-13 14:11:30 +080070 union {
71 int unused;
72#ifdef CONFIG_HPET_TIMER
73 struct {
74 int hpet_id;
75 int hpet_index;
76 void *hpet_data;
77 };
78#endif
79#ifdef CONFIG_PCI_MSI
80 struct {
81 struct pci_dev *msi_dev;
82 irq_hw_number_t msi_hwirq;
83 };
84#endif
85#ifdef CONFIG_X86_IO_APIC
86 struct {
87 int ioapic_id;
88 int ioapic_pin;
89 int ioapic_node;
90 u32 ioapic_trigger : 1;
91 u32 ioapic_polarity : 1;
92 u32 ioapic_valid : 1;
93 struct IO_APIC_route_entry *ioapic_entry;
94 };
95#endif
Jiang Liu0921f1d2015-04-13 14:11:42 +080096#ifdef CONFIG_DMAR_TABLE
97 struct {
98 int dmar_id;
99 void *dmar_data;
100 };
101#endif
Jiang Liu43fe1ab2015-04-13 14:11:44 +0800102#ifdef CONFIG_X86_UV
103 struct {
104 int uv_limit;
105 int uv_blade;
106 unsigned long uv_offset;
107 char *uv_name;
108 };
109#endif
Keith Busch185a3832016-01-12 13:18:10 -0700110#if IS_ENABLED(CONFIG_VMD)
111 struct {
112 struct msi_desc *desc;
113 };
114#endif
Jiang Liu947045a2015-04-13 14:11:30 +0800115 };
Jiang Liub5dc8e62015-04-13 14:11:24 +0800116};
117
Jiang Liu26011ee2014-10-27 16:11:56 +0800118struct irq_cfg {
Jiang Liu5f0052f2015-04-13 14:11:23 +0800119 unsigned int dest_apicid;
Thomas Gleixnerba224fe2017-09-13 23:29:45 +0200120 unsigned int vector;
Jiang Liu26011ee2014-10-27 16:11:56 +0800121};
122
Jiang Liu55a0e2b2014-10-27 16:11:59 +0800123extern struct irq_cfg *irq_cfg(unsigned int irq);
124extern struct irq_cfg *irqd_cfg(struct irq_data *irq_data);
Jiang Liu74afab72014-10-27 16:12:00 +0800125extern void lock_vector_lock(void);
126extern void unlock_vector_lock(void);
Jiang Liu26011ee2014-10-27 16:11:56 +0800127#ifdef CONFIG_SMP
128extern void send_cleanup_vector(struct irq_cfg *);
Thomas Gleixnerf0e5bf72014-11-05 10:12:27 +0100129extern void irq_complete_move(struct irq_cfg *cfg);
Jiang Liu26011ee2014-10-27 16:11:56 +0800130#else
131static inline void send_cleanup_vector(struct irq_cfg *c) { }
Thomas Gleixnerf0e5bf72014-11-05 10:12:27 +0100132static inline void irq_complete_move(struct irq_cfg *c) { }
Jiang Liu26011ee2014-10-27 16:11:56 +0800133#endif
134
Jiang Liu74afab72014-10-27 16:12:00 +0800135extern void apic_ack_edge(struct irq_data *data);
Jiang Liu74afab72014-10-27 16:12:00 +0800136#else /* CONFIG_X86_LOCAL_APIC */
Jiang Liu26011ee2014-10-27 16:11:56 +0800137static inline void lock_vector_lock(void) {}
138static inline void unlock_vector_lock(void) {}
Jiang Liu74afab72014-10-27 16:12:00 +0800139#endif /* CONFIG_X86_LOCAL_APIC */
Jiang Liu26011ee2014-10-27 16:11:56 +0800140
Thomas Gleixner2e088432008-05-02 19:00:30 +0200141/* Statistics */
142extern atomic_t irq_err_count;
143extern atomic_t irq_mis_count;
144
Paul Gortmakerea6cd252015-05-09 20:27:37 -0400145extern void elcr_set_level_irq(unsigned int irq);
Thomas Gleixner1a331952008-05-03 00:30:50 +0200146
Denys Vlasenko3304c9c2015-04-03 21:49:13 +0200147extern char irq_entries_start[];
Seiji Aguchi25c74b12013-10-30 16:37:00 -0400148#ifdef CONFIG_TRACING
Denys Vlasenko3304c9c2015-04-03 21:49:13 +0200149#define trace_irq_entries_start irq_entries_start
Seiji Aguchi25c74b12013-10-30 16:37:00 -0400150#endif
Eric W. Biedermand388e5f2008-08-09 15:09:02 -0700151
Thomas Gleixnera782a7e2015-08-02 20:38:27 +0000152#define VECTOR_UNUSED NULL
153#define VECTOR_RETRIGGERED ((void *)~0UL)
Prarit Bhargava93450052014-01-05 11:10:52 -0500154
Thomas Gleixnera782a7e2015-08-02 20:38:27 +0000155typedef struct irq_desc* vector_irq_t[NR_VECTORS];
Yinghai Lu497c9a12008-08-19 20:50:28 -0700156DECLARE_PER_CPU(vector_irq_t, vector_irq);
Thomas Gleixner2e088432008-05-02 19:00:30 +0200157
Thomas Gleixner22dc12d2008-05-02 22:10:39 +0200158#endif /* !ASSEMBLY_ */
159
H. Peter Anvin1965aae2008-10-22 22:26:29 -0700160#endif /* _ASM_X86_HW_IRQ_H */