static void octeon_lmc_edac_poll(struct mem_ctl_info *mci) { union cvmx_lmcx_mem_cfg0 cfg0; bool do_clear = false; char msg[64]; cfg0.u64 = cvmx_read_csr(CVMX_LMCX_MEM_CFG0(mci->mc_idx)); if (cfg0.s.sec_err || cfg0.s.ded_err) { union cvmx_lmcx_fadr fadr; fadr.u64 = cvmx_read_csr(CVMX_LMCX_FADR(mci->mc_idx)); snprintf(msg, sizeof(msg), "DIMM %d rank %d bank %d row %d col %d", fadr.cn30xx.fdimm, fadr.cn30xx.fbunk, fadr.cn30xx.fbank, fadr.cn30xx.frow, fadr.cn30xx.fcol); } if (cfg0.s.sec_err) { edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, 0, 0, 0, -1, -1, -1, msg, ""); cfg0.s.sec_err = -1; /* Done, re-arm */ do_clear = true; } if (cfg0.s.ded_err) { edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0, -1, -1, -1, msg, ""); cfg0.s.ded_err = -1; /* Done, re-arm */ do_clear = true; } if (do_clear) cvmx_write_csr(CVMX_LMCX_MEM_CFG0(mci->mc_idx), cfg0.u64); }
static void octeon_lmc_edac_poll_o2(struct mem_ctl_info *mci) { struct octeon_lmc_pvt *pvt = mci->pvt_info; union cvmx_lmcx_int int_reg; bool do_clear = false; char msg[64]; if (!pvt->inject) int_reg.u64 = cvmx_read_csr(CVMX_LMCX_INT(mci->mc_idx)); else { int_reg.u64 = 0; if (pvt->error_type == 1) int_reg.s.sec_err = 1; if (pvt->error_type == 2) int_reg.s.ded_err = 1; } if (int_reg.s.sec_err || int_reg.s.ded_err) { union cvmx_lmcx_fadr fadr; if (likely(!pvt->inject)) fadr.u64 = cvmx_read_csr(CVMX_LMCX_FADR(mci->mc_idx)); else { fadr.cn61xx.fdimm = pvt->dimm; fadr.cn61xx.fbunk = pvt->rank; fadr.cn61xx.fbank = pvt->bank; fadr.cn61xx.frow = pvt->row; fadr.cn61xx.fcol = pvt->col; } snprintf(msg, sizeof(msg), "DIMM %d rank %d bank %d row %d col %d", fadr.cn61xx.fdimm, fadr.cn61xx.fbunk, fadr.cn61xx.fbank, fadr.cn61xx.frow, fadr.cn61xx.fcol); } if (int_reg.s.sec_err) { edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, 0, 0, 0, -1, -1, -1, msg, ""); int_reg.s.sec_err = -1; /* Done, re-arm */ do_clear = true; } if (int_reg.s.ded_err) { edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0, -1, -1, -1, msg, ""); int_reg.s.ded_err = -1; /* Done, re-arm */ do_clear = true; } if (do_clear) { if (likely(!pvt->inject)) cvmx_write_csr(CVMX_LMCX_INT(mci->mc_idx), int_reg.u64); else pvt->inject = 0; } }