[linux-yocto] [PATCH 06/14] drivers/edac: Added CMEM debug feature

Daniel Dragomir daniel.dragomir at windriver.com
Mon Dec 4 02:57:56 PST 2017


From: Marek Majtyka <marekx.majtyka at intel.com>

Signed-off-by: Marek Majtyka <marekx.majtyka at intel.com>
---
 drivers/edac/axxia_edac-cmc_56xx.c | 87 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 86 insertions(+), 1 deletion(-)

diff --git a/drivers/edac/axxia_edac-cmc_56xx.c b/drivers/edac/axxia_edac-cmc_56xx.c
index 1f5d3aa..9d22279 100644
--- a/drivers/edac/axxia_edac-cmc_56xx.c
+++ b/drivers/edac/axxia_edac-cmc_56xx.c
@@ -31,6 +31,7 @@
 #include "edac_core.h"
 #include "edac_module.h"
 
+#define  CONFIG_DEBUG_CMEM 1
 #define FMT "%s: syscon lookup failed hence using hardcoded register address\n"
 
 #define MPR_FMT2 "\n%3d %#010x %#010x"
@@ -286,6 +287,31 @@ struct __packed cm_56xx_denali_ctl_34
 #endif
 };
 
+#ifdef CONFIG_DEBUG_CMEM
+
+#define CM_56XX_DENALI_CTL_62 0xf8
+
+struct __packed cm_56xx_denali_ctl_62
+{
+#ifdef CPU_BIG_ENDIAN
+	unsigned	reserved0				: 2;
+	unsigned	xor_check_bits				: 14;
+	unsigned	reserved1				: 7;
+	unsigned	fwc					: 1;
+	unsigned	reserved2				: 7;
+	unsigned	ecc_en					: 1;
+#else	/* Little Endian */
+	unsigned	ecc_en					: 1;
+	unsigned	reserved2				: 7;
+	unsigned	fwc					: 1;
+	unsigned	reserved1				: 7;
+	unsigned	xor_check_bits				: 14;
+	unsigned	reserved0				: 2;
+#endif
+};
+
+#endif
+
 struct __packed cm_56xx_denali_ctl_74
 {
 #ifdef CPU_BIG_ENDIAN
@@ -476,6 +502,47 @@ struct intel_edac_dev_info {
 };
 
 #ifdef CONFIG_DEBUG_CMEM
+static int setup_fault_injection(struct intel_edac_dev_info *dev_info,
+					int fault, int enable)
+{
+	struct cm_56xx_denali_ctl_62 denali_ctl_62;
+
+	if (ncr_read(dev_info->cm_region,
+			CM_56XX_DENALI_CTL_62,
+			4, &denali_ctl_62))
+				goto error_read;
+
+	denali_ctl_62.xor_check_bits = fault;
+
+	if (ncr_write(dev_info->cm_region,
+			CM_56XX_DENALI_CTL_62,
+			4, (u32 *) &denali_ctl_62))
+				goto error_write;
+
+	if (ncr_read(dev_info->cm_region,
+			CM_56XX_DENALI_CTL_62,
+			4, &denali_ctl_62))
+				goto error_read;
+
+	denali_ctl_62.fwc = (enable > 0 ? 0x1 : 0x0);
+
+	if (ncr_write(dev_info->cm_region,
+			CM_56XX_DENALI_CTL_62,
+			4, (u32 *) &denali_ctl_62))
+				goto error_write;
+	return 0;
+
+error_read:
+	printk_ratelimited("%s: Error reading denali_ctl_62\n",
+		       dev_name(&dev_info->pdev->dev));
+	return 1;
+
+error_write:
+	printk_ratelimited("%s: Error writing denali_ctl_62\n",
+		       dev_name(&dev_info->pdev->dev));
+	return 1;
+}
+
 static ssize_t mpr1_dump_show(struct edac_device_ctl_info
 				 *edac_dev, char *data)
 {
@@ -1335,7 +1402,15 @@ axxia_cmem_read(struct file *filp, char *buffer, size_t length, loff_t *offset)
 	 */
 	len = snprintf(buf, PAGE_SIZE-1, "Node: 0x%x\n"
 		"Command available:\n"
-		"          dump - triggers mpr_page1 dump.\n",
+		"          dump - triggers mpr_page1 dump.\n"
+		"          cerror - enable correctable error injection.\n"
+		"          uerror - enable uncorrectable error injection.\n"
+		"          disable - disable errors injection\n"
+		" When error is enabled run a sequence:\n"
+		"  ncpWrite -w 32 0x%x.0x0.0x4 0x11223344\n"
+		"  ncpRead 0x%x.0x0.0x4\n",
+		(int) dev_info->cm_region >> 16,
+		(int) dev_info->cm_region >> 16,
 		(int) dev_info->cm_region >> 16);
 
 	mutex_unlock(&dev_info->state_machine_lock);
@@ -1376,6 +1451,16 @@ axxia_cmem_write(struct file *file, const char __user *buffer,
 		atomic_inc(&dev_info->data->dump_in_progress);
 		wake_up(&dev_info->data->dump_wq);
 	}
+	if (!strncmp(buf, "cerror", 6)) {
+		/* 0x75 0x75 */
+		setup_fault_injection(dev_info, 0x3af5, 1);
+	}
+	if (!strncmp(buf, "uerror", 6)) {
+		/* 0x3 0x3 */
+		setup_fault_injection(dev_info, 0x183, 1);
+	}
+	if (!strncmp(buf, "disable", 7))
+		setup_fault_injection(dev_info, 0x0, 0);
 
 	kfree(buf);
 	return count;
-- 
2.7.4



More information about the linux-yocto mailing list