1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
From da111dc0736f1101683c5e596fdfed46fd48717d Mon Sep 17 00:00:00 2001
From: Timothy Pearson <tpearson@raptorengineeringinc.com>
Date: Thu, 11 Jun 2015 16:14:15 -0500
Subject: [PATCH 054/139] src/northbridge/amd/amdmct: Add option to override
bad SPD checksum
Change-Id: Ia743a13348d0a6e5e4dfffa04ed9582e0f7f3dad
Signed-off-by: Timothy Pearson <tpearson@raptorengineeringinc.com>
---
src/mainboard/asus/kgpe-d16/cmos.default | 1 +
src/mainboard/asus/kgpe-d16/cmos.layout | 7 ++++++-
src/northbridge/amd/amdmct/mct_ddr3/mct_d.c | 5 +++--
src/northbridge/amd/amdmct/wrappers/mcti_d.c | 8 ++++++++
4 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/src/mainboard/asus/kgpe-d16/cmos.default b/src/mainboard/asus/kgpe-d16/cmos.default
index a52b7fa..73f2a38 100644
--- a/src/mainboard/asus/kgpe-d16/cmos.default
+++ b/src/mainboard/asus/kgpe-d16/cmos.default
@@ -8,6 +8,7 @@ nmi = Disable
hypertransport_speed_limit = Auto
max_mem_clock = DDR3-1600
minimum_memory_voltage = 1.5V
+dimm_spd_checksum = Enforce
ECC_memory = Enable
ECC_redirection = Enable
ecc_scrub_rate = 1.28us
diff --git a/src/mainboard/asus/kgpe-d16/cmos.layout b/src/mainboard/asus/kgpe-d16/cmos.layout
index 307bddc..e91568c 100644
--- a/src/mainboard/asus/kgpe-d16/cmos.layout
+++ b/src/mainboard/asus/kgpe-d16/cmos.layout
@@ -47,8 +47,10 @@ entries
466 1 e 1 cpu_cc6_state
467 1 e 1 sata_ahci_mode
468 4 h 0 maximum_p_state_limit
-473 1 r 0 allow_spd_nvram_cache_restore
+472 2 e 13 dimm_spd_checksum
+474 1 r 0 allow_spd_nvram_cache_restore
477 1 e 1 ieee1394
+>>>>>>> bed9a97... src/northbridge/amd/amdmct: Add option to override bad SPD checksum
728 256 h 0 user_data
984 16 h 0 check_sum
# Reserve the extended AMD configuration registers
@@ -142,6 +144,9 @@ enumerations
12 1 1.35V
12 2 1.25V
12 3 1.15V
+13 0 Enforce
+13 1 Ignore
+13 2 Override
checksums
diff --git a/src/northbridge/amd/amdmct/mct_ddr3/mct_d.c b/src/northbridge/amd/amdmct/mct_ddr3/mct_d.c
index 4d7e5aa..f4859d0 100644
--- a/src/northbridge/amd/amdmct/mct_ddr3/mct_d.c
+++ b/src/northbridge/amd/amdmct/mct_ddr3/mct_d.c
@@ -1449,7 +1449,7 @@ restartinit:
}
}
if (NodesWmem == 0) {
- printk(BIOS_DEBUG, "No Nodes?!\n");
+ printk(BIOS_ALERT, "Unable to detect valid memory on any nodes. Halting!\n");
goto fatalexit;
}
@@ -3884,13 +3884,14 @@ static u8 DIMMPresence_D(struct MCTStatStruc *pMCTstat,
read_spd_bytes(pMCTstat, pDCTstat, i);
crc_status = crcCheck(pDCTstat, i);
}
- if (crc_status) { /* CRC is OK */
+ if ((crc_status) || (SPDCtrl == 2)) { /* CRC is OK */
byte = pDCTstat->spd_data.spd_bytes[i][SPD_TYPE];
if (byte == JED_DDR3SDRAM) {
/*Dimm is 'Present'*/
pDCTstat->DIMMValid |= 1 << i;
}
} else {
+ printk(BIOS_WARNING, "Node %d DIMM %d: SPD checksum invalid\n", pDCTstat->Node_ID, i);
pDCTstat->DIMMSPDCSE = 1 << i;
if (SPDCtrl == 0) {
pDCTstat->ErrStatus |= 1 << SB_DIMMChkSum;
diff --git a/src/northbridge/amd/amdmct/wrappers/mcti_d.c b/src/northbridge/amd/amdmct/wrappers/mcti_d.c
index af34d3b..86a0b14 100644
--- a/src/northbridge/amd/amdmct/wrappers/mcti_d.c
+++ b/src/northbridge/amd/amdmct/wrappers/mcti_d.c
@@ -150,6 +150,14 @@ static u16 mctGet_NVbits(u8 index)
case NV_SPDCHK_RESTRT:
val = 0; /* Exit current node initialization if any DIMM has SPD checksum error */
//val = 1; /* Ignore faulty SPD checksum (DIMM will still be disabled), continue current node intialization */
+ //val = 2; /* Override faulty SPD checksum (DIMM will be enabled), continue current node intialization */
+
+ if (get_option(&nvram, "dimm_spd_checksum") == CB_SUCCESS)
+ val = nvram & 0x3;
+
+ if (val > 2)
+ val = 2;
+
break;
case NV_DQSTrainCTL:
//val = 0; /*Skip dqs training */
--
1.9.1
|