diff --git a/arch/arm/mach-msm/cache_erp.c b/arch/arm/mach-msm/cache_erp.c index 9a721e4c83a..97225ac1bd9 100644 --- a/arch/arm/mach-msm/cache_erp.c +++ b/arch/arm/mach-msm/cache_erp.c @@ -17,7 +17,11 @@ #include #include #include +#include #include +#include +#include +#include "acpuclock.h" #define CESR_DCTPE BIT(0) #define CESR_DCDPE BIT(1) @@ -193,11 +197,25 @@ static irqreturn_t msm_l1_erp_irq(int irq, void *dev_id) struct msm_l1_err_stats *l1_stats = dev_id; unsigned int cesr = read_cesr(); unsigned int i_cesynr, d_cesynr; + unsigned int cpu = smp_processor_id(); int print_regs = cesr & CESR_PRINT_MASK; + void *const saw_bases[] = { + MSM_SAW0_BASE, + MSM_SAW1_BASE, + MSM_SAW2_BASE, + MSM_SAW3_BASE, + }; + if (print_regs) { - pr_alert("L1 Error detected on CPU %d!\n", smp_processor_id()); - pr_alert("\tCESR = 0x%08x\n", cesr); + pr_alert("L1 / TLB Error detected on CPU %d!\n", cpu); + pr_alert("\tCESR = 0x%08x\n", cesr); + pr_alert("\tCPU speed = %lu\n", acpuclk_get_rate(cpu)); + pr_alert("\tMIDR = 0x%08x\n", read_cpuid_id()); + pr_alert("\tPTE fuses = 0x%08x\n", + readl_relaxed(MSM_QFPROM_BASE + 0xC0)); + pr_alert("\tPMIC_VREG = 0x%08x\n", + readl_relaxed(saw_bases[cpu] + 0x14)); } if (cesr & CESR_DCTPE) {