Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+44 -28
+15 -4
drivers/edac/i7300_edac.c
··· 750 750 struct i7300_dimm_info *dinfo; 751 751 int rc = -ENODEV; 752 752 int mtr; 753 - int ch, branch, slot, channel; 753 + int ch, branch, slot, channel, max_channel, max_branch; 754 754 struct dimm_info *dimm; 755 755 756 756 pvt = mci->pvt_info; 757 757 758 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 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 770 /* Read and dump branch 0's MTRs */ 763 771 channel = to_channel(0, branch); 764 772 pci_read_config_word(pvt->pci_dev_2x_0_fbd_branch[branch], ··· 774 766 &pvt->ambpresent[channel]); 775 767 edac_dbg(2, "\t\tAMB-present CH%d = 0x%x:\n", 776 768 channel, pvt->ambpresent[channel]); 769 + 770 + if (max_channel == 1) 771 + continue; 777 772 778 773 channel = to_channel(1, branch); 779 774 pci_read_config_word(pvt->pci_dev_2x_0_fbd_branch[branch], ··· 789 778 /* Get the set of MTR[0-7] regs by each branch */ 790 779 for (slot = 0; slot < MAX_SLOTS; slot++) { 791 780 int where = mtr_regs[slot]; 792 - for (branch = 0; branch < MAX_BRANCHES; branch++) { 781 + for (branch = 0; branch < max_branch; branch++) { 793 782 pci_read_config_word(pvt->pci_dev_2x_0_fbd_branch[branch], 794 783 where, 795 784 &pvt->mtr[slot][branch]); 796 - for (ch = 0; ch < MAX_CH_PER_BRANCH; ch++) { 785 + for (ch = 0; ch < max_channel; ch++) { 797 786 int channel = to_channel(ch, branch); 798 787 799 788 dimm = EDAC_DIMM_PTR(mci->layers, mci->dimms,
+29 -24
drivers/edac/sb_edac.c
··· 331 331 u64 tolm, tohm; 332 332 }; 333 333 334 - #define PCI_DESCR(device, function, device_id) \ 335 - .dev = (device), \ 336 - .func = (function), \ 337 - .dev_id = (device_id) 334 + #define PCI_DESCR(device, function, device_id, opt) \ 335 + .dev = (device), \ 336 + .func = (function), \ 337 + .dev_id = (device_id), \ 338 + .optional = opt 338 339 339 340 static const struct pci_id_descr pci_dev_descr_sbridge[] = { 340 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 344 /* Memory controller */ 344 - { PCI_DESCR(15, 0, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TA) }, 345 - { PCI_DESCR(15, 1, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_RAS) }, 346 - { PCI_DESCR(15, 2, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD0) }, 347 - { PCI_DESCR(15, 3, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD1) }, 348 - { PCI_DESCR(15, 4, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD2) }, 349 - { PCI_DESCR(15, 5, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD3) }, 350 - { PCI_DESCR(17, 0, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_DDRIO) }, 345 + { PCI_DESCR(15, 0, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TA, 0) }, 346 + { PCI_DESCR(15, 1, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_RAS, 0) }, 347 + { PCI_DESCR(15, 2, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD0, 0) }, 348 + { PCI_DESCR(15, 3, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD1, 0) }, 349 + { PCI_DESCR(15, 4, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD2, 0) }, 350 + { PCI_DESCR(15, 5, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD3, 0) }, 351 + { PCI_DESCR(17, 0, PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_DDRIO, 1) }, 351 352 352 353 /* System Address Decoder */ 353 - { PCI_DESCR(12, 6, PCI_DEVICE_ID_INTEL_SBRIDGE_SAD0) }, 354 - { PCI_DESCR(12, 7, PCI_DEVICE_ID_INTEL_SBRIDGE_SAD1) }, 354 + { PCI_DESCR(12, 6, PCI_DEVICE_ID_INTEL_SBRIDGE_SAD0, 0) }, 355 + { PCI_DESCR(12, 7, PCI_DEVICE_ID_INTEL_SBRIDGE_SAD1, 0) }, 355 356 356 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 361 #define PCI_ID_TABLE_ENTRY(A) { .descr=A, .n_devs = ARRAY_SIZE(A) } ··· 557 556 pvt->is_close_pg = false; 558 557 } 559 558 560 - pci_read_config_dword(pvt->pci_ddrio, RANK_CFG_A, &reg); 561 - if (IS_RDIMM_ENABLED(reg)) { 562 - /* FIXME: Can also be LRDIMM */ 563 - edac_dbg(0, "Memory is registered\n"); 564 - mtype = MEM_RDDR3; 559 + if (pvt->pci_ddrio) { 560 + pci_read_config_dword(pvt->pci_ddrio, RANK_CFG_A, &reg); 561 + if (IS_RDIMM_ENABLED(reg)) { 562 + /* FIXME: Can also be LRDIMM */ 563 + edac_dbg(0, "Memory is registered\n"); 564 + mtype = MEM_RDDR3; 565 + } else { 566 + edac_dbg(0, "Memory is unregistered\n"); 567 + mtype = MEM_DDR3; 568 + } 565 569 } else { 566 - edac_dbg(0, "Memory is unregistered\n"); 567 - mtype = MEM_DDR3; 570 + edac_dbg(0, "Cannot determine memory type\n"); 571 + mtype = MEM_UNKNOWN; 568 572 } 569 573 570 574 /* On all supported DDR3 DIMM types, there are 8 banks available */ ··· 1309 1303 1310 1304 /* Check if everything were registered */ 1311 1305 if (!pvt->pci_sad0 || !pvt->pci_sad1 || !pvt->pci_ha0 || 1312 - !pvt-> pci_tad || !pvt->pci_ras || !pvt->pci_ta || 1313 - !pvt->pci_ddrio) 1306 + !pvt-> pci_tad || !pvt->pci_ras || !pvt->pci_ta) 1314 1307 goto enodev; 1315 1308 1316 1309 for (i = 0; i < NUM_CHANNELS; i++) {