# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1215776954 -3600
# Node ID bcef824afe1afd049148f9ade1361a0e8695bc20
# Parent 1e24033fb775b74c85df0dddd9bde632bd576151
iommu: make interrupt remapping more generic
Signed-off-by: Wei Wang <wei.wang2@xxxxxxx>
---
xen/arch/x86/msi.c | 4 +--
xen/drivers/passthrough/amd/pci_amd_iommu.c | 2 +
xen/drivers/passthrough/iommu.c | 37 ++++++++++++++++++++++++++++
xen/drivers/passthrough/vtd/iommu.c | 2 +
xen/include/asm-x86/io_apic.h | 4 +--
xen/include/xen/iommu.h | 4 +++
6 files changed, 49 insertions(+), 4 deletions(-)
diff -r 1e24033fb775 -r bcef824afe1a xen/arch/x86/msi.c
--- a/xen/arch/x86/msi.c Fri Jul 11 12:48:45 2008 +0100
+++ b/xen/arch/x86/msi.c Fri Jul 11 12:49:14 2008 +0100
@@ -173,8 +173,8 @@ static int unset_vector_msi(int vector)
static void write_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
{
- if ( vtd_enabled )
- msi_msg_write_remap_rte(entry, msg);
+ if ( iommu_enabled )
+ iommu_update_ire_from_msi(entry, msg);
switch ( entry->msi_attrib.type )
{
diff -r 1e24033fb775 -r bcef824afe1a xen/drivers/passthrough/amd/pci_amd_iommu.c
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c Fri Jul 11 12:48:45
2008 +0100
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c Fri Jul 11 12:49:14
2008 +0100
@@ -649,4 +649,6 @@ struct iommu_ops amd_iommu_ops = {
.unmap_page = amd_iommu_unmap_page,
.reassign_device = amd_iommu_return_device,
.get_device_group_id = amd_iommu_group_id,
+ .update_ire_from_apic = amd_iommu_ioapic_update_ire,
+ .update_ire_from_msi = amd_iommu_msi_msg_update_ire,
};
diff -r 1e24033fb775 -r bcef824afe1a xen/drivers/passthrough/iommu.c
--- a/xen/drivers/passthrough/iommu.c Fri Jul 11 12:48:45 2008 +0100
+++ b/xen/drivers/passthrough/iommu.c Fri Jul 11 12:49:14 2008 +0100
@@ -290,6 +290,43 @@ int iommu_get_device_group(struct domain
return i;
}
+
+void iommu_update_ire_from_apic(
+ unsigned int apic, unsigned int reg, unsigned int value)
+{
+ struct iommu_ops *ops = NULL;
+
+ switch ( boot_cpu_data.x86_vendor )
+ {
+ case X86_VENDOR_INTEL:
+ ops = &intel_iommu_ops;
+ break;
+ case X86_VENDOR_AMD:
+ ops = &amd_iommu_ops;
+ break;
+ default:
+ BUG();
+ }
+ ops->update_ire_from_apic(apic, reg, value);
+}
+void iommu_update_ire_from_msi(
+ struct msi_desc *msi_desc, struct msi_msg *msg)
+{
+ struct iommu_ops *ops = NULL;
+
+ switch ( boot_cpu_data.x86_vendor )
+ {
+ case X86_VENDOR_INTEL:
+ ops = &intel_iommu_ops;
+ break;
+ case X86_VENDOR_AMD:
+ ops = &amd_iommu_ops;
+ break;
+ default:
+ BUG();
+ }
+ ops->update_ire_from_msi(msi_desc, msg);
+}
/*
* Local variables:
* mode: C
diff -r 1e24033fb775 -r bcef824afe1a xen/drivers/passthrough/vtd/iommu.c
--- a/xen/drivers/passthrough/vtd/iommu.c Fri Jul 11 12:48:45 2008 +0100
+++ b/xen/drivers/passthrough/vtd/iommu.c Fri Jul 11 12:49:14 2008 +0100
@@ -1883,6 +1883,8 @@ struct iommu_ops intel_iommu_ops = {
.unmap_page = intel_iommu_unmap_page,
.reassign_device = reassign_device_ownership,
.get_device_group_id = intel_iommu_group_id,
+ .update_ire_from_apic = io_apic_write_remap_rte,
+ .update_ire_from_msi = msi_msg_write_remap_rte,
};
/*
diff -r 1e24033fb775 -r bcef824afe1a xen/include/asm-x86/io_apic.h
--- a/xen/include/asm-x86/io_apic.h Fri Jul 11 12:48:45 2008 +0100
+++ b/xen/include/asm-x86/io_apic.h Fri Jul 11 12:49:14 2008 +0100
@@ -133,8 +133,8 @@ static inline unsigned int io_apic_read(
static inline void io_apic_write(unsigned int apic, unsigned int reg, unsigned
int value)
{
- if (vtd_enabled)
- return io_apic_write_remap_rte(apic, reg, value);
+ if (iommu_enabled)
+ return iommu_update_ire_from_apic(apic, reg, value);
*IO_APIC_BASE(apic) = reg;
*(IO_APIC_BASE(apic)+4) = value;
}
diff -r 1e24033fb775 -r bcef824afe1a xen/include/xen/iommu.h
--- a/xen/include/xen/iommu.h Fri Jul 11 12:48:45 2008 +0100
+++ b/xen/include/xen/iommu.h Fri Jul 11 12:49:14 2008 +0100
@@ -103,6 +103,10 @@ struct iommu_ops {
int (*reassign_device)(struct domain *s, struct domain *t,
u8 bus, u8 devfn);
int (*get_device_group_id)(u8 bus, u8 devfn);
+ void (*update_ire_from_apic)(unsigned int apic, unsigned int reg, unsigned
int value);
+ void (*update_ire_from_msi)(struct msi_desc *msi_desc, struct msi_msg
*msg);
};
+void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned
int value);
+void iommu_update_ire_from_msi(struct msi_desc *msi_desc, struct msi_msg *msg);
#endif /* _IOMMU_H_ */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|