aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/edac
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-04-30 13:00:49 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-04-30 13:00:49 -0400
commite2823299cdc140cccd40484d690ab1d90d75b099 (patch)
treea93a1a277619df4b2dc9e4e0b26752864463d240 /drivers/edac
parent240c3c3424366c8109babd2a0fe80855de511b35 (diff)
parentde4772c621487fd4cadb4138f2481297c8e0cb0d (diff)
Merge branch 'linux_next' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-edac
Pull edac fixes from Mauro Carvalho Chehab: "Two edac fixes: - i7300_edac currently reports a wrong number of DIMMs when the memory controller is in single channel mode - on some Sandy Bridge machines, the EDAC driver bails out as one of the PCI IDs used by the driver is hidden by BIOS. As the driver uses it only to detect the type of memory, make it optional at the driver" * 'linux_next' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-edac: edac: sb_edac.c should not require prescence of IMC_DDRIO device i7300_edac: Fix memory detection in single mode
Diffstat (limited to 'drivers/edac')
-rw-r--r--drivers/edac/i7300_edac.c19
-rw-r--r--drivers/edac/sb_edac.c53
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
339static const struct pci_id_descr pci_dev_descr_sbridge[] = { 340static 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, &reg); 560 if (pvt->pci_ddrio) {
560 if (IS_RDIMM_ENABLED(reg)) { 561 pci_read_config_dword(pvt->pci_ddrio, RANK_CFG_A, &reg);
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++) {