diff --git a/drivers/gpu/msm/adreno_a6xx_snapshot.c b/drivers/gpu/msm/adreno_a6xx_snapshot.c index 063c36582b18..fba208c2a5ff 100644 --- a/drivers/gpu/msm/adreno_a6xx_snapshot.c +++ b/drivers/gpu/msm/adreno_a6xx_snapshot.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. +/* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -1474,6 +1474,8 @@ static void _a6xx_do_crashdump(struct kgsl_device *device) if (a6xx_capturescript.gpuaddr == 0 || a6xx_crashdump_registers.gpuaddr == 0) return; + if (!test_bit(KGSL_MMU_STARTED, &device->mmu.flags)) + return; /* IF the SMMU is stalled we cannot do a crash dump */ kgsl_regread(device, A6XX_RBBM_STATUS3, &val); diff --git a/drivers/gpu/msm/kgsl_iommu.c b/drivers/gpu/msm/kgsl_iommu.c index a493c4fbe8d8..4da9aaa971f7 100644 --- a/drivers/gpu/msm/kgsl_iommu.c +++ b/drivers/gpu/msm/kgsl_iommu.c @@ -1759,7 +1759,9 @@ static int kgsl_iommu_start(struct kgsl_mmu *mmu) } /* Make sure the hardware is programmed to the default pagetable */ - return kgsl_iommu_set_pt(mmu, mmu->defaultpagetable); + kgsl_iommu_set_pt(mmu, mmu->defaultpagetable); + set_bit(KGSL_MMU_STARTED, &mmu->flags); + return 0; } static int @@ -2144,6 +2146,8 @@ static void kgsl_iommu_stop(struct kgsl_mmu *mmu) for (i = 0; i < KGSL_IOMMU_CONTEXT_MAX; i++) _detach_context(&iommu->ctx[i]); } + + clear_bit(KGSL_MMU_STARTED, &mmu->flags); } static u64 diff --git a/drivers/gpu/msm/kgsl_mmu.c b/drivers/gpu/msm/kgsl_mmu.c index a0fd3ece4e78..af1dd07f30e8 100644 --- a/drivers/gpu/msm/kgsl_mmu.c +++ b/drivers/gpu/msm/kgsl_mmu.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2002,2007-2017, The Linux Foundation. All rights reserved. +/* Copyright (c) 2002,2007-2017,2020, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -712,6 +712,7 @@ static struct kgsl_pagetable *nommu_getpagetable(struct kgsl_mmu *mmu, static int nommu_init(struct kgsl_mmu *mmu) { mmu->features |= KGSL_MMU_GLOBAL_PAGETABLE; + set_bit(KGSL_MMU_STARTED, &mmu->flags); return 0; } diff --git a/drivers/gpu/msm/kgsl_mmu.h b/drivers/gpu/msm/kgsl_mmu.h index b10d079448f8..3a94857f3e4b 100644 --- a/drivers/gpu/msm/kgsl_mmu.h +++ b/drivers/gpu/msm/kgsl_mmu.h @@ -177,6 +177,9 @@ struct kgsl_mmu { } priv; }; +/* KGSL MMU FLAGS */ +#define KGSL_MMU_STARTED BIT(0) + #define KGSL_IOMMU_PRIV(_device) (&((_device)->mmu.priv.iommu)) extern struct kgsl_mmu_ops kgsl_iommu_ops;