mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
i7core_edac: A few fixes at error injection code
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
f122a89222
commit
7b029d03c3
1 changed files with 55 additions and 15 deletions
|
@ -30,6 +30,8 @@
|
||||||
|
|
||||||
#include "edac_core.h"
|
#include "edac_core.h"
|
||||||
|
|
||||||
|
/* To use the new pci_[read/write]_config_qword instead of two dword */
|
||||||
|
#define USE_QWORD 1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Alter this version for the module when modifications are made
|
* Alter this version for the module when modifications are made
|
||||||
|
@ -639,44 +641,71 @@ static ssize_t i7core_inject_enable_store(struct mem_ctl_info *mci,
|
||||||
|
|
||||||
/* Sets pvt->inject.dimm mask */
|
/* Sets pvt->inject.dimm mask */
|
||||||
if (pvt->inject.dimm < 0)
|
if (pvt->inject.dimm < 0)
|
||||||
mask |= 1l << 41;
|
mask |= 1L << 41;
|
||||||
else {
|
else {
|
||||||
if (pvt->channel[pvt->inject.channel].dimms > 2)
|
if (pvt->channel[pvt->inject.channel].dimms > 2)
|
||||||
mask |= (pvt->inject.dimm & 0x3l) << 35;
|
mask |= (pvt->inject.dimm & 0x3L) << 35;
|
||||||
else
|
else
|
||||||
mask |= (pvt->inject.dimm & 0x1l) << 36;
|
mask |= (pvt->inject.dimm & 0x1L) << 36;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sets pvt->inject.rank mask */
|
/* Sets pvt->inject.rank mask */
|
||||||
if (pvt->inject.rank < 0)
|
if (pvt->inject.rank < 0)
|
||||||
mask |= 1l << 40;
|
mask |= 1L << 40;
|
||||||
else {
|
else {
|
||||||
if (pvt->channel[pvt->inject.channel].dimms > 2)
|
if (pvt->channel[pvt->inject.channel].dimms > 2)
|
||||||
mask |= (pvt->inject.rank & 0x1l) << 34;
|
mask |= (pvt->inject.rank & 0x1L) << 34;
|
||||||
else
|
else
|
||||||
mask |= (pvt->inject.rank & 0x3l) << 34;
|
mask |= (pvt->inject.rank & 0x3L) << 34;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sets pvt->inject.bank mask */
|
/* Sets pvt->inject.bank mask */
|
||||||
if (pvt->inject.bank < 0)
|
if (pvt->inject.bank < 0)
|
||||||
mask |= 1l << 39;
|
mask |= 1L << 39;
|
||||||
else
|
else
|
||||||
mask |= (pvt->inject.bank & 0x15l) << 30;
|
mask |= (pvt->inject.bank & 0x15L) << 30;
|
||||||
|
|
||||||
/* Sets pvt->inject.page mask */
|
/* Sets pvt->inject.page mask */
|
||||||
if (pvt->inject.page < 0)
|
if (pvt->inject.page < 0)
|
||||||
mask |= 1l << 38;
|
mask |= 1L << 38;
|
||||||
else
|
else
|
||||||
mask |= (pvt->inject.page & 0xffffl) << 14;
|
mask |= (pvt->inject.page & 0xffffL) << 14;
|
||||||
|
|
||||||
/* Sets pvt->inject.column mask */
|
/* Sets pvt->inject.column mask */
|
||||||
if (pvt->inject.col < 0)
|
if (pvt->inject.col < 0)
|
||||||
mask |= 1l << 37;
|
mask |= 1L << 37;
|
||||||
else
|
else
|
||||||
mask |= (pvt->inject.col & 0x3fffl);
|
mask |= (pvt->inject.col & 0x3fffL);
|
||||||
|
|
||||||
|
#if USE_QWORD
|
||||||
pci_write_config_qword(pvt->pci_ch[pvt->inject.channel][0],
|
pci_write_config_qword(pvt->pci_ch[pvt->inject.channel][0],
|
||||||
MC_CHANNEL_ADDR_MATCH, mask);
|
MC_CHANNEL_ADDR_MATCH, mask);
|
||||||
|
#else
|
||||||
|
pci_write_config_dword(pvt->pci_ch[pvt->inject.channel][0],
|
||||||
|
MC_CHANNEL_ADDR_MATCH, mask);
|
||||||
|
pci_write_config_dword(pvt->pci_ch[pvt->inject.channel][0],
|
||||||
|
MC_CHANNEL_ADDR_MATCH + 4, mask >> 32L);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
#if USE_QWORD
|
||||||
|
u64 rdmask;
|
||||||
|
pci_read_config_qword(pvt->pci_ch[pvt->inject.channel][0],
|
||||||
|
MC_CHANNEL_ADDR_MATCH, &rdmask);
|
||||||
|
debugf0("Inject addr match write 0x%016llx, read: 0x%016llx\n",
|
||||||
|
mask, rdmask);
|
||||||
|
#else
|
||||||
|
u32 rdmask1, rdmask2;
|
||||||
|
|
||||||
|
pci_read_config_dword(pvt->pci_ch[pvt->inject.channel][0],
|
||||||
|
MC_CHANNEL_ADDR_MATCH, &rdmask1);
|
||||||
|
pci_read_config_dword(pvt->pci_ch[pvt->inject.channel][0],
|
||||||
|
MC_CHANNEL_ADDR_MATCH + 4, &rdmask2);
|
||||||
|
|
||||||
|
debugf0("Inject addr match write 0x%016llx, read: 0x%08x%08x\n",
|
||||||
|
mask, rdmask1, rdmask2);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
pci_write_config_dword(pvt->pci_ch[pvt->inject.channel][0],
|
pci_write_config_dword(pvt->pci_ch[pvt->inject.channel][0],
|
||||||
MC_CHANNEL_ERROR_MASK, pvt->inject.eccmask);
|
MC_CHANNEL_ERROR_MASK, pvt->inject.eccmask);
|
||||||
|
@ -688,17 +717,18 @@ static ssize_t i7core_inject_enable_store(struct mem_ctl_info *mci,
|
||||||
* bit 4: INJECT_ADDR_PARITY
|
* bit 4: INJECT_ADDR_PARITY
|
||||||
*/
|
*/
|
||||||
|
|
||||||
injectmask = (pvt->inject.type & 1) &&
|
injectmask = (pvt->inject.type & 1) |
|
||||||
(pvt->inject.section & 0x3) << 1 &&
|
(pvt->inject.section & 0x3) << 1 |
|
||||||
(pvt->inject.type & 0x6) << (3 - 1);
|
(pvt->inject.type & 0x6) << (3 - 1);
|
||||||
|
|
||||||
pci_write_config_dword(pvt->pci_ch[pvt->inject.channel][0],
|
pci_write_config_dword(pvt->pci_ch[pvt->inject.channel][0],
|
||||||
MC_CHANNEL_ERROR_MASK, injectmask);
|
MC_CHANNEL_ERROR_MASK, injectmask);
|
||||||
|
|
||||||
|
|
||||||
debugf0("Error inject addr match 0x%016llx, ecc 0x%08x, inject 0x%08x\n",
|
debugf0("Error inject addr match 0x%016llx, ecc 0x%08x, inject 0x%08x\n",
|
||||||
mask, pvt->inject.eccmask, injectmask);
|
mask, pvt->inject.eccmask, injectmask);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -706,6 +736,16 @@ static ssize_t i7core_inject_enable_show(struct mem_ctl_info *mci,
|
||||||
char *data)
|
char *data)
|
||||||
{
|
{
|
||||||
struct i7core_pvt *pvt = mci->pvt_info;
|
struct i7core_pvt *pvt = mci->pvt_info;
|
||||||
|
u32 injectmask;
|
||||||
|
|
||||||
|
pci_read_config_dword(pvt->pci_ch[pvt->inject.channel][0],
|
||||||
|
MC_CHANNEL_ERROR_MASK, &injectmask);
|
||||||
|
|
||||||
|
debugf0("Inject error read: 0x%018x\n", injectmask);
|
||||||
|
|
||||||
|
if (injectmask & 0x0c)
|
||||||
|
pvt->inject.enable = 1;
|
||||||
|
|
||||||
return sprintf(data, "%d\n", pvt->inject.enable);
|
return sprintf(data, "%d\n", pvt->inject.enable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue