/** @file | |
Perform the platform memory test | |
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#include "PlatformBm.h" | |
// | |
// BDS Platform Functions | |
// | |
/** | |
Perform the memory test base on the memory test intensive level, | |
and update the memory resource. | |
@param Level The memory test intensive level. | |
@retval EFI_STATUS Success test all the system memory and update | |
the memory resource | |
**/ | |
EFI_STATUS | |
PlatformBootManagerMemoryTest ( | |
IN EXTENDMEM_COVERAGE_LEVEL Level | |
) | |
{ | |
EFI_STATUS Status; | |
EFI_STATUS KeyStatus; | |
EFI_STATUS InitStatus; | |
EFI_STATUS ReturnStatus; | |
BOOLEAN RequireSoftECCInit; | |
EFI_GENERIC_MEMORY_TEST_PROTOCOL *GenMemoryTest; | |
UINT64 TestedMemorySize; | |
UINT64 TotalMemorySize; | |
BOOLEAN ErrorOut; | |
BOOLEAN TestAbort; | |
EFI_INPUT_KEY Key; | |
ReturnStatus = EFI_SUCCESS; | |
ZeroMem (&Key, sizeof (EFI_INPUT_KEY)); | |
TestedMemorySize = 0; | |
TotalMemorySize = 0; | |
ErrorOut = FALSE; | |
TestAbort = FALSE; | |
RequireSoftECCInit = FALSE; | |
Status = gBS->LocateProtocol ( | |
&gEfiGenericMemTestProtocolGuid, | |
NULL, | |
(VOID **)&GenMemoryTest | |
); | |
if (EFI_ERROR (Status)) { | |
return EFI_SUCCESS; | |
} | |
InitStatus = GenMemoryTest->MemoryTestInit ( | |
GenMemoryTest, | |
Level, | |
&RequireSoftECCInit | |
); | |
if (InitStatus == EFI_NO_MEDIA) { | |
// | |
// The PEI codes also have the relevant memory test code to check the memory, | |
// it can select to test some range of the memory or all of them. If PEI code | |
// checks all the memory, this BDS memory test will has no not-test memory to | |
// do the test, and then the status of EFI_NO_MEDIA will be returned by | |
// "MemoryTestInit". So it does not need to test memory again, just return. | |
// | |
return EFI_SUCCESS; | |
} | |
DEBUG ((DEBUG_INFO, "Enter memory test.\n")); | |
do { | |
Status = GenMemoryTest->PerformMemoryTest ( | |
GenMemoryTest, | |
&TestedMemorySize, | |
&TotalMemorySize, | |
&ErrorOut, | |
TestAbort | |
); | |
if (ErrorOut && (Status == EFI_DEVICE_ERROR)) { | |
PrintXY (10, 10, NULL, NULL, L"Memory Testing failed!"); | |
ASSERT (0); | |
} | |
DEBUG ((DEBUG_INFO, "Perform memory test (ESC to skip).\n")); | |
if (!PcdGetBool (PcdConInConnectOnDemand)) { | |
KeyStatus = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); | |
if (!EFI_ERROR (KeyStatus) && (Key.ScanCode == SCAN_ESC)) { | |
if (!RequireSoftECCInit) { | |
Status = GenMemoryTest->Finished (GenMemoryTest); | |
goto Done; | |
} | |
TestAbort = TRUE; | |
} | |
} | |
} while (Status != EFI_NOT_FOUND); | |
Status = GenMemoryTest->Finished (GenMemoryTest); | |
Done: | |
DEBUG ((DEBUG_INFO, "%d bytes of system memory tested OK\r\n", TotalMemorySize)); | |
return ReturnStatus; | |
} |