AGESA f15 f15tn f16kb: Add extra checks for incorrect SPD data
Make DMI data calculation fail-safe to incorrect SPD data. Change-Id: Ica92850cc77e1f7cbf3e7e44717de42a03b93bbe Signed-off-by: Konstantin Aladyshev <aladyshev22@gmail.com> Reviewed-on: https://review.coreboot.org/20839 Reviewed-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
This commit is contained in:
parent
1cda0d0e50
commit
c4f60f33bd
|
@ -315,6 +315,9 @@ MemFDMISupport3 (
|
|||
DmiTable[DimmIndex].Attributes = 4; // Quad Rank Dimm
|
||||
}
|
||||
|
||||
if ((!BusWidth) || (!Width) || (!Rank))
|
||||
DimmSize = 0xFFFF; // size is unknown
|
||||
else
|
||||
DimmSize = (UINT32) (Capacity / 8 * BusWidth / Width * Rank);
|
||||
if (DimmSize < 0x7FFF) {
|
||||
DmiTable[DimmIndex].MemorySize = (UINT16) DimmSize;
|
||||
|
@ -335,9 +338,19 @@ MemFDMISupport3 (
|
|||
DmiTable[DimmIndex].DimmPresent = 1;
|
||||
|
||||
// Speed (offset 15h)
|
||||
MTB_ps = ((INT32) SpdDataStructure[DimmIndex].Data[10] * 1000) / SpdDataStructure[DimmIndex].Data[11];
|
||||
FTB_ps = (SpdDataStructure[DimmIndex].Data[9] >> 4) / (SpdDataStructure[DimmIndex].Data[9] & 0xF);
|
||||
Value32 = (MTB_ps * SpdDataStructure[DimmIndex].Data[12]) + (FTB_ps * (INT8) SpdDataStructure[DimmIndex].Data[34]) ;
|
||||
|
||||
// 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].Speed = 0; // Unknown
|
||||
} else {
|
||||
MTB_ps = ((INT32) SpdDataStructure[DimmIndex].Data[10] * 1000) /
|
||||
SpdDataStructure[DimmIndex].Data[11];
|
||||
FTB_ps = (SpdDataStructure[DimmIndex].Data[9] >> 4) /
|
||||
(SpdDataStructure[DimmIndex].Data[9] & 0xF);
|
||||
Value32 = (MTB_ps * SpdDataStructure[DimmIndex].Data[12]) +
|
||||
(FTB_ps * (INT8) SpdDataStructure[DimmIndex].Data[34]);
|
||||
if (Value32 <= 938) {
|
||||
DmiTable[DimmIndex].Speed = 1067; // DDR3-2133
|
||||
} else if (Value32 <= 1071) {
|
||||
|
@ -351,6 +364,7 @@ MemFDMISupport3 (
|
|||
} else if (Value32 <= 2500) {
|
||||
DmiTable[DimmIndex].Speed = 400; // DDR3-800
|
||||
}
|
||||
}
|
||||
|
||||
// Manufacturer (offset 17h)
|
||||
ManufacturerIdCode = (UINT64) SpdDataStructure[DimmIndex].Data[118];
|
||||
|
|
|
@ -330,6 +330,9 @@ MemFDMISupport3 (
|
|||
DmiTable[DimmIndex].Attributes = 4; // Quad Rank Dimm
|
||||
}
|
||||
|
||||
if ((!BusWidth) || (!Width) || (!Rank))
|
||||
DimmSize = 0xFFFF; // size is unknown
|
||||
else
|
||||
DimmSize = (UINT32) (Capacity / 8 * BusWidth / Width * Rank);
|
||||
if (DimmSize < 0x7FFF) {
|
||||
DmiTable[DimmIndex].MemorySize = (UINT16) DimmSize;
|
||||
|
@ -354,9 +357,19 @@ MemFDMISupport3 (
|
|||
}
|
||||
|
||||
// Speed (offset 15h)
|
||||
MTB_ps = ((INT32) SpdDataStructure[DimmIndex].Data[10] * 1000) / SpdDataStructure[DimmIndex].Data[11];
|
||||
FTB_ps = (SpdDataStructure[DimmIndex].Data[9] >> 4) / (SpdDataStructure[DimmIndex].Data[9] & 0xF);
|
||||
Value32 = (MTB_ps * SpdDataStructure[DimmIndex].Data[12]) + (FTB_ps * (INT8) SpdDataStructure[DimmIndex].Data[34]) ;
|
||||
|
||||
// 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].Speed = 0; // Unknown
|
||||
} else {
|
||||
MTB_ps = ((INT32) SpdDataStructure[DimmIndex].Data[10] * 1000) /
|
||||
SpdDataStructure[DimmIndex].Data[11];
|
||||
FTB_ps = (SpdDataStructure[DimmIndex].Data[9] >> 4) /
|
||||
(SpdDataStructure[DimmIndex].Data[9] & 0xF);
|
||||
Value32 = (MTB_ps * SpdDataStructure[DimmIndex].Data[12]) +
|
||||
(FTB_ps * (INT8) SpdDataStructure[DimmIndex].Data[34]);
|
||||
if (Value32 <= 938) {
|
||||
DmiTable[DimmIndex].Speed = 1067; // DDR3-2133
|
||||
} else if (Value32 <= 1071) {
|
||||
|
@ -370,6 +383,7 @@ MemFDMISupport3 (
|
|||
} else if (Value32 <= 2500) {
|
||||
DmiTable[DimmIndex].Speed = 400; // DDR3-800
|
||||
}
|
||||
}
|
||||
|
||||
// Manufacturer (offset 17h)
|
||||
ManufacturerIdCode = (UINT64) SpdDataStructure[DimmIndex].Data[118];
|
||||
|
|
|
@ -380,6 +380,9 @@ MemFDMISupport3 (
|
|||
DmiPhysicalDimmInfoTable->Attributes = 4; // Quad Rank Dimm
|
||||
}
|
||||
|
||||
if ((!BusWidth) || (!Width) || (!Rank))
|
||||
DimmSize = 0xFFFF; // size is unknown
|
||||
else
|
||||
DimmSize = (UINT32) (Capacity / 8 * BusWidth / Width * Rank);
|
||||
if (DimmSize < 0x7FFF) {
|
||||
DmiPhysicalDimmInfoTable->MemorySize = (UINT16) DimmSize;
|
||||
|
@ -409,9 +412,19 @@ MemFDMISupport3 (
|
|||
}
|
||||
|
||||
// Speed (offset 15h)
|
||||
MTB_ps = ((INT32) SpdDataStructure->Data[10] * 1000) / SpdDataStructure->Data[11];
|
||||
FTB_ps = (SpdDataStructure->Data[9] >> 4) / (SpdDataStructure->Data[9] & 0xF);
|
||||
Value32 = (MTB_ps * SpdDataStructure->Data[12]) + (FTB_ps * (INT8) SpdDataStructure->Data[34]) ;
|
||||
|
||||
// If SPD is wrong, division by 0 in DIMM speed calculation could reboot CPU
|
||||
// So avoid it by this check
|
||||
if ((SpdDataStructure->Data[11]==0) ||
|
||||
((SpdDataStructure->Data[9] & 0xF) == 0)) {
|
||||
DmiPhysicalDimmInfoTable->Speed = 0; // Unknown
|
||||
} else {
|
||||
MTB_ps = ((INT32) SpdDataStructure->Data[10] * 1000) /
|
||||
SpdDataStructure->Data[11];
|
||||
FTB_ps = (SpdDataStructure->Data[9] >> 4) /
|
||||
(SpdDataStructure->Data[9] & 0xF);
|
||||
Value32 = (MTB_ps * SpdDataStructure->Data[12]) +
|
||||
(FTB_ps * (INT8) SpdDataStructure->Data[34]);
|
||||
if (Value32 <= 938) {
|
||||
DmiPhysicalDimmInfoTable->Speed = 1067; // DDR3-2133
|
||||
} else if (Value32 <= 1071) {
|
||||
|
@ -425,6 +438,7 @@ MemFDMISupport3 (
|
|||
} else if (Value32 <= 2500) {
|
||||
DmiPhysicalDimmInfoTable->Speed = 400; // DDR3-800
|
||||
}
|
||||
}
|
||||
|
||||
// Manufacturer (offset 17h)
|
||||
ManufacturerIdCode = (UINT64) SpdDataStructure->Data[118];
|
||||
|
|
Loading…
Reference in New Issue