[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] Re: [PATCH][VTD][QUIRK] added quirks for Sandybridge errata workaround, WLAN, VT-d fault escalation
>>> On 14.01.11 at 00:40, "Kay, Allen M" <allen.m.kay@xxxxxxxxx> wrote: >+static void snb_vtd_ops_preamble(struct iommu* iommu) >+{ >+ struct intel_iommu *intel = iommu->intel; >+ struct acpi_drhd_unit *drhd = intel ? intel->drhd : NULL; >+ s_time_t start_time; >+ >+ if ( !is_igd_drhd(drhd) || !is_snb_gfx ) >+ return; >+ >+ if ( !map_igd_reg() ) >+ return; >+ >+ *((volatile u32 *)(igd_reg_va + 0x54)) = 0x000FFFFF; >+ *((volatile u32 *)(igd_reg_va + 0x700)) = 0; >+ >+ start_time = NOW(); >+ while ( (*((volatile u32 *)(igd_reg_va + 0x2AC)) & 0xF) != 0 ) >+ { >+ if ( NOW() > start_time + DMAR_OPERATION_TIMEOUT ) >+ { >+ dprintk(XENLOG_INFO VTDPREFIX, >+ "snb_vtd_ops_preamble: failed to disable idle >handshake\n"); >+ break; >+ } >+ cpu_relax(); >+ } >+ >+ *((volatile u32*)(igd_reg_va + 0x50)) = 0x10001; >+} >+ >+static void snb_vtd_ops_postamble(struct iommu* iommu) >+{ >+ struct intel_iommu *intel = iommu->intel; >+ struct acpi_drhd_unit *drhd = intel ? intel->drhd : NULL; >+ >+ if ( !is_igd_drhd(drhd) || !is_snb_gfx ) >+ return; >+ >+ if ( !map_igd_reg() ) >+ return; >+ >+ *((volatile u32 *)(igd_reg_va + 0x54)) = 0xA; >+ *((volatile u32 *)(igd_reg_va + 0x50)) = 0x10000; >+} Isn't there a risk that these MMIO writes interfere with the operation of the actual driver running in a domain? And even just in Xen itself, how do these writes get synchronized? Callers of vtd_ops_preamble_quirk() don't appear to be required to hold any particular lock. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |