|
@@ -450,12 +450,27 @@ static void dump_command(unsigned long phys_addr)
|
|
|
|
|
|
static void iommu_print_event(struct amd_iommu *iommu, void *__evt)
|
|
|
{
|
|
|
- u32 *event = __evt;
|
|
|
- int type = (event[1] >> EVENT_TYPE_SHIFT) & EVENT_TYPE_MASK;
|
|
|
- int devid = (event[0] >> EVENT_DEVID_SHIFT) & EVENT_DEVID_MASK;
|
|
|
- int domid = (event[1] >> EVENT_DOMID_SHIFT) & EVENT_DOMID_MASK;
|
|
|
- int flags = (event[1] >> EVENT_FLAGS_SHIFT) & EVENT_FLAGS_MASK;
|
|
|
- u64 address = (u64)(((u64)event[3]) << 32) | event[2];
|
|
|
+ int type, devid, domid, flags;
|
|
|
+ volatile u32 *event = __evt;
|
|
|
+ int count = 0;
|
|
|
+ u64 address;
|
|
|
+
|
|
|
+retry:
|
|
|
+ type = (event[1] >> EVENT_TYPE_SHIFT) & EVENT_TYPE_MASK;
|
|
|
+ devid = (event[0] >> EVENT_DEVID_SHIFT) & EVENT_DEVID_MASK;
|
|
|
+ domid = (event[1] >> EVENT_DOMID_SHIFT) & EVENT_DOMID_MASK;
|
|
|
+ flags = (event[1] >> EVENT_FLAGS_SHIFT) & EVENT_FLAGS_MASK;
|
|
|
+ address = (u64)(((u64)event[3]) << 32) | event[2];
|
|
|
+
|
|
|
+ if (type == 0) {
|
|
|
+ /* Did we hit the erratum? */
|
|
|
+ if (++count == LOOP_TIMEOUT) {
|
|
|
+ pr_err("AMD-Vi: No event written to event log\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ udelay(1);
|
|
|
+ goto retry;
|
|
|
+ }
|
|
|
|
|
|
printk(KERN_ERR "AMD-Vi: Event logged [");
|
|
|
|
|
@@ -508,6 +523,8 @@ static void iommu_print_event(struct amd_iommu *iommu, void *__evt)
|
|
|
default:
|
|
|
printk(KERN_ERR "UNKNOWN type=0x%02x]\n", type);
|
|
|
}
|
|
|
+
|
|
|
+ memset(__evt, 0, 4 * sizeof(u32));
|
|
|
}
|
|
|
|
|
|
static void iommu_poll_events(struct amd_iommu *iommu)
|