Lines Matching +full:al +full:- +full:mc +full:- +full:edac
11 * http://www.anime.net/~goemon/linux-ecc/
14 …* http://www.intel.com/content/www/us/en/chipsets/e7501-chipset-memory-controller-hub-datasheet.ht…
32 #include <linux/edac.h>
78 /* E7XXX register addresses - device 0 function 0 */
100 /* E7XXX register addresses - device 0 function 1 */
165 /* FIXME - is this valid for both SECDED and S4ECD4ED? */
186 struct e7xxx_pvt *pvt = (struct e7xxx_pvt *)mci->pvt_info; in ctl_page_to_phys()
190 if ((page < pvt->tolm) || in ctl_page_to_phys()
191 ((page >= 0x100000) && (page < pvt->remapbase))) in ctl_page_to_phys()
194 remap = (page - pvt->tolm) + pvt->remapbase; in ctl_page_to_phys()
196 if (remap < pvt->remaplimit) in ctl_page_to_phys()
199 e7xxx_printk(KERN_ERR, "Invalid page %lx - out of range\n", page); in ctl_page_to_phys()
200 return pvt->tolm - 1; in ctl_page_to_phys()
212 error_1b = info->dram_celog_add; in process_ce()
213 /* FIXME - should use PAGE_SHIFT */ in process_ce()
216 syndrome = info->dram_celog_syndrome; in process_ce()
217 /* FIXME - check for -1 */ in process_ce()
222 row, channel, -1, "e7xxx CE", ""); in process_ce()
228 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, 0, 0, 0, -1, -1, -1, in process_ce_no_info()
239 error_2b = info->dram_uelog_add; in process_ue()
240 /* FIXME - should use PAGE_SHIFT */ in process_ue()
245 row, -1, -1, "e7xxx UE", ""); in process_ue()
252 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0, -1, -1, -1, in process_ue_no_info()
261 pvt = (struct e7xxx_pvt *)mci->pvt_info; in e7xxx_get_error_info()
262 pci_read_config_byte(pvt->bridge_ck, E7XXX_DRAM_FERR, &info->dram_ferr); in e7xxx_get_error_info()
263 pci_read_config_byte(pvt->bridge_ck, E7XXX_DRAM_NERR, &info->dram_nerr); in e7xxx_get_error_info()
265 if ((info->dram_ferr & 1) || (info->dram_nerr & 1)) { in e7xxx_get_error_info()
266 pci_read_config_dword(pvt->bridge_ck, E7XXX_DRAM_CELOG_ADD, in e7xxx_get_error_info()
267 &info->dram_celog_add); in e7xxx_get_error_info()
268 pci_read_config_word(pvt->bridge_ck, in e7xxx_get_error_info()
270 &info->dram_celog_syndrome); in e7xxx_get_error_info()
273 if ((info->dram_ferr & 2) || (info->dram_nerr & 2)) in e7xxx_get_error_info()
274 pci_read_config_dword(pvt->bridge_ck, E7XXX_DRAM_UELOG_ADD, in e7xxx_get_error_info()
275 &info->dram_uelog_add); in e7xxx_get_error_info()
277 if (info->dram_ferr & 3) in e7xxx_get_error_info()
278 pci_write_bits8(pvt->bridge_ck, E7XXX_DRAM_FERR, 0x03, 0x03); in e7xxx_get_error_info()
280 if (info->dram_nerr & 3) in e7xxx_get_error_info()
281 pci_write_bits8(pvt->bridge_ck, E7XXX_DRAM_NERR, 0x03, 0x03); in e7xxx_get_error_info()
293 if (info->dram_ferr & 1) { /* check first error correctable */ in e7xxx_process_error_info()
300 if (info->dram_ferr & 2) { /* check first error uncorrectable */ in e7xxx_process_error_info()
307 if (info->dram_nerr & 1) { /* check next error correctable */ in e7xxx_process_error_info()
311 if (info->dram_ferr & 1) in e7xxx_process_error_info()
318 if (info->dram_nerr & 2) { /* check next error uncorrectable */ in e7xxx_process_error_info()
322 if (info->dram_ferr & 2) in e7xxx_process_error_info()
376 for (index = 0; index < mci->nr_csrows; index++) { in e7xxx_init_csrows()
379 csrow = mci->csrows[index]; in e7xxx_init_csrows()
383 cumul_size = value << (25 + drc_drbg - PAGE_SHIFT); in e7xxx_init_csrows()
388 csrow->first_page = last_cumul_size; in e7xxx_init_csrows()
389 csrow->last_page = cumul_size - 1; in e7xxx_init_csrows()
390 nr_pages = cumul_size - last_cumul_size; in e7xxx_init_csrows()
400 mci->edac_cap |= EDAC_FLAG_S4ECD4ED; in e7xxx_init_csrows()
403 mci->edac_cap |= EDAC_FLAG_SECDED; in e7xxx_init_csrows()
409 dimm = csrow->channels[j]->dimm; in e7xxx_init_csrows()
411 dimm->nr_pages = nr_pages / (drc_chan + 1); in e7xxx_init_csrows()
412 dimm->grain = 1 << 12; /* 4KiB - resolution of CELOG */ in e7xxx_init_csrows()
413 dimm->mtype = MEM_RDDR; /* only one type supported */ in e7xxx_init_csrows()
414 dimm->dtype = mem_dev ? DEV_X4 : DEV_X8; in e7xxx_init_csrows()
415 dimm->edac_mode = edac_mode; in e7xxx_init_csrows()
437 * 4 DIMMS per channel, either single-rank or dual-rank. So, the in e7xxx_probe1()
451 return -ENOMEM; in e7xxx_probe1()
454 mci->mtype_cap = MEM_FLAG_RDDR; in e7xxx_probe1()
455 mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED | in e7xxx_probe1()
457 /* FIXME - what if different memory types are in different csrows? */ in e7xxx_probe1()
458 mci->mod_name = EDAC_MOD_STR; in e7xxx_probe1()
459 mci->pdev = &pdev->dev; in e7xxx_probe1()
461 pvt = (struct e7xxx_pvt *)mci->pvt_info; in e7xxx_probe1()
462 pvt->dev_info = &e7xxx_devs[dev_idx]; in e7xxx_probe1()
463 pvt->bridge_ck = pci_get_device(PCI_VENDOR_ID_INTEL, in e7xxx_probe1()
464 pvt->dev_info->err_dev, pvt->bridge_ck); in e7xxx_probe1()
466 if (!pvt->bridge_ck) { in e7xxx_probe1()
474 mci->ctl_name = pvt->dev_info->ctl_name; in e7xxx_probe1()
475 mci->dev_name = pci_name(pdev); in e7xxx_probe1()
476 mci->edac_check = e7xxx_check; in e7xxx_probe1()
477 mci->ctl_page_to_phys = ctl_page_to_phys; in e7xxx_probe1()
479 mci->edac_cap |= EDAC_FLAG_NONE; in e7xxx_probe1()
483 pvt->tolm = ((u32) pci_data) << 4; in e7xxx_probe1()
485 pvt->remapbase = ((u32) pci_data) << 14; in e7xxx_probe1()
487 pvt->remaplimit = ((u32) pci_data) << 14; in e7xxx_probe1()
489 "tolm = %x, remapbase = %x, remaplimit = %x\n", pvt->tolm, in e7xxx_probe1()
490 pvt->remapbase, pvt->remaplimit); in e7xxx_probe1()
504 e7xxx_pci = edac_pci_create_generic_ctl(&pdev->dev, EDAC_MOD_STR); in e7xxx_probe1()
510 "%s(): PCI error report via EDAC not setup\n", in e7xxx_probe1()
519 pci_dev_put(pvt->bridge_ck); in e7xxx_probe1()
524 return -ENODEV; in e7xxx_probe1()
534 -EIO : e7xxx_probe1(pdev, ent->driver_data); in e7xxx_init_one()
547 if ((mci = edac_mc_del_mc(&pdev->dev)) == NULL) in e7xxx_remove_one()
550 pvt = (struct e7xxx_pvt *)mci->pvt_info; in e7xxx_remove_one()
551 pci_dev_put(pvt->bridge_ck); in e7xxx_remove_one()
599 MODULE_AUTHOR("Linux Networx (http://lnxi.com) Thayne Harbaugh et al");
600 MODULE_DESCRIPTION("MC support for Intel e7xxx memory controllers");
602 MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI");