Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 336526
b: refs/heads/master
c: 66fed2d
h: refs/heads/master
v: v3
  • Loading branch information
Borislav Petkov authored and Borislav Petkov committed Nov 28, 2012
1 parent 79c6889 commit 05bde64
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6e71a870b8ff2c1e2d89e5ea27a38cea39cefa3d
refs/heads/master: 66fed2d464157eb20c37738d75b281458dfc2cab
10 changes: 5 additions & 5 deletions trunk/drivers/edac/amd64_edac.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@ struct scrubrate {
{ 0x00, 0UL}, /* scrubbing off */
};

static int __amd64_read_pci_cfg_dword(struct pci_dev *pdev, int offset,
u32 *val, const char *func)
int __amd64_read_pci_cfg_dword(struct pci_dev *pdev, int offset,
u32 *val, const char *func)
{
int err = 0;

Expand Down Expand Up @@ -1980,11 +1980,11 @@ static void amd64_handle_ue(struct mem_ctl_info *mci, struct mce *m)
static inline void __amd64_decode_bus_error(struct mem_ctl_info *mci,
struct mce *m)
{
u16 ec = EC(m->status);
u8 xec = XEC(m->status, 0x1f);
u8 ecc_type = (m->status >> 45) & 0x3;
u8 xec = XEC(m->status, 0x1f);
u16 ec = EC(m->status);

/* Bail early out if this was an 'observed' error */
/* Bail out early if this was an 'observed' error */
if (PP(ec) == NBSL_PP_OBS)
return;

Expand Down
23 changes: 19 additions & 4 deletions trunk/drivers/edac/amd64_edac.h
Original file line number Diff line number Diff line change
Expand Up @@ -273,9 +273,10 @@
#define SET_NB_ARRAY_ADDR(section) (((section) & 0x3) << 1)

#define F10_NB_ARRAY_DATA 0xBC
#define F10_NB_ARR_ECC_WR_REQ BIT(17)
#define SET_NB_DRAM_INJECTION_WRITE(inj) \
(BIT(((inj.word) & 0xF) + 20) | \
BIT(17) | inj.bit_map)
F10_NB_ARR_ECC_WR_REQ | inj.bit_map)
#define SET_NB_DRAM_INJECTION_READ(inj) \
(BIT(((inj.word) & 0xF) + 20) | \
BIT(16) | inj.bit_map)
Expand Down Expand Up @@ -306,9 +307,9 @@ enum amd_families {

/* Error injection control structure */
struct error_injection {
u32 section;
u32 word;
u32 bit_map;
u32 section;
u32 word;
u32 bit_map;
};

/* low and high part of PCI config space regs */
Expand Down Expand Up @@ -460,6 +461,8 @@ struct amd64_family_type {
struct low_ops ops;
};

int __amd64_read_pci_cfg_dword(struct pci_dev *pdev, int offset,
u32 *val, const char *func);
int __amd64_write_pci_cfg_dword(struct pci_dev *pdev, int offset,
u32 val, const char *func);

Expand All @@ -476,3 +479,15 @@ int amd64_get_dram_hole_info(struct mem_ctl_info *mci, u64 *hole_base,
u64 *hole_offset, u64 *hole_size);

#define to_mci(k) container_of(k, struct mem_ctl_info, dev)

/* Injection helpers */
static inline void disable_caches(void *dummy)
{
write_cr0(read_cr0() | X86_CR0_CD);
wbinvd();
}

static inline void enable_caches(void *dummy)
{
write_cr0(read_cr0() & ~X86_CR0_CD);
}
18 changes: 17 additions & 1 deletion trunk/drivers/edac/amd64_edac_inj.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,8 +153,8 @@ static ssize_t amd64_inject_write_store(struct device *dev,
{
struct mem_ctl_info *mci = to_mci(dev);
struct amd64_pvt *pvt = mci->pvt_info;
u32 section, word_bits, tmp;
unsigned long value;
u32 section, word_bits;
int ret;

ret = strict_strtoul(data, 10, &value);
Expand All @@ -168,9 +168,25 @@ static ssize_t amd64_inject_write_store(struct device *dev,

word_bits = SET_NB_DRAM_INJECTION_WRITE(pvt->injection);

pr_notice_once("Don't forget to decrease MCE polling interval in\n"
"/sys/bus/machinecheck/devices/machinecheck<CPUNUM>/check_interval\n"
"so that you can get the error report faster.\n");

on_each_cpu(disable_caches, NULL, 1);

/* Issue 'word' and 'bit' along with the READ request */
amd64_write_pci_cfg(pvt->F3, F10_NB_ARRAY_DATA, word_bits);

retry:
/* wait until injection happens */
amd64_read_pci_cfg(pvt->F3, F10_NB_ARRAY_DATA, &tmp);
if (tmp & F10_NB_ARR_ECC_WR_REQ) {
cpu_relax();
goto retry;
}

on_each_cpu(enable_caches, NULL, 1);

edac_dbg(0, "section=0x%x word_bits=0x%x\n", section, word_bits);

return count;
Expand Down

0 comments on commit 05bde64

Please sign in to comment.