86 lines
2.5 KiB
Diff
86 lines
2.5 KiB
Diff
# HG changeset patch
|
|
# User Keir Fraser <keir.fraser@citrix.com>
|
|
# Date 1234436057 0
|
|
# Node ID 32b15413749255e0cd518f25d9202759586dcb27
|
|
# Parent 94e12fa57816c26f8b76061f17c33928be202c85
|
|
vtd: move the snoop control detection out of acpi_dmar_init()
|
|
where the capability value is not initialized thus we may
|
|
get random value.
|
|
|
|
Signed-off-by: Xin, Xiaohui<xiaohui.xin@intel.com>
|
|
|
|
Index: xen-3.3.1-testing/xen/drivers/passthrough/vtd/dmar.c
|
|
===================================================================
|
|
--- xen-3.3.1-testing.orig/xen/drivers/passthrough/vtd/dmar.c
|
|
+++ xen-3.3.1-testing/xen/drivers/passthrough/vtd/dmar.c
|
|
@@ -509,8 +509,6 @@ static int __init acpi_parse_dmar(struct
|
|
int acpi_dmar_init(void)
|
|
{
|
|
int rc;
|
|
- struct acpi_drhd_unit *drhd;
|
|
- struct iommu *iommu;
|
|
|
|
rc = -ENODEV;
|
|
if ( force_iommu )
|
|
@@ -527,22 +525,7 @@ int acpi_dmar_init(void)
|
|
if ( list_empty(&acpi_drhd_units) )
|
|
goto fail;
|
|
|
|
- /* Giving that all devices within guest use same io page table,
|
|
- * enable snoop control only if all VT-d engines support it.
|
|
- */
|
|
- if ( iommu_snoop )
|
|
- {
|
|
- for_each_drhd_unit ( drhd )
|
|
- {
|
|
- iommu = drhd->iommu;
|
|
- if ( !ecap_snp_ctl(iommu->ecap) ) {
|
|
- iommu_snoop = 0;
|
|
- break;
|
|
- }
|
|
- }
|
|
- }
|
|
-
|
|
- printk("Intel VT-d has been enabled, snoop_control=%d.\n", iommu_snoop);
|
|
+ printk("Intel VT-d has been enabled\n");
|
|
|
|
return 0;
|
|
|
|
Index: xen-3.3.1-testing/xen/drivers/passthrough/vtd/iommu.c
|
|
===================================================================
|
|
--- xen-3.3.1-testing.orig/xen/drivers/passthrough/vtd/iommu.c
|
|
+++ xen-3.3.1-testing/xen/drivers/passthrough/vtd/iommu.c
|
|
@@ -1813,6 +1813,24 @@ int intel_vtd_setup(void)
|
|
if ( init_vtd_hw() )
|
|
goto error;
|
|
|
|
+ /* Giving that all devices within guest use same io page table,
|
|
+ * enable snoop control only if all VT-d engines support it.
|
|
+ */
|
|
+
|
|
+ if ( iommu_snoop )
|
|
+ {
|
|
+ for_each_drhd_unit ( drhd )
|
|
+ {
|
|
+ iommu = drhd->iommu;
|
|
+ if ( !ecap_snp_ctl(iommu->ecap) ) {
|
|
+ iommu_snoop = 0;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ printk("Intel VT-d snoop control %sabled\n", iommu_snoop ? "en" : "dis");
|
|
+
|
|
register_keyhandler('V', dump_iommu_info, "dump iommu info");
|
|
|
|
return 0;
|
|
@@ -1821,6 +1839,7 @@ int intel_vtd_setup(void)
|
|
for_each_drhd_unit ( drhd )
|
|
iommu_free(drhd);
|
|
vtd_enabled = 0;
|
|
+ iommu_snoop = 0;
|
|
return -ENOMEM;
|
|
}
|
|
|