diff options
author | Joerg Roedel <joerg.roedel@amd.com> | 2012-03-30 22:47:00 +0400 |
---|---|---|
committer | Joerg Roedel <joerg.roedel@amd.com> | 2012-05-07 16:34:59 +0400 |
commit | 736baef4472d00574089f295bc759ac002b9558c (patch) | |
tree | d4c9c69b1a0eecd6d87b3378a27396384e4b08f0 /arch/x86 | |
parent | eef93fdb7cd41ae36794db0e765059dc1039e940 (diff) | |
download | linux-736baef4472d00574089f295bc759ac002b9558c.tar.xz |
iommu/vt-d: Make intr-remapping initialization generic
This patch introduces irq_remap_ops to hold implementation
specific function pointer to handle interrupt remapping. As
the first part the initialization functions for VT-d are
converted to these ops.
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Acked-by: Yinghai Lu <yinghai@kernel.org>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/include/asm/intr_remapping.h | 45 | ||||
-rw-r--r-- | arch/x86/kernel/apic/apic.c | 14 | ||||
-rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 1 |
3 files changed, 55 insertions, 5 deletions
diff --git a/arch/x86/include/asm/intr_remapping.h b/arch/x86/include/asm/intr_remapping.h new file mode 100644 index 000000000000..207c605dbdf5 --- /dev/null +++ b/arch/x86/include/asm/intr_remapping.h @@ -0,0 +1,45 @@ +/* + * 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. + */ + +#ifndef __X86_INTR_REMAPPING_H +#define __X86_INTR_REMAPPING_H + +#ifdef CONFIG_IRQ_REMAP + +extern int intr_remapping_enabled; + +extern void setup_intr_remapping(void); +extern int intr_remapping_supported(void); +extern int intr_hardware_init(void); +extern int intr_hardware_enable(void); + +#else /* CONFIG_IRQ_REMAP */ + +#define intr_remapping_enabled 0 + +static inline void setup_intr_remapping(void) { } +static inline int intr_remapping_supported(void) { return 0; } +static inline int intr_hardware_init(void) { return -ENODEV; } +static inline int intr_hardware_enable(void) { return -ENODEV; } + +#endif /* CONFIG_IRQ_REMAP */ + +#endif /* __X86_INTR_REMAPPING_H */ diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index edc24480469f..1db6f63a22ff 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c @@ -35,6 +35,7 @@ #include <linux/smp.h> #include <linux/mm.h> +#include <asm/intr_remapping.h> #include <asm/perf_event.h> #include <asm/x86_init.h> #include <asm/pgalloc.h> @@ -1528,7 +1529,7 @@ int __init enable_IR(void) return -1; } - return enable_intr_remapping(); + return intr_hardware_enable(); #endif return -1; } @@ -1537,10 +1538,13 @@ void __init enable_IR_x2apic(void) { unsigned long flags; int ret, x2apic_enabled = 0; - int dmar_table_init_ret; + int hardware_init_ret; - dmar_table_init_ret = dmar_table_init(); - if (dmar_table_init_ret && !x2apic_supported()) + /* Make sure irq_remap_ops are initialized */ + setup_intr_remapping(); + + hardware_init_ret = intr_hardware_init(); + if (hardware_init_ret && !x2apic_supported()) return; ret = save_ioapic_entries(); @@ -1556,7 +1560,7 @@ void __init enable_IR_x2apic(void) if (x2apic_preenabled && nox2apic) disable_x2apic(); - if (dmar_table_init_ret) + if (hardware_init_ret) ret = -1; else ret = enable_IR(); diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index e88300d8e80a..1151fdccaad6 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -57,6 +57,7 @@ #include <asm/msidef.h> #include <asm/hypertransport.h> #include <asm/setup.h> +#include <asm/intr_remapping.h> #include <asm/irq_remapping.h> #include <asm/hpet.h> #include <asm/hw_irq.h> |