From: Marek Majtyka <marekx.majt...@intel.com> Signed-off-by: Marek Majtyka <marekx.majt...@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 -- _______________________________________________ linux-yocto mailing list linux-yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/linux-yocto