[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/4] IOMMU, AMD Family15h Model10-1Fh erratum 746 Workaround
>>> On 25.02.13 at 22:33, Suravee Suthikulanit <suravee.suthikulpanit@xxxxxxx> >>> wrote: > This patch looks good. I have tested on the system I have and it does > what it's supposed to. Thank you for porting the patch over from Linux. Thanks - I take this as an ack. Jan > On 2/15/2013 10:21 AM, Jan Beulich wrote: >> The IOMMU may stop processing page translations due to a perceived lack >> of credits for writing upstream peripheral page service request (PPR) >> or event logs. If the L2B miscellaneous clock gating feature is enabled >> the IOMMU does not properly register credits after the log request has >> completed, leading to a potential system hang. >> >> BIOSes are supposed to disable L2B micellaneous clock gating by setting >> L2_L2B_CK_GATE_CONTROL[CKGateL2BMiscDisable](D0F2xF4_x90[2]) = 1b. This >> patch corrects that for those which do not enable this workaround. >> >> Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@xxxxxxx> >> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> >> >> --- a/xen/drivers/passthrough/amd/iommu_init.c >> +++ b/xen/drivers/passthrough/amd/iommu_init.c >> @@ -792,6 +792,42 @@ static bool_t __init set_iommu_interrupt >> return 1; >> } >> >> +/* >> + * Family15h Model 10h-1fh erratum 746 (IOMMU Logging May Stall > Translations) >> + * Workaround: >> + * BIOS should disable L2B micellaneous clock gating by setting >> + * L2_L2B_CK_GATE_CONTROL[CKGateL2BMiscDisable](D0F2xF4_x90[2]) = 1b >> + */ >> +static void amd_iommu_erratum_746_workaround(struct amd_iommu *iommu) >> +{ >> + u32 value; >> + u8 bus = PCI_BUS(iommu->bdf); >> + u8 dev = PCI_SLOT(iommu->bdf); >> + u8 func = PCI_FUNC(iommu->bdf); >> + >> + if ( (boot_cpu_data.x86 != 0x15) || >> + (boot_cpu_data.x86_model < 0x10) || >> + (boot_cpu_data.x86_model > 0x1f) ) >> + return; >> + >> + pci_conf_write32(iommu->seg, bus, dev, func, 0xf0, 0x90); >> + value = pci_conf_read32(iommu->seg, bus, dev, func, 0xf4); >> + >> + if ( value & (1 << 2) ) >> + return; >> + >> + /* Select NB indirect register 0x90 and enable writing */ >> + pci_conf_write32(iommu->seg, bus, dev, func, 0xf0, 0x90 | (1 << 8)); >> + >> + pci_conf_write32(iommu->seg, bus, dev, func, 0xf4, value | (1 << 2)); >> + printk(XENLOG_INFO >> + "AMD-Vi: Applying erratum 746 workaround for IOMMU at > %04x:%02x:%02x.%u\n", >> + iommu->seg, bus, dev, func); >> + >> + /* Clear the enable writing bit */ >> + pci_conf_write32(iommu->seg, bus, dev, func, 0xf0, 0x90); >> +} >> + >> static void enable_iommu(struct amd_iommu *iommu) >> { >> unsigned long flags; >> @@ -805,6 +841,8 @@ static void enable_iommu(struct amd_iomm >> return; >> } >> >> + amd_iommu_erratum_746_workaround(iommu); >> + >> register_iommu_dev_table_in_mmio_space(iommu); >> register_iommu_cmd_buffer_in_mmio_space(iommu); >> register_iommu_event_log_in_mmio_space(iommu); >> >> >> _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |