[linux-yocto] [PATCH 03/13] MIPS/EDAC: Cavium: Updated L2C error checking for OCTEON3.

Chandrakala Chavva cchavva.cavm at gmail.com
Mon Jan 26 22:04:09 PST 2015


From: Abhishek Paliwal <abhishek.paliwal at aricent.com>

From: Chandrakala Chavva <cchavva at caviumnetworks.com>

Use correct CSR for checking Double/Single bit ECC errors for various types.

Signed-off-by: Chandrakala Chavva <cchavva at caviumnetworks.com>
Signed-off-by: Abhishek Paliwal <abhishek.paliwal at aricent.com>
---
 drivers/edac/octeon_edac-l2c.c | 96 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 95 insertions(+), 1 deletion(-)

diff --git a/drivers/edac/octeon_edac-l2c.c b/drivers/edac/octeon_edac-l2c.c
index 7e98084..8dca929 100644
--- a/drivers/edac/octeon_edac-l2c.c
+++ b/drivers/edac/octeon_edac-l2c.c
@@ -131,6 +131,97 @@ static void octeon_l2c_poll_oct2(struct edac_device_ctl_info *l2c)
 		_octeon_l2c_poll_oct2(l2c, i);
 }
 
+static void _octeon_l2c_poll_oct3(struct edac_device_ctl_info *l2c, int tad)
+{
+	union cvmx_l2c_tqdx_err tqdx_err;
+	union cvmx_l2c_ttgx_err ttgx_err;
+	union cvmx_l2c_tadx_int l2c_reset;
+	int way, l2idx;
+
+	char buf1[64];
+	char buf2[80];
+
+	l2c_reset.u64 = 0;
+
+	tqdx_err.u64 = cvmx_read_csr(CVMX_L2C_TQDX_ERR(tad));
+	if (tqdx_err.s.l2ddbe || tqdx_err.s.l2dsbe ||
+	    tqdx_err.s.sbfdbe || tqdx_err.s.sbfsbe ||
+	    tqdx_err.s.fbfdbe || tqdx_err.s.fbfsbe)
+		snprintf(buf1, sizeof(buf1),
+			"L2D: syn:0x%x, quad:%d, index:%d",
+			tqdx_err.s.syn, tqdx_err.s.qdnum, tqdx_err.s.l2didx);
+
+	if (tqdx_err.s.l2ddbe) {
+		snprintf(buf2, sizeof(buf2),
+			"L2D Double bit error (detected):%s", buf1);
+		l2c_reset.cn70xx.l2ddbe = 1;
+		edac_device_handle_ue(l2c, tad, 1, buf2);
+	}
+	if (tqdx_err.s.l2dsbe) {
+		snprintf(buf2, sizeof(buf2),
+			"L2D Single bit error (corrected):%s", buf1);
+		l2c_reset.cn70xx.l2dsbe = 1;
+		edac_device_handle_ce(l2c, tad, 1, buf2);
+	}
+	if (tqdx_err.s.sbfdbe) {
+		snprintf(buf2, sizeof(buf2),
+			"SBF Double bit error (detected):%s", buf1);
+		l2c_reset.cn70xx.sbfdbe = 1;
+		edac_device_handle_ue(l2c, tad, 1, buf2);
+	}
+	if (tqdx_err.s.sbfsbe) {
+		snprintf(buf2, sizeof(buf2),
+			"SBF Single bit error (corrected):%s", buf1);
+		l2c_reset.cn70xx.sbfsbe = 1;
+		edac_device_handle_ce(l2c, tad, 1, buf2);
+	}
+	if (tqdx_err.s.fbfdbe) {
+		snprintf(buf2, sizeof(buf2),
+			"FBF Double bit error (detected):%s", buf1);
+		l2c_reset.cn70xx.fbfdbe = 1;
+		edac_device_handle_ue(l2c, tad, 1, buf2);
+	}
+	if (tqdx_err.s.fbfsbe) {
+		snprintf(buf2, sizeof(buf2),
+			"FBF Single bit error (corrected):%s", buf1);
+		l2c_reset.cn70xx.fbfsbe = 1;
+		edac_device_handle_ce(l2c, tad, 1, buf2);
+	}
+
+	ttgx_err.u64 = cvmx_read_csr(CVMX_L2C_TTGX_ERR(tad));
+	way = OCTEON_IS_MODEL(OCTEON_CN70XX) ? ttgx_err.cn70xx.way
+				: ttgx_err.cn78xx.way;
+	l2idx = OCTEON_IS_MODEL(OCTEON_CN70XX) ? ttgx_err.cn70xx.l2idx
+				: ttgx_err.cn78xx.l2idx;
+
+	if (ttgx_err.s.tagdbe || ttgx_err.s.tagsbe)
+		snprintf(buf1, sizeof(buf1),
+			"tag type error: syn:0x%x, way:%d, index:%d",
+			ttgx_err.s.syn, way, l2idx);
+
+	if (ttgx_err.s.tagdbe) {
+		snprintf(buf2, sizeof(buf2),
+			"Tag Double bit error (detected):%s", buf1);
+		l2c_reset.cn70xx.tagdbe = 1;
+		edac_device_handle_ue(l2c, tad, 0, buf2);
+	}
+	if (ttgx_err.s.tagsbe) {
+		snprintf(buf2, sizeof(buf2),
+			"Tag Single bit error (corrected):%s", buf1);
+		l2c_reset.cn70xx.tagsbe = 1;
+		edac_device_handle_ce(l2c, tad, 0, buf2);
+	}
+	if (l2c_reset.u64)
+		cvmx_write_csr(CVMX_L2C_TADX_INT(tad), l2c_reset.u64);
+}
+
+static void octeon_l2c_poll_oct3(struct edac_device_ctl_info *l2c)
+{
+	nt i;
+	for (i = 0; i < l2c->nr_instances; i++)
+		_octeon_l2c_poll_oct3(l2c, i);
+}
+
 static int octeon_l2c_probe(struct platform_device *pdev)
 {
 	struct edac_device_ctl_info *l2c;
@@ -166,9 +257,12 @@ static int octeon_l2c_probe(struct platform_device *pdev)
 		cvmx_write_csr(CVMX_L2T_ERR, l2d_err.u64);
 
 		l2c->edac_check = octeon_l2c_poll_oct1;
-	} else {
+	} else if (current_cpu_type() == CPU_CAVIUM_OCTEON2) {
 		/* OCTEON II */
 		l2c->edac_check = octeon_l2c_poll_oct2;
+	} else {
+		/* OCTEON III */
+		l2c->edac_check = octeon_l2c_poll_oct3;
 	}
 
 	if (edac_device_add_device(l2c) > 0) {
-- 
1.8.1.4



More information about the linux-yocto mailing list