linux/arch/x86/include/asm/hw_irq.h
<<
>>
Prefs
   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 */
 162