18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef _ASM_IRQDOMAIN_H
38c2ecf20Sopenharmony_ci#define _ASM_IRQDOMAIN_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <linux/irqdomain.h>
68c2ecf20Sopenharmony_ci#include <asm/hw_irq.h>
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#ifdef CONFIG_X86_LOCAL_APIC
98c2ecf20Sopenharmony_cienum {
108c2ecf20Sopenharmony_ci	/* Allocate contiguous CPU vectors */
118c2ecf20Sopenharmony_ci	X86_IRQ_ALLOC_CONTIGUOUS_VECTORS		= 0x1,
128c2ecf20Sopenharmony_ci	X86_IRQ_ALLOC_LEGACY				= 0x2,
138c2ecf20Sopenharmony_ci};
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ciextern struct irq_domain *x86_vector_domain;
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ciextern void init_irq_alloc_info(struct irq_alloc_info *info,
188c2ecf20Sopenharmony_ci				const struct cpumask *mask);
198c2ecf20Sopenharmony_ciextern void copy_irq_alloc_info(struct irq_alloc_info *dst,
208c2ecf20Sopenharmony_ci				struct irq_alloc_info *src);
218c2ecf20Sopenharmony_ci#endif /* CONFIG_X86_LOCAL_APIC */
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci#ifdef CONFIG_X86_IO_APIC
248c2ecf20Sopenharmony_cistruct device_node;
258c2ecf20Sopenharmony_cistruct irq_data;
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_cienum ioapic_domain_type {
288c2ecf20Sopenharmony_ci	IOAPIC_DOMAIN_INVALID,
298c2ecf20Sopenharmony_ci	IOAPIC_DOMAIN_LEGACY,
308c2ecf20Sopenharmony_ci	IOAPIC_DOMAIN_STRICT,
318c2ecf20Sopenharmony_ci	IOAPIC_DOMAIN_DYNAMIC,
328c2ecf20Sopenharmony_ci};
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_cistruct ioapic_domain_cfg {
358c2ecf20Sopenharmony_ci	enum ioapic_domain_type		type;
368c2ecf20Sopenharmony_ci	const struct irq_domain_ops	*ops;
378c2ecf20Sopenharmony_ci	struct device_node		*dev;
388c2ecf20Sopenharmony_ci};
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ciextern const struct irq_domain_ops mp_ioapic_irqdomain_ops;
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ciextern int mp_irqdomain_alloc(struct irq_domain *domain, unsigned int virq,
438c2ecf20Sopenharmony_ci			      unsigned int nr_irqs, void *arg);
448c2ecf20Sopenharmony_ciextern void mp_irqdomain_free(struct irq_domain *domain, unsigned int virq,
458c2ecf20Sopenharmony_ci			      unsigned int nr_irqs);
468c2ecf20Sopenharmony_ciextern int mp_irqdomain_activate(struct irq_domain *domain,
478c2ecf20Sopenharmony_ci				 struct irq_data *irq_data, bool reserve);
488c2ecf20Sopenharmony_ciextern void mp_irqdomain_deactivate(struct irq_domain *domain,
498c2ecf20Sopenharmony_ci				    struct irq_data *irq_data);
508c2ecf20Sopenharmony_ciextern int mp_irqdomain_ioapic_idx(struct irq_domain *domain);
518c2ecf20Sopenharmony_ci#endif /* CONFIG_X86_IO_APIC */
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci#ifdef CONFIG_PCI_MSI
548c2ecf20Sopenharmony_civoid x86_create_pci_msi_domain(void);
558c2ecf20Sopenharmony_cistruct irq_domain *native_create_pci_msi_domain(void);
568c2ecf20Sopenharmony_ciextern struct irq_domain *x86_pci_msi_default_domain;
578c2ecf20Sopenharmony_ci#else
588c2ecf20Sopenharmony_cistatic inline void x86_create_pci_msi_domain(void) { }
598c2ecf20Sopenharmony_ci#define native_create_pci_msi_domain	NULL
608c2ecf20Sopenharmony_ci#define x86_pci_msi_default_domain	NULL
618c2ecf20Sopenharmony_ci#endif
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci#endif
64