iommu/vt-d: Disable translation if already enabled
[pandora-kernel.git] / drivers / iommu / dmar.c
index 35c1e17..cf065df 100644 (file)
@@ -582,7 +582,7 @@ int alloc_iommu(struct dmar_drhd_unit *drhd)
 {
        struct intel_iommu *iommu;
        int map_size;
-       u32 ver;
+       u32 ver, sts;
        static int iommu_allocated = 0;
        int agaw = 0;
        int msagaw = 0;
@@ -652,6 +652,15 @@ int alloc_iommu(struct dmar_drhd_unit *drhd)
                (unsigned long long)iommu->cap,
                (unsigned long long)iommu->ecap);
 
+       /* Reflect status in gcmd */
+       sts = readl(iommu->reg + DMAR_GSTS_REG);
+       if (sts & DMA_GSTS_IRES)
+               iommu->gcmd |= DMA_GCMD_IRE;
+       if (sts & DMA_GSTS_TES)
+               iommu->gcmd |= DMA_GCMD_TE;
+       if (sts & DMA_GSTS_QIES)
+               iommu->gcmd |= DMA_GCMD_QIE;
+
        raw_spin_lock_init(&iommu->register_lock);
 
        drhd->iommu = iommu;
@@ -1056,8 +1065,8 @@ static const char *intr_remap_fault_reasons[] =
 
 const char *dmar_get_fault_reason(u8 fault_reason, int *fault_type)
 {
-       if (fault_reason >= 0x20 && (fault_reason <= 0x20 +
-                                    ARRAY_SIZE(intr_remap_fault_reasons))) {
+       if (fault_reason >= 0x20 && (fault_reason - 0x20 <
+                                       ARRAY_SIZE(intr_remap_fault_reasons))) {
                *fault_type = INTR_REMAP;
                return intr_remap_fault_reasons[fault_reason - 0x20];
        } else if (fault_reason < ARRAY_SIZE(dma_remap_fault_reasons)) {