ARM: tegra: mcerr: Use special VPR and SEC registers
Alex Waterman [Mon, 13 May 2013 23:12:58 +0000 (16:12 -0700)]
When a SEC or VPR error is handled use the correct special registers
for getting client and other info. The regular status register holds
garbage values in these two cases.

Bug 1275219

Change-Id: I6deae41f95bf488696523d9d41f84b63fcaccd92
Reviewed-on: http://git-master/r/228148
(cherry picked from commit 0172c95c1b62193b576658bc25e18c725ce64c6c)
Signed-off-by: Alex Waterman <alexw@nvidia.com>
Reviewed-on: http://git-master/r/230883
GVS: Gerrit_Virtual_Submit
Reviewed-by: Krishna Reddy <vdumpa@nvidia.com>

arch/arm/mach-tegra/mcerr.c
arch/arm/mach-tegra/mcerr.h

index d1bc12c..729fcde 100644 (file)
@@ -182,14 +182,24 @@ static irqreturn_t tegra_mc_error_isr(int irq, void *data)
        count = ++error_count;
        spin_unlock(&mc_lock);
 
-       err = readl(err_mc + MC_ERROR_STATUS);
-       addr = readl(err_mc + MC_ERROR_ADDRESS);
+       if (stat & MC_INT_DECERR_VPR) {
+               err = readl(err_mc + MC_ERR_VPR_STATUS);
+               addr = readl(err_mc + MC_ERR_VPR_ADR);
+               mc_type = "VPR DECERR";
+       } else if (stat & MC_INT_SECERR_SEC) {
+               err = readl(err_mc + MC_ERR_SEC_STATUS);
+               addr = readl(err_mc + MC_ERR_SEC_ADR);
+               mc_type = "SEC SECERR";
+       } else {
+               err = readl(err_mc + MC_ERROR_STATUS);
+               addr = readl(err_mc + MC_ERROR_ADDRESS);
+               mc_type = chip_specific.mcerr_type(err);
+       }
        is_write = err & (1 << 16);
        is_secure = err & (1 << 17);
        client_id = err & 0x7f;
        client = &mc_clients[client_id];
 
-       mc_type = chip_specific.mcerr_type(err);
        mc_info = chip_specific.mcerr_info(stat);
        chip_specific.mcerr_info_update(client, stat);
 
index b13f94c..21c7041 100644 (file)
 #define MC_INT_MASK                    0x4
 #define MC_ERROR_STATUS                        0x8
 #define MC_ERROR_ADDRESS               0xC
+#define MC_ERR_VPR_STATUS              0x654
+#define MC_ERR_VPR_ADR                 0x658
+#define MC_ERR_SEC_STATUS              0x67c
+#define MC_ERR_SEC_ADR                 0x680
 
 #define MC_INT_EXT_INTR_IN             (1<<1)
 #define MC_INT_DECERR_EMEM             (1<<6)