18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef _ASM_X86_HW_IRQ_H 38c2ecf20Sopenharmony_ci#define _ASM_X86_HW_IRQ_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci/* 68c2ecf20Sopenharmony_ci * (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * moved some of the old arch/i386/kernel/irq.h to here. VY 98c2ecf20Sopenharmony_ci * 108c2ecf20Sopenharmony_ci * IRQ/IPI changes taken from work by Thomas Radke 118c2ecf20Sopenharmony_ci * <tomsoft@informatik.tu-chemnitz.de> 128c2ecf20Sopenharmony_ci * 138c2ecf20Sopenharmony_ci * hacked by Andi Kleen for x86-64. 148c2ecf20Sopenharmony_ci * unified by tglx 158c2ecf20Sopenharmony_ci */ 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#include <asm/irq_vectors.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#define IRQ_MATRIX_BITS NR_VECTORS 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#ifndef __ASSEMBLY__ 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci#include <linux/percpu.h> 248c2ecf20Sopenharmony_ci#include <linux/profile.h> 258c2ecf20Sopenharmony_ci#include <linux/smp.h> 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#include <linux/atomic.h> 288c2ecf20Sopenharmony_ci#include <asm/irq.h> 298c2ecf20Sopenharmony_ci#include <asm/sections.h> 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci#ifdef CONFIG_X86_LOCAL_APIC 328c2ecf20Sopenharmony_cistruct irq_data; 338c2ecf20Sopenharmony_cistruct pci_dev; 348c2ecf20Sopenharmony_cistruct msi_desc; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cienum irq_alloc_type { 378c2ecf20Sopenharmony_ci X86_IRQ_ALLOC_TYPE_IOAPIC = 1, 388c2ecf20Sopenharmony_ci X86_IRQ_ALLOC_TYPE_HPET, 398c2ecf20Sopenharmony_ci X86_IRQ_ALLOC_TYPE_PCI_MSI, 408c2ecf20Sopenharmony_ci X86_IRQ_ALLOC_TYPE_PCI_MSIX, 418c2ecf20Sopenharmony_ci X86_IRQ_ALLOC_TYPE_DMAR, 428c2ecf20Sopenharmony_ci X86_IRQ_ALLOC_TYPE_UV, 438c2ecf20Sopenharmony_ci X86_IRQ_ALLOC_TYPE_IOAPIC_GET_PARENT, 448c2ecf20Sopenharmony_ci X86_IRQ_ALLOC_TYPE_HPET_GET_PARENT, 458c2ecf20Sopenharmony_ci}; 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_cistruct ioapic_alloc_info { 488c2ecf20Sopenharmony_ci int pin; 498c2ecf20Sopenharmony_ci int node; 508c2ecf20Sopenharmony_ci u32 trigger : 1; 518c2ecf20Sopenharmony_ci u32 polarity : 1; 528c2ecf20Sopenharmony_ci u32 valid : 1; 538c2ecf20Sopenharmony_ci struct IO_APIC_route_entry *entry; 548c2ecf20Sopenharmony_ci}; 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_cistruct uv_alloc_info { 578c2ecf20Sopenharmony_ci int limit; 588c2ecf20Sopenharmony_ci int blade; 598c2ecf20Sopenharmony_ci unsigned long offset; 608c2ecf20Sopenharmony_ci char *name; 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci}; 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci/** 658c2ecf20Sopenharmony_ci * irq_alloc_info - X86 specific interrupt allocation info 668c2ecf20Sopenharmony_ci * @type: X86 specific allocation type 678c2ecf20Sopenharmony_ci * @flags: Flags for allocation tweaks 688c2ecf20Sopenharmony_ci * @devid: Device ID for allocations 698c2ecf20Sopenharmony_ci * @hwirq: Associated hw interrupt number in the domain 708c2ecf20Sopenharmony_ci * @mask: CPU mask for vector allocation 718c2ecf20Sopenharmony_ci * @desc: Pointer to msi descriptor 728c2ecf20Sopenharmony_ci * @data: Allocation specific data 738c2ecf20Sopenharmony_ci * 748c2ecf20Sopenharmony_ci * @ioapic: IOAPIC specific allocation data 758c2ecf20Sopenharmony_ci * @uv: UV specific allocation data 768c2ecf20Sopenharmony_ci*/ 778c2ecf20Sopenharmony_cistruct irq_alloc_info { 788c2ecf20Sopenharmony_ci enum irq_alloc_type type; 798c2ecf20Sopenharmony_ci u32 flags; 808c2ecf20Sopenharmony_ci u32 devid; 818c2ecf20Sopenharmony_ci irq_hw_number_t hwirq; 828c2ecf20Sopenharmony_ci const struct cpumask *mask; 838c2ecf20Sopenharmony_ci struct msi_desc *desc; 848c2ecf20Sopenharmony_ci void *data; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci union { 878c2ecf20Sopenharmony_ci struct ioapic_alloc_info ioapic; 888c2ecf20Sopenharmony_ci struct uv_alloc_info uv; 898c2ecf20Sopenharmony_ci }; 908c2ecf20Sopenharmony_ci}; 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_cistruct irq_cfg { 938c2ecf20Sopenharmony_ci unsigned int dest_apicid; 948c2ecf20Sopenharmony_ci unsigned int vector; 958c2ecf20Sopenharmony_ci}; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ciextern struct irq_cfg *irq_cfg(unsigned int irq); 988c2ecf20Sopenharmony_ciextern struct irq_cfg *irqd_cfg(struct irq_data *irq_data); 998c2ecf20Sopenharmony_ciextern void lock_vector_lock(void); 1008c2ecf20Sopenharmony_ciextern void unlock_vector_lock(void); 1018c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP 1028c2ecf20Sopenharmony_ciextern void send_cleanup_vector(struct irq_cfg *); 1038c2ecf20Sopenharmony_ciextern void irq_complete_move(struct irq_cfg *cfg); 1048c2ecf20Sopenharmony_ci#else 1058c2ecf20Sopenharmony_cistatic inline void send_cleanup_vector(struct irq_cfg *c) { } 1068c2ecf20Sopenharmony_cistatic inline void irq_complete_move(struct irq_cfg *c) { } 1078c2ecf20Sopenharmony_ci#endif 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ciextern void apic_ack_edge(struct irq_data *data); 1108c2ecf20Sopenharmony_ci#else /* CONFIG_X86_LOCAL_APIC */ 1118c2ecf20Sopenharmony_cistatic inline void lock_vector_lock(void) {} 1128c2ecf20Sopenharmony_cistatic inline void unlock_vector_lock(void) {} 1138c2ecf20Sopenharmony_ci#endif /* CONFIG_X86_LOCAL_APIC */ 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci/* Statistics */ 1168c2ecf20Sopenharmony_ciextern atomic_t irq_err_count; 1178c2ecf20Sopenharmony_ciextern atomic_t irq_mis_count; 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ciextern void elcr_set_level_irq(unsigned int irq); 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ciextern char irq_entries_start[]; 1228c2ecf20Sopenharmony_ci#ifdef CONFIG_TRACING 1238c2ecf20Sopenharmony_ci#define trace_irq_entries_start irq_entries_start 1248c2ecf20Sopenharmony_ci#endif 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ciextern char spurious_entries_start[]; 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci#define VECTOR_UNUSED NULL 1298c2ecf20Sopenharmony_ci#define VECTOR_SHUTDOWN ((void *)-1L) 1308c2ecf20Sopenharmony_ci#define VECTOR_RETRIGGERED ((void *)-2L) 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_citypedef struct irq_desc* vector_irq_t[NR_VECTORS]; 1338c2ecf20Sopenharmony_ciDECLARE_PER_CPU(vector_irq_t, vector_irq); 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci#endif /* !ASSEMBLY_ */ 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci#endif /* _ASM_X86_HW_IRQ_H */ 138