L3 error may be triggered using Debug interface (example JTAG) or
due to other errors, for example an opcode fetch (due to function
pointer or stack corruption) or a data access (due to some other
failure). NOC registers contain additional information to help aid
debug information.

With this, we can enhance the error information to more detailed form:
"
L3 Custom Error: MASTER MPU TARGET L4PER2 (Read): Data Access in User mode
during Functional access
"

Signed-off-by: Nishanth Menon <n...@ti.com>
Acked-by: Santosh Shilimkar <santosh.shilim...@ti.com>
Acked-by: Peter Ujfalusi <peter.ujfal...@ti.com>
Tested-by: Darren Etheridge <detheri...@ti.com>
---
V3: no change
 drivers/bus/omap_l3_noc.c |   18 ++++++++++++++----
 drivers/bus/omap_l3_noc.h |    2 ++
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/drivers/bus/omap_l3_noc.c b/drivers/bus/omap_l3_noc.c
index 9d021d0..08344b0 100644
--- a/drivers/bus/omap_l3_noc.c
+++ b/drivers/bus/omap_l3_noc.c
@@ -60,15 +60,16 @@ static int l3_handle_target(struct omap_l3 *l3, void 
__iomem *base,
 {
        int k;
        u32 std_err_main, clear, masterid;
-       u8 op_code;
+       u8 op_code, m_req_info;
        void __iomem *l3_targ_base;
        void __iomem *l3_targ_stderr, *l3_targ_slvofslsb, *l3_targ_mstaddr;
-       void __iomem *l3_targ_hdr;
+       void __iomem *l3_targ_hdr, *l3_targ_info;
        struct l3_target_data *l3_targ_inst;
        struct l3_masters_data *master;
        char *target_name, *master_name = "UN IDENTIFIED";
        char *err_description;
        char err_string[30] = { 0 };
+       char info_string[60] = { 0 };
 
        /* We DONOT expect err_src to go out of bounds */
        BUG_ON(err_src > MAX_CLKDM_TARGETS);
@@ -99,6 +100,7 @@ static int l3_handle_target(struct omap_l3 *l3, void __iomem 
*base,
 
                l3_targ_mstaddr = l3_targ_base + L3_TARG_STDERRLOG_MSTADDR;
                l3_targ_hdr = l3_targ_base + L3_TARG_STDERRLOG_HDR;
+               l3_targ_info = l3_targ_base + L3_TARG_STDERRLOG_INFO;
                break;
 
        case CUSTOM_ERROR:
@@ -107,6 +109,7 @@ static int l3_handle_target(struct omap_l3 *l3, void 
__iomem *base,
                l3_targ_mstaddr = l3_targ_base +
                                  L3_TARG_STDERRLOG_CINFO_MSTADDR;
                l3_targ_hdr = l3_targ_base + L3_TARG_STDERRLOG_CINFO_OPCODE;
+               l3_targ_info = l3_targ_base + L3_TARG_STDERRLOG_CINFO_INFO;
                break;
 
        default:
@@ -128,13 +131,20 @@ static int l3_handle_target(struct omap_l3 *l3, void 
__iomem *base,
 
        op_code = readl_relaxed(l3_targ_hdr) & 0x7;
 
+       m_req_info = readl_relaxed(l3_targ_info) & 0xF;
+       snprintf(info_string, sizeof(info_string),
+                ": %s in %s mode during %s access",
+                (m_req_info & BIT(0)) ? "Opcode Fetch" : "Data Access",
+                (m_req_info & BIT(1)) ? "Supervisor" : "User",
+                (m_req_info & BIT(3)) ? "Debug" : "Functional");
+
        WARN(true,
-            "%s:L3 %s Error: MASTER %s TARGET %s (%s)%s\n",
+            "%s:L3 %s Error: MASTER %s TARGET %s (%s)%s%s\n",
             dev_name(l3->dev),
             err_description,
             master_name, target_name,
             l3_transaction_type[op_code],
-            err_string);
+            err_string, info_string);
 
        /* clear the std error log*/
        clear = std_err_main | CLEAR_STDERR_LOG;
diff --git a/drivers/bus/omap_l3_noc.h b/drivers/bus/omap_l3_noc.h
index 6670fd9..36dc48b 100644
--- a/drivers/bus/omap_l3_noc.h
+++ b/drivers/bus/omap_l3_noc.h
@@ -31,7 +31,9 @@
 #define L3_TARG_STDERRLOG_MAIN         0x48
 #define L3_TARG_STDERRLOG_HDR          0x4c
 #define L3_TARG_STDERRLOG_MSTADDR      0x50
+#define L3_TARG_STDERRLOG_INFO         0x58
 #define L3_TARG_STDERRLOG_SLVOFSLSB    0x5c
+#define L3_TARG_STDERRLOG_CINFO_INFO   0x64
 #define L3_TARG_STDERRLOG_CINFO_MSTADDR        0x68
 #define L3_TARG_STDERRLOG_CINFO_OPCODE 0x6c
 #define L3_FLAGMUX_REGERR0             0xc
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to