Aladyshev Konstantin has uploaded this change for review.

View Change

AGESA: f15 f15tn f16kb: Add extra check for incorrect SPD data

If memory module is broken and its SPD data is wrong in a way
that Data[11] or Data[9]&0xF is equal to zero, division by 0
in DIMM speed calculation could reboot CPU. Add extra check
to avoid this issue.

Change-Id: Ica92850cc77e1f7cbf3e7e44717de42a03b93bbe
Signed-off-by: Konstantin Aladyshev <aladyshev22@gmail.com>
---
M src/vendorcode/amd/agesa/f15/Proc/Mem/Feat/DMI/mfDMI.c
M src/vendorcode/amd/agesa/f15tn/Proc/Mem/Feat/DMI/mfDMI.c
M src/vendorcode/amd/agesa/f16kb/Proc/Mem/Feat/DMI/mfDMI.c
3 files changed, 21 insertions(+), 0 deletions(-)

git pull ssh://review.coreboot.org:29418/coreboot refs/changes/39/20839/1
diff --git a/src/vendorcode/amd/agesa/f15/Proc/Mem/Feat/DMI/mfDMI.c b/src/vendorcode/amd/agesa/f15/Proc/Mem/Feat/DMI/mfDMI.c
index 3138f3f..b968349 100644
--- a/src/vendorcode/amd/agesa/f15/Proc/Mem/Feat/DMI/mfDMI.c
+++ b/src/vendorcode/amd/agesa/f15/Proc/Mem/Feat/DMI/mfDMI.c
@@ -228,6 +228,13 @@
DmiTable[DimmIndex].PartNumber[i] = 0x0;
}

+ // If SPD is wrong, division by 0 in DIMM speed calculation could reboot CPU
+ // So avoid it by this check
+ if ((SpdDataStructure[DimmIndex].Data[11]==0) || ((SpdDataStructure[DimmIndex].Data[9] & 0xF) == 0)) {
+ DmiTable[DimmIndex].DimmPresent = 0;
+ SpdDataStructure[DimmIndex].DimmPresent = 0;
+ }
+
if (SpdDataStructure[DimmIndex].DimmPresent) {
// Total Width (offset 08h) & Data Width (offset 0Ah)
TotalWidth = (UINT16) SpdDataStructure[DimmIndex].Data[8];
diff --git a/src/vendorcode/amd/agesa/f15tn/Proc/Mem/Feat/DMI/mfDMI.c b/src/vendorcode/amd/agesa/f15tn/Proc/Mem/Feat/DMI/mfDMI.c
index 6620030..61499f5 100644
--- a/src/vendorcode/amd/agesa/f15tn/Proc/Mem/Feat/DMI/mfDMI.c
+++ b/src/vendorcode/amd/agesa/f15tn/Proc/Mem/Feat/DMI/mfDMI.c
@@ -243,6 +243,13 @@
DmiTable[DimmIndex].PartNumber[i] = 0x0;
}

+ // If SPD is wrong, division by 0 in DIMM speed calculation could reboot CPU
+ // So avoid it by this check
+ if ((SpdDataStructure[DimmIndex].Data[11]==0) || ((SpdDataStructure[DimmIndex].Data[9] & 0xF) == 0)) {
+ DmiTable[DimmIndex].DimmPresent = 0;
+ SpdDataStructure[DimmIndex].DimmPresent = 0;
+ }
+
if (SpdDataStructure[DimmIndex].DimmPresent) {
// Total Width (offset 08h) & Data Width (offset 0Ah)
TotalWidth = (UINT16) SpdDataStructure[DimmIndex].Data[8];
diff --git a/src/vendorcode/amd/agesa/f16kb/Proc/Mem/Feat/DMI/mfDMI.c b/src/vendorcode/amd/agesa/f16kb/Proc/Mem/Feat/DMI/mfDMI.c
index 57cc491..edaf9ee 100644
--- a/src/vendorcode/amd/agesa/f16kb/Proc/Mem/Feat/DMI/mfDMI.c
+++ b/src/vendorcode/amd/agesa/f16kb/Proc/Mem/Feat/DMI/mfDMI.c
@@ -293,6 +293,13 @@
DmiPhysicalDimmInfoTable->PartNumber[i] = 0x0;
}

+ // If SPD is wrong, division by 0 in DIMM speed calculation could reboot CPU
+ // So avoid it by this check
+ if ((SpdDataStructure[DimmIndex].Data[11]==0) || ((SpdDataStructure[DimmIndex].Data[9] & 0xF) == 0)) {
+ DmiTable[DimmIndex].DimmPresent = 0;
+ SpdDataStructure[DimmIndex].DimmPresent = 0;
+ }
+
if (SpdDataStructure->DimmPresent) {
// Total Width (offset 08h) & Data Width (offset 0Ah)
TotalWidth = (UINT16) SpdDataStructure->Data[8];

To view, visit change 20839. To unsubscribe, visit settings.

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ica92850cc77e1f7cbf3e7e44717de42a03b93bbe
Gerrit-Change-Number: 20839
Gerrit-PatchSet: 1
Gerrit-Owner: Aladyshev Konstantin <aladyshev22@gmail.com>