iommu: make interrupt remapping more generic
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 11 Jul 2008 11:49:14 +0000 (12:49 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 11 Jul 2008 11:49:14 +0000 (12:49 +0100)
Signed-off-by: Wei Wang <wei.wang2@amd.com>
xen/arch/x86/msi.c
xen/drivers/passthrough/amd/pci_amd_iommu.c
xen/drivers/passthrough/iommu.c
xen/drivers/passthrough/vtd/iommu.c
xen/include/asm-x86/io_apic.h
xen/include/xen/iommu.h

index d99dc4aacb4ebeadcec99df5b71751fb93213b5d..c0ccba6d9a459e35ac9faaf0473a92e9f8284026 100644 (file)
@@ -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 )
     {
index bc3f4748508d7d83404d0b8f6ce3b7155aea4edb..31f485086c0fc8256b414065129cbc1a5965d253 100644 (file)
@@ -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,
 };
index 26719e4b58f64d2b9c802613414d8e6e8b220836..5d41ddfb8782d276e53efb460071672f916455b2 100644 (file)
@@ -290,6 +290,43 @@ int iommu_get_device_group(struct domain *d, u8 bus, u8 devfn,
 
     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
index c5b76b21c3ea24df0967886fcce557c1c4642b02..67126140a12626c839cd9776307e4ac84ff9ed9b 100644 (file)
@@ -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,
 };
 
 /*
index 00fafcf55dcf02adb50969da5b43bf6278525c2c..72b6defb972dde631902a2e5c2d6cd3d78b5a4b0 100644 (file)
@@ -133,8 +133,8 @@ static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg)
 
 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;
 }
index 390fb9e4d1c85c991e6003ccc4751da5eabf9316..20ba06062c97ca8619a2b32042c9ace1d7b2e52e 100644 (file)
@@ -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_ */