2 Perform the platform memory test
4 Copyright (c) 2004 - 2008, Intel Corporation. <BR>
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19 // BDS Platform Functions
23 Show progress bar with title above it. It only works in Graphics mode.
26 @param TitleForeground Foreground color for Title.
27 @param TitleBackground Background color for Title.
28 @param Title Title above progress bar.
29 @param ProgressColor Progress bar color.
30 @param Progress Progress (0-100)
31 @param PreviousValue The previous value of the progress.
33 @retval EFI_STATUS Success update the progress bar
37 PlatformBdsShowProgress (
38 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleForeground
,
39 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleBackground
,
41 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL ProgressColor
,
43 IN UINTN PreviousValue
47 EFI_GRAPHICS_OUTPUT_PROTOCOL
*GraphicsOutput
;
48 EFI_UGA_DRAW_PROTOCOL
*UgaDraw
;
53 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color
;
62 return EFI_INVALID_PARAMETER
;
66 Status
= gBS
->HandleProtocol (
67 gST
->ConsoleOutHandle
,
68 &gEfiGraphicsOutputProtocolGuid
,
69 (VOID
**) &GraphicsOutput
71 if (EFI_ERROR (Status
) && FeaturePcdGet (PcdUgaConsumeSupport
)) {
72 GraphicsOutput
= NULL
;
74 Status
= gBS
->HandleProtocol (
75 gST
->ConsoleOutHandle
,
76 &gEfiUgaDrawProtocolGuid
,
80 if (EFI_ERROR (Status
)) {
81 return EFI_UNSUPPORTED
;
86 if (GraphicsOutput
!= NULL
) {
87 SizeOfX
= GraphicsOutput
->Mode
->Info
->HorizontalResolution
;
88 SizeOfY
= GraphicsOutput
->Mode
->Info
->VerticalResolution
;
89 } else if (FeaturePcdGet (PcdUgaConsumeSupport
)) {
90 Status
= UgaDraw
->GetMode (
97 if (EFI_ERROR (Status
)) {
98 return EFI_UNSUPPORTED
;
101 return EFI_UNSUPPORTED
;
104 BlockWidth
= SizeOfX
/ 100;
105 BlockHeight
= SizeOfY
/ 50;
110 PosY
= SizeOfY
* 48 / 50;
114 // Clear progress area
116 SetMem (&Color
, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
), 0x0);
118 if (GraphicsOutput
!= NULL
) {
119 Status
= GraphicsOutput
->Blt (
126 PosY
- EFI_GLYPH_HEIGHT
- 1,
128 SizeOfY
- (PosY
- EFI_GLYPH_HEIGHT
- 1),
129 SizeOfX
* sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
)
131 } else if (FeaturePcdGet (PcdUgaConsumeSupport
)) {
132 Status
= UgaDraw
->Blt (
134 (EFI_UGA_PIXEL
*) &Color
,
139 PosY
- EFI_GLYPH_HEIGHT
- 1,
141 SizeOfY
- (PosY
- EFI_GLYPH_HEIGHT
- 1),
142 SizeOfX
* sizeof (EFI_UGA_PIXEL
)
145 return EFI_UNSUPPORTED
;
149 // Show progress by drawing blocks
151 for (Index
= PreviousValue
; Index
< BlockNum
; Index
++) {
152 PosX
= Index
* BlockWidth
;
153 if (GraphicsOutput
!= NULL
) {
154 Status
= GraphicsOutput
->Blt (
164 (BlockWidth
) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
)
166 } else if (FeaturePcdGet (PcdUgaConsumeSupport
)) {
167 Status
= UgaDraw
->Blt (
169 (EFI_UGA_PIXEL
*) &ProgressColor
,
177 (BlockWidth
) * sizeof (EFI_UGA_PIXEL
)
180 return EFI_UNSUPPORTED
;
185 (SizeOfX
- StrLen (Title
) * EFI_GLYPH_WIDTH
) / 2,
186 PosY
- EFI_GLYPH_HEIGHT
- 1,
197 Perform the memory test base on the memory test intensive level,
198 and update the memory resource.
201 @param Level The memory test intensive level.
203 @retval EFI_STATUS Success test all the system memory and update
209 IN EXTENDMEM_COVERAGE_LEVEL Level
213 EFI_STATUS KeyStatus
;
214 EFI_STATUS InitStatus
;
215 EFI_STATUS ReturnStatus
;
216 BOOLEAN RequireSoftECCInit
;
217 EFI_GENERIC_MEMORY_TEST_PROTOCOL
*GenMemoryTest
;
218 UINT64 TestedMemorySize
;
219 UINT64 TotalMemorySize
;
221 UINT64 PreviousValue
;
225 CHAR16 StrPercent
[16];
226 CHAR16
*StrTotalMemory
;
229 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground
;
230 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background
;
231 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color
;
237 ReturnStatus
= EFI_SUCCESS
;
238 ZeroMem (&Key
, sizeof (EFI_INPUT_KEY
));
240 Pos
= AllocatePool (128);
246 StrTotalMemory
= Pos
;
248 TestedMemorySize
= 0;
254 SetMem (&Foreground
, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
), 0xff);
255 SetMem (&Background
, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
), 0x0);
256 SetMem (&Color
, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
), 0xff);
258 RequireSoftECCInit
= FALSE
;
260 gST
->ConOut
->ClearScreen (gST
->ConOut
);
261 gST
->ConOut
->SetAttribute (gST
->ConOut
, EFI_YELLOW
| EFI_BRIGHT
);
262 gST
->ConOut
->EnableCursor (gST
->ConOut
, FALSE
);
264 Status
= gBS
->LocateProtocol (
265 &gEfiGenericMemTestProtocolGuid
,
267 (VOID
**) &GenMemoryTest
269 if (EFI_ERROR (Status
)) {
274 InitStatus
= GenMemoryTest
->MemoryTestInit (
279 if (InitStatus
== EFI_NO_MEDIA
) {
281 // The PEI codes also have the relevant memory test code to check the memory,
282 // it can select to test some range of the memory or all of them. If PEI code
283 // checks all the memory, this BDS memory test will has no not-test memory to
284 // do the test, and then the status of EFI_NO_MEDIA will be returned by
285 // "MemoryTestInit". So it does not need to test memory again, just return.
291 gST
->ConOut
->SetCursorPosition (gST
->ConOut
, 0, 2);
292 TmpStr
= GetStringById (STRING_TOKEN (STR_ESC_TO_SKIP_MEM_TEST
));
294 if (TmpStr
!= NULL
) {
295 gST
->ConOut
->OutputString (gST
->ConOut
, TmpStr
);
300 Status
= GenMemoryTest
->PerformMemoryTest (
307 if (ErrorOut
&& (Status
== EFI_DEVICE_ERROR
)) {
308 TmpStr
= GetStringById (STRING_TOKEN (STR_SYSTEM_MEM_ERROR
));
309 if (TmpStr
!= NULL
) {
310 PrintXY (10, 10, NULL
, NULL
, TmpStr
);
311 gST
->ConOut
->SetCursorPosition (gST
->ConOut
, 0, 4);
312 gST
->ConOut
->OutputString (gST
->ConOut
, TmpStr
);
319 TempData
= (UINT32
) DivU64x32 (TotalMemorySize
, 16);
320 TestPercent
= (UINTN
) DivU64x32 (
321 DivU64x32 (MultU64x32 (TestedMemorySize
, 100), 16),
324 if (TestPercent
!= PreviousValue
) {
325 UnicodeValueToString (StrPercent
, 0, TestPercent
, 0);
326 gST
->ConOut
->SetCursorPosition (gST
->ConOut
, 0, 0);
327 TmpStr
= GetStringById (STRING_TOKEN (STR_MEMORY_TEST_PERCENT
));
328 if (TmpStr
!= NULL
) {
329 BdsLibOutputStrings (gST
->ConOut
, StrPercent
, TmpStr
, NULL
);
333 TmpStr
= GetStringById (STRING_TOKEN (STR_PERFORM_MEM_TEST
));
334 if (TmpStr
!= NULL
) {
335 PlatformBdsShowProgress (
341 (UINTN
) PreviousValue
347 PreviousValue
= TestPercent
;
349 KeyStatus
= gST
->ConIn
->ReadKeyStroke (gST
->ConIn
, &Key
);
350 if (!EFI_ERROR (KeyStatus
) && (Key
.ScanCode
== SCAN_ESC
)) {
351 if (!RequireSoftECCInit
) {
352 TmpStr
= GetStringById (STRING_TOKEN (STR_PERFORM_MEM_TEST
));
353 if (TmpStr
!= NULL
) {
354 PlatformBdsShowProgress (
360 (UINTN
) PreviousValue
365 gST
->ConOut
->SetCursorPosition (gST
->ConOut
, 0, 0);
366 gST
->ConOut
->OutputString (gST
->ConOut
, L
"100");
367 Status
= GenMemoryTest
->Finished (GenMemoryTest
);
373 } while (Status
!= EFI_NOT_FOUND
);
375 Status
= GenMemoryTest
->Finished (GenMemoryTest
);
378 UnicodeValueToString (StrTotalMemory
, COMMA_TYPE
, TotalMemorySize
, 0);
379 if (StrTotalMemory
[0] == L
',') {
383 TmpStr
= GetStringById (STRING_TOKEN (STR_MEM_TEST_COMPLETED
));
384 if (TmpStr
!= NULL
) {
385 StrCat (StrTotalMemory
, TmpStr
);
389 gST
->ConOut
->ClearScreen (gST
->ConOut
);
390 gST
->ConOut
->SetAttribute (gST
->ConOut
, EFI_YELLOW
| EFI_BRIGHT
);
391 gST
->ConOut
->EnableCursor (gST
->ConOut
, FALSE
);
392 gST
->ConOut
->OutputString (gST
->ConOut
, StrTotalMemory
);
393 PlatformBdsShowProgress (
399 (UINTN
) PreviousValue
404 DataSize
= sizeof (Value
);
405 Status
= gRT
->GetVariable (
413 if (EFI_ERROR (Status
)) {
418 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,