|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] amd iommu: Add workaround for erratum 732 & 733
>>> On 22.05.12 at 15:56, Wei Wang <wei.wang2@xxxxxxx> wrote:
> Hi Jan
> This patch implements the suggested workaround for erratum 732 & 733. It
> is mostly derived from the Linux patch recently posted. Please review it.
> Thanks,
> Wei
Looks good in principle, but came out with newline damage. Can
you please resend as attachment, ideally at once fixing a few
(mostly cosmetic) things:
> # HG changeset patch
> # User Wei Wang <wei.wang2@xxxxxxx>
> # Date 1337690747 -7200
> # Node ID 06aebc361de7f308b262b008153ae4549c4480c2
> # Parent 592d15bd4d5ec58486d32ee9998319e7c95fcd66
> amd iommu: Add workaround for erratum 733 & 733
732 & 733
> Signed-off-by: Wei Wang <wei.wang2@xxxxxxx>
>
> diff -r 592d15bd4d5e -r 06aebc361de7
> xen/drivers/passthrough/amd/iommu_init.c
> --- a/xen/drivers/passthrough/amd/iommu_init.c Fri May 18 16:19:21
> 2012 +0100
> +++ b/xen/drivers/passthrough/amd/iommu_init.c Tue May 22 14:45:47
> 2012 +0200
> @@ -29,6 +29,7 @@
> #include <asm/hvm/svm/amd-iommu-proto.h>
> #include <asm-x86/fixmap.h>
> #include <mach_apic.h>
> +#include <xen/delay.h>
>
> static int __initdata nr_amd_iommus;
>
> @@ -566,6 +567,7 @@ static void parse_event_log_entry(struct
> u16 domain_id, device_id, bdf, cword;
> u32 code;
> u64 *addr;
> + int count = 0;
> char * event_str[] = {"ILLEGAL_DEV_TABLE_ENTRY",
> "IO_PAGE_FAULT",
> "DEV_TABLE_HW_ERROR",
> @@ -575,9 +577,27 @@ static void parse_event_log_entry(struct
> "IOTLB_INV_TIMEOUT",
> "INVALID_DEV_REQUEST"};
>
> +retry:
> code = get_field_from_reg_u32(entry[1], IOMMU_EVENT_CODE_MASK,
> IOMMU_EVENT_CODE_SHIFT);
>
> + /* Workaround for erratum 732.
/*
* Workaround for erratum 732.
> + * it can happen that the tail pointer is updated before the actual
> entry
> + * is written. Suggested by RevGuide, we initialize the event log
> buffer to
> + * all zeros and write event log entries to zero after they are
> processed.
> + */
> +
> + if ( code == 0 )
> + {
> + if ( unlikely(++count == IOMMU_LOG_ENTRY_TIMEOUT) )
> + {
> + AMD_IOMMU_DEBUG("AMD-Vi: No event written to event log\n");
Perhaps remove the second "event".
> + return;
> + }
> + udelay(1);
> + goto retry;
> + }
> +
> if ( (code > IOMMU_EVENT_INVALID_DEV_REQUEST) ||
> (code < IOMMU_EVENT_ILLEGAL_DEV_TABLE_ENTRY) )
> {
> @@ -615,6 +635,8 @@ static void parse_event_log_entry(struct
> AMD_IOMMU_DEBUG("event 0x%08x 0x%08x 0x%08x 0x%08x\n", entry[0],
> entry[1], entry[2], entry[3]);
> }
> +
> + memset(entry, 0, IOMMU_EVENT_LOG_ENTRY_SIZE);
> }
>
> static void iommu_check_event_log(struct amd_iommu *iommu)
> @@ -646,10 +668,32 @@ void parse_ppr_log_entry(struct amd_iomm
> {
>
> u16 device_id;
> - u8 bus, devfn;
> + u8 bus, devfn, code;
> struct pci_dev *pdev;
> struct domain *d;
> + int count = 0;
>
> +retry:
> + code = get_field_from_reg_u32(entry[1], IOMMU_PPR_LOG_CODE_MASK,
> + IOMMU_PPR_LOG_CODE_SHIFT);
> +
> + /* Workaround for erratum 733.
See above.
> + * it can happen that the tail pointer is updated before the actual
> entry
> + * is written. Suggested by RevGuide, we initialize the ppr log
> buffer to
> + * all zeros and write ppr log entries to zero after they are
> processed.
> + */
> +
> + if ( code == 0 )
> + {
> + if ( unlikely(++count == IOMMU_LOG_ENTRY_TIMEOUT) )
> + {
> + AMD_IOMMU_DEBUG("AMD-Vi: No ppr written to ppr log\n");
Perhaps remove the second "ppr".
> + return;
> + }
> + udelay(1);
> + goto retry;
> + }
> +
> /* here device_id is physical value */
> device_id = iommu_get_devid_from_cmd(entry[0]);
> bus = PCI_BUS(device_id);
> @@ -665,6 +709,8 @@ void parse_ppr_log_entry(struct amd_iomm
> d = pdev->domain;
>
> guest_iommu_add_ppr_log(d, entry);
> +
> + memset(entry, 0, IOMMU_PPR_LOG_ENTRY_SIZE);
> }
>
> static void iommu_check_ppr_log(struct amd_iommu *iommu)
I'd personally also prefer the loops to be written as such (i.e.
without goto-s).
> --- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h Fri May 18
> 16:19:21 2012 +0100
> +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h Tue May 22
> 14:45:47 2012 +0200
> @@ -301,6 +301,10 @@
> #define IOMMU_PPR_LOG_TAIL_OFFSET 0x2038
> #define IOMMU_PPR_LOG_DEVICE_ID_MASK 0x0000FFFF
> #define IOMMU_PPR_LOG_DEVICE_ID_SHIFT 0
> +#define IOMMU_PPR_LOG_CODE_MASK 0xF0000000
> +#define IOMMU_PPR_LOG_CODE_SHIFT 28
> +
> +#define IOMMU_LOG_ENTRY_TIMEOUT 100000
That's rather long a timeout (100ms) for a busy loop - is that
really necessary?
Jan
>
> /* Control Register */
> #define IOMMU_CONTROL_MMIO_OFFSET 0x18
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |