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;
}
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)