aboutsummaryrefslogtreecommitdiff
path: root/src/northbridge/amd/amdmct/mct_ddr3/mct_d.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/northbridge/amd/amdmct/mct_ddr3/mct_d.c')
-rw-r--r--src/northbridge/amd/amdmct/mct_ddr3/mct_d.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/northbridge/amd/amdmct/mct_ddr3/mct_d.c b/src/northbridge/amd/amdmct/mct_ddr3/mct_d.c
index f31fb3c7e6..bb12746a5c 100644
--- a/src/northbridge/amd/amdmct/mct_ddr3/mct_d.c
+++ b/src/northbridge/amd/amdmct/mct_ddr3/mct_d.c
@@ -2944,6 +2944,29 @@ fatalexit:
die("mct_d: fatalexit");
}
+void initialize_mca(uint8_t bsp, uint8_t suppress_errors) {
+ uint8_t node;
+ uint32_t mc4_status_high;
+ uint32_t mc4_status_low;
+
+ for (node = 0; node < MAX_NODES_SUPPORTED; node++) {
+ if (bsp && (node > 0))
+ break;
+
+ mc4_status_high = pci_read_config32(PCI_DEV(0, 0x18 + node, 3), 0x4c);
+ mc4_status_low = pci_read_config32(PCI_DEV(0, 0x18 + node, 3), 0x48);
+ if ((mc4_status_high & (0x1 << 31)) && (mc4_status_high != 0xffffffff)) {
+ if (!suppress_errors)
+ printk(BIOS_WARNING, "WARNING: MC4 Machine Check Exception detected on node %d!\n"
+ "Signature: %08x%08x\n", node, mc4_status_high, mc4_status_low);
+
+ /* Clear MC4 error status */
+ pci_write_config32(PCI_DEV(0, 0x18 + node, 3), 0x48, 0x0);
+ pci_write_config32(PCI_DEV(0, 0x18 + node, 3), 0x4c, 0x0);
+ }
+ }
+}
+
static u8 ReconfigureDIMMspare_D(struct MCTStatStruc *pMCTstat,
struct DCTStatStruc *pDCTstatA)
{