[RAMEN9610-13018][COMMON] iommu/exynos: check return value and retry if PTW fault
authorJanghyuck Kim <janghyuck.kim@samsung.com>
Fri, 8 Mar 2019 02:19:54 +0000 (11:19 +0900)
committerhskang <hs1218.kang@samsung.com>
Fri, 8 Mar 2019 06:48:30 +0000 (15:48 +0900)
Change-Id: Ic6eabb2d13a22f629fe8aa7384e96fe01228ce8a
Signed-off-by: Janghyuck Kim <janghyuck.kim@samsung.com>
drivers/iommu/exynos-iommu-reg.h
drivers/iommu/exynos-iommu.c

index 63fc315b2e08d4473e8a01e5f57fa9259f5730d1..da1133ee664156e4ce599736b38ec6b49af2d540 100644 (file)
@@ -431,7 +431,7 @@ static inline int show_fault_information(struct sysmmu_drvdata *drvdata,
 
                writel(0x1, drvdata->sfrbase + REG_INT_CLEAR);
 
-               return IRQ_HANDLED;
+               return -EAGAIN;
        }
 
        dump_sysmmu_status(drvdata, pgtable);
index 07fa4d72431ac6217901c4adeef1c7fb9242f632..9009e2d009e3df3f5f4a14bcd6cf89d669883cf8 100644 (file)
@@ -178,7 +178,7 @@ static irqreturn_t exynos_sysmmu_irq(int irq, void *dev_id)
 {
        struct sysmmu_drvdata *drvdata = dev_id;
        unsigned long addr = -1;
-       int flags = 0;
+       int flags = 0, ret;
 
        dev_info(drvdata->sysmmu, "%s:%d: irq(%d) happened\n", __func__, __LINE__, irq);
 
@@ -187,7 +187,9 @@ static irqreturn_t exynos_sysmmu_irq(int irq, void *dev_id)
                dev_name(drvdata->sysmmu));
 
        sysmmu_get_interrupt_info(drvdata, &flags, &addr, false);
-       show_fault_information(drvdata, flags, addr);
+       ret = show_fault_information(drvdata, flags, addr);
+       if (ret == -EAGAIN)
+               return IRQ_HANDLED;
        atomic_notifier_call_chain(&drvdata->fault_notifiers, addr, &flags);
 
        panic("Unrecoverable System MMU Fault!!");