Aladyshev Konstantin has uploaded this change for review. ( https://review.coreboot.org/20839
Change subject: AGESA: f15 f15tn f16kb: Add extra check for incorrect SPD data ......................................................................
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];