AMD IOMMU: Make iommu suspend & resume functions more generic.
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 6 Jul 2009 10:56:51 +0000 (11:56 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 6 Jul 2009 10:56:51 +0000 (11:56 +0100)
Signed-off-by: Wei Wang <wei.wang2@amd.com>
xen/drivers/passthrough/amd/pci_amd_iommu.c
xen/drivers/passthrough/iommu.c
xen/drivers/passthrough/vtd/iommu.c
xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
xen/include/xen/iommu.h

index 83e25ed231cf10d2ed6e48b329037397f0cd7a01..ceee6009a539451ededc47c2150267aa082b27d0 100644 (file)
@@ -441,4 +441,6 @@ struct iommu_ops amd_iommu_ops = {
     .update_ire_from_msi = amd_iommu_msi_msg_update_ire,
     .read_apic_from_ire = amd_iommu_read_ioapic_from_ire,
     .read_msi_from_ire = amd_iommu_read_msi_from_ire,
+    .suspend = amd_iommu_suspend,
+    .resume = amd_iommu_resume,
 };
index 51e15e5b096c8420d2830a877e36602f1c8c8982..b0dd91d66c7b28dba5b152e64771980b68855e20 100644 (file)
@@ -346,6 +346,20 @@ unsigned int iommu_read_apic_from_ire(unsigned int apic, unsigned int reg)
     return ops->read_apic_from_ire(apic, reg);
 }
 
+void iommu_resume()
+{
+    struct iommu_ops *ops = iommu_get_ops();
+    if ( iommu_enabled )
+        ops->resume();
+}
+
+void iommu_suspend()
+{
+    struct iommu_ops *ops = iommu_get_ops();
+    if ( iommu_enabled )
+        ops->suspend();
+}
+
 /*
  * Local variables:
  * mode: C
index 72b76ce354f3c90881f397ab19446a4453a63dfc..a0cf9d12d731b82916a7f88ef8ada16d842fd219 100644 (file)
@@ -1848,7 +1848,7 @@ static int intel_iommu_group_id(u8 bus, u8 devfn)
 }
 
 static u32 iommu_state[MAX_IOMMUS][MAX_IOMMU_REGS];
-void iommu_suspend(void)
+void vtd_suspend(void)
 {
     struct acpi_drhd_unit *drhd;
     struct iommu *iommu;
@@ -1887,7 +1887,7 @@ void iommu_suspend(void)
     }
 }
 
-void iommu_resume(void)
+void vtd_resume(void)
 {
     struct acpi_drhd_unit *drhd;
     struct iommu *iommu;
@@ -1934,6 +1934,8 @@ struct iommu_ops intel_iommu_ops = {
     .update_ire_from_msi = msi_msg_write_remap_rte,
     .read_apic_from_ire = io_apic_read_remap_rte,
     .read_msi_from_ire = msi_msg_read_remap_rte,
+    .suspend = vtd_suspend,
+    .resume = vtd_resume,
 };
 
 /*
index edc8968d35194e07daef1724bb499cc8a0332c8c..64063219317de924168389e230654f1631ba1747 100644 (file)
@@ -92,6 +92,10 @@ void amd_iommu_read_msi_from_ire(
 unsigned int amd_iommu_read_ioapic_from_ire(
     unsigned int apic, unsigned int reg);
 
+/* power management support */
+void amd_iommu_resume(void);
+void amd_iommu_suspend(void);
+
 static inline u32 get_field_from_reg_u32(u32 reg_value, u32 mask, u32 shift)
 {
     u32 field;
index 830052528690df55a0817c5588378f973f8138ea..3468ebcaaf5f1ecafb194f2788f54990d0138ad5 100644 (file)
@@ -109,6 +109,8 @@ struct iommu_ops {
     void (*update_ire_from_msi)(struct msi_desc *msi_desc, struct msi_msg *msg);
     void (*read_msi_from_ire)(struct msi_desc *msi_desc, struct msi_msg *msg);
     unsigned int (*read_apic_from_ire)(unsigned int apic, unsigned int reg);
+    void (*suspend)(void);
+    void (*resume)(void);
 };
 
 void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);