]> xenbits.xensource.com Git - xen.git/commitdiff
iommu/amd: Workaround for erratum 787
authorSuravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Thu, 11 Jul 2013 13:10:23 +0000 (15:10 +0200)
committerJan Beulich <jbeulich@suse.com>
Thu, 11 Jul 2013 13:10:23 +0000 (15:10 +0200)
The IOMMU interrupt handling in bottom half must clear the PPR log interrupt
and event log interrupt bits to re-enable the interrupt. This is done by
writing 1 to the memory mapped register to clear the bit. Due to hardware bug,
if the driver tries to clear this bit while the IOMMU hardware also setting
this bit, the conflict will result with the bit being set. If the interrupt
handling code does not make sure to clear this bit, subsequent changes in the
event/PPR logs will no longer generating interrupts, and would result if
buffer overflow. After clearing the bits, the driver must read back
the register to verify.

Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Adjust to apply on top of heavily modified patch 1. Adjust flow to get away
with a single readl() in each instance of the status register checks.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Tim Deegan <tim@xen.org>
Acked-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
master commit: 9eabb0735400e2b6059dfa3f0b47a426f61f570a
master date: 2013-07-02 08:50:41 +0200

xen/drivers/passthrough/amd/iommu_init.c

index b87b61301cb1254b56e8a507e92138c54cfe0533..d105e35c3cd2b23f6713b7404efc4f309367d2bc 100644 (file)
@@ -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);
     }
 }