From: John Jacques <john.jacq...@intel.com> Signed-off-by: John Jacques <john.jacq...@intel.com> --- drivers/edac/axxia_edac.c | 461 ---------------------------------------------- 1 file changed, 461 deletions(-) delete mode 100644 drivers/edac/axxia_edac.c
diff --git a/drivers/edac/axxia_edac.c b/drivers/edac/axxia_edac.c deleted file mode 100644 index d638141..0000000 --- a/drivers/edac/axxia_edac.c +++ /dev/null @@ -1,461 +0,0 @@ - /* - * drivers/edac/axxia_edac.c - * - * EDAC Driver for Avago's Axxia 5500 - * - * Copyright (C) 2010 LSI Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/slab.h> -#include <linux/io.h> -#include <linux/edac.h> -#include <mach/ncr.h> -#include <linux/of_platform.h> -#include <linux/of.h> -#include <linux/of_address.h> -#include <linux/of_irq.h> -#include <linux/irq.h> -#include <linux/platform_device.h> -#include <linux/reboot.h> - -#include "edac_core.h" -#include "edac_module.h" - -#define LSI_EDAC_MOD_STR "lsi_edac" -#define CORES_PER_CLUSTER 4 - -/* Private structure for common edac device */ -struct lsi_edac_dev_info { - void __iomem *vbase; - struct platform_device *pdev; - char *ctl_name; - char *blk_name; - int edac_idx; - u32 sm0_region; - u32 sm1_region; - void __iomem *apb2ser3_region; - void __iomem *dickens_L3[8]; - struct edac_device_ctl_info *edac_dev; - void (*init)(struct lsi_edac_dev_info *dev_info); - void (*exit)(struct lsi_edac_dev_info *dev_info); - void (*check)(struct edac_device_ctl_info *edac_dev); -}; - -static void lsi_error_init(struct lsi_edac_dev_info *dev_info) -{ -} - -static void lsi_error_exit(struct lsi_edac_dev_info *dev_info) -{ -} - -void log_cpumerrsr(void *edac) -{ - struct edac_device_ctl_info *edac_dev = - (struct edac_device_ctl_info *)edac; - u32 tmp1, tmp2, count0, count1; - unsigned long setVal; - int i; - struct lsi_edac_dev_info *dev_info; - - dev_info = (struct lsi_edac_dev_info *) edac_dev->pvt_info; - - /* Read cp15 for CPUMERRSR counts */ - asm volatile("mrrc\tp15, 0, %0, %1, c15" : "=r"(tmp1), - "=r"(tmp2)); - if (tmp1 & 0x80000000) { - count0 = (tmp2) & 0x000000ff; - count1 = ((tmp2) & 0x0000ff00) >> 8; - - /* increment correctable error counts */ - for (i = 0; i < count0+count1; i++) { - edac_device_handle_ce(edac_dev, 0, - raw_smp_processor_id(), edac_dev->ctl_name); - } - - /* Clear the valid bit */ - tmp1 = 0x80000000; - tmp2 = 0; - asm volatile("mcrr\tp15, 0, %0, %1, c15" : : "r"(tmp1), - "r"(tmp2)); - } - if (tmp2 & 0x80000000) { - setVal = readl(dev_info->apb2ser3_region + 0xdc); - /* set bit 3 in pscratch reg */ - setVal = (setVal) | (0x1 << 3); - writel(setVal, dev_info->apb2ser3_region + 0xdc); - pr_info("CPU uncorrectable error\n"); - machine_restart(NULL); - } -} - - -/* Check for CPU Errors */ -static void lsi_cpu_error_check(struct edac_device_ctl_info *edac_dev) -{ - /* execute on current cpu */ - log_cpumerrsr(edac_dev); - - /* send ipis to execute on other cpus */ - smp_call_function(log_cpumerrsr, edac_dev, 1); - -} - -void log_l2merrsr(void *edac) -{ - struct edac_device_ctl_info *edac_dev = - (struct edac_device_ctl_info *)edac; - u32 tmp1, tmp2, count0, count1; - unsigned long setVal; - int i; - struct lsi_edac_dev_info *dev_info; - - dev_info = (struct lsi_edac_dev_info *) edac_dev->pvt_info; - - /* Read cp15 for L2MERRSR counts */ - asm volatile("mrrc\tp15, 1, %0, %1, c15" : "=r"(tmp1), - "=r"(tmp2)); - if (tmp1 & 0x80000000) { - count0 = (tmp2) & 0x000000ff; - count1 = ((tmp2) & 0x0000ff00) >> 8; - - /* increment correctable error counts */ - for (i = 0; i < count0+count1; i++) { - edac_device_handle_ce(edac_dev, 0, - raw_smp_processor_id()/CORES_PER_CLUSTER, - edac_dev->ctl_name); - } - - /* Clear the valid bit */ - tmp1 = 0x80000000; - tmp2 = 0; - asm volatile("mcrr\tp15, 1, %0, %1, c15" : : "r"(tmp1), - "r"(tmp2)); - } - if (tmp2 & 0x80000000) { - setVal = readl(dev_info->apb2ser3_region + 0xdc); - /* set bit 3 in pscratch reg */ - setVal = (setVal) | (0x1 << 3); - writel(setVal, dev_info->apb2ser3_region + 0xdc); - pr_info("L2 uncorrectable error\n"); - machine_restart(NULL); - } -} - -/* Check for L2 Errors */ -static void lsi_l2_error_check(struct edac_device_ctl_info *edac_dev) -{ - /* 4 cores per cluster */ - int nr_cluster_ids = ((nr_cpu_ids - 1) / CORES_PER_CLUSTER) + 1; - int i, j, cpu; - - /* execute on current cpu */ - log_l2merrsr(edac_dev); - - for (i = 0; i < nr_cluster_ids; i++) { - /* No need to run on local cluster. */ - if (i == (raw_smp_processor_id() / CORES_PER_CLUSTER)) - continue; - /* - * Have some core in each cluster execute this, - * Start with the first core on that cluster. - */ - cpu = i * CORES_PER_CLUSTER; - for (j = cpu; j < cpu + CORES_PER_CLUSTER; j++) { - if (cpu_online(j)) { - smp_call_function_single(j, log_l2merrsr, - edac_dev, 1); - break; - } - } - } -} - -/* Check for L3 Errors */ -static void lsi_l3_error_check(struct edac_device_ctl_info *edac_dev) -{ - unsigned long regVal1, regVal2, setVal; - unsigned count = 0; - int i, instance; - struct lsi_edac_dev_info *dev_info; - - dev_info = (struct lsi_edac_dev_info *) edac_dev->pvt_info; - - for (instance = 0; instance < 8; instance++) { - regVal1 = readl(dev_info->dickens_L3[instance]); - regVal2 = readl(dev_info->dickens_L3[instance] + 4); - /* First error valid */ - if (regVal2 & 0x40000000) { - if (regVal2 & 0x30000000) { - setVal = readl(dev_info->apb2ser3_region + - 0xdc); - /* set bit 3 in pscratch reg */ - setVal = (setVal) | (0x1 << 3); - writel(setVal, dev_info->apb2ser3_region + - 0xdc); - /* Fatal error */ - pr_info("L3 uncorrectable error\n"); - machine_restart(NULL); - } - count = (regVal2 & 0x07fff800) >> 11; - for (i = 0; i < count; i++) - edac_device_handle_ce(edac_dev, 0, - instance, edac_dev->ctl_name); - /* clear the valid bit */ - writel(0x48000000, dev_info->dickens_L3[instance] + 84); - } - } -} - -/* Check for SysMem Errors */ -static void lsi_sm_error_check(struct edac_device_ctl_info *edac_dev) -{ - unsigned long sm0_regVal, sm1_regVal, clearVal, setVal; - struct lsi_edac_dev_info *dev_info; - - dev_info = (struct lsi_edac_dev_info *) edac_dev->pvt_info; - - /* SM0 is instance 0 */ - ncr_read(dev_info->sm0_region, 0x410, 4, &sm0_regVal); - if (sm0_regVal & 0x8) { - /* single bit and multiple bit correctable errors */ - edac_device_handle_ce(edac_dev, 0, 0, edac_dev->ctl_name); - /* Clear bits */ - clearVal = 0x8; - ncr_write(dev_info->sm0_region, 0x548, 4, &clearVal); - } - if (sm0_regVal & 0x40) { - setVal = readl(dev_info->apb2ser3_region + 0xdc); - /* set bit 3 in pscratch reg */ - setVal = (setVal) | (0x1 << 3); - writel(setVal, dev_info->apb2ser3_region + 0xdc); - /* single bit and multiple bit uncorrectable errors */ - pr_info("SM0 uncorrectable error\n"); - machine_restart(NULL); - } - - /* SM1 is instance 1 */ - ncr_read(dev_info->sm1_region, 0x410, 4, &sm1_regVal); - if (sm1_regVal & 0x8) { - /* single bit and multiple bit correctable errors */ - edac_device_handle_ce(edac_dev, 0, 1, edac_dev->ctl_name); - /* Clear bits */ - clearVal = 0x8; - ncr_write(dev_info->sm1_region, 0x548, 4, &clearVal); - } - if (sm1_regVal & 0x40) { - setVal = readl(dev_info->apb2ser3_region + 0xdc); - /* set bit 3 in pscratch reg */ - setVal = (setVal) | (0x1 << 3); - writel(setVal, dev_info->apb2ser3_region + 0xdc); - /* single bit and multiple bit uncorrectable errors */ - pr_info("SM1 uncorrectable error\n"); - machine_restart(NULL); - } -} - - -static struct lsi_edac_dev_info lsi_edac_devs[] = { - { - .ctl_name = "LSI_CPU", - .blk_name = "cpumerrsr", - .init = lsi_error_init, - .exit = lsi_error_exit, - .check = lsi_cpu_error_check - }, - { - .ctl_name = "LSI_L2", - .blk_name = "l2merrsr", - .init = lsi_error_init, - .exit = lsi_error_exit, - .check = lsi_l2_error_check - }, - { - .ctl_name = "LSI_L3", - .blk_name = "l3merrsr", - .init = lsi_error_init, - .exit = lsi_error_exit, - .check = lsi_l3_error_check - }, - { - .ctl_name = "LSI_SM", - .blk_name = "ECC", - .init = lsi_error_init, - .exit = lsi_error_exit, - .check = lsi_sm_error_check - }, - {0} /* Terminated by NULL */ -}; - - - -/* static void lsi_add_edac_devices(void __iomem *vbase) */ -static void lsi_add_edac_devices(struct platform_device *pdev) -{ - struct lsi_edac_dev_info *dev_info = NULL; - /* 4 cores per cluster */ - int nr_cluster_ids = ((nr_cpu_ids - 1) / CORES_PER_CLUSTER) + 1; - struct resource *io0, *io1; - struct device_node *np = pdev->dev.of_node; - void __iomem *apb2ser3_region; - int i; - - apb2ser3_region = of_iomap(np, 2); - if (!apb2ser3_region) { - dev_err(&pdev->dev, "LSI_apb2ser3_region iomap error\n"); - goto err2; - } - - for (dev_info = &lsi_edac_devs[0]; dev_info->init; dev_info++) { - dev_info->pdev = platform_device_register_simple( - dev_info->ctl_name, 0, NULL, 0); - if (IS_ERR(dev_info->pdev)) { - pr_info("Can't register platform device for %s\n", - dev_info->ctl_name); - continue; - } - /* - * Don't have to allocate private structure but - * make use of cpc925_devs[] instead. - */ - dev_info->edac_idx = edac_device_alloc_index(); - - if (strcmp(dev_info->ctl_name, "LSI_SM") == 0) { - io0 = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!io0) { - dev_err(&pdev->dev, "Unable to get mem resource\n"); - goto err2; - } - io1 = platform_get_resource(pdev, IORESOURCE_MEM, 1); - if (!io1) { - dev_err(&pdev->dev, "Unable to get mem resource\n"); - goto err2; - } - - dev_info->sm0_region = io0->start; - dev_info->sm1_region = io1->start; - dev_info->apb2ser3_region = apb2ser3_region; - dev_info->edac_dev = - edac_device_alloc_ctl_info(0, dev_info->ctl_name, - 1, dev_info->blk_name, 2, 0, - NULL, 0, dev_info->edac_idx); - } else if (strcmp(dev_info->ctl_name, "LSI_L3") == 0) { - /* 8 L3 caches */ - for (i = 0; i < 8; i++) { - dev_info->dickens_L3[i] = of_iomap(np, i+3); - if (!dev_info->dickens_L3[i]) { - dev_err(&pdev->dev, - "LSI_L3 iomap error\n"); - goto err2; - } - } - dev_info->apb2ser3_region = apb2ser3_region; - dev_info->edac_dev = - edac_device_alloc_ctl_info(0, dev_info->ctl_name, - 1, dev_info->blk_name, 8, 0, NULL, 0, - dev_info->edac_idx); - } else if (strcmp(dev_info->ctl_name, "LSI_CPU") == 0) { - dev_info->apb2ser3_region = apb2ser3_region; - dev_info->edac_dev = - edac_device_alloc_ctl_info(0, dev_info->ctl_name, - 1, dev_info->blk_name, num_possible_cpus(), 0, NULL, - 0, dev_info->edac_idx); - } else if (strcmp(dev_info->ctl_name, "LSI_L2") == 0) { - dev_info->apb2ser3_region = apb2ser3_region; - dev_info->edac_dev = - edac_device_alloc_ctl_info(0, dev_info->ctl_name, - 1, dev_info->blk_name, nr_cluster_ids, 0, NULL, - 0, dev_info->edac_idx); - } else { - dev_info->edac_dev = - edac_device_alloc_ctl_info(0, dev_info->ctl_name, - 1, dev_info->blk_name, 1, 0, - NULL, 0, dev_info->edac_idx); - } - if (!dev_info->edac_dev) { - pr_info("No memory for edac device\n"); - goto err1; - } - - dev_info->edac_dev->pvt_info = dev_info; - dev_info->edac_dev->dev = &dev_info->pdev->dev; - dev_info->edac_dev->ctl_name = dev_info->ctl_name; - dev_info->edac_dev->mod_name = LSI_EDAC_MOD_STR; - dev_info->edac_dev->dev_name = dev_name(&dev_info->pdev->dev); - - if (edac_op_state == EDAC_OPSTATE_POLL) - dev_info->edac_dev->edac_check = dev_info->check; - - if (dev_info->init) - dev_info->init(dev_info); - - if (edac_device_add_device(dev_info->edac_dev) > 0) { - pr_info("Unable to add edac device for %s\n", - dev_info->ctl_name); - goto err2; - } - pr_info("Successfully added edac device for %s\n", - dev_info->ctl_name); - - continue; -err2: - if (dev_info->exit) - dev_info->exit(dev_info); - edac_device_free_ctl_info(dev_info->edac_dev); -err1: - platform_device_unregister(dev_info->pdev); - } -} - - -static int lsi_edac_probe(struct platform_device *pdev) -{ - edac_op_state = EDAC_OPSTATE_POLL; - lsi_add_edac_devices(pdev); - return 0; -} - -static int lsi_edac_remove(struct platform_device *pdev) -{ - platform_device_unregister(pdev); - return 0; -} - -static struct of_device_id lsi_edac_match[] = { - { - .type = "edac", - .compatible = "lsi,edac", - }, - {}, -}; - -static struct platform_driver lsi_edac_driver = { - .probe = lsi_edac_probe, - .remove = lsi_edac_remove, - .driver = { - .name = "lsi_edac", - .of_match_table = lsi_edac_match, - } -}; - -module_platform_driver(lsi_edac_driver); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Sangeetha Rao <sangeetha....@avagotech.com>"); -- 1.9.1 -- _______________________________________________ linux-yocto mailing list linux-yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/linux-yocto