diff options
Diffstat (limited to 'drivers/edac')
-rw-r--r-- | drivers/edac/i7300_edac.c | 19 | ||||
-rw-r--r-- | drivers/edac/sb_edac.c | 53 |
2 files changed, 44 insertions, 28 deletions
diff --git a/drivers/edac/i7300_edac.c b/drivers/edac/i7300_edac.c index 087c27bc5d42..9004c64b169e 100644 --- a/drivers/edac/i7300_edac.c +++ b/drivers/edac/i7300_edac.c | |||
@@ -750,15 +750,23 @@ static int i7300_init_csrows(struct mem_ctl_info *mci) | |||
750 | struct i7300_dimm_info *dinfo; | 750 | struct i7300_dimm_info *dinfo; |
751 | int rc = -ENODEV; | 751 | int rc = -ENODEV; |
752 | int mtr; | 752 | int mtr; |
753 | int ch, branch, slot, channel; | 753 | int ch, branch, slot, channel, max_channel, max_branch; |
754 | struct dimm_info *dimm; | 754 | struct dimm_info *dimm; |
755 | 755 | ||
756 | pvt = mci->pvt_info; | 756 | pvt = mci->pvt_info; |
757 | 757 | ||
758 | edac_dbg(2, "Memory Technology Registers:\n"); | 758 | edac_dbg(2, "Memory Technology Registers:\n"); |
759 | 759 | ||
760 | if (IS_SINGLE_MODE(pvt->mc_settings_a)) { | ||
761 | max_branch = 1; | ||
762 | max_channel = 1; | ||
763 | } else { | ||
764 | max_branch = MAX_BRANCHES; | ||
765 | max_channel = MAX_CH_PER_BRANCH; | ||
766 | } | ||
767 | |||
760 | /* Get the AMB present registers for the four channels */ | 768 | /* Get the AMB present registers for the four channels */ |
761 | for (branch = 0; branch < MAX_BRANCHES; branch++) { | 769 | for (branch = 0; branch < max_branch; branch++) { |
762 | /* Read and dump branch 0's MTRs */ | 770 | /* Read and dump branch 0's MTRs */ |
763 | channel = to_channel(0, branch); | 771 | channel = to_channel(0, branch); |
764 | pci_read_config_word(pvt->pci_dev_2x_0_fbd_branch[branch], | 772 | pci_read_config_word(pvt->pci_dev_2x_0_fbd_branch[branch], |
@@ -767,6 +775,9 @@ static int i7300_init_csrows(struct mem_ctl_info *mci) | |||
767 | edac_dbg(2, "\t\tAMB-present CH%d = 0x%x:\n", | 775 | edac_dbg(2, "\t\tAMB-present CH%d = 0x%x:\n", |
768 | channel, pvt->ambpresent[channel]); | 776 | channel, pvt->ambpresent[channel]); |
769 | 777 | ||
778 | if (max_channel == 1) | ||
779 | continue; | ||
780 | |||
770 | channel = to_channel(1, branch); | 781 | channel = to_channel(1, branch); |
771 | pci_read_config_word(pvt->pci_dev_2x_0_fbd_branch[branch], | 782 | pci_read_config_word(pvt->pci_dev_2x_0_fbd_branch[branch], |
772 | AMBPRESENT_1, | 783 | AMBPRESENT_1, |
@@ -778,11 +789,11 @@ static int i7300_init_csrows(struct mem_ctl_info *mci) | |||
778 | /* Get the set of MTR[0-7] regs by each branch */ | 789 | /* Get the set of MTR[0-7] regs by each branch */ |
779 | for (slot = 0; slot < MAX_SLOTS; slot++) { | 790 | for (slot = 0; slot < MAX_SLOTS; slot++) { |
780 | int where = mtr_regs[slot]; | 791 | int where = mtr_regs[slot]; |
781 | for (branch = 0; branch < MAX_BRANCHES; branch++) { | 792 | for (branch = 0; branch < max_branch; branch++) { |
782 | pci_read_config_word(pvt->pci_dev_2x_0_fbd_branch[branch], | 793 | pci_read_config_word(pvt->pci_dev_2x_0_fbd_branch[branch], |
783 | where, | 794 | where, |
784 | &pvt->mtr[slot][branch]); | 795 | &pvt->mtr[slot][branch]); |
785 | for (ch = 0; ch < MAX_CH_PER_BRANCH; ch++) { | 796 | for (ch = 0; ch < max_channel; ch++) { |
786 | int channel = to_channel(ch, branch); | 797 | int channel = to_channel(ch, branch); |
787 | 798 | ||
788 | dimm = EDAC_DIMM_PTR(mci->layers, mci->dimms, | 799 | dimm = EDAC_DIMM_PTR(mci->layers, mci->dimms, |
diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c index 57244f995614..e04462b60756 100644 --- a/drivers/edac/sb_edac.c +++ b/drivers/edac/sb_edac.c | |||
@@ -331,30 +331,31 @@ struct sbridge_pvt { | |||
331 | u64 tolm, tohm; | 331 | u64 tolm, tohm; |
332 | }; | 332 | }; |
333 | 333 | ||
334 | #define PCI_DESCR(device, function, device_id) \ | 334 | #define PCI_DESCR(device, function, device_id, opt) \ |
335 | .dev = (device), \ | 335 | .dev = (device), \ |
336 | .func = (function), \ | 336 | .func = (function), \ |
337 | .dev_id = (device_id) | 337 | .dev_id = (device_id), \ |
338 | .optional = opt | ||
338 | 339 | ||
339 | static const struct pci_id_descr pci_dev_descr_sbridge[] = { | 340 | static const struct pci_id_descr pci_dev_descr_sbridge[] = { |
340 | /* Processor Home Agent */ | 341 | /* Processor Home Agent */ |
341 | { PCI_DESCR(14, 0, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_HA0) }, | 342 | { PCI_DESCR(14, 0, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_HA0, 0) }, |
342 | 343 | ||
343 | /* Memory controller */ | 344 | /* Memory controller */ |
344 | { PCI_DESCR(15, 0, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TA) }, | 345 | { PCI_DESCR(15, 0, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TA, 0) }, |
345 | { PCI_DESCR(15, 1, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_RAS) }, | 346 | { PCI_DESCR(15, 1, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_RAS, 0) }, |
346 | { PCI_DESCR(15, 2, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD0) }, | 347 | { PCI_DESCR(15, 2, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD0, 0) }, |
347 | { PCI_DESCR(15, 3, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD1) }, | 348 | { PCI_DESCR(15, 3, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD1, 0) }, |
348 | { PCI_DESCR(15, 4, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD2) }, | 349 | { PCI_DESCR(15, 4, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD2, 0) }, |
349 | { PCI_DESCR(15, 5, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD3) }, | 350 | { PCI_DESCR(15, 5, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD3, 0) }, |
350 | { PCI_DESCR(17, 0, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_DDRIO) }, | 351 | { PCI_DESCR(17, 0, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_DDRIO, 1) }, |
351 | 352 | ||
352 | /* System Address Decoder */ | 353 | /* System Address Decoder */ |
353 | { PCI_DESCR(12, 6, PCI_DEVICE_ID_INTEL_SBRIDGE_SAD0) }, | 354 | { PCI_DESCR(12, 6, PCI_DEVICE_ID_INTEL_SBRIDGE_SAD0, 0) }, |
354 | { PCI_DESCR(12, 7, PCI_DEVICE_ID_INTEL_SBRIDGE_SAD1) }, | 355 | { PCI_DESCR(12, 7, PCI_DEVICE_ID_INTEL_SBRIDGE_SAD1, 0) }, |
355 | 356 | ||
356 | /* Broadcast Registers */ | 357 | /* Broadcast Registers */ |
357 | { PCI_DESCR(13, 6, PCI_DEVICE_ID_INTEL_SBRIDGE_BR) }, | 358 | { PCI_DESCR(13, 6, PCI_DEVICE_ID_INTEL_SBRIDGE_BR, 0) }, |
358 | }; | 359 | }; |
359 | 360 | ||
360 | #define PCI_ID_TABLE_ENTRY(A) { .descr=A, .n_devs = ARRAY_SIZE(A) } | 361 | #define PCI_ID_TABLE_ENTRY(A) { .descr=A, .n_devs = ARRAY_SIZE(A) } |
@@ -556,14 +557,19 @@ static int get_dimm_config(struct mem_ctl_info *mci) | |||
556 | pvt->is_close_pg = false; | 557 | pvt->is_close_pg = false; |
557 | } | 558 | } |
558 | 559 | ||
559 | pci_read_config_dword(pvt->pci_ddrio, RANK_CFG_A, ®); | 560 | if (pvt->pci_ddrio) { |
560 | if (IS_RDIMM_ENABLED(reg)) { | 561 | pci_read_config_dword(pvt->pci_ddrio, RANK_CFG_A, ®); |
561 | /* FIXME: Can also be LRDIMM */ | 562 | if (IS_RDIMM_ENABLED(reg)) { |
562 | edac_dbg(0, "Memory is registered\n"); | 563 | /* FIXME: Can also be LRDIMM */ |
563 | mtype = MEM_RDDR3; | 564 | edac_dbg(0, "Memory is registered\n"); |
565 | mtype = MEM_RDDR3; | ||
566 | } else { | ||
567 | edac_dbg(0, "Memory is unregistered\n"); | ||
568 | mtype = MEM_DDR3; | ||
569 | } | ||
564 | } else { | 570 | } else { |
565 | edac_dbg(0, "Memory is unregistered\n"); | 571 | edac_dbg(0, "Cannot determine memory type\n"); |
566 | mtype = MEM_DDR3; | 572 | mtype = MEM_UNKNOWN; |
567 | } | 573 | } |
568 | 574 | ||
569 | /* On all supported DDR3 DIMM types, there are 8 banks available */ | 575 | /* On all supported DDR3 DIMM types, there are 8 banks available */ |
@@ -1303,8 +1309,7 @@ static int mci_bind_devs(struct mem_ctl_info *mci, | |||
1303 | 1309 | ||
1304 | /* Check if everything were registered */ | 1310 | /* Check if everything were registered */ |
1305 | if (!pvt->pci_sad0 || !pvt->pci_sad1 || !pvt->pci_ha0 || | 1311 | if (!pvt->pci_sad0 || !pvt->pci_sad1 || !pvt->pci_ha0 || |
1306 | !pvt-> pci_tad || !pvt->pci_ras || !pvt->pci_ta || | 1312 | !pvt-> pci_tad || !pvt->pci_ras || !pvt->pci_ta) |
1307 | !pvt->pci_ddrio) | ||
1308 | goto enodev; | 1313 | goto enodev; |
1309 | 1314 | ||
1310 | for (i = 0; i < NUM_CHANNELS; i++) { | 1315 | for (i = 0; i < NUM_CHANNELS; i++) { |