|
[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 |