aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/edac
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/edac')
-rw-r--r--drivers/edac/i82875p_edac.c62
1 files changed, 30 insertions, 32 deletions
diff --git a/drivers/edac/i82875p_edac.c b/drivers/edac/i82875p_edac.c
index 485525e4e8e8..889ccf6ad85c 100644
--- a/drivers/edac/i82875p_edac.c
+++ b/drivers/edac/i82875p_edac.c
@@ -174,8 +174,7 @@ struct i82875p_error_info {
174 174
175static const struct i82875p_dev_info i82875p_devs[] = { 175static const struct i82875p_dev_info i82875p_devs[] = {
176 [I82875P] = { 176 [I82875P] = {
177 .ctl_name = "i82875p" 177 .ctl_name = "i82875p"},
178 },
179}; 178};
180 179
181static struct pci_dev *mci_pdev = NULL; /* init dev: in case that AGP code has 180static struct pci_dev *mci_pdev = NULL; /* init dev: in case that AGP code has
@@ -185,7 +184,7 @@ static struct pci_dev *mci_pdev = NULL; /* init dev: in case that AGP code has
185static int i82875p_registered = 1; 184static int i82875p_registered = 1;
186 185
187static void i82875p_get_error_info(struct mem_ctl_info *mci, 186static void i82875p_get_error_info(struct mem_ctl_info *mci,
188 struct i82875p_error_info *info) 187 struct i82875p_error_info *info)
189{ 188{
190 struct pci_dev *pdev; 189 struct pci_dev *pdev;
191 190
@@ -216,13 +215,13 @@ static void i82875p_get_error_info(struct mem_ctl_info *mci,
216 if ((info->errsts ^ info->errsts2) & 0x0081) { 215 if ((info->errsts ^ info->errsts2) & 0x0081) {
217 pci_read_config_dword(pdev, I82875P_EAP, &info->eap); 216 pci_read_config_dword(pdev, I82875P_EAP, &info->eap);
218 pci_read_config_byte(pdev, I82875P_DES, &info->des); 217 pci_read_config_byte(pdev, I82875P_DES, &info->des);
219 pci_read_config_byte(pdev, I82875P_DERRSYN, 218 pci_read_config_byte(pdev, I82875P_DERRSYN, &info->derrsyn);
220 &info->derrsyn);
221 } 219 }
222} 220}
223 221
224static int i82875p_process_error_info(struct mem_ctl_info *mci, 222static int i82875p_process_error_info(struct mem_ctl_info *mci,
225 struct i82875p_error_info *info, int handle_errors) 223 struct i82875p_error_info *info,
224 int handle_errors)
226{ 225{
227 int row, multi_chan; 226 int row, multi_chan;
228 227
@@ -246,8 +245,8 @@ static int i82875p_process_error_info(struct mem_ctl_info *mci,
246 edac_mc_handle_ue(mci, info->eap, 0, row, "i82875p UE"); 245 edac_mc_handle_ue(mci, info->eap, 0, row, "i82875p UE");
247 else 246 else
248 edac_mc_handle_ce(mci, info->eap, 0, info->derrsyn, row, 247 edac_mc_handle_ce(mci, info->eap, 0, info->derrsyn, row,
249 multi_chan ? (info->des & 0x1) : 0, 248 multi_chan ? (info->des & 0x1) : 0,
250 "i82875p CE"); 249 "i82875p CE");
251 250
252 return 1; 251 return 1;
253} 252}
@@ -263,7 +262,8 @@ static void i82875p_check(struct mem_ctl_info *mci)
263 262
264/* Return 0 on success or 1 on failure. */ 263/* Return 0 on success or 1 on failure. */
265static int i82875p_setup_overfl_dev(struct pci_dev *pdev, 264static int i82875p_setup_overfl_dev(struct pci_dev *pdev,
266 struct pci_dev **ovrfl_pdev, void __iomem **ovrfl_window) 265 struct pci_dev **ovrfl_pdev,
266 void __iomem ** ovrfl_window)
267{ 267{
268 struct pci_dev *dev; 268 struct pci_dev *dev;
269 void __iomem *window; 269 void __iomem *window;
@@ -284,7 +284,7 @@ static int i82875p_setup_overfl_dev(struct pci_dev *pdev,
284 if (dev == NULL) 284 if (dev == NULL)
285 return 1; 285 return 1;
286 286
287 pci_bus_add_device(dev); 287 pci_bus_add_device(dev);
288 } 288 }
289 289
290 *ovrfl_pdev = dev; 290 *ovrfl_pdev = dev;
@@ -314,32 +314,31 @@ static int i82875p_setup_overfl_dev(struct pci_dev *pdev,
314 *ovrfl_window = window; 314 *ovrfl_window = window;
315 return 0; 315 return 0;
316 316
317fail1: 317 fail1:
318 pci_release_regions(dev); 318 pci_release_regions(dev);
319 319
320#ifdef CORRECT_BIOS 320#ifdef CORRECT_BIOS
321fail0: 321 fail0:
322 pci_disable_device(dev); 322 pci_disable_device(dev);
323#endif 323#endif
324 /* NOTE: the ovrfl proc entry and pci_dev are intentionally left */ 324 /* NOTE: the ovrfl proc entry and pci_dev are intentionally left */
325 return 1; 325 return 1;
326} 326}
327 327
328
329/* Return 1 if dual channel mode is active. Else return 0. */ 328/* Return 1 if dual channel mode is active. Else return 0. */
330static inline int dual_channel_active(u32 drc) 329static inline int dual_channel_active(u32 drc)
331{ 330{
332 return (drc >> 21) & 0x1; 331 return (drc >> 21) & 0x1;
333} 332}
334 333
335
336static void i82875p_init_csrows(struct mem_ctl_info *mci, 334static void i82875p_init_csrows(struct mem_ctl_info *mci,
337 struct pci_dev *pdev, void __iomem *ovrfl_window, u32 drc) 335 struct pci_dev *pdev,
336 void __iomem * ovrfl_window, u32 drc)
338{ 337{
339 struct csrow_info *csrow; 338 struct csrow_info *csrow;
340 unsigned long last_cumul_size; 339 unsigned long last_cumul_size;
341 u8 value; 340 u8 value;
342 u32 drc_ddim; /* DRAM Data Integrity Mode 0=none,2=edac */ 341 u32 drc_ddim; /* DRAM Data Integrity Mode 0=none,2=edac */
343 u32 cumul_size; 342 u32 cumul_size;
344 int index; 343 int index;
345 344
@@ -392,7 +391,7 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx)
392 drc = readl(ovrfl_window + I82875P_DRC); 391 drc = readl(ovrfl_window + I82875P_DRC);
393 nr_chans = dual_channel_active(drc) + 1; 392 nr_chans = dual_channel_active(drc) + 1;
394 mci = edac_mc_alloc(sizeof(*pvt), I82875P_NR_CSROWS(nr_chans), 393 mci = edac_mc_alloc(sizeof(*pvt), I82875P_NR_CSROWS(nr_chans),
395 nr_chans); 394 nr_chans);
396 395
397 if (!mci) { 396 if (!mci) {
398 rc = -ENOMEM; 397 rc = -ENOMEM;
@@ -411,16 +410,16 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx)
411 mci->edac_check = i82875p_check; 410 mci->edac_check = i82875p_check;
412 mci->ctl_page_to_phys = NULL; 411 mci->ctl_page_to_phys = NULL;
413 debugf3("%s(): init pvt\n", __func__); 412 debugf3("%s(): init pvt\n", __func__);
414 pvt = (struct i82875p_pvt *) mci->pvt_info; 413 pvt = (struct i82875p_pvt *)mci->pvt_info;
415 pvt->ovrfl_pdev = ovrfl_pdev; 414 pvt->ovrfl_pdev = ovrfl_pdev;
416 pvt->ovrfl_window = ovrfl_window; 415 pvt->ovrfl_window = ovrfl_window;
417 i82875p_init_csrows(mci, pdev, ovrfl_window, drc); 416 i82875p_init_csrows(mci, pdev, ovrfl_window, drc);
418 i82875p_get_error_info(mci, &discard); /* clear counters */ 417 i82875p_get_error_info(mci, &discard); /* clear counters */
419 418
420 /* Here we assume that we will never see multiple instances of this 419 /* Here we assume that we will never see multiple instances of this
421 * type of memory controller. The ID is therefore hardcoded to 0. 420 * type of memory controller. The ID is therefore hardcoded to 0.
422 */ 421 */
423 if (edac_mc_add_mc(mci,0)) { 422 if (edac_mc_add_mc(mci, 0)) {
424 debugf3("%s(): failed edac_mc_add_mc()\n", __func__); 423 debugf3("%s(): failed edac_mc_add_mc()\n", __func__);
425 goto fail1; 424 goto fail1;
426 } 425 }
@@ -429,10 +428,10 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx)
429 debugf3("%s(): success\n", __func__); 428 debugf3("%s(): success\n", __func__);
430 return 0; 429 return 0;
431 430
432fail1: 431 fail1:
433 edac_mc_free(mci); 432 edac_mc_free(mci);
434 433
435fail0: 434 fail0:
436 iounmap(ovrfl_window); 435 iounmap(ovrfl_window);
437 pci_release_regions(ovrfl_pdev); 436 pci_release_regions(ovrfl_pdev);
438 437
@@ -443,7 +442,7 @@ fail0:
443 442
444/* returns count (>= 0), or negative on error */ 443/* returns count (>= 0), or negative on error */
445static int __devinit i82875p_init_one(struct pci_dev *pdev, 444static int __devinit i82875p_init_one(struct pci_dev *pdev,
446 const struct pci_device_id *ent) 445 const struct pci_device_id *ent)
447{ 446{
448 int rc; 447 int rc;
449 448
@@ -471,7 +470,7 @@ static void __devexit i82875p_remove_one(struct pci_dev *pdev)
471 if ((mci = edac_mc_del_mc(&pdev->dev)) == NULL) 470 if ((mci = edac_mc_del_mc(&pdev->dev)) == NULL)
472 return; 471 return;
473 472
474 pvt = (struct i82875p_pvt *) mci->pvt_info; 473 pvt = (struct i82875p_pvt *)mci->pvt_info;
475 474
476 if (pvt->ovrfl_window) 475 if (pvt->ovrfl_window)
477 iounmap(pvt->ovrfl_window); 476 iounmap(pvt->ovrfl_window);
@@ -489,12 +488,11 @@ static void __devexit i82875p_remove_one(struct pci_dev *pdev)
489 488
490static const struct pci_device_id i82875p_pci_tbl[] __devinitdata = { 489static const struct pci_device_id i82875p_pci_tbl[] __devinitdata = {
491 { 490 {
492 PCI_VEND_DEV(INTEL, 82875_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0, 491 PCI_VEND_DEV(INTEL, 82875_0), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
493 I82875P 492 I82875P},
494 },
495 { 493 {
496 0, 494 0,
497 } /* 0 terminated list. */ 495 } /* 0 terminated list. */
498}; 496};
499 497
500MODULE_DEVICE_TABLE(pci, i82875p_pci_tbl); 498MODULE_DEVICE_TABLE(pci, i82875p_pci_tbl);
@@ -518,7 +516,7 @@ static int __init i82875p_init(void)
518 516
519 if (mci_pdev == NULL) { 517 if (mci_pdev == NULL) {
520 mci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL, 518 mci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
521 PCI_DEVICE_ID_INTEL_82875_0, NULL); 519 PCI_DEVICE_ID_INTEL_82875_0, NULL);
522 520
523 if (!mci_pdev) { 521 if (!mci_pdev) {
524 debugf0("875p pci_get_device fail\n"); 522 debugf0("875p pci_get_device fail\n");
@@ -537,10 +535,10 @@ static int __init i82875p_init(void)
537 535
538 return 0; 536 return 0;
539 537
540fail1: 538 fail1:
541 pci_unregister_driver(&i82875p_driver); 539 pci_unregister_driver(&i82875p_driver);
542 540
543fail0: 541 fail0:
544 if (mci_pdev != NULL) 542 if (mci_pdev != NULL)
545 pci_dev_put(mci_pdev); 543 pci_dev_put(mci_pdev);
546 544