Skip to content

Commit b48aeab

Browse files
committed
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp: amd64_edac: Cleanup return type of amd64_determine_edac_cap() amd64_edac: Add a fix for Erratum 505 EDAC, MCE, AMD: Simplify NB MCE decoder interface EDAC, MCE, AMD: Drop local coreid reporting EDAC, MCE, AMD: Print valid addr when reporting an error EDAC, MCE, AMD: Print CPU number when reporting the error
2 parents 1bc87b0 + 1f6189e commit b48aeab

File tree

3 files changed

+44
-45
lines changed

3 files changed

+44
-45
lines changed

drivers/edac/amd64_edac.c

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -114,21 +114,30 @@ static int f10_read_dct_pci_cfg(struct amd64_pvt *pvt, int addr, u32 *val,
114114
return __amd64_read_pci_cfg_dword(pvt->F2, addr, val, func);
115115
}
116116

117+
/*
118+
* Select DCT to which PCI cfg accesses are routed
119+
*/
120+
static void f15h_select_dct(struct amd64_pvt *pvt, u8 dct)
121+
{
122+
u32 reg = 0;
123+
124+
amd64_read_pci_cfg(pvt->F1, DCT_CFG_SEL, &reg);
125+
reg &= 0xfffffffe;
126+
reg |= dct;
127+
amd64_write_pci_cfg(pvt->F1, DCT_CFG_SEL, reg);
128+
}
129+
117130
static int f15_read_dct_pci_cfg(struct amd64_pvt *pvt, int addr, u32 *val,
118131
const char *func)
119132
{
120-
u32 reg = 0;
121133
u8 dct = 0;
122134

123135
if (addr >= 0x140 && addr <= 0x1a0) {
124136
dct = 1;
125137
addr -= 0x100;
126138
}
127139

128-
amd64_read_pci_cfg(pvt->F1, DCT_CFG_SEL, &reg);
129-
reg &= 0xfffffffe;
130-
reg |= dct;
131-
amd64_write_pci_cfg(pvt->F1, DCT_CFG_SEL, reg);
140+
f15h_select_dct(pvt, dct);
132141

133142
return __amd64_read_pci_cfg_dword(pvt->F2, addr, val, func);
134143
}
@@ -198,6 +207,10 @@ static int amd64_set_scrub_rate(struct mem_ctl_info *mci, u32 bw)
198207
if (boot_cpu_data.x86 == 0xf)
199208
min_scrubrate = 0x0;
200209

210+
/* F15h Erratum #505 */
211+
if (boot_cpu_data.x86 == 0x15)
212+
f15h_select_dct(pvt, 0);
213+
201214
return __amd64_set_scrub_rate(pvt->F3, bw, min_scrubrate);
202215
}
203216

@@ -207,6 +220,10 @@ static int amd64_get_scrub_rate(struct mem_ctl_info *mci)
207220
u32 scrubval = 0;
208221
int i, retval = -EINVAL;
209222

223+
/* F15h Erratum #505 */
224+
if (boot_cpu_data.x86 == 0x15)
225+
f15h_select_dct(pvt, 0);
226+
210227
amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval);
211228

212229
scrubval = scrubval & 0x001F;
@@ -751,10 +768,10 @@ static int get_channel_from_ecc_syndrome(struct mem_ctl_info *, u16);
751768
* Determine if the DIMMs have ECC enabled. ECC is enabled ONLY if all the DIMMs
752769
* are ECC capable.
753770
*/
754-
static enum edac_type amd64_determine_edac_cap(struct amd64_pvt *pvt)
771+
static unsigned long amd64_determine_edac_cap(struct amd64_pvt *pvt)
755772
{
756773
u8 bit;
757-
enum dev_type edac_cap = EDAC_FLAG_NONE;
774+
unsigned long edac_cap = EDAC_FLAG_NONE;
758775

759776
bit = (boot_cpu_data.x86 > 0xf || pvt->ext_model >= K8_REV_F)
760777
? 19
@@ -1953,11 +1970,9 @@ static inline void __amd64_decode_bus_error(struct mem_ctl_info *mci,
19531970
amd64_handle_ue(mci, m);
19541971
}
19551972

1956-
void amd64_decode_bus_error(int node_id, struct mce *m, u32 nbcfg)
1973+
void amd64_decode_bus_error(int node_id, struct mce *m)
19571974
{
1958-
struct mem_ctl_info *mci = mcis[node_id];
1959-
1960-
__amd64_decode_bus_error(mci, m);
1975+
__amd64_decode_bus_error(mcis[node_id], m);
19611976
}
19621977

19631978
/*

drivers/edac/mce_amd.c

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@ static u8 xec_mask = 0xf;
99
static u8 nb_err_cpumask = 0xf;
1010

1111
static bool report_gart_errors;
12-
static void (*nb_bus_decoder)(int node_id, struct mce *m, u32 nbcfg);
12+
static void (*nb_bus_decoder)(int node_id, struct mce *m);
1313

1414
void amd_report_gart_errors(bool v)
1515
{
1616
report_gart_errors = v;
1717
}
1818
EXPORT_SYMBOL_GPL(amd_report_gart_errors);
1919

20-
void amd_register_ecc_decoder(void (*f)(int, struct mce *, u32))
20+
void amd_register_ecc_decoder(void (*f)(int, struct mce *))
2121
{
2222
nb_bus_decoder = f;
2323
}
2424
EXPORT_SYMBOL_GPL(amd_register_ecc_decoder);
2525

26-
void amd_unregister_ecc_decoder(void (*f)(int, struct mce *, u32))
26+
void amd_unregister_ecc_decoder(void (*f)(int, struct mce *))
2727
{
2828
if (nb_bus_decoder) {
2929
WARN_ON(nb_bus_decoder != f);
@@ -592,31 +592,14 @@ static bool nb_noop_mce(u16 ec, u8 xec)
592592
return false;
593593
}
594594

595-
void amd_decode_nb_mce(int node_id, struct mce *m, u32 nbcfg)
595+
void amd_decode_nb_mce(struct mce *m)
596596
{
597597
struct cpuinfo_x86 *c = &boot_cpu_data;
598-
u16 ec = EC(m->status);
599-
u8 xec = XEC(m->status, 0x1f);
600-
u32 nbsh = (u32)(m->status >> 32);
601-
int core = -1;
602-
603-
pr_emerg(HW_ERR "Northbridge Error (node %d", node_id);
604-
605-
/* F10h, revD can disable ErrCpu[3:0] through ErrCpuVal */
606-
if (c->x86 == 0x10 && c->x86_model > 7) {
607-
if (nbsh & NBSH_ERR_CPU_VAL)
608-
core = nbsh & nb_err_cpumask;
609-
} else {
610-
u8 assoc_cpus = nbsh & nb_err_cpumask;
611-
612-
if (assoc_cpus > 0)
613-
core = fls(assoc_cpus) - 1;
614-
}
598+
int node_id = amd_get_nb_id(m->extcpu);
599+
u16 ec = EC(m->status);
600+
u8 xec = XEC(m->status, 0x1f);
615601

616-
if (core >= 0)
617-
pr_cont(", core %d): ", core);
618-
else
619-
pr_cont("): ");
602+
pr_emerg(HW_ERR "Northbridge Error (node %d): ", node_id);
620603

621604
switch (xec) {
622605
case 0x2:
@@ -648,7 +631,7 @@ void amd_decode_nb_mce(int node_id, struct mce *m, u32 nbcfg)
648631

649632
if (c->x86 == 0xf || c->x86 == 0x10 || c->x86 == 0x15)
650633
if ((xec == 0x8 || xec == 0x0) && nb_bus_decoder)
651-
nb_bus_decoder(node_id, m, nbcfg);
634+
nb_bus_decoder(node_id, m);
652635

653636
return;
654637

@@ -764,13 +747,13 @@ int amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
764747
{
765748
struct mce *m = (struct mce *)data;
766749
struct cpuinfo_x86 *c = &boot_cpu_data;
767-
int node, ecc;
750+
int ecc;
768751

769752
if (amd_filter_mce(m))
770753
return NOTIFY_STOP;
771754

772-
pr_emerg(HW_ERR "MC%d_STATUS[%s|%s|%s|%s|%s",
773-
m->bank,
755+
pr_emerg(HW_ERR "CPU:%d\tMC%d_STATUS[%s|%s|%s|%s|%s",
756+
m->extcpu, m->bank,
774757
((m->status & MCI_STATUS_OVER) ? "Over" : "-"),
775758
((m->status & MCI_STATUS_UC) ? "UE" : "CE"),
776759
((m->status & MCI_STATUS_MISCV) ? "MiscV" : "-"),
@@ -789,6 +772,8 @@ int amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
789772

790773
pr_cont("]: 0x%016llx\n", m->status);
791774

775+
if (m->status & MCI_STATUS_ADDRV)
776+
pr_emerg(HW_ERR "\tMC%d_ADDR: 0x%016llx\n", m->bank, m->addr);
792777

793778
switch (m->bank) {
794779
case 0:
@@ -811,8 +796,7 @@ int amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
811796
break;
812797

813798
case 4:
814-
node = amd_get_nb_id(m->extcpu);
815-
amd_decode_nb_mce(node, m, 0);
799+
amd_decode_nb_mce(m);
816800
break;
817801

818802
case 5:

drivers/edac/mce_amd.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,9 @@ struct amd_decoder_ops {
8686
};
8787

8888
void amd_report_gart_errors(bool);
89-
void amd_register_ecc_decoder(void (*f)(int, struct mce *, u32));
90-
void amd_unregister_ecc_decoder(void (*f)(int, struct mce *, u32));
91-
void amd_decode_nb_mce(int, struct mce *, u32);
89+
void amd_register_ecc_decoder(void (*f)(int, struct mce *));
90+
void amd_unregister_ecc_decoder(void (*f)(int, struct mce *));
91+
void amd_decode_nb_mce(struct mce *);
9292
int amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data);
9393

9494
#endif /* _EDAC_MCE_AMD_H */

0 commit comments

Comments
 (0)