static void pasemi_edac_process_error_info(struct mem_ctl_info *mci, u32 errsta) { struct pci_dev *pdev = to_pci_dev(mci->dev); u32 errlog1a; u32 cs; if (!errsta) return; pci_read_config_dword(pdev, MCDEBUG_ERRLOG1A, &errlog1a); cs = (errlog1a & MCDEBUG_ERRLOG1A_MERR_CS_M) >> MCDEBUG_ERRLOG1A_MERR_CS_S; /* uncorrectable/multi-bit errors */ if (errsta & (MCDEBUG_ERRSTA_MBE_STATUS | MCDEBUG_ERRSTA_RFL_STATUS)) { edac_mc_handle_ue(mci, mci->csrows[cs].first_page, 0, cs, mci->ctl_name); } /* correctable/single-bit errors */ if (errsta & MCDEBUG_ERRSTA_SBE_STATUS) { edac_mc_handle_ce(mci, mci->csrows[cs].first_page, 0, 0, cs, 0, mci->ctl_name); } }
static int i3000_process_error_info(struct mem_ctl_info *mci, struct i3000_error_info *info, int handle_errors) { int row, multi_chan; int pfn, offset, channel; multi_chan = mci->csrows[0].nr_channels - 1; if (!(info->errsts & I3000_ERRSTS_BITS)) return 0; if (!handle_errors) return 1; if ((info->errsts ^ info->errsts2) & I3000_ERRSTS_BITS) { edac_mc_handle_ce_no_info(mci, "UE overwrote CE"); info->errsts = info->errsts2; } pfn = I3000_DEAP_PFN(info->edeap, info->deap); offset = I3000_DEAP_OFFSET(info->deap); channel = I3000_DEAP_CHANNEL(info->deap); row = edac_mc_find_csrow_by_page(mci, pfn); if (info->errsts & I3000_ERRSTS_UE) edac_mc_handle_ue(mci, pfn, offset, row, "i3000 UE"); else edac_mc_handle_ce(mci, pfn, offset, info->derrsyn, row, multi_chan ? channel : 0, "i3000 CE"); return 1; }
static void mpc85xx_mc_check(struct mem_ctl_info *mci) { struct mpc85xx_mc_pdata *pdata = mci->pvt_info; struct csrow_info *csrow; u32 err_detect; u32 syndrome; u32 err_addr; u32 pfn; int row_index; err_detect = in_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT); if (err_detect) return; mpc85xx_mc_printk(mci, KERN_ERR, "Err Detect Register: %#8.8x\n", err_detect); /* no more processing if not ECC bit errors */ if (!(err_detect & (DDR_EDE_SBE | DDR_EDE_MBE))) { out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT, err_detect); return; } syndrome = in_be32(pdata->mc_vbase + MPC85XX_MC_CAPTURE_ECC); err_addr = in_be32(pdata->mc_vbase + MPC85XX_MC_CAPTURE_ADDRESS); pfn = err_addr >> PAGE_SHIFT; for (row_index = 0; row_index < mci->nr_csrows; row_index++) { csrow = &mci->csrows[row_index]; if ((pfn >= csrow->first_page) && (pfn <= csrow->last_page)) break; } mpc85xx_mc_printk(mci, KERN_ERR, "Capture Data High: %#8.8x\n", in_be32(pdata->mc_vbase + MPC85XX_MC_CAPTURE_DATA_HI)); mpc85xx_mc_printk(mci, KERN_ERR, "Capture Data Low: %#8.8x\n", in_be32(pdata->mc_vbase + MPC85XX_MC_CAPTURE_DATA_LO)); mpc85xx_mc_printk(mci, KERN_ERR, "syndrome: %#8.8x\n", syndrome); mpc85xx_mc_printk(mci, KERN_ERR, "err addr: %#8.8x\n", err_addr); mpc85xx_mc_printk(mci, KERN_ERR, "PFN: %#8.8x\n", pfn); /* we are out of range */ if (row_index == mci->nr_csrows) mpc85xx_mc_printk(mci, KERN_ERR, "PFN out of range!\n"); if (err_detect & DDR_EDE_SBE) edac_mc_handle_ce(mci, pfn, err_addr & PAGE_MASK, syndrome, row_index, 0, mci->ctl_name); if (err_detect & DDR_EDE_MBE) edac_mc_handle_ue(mci, pfn, err_addr & PAGE_MASK, row_index, mci->ctl_name); out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT, err_detect); }
static void tile_edac_check(struct mem_ctl_info *mci) { struct tile_edac_priv *priv = mci->pvt_info; struct mshim_mem_error mem_error; if (hv_dev_pread(priv->hv_devhdl, 0, (HV_VirtAddr)&mem_error, sizeof(struct mshim_mem_error), MSHIM_MEM_ERROR_OFF) != sizeof(struct mshim_mem_error)) { pr_err(DRV_NAME ": MSHIM_MEM_ERROR_OFF pread failure.\n"); return; } if (mem_error.sbe_count != priv->ce_count) { dev_dbg(mci->dev, "ECC CE err on node %d\n", priv->node); priv->ce_count = mem_error.sbe_count; edac_mc_handle_ce(mci, 0, 0, 0, 0, 0, mci->ctl_name); } }