123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- /** @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;
- }
|