18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2012 Advanced Micro Devices, Inc.
48c2ecf20Sopenharmony_ci * Author: Joerg Roedel <joerg.roedel@amd.com>
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * This header file contains the interface of the interrupt remapping code to
78c2ecf20Sopenharmony_ci * the x86 interrupt management code.
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#ifndef __X86_IRQ_REMAPPING_H
118c2ecf20Sopenharmony_ci#define __X86_IRQ_REMAPPING_H
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#include <asm/irqdomain.h>
148c2ecf20Sopenharmony_ci#include <asm/hw_irq.h>
158c2ecf20Sopenharmony_ci#include <asm/io_apic.h>
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_cistruct msi_msg;
188c2ecf20Sopenharmony_cistruct irq_alloc_info;
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_cienum irq_remap_cap {
218c2ecf20Sopenharmony_ci	IRQ_POSTING_CAP = 0,
228c2ecf20Sopenharmony_ci};
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_cienum {
258c2ecf20Sopenharmony_ci	IRQ_REMAP_XAPIC_MODE,
268c2ecf20Sopenharmony_ci	IRQ_REMAP_X2APIC_MODE,
278c2ecf20Sopenharmony_ci};
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_cistruct vcpu_data {
308c2ecf20Sopenharmony_ci	u64 pi_desc_addr;	/* Physical address of PI Descriptor */
318c2ecf20Sopenharmony_ci	u32 vector;		/* Guest vector of the interrupt */
328c2ecf20Sopenharmony_ci};
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci#ifdef CONFIG_IRQ_REMAP
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ciextern raw_spinlock_t irq_2_ir_lock;
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ciextern bool irq_remapping_cap(enum irq_remap_cap cap);
398c2ecf20Sopenharmony_ciextern void set_irq_remapping_broken(void);
408c2ecf20Sopenharmony_ciextern int irq_remapping_prepare(void);
418c2ecf20Sopenharmony_ciextern int irq_remapping_enable(void);
428c2ecf20Sopenharmony_ciextern void irq_remapping_disable(void);
438c2ecf20Sopenharmony_ciextern int irq_remapping_reenable(int);
448c2ecf20Sopenharmony_ciextern int irq_remap_enable_fault_handling(void);
458c2ecf20Sopenharmony_ciextern void panic_if_irq_remap(const char *msg);
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ciextern struct irq_domain *
488c2ecf20Sopenharmony_ciirq_remapping_get_irq_domain(struct irq_alloc_info *info);
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci/* Create PCI MSI/MSIx irqdomain, use @parent as the parent irqdomain. */
518c2ecf20Sopenharmony_ciextern struct irq_domain *
528c2ecf20Sopenharmony_ciarch_create_remap_msi_irq_domain(struct irq_domain *par, const char *n, int id);
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci/* Get parent irqdomain for interrupt remapping irqdomain */
558c2ecf20Sopenharmony_cistatic inline struct irq_domain *arch_get_ir_parent_domain(void)
568c2ecf20Sopenharmony_ci{
578c2ecf20Sopenharmony_ci	return x86_vector_domain;
588c2ecf20Sopenharmony_ci}
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci#else  /* CONFIG_IRQ_REMAP */
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_cistatic inline bool irq_remapping_cap(enum irq_remap_cap cap) { return 0; }
638c2ecf20Sopenharmony_cistatic inline void set_irq_remapping_broken(void) { }
648c2ecf20Sopenharmony_cistatic inline int irq_remapping_prepare(void) { return -ENODEV; }
658c2ecf20Sopenharmony_cistatic inline int irq_remapping_enable(void) { return -ENODEV; }
668c2ecf20Sopenharmony_cistatic inline void irq_remapping_disable(void) { }
678c2ecf20Sopenharmony_cistatic inline int irq_remapping_reenable(int eim) { return -ENODEV; }
688c2ecf20Sopenharmony_cistatic inline int irq_remap_enable_fault_handling(void) { return -ENODEV; }
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_cistatic inline void panic_if_irq_remap(const char *msg)
718c2ecf20Sopenharmony_ci{
728c2ecf20Sopenharmony_ci}
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_cistatic inline struct irq_domain *
758c2ecf20Sopenharmony_ciirq_remapping_get_irq_domain(struct irq_alloc_info *info)
768c2ecf20Sopenharmony_ci{
778c2ecf20Sopenharmony_ci	return NULL;
788c2ecf20Sopenharmony_ci}
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci#endif /* CONFIG_IRQ_REMAP */
818c2ecf20Sopenharmony_ci#endif /* __X86_IRQ_REMAPPING_H */
82