History

Merge tag 'edac/v4.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-edac

Pull edac updates from Mauro Carvalho Chehab: "Two EDAC fixes for Intel systems (Haswell and Ivy Bridge)" * tag 'edac/v4.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-edac: sb_edac: correctly fetch DIMM width on Ivy Bridge and Haswell sb_edac: look harder for DDRIO on Haswell systems

Linus Torvalds committed 11 years ago

Commit d9b44fe2 parents 9ebd051 12f07211 file · +60 −12Browse files

Unified · Split

drivers/edac/sb_edac.c+60−12
@@ -280,6 +280,7 @@ struct sbridge_info { · 279 unmodified lines
280280 u8 max_interleave;
281281 u8 (*get_node_id)(struct sbridge_pvt *pvt);
282282 enum mem_type (*get_memory_type)(struct sbridge_pvt *pvt);
283+ enum dev_type (*get_width)(struct sbridge_pvt *pvt, u32 mtr);
283284 struct pci_dev *pci_vtd;
284285 };
285286
@@ -471,6 +472,9 @@ static const struct pci_id_table pci_dev_descr_ibridge_table[] = { · 185 unmodified lines
471472 #define PCI_DEVICE_ID_INTEL_HASWELL_IMC_HA1_TAD2 0x2f6c
472473 #define PCI_DEVICE_ID_INTEL_HASWELL_IMC_HA1_TAD3 0x2f6d
473474 #define PCI_DEVICE_ID_INTEL_HASWELL_IMC_DDRIO0 0x2fbd
475+#define PCI_DEVICE_ID_INTEL_HASWELL_IMC_DDRIO1 0x2fbf
476+#define PCI_DEVICE_ID_INTEL_HASWELL_IMC_DDRIO2 0x2fb9
477+#define PCI_DEVICE_ID_INTEL_HASWELL_IMC_DDRIO3 0x2fbb
474478 static const struct pci_id_descr pci_dev_descr_haswell[] = {
475479 /* first item must be the HA */
476480 { PCI_DESCR(PCI_DEVICE_ID_INTEL_HASWELL_IMC_HA0, 0) },
@@ -488,6 +492,9 @@ static const struct pci_id_descr pci_dev_descr_haswell[] = { · 11 unmodified lines
488492 { PCI_DESCR(PCI_DEVICE_ID_INTEL_HASWELL_IMC_HA0_TAD3, 1) },
489493
490494 { PCI_DESCR(PCI_DEVICE_ID_INTEL_HASWELL_IMC_DDRIO0, 1) },
495+ { PCI_DESCR(PCI_DEVICE_ID_INTEL_HASWELL_IMC_DDRIO1, 1) },
496+ { PCI_DESCR(PCI_DEVICE_ID_INTEL_HASWELL_IMC_DDRIO2, 1) },
497+ { PCI_DESCR(PCI_DEVICE_ID_INTEL_HASWELL_IMC_DDRIO3, 1) },
491498
492499 { PCI_DESCR(PCI_DEVICE_ID_INTEL_HASWELL_IMC_HA1_TA, 1) },
493500 { PCI_DESCR(PCI_DEVICE_ID_INTEL_HASWELL_IMC_HA1_THERMAL, 1) },
@@ -762,6 +769,49 @@ out: · 268 unmodified lines
762769 return mtype;
763770 }
764771
772+static enum dev_type sbridge_get_width(struct sbridge_pvt *pvt, u32 mtr)
773+{
774+ /* there's no way to figure out */
775+ return DEV_UNKNOWN;
776+}
777+
778+static enum dev_type __ibridge_get_width(u32 mtr)
779+{
780+ enum dev_type type;
781+
782+ switch (mtr) {
783+ case 3:
784+ type = DEV_UNKNOWN;
785+ break;
786+ case 2:
787+ type = DEV_X16;
788+ break;
789+ case 1:
790+ type = DEV_X8;
791+ break;
792+ case 0:
793+ type = DEV_X4;
794+ break;
795+ }
796+
797+ return type;
798+}
799+
800+static enum dev_type ibridge_get_width(struct sbridge_pvt *pvt, u32 mtr)
801+{
802+ /*
803+ * ddr3_width on the documentation but also valid for DDR4 on
804+ * Haswell
805+ */
806+ return __ibridge_get_width(GET_BITFIELD(mtr, 7, 8));
807+}
808+
809+static enum dev_type broadwell_get_width(struct sbridge_pvt *pvt, u32 mtr)
810+{
811+ /* ddr3_width on the documentation but also valid for DDR4 */
812+ return __ibridge_get_width(GET_BITFIELD(mtr, 8, 9));
813+}
814+
765815 static u8 get_node_id(struct sbridge_pvt *pvt)
766816 {
767817 u32 reg;
@@ -966,17 +1016,7 @@ static int get_dimm_config(struct mem_ctl_info *mci) · 198 unmodified lines
9661016
9671017 dimm->nr_pages = npages;
9681018 dimm->grain = 32;
969− switch (banks) {
970− case 16:
971− dimm->dtype = DEV_X16;
972− break;
973− case 8:
974− dimm->dtype = DEV_X8;
975− break;
976− case 4:
977− dimm->dtype = DEV_X4;
978− break;
979− }
1019+ dimm->dtype = pvt->info.get_width(pvt, mtr);
9801020 dimm->mtype = mtype;
9811021 dimm->edac_mode = mode;
9821022 snprintf(dimm->label, sizeof(dimm->label),
@@ -1869,7 +1909,11 @@ static int haswell_mci_bind_devs(struct mem_ctl_info *mci, · 886 unmodified lines
18691909 }
18701910 break;
18711911 case PCI_DEVICE_ID_INTEL_HASWELL_IMC_DDRIO0:
1872− pvt->pci_ddrio = pdev;
1912+ case PCI_DEVICE_ID_INTEL_HASWELL_IMC_DDRIO1:
1913+ case PCI_DEVICE_ID_INTEL_HASWELL_IMC_DDRIO2:
1914+ case PCI_DEVICE_ID_INTEL_HASWELL_IMC_DDRIO3:
1915+ if (!pvt->pci_ddrio)
1916+ pvt->pci_ddrio = pdev;
18731917 break;
18741918 case PCI_DEVICE_ID_INTEL_HASWELL_IMC_HA1:
18751919 pvt->pci_ha1 = pdev;
@@ -2361,6 +2405,7 @@ static int sbridge_register_mci(struct sbridge_dev *sbridge_dev, enum type type) · 485 unmodified lines
23612405 pvt->info.interleave_list = ibridge_interleave_list;
23622406 pvt->info.max_interleave = ARRAY_SIZE(ibridge_interleave_list);
23632407 pvt->info.interleave_pkg = ibridge_interleave_pkg;
2408+ pvt->info.get_width = ibridge_get_width;
23642409 mci->ctl_name = kasprintf(GFP_KERNEL, "Ivy Bridge Socket#%d", mci->mc_idx);
23652410
23662411 /* Store pci devices at mci for faster access */
@@ -2380,6 +2425,7 @@ static int sbridge_register_mci(struct sbridge_dev *sbridge_dev, enum type type) · 13 unmodified lines
23802425 pvt->info.interleave_list = sbridge_interleave_list;
23812426 pvt->info.max_interleave = ARRAY_SIZE(sbridge_interleave_list);
23822427 pvt->info.interleave_pkg = sbridge_interleave_pkg;
2428+ pvt->info.get_width = sbridge_get_width;
23832429 mci->ctl_name = kasprintf(GFP_KERNEL, "Sandy Bridge Socket#%d", mci->mc_idx);
23842430
23852431 /* Store pci devices at mci for faster access */
@@ -2399,6 +2445,7 @@ static int sbridge_register_mci(struct sbridge_dev *sbridge_dev, enum type type) · 13 unmodified lines
23992445 pvt->info.interleave_list = ibridge_interleave_list;
24002446 pvt->info.max_interleave = ARRAY_SIZE(ibridge_interleave_list);
24012447 pvt->info.interleave_pkg = ibridge_interleave_pkg;
2448+ pvt->info.get_width = ibridge_get_width;
24022449 mci->ctl_name = kasprintf(GFP_KERNEL, "Haswell Socket#%d", mci->mc_idx);
24032450
24042451 /* Store pci devices at mci for faster access */
@@ -2418,6 +2465,7 @@ static int sbridge_register_mci(struct sbridge_dev *sbridge_dev, enum type type) · 13 unmodified lines
24182465 pvt->info.interleave_list = ibridge_interleave_list;
24192466 pvt->info.max_interleave = ARRAY_SIZE(ibridge_interleave_list);
24202467 pvt->info.interleave_pkg = ibridge_interleave_pkg;
2468+ pvt->info.get_width = broadwell_get_width;
24212469 mci->ctl_name = kasprintf(GFP_KERNEL, "Broadwell Socket#%d", mci->mc_idx);
24222470
24232471 /* Store pci devices at mci for faster access */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t