Skip to content

Commit 8de9930

Browse files
committed
Revert "EDAC/amd64: Support more than two controllers for chip select handling"
This reverts commit 0a227af. Unfortunately, this commit caused wrong detection of chip select sizes on some F17h client machines: --- 00-rc6+ 2019-02-14 14:28:03.126622904 +0100 +++ 01-rc4+ 2019-04-14 21:06:16.060614790 +0200 EDAC amd64: MC: 0: 0MB 1: 0MB -EDAC amd64: MC: 2: 16383MB 3: 16383MB +EDAC amd64: MC: 2: 0MB 3: 2097151MB EDAC amd64: MC: 4: 0MB 5: 0MB EDAC amd64: MC: 6: 0MB 7: 0MB EDAC MC: UMC1 chip selects: EDAC amd64: MC: 0: 0MB 1: 0MB -EDAC amd64: MC: 2: 16383MB 3: 16383MB +EDAC amd64: MC: 2: 0MB 3: 2097151MB EDAC amd64: MC: 4: 0MB 5: 0MB EDAC amd64: MC: 6: 0MB 7: 0M Revert it for now until it has been solved properly. Signed-off-by: Borislav Petkov <[email protected]> Cc: Yazen Ghannam <[email protected]>
1 parent 74676a8 commit 8de9930

File tree

2 files changed

+56
-62
lines changed

2 files changed

+56
-62
lines changed

drivers/edac/amd64_edac.c

Lines changed: 54 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -941,94 +941,89 @@ static void prep_chip_selects(struct amd64_pvt *pvt)
941941
} else if (pvt->fam == 0x15 && pvt->model == 0x30) {
942942
pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 4;
943943
pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 2;
944-
} else if (pvt->fam >= 0x17) {
945-
int umc;
946-
947-
for_each_umc(umc) {
948-
pvt->csels[umc].b_cnt = 8;
949-
pvt->csels[umc].m_cnt = 4;
950-
}
951-
952944
} else {
953945
pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8;
954946
pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 4;
955947
}
956948
}
957949

958-
static void read_umc_base_mask(struct amd64_pvt *pvt)
959-
{
960-
int cs, umc;
961-
962-
for_each_umc(umc) {
963-
u32 umc_base_reg = get_umc_base(umc) + UMCCH_BASE_ADDR;
964-
u32 umc_mask_reg = get_umc_base(umc) + UMCCH_ADDR_MASK;
965-
966-
for_each_chip_select(cs, 0, pvt) {
967-
u32 *base = &pvt->csels[umc].csbases[cs];
968-
u32 *mask = &pvt->csels[umc].csmasks[cs];
969-
970-
u32 base_reg = umc_base_reg + (cs * 4);
971-
u32 mask_reg = umc_mask_reg + ((cs >> 1) * 4);
972-
973-
if (!amd_smn_read(pvt->mc_node_id, base_reg, base))
974-
edac_dbg(0, " DCSB%d[%d]=0x%08x reg: 0x%x\n",
975-
umc, cs, *base, base_reg);
976-
977-
if (!amd_smn_read(pvt->mc_node_id, mask_reg, mask))
978-
edac_dbg(0, " DCSM%d[%d]=0x%08x reg: 0x%x\n",
979-
umc, cs, *mask, mask_reg);
980-
}
981-
}
982-
}
983-
984950
/*
985951
* Function 2 Offset F10_DCSB0; read in the DCS Base and DCS Mask registers
986952
*/
987953
static void read_dct_base_mask(struct amd64_pvt *pvt)
988954
{
989-
int cs;
955+
int base_reg0, base_reg1, mask_reg0, mask_reg1, cs;
990956

991957
prep_chip_selects(pvt);
992958

993-
if (pvt->umc)
994-
return read_umc_base_mask(pvt);
959+
if (pvt->umc) {
960+
base_reg0 = get_umc_base(0) + UMCCH_BASE_ADDR;
961+
base_reg1 = get_umc_base(1) + UMCCH_BASE_ADDR;
962+
mask_reg0 = get_umc_base(0) + UMCCH_ADDR_MASK;
963+
mask_reg1 = get_umc_base(1) + UMCCH_ADDR_MASK;
964+
} else {
965+
base_reg0 = DCSB0;
966+
base_reg1 = DCSB1;
967+
mask_reg0 = DCSM0;
968+
mask_reg1 = DCSM1;
969+
}
995970

996971
for_each_chip_select(cs, 0, pvt) {
997-
int reg0 = DCSB0 + (cs * 4);
998-
int reg1 = DCSB1 + (cs * 4);
972+
int reg0 = base_reg0 + (cs * 4);
973+
int reg1 = base_reg1 + (cs * 4);
999974
u32 *base0 = &pvt->csels[0].csbases[cs];
1000975
u32 *base1 = &pvt->csels[1].csbases[cs];
1001976

1002-
if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, base0))
1003-
edac_dbg(0, " DCSB0[%d]=0x%08x reg: F2x%x\n",
1004-
cs, *base0, reg0);
977+
if (pvt->umc) {
978+
if (!amd_smn_read(pvt->mc_node_id, reg0, base0))
979+
edac_dbg(0, " DCSB0[%d]=0x%08x reg: 0x%x\n",
980+
cs, *base0, reg0);
1005981

1006-
if (pvt->fam == 0xf)
1007-
continue;
982+
if (!amd_smn_read(pvt->mc_node_id, reg1, base1))
983+
edac_dbg(0, " DCSB1[%d]=0x%08x reg: 0x%x\n",
984+
cs, *base1, reg1);
985+
} else {
986+
if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, base0))
987+
edac_dbg(0, " DCSB0[%d]=0x%08x reg: F2x%x\n",
988+
cs, *base0, reg0);
989+
990+
if (pvt->fam == 0xf)
991+
continue;
1008992

1009-
if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, base1))
1010-
edac_dbg(0, " DCSB1[%d]=0x%08x reg: F2x%x\n",
1011-
cs, *base1, (pvt->fam == 0x10) ? reg1
1012-
: reg0);
993+
if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, base1))
994+
edac_dbg(0, " DCSB1[%d]=0x%08x reg: F2x%x\n",
995+
cs, *base1, (pvt->fam == 0x10) ? reg1
996+
: reg0);
997+
}
1013998
}
1014999

10151000
for_each_chip_select_mask(cs, 0, pvt) {
1016-
int reg0 = DCSM0 + (cs * 4);
1017-
int reg1 = DCSM1 + (cs * 4);
1001+
int reg0 = mask_reg0 + (cs * 4);
1002+
int reg1 = mask_reg1 + (cs * 4);
10181003
u32 *mask0 = &pvt->csels[0].csmasks[cs];
10191004
u32 *mask1 = &pvt->csels[1].csmasks[cs];
10201005

1021-
if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, mask0))
1022-
edac_dbg(0, " DCSM0[%d]=0x%08x reg: F2x%x\n",
1023-
cs, *mask0, reg0);
1006+
if (pvt->umc) {
1007+
if (!amd_smn_read(pvt->mc_node_id, reg0, mask0))
1008+
edac_dbg(0, " DCSM0[%d]=0x%08x reg: 0x%x\n",
1009+
cs, *mask0, reg0);
10241010

1025-
if (pvt->fam == 0xf)
1026-
continue;
1011+
if (!amd_smn_read(pvt->mc_node_id, reg1, mask1))
1012+
edac_dbg(0, " DCSM1[%d]=0x%08x reg: 0x%x\n",
1013+
cs, *mask1, reg1);
1014+
} else {
1015+
if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, mask0))
1016+
edac_dbg(0, " DCSM0[%d]=0x%08x reg: F2x%x\n",
1017+
cs, *mask0, reg0);
10271018

1028-
if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, mask1))
1029-
edac_dbg(0, " DCSM1[%d]=0x%08x reg: F2x%x\n",
1030-
cs, *mask1, (pvt->fam == 0x10) ? reg1
1031-
: reg0);
1019+
if (pvt->fam == 0xf)
1020+
continue;
1021+
1022+
if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, mask1))
1023+
edac_dbg(0, " DCSM1[%d]=0x%08x reg: F2x%x\n",
1024+
cs, *mask1, (pvt->fam == 0x10) ? reg1
1025+
: reg0);
1026+
}
10321027
}
10331028
}
10341029

drivers/edac/amd64_edac.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@
9696
/* Hardware limit on ChipSelect rows per MC and processors per system */
9797
#define NUM_CHIPSELECTS 8
9898
#define DRAM_RANGES 8
99-
#define NUM_CONTROLLERS 8
10099

101100
#define ON true
102101
#define OFF false
@@ -352,8 +351,8 @@ struct amd64_pvt {
352351
u32 dbam0; /* DRAM Base Address Mapping reg for DCT0 */
353352
u32 dbam1; /* DRAM Base Address Mapping reg for DCT1 */
354353

355-
/* one for each DCT/UMC */
356-
struct chip_select csels[NUM_CONTROLLERS];
354+
/* one for each DCT */
355+
struct chip_select csels[2];
357356

358357
/* DRAM base and limit pairs F1x[78,70,68,60,58,50,48,40] */
359358
struct dram_range ranges[DRAM_RANGES];

0 commit comments

Comments
 (0)