diff options
Diffstat (limited to 'arch/x86/include/asm/irq_remapping.h')
| -rw-r--r-- | arch/x86/include/asm/irq_remapping.h | 118 | 
1 files changed, 87 insertions, 31 deletions
diff --git a/arch/x86/include/asm/irq_remapping.h b/arch/x86/include/asm/irq_remapping.h index 47d99934580..5fb9bbbd2f1 100644 --- a/arch/x86/include/asm/irq_remapping.h +++ b/arch/x86/include/asm/irq_remapping.h @@ -1,45 +1,101 @@ -#ifndef _ASM_X86_IRQ_REMAPPING_H -#define _ASM_X86_IRQ_REMAPPING_H +/* + * Copyright (C) 2012 Advanced Micro Devices, Inc. + * Author: Joerg Roedel <joerg.roedel@amd.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA + * + * This header file contains the interface of the interrupt remapping code to + * the x86 interrupt management code. + */ -#define IRTE_DEST(dest) ((x2apic_mode) ? dest : dest << 8) +#ifndef __X86_IRQ_REMAPPING_H +#define __X86_IRQ_REMAPPING_H + +#include <asm/io_apic.h>  #ifdef CONFIG_IRQ_REMAP -static void irq_remap_modify_chip_defaults(struct irq_chip *chip); -static inline void prepare_irte(struct irte *irte, int vector, -			        unsigned int dest) -{ -	memset(irte, 0, sizeof(*irte)); -	irte->present = 1; -	irte->dst_mode = apic->irq_dest_mode; -	/* -	 * Trigger mode in the IRTE will always be edge, and for IO-APIC, the -	 * actual level or edge trigger will be setup in the IO-APIC -	 * RTE. This will help simplify level triggered irq migration. -	 * For more details, see the comments (in io_apic.c) explainig IO-APIC -	 * irq migration in the presence of interrupt-remapping. -	*/ -	irte->trigger_mode = 0; -	irte->dlvry_mode = apic->irq_delivery_mode; -	irte->vector = vector; -	irte->dest_id = IRTE_DEST(dest); -	irte->redir_hint = 1; +extern int irq_remapping_enabled; + +extern void setup_irq_remapping_ops(void); +extern int irq_remapping_supported(void); +extern int irq_remapping_prepare(void); +extern int irq_remapping_enable(void); +extern void irq_remapping_disable(void); +extern int irq_remapping_reenable(int); +extern int irq_remap_enable_fault_handling(void); +extern int setup_ioapic_remapped_entry(int irq, +				       struct IO_APIC_route_entry *entry, +				       unsigned int destination, +				       int vector, +				       struct io_apic_irq_attr *attr); +extern int set_remapped_irq_affinity(struct irq_data *data, +				     const struct cpumask *mask, +				     bool force); +extern void free_remapped_irq(int irq); +extern void compose_remapped_msi_msg(struct pci_dev *pdev, +				     unsigned int irq, unsigned int dest, +				     struct msi_msg *msg, u8 hpet_id); +extern int msi_alloc_remapped_irq(struct pci_dev *pdev, int irq, int nvec); +extern int msi_setup_remapped_irq(struct pci_dev *pdev, unsigned int irq, +				  int index, int sub_handle); +extern int setup_hpet_msi_remapped(unsigned int irq, unsigned int id); + +#else  /* CONFIG_IRQ_REMAP */ + +#define irq_remapping_enabled	0 + +static inline void setup_irq_remapping_ops(void) { } +static inline int irq_remapping_supported(void) { return 0; } +static inline int irq_remapping_prepare(void) { return -ENODEV; } +static inline int irq_remapping_enable(void) { return -ENODEV; } +static inline void irq_remapping_disable(void) { } +static inline int irq_remapping_reenable(int eim) { return -ENODEV; } +static inline int irq_remap_enable_fault_handling(void) { return -ENODEV; } +static inline int setup_ioapic_remapped_entry(int irq, +					      struct IO_APIC_route_entry *entry, +					      unsigned int destination, +					      int vector, +					      struct io_apic_irq_attr *attr) +{ +	return -ENODEV; +} +static inline int set_remapped_irq_affinity(struct irq_data *data, +					    const struct cpumask *mask, +					    bool force) +{ +	return 0;  } -static inline bool irq_remapped(struct irq_cfg *cfg) +static inline void free_remapped_irq(int irq) { } +static inline void compose_remapped_msi_msg(struct pci_dev *pdev, +					    unsigned int irq, unsigned int dest, +					    struct msi_msg *msg, u8 hpet_id)  { -	return cfg->irq_2_iommu.iommu != NULL;  } -#else -static void prepare_irte(struct irte *irte, int vector, unsigned int dest) +static inline int msi_alloc_remapped_irq(struct pci_dev *pdev, int irq, int nvec)  { +	return -ENODEV;  } -static inline bool irq_remapped(struct irq_cfg *cfg) +static inline int msi_setup_remapped_irq(struct pci_dev *pdev, unsigned int irq, +					 int index, int sub_handle)  { -	return false; +	return -ENODEV;  } -static inline void irq_remap_modify_chip_defaults(struct irq_chip *chip) +static inline int setup_hpet_msi_remapped(unsigned int irq, unsigned int id)  { +	return -ENODEV;  } -#endif +#endif /* CONFIG_IRQ_REMAP */ -#endif	/* _ASM_X86_IRQ_REMAPPING_H */ +#endif /* __X86_IRQ_REMAPPING_H */  |