162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _ASM_X86_HW_IRQ_H 362306a36Sopenharmony_ci#define _ASM_X86_HW_IRQ_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci/* 662306a36Sopenharmony_ci * (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * moved some of the old arch/i386/kernel/irq.h to here. VY 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * IRQ/IPI changes taken from work by Thomas Radke 1162306a36Sopenharmony_ci * <tomsoft@informatik.tu-chemnitz.de> 1262306a36Sopenharmony_ci * 1362306a36Sopenharmony_ci * hacked by Andi Kleen for x86-64. 1462306a36Sopenharmony_ci * unified by tglx 1562306a36Sopenharmony_ci */ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#include <asm/irq_vectors.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#define IRQ_MATRIX_BITS NR_VECTORS 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#include <linux/percpu.h> 2462306a36Sopenharmony_ci#include <linux/profile.h> 2562306a36Sopenharmony_ci#include <linux/smp.h> 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#include <linux/atomic.h> 2862306a36Sopenharmony_ci#include <asm/irq.h> 2962306a36Sopenharmony_ci#include <asm/sections.h> 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#ifdef CONFIG_X86_LOCAL_APIC 3262306a36Sopenharmony_cistruct irq_data; 3362306a36Sopenharmony_cistruct pci_dev; 3462306a36Sopenharmony_cistruct msi_desc; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cienum irq_alloc_type { 3762306a36Sopenharmony_ci X86_IRQ_ALLOC_TYPE_IOAPIC = 1, 3862306a36Sopenharmony_ci X86_IRQ_ALLOC_TYPE_HPET, 3962306a36Sopenharmony_ci X86_IRQ_ALLOC_TYPE_PCI_MSI, 4062306a36Sopenharmony_ci X86_IRQ_ALLOC_TYPE_PCI_MSIX, 4162306a36Sopenharmony_ci X86_IRQ_ALLOC_TYPE_DMAR, 4262306a36Sopenharmony_ci X86_IRQ_ALLOC_TYPE_AMDVI, 4362306a36Sopenharmony_ci X86_IRQ_ALLOC_TYPE_UV, 4462306a36Sopenharmony_ci}; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistruct ioapic_alloc_info { 4762306a36Sopenharmony_ci int pin; 4862306a36Sopenharmony_ci int node; 4962306a36Sopenharmony_ci u32 is_level : 1; 5062306a36Sopenharmony_ci u32 active_low : 1; 5162306a36Sopenharmony_ci u32 valid : 1; 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistruct uv_alloc_info { 5562306a36Sopenharmony_ci int limit; 5662306a36Sopenharmony_ci int blade; 5762306a36Sopenharmony_ci unsigned long offset; 5862306a36Sopenharmony_ci char *name; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci}; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci/** 6362306a36Sopenharmony_ci * irq_alloc_info - X86 specific interrupt allocation info 6462306a36Sopenharmony_ci * @type: X86 specific allocation type 6562306a36Sopenharmony_ci * @flags: Flags for allocation tweaks 6662306a36Sopenharmony_ci * @devid: Device ID for allocations 6762306a36Sopenharmony_ci * @hwirq: Associated hw interrupt number in the domain 6862306a36Sopenharmony_ci * @mask: CPU mask for vector allocation 6962306a36Sopenharmony_ci * @desc: Pointer to msi descriptor 7062306a36Sopenharmony_ci * @data: Allocation specific data 7162306a36Sopenharmony_ci * 7262306a36Sopenharmony_ci * @ioapic: IOAPIC specific allocation data 7362306a36Sopenharmony_ci * @uv: UV specific allocation data 7462306a36Sopenharmony_ci*/ 7562306a36Sopenharmony_cistruct irq_alloc_info { 7662306a36Sopenharmony_ci enum irq_alloc_type type; 7762306a36Sopenharmony_ci u32 flags; 7862306a36Sopenharmony_ci u32 devid; 7962306a36Sopenharmony_ci irq_hw_number_t hwirq; 8062306a36Sopenharmony_ci const struct cpumask *mask; 8162306a36Sopenharmony_ci struct msi_desc *desc; 8262306a36Sopenharmony_ci void *data; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci union { 8562306a36Sopenharmony_ci struct ioapic_alloc_info ioapic; 8662306a36Sopenharmony_ci struct uv_alloc_info uv; 8762306a36Sopenharmony_ci }; 8862306a36Sopenharmony_ci}; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cistruct irq_cfg { 9162306a36Sopenharmony_ci unsigned int dest_apicid; 9262306a36Sopenharmony_ci unsigned int vector; 9362306a36Sopenharmony_ci}; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ciextern struct irq_cfg *irq_cfg(unsigned int irq); 9662306a36Sopenharmony_ciextern struct irq_cfg *irqd_cfg(struct irq_data *irq_data); 9762306a36Sopenharmony_ciextern void lock_vector_lock(void); 9862306a36Sopenharmony_ciextern void unlock_vector_lock(void); 9962306a36Sopenharmony_ci#ifdef CONFIG_SMP 10062306a36Sopenharmony_ciextern void vector_schedule_cleanup(struct irq_cfg *); 10162306a36Sopenharmony_ciextern void irq_complete_move(struct irq_cfg *cfg); 10262306a36Sopenharmony_ci#else 10362306a36Sopenharmony_cistatic inline void vector_schedule_cleanup(struct irq_cfg *c) { } 10462306a36Sopenharmony_cistatic inline void irq_complete_move(struct irq_cfg *c) { } 10562306a36Sopenharmony_ci#endif 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ciextern void apic_ack_edge(struct irq_data *data); 10862306a36Sopenharmony_ci#else /* CONFIG_X86_LOCAL_APIC */ 10962306a36Sopenharmony_cistatic inline void lock_vector_lock(void) {} 11062306a36Sopenharmony_cistatic inline void unlock_vector_lock(void) {} 11162306a36Sopenharmony_ci#endif /* CONFIG_X86_LOCAL_APIC */ 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci/* Statistics */ 11462306a36Sopenharmony_ciextern atomic_t irq_err_count; 11562306a36Sopenharmony_ciextern atomic_t irq_mis_count; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ciextern void elcr_set_level_irq(unsigned int irq); 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ciextern char irq_entries_start[]; 12062306a36Sopenharmony_ci#ifdef CONFIG_TRACING 12162306a36Sopenharmony_ci#define trace_irq_entries_start irq_entries_start 12262306a36Sopenharmony_ci#endif 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ciextern char spurious_entries_start[]; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci#define VECTOR_UNUSED NULL 12762306a36Sopenharmony_ci#define VECTOR_SHUTDOWN ((void *)-1L) 12862306a36Sopenharmony_ci#define VECTOR_RETRIGGERED ((void *)-2L) 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_citypedef struct irq_desc* vector_irq_t[NR_VECTORS]; 13162306a36Sopenharmony_ciDECLARE_PER_CPU(vector_irq_t, vector_irq); 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci#endif /* !ASSEMBLY_ */ 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci#endif /* _ASM_X86_HW_IRQ_H */ 136