aboutsummaryrefslogtreecommitdiffstats
path: root/xen/drivers/passthrough/amd/iommu_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'xen/drivers/passthrough/amd/iommu_init.c')
-rw-r--r--xen/drivers/passthrough/amd/iommu_init.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/xen/drivers/passthrough/amd/iommu_init.c b/xen/drivers/passthrough/amd/iommu_init.c
index b87b61301c..d105e35c3c 100644
--- a/xen/drivers/passthrough/amd/iommu_init.c
+++ b/xen/drivers/passthrough/amd/iommu_init.c
@@ -593,6 +593,14 @@ static void do_amd_iommu_irq(unsigned long data)
}
}
+ /*
+ * Workaround for erratum787:
+ * Re-check to make sure the bit has been cleared.
+ */
+ entry = readl(iommu->mmio_base + IOMMU_STATUS_MMIO_OFFSET);
+ if ( entry & IOMMU_STATUS_EVENT_LOG_INT_MASK )
+ tasklet_schedule(&amd_iommu_irq_tasklet);
+
spin_unlock_irqrestore(&iommu->lock, flags);
}
}