3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 Perform the platform memory test
23 #include "BdsPlatform.h"
27 // BDS Platform Functions
30 PlatformBdsShowProgress (
31 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleForeground
,
32 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleBackground
,
34 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL ProgressColor
,
36 IN UINTN PreviousValue
42 Show progress bar with title above it. It only works in UGA mode.
46 TitleForeground - Foreground color for Title.
47 TitleBackground - Background color for Title.
48 Title - Title above progress bar.
49 ProgressColor - Progress bar color.
50 Progress - Progress (0-100)
54 EFI_STATUS - Success update the progress bar
59 EFI_GRAPHICS_OUTPUT_PROTOCOL
*GraphicsOutput
;
60 EFI_UGA_DRAW_PROTOCOL
*UgaDraw
;
65 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color
;
74 return EFI_INVALID_PARAMETER
;
78 Status
= gBS
->HandleProtocol (
79 gST
->ConsoleOutHandle
,
80 &gEfiGraphicsOutputProtocolGuid
,
83 if (EFI_ERROR (Status
)) {
84 GraphicsOutput
= NULL
;
86 Status
= gBS
->HandleProtocol (
87 gST
->ConsoleOutHandle
,
88 &gEfiUgaDrawProtocolGuid
,
91 if (EFI_ERROR (Status
)) {
92 return EFI_UNSUPPORTED
;
96 if (GraphicsOutput
!= NULL
) {
97 SizeOfX
= GraphicsOutput
->Mode
->Info
->HorizontalResolution
;
98 SizeOfY
= GraphicsOutput
->Mode
->Info
->VerticalResolution
;
100 Status
= UgaDraw
->GetMode (
107 if (EFI_ERROR (Status
)) {
108 return EFI_UNSUPPORTED
;
112 BlockWidth
= SizeOfX
/ 100;
113 BlockHeight
= SizeOfY
/ 50;
118 PosY
= SizeOfY
* 48 / 50;
122 // Clear progress area
124 SetMem (&Color
, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
), 0x0);
126 if (GraphicsOutput
!= NULL
) {
127 Status
= GraphicsOutput
->Blt (
134 PosY
- GLYPH_HEIGHT
- 1,
136 SizeOfY
- (PosY
- GLYPH_HEIGHT
- 1),
137 SizeOfX
* sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
)
140 Status
= UgaDraw
->Blt (
142 (EFI_UGA_PIXEL
*) &Color
,
147 PosY
- GLYPH_HEIGHT
- 1,
149 SizeOfY
- (PosY
- GLYPH_HEIGHT
- 1),
150 SizeOfX
* sizeof (EFI_UGA_PIXEL
)
155 // Show progress by drawing blocks
157 for (Index
= PreviousValue
; Index
< BlockNum
; Index
++) {
158 PosX
= Index
* BlockWidth
;
159 if (GraphicsOutput
!= NULL
) {
160 Status
= GraphicsOutput
->Blt (
170 (BlockWidth
) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
)
173 Status
= UgaDraw
->Blt (
175 (EFI_UGA_PIXEL
*) &ProgressColor
,
183 (BlockWidth
) * sizeof (EFI_UGA_PIXEL
)
189 (SizeOfX
- StrLen (Title
) * GLYPH_WIDTH
) / 2,
190 PosY
- GLYPH_HEIGHT
- 1,
201 IN EXTENDMEM_COVERAGE_LEVEL Level
207 Perform the memory test base on the memory test intensive level,
208 and update the memory resource.
212 Level - The memory test intensive level.
216 EFI_STATUS - Success test all the system memory and update
222 EFI_STATUS InitStatus
;
223 EFI_STATUS KeyStatus
;
224 EFI_STATUS ReturnStatus
;
225 BOOLEAN RequireSoftECCInit
;
226 EFI_GENERIC_MEMORY_TEST_PROTOCOL
*GenMemoryTest
;
227 UINT64 TestedMemorySize
;
228 UINT64 TotalMemorySize
;
230 UINT64 PreviousValue
;
234 CHAR16 StrPercent
[16];
235 CHAR16
*StrTotalMemory
;
238 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground
;
239 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background
;
240 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color
;
244 ReturnStatus
= EFI_SUCCESS
;
245 ZeroMem (&Key
, sizeof (EFI_INPUT_KEY
));
247 Pos
= AllocatePool (128);
253 StrTotalMemory
= Pos
;
255 TestedMemorySize
= 0;
261 SetMem (&Foreground
, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
), 0xff);
262 SetMem (&Background
, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
), 0x0);
263 SetMem (&Color
, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
), 0xff);
265 RequireSoftECCInit
= FALSE
;
267 gST
->ConOut
->ClearScreen (gST
->ConOut
);
268 gST
->ConOut
->SetAttribute (gST
->ConOut
, EFI_YELLOW
| EFI_BRIGHT
);
269 gST
->ConOut
->EnableCursor (gST
->ConOut
, FALSE
);
271 Status
= gBS
->LocateProtocol (
272 &gEfiGenericMemTestProtocolGuid
,
276 if (EFI_ERROR (Status
)) {
281 InitStatus
= GenMemoryTest
->MemoryTestInit (
286 if (InitStatus
== EFI_NO_MEDIA
) {
288 // The PEI codes also have the relevant memory test code to check the memory,
289 // it can select to test some range of the memory or all of them. If PEI code
290 // checks all the memory, this BDS memory test will has no not-test memory to
291 // do the test, and then the status of EFI_NO_MEDIA will be returned by
292 // "MemoryTestInit". So it does not need to test memory again, just return.
298 gST
->ConOut
->SetCursorPosition (gST
->ConOut
, 0, 2);
299 TmpStr
= GetStringById (STRING_TOKEN (STR_ESC_TO_SKIP_MEM_TEST
));
301 if (TmpStr
!= NULL
) {
302 gST
->ConOut
->OutputString (gST
->ConOut
, TmpStr
);
303 gBS
->FreePool (TmpStr
);
307 Status
= GenMemoryTest
->PerformMemoryTest (
314 if (ErrorOut
&& (Status
== EFI_DEVICE_ERROR
)) {
315 TmpStr
= GetStringById (STRING_TOKEN (STR_SYSTEM_MEM_ERROR
));
316 if (TmpStr
!= NULL
) {
317 PrintXY (10, 10, NULL
, NULL
, TmpStr
);
318 gST
->ConOut
->SetCursorPosition (gST
->ConOut
, 0, 4);
319 gST
->ConOut
->OutputString (gST
->ConOut
, TmpStr
);
320 gBS
->FreePool (TmpStr
);
326 TestPercent
= (UINTN
) DivU64x32 (
327 DivU64x32 (MultU64x32 (TestedMemorySize
, 100), 16),
328 (UINTN
)DivU64x32 (TotalMemorySize
, 16)
330 if (TestPercent
!= PreviousValue
) {
331 UnicodeValueToString (StrPercent
, 0, TestPercent
, 0);
332 gST
->ConOut
->SetCursorPosition (gST
->ConOut
, 0, 0);
333 TmpStr
= GetStringById (STRING_TOKEN (STR_MEMORY_TEST_PERCENT
));
334 if (TmpStr
!= NULL
) {
335 BdsLibOutputStrings (gST
->ConOut
, StrPercent
, TmpStr
, NULL
);
336 gBS
->FreePool (TmpStr
);
339 TmpStr
= GetStringById (STRING_TOKEN (STR_PERFORM_MEM_TEST
));
340 if (TmpStr
!= NULL
) {
341 PlatformBdsShowProgress (
347 (UINTN
) PreviousValue
349 gBS
->FreePool (TmpStr
);
353 PreviousValue
= TestPercent
;
355 KeyStatus
= gST
->ConIn
->ReadKeyStroke (gST
->ConIn
, &Key
);
356 if (Key
.ScanCode
== SCAN_ESC
) {
357 if (!RequireSoftECCInit
) {
358 TmpStr
= GetStringById (STRING_TOKEN (STR_PERFORM_MEM_TEST
));
359 if (TmpStr
!= NULL
) {
360 PlatformBdsShowProgress (
366 (UINTN
) PreviousValue
368 gBS
->FreePool (TmpStr
);
371 gST
->ConOut
->SetCursorPosition (gST
->ConOut
, 0, 0);
372 gST
->ConOut
->OutputString (gST
->ConOut
, L
"100");
373 Status
= GenMemoryTest
->Finished (GenMemoryTest
);
379 } while (Status
!= EFI_NOT_FOUND
);
381 Status
= GenMemoryTest
->Finished (GenMemoryTest
);
384 UnicodeValueToString (StrTotalMemory
, COMMA_TYPE
, (UINTN
) TotalMemorySize
, 0);
385 if (StrTotalMemory
[0] == L
',') {
389 TmpStr
= GetStringById (STRING_TOKEN (STR_MEM_TEST_COMPLETED
));
390 if (TmpStr
!= NULL
) {
391 StrCat (StrTotalMemory
, TmpStr
);
392 gBS
->FreePool (TmpStr
);
395 gST
->ConOut
->ClearScreen (gST
->ConOut
);
396 gST
->ConOut
->SetAttribute (gST
->ConOut
, EFI_YELLOW
| EFI_BRIGHT
);
397 gST
->ConOut
->EnableCursor (gST
->ConOut
, FALSE
);
398 gST
->ConOut
->OutputString (gST
->ConOut
, StrTotalMemory
);
399 PlatformBdsShowProgress (
405 (UINTN
) PreviousValue
410 DataSize
= sizeof (Value
);
411 Status
= gRT
->GetVariable (
419 if (EFI_ERROR (Status
)) {
424 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
,