From a1fc620987fb4ffc7e053c1d13424c8ed41d89c3 Mon Sep 17 00:00:00 2001 From: Janghyuck Kim Date: Tue, 5 Mar 2019 15:53:32 +0900 Subject: [PATCH] [RAMEN9610-12969][COMMON] iommu/exynos: retry when PTW fault occur Change-Id: I3e425c2e611d65c6b619b3e21c46fce7de7fde18 Signed-off-by: Janghyuck Kim --- drivers/iommu/exynos-iommu-reg.h | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/exynos-iommu-reg.h b/drivers/iommu/exynos-iommu-reg.h index 24fbac3d1ce8..63fc315b2e08 100644 --- a/drivers/iommu/exynos-iommu-reg.h +++ b/drivers/iommu/exynos-iommu-reg.h @@ -372,13 +372,14 @@ finish: pr_crit("----------------------------------------------------------\n"); } -static inline void show_fault_information(struct sysmmu_drvdata *drvdata, +static inline int show_fault_information(struct sysmmu_drvdata *drvdata, int flags, unsigned long fault_addr) { unsigned int info; phys_addr_t pgtable; int fault_id = SYSMMU_FAULT_ID(flags); const char *port_name = NULL; + static int ptw_count = 0; pgtable = __raw_readl(drvdata->sfrbase + REG_PT_BASE_PPN); pgtable <<= PAGE_SHIFT; @@ -421,14 +422,24 @@ static inline void show_fault_information(struct sysmmu_drvdata *drvdata, } if (fault_id == SYSMMU_FAULT_PTW_ACCESS) { - pr_crit("System MMU has failed to access page table\n"); + ptw_count++; + pr_crit("System MMU has failed to access page table, %d\n", ptw_count); pgtable = 0; + + if (ptw_count > 3) + panic("Unrecoverable System MMU PTW fault"); + + writel(0x1, drvdata->sfrbase + REG_INT_CLEAR); + + return IRQ_HANDLED; } dump_sysmmu_status(drvdata, pgtable); finish: pr_crit("----------------------------------------------------------\n"); + + return 0; } static inline void __sysmmu_disable_nocount(struct sysmmu_drvdata *drvdata) -- 2.20.1