1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IRQDOMAIN_H
3#define _ASM_IRQDOMAIN_H
4
5#include <linux/irqdomain.h>
6#include <asm/hw_irq.h>
7
8#ifdef CONFIG_X86_LOCAL_APIC
9enum {
10	/* Allocate contiguous CPU vectors */
11	X86_IRQ_ALLOC_CONTIGUOUS_VECTORS		= 0x1,
12	X86_IRQ_ALLOC_LEGACY				= 0x2,
13};
14
15extern struct irq_domain *x86_vector_domain;
16
17extern void init_irq_alloc_info(struct irq_alloc_info *info,
18				const struct cpumask *mask);
19extern void copy_irq_alloc_info(struct irq_alloc_info *dst,
20				struct irq_alloc_info *src);
21#endif /* CONFIG_X86_LOCAL_APIC */
22
23#ifdef CONFIG_X86_IO_APIC
24struct device_node;
25struct irq_data;
26
27enum ioapic_domain_type {
28	IOAPIC_DOMAIN_INVALID,
29	IOAPIC_DOMAIN_LEGACY,
30	IOAPIC_DOMAIN_STRICT,
31	IOAPIC_DOMAIN_DYNAMIC,
32};
33
34struct ioapic_domain_cfg {
35	enum ioapic_domain_type		type;
36	const struct irq_domain_ops	*ops;
37	struct device_node		*dev;
38};
39
40extern const struct irq_domain_ops mp_ioapic_irqdomain_ops;
41
42extern int mp_irqdomain_alloc(struct irq_domain *domain, unsigned int virq,
43			      unsigned int nr_irqs, void *arg);
44extern void mp_irqdomain_free(struct irq_domain *domain, unsigned int virq,
45			      unsigned int nr_irqs);
46extern int mp_irqdomain_activate(struct irq_domain *domain,
47				 struct irq_data *irq_data, bool reserve);
48extern void mp_irqdomain_deactivate(struct irq_domain *domain,
49				    struct irq_data *irq_data);
50extern int mp_irqdomain_ioapic_idx(struct irq_domain *domain);
51#endif /* CONFIG_X86_IO_APIC */
52
53#ifdef CONFIG_PCI_MSI
54void x86_create_pci_msi_domain(void);
55struct irq_domain *native_create_pci_msi_domain(void);
56extern struct irq_domain *x86_pci_msi_default_domain;
57#else
58static inline void x86_create_pci_msi_domain(void) { }
59#define native_create_pci_msi_domain	NULL
60#define x86_pci_msi_default_domain	NULL
61#endif
62
63#endif
64