/* SPDX-License-Identifier: GPL-2.0 */ 
 | 
#ifndef _ASM_X86_HW_IRQ_H 
 | 
#define _ASM_X86_HW_IRQ_H 
 | 
  
 | 
/* 
 | 
 * (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar 
 | 
 * 
 | 
 * moved some of the old arch/i386/kernel/irq.h to here. VY 
 | 
 * 
 | 
 * IRQ/IPI changes taken from work by Thomas Radke 
 | 
 * <tomsoft@informatik.tu-chemnitz.de> 
 | 
 * 
 | 
 * hacked by Andi Kleen for x86-64. 
 | 
 * unified by tglx 
 | 
 */ 
 | 
  
 | 
#include <asm/irq_vectors.h> 
 | 
  
 | 
#define IRQ_MATRIX_BITS        NR_VECTORS 
 | 
  
 | 
#ifndef __ASSEMBLY__ 
 | 
  
 | 
#include <linux/percpu.h> 
 | 
#include <linux/profile.h> 
 | 
#include <linux/smp.h> 
 | 
  
 | 
#include <linux/atomic.h> 
 | 
#include <asm/irq.h> 
 | 
#include <asm/sections.h> 
 | 
  
 | 
#ifdef    CONFIG_X86_LOCAL_APIC 
 | 
struct irq_data; 
 | 
struct pci_dev; 
 | 
struct msi_desc; 
 | 
  
 | 
enum irq_alloc_type { 
 | 
    X86_IRQ_ALLOC_TYPE_IOAPIC = 1, 
 | 
    X86_IRQ_ALLOC_TYPE_HPET, 
 | 
    X86_IRQ_ALLOC_TYPE_PCI_MSI, 
 | 
    X86_IRQ_ALLOC_TYPE_PCI_MSIX, 
 | 
    X86_IRQ_ALLOC_TYPE_DMAR, 
 | 
    X86_IRQ_ALLOC_TYPE_UV, 
 | 
    X86_IRQ_ALLOC_TYPE_IOAPIC_GET_PARENT, 
 | 
    X86_IRQ_ALLOC_TYPE_HPET_GET_PARENT, 
 | 
}; 
 | 
  
 | 
struct ioapic_alloc_info { 
 | 
    int                pin; 
 | 
    int                node; 
 | 
    u32                trigger : 1; 
 | 
    u32                polarity : 1; 
 | 
    u32                valid : 1; 
 | 
    struct IO_APIC_route_entry    *entry; 
 | 
}; 
 | 
  
 | 
struct uv_alloc_info { 
 | 
    int        limit; 
 | 
    int        blade; 
 | 
    unsigned long    offset; 
 | 
    char        *name; 
 | 
  
 | 
}; 
 | 
  
 | 
/** 
 | 
 * irq_alloc_info - X86 specific interrupt allocation info 
 | 
 * @type:    X86 specific allocation type 
 | 
 * @flags:    Flags for allocation tweaks 
 | 
 * @devid:    Device ID for allocations 
 | 
 * @hwirq:    Associated hw interrupt number in the domain 
 | 
 * @mask:    CPU mask for vector allocation 
 | 
 * @desc:    Pointer to msi descriptor 
 | 
 * @data:    Allocation specific data 
 | 
 * 
 | 
 * @ioapic:    IOAPIC specific allocation data 
 | 
 * @uv:        UV specific allocation data 
 | 
*/ 
 | 
struct irq_alloc_info { 
 | 
    enum irq_alloc_type    type; 
 | 
    u32            flags; 
 | 
    u32            devid; 
 | 
    irq_hw_number_t        hwirq; 
 | 
    const struct cpumask    *mask; 
 | 
    struct msi_desc        *desc; 
 | 
    void            *data; 
 | 
  
 | 
    union { 
 | 
        struct ioapic_alloc_info    ioapic; 
 | 
        struct uv_alloc_info        uv; 
 | 
    }; 
 | 
}; 
 | 
  
 | 
struct irq_cfg { 
 | 
    unsigned int        dest_apicid; 
 | 
    unsigned int        vector; 
 | 
}; 
 | 
  
 | 
extern struct irq_cfg *irq_cfg(unsigned int irq); 
 | 
extern struct irq_cfg *irqd_cfg(struct irq_data *irq_data); 
 | 
extern void lock_vector_lock(void); 
 | 
extern void unlock_vector_lock(void); 
 | 
#ifdef CONFIG_SMP 
 | 
extern void send_cleanup_vector(struct irq_cfg *); 
 | 
extern void irq_complete_move(struct irq_cfg *cfg); 
 | 
#else 
 | 
static inline void send_cleanup_vector(struct irq_cfg *c) { } 
 | 
static inline void irq_complete_move(struct irq_cfg *c) { } 
 | 
#endif 
 | 
  
 | 
extern void apic_ack_edge(struct irq_data *data); 
 | 
#else    /*  CONFIG_X86_LOCAL_APIC */ 
 | 
static inline void lock_vector_lock(void) {} 
 | 
static inline void unlock_vector_lock(void) {} 
 | 
#endif    /* CONFIG_X86_LOCAL_APIC */ 
 | 
  
 | 
/* Statistics */ 
 | 
extern atomic_t irq_err_count; 
 | 
extern atomic_t irq_mis_count; 
 | 
  
 | 
extern void elcr_set_level_irq(unsigned int irq); 
 | 
  
 | 
extern char irq_entries_start[]; 
 | 
#ifdef CONFIG_TRACING 
 | 
#define trace_irq_entries_start irq_entries_start 
 | 
#endif 
 | 
  
 | 
extern char spurious_entries_start[]; 
 | 
  
 | 
#define VECTOR_UNUSED        NULL 
 | 
#define VECTOR_SHUTDOWN        ((void *)-1L) 
 | 
#define VECTOR_RETRIGGERED    ((void *)-2L) 
 | 
  
 | 
typedef struct irq_desc* vector_irq_t[NR_VECTORS]; 
 | 
DECLARE_PER_CPU(vector_irq_t, vector_irq); 
 | 
  
 | 
#endif /* !ASSEMBLY_ */ 
 | 
  
 | 
#endif /* _ASM_X86_HW_IRQ_H */ 
 |