Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 736baef4 authored by Joerg Roedel's avatar Joerg Roedel
Browse files

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: default avatarJoerg Roedel <joerg.roedel@amd.com>
Acked-by: default avatarYinghai Lu <yinghai@kernel.org>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: default avatarJoerg Roedel <joerg.roedel@amd.com>
parent eef93fdb
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
#ifndef __IA64_INTR_REMAPPING_H
#define __IA64_INTR_REMAPPING_H
#define intr_remapping_enabled 0
#endif
+45 −0
Original line number Original line Diff line number Diff line
/*
 * 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 */
+9 −5
Original line number Original line Diff line number Diff line
@@ -35,6 +35,7 @@
#include <linux/smp.h>
#include <linux/smp.h>
#include <linux/mm.h>
#include <linux/mm.h>


#include <asm/intr_remapping.h>
#include <asm/perf_event.h>
#include <asm/perf_event.h>
#include <asm/x86_init.h>
#include <asm/x86_init.h>
#include <asm/pgalloc.h>
#include <asm/pgalloc.h>
@@ -1528,7 +1529,7 @@ int __init enable_IR(void)
		return -1;
		return -1;
	}
	}


	return enable_intr_remapping();
	return intr_hardware_enable();
#endif
#endif
	return -1;
	return -1;
}
}
@@ -1537,10 +1538,13 @@ void __init enable_IR_x2apic(void)
{
{
	unsigned long flags;
	unsigned long flags;
	int ret, x2apic_enabled = 0;
	int ret, x2apic_enabled = 0;
	int dmar_table_init_ret;
	int hardware_init_ret;


	dmar_table_init_ret = dmar_table_init();
	/* Make sure irq_remap_ops are initialized */
	if (dmar_table_init_ret && !x2apic_supported())
	setup_intr_remapping();

	hardware_init_ret = intr_hardware_init();
	if (hardware_init_ret && !x2apic_supported())
		return;
		return;


	ret = save_ioapic_entries();
	ret = save_ioapic_entries();
@@ -1556,7 +1560,7 @@ void __init enable_IR_x2apic(void)
	if (x2apic_preenabled && nox2apic)
	if (x2apic_preenabled && nox2apic)
		disable_x2apic();
		disable_x2apic();


	if (dmar_table_init_ret)
	if (hardware_init_ret)
		ret = -1;
		ret = -1;
	else
	else
		ret = enable_IR();
		ret = enable_IR();
+1 −0
Original line number Original line Diff line number Diff line
@@ -57,6 +57,7 @@
#include <asm/msidef.h>
#include <asm/msidef.h>
#include <asm/hypertransport.h>
#include <asm/hypertransport.h>
#include <asm/setup.h>
#include <asm/setup.h>
#include <asm/intr_remapping.h>
#include <asm/irq_remapping.h>
#include <asm/irq_remapping.h>
#include <asm/hpet.h>
#include <asm/hpet.h>
#include <asm/hw_irq.h>
#include <asm/hw_irq.h>
+1 −1
Original line number Original line Diff line number Diff line
@@ -4,7 +4,7 @@ obj-$(CONFIG_AMD_IOMMU) += amd_iommu.o amd_iommu_init.o
obj-$(CONFIG_AMD_IOMMU_V2) += amd_iommu_v2.o
obj-$(CONFIG_AMD_IOMMU_V2) += amd_iommu_v2.o
obj-$(CONFIG_DMAR_TABLE) += dmar.o
obj-$(CONFIG_DMAR_TABLE) += dmar.o
obj-$(CONFIG_INTEL_IOMMU) += iova.o intel-iommu.o
obj-$(CONFIG_INTEL_IOMMU) += iova.o intel-iommu.o
obj-$(CONFIG_IRQ_REMAP) += intel_intr_remapping.o
obj-$(CONFIG_IRQ_REMAP) += intel_intr_remapping.o intr_remapping.o
obj-$(CONFIG_OMAP_IOMMU) += omap-iommu.o
obj-$(CONFIG_OMAP_IOMMU) += omap-iommu.o
obj-$(CONFIG_OMAP_IOVMM) += omap-iovmm.o
obj-$(CONFIG_OMAP_IOVMM) += omap-iovmm.o
obj-$(CONFIG_OMAP_IOMMU_DEBUG) += omap-iommu-debug.o
obj-$(CONFIG_OMAP_IOMMU_DEBUG) += omap-iommu-debug.o
Loading