]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/iommu/arm-smmu-v3.c
iommu/arm-smmu-v3: Don't disable SMMU in kdump kernel
[mirror_ubuntu-bionic-kernel.git] / drivers / iommu / arm-smmu-v3.c
index 0366c2aaba29b9a3b36ef045081bb93d5b6c566c..a4019cd2a60e73d385ecf0f002a5604989abb1a0 100644 (file)
@@ -2504,13 +2504,9 @@ static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool bypass)
        /* Clear CR0 and sync (disables SMMU and queue processing) */
        reg = readl_relaxed(smmu->base + ARM_SMMU_CR0);
        if (reg & CR0_SMMUEN) {
-               if (is_kdump_kernel()) {
-                       arm_smmu_update_gbpa(smmu, GBPA_ABORT, 0);
-                       arm_smmu_device_disable(smmu);
-                       return -EBUSY;
-               }
-
                dev_warn(smmu->dev, "SMMU currently enabled! Resetting...\n");
+               WARN_ON(is_kdump_kernel() && !disable_bypass);
+               arm_smmu_update_gbpa(smmu, GBPA_ABORT, 0);
        }
 
        ret = arm_smmu_device_disable(smmu);
@@ -2603,6 +2599,8 @@ static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool bypass)
                return ret;
        }
 
+       if (is_kdump_kernel())
+               enables &= ~(CR0_EVTQEN | CR0_PRIQEN);
 
        /* Enable the SMMU interface, or ensure bypass */
        if (!bypass || disable_bypass) {