vt-d: Fix a bug in pmr register disabling code.
authorKeir Fraser <keir@xensource.com>
Tue, 23 Oct 2007 08:31:03 +0000 (09:31 +0100)
committerKeir Fraser <keir@xensource.com>
Tue, 23 Oct 2007 08:31:03 +0000 (09:31 +0100)
Signed-off-by: Allen Kay <allen.m.kay@intel.com>
xen/arch/x86/hvm/vmx/vtd/utils.c
xen/include/asm-x86/hvm/vmx/intel-iommu.h

index 57964b2b6e0c1e92edcda042d8e6dec30c6d80c7..66b3ce18c8861943dcdf943854a1f091607d8914 100644 (file)
@@ -64,24 +64,28 @@ int vtd_hw_check(void)
     return 0;
 }
 
-/* disable vt-d protected memory registers */
+/* Disable vt-d protected memory registers. */
 void disable_pmr(struct iommu *iommu)
 {
     unsigned long start_time, status;
+    unsigned int val;
 
-    gdprintk(XENLOG_INFO VTDPREFIX,
-        "disabling protected memory registers\n");
-
-    dmar_writel(iommu->reg, DMAR_PMEN_REG, 0);
+    val = dmar_readl(iommu->reg, DMAR_PMEN_REG);
+    dmar_writel(iommu->reg, DMAR_PMEN_REG, val & ~DMA_PMEN_EPM);
     start_time = jiffies;
-    while (1) {
+
+    for ( ; ; )
+    {
         status = dmar_readl(iommu->reg, DMAR_PMEN_REG);
         if ( (status & DMA_PMEN_PRS) == 0 )
             break;
-        if (time_after(jiffies, start_time + DMAR_OPERATION_TIMEOUT))
+        if ( time_after(jiffies, start_time + DMAR_OPERATION_TIMEOUT) )
             panic("Cannot set QIE field for queue invalidation\n");
         cpu_relax();
     }
+
+    dprintk(XENLOG_INFO VTDPREFIX,
+            "disabled protected memory registers\n");
 }
 
 #if defined(__x86_64__)
index 893cfaa70abca39ef1bc08929d1f6ec172ec23d3..b4c7d410bf4d984ab3fa499d67a74eec80f2ce46 100644 (file)
 
 /* PMEN_REG */
 #define DMA_PMEN_EPM   (((u32)1) << 31)
-#define DMA_PMEN_PRS   (((u32)1) << 1)
+#define DMA_PMEN_PRS   (((u32)1) << 0)
 
 /* CCMD_REG */
 #define DMA_CCMD_INVL_GRANU_OFFSET  61