-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'intr-remapping-ops-for-ingo' of git://git.kernel.org/pub/s…
…cm/linux/kernel/git/joro/iommu into core/iommu - This patchset introduces a generic ops-interface for accessing interrupt remapping hardware on x86. It factors out the VT-d specific code from io_apic.c and moves it to drivers/iommu. These changes will be used to add support for AMD interrupt remapping hardware. Signed-off-by: Ingo Molnar <mingo@kernel.org>
- Loading branch information
Showing
12 changed files
with
724 additions
and
450 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
#ifndef __IA64_INTR_REMAPPING_H | ||
#define __IA64_INTR_REMAPPING_H | ||
#define irq_remapping_enabled 0 | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,45 +1,103 @@ | ||
#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 | ||
|
||
#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) | ||
|
||
struct IO_APIC_route_entry; | ||
struct io_apic_irq_attr; | ||
struct pci_dev; | ||
|
||
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) | ||
{ | ||
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; | ||
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 */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.