diff options
Diffstat (limited to 'drivers/edac/e752x_edac.c')
-rw-r--r-- | drivers/edac/e752x_edac.c | 92 |
1 files changed, 46 insertions, 46 deletions
diff --git a/drivers/edac/e752x_edac.c b/drivers/edac/e752x_edac.c index 3186512c9739..a5ed6b795fd4 100644 --- a/drivers/edac/e752x_edac.c +++ b/drivers/edac/e752x_edac.c | |||
@@ -309,7 +309,7 @@ static unsigned long ctl_page_to_phys(struct mem_ctl_info *mci, | |||
309 | u32 remap; | 309 | u32 remap; |
310 | struct e752x_pvt *pvt = (struct e752x_pvt *)mci->pvt_info; | 310 | struct e752x_pvt *pvt = (struct e752x_pvt *)mci->pvt_info; |
311 | 311 | ||
312 | debugf3("%s()\n", __func__); | 312 | edac_dbg(3, "\n"); |
313 | 313 | ||
314 | if (page < pvt->tolm) | 314 | if (page < pvt->tolm) |
315 | return page; | 315 | return page; |
@@ -335,7 +335,7 @@ static void do_process_ce(struct mem_ctl_info *mci, u16 error_one, | |||
335 | int i; | 335 | int i; |
336 | struct e752x_pvt *pvt = (struct e752x_pvt *)mci->pvt_info; | 336 | struct e752x_pvt *pvt = (struct e752x_pvt *)mci->pvt_info; |
337 | 337 | ||
338 | debugf3("%s()\n", __func__); | 338 | edac_dbg(3, "\n"); |
339 | 339 | ||
340 | /* convert the addr to 4k page */ | 340 | /* convert the addr to 4k page */ |
341 | page = sec1_add >> (PAGE_SHIFT - 4); | 341 | page = sec1_add >> (PAGE_SHIFT - 4); |
@@ -371,10 +371,10 @@ static void do_process_ce(struct mem_ctl_info *mci, u16 error_one, | |||
371 | channel = !(error_one & 1); | 371 | channel = !(error_one & 1); |
372 | 372 | ||
373 | /* e752x mc reads 34:6 of the DRAM linear address */ | 373 | /* e752x mc reads 34:6 of the DRAM linear address */ |
374 | edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, | 374 | edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, |
375 | page, offset_in_page(sec1_add << 4), sec1_syndrome, | 375 | page, offset_in_page(sec1_add << 4), sec1_syndrome, |
376 | row, channel, -1, | 376 | row, channel, -1, |
377 | "e752x CE", "", NULL); | 377 | "e752x CE", ""); |
378 | } | 378 | } |
379 | 379 | ||
380 | static inline void process_ce(struct mem_ctl_info *mci, u16 error_one, | 380 | static inline void process_ce(struct mem_ctl_info *mci, u16 error_one, |
@@ -394,7 +394,7 @@ static void do_process_ue(struct mem_ctl_info *mci, u16 error_one, | |||
394 | int row; | 394 | int row; |
395 | struct e752x_pvt *pvt = (struct e752x_pvt *)mci->pvt_info; | 395 | struct e752x_pvt *pvt = (struct e752x_pvt *)mci->pvt_info; |
396 | 396 | ||
397 | debugf3("%s()\n", __func__); | 397 | edac_dbg(3, "\n"); |
398 | 398 | ||
399 | if (error_one & 0x0202) { | 399 | if (error_one & 0x0202) { |
400 | error_2b = ded_add; | 400 | error_2b = ded_add; |
@@ -408,11 +408,11 @@ static void do_process_ue(struct mem_ctl_info *mci, u16 error_one, | |||
408 | edac_mc_find_csrow_by_page(mci, block_page); | 408 | edac_mc_find_csrow_by_page(mci, block_page); |
409 | 409 | ||
410 | /* e752x mc reads 34:6 of the DRAM linear address */ | 410 | /* e752x mc reads 34:6 of the DRAM linear address */ |
411 | edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, | 411 | edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, |
412 | block_page, | 412 | block_page, |
413 | offset_in_page(error_2b << 4), 0, | 413 | offset_in_page(error_2b << 4), 0, |
414 | row, -1, -1, | 414 | row, -1, -1, |
415 | "e752x UE from Read", "", NULL); | 415 | "e752x UE from Read", ""); |
416 | 416 | ||
417 | } | 417 | } |
418 | if (error_one & 0x0404) { | 418 | if (error_one & 0x0404) { |
@@ -427,11 +427,11 @@ static void do_process_ue(struct mem_ctl_info *mci, u16 error_one, | |||
427 | edac_mc_find_csrow_by_page(mci, block_page); | 427 | edac_mc_find_csrow_by_page(mci, block_page); |
428 | 428 | ||
429 | /* e752x mc reads 34:6 of the DRAM linear address */ | 429 | /* e752x mc reads 34:6 of the DRAM linear address */ |
430 | edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, | 430 | edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, |
431 | block_page, | 431 | block_page, |
432 | offset_in_page(error_2b << 4), 0, | 432 | offset_in_page(error_2b << 4), 0, |
433 | row, -1, -1, | 433 | row, -1, -1, |
434 | "e752x UE from Scruber", "", NULL); | 434 | "e752x UE from Scruber", ""); |
435 | } | 435 | } |
436 | } | 436 | } |
437 | 437 | ||
@@ -453,10 +453,10 @@ static inline void process_ue_no_info_wr(struct mem_ctl_info *mci, | |||
453 | if (!handle_error) | 453 | if (!handle_error) |
454 | return; | 454 | return; |
455 | 455 | ||
456 | debugf3("%s()\n", __func__); | 456 | edac_dbg(3, "\n"); |
457 | edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 0, 0, 0, | 457 | edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0, |
458 | -1, -1, -1, | 458 | -1, -1, -1, |
459 | "e752x UE log memory write", "", NULL); | 459 | "e752x UE log memory write", ""); |
460 | } | 460 | } |
461 | 461 | ||
462 | static void do_process_ded_retry(struct mem_ctl_info *mci, u16 error, | 462 | static void do_process_ded_retry(struct mem_ctl_info *mci, u16 error, |
@@ -982,7 +982,7 @@ static void e752x_check(struct mem_ctl_info *mci) | |||
982 | { | 982 | { |
983 | struct e752x_error_info info; | 983 | struct e752x_error_info info; |
984 | 984 | ||
985 | debugf3("%s()\n", __func__); | 985 | edac_dbg(3, "\n"); |
986 | e752x_get_error_info(mci, &info); | 986 | e752x_get_error_info(mci, &info); |
987 | e752x_process_error_info(mci, &info, 1); | 987 | e752x_process_error_info(mci, &info, 1); |
988 | } | 988 | } |
@@ -1069,6 +1069,7 @@ static void e752x_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, | |||
1069 | u16 ddrcsr) | 1069 | u16 ddrcsr) |
1070 | { | 1070 | { |
1071 | struct csrow_info *csrow; | 1071 | struct csrow_info *csrow; |
1072 | enum edac_type edac_mode; | ||
1072 | unsigned long last_cumul_size; | 1073 | unsigned long last_cumul_size; |
1073 | int index, mem_dev, drc_chan; | 1074 | int index, mem_dev, drc_chan; |
1074 | int drc_drbg; /* DRB granularity 0=64mb, 1=128mb */ | 1075 | int drc_drbg; /* DRB granularity 0=64mb, 1=128mb */ |
@@ -1095,14 +1096,13 @@ static void e752x_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, | |||
1095 | for (last_cumul_size = index = 0; index < mci->nr_csrows; index++) { | 1096 | for (last_cumul_size = index = 0; index < mci->nr_csrows; index++) { |
1096 | /* mem_dev 0=x8, 1=x4 */ | 1097 | /* mem_dev 0=x8, 1=x4 */ |
1097 | mem_dev = (dra >> (index * 4 + 2)) & 0x3; | 1098 | mem_dev = (dra >> (index * 4 + 2)) & 0x3; |
1098 | csrow = &mci->csrows[remap_csrow_index(mci, index)]; | 1099 | csrow = mci->csrows[remap_csrow_index(mci, index)]; |
1099 | 1100 | ||
1100 | mem_dev = (mem_dev == 2); | 1101 | mem_dev = (mem_dev == 2); |
1101 | pci_read_config_byte(pdev, E752X_DRB + index, &value); | 1102 | pci_read_config_byte(pdev, E752X_DRB + index, &value); |
1102 | /* convert a 128 or 64 MiB DRB to a page size. */ | 1103 | /* convert a 128 or 64 MiB DRB to a page size. */ |
1103 | cumul_size = value << (25 + drc_drbg - PAGE_SHIFT); | 1104 | cumul_size = value << (25 + drc_drbg - PAGE_SHIFT); |
1104 | debugf3("%s(): (%d) cumul_size 0x%x\n", __func__, index, | 1105 | edac_dbg(3, "(%d) cumul_size 0x%x\n", index, cumul_size); |
1105 | cumul_size); | ||
1106 | if (cumul_size == last_cumul_size) | 1106 | if (cumul_size == last_cumul_size) |
1107 | continue; /* not populated */ | 1107 | continue; /* not populated */ |
1108 | 1108 | ||
@@ -1111,29 +1111,29 @@ static void e752x_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev, | |||
1111 | nr_pages = cumul_size - last_cumul_size; | 1111 | nr_pages = cumul_size - last_cumul_size; |
1112 | last_cumul_size = cumul_size; | 1112 | last_cumul_size = cumul_size; |
1113 | 1113 | ||
1114 | /* | ||
1115 | * if single channel or x8 devices then SECDED | ||
1116 | * if dual channel and x4 then S4ECD4ED | ||
1117 | */ | ||
1118 | if (drc_ddim) { | ||
1119 | if (drc_chan && mem_dev) { | ||
1120 | edac_mode = EDAC_S4ECD4ED; | ||
1121 | mci->edac_cap |= EDAC_FLAG_S4ECD4ED; | ||
1122 | } else { | ||
1123 | edac_mode = EDAC_SECDED; | ||
1124 | mci->edac_cap |= EDAC_FLAG_SECDED; | ||
1125 | } | ||
1126 | } else | ||
1127 | edac_mode = EDAC_NONE; | ||
1114 | for (i = 0; i < csrow->nr_channels; i++) { | 1128 | for (i = 0; i < csrow->nr_channels; i++) { |
1115 | struct dimm_info *dimm = csrow->channels[i].dimm; | 1129 | struct dimm_info *dimm = csrow->channels[i]->dimm; |
1116 | 1130 | ||
1117 | debugf3("Initializing rank at (%i,%i)\n", index, i); | 1131 | edac_dbg(3, "Initializing rank at (%i,%i)\n", index, i); |
1118 | dimm->nr_pages = nr_pages / csrow->nr_channels; | 1132 | dimm->nr_pages = nr_pages / csrow->nr_channels; |
1119 | dimm->grain = 1 << 12; /* 4KiB - resolution of CELOG */ | 1133 | dimm->grain = 1 << 12; /* 4KiB - resolution of CELOG */ |
1120 | dimm->mtype = MEM_RDDR; /* only one type supported */ | 1134 | dimm->mtype = MEM_RDDR; /* only one type supported */ |
1121 | dimm->dtype = mem_dev ? DEV_X4 : DEV_X8; | 1135 | dimm->dtype = mem_dev ? DEV_X4 : DEV_X8; |
1122 | 1136 | dimm->edac_mode = edac_mode; | |
1123 | /* | ||
1124 | * if single channel or x8 devices then SECDED | ||
1125 | * if dual channel and x4 then S4ECD4ED | ||
1126 | */ | ||
1127 | if (drc_ddim) { | ||
1128 | if (drc_chan && mem_dev) { | ||
1129 | dimm->edac_mode = EDAC_S4ECD4ED; | ||
1130 | mci->edac_cap |= EDAC_FLAG_S4ECD4ED; | ||
1131 | } else { | ||
1132 | dimm->edac_mode = EDAC_SECDED; | ||
1133 | mci->edac_cap |= EDAC_FLAG_SECDED; | ||
1134 | } | ||
1135 | } else | ||
1136 | dimm->edac_mode = EDAC_NONE; | ||
1137 | } | 1137 | } |
1138 | } | 1138 | } |
1139 | } | 1139 | } |
@@ -1269,8 +1269,8 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx) | |||
1269 | int drc_chan; /* Number of channels 0=1chan,1=2chan */ | 1269 | int drc_chan; /* Number of channels 0=1chan,1=2chan */ |
1270 | struct e752x_error_info discard; | 1270 | struct e752x_error_info discard; |
1271 | 1271 | ||
1272 | debugf0("%s(): mci\n", __func__); | 1272 | edac_dbg(0, "mci\n"); |
1273 | debugf0("Starting Probe1\n"); | 1273 | edac_dbg(0, "Starting Probe1\n"); |
1274 | 1274 | ||
1275 | /* check to see if device 0 function 1 is enabled; if it isn't, we | 1275 | /* check to see if device 0 function 1 is enabled; if it isn't, we |
1276 | * assume the BIOS has reserved it for a reason and is expecting | 1276 | * assume the BIOS has reserved it for a reason and is expecting |
@@ -1300,7 +1300,7 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx) | |||
1300 | if (mci == NULL) | 1300 | if (mci == NULL) |
1301 | return -ENOMEM; | 1301 | return -ENOMEM; |
1302 | 1302 | ||
1303 | debugf3("%s(): init mci\n", __func__); | 1303 | edac_dbg(3, "init mci\n"); |
1304 | mci->mtype_cap = MEM_FLAG_RDDR; | 1304 | mci->mtype_cap = MEM_FLAG_RDDR; |
1305 | /* 3100 IMCH supports SECDEC only */ | 1305 | /* 3100 IMCH supports SECDEC only */ |
1306 | mci->edac_ctl_cap = (dev_idx == I3100) ? EDAC_FLAG_SECDED : | 1306 | mci->edac_ctl_cap = (dev_idx == I3100) ? EDAC_FLAG_SECDED : |
@@ -1308,9 +1308,9 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx) | |||
1308 | /* FIXME - what if different memory types are in different csrows? */ | 1308 | /* FIXME - what if different memory types are in different csrows? */ |
1309 | mci->mod_name = EDAC_MOD_STR; | 1309 | mci->mod_name = EDAC_MOD_STR; |
1310 | mci->mod_ver = E752X_REVISION; | 1310 | mci->mod_ver = E752X_REVISION; |
1311 | mci->dev = &pdev->dev; | 1311 | mci->pdev = &pdev->dev; |
1312 | 1312 | ||
1313 | debugf3("%s(): init pvt\n", __func__); | 1313 | edac_dbg(3, "init pvt\n"); |
1314 | pvt = (struct e752x_pvt *)mci->pvt_info; | 1314 | pvt = (struct e752x_pvt *)mci->pvt_info; |
1315 | pvt->dev_info = &e752x_devs[dev_idx]; | 1315 | pvt->dev_info = &e752x_devs[dev_idx]; |
1316 | pvt->mc_symmetric = ((ddrcsr & 0x10) != 0); | 1316 | pvt->mc_symmetric = ((ddrcsr & 0x10) != 0); |
@@ -1320,7 +1320,7 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx) | |||
1320 | return -ENODEV; | 1320 | return -ENODEV; |
1321 | } | 1321 | } |
1322 | 1322 | ||
1323 | debugf3("%s(): more mci init\n", __func__); | 1323 | edac_dbg(3, "more mci init\n"); |
1324 | mci->ctl_name = pvt->dev_info->ctl_name; | 1324 | mci->ctl_name = pvt->dev_info->ctl_name; |
1325 | mci->dev_name = pci_name(pdev); | 1325 | mci->dev_name = pci_name(pdev); |
1326 | mci->edac_check = e752x_check; | 1326 | mci->edac_check = e752x_check; |
@@ -1342,7 +1342,7 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx) | |||
1342 | mci->edac_cap = EDAC_FLAG_SECDED; /* the only mode supported */ | 1342 | mci->edac_cap = EDAC_FLAG_SECDED; /* the only mode supported */ |
1343 | else | 1343 | else |
1344 | mci->edac_cap |= EDAC_FLAG_NONE; | 1344 | mci->edac_cap |= EDAC_FLAG_NONE; |
1345 | debugf3("%s(): tolm, remapbase, remaplimit\n", __func__); | 1345 | edac_dbg(3, "tolm, remapbase, remaplimit\n"); |
1346 | 1346 | ||
1347 | /* load the top of low memory, remap base, and remap limit vars */ | 1347 | /* load the top of low memory, remap base, and remap limit vars */ |
1348 | pci_read_config_word(pdev, E752X_TOLM, &pci_data); | 1348 | pci_read_config_word(pdev, E752X_TOLM, &pci_data); |
@@ -1359,7 +1359,7 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx) | |||
1359 | * type of memory controller. The ID is therefore hardcoded to 0. | 1359 | * type of memory controller. The ID is therefore hardcoded to 0. |
1360 | */ | 1360 | */ |
1361 | if (edac_mc_add_mc(mci)) { | 1361 | if (edac_mc_add_mc(mci)) { |
1362 | debugf3("%s(): failed edac_mc_add_mc()\n", __func__); | 1362 | edac_dbg(3, "failed edac_mc_add_mc()\n"); |
1363 | goto fail; | 1363 | goto fail; |
1364 | } | 1364 | } |
1365 | 1365 | ||
@@ -1377,7 +1377,7 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx) | |||
1377 | } | 1377 | } |
1378 | 1378 | ||
1379 | /* get this far and it's successful */ | 1379 | /* get this far and it's successful */ |
1380 | debugf3("%s(): success\n", __func__); | 1380 | edac_dbg(3, "success\n"); |
1381 | return 0; | 1381 | return 0; |
1382 | 1382 | ||
1383 | fail: | 1383 | fail: |
@@ -1393,7 +1393,7 @@ fail: | |||
1393 | static int __devinit e752x_init_one(struct pci_dev *pdev, | 1393 | static int __devinit e752x_init_one(struct pci_dev *pdev, |
1394 | const struct pci_device_id *ent) | 1394 | const struct pci_device_id *ent) |
1395 | { | 1395 | { |
1396 | debugf0("%s()\n", __func__); | 1396 | edac_dbg(0, "\n"); |
1397 | 1397 | ||
1398 | /* wake up and enable device */ | 1398 | /* wake up and enable device */ |
1399 | if (pci_enable_device(pdev) < 0) | 1399 | if (pci_enable_device(pdev) < 0) |
@@ -1407,7 +1407,7 @@ static void __devexit e752x_remove_one(struct pci_dev *pdev) | |||
1407 | struct mem_ctl_info *mci; | 1407 | struct mem_ctl_info *mci; |
1408 | struct e752x_pvt *pvt; | 1408 | struct e752x_pvt *pvt; |
1409 | 1409 | ||
1410 | debugf0("%s()\n", __func__); | 1410 | edac_dbg(0, "\n"); |
1411 | 1411 | ||
1412 | if (e752x_pci) | 1412 | if (e752x_pci) |
1413 | edac_pci_release_generic_ctl(e752x_pci); | 1413 | edac_pci_release_generic_ctl(e752x_pci); |
@@ -1453,7 +1453,7 @@ static int __init e752x_init(void) | |||
1453 | { | 1453 | { |
1454 | int pci_rc; | 1454 | int pci_rc; |
1455 | 1455 | ||
1456 | debugf3("%s()\n", __func__); | 1456 | edac_dbg(3, "\n"); |
1457 | 1457 | ||
1458 | /* Ensure that the OPSTATE is set correctly for POLL or NMI */ | 1458 | /* Ensure that the OPSTATE is set correctly for POLL or NMI */ |
1459 | opstate_init(); | 1459 | opstate_init(); |
@@ -1464,7 +1464,7 @@ static int __init e752x_init(void) | |||
1464 | 1464 | ||
1465 | static void __exit e752x_exit(void) | 1465 | static void __exit e752x_exit(void) |
1466 | { | 1466 | { |
1467 | debugf3("%s()\n", __func__); | 1467 | edac_dbg(3, "\n"); |
1468 | pci_unregister_driver(&e752x_driver); | 1468 | pci_unregister_driver(&e752x_driver); |
1469 | } | 1469 | } |
1470 | 1470 | ||