]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
iommu/arm-smmu-v3: Don't disable SMMU in kdump kernel
authorWill Deacon <will.deacon@arm.com>
Mon, 3 Jun 2019 21:16:00 +0000 (23:16 +0200)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Tue, 2 Jul 2019 12:18:49 +0000 (14:18 +0200)
BugLink: https://bugs.launchpad.net/bugs/1828868
Disabling the SMMU when probing from within a kdump kernel so that all
incoming transactions are terminated can prevent the core of the crashed
kernel from being transferred off the machine if all I/O devices are
behind the SMMU.

Instead, continue to probe the SMMU after it is disabled so that we can
reinitialise it entirely and re-attach the DMA masters as they are reset.
Since the kdump kernel may not have drivers for all of the active DMA
masters, we suppress fault reporting to avoid spamming the console and
swamping the IRQ threads.

Reported-by: "Leizhen (ThunderTown)" <thunder.leizhen@huawei.com>
Tested-by: "Leizhen (ThunderTown)" <thunder.leizhen@huawei.com>
Tested-by: Bhupesh Sharma <bhsharma@redhat.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
(cherry picked from commit 3f54c447df34ff9efac7809a4a80fd3208efc619)
Signed-off-by: dann frazier <dann.frazier@canonical.com>
Acked-by: Connor Kuehl <connor.kuehl@canonical.com>
Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
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) {