]> git.proxmox.com Git - mirror_edk2.git/blame - Nt32Pkg/PlatformBdsDxe/Generic/FrontPage.c
Merger trackers #7807 and #8372.
[mirror_edk2.git] / Nt32Pkg / PlatformBdsDxe / Generic / FrontPage.c
CommitLineData
bc11b829 1/*++\r
2\r
3Copyright (c) 2006 - 2007, Intel Corporation\r
4All rights reserved. This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12Module Name:\r
13\r
14 FrontPage.c\r
15\r
16Abstract:\r
17\r
18 FrontPage routines to handle the callbacks and browser calls\r
19\r
20--*/\r
bc11b829 21#include "Bds.h"\r
22#include "BdsPlatform.h"\r
23#include "FrontPage.h"\r
06335580 24#include "BdsString.h"\r
bc11b829 25\r
26EFI_GUID mProcessorSubClass = EFI_PROCESSOR_SUBCLASS_GUID;\r
27EFI_GUID mMemorySubClass = EFI_MEMORY_SUBCLASS_GUID;\r
28EFI_GUID mMiscSubClass = EFI_MISC_SUBCLASS_GUID;\r
29\r
30UINT16 mLastSelection;\r
31EFI_HII_HANDLE gFrontPageHandle;\r
32EFI_HANDLE FrontPageCallbackHandle;\r
33EFI_FORM_CALLBACK_PROTOCOL FrontPageCallback;\r
34EFI_FORM_BROWSER_PROTOCOL *gBrowser;\r
35UINTN gCallbackKey;\r
36BOOLEAN gConnectAllHappened = FALSE;\r
37\r
38extern EFI_HII_HANDLE gFrontPageHandle;\r
bc11b829 39\r
40EFI_STATUS\r
41EFIAPI\r
42FrontPageCallbackRoutine (\r
43 IN EFI_FORM_CALLBACK_PROTOCOL *This,\r
44 IN UINT16 KeyValue,\r
45 IN EFI_IFR_DATA_ARRAY *DataArray,\r
46 OUT EFI_HII_CALLBACK_PACKET **Packet\r
47 )\r
48/*++\r
49\r
50Routine Description:\r
51\r
52 This is the function that is called to provide results data to the driver. This data\r
53 consists of a unique key which is used to identify what data is either being passed back\r
54 or being asked for.\r
55\r
56Arguments:\r
57\r
58 KeyValue - A unique value which is sent to the original exporting driver so that it\r
59 can identify the type of data to expect. The format of the data tends to\r
60 vary based on the op-code that geerated the callback.\r
61\r
62 Data - A pointer to the data being sent to the original exporting driver.\r
63\r
64Returns:\r
65\r
66--*/\r
67{\r
62409219 68 CHAR16 *LanguageString;\r
69 UINTN Count;\r
70 CHAR16 UnicodeLang[3];\r
71 CHAR8 Lang[3];\r
72 EFI_STATUS Status;\r
73 UINTN Index;\r
74 CHAR16 *TmpStr;\r
bc11b829 75 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
76 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
77 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color;\r
78\r
79 SetMem (&Foreground, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);\r
80 SetMem (&Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0);\r
81 SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);\r
82\r
83 Count = 0;\r
84\r
85 //\r
86 // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can\r
87 // describe to their customers in documentation how to find their setup information (namely\r
88 // under the device manager and specific buckets)\r
89 //\r
90 switch (KeyValue) {\r
91 case 0x0001:\r
92 //\r
93 // This is the continue - clear the screen and return an error to get out of FrontPage loop\r
94 //\r
95 gCallbackKey = 1;\r
96 break;\r
97\r
98 case 0x1234:\r
99 //\r
100 // Collect the languages from what our current Language support is based on our VFR\r
101 //\r
d1477e4d 102 gHii->GetPrimaryLanguages (gHii, gFrontPageHandle, &LanguageString);\r
bc11b829 103\r
104 //\r
105 // Based on the DataArray->Data->Data value, we can determine\r
106 // which language was chosen by the user\r
107 //\r
108 for (Index = 0; Count != (UINTN) (((EFI_IFR_DATA_ENTRY *) (DataArray + 1))->Data); Index += 3) {\r
109 Count++;\r
110 }\r
111 //\r
112 // Preserve the choice the user made\r
113 //\r
114 mLastSelection = (UINT16) Count;\r
115\r
116 //\r
117 // The Language (in Unicode format) the user chose\r
118 //\r
119 CopyMem (UnicodeLang, &LanguageString[Index], 6);\r
120\r
121 //\r
122 // Convert Unicode to ASCII (Since the ISO standard assumes ASCII equivalent abbreviations\r
123 // we can be safe in converting this Unicode stream to ASCII without any loss in meaning.\r
124 //\r
125 for (Index = 0; Index < 3; Index++) {\r
126 Lang[Index] = (CHAR8) UnicodeLang[Index];\r
127 }\r
128\r
129 Status = gRT->SetVariable (\r
130 L"Lang",\r
131 &gEfiGlobalVariableGuid,\r
132 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
133 3,\r
134 Lang\r
135 );\r
136\r
137 FreePool (LanguageString);\r
138 gCallbackKey = 2;\r
139 break;\r
140\r
141 case 0x1064:\r
142 //\r
143 // Boot Manager\r
144 //\r
145 gCallbackKey = 3;\r
146 break;\r
147\r
148 case 0x8567:\r
149 //\r
150 // Device Manager\r
151 //\r
152 gCallbackKey = 4;\r
153 break;\r
154\r
155 case 0x9876:\r
156 //\r
157 // Boot Maintenance Manager\r
158 //\r
159 gCallbackKey = 5;\r
160 break;\r
161\r
162 case 0xFFFE:\r
163\r
164 break;\r
165\r
166 case 0xFFFF:\r
167 //\r
168 // FrontPage TimeOut Callback\r
169 //\r
170 TmpStr = GetStringById (STRING_TOKEN (STR_START_BOOT_OPTION));\r
171 if (TmpStr != NULL) {\r
172 PlatformBdsShowProgress (\r
173 Foreground,\r
174 Background,\r
175 TmpStr,\r
176 Color,\r
177 (UINTN) (((EFI_IFR_DATA_ENTRY *) (DataArray+1))->Data),\r
178 0\r
179 );\r
180 FreePool (TmpStr);\r
181 }\r
182 break;\r
183\r
184 default:\r
185 gCallbackKey = 0;\r
186 break;\r
187 }\r
188\r
189 return EFI_SUCCESS;\r
190}\r
191\r
192EFI_STATUS\r
193InitializeFrontPage (\r
194 BOOLEAN ReInitializeStrings\r
195 )\r
196/*++\r
197\r
198Routine Description:\r
199\r
200 Initialize HII information for the FrontPage\r
201\r
202Arguments:\r
203 None\r
204\r
205Returns:\r
206 EFI_SUCCESS - The operation is successful.\r
207 EFI_DEVICE_ERROR - If the dynamic opcode creation failed.\r
208\r
209--*/\r
210{\r
211 EFI_STATUS Status;\r
212 EFI_HII_PACKAGES *PackageList;\r
213 EFI_HII_UPDATE_DATA *UpdateData;\r
214 IFR_OPTION *OptionList;\r
215 CHAR16 *LanguageString;\r
216 UINTN OptionCount;\r
217 UINTN Index;\r
218 STRING_REF Token;\r
219 UINT16 Key;\r
220 CHAR8 AsciiLang[4];\r
221 CHAR16 UnicodeLang[4];\r
222 CHAR16 Lang[4];\r
223 CHAR16 *StringBuffer;\r
224 UINTN BufferSize;\r
225 UINT8 *TempBuffer;\r
226\r
227 UpdateData = NULL;\r
228 OptionList = NULL;\r
229\r
230 if (ReInitializeStrings) {\r
231 //\r
232 // BugBug: Dont' use a goto\r
233 //\r
234 goto ReInitStrings;\r
235 }\r
236 //\r
237 // Go ahead and initialize the Device Manager\r
238 //\r
239 InitializeDeviceManager ();\r
240\r
241 //\r
242 // BugBug: if FrontPageVfrBin is generated by a tool, why are we patching it here\r
243 //\r
244 TempBuffer = (UINT8 *) FrontPageVfrBin;\r
245 TempBuffer = TempBuffer + sizeof (EFI_HII_PACK_HEADER);\r
246 TempBuffer = (UINT8 *) &((EFI_IFR_FORM_SET *) TempBuffer)->NvDataSize;\r
247 *TempBuffer = 1;\r
248\r
249 gCallbackKey = 0;\r
250\r
d1477e4d 251 PackageList = PreparePackages (1, &gEfiCallerIdGuid, FrontPageVfrBin);\r
bc11b829 252\r
d1477e4d 253 Status = gHii->NewPack (gHii, PackageList, &gFrontPageHandle);\r
bc11b829 254\r
255 FreePool (PackageList);\r
256\r
257 //\r
258 // There will be only one FormConfig in the system\r
259 // If there is another out there, someone is trying to install us\r
260 // again. Fail that scenario.\r
261 //\r
262 Status = gBS->LocateProtocol (\r
263 &gEfiFormBrowserProtocolGuid,\r
264 NULL,\r
265 &gBrowser\r
266 );\r
267\r
268 //\r
269 // This example does not implement worker functions\r
270 // for the NV accessor functions. Only a callback evaluator\r
271 //\r
272 FrontPageCallback.NvRead = NULL;\r
273 FrontPageCallback.NvWrite = NULL;\r
274 FrontPageCallback.Callback = FrontPageCallbackRoutine;\r
275\r
276 //\r
277 // Install protocol interface\r
278 //\r
279 FrontPageCallbackHandle = NULL;\r
280 Status = gBS->InstallProtocolInterface (\r
281 &FrontPageCallbackHandle,\r
282 &gEfiFormCallbackProtocolGuid,\r
283 EFI_NATIVE_INTERFACE,\r
284 &FrontPageCallback\r
285 );\r
286 ASSERT_EFI_ERROR (Status);\r
287\r
288ReInitStrings:\r
289 //\r
290 // BugBug: This logic is in BdsInitLanguage. It should not be in two places!\r
291 //\r
292 BufferSize = 4;\r
293 Status = gRT->GetVariable (\r
294 L"Lang",\r
295 &gEfiGlobalVariableGuid,\r
296 NULL,\r
297 &BufferSize,\r
298 AsciiLang\r
299 );\r
300\r
301 for (Index = 0; Index < 3; Index++) {\r
302 UnicodeLang[Index] = (CHAR16) AsciiLang[Index];\r
303 }\r
304\r
305 UnicodeLang[3] = 0;\r
306\r
307 //\r
308 // Allocate space for creation of UpdateData Buffer\r
309 //\r
310 UpdateData = AllocateZeroPool (0x1000);\r
311 ASSERT (UpdateData != NULL);\r
312\r
313 OptionList = AllocateZeroPool (0x1000);\r
314 ASSERT (OptionList != NULL);\r
315\r
316 //\r
317 // Flag update pending in FormSet\r
318 //\r
319 UpdateData->FormSetUpdate = TRUE;\r
320 //\r
321 // Register CallbackHandle data for FormSet\r
322 //\r
323 UpdateData->FormCallbackHandle = (EFI_PHYSICAL_ADDRESS) (UINTN) FrontPageCallbackHandle;\r
324 UpdateData->FormUpdate = FALSE;\r
325 UpdateData->FormTitle = 0;\r
326 UpdateData->DataCount = 1;\r
327\r
328 //\r
329 // Collect the languages from what our current Language support is based on our VFR\r
330 //\r
d1477e4d 331 gHii->GetPrimaryLanguages (gHii, gFrontPageHandle, &LanguageString);\r
bc11b829 332\r
333 OptionCount = 0;\r
334\r
bc11b829 335 for (Index = 0; LanguageString[Index] != 0; Index += 3) {\r
336 Token = 0;\r
337 CopyMem (Lang, &LanguageString[Index], 6);\r
338 Lang[3] = 0;\r
339\r
340 if (!StrCmp (Lang, UnicodeLang)) {\r
341 mLastSelection = (UINT16) OptionCount;\r
342 }\r
343\r
6bfce83a 344 BufferSize = 0;\r
345 Status = gHii->GetString (gHii, gStringPackHandle, 1, TRUE, Lang, &BufferSize, NULL);\r
804604b6 346 ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
6bfce83a 347 StringBuffer = AllocateZeroPool (BufferSize);\r
348 ASSERT (StringBuffer != NULL);\r
d1477e4d 349 Status = gHii->GetString (gHii, gStringPackHandle, 1, TRUE, Lang, &BufferSize, StringBuffer);\r
804604b6 350 ASSERT_EFI_ERROR (Status);\r
d1477e4d 351 gHii->NewString (gHii, NULL, gStringPackHandle, &Token, StringBuffer);\r
6bfce83a 352 FreePool (StringBuffer);\r
bc11b829 353 CopyMem (&OptionList[OptionCount].StringToken, &Token, sizeof (UINT16));\r
354 CopyMem (&OptionList[OptionCount].Value, &OptionCount, sizeof (UINT16));\r
355 Key = 0x1234;\r
356 CopyMem (&OptionList[OptionCount].Key, &Key, sizeof (UINT16));\r
357 OptionList[OptionCount].Flags = EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS;\r
358 OptionCount++;\r
359 }\r
360\r
361 FreePool (LanguageString);\r
362\r
363 if (ReInitializeStrings) {\r
bc11b829 364 FreePool (OptionList);\r
365 return EFI_SUCCESS;\r
366 }\r
367\r
368 Status = CreateOneOfOpCode (\r
369 FRONT_PAGE_QUESTION_ID, // Question ID\r
370 FRONT_PAGE_DATA_WIDTH, // Data Width\r
371 (STRING_REF) STRING_TOKEN (STR_LANGUAGE_SELECT), // Prompt Token\r
372 (STRING_REF) STRING_TOKEN (STR_LANGUAGE_SELECT_HELP), // Help Token\r
373 OptionList, // List of Options\r
374 OptionCount, // Number of Options\r
375 &UpdateData->Data // Data Buffer\r
376 );\r
377\r
378 //\r
379 // Assign the number of options and the oneof and endoneof op-codes to count\r
380 //\r
381 UpdateData->DataCount = (UINT8) (OptionCount + 2);\r
382\r
d1477e4d 383 gHii->UpdateForm (gHii, gFrontPageHandle, (EFI_FORM_LABEL) 0x0002, TRUE, UpdateData);\r
bc11b829 384\r
385 FreePool (UpdateData);\r
804604b6 386 FreePool (OptionList);\r
bc11b829 387 return Status;\r
388}\r
389\r
390EFI_STATUS\r
391CallFrontPage (\r
392 VOID\r
393 )\r
394/*++\r
395\r
396Routine Description:\r
397\r
398 Call the browser and display the front page\r
399\r
400Arguments:\r
401\r
402 None\r
403\r
404Returns:\r
405\r
406--*/\r
407{\r
408 EFI_STATUS Status;\r
409 UINT8 FakeNvRamMap[1];\r
410 BOOLEAN FrontPageMenuResetRequired;\r
411\r
412 //\r
413 // Begin waiting for USER INPUT\r
414 //\r
415 REPORT_STATUS_CODE (\r
416 EFI_PROGRESS_CODE,\r
417 (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_INPUT_WAIT)\r
418 );\r
419\r
420 FakeNvRamMap[0] = (UINT8) mLastSelection;\r
421 FrontPageMenuResetRequired = FALSE;\r
422 Status = gBrowser->SendForm (\r
423 gBrowser,\r
424 TRUE, // Use the database\r
425 &gFrontPageHandle, // The HII Handle\r
426 1,\r
427 NULL,\r
428 FrontPageCallbackHandle, // This is the handle that the interface to the callback was installed on\r
429 FakeNvRamMap,\r
430 NULL,\r
431 &FrontPageMenuResetRequired\r
432 );\r
433 //\r
434 // Check whether user change any option setting which needs a reset to be effective\r
435 //\r
436 if (FrontPageMenuResetRequired) {\r
437 EnableResetRequired ();\r
438 }\r
439\r
d1477e4d 440 gHii->ResetStrings (gHii, gFrontPageHandle);\r
bc11b829 441\r
442 return Status;\r
443}\r
444\r
445EFI_STATUS\r
446GetStringFromToken (\r
447 IN EFI_GUID *ProducerGuid,\r
448 IN STRING_REF Token,\r
449 OUT CHAR16 **String\r
450 )\r
451/*++\r
452\r
453Routine Description:\r
454\r
455 Acquire the string associated with the ProducerGuid and return it.\r
456\r
457Arguments:\r
458\r
459 ProducerGuid - The Guid to search the HII database for\r
460 Token - The token value of the string to extract\r
461 String - The string that is extracted\r
462\r
463Returns:\r
464\r
465 EFI_SUCCESS - The function returns EFI_SUCCESS always.\r
466\r
467--*/\r
468{\r
469 EFI_STATUS Status;\r
470 UINT16 HandleBufferLength;\r
471 EFI_HII_HANDLE *HiiHandleBuffer;\r
472 UINTN StringBufferLength;\r
473 UINTN NumberOfHiiHandles;\r
474 UINTN Index;\r
475 UINT16 Length;\r
476 EFI_GUID HiiGuid;\r
477\r
478 //\r
479 // Initialize params.\r
480 //\r
481 HandleBufferLength = 0;\r
482 HiiHandleBuffer = NULL;\r
483\r
484 //\r
485 // Get all the Hii handles\r
486 //\r
d1477e4d 487 Status = BdsLibGetHiiHandles (gHii, &HandleBufferLength, &HiiHandleBuffer);\r
bc11b829 488 ASSERT_EFI_ERROR (Status);\r
489\r
490 //\r
d1477e4d 491 // Get the gHii Handle that matches the StructureNode->ProducerName\r
bc11b829 492 //\r
493 NumberOfHiiHandles = HandleBufferLength / sizeof (EFI_HII_HANDLE);\r
494 for (Index = 0; Index < NumberOfHiiHandles; Index++) {\r
495 Length = 0;\r
496 Status = ExtractDataFromHiiHandle (\r
497 HiiHandleBuffer[Index],\r
498 &Length,\r
499 NULL,\r
500 &HiiGuid\r
501 );\r
502 if (CompareGuid (ProducerGuid, &HiiGuid)) {\r
503 break;\r
504 }\r
505 }\r
506 //\r
507 // Find the string based on the current language\r
508 //\r
509 StringBufferLength = 0x100;\r
510 *String = AllocateZeroPool (0x100);\r
d1477e4d
A
511 Status = gHii->GetString (\r
512 gHii,\r
bc11b829 513 HiiHandleBuffer[Index],\r
514 Token,\r
515 FALSE,\r
516 NULL,\r
517 &StringBufferLength,\r
518 *String\r
519 );\r
520\r
521 if (EFI_ERROR (Status)) {\r
522 FreePool (*String);\r
523 *String = GetStringById (STRING_TOKEN (STR_MISSING_STRING));\r
524 }\r
525\r
526 FreePool (HiiHandleBuffer);\r
527 return EFI_SUCCESS;\r
528}\r
529\r
530VOID\r
531ConvertProcessorToString (\r
532 IN EFI_PROCESSOR_CORE_FREQUENCY_DATA *ProcessorFrequency,\r
533 OUT CHAR16 **String\r
534 )\r
535/*++\r
536\r
537Routine Description:\r
538\r
539 Convert Processor Frequency Data to a string\r
540\r
541Arguments:\r
542\r
543 ProcessorFrequency - The frequency data to process\r
544 String - The string that is created\r
545\r
546Returns:\r
547\r
548--*/\r
549{\r
550 CHAR16 *StringBuffer;\r
551 UINTN Index;\r
552 UINT32 FreqMhz;\r
553\r
554 if (ProcessorFrequency->Exponent >= 6) {\r
555 FreqMhz = ProcessorFrequency->Value;\r
556 for (Index = 0; Index < (UINTN) (ProcessorFrequency->Exponent - 6); Index++) {\r
557 FreqMhz *= 10;\r
558 }\r
559 } else {\r
560 FreqMhz = 0;\r
561 }\r
562\r
563 StringBuffer = AllocateZeroPool (0x20);\r
564 ASSERT (StringBuffer != NULL);\r
565 Index = UnicodeValueToString (StringBuffer, LEFT_JUSTIFY, FreqMhz / 1000, 3);\r
566 StrCat (StringBuffer, L".");\r
567 UnicodeValueToString (StringBuffer + Index + 1, PREFIX_ZERO, (FreqMhz % 1000) / 10, 2);\r
568 StrCat (StringBuffer, L" GHz");\r
569\r
570 *String = (CHAR16 *) StringBuffer;\r
571\r
572 return ;\r
573}\r
574\r
575VOID\r
576ConvertMemorySizeToString (\r
577 IN UINT32 MemorySize,\r
578 OUT CHAR16 **String\r
579 )\r
580/*++\r
581\r
582Routine Description:\r
583\r
584 Convert Memory Size to a string\r
585\r
586Arguments:\r
587\r
588 MemorySize - The size of the memory to process\r
589 String - The string that is created\r
590\r
591Returns:\r
592\r
593--*/\r
594{\r
595 CHAR16 *StringBuffer;\r
596\r
597 StringBuffer = AllocateZeroPool (0x20);\r
598 ASSERT (StringBuffer != NULL);\r
599 UnicodeValueToString (StringBuffer, LEFT_JUSTIFY, MemorySize, 6);\r
600 StrCat (StringBuffer, L" MB RAM");\r
601\r
602 *String = (CHAR16 *) StringBuffer;\r
603\r
604 return ;\r
605}\r
606\r
607VOID\r
608UpdateFrontPageStrings (\r
609 VOID\r
610 )\r
611/*++\r
612\r
613Routine Description:\r
614\r
615 Update the banner information for the Front Page based on DataHub information\r
616\r
617Arguments:\r
618\r
619 None\r
620\r
621Returns:\r
622\r
623--*/\r
624{\r
625 EFI_STATUS Status;\r
626 STRING_REF TokenToUpdate;\r
627 CHAR16 *NewString;\r
628 UINT64 MonotonicCount;\r
629 EFI_DATA_HUB_PROTOCOL *DataHub;\r
630 EFI_DATA_RECORD_HEADER *Record;\r
631 EFI_SUBCLASS_TYPE1_HEADER *DataHeader;\r
632 EFI_MISC_BIOS_VENDOR_DATA *BiosVendor;\r
633 EFI_MISC_SYSTEM_MANUFACTURER_DATA *SystemManufacturer;\r
634 EFI_PROCESSOR_VERSION_DATA *ProcessorVersion;\r
635 EFI_PROCESSOR_CORE_FREQUENCY_DATA *ProcessorFrequency;\r
636 EFI_MEMORY_ARRAY_START_ADDRESS_DATA *MemoryArray;\r
637 CHAR8 LangCode[3];\r
638 CHAR16 Lang[3];\r
639 UINTN Size;\r
640 UINTN Index;\r
641 BOOLEAN Find[5];\r
642\r
643 ZeroMem (Find, sizeof (Find));\r
644\r
645 //\r
646 // Update Front Page strings\r
647 //\r
648 Status = gBS->LocateProtocol (\r
649 &gEfiDataHubProtocolGuid,\r
650 NULL,\r
651 &DataHub\r
652 );\r
653 ASSERT_EFI_ERROR (Status);\r
654\r
655 Size = 3;\r
656\r
657 Status = gRT->GetVariable (\r
658 L"Lang",\r
659 &gEfiGlobalVariableGuid,\r
660 NULL,\r
661 &Size,\r
662 LangCode\r
663 );\r
664\r
665 for (Index = 0; Index < 3; Index++) {\r
666 Lang[Index] = (CHAR16) LangCode[Index];\r
667 }\r
668\r
669 MonotonicCount = 0;\r
670 Record = NULL;\r
671 do {\r
672 Status = DataHub->GetNextRecord (DataHub, &MonotonicCount, NULL, &Record);\r
673 if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {\r
674 DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *) (Record + 1);\r
675 if (CompareGuid (&Record->DataRecordGuid, &mMiscSubClass) &&\r
676 (DataHeader->RecordType == EFI_MISC_BIOS_VENDOR_RECORD_NUMBER)\r
677 ) {\r
678 BiosVendor = (EFI_MISC_BIOS_VENDOR_DATA *) (DataHeader + 1);\r
679 GetStringFromToken (&Record->ProducerName, BiosVendor->BiosVersion, &NewString);\r
680 TokenToUpdate = (STRING_REF) STR_FRONT_PAGE_BIOS_VERSION;\r
d1477e4d 681 gHii->NewString (gHii, Lang, gFrontPageHandle, &TokenToUpdate, NewString);\r
bc11b829 682 FreePool (NewString);\r
683 Find[0] = TRUE;\r
684 }\r
685\r
686 if (CompareGuid (&Record->DataRecordGuid, &mMiscSubClass) &&\r
687 (DataHeader->RecordType == EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER)\r
688 ) {\r
689 SystemManufacturer = (EFI_MISC_SYSTEM_MANUFACTURER_DATA *) (DataHeader + 1);\r
690 GetStringFromToken (&Record->ProducerName, SystemManufacturer->SystemProductName, &NewString);\r
691 TokenToUpdate = (STRING_REF) STR_FRONT_PAGE_COMPUTER_MODEL;\r
d1477e4d 692 gHii->NewString (gHii, Lang, gFrontPageHandle, &TokenToUpdate, NewString);\r
bc11b829 693 FreePool (NewString);\r
694 Find[1] = TRUE;\r
695 }\r
696\r
697 if (CompareGuid (&Record->DataRecordGuid, &mProcessorSubClass) &&\r
698 (DataHeader->RecordType == ProcessorVersionRecordType)\r
699 ) {\r
700 ProcessorVersion = (EFI_PROCESSOR_VERSION_DATA *) (DataHeader + 1);\r
701 GetStringFromToken (&Record->ProducerName, *ProcessorVersion, &NewString);\r
702 TokenToUpdate = (STRING_REF) STR_FRONT_PAGE_CPU_MODEL;\r
d1477e4d 703 gHii->NewString (gHii, Lang, gFrontPageHandle, &TokenToUpdate, NewString);\r
bc11b829 704 FreePool (NewString);\r
705 Find[2] = TRUE;\r
706 }\r
707\r
708 if (CompareGuid (&Record->DataRecordGuid, &mProcessorSubClass) &&\r
709 (DataHeader->RecordType == ProcessorCoreFrequencyRecordType)\r
710 ) {\r
711 ProcessorFrequency = (EFI_PROCESSOR_CORE_FREQUENCY_DATA *) (DataHeader + 1);\r
712 ConvertProcessorToString (ProcessorFrequency, &NewString);\r
713 TokenToUpdate = (STRING_REF) STR_FRONT_PAGE_CPU_SPEED;\r
d1477e4d 714 gHii->NewString (gHii, Lang, gFrontPageHandle, &TokenToUpdate, NewString);\r
bc11b829 715 FreePool (NewString);\r
716 Find[3] = TRUE;\r
717 }\r
718\r
719 if (CompareGuid (&Record->DataRecordGuid, &mMemorySubClass) &&\r
720 (DataHeader->RecordType == EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER)\r
721 ) {\r
722 MemoryArray = (EFI_MEMORY_ARRAY_START_ADDRESS_DATA *) (DataHeader + 1);\r
723 ConvertMemorySizeToString((UINT32)(RShiftU64((MemoryArray->MemoryArrayEndAddress -\r
724 MemoryArray->MemoryArrayStartAddress + 1), 20)),\r
725 &NewString);\r
726 TokenToUpdate = (STRING_REF) STR_FRONT_PAGE_MEMORY_SIZE;\r
d1477e4d 727 gHii->NewString (gHii, Lang, gFrontPageHandle, &TokenToUpdate, NewString);\r
bc11b829 728 FreePool (NewString);\r
729 Find[4] = TRUE;\r
730 }\r
731 }\r
732 } while (!EFI_ERROR (Status) && (MonotonicCount != 0) && !(Find[0] && Find[1] && Find[2] && Find[3] && Find[4]));\r
733\r
734 return ;\r
735}\r
736\r
737VOID\r
738PlatformBdsEnterFrontPage (\r
739 IN UINT16 TimeoutDefault,\r
740 IN BOOLEAN ConnectAllHappened\r
741 )\r
742/*++\r
743\r
744Routine Description:\r
745 This function is the main entry of the platform setup entry.\r
746 The function will present the main menu of the system setup,\r
747 this is the platform reference part and can be customize.\r
748\r
749Arguments:\r
750 TimeoutDefault - The fault time out value before the system\r
751 continue to boot.\r
752 ConnectAllHappened - The indicater to check if the connect all have\r
753 already happended.\r
754\r
755Returns:\r
756 None\r
757\r
758--*/\r
759{\r
760 EFI_STATUS Status;\r
761 EFI_HII_UPDATE_DATA *UpdateData;\r
762 EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl;\r
763\r
764 //\r
765 // Indicate if we need connect all in the platform setup\r
766 //\r
767 if (ConnectAllHappened) {\r
768 gConnectAllHappened = TRUE;\r
769 }\r
770 //\r
771 // Allocate space for creation of Buffer\r
772 //\r
773 UpdateData = AllocateZeroPool (0x1000);\r
774 ASSERT (UpdateData != NULL);\r
775\r
776 UpdateData->FormSetUpdate = FALSE;\r
777 UpdateData->FormCallbackHandle = 0;\r
778 UpdateData->FormUpdate = FALSE;\r
779 UpdateData->FormTitle = 0;\r
780 UpdateData->DataCount = 1;\r
781\r
782 //\r
783 // Remove Banner Op-code if any at this label\r
784 //\r
d1477e4d 785 gHii->UpdateForm (gHii, gFrontPageHandle, (EFI_FORM_LABEL) 0xFFFF, FALSE, UpdateData);\r
bc11b829 786\r
787 //\r
788 // Create Banner Op-code which reflects correct timeout value\r
789 //\r
790 CreateBannerOpCode (\r
791 STRING_TOKEN (STR_TIME_OUT_PROMPT),\r
792 TimeoutDefault,\r
793 (UINT8) EFI_IFR_BANNER_TIMEOUT,\r
794 &UpdateData->Data\r
795 );\r
796\r
797 //\r
798 // Add Banner Op-code at this label\r
799 //\r
d1477e4d 800 gHii->UpdateForm (gHii, gFrontPageHandle, (EFI_FORM_LABEL) 0xFFFF, TRUE, UpdateData);\r
bc11b829 801\r
802 do {\r
803\r
804 InitializeFrontPage (TRUE);\r
805\r
806 //\r
807 // Update Front Page strings\r
808 //\r
809 UpdateFrontPageStrings ();\r
810\r
811 gCallbackKey = 0;\r
812 PERF_START (0, "BdsTimeOut", "BDS", 0);\r
813 Status = CallFrontPage ();\r
814 PERF_END (0, "BdsTimeOut", "BDS", 0);\r
815\r
816 //\r
817 // If gCallbackKey is greater than 1 and less or equal to 5,\r
818 // it will lauch configuration utilities.\r
819 // 2 = set language\r
820 // 3 = boot manager\r
821 // 4 = device manager\r
822 // 5 = boot maintainenance manager\r
823 //\r
824 if ((gCallbackKey > 0x0001) && (gCallbackKey <= 0x0005)) {\r
825 REPORT_STATUS_CODE (\r
826 EFI_PROGRESS_CODE,\r
827 (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_USER_SETUP)\r
828 );\r
829 }\r
830 //\r
831 // Based on the key that was set, we can determine what to do\r
832 //\r
833 switch (gCallbackKey) {\r
834 //\r
835 // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can\r
836 // describe to their customers in documentation how to find their setup information (namely\r
837 // under the device manager and specific buckets)\r
838 //\r
839 // These entries consist of the Continue, Select language, Boot Manager, and Device Manager\r
840 //\r
841 case 0x0001:\r
842 //\r
843 // User hit continue\r
844 //\r
845 break;\r
846\r
847 case 0x0002:\r
848 //\r
849 // User made a language setting change - display front page again\r
850 //\r
851 break;\r
852\r
853 case 0x0003:\r
854 //\r
855 // User chose to run the Boot Manager\r
856 //\r
857 CallBootManager ();\r
858 break;\r
859\r
860 case 0x0004:\r
861 //\r
862 // Display the Device Manager\r
863 //\r
864 do {\r
865 CallDeviceManager();\r
866 } while (gCallbackKey == 4);\r
867 break;\r
868\r
869 case 0x0005:\r
870 //\r
871 // Display the Boot Maintenance Manager\r
872 //\r
873 BdsStartBootMaint ();\r
874 break;\r
875 }\r
876\r
877 } while ((Status == EFI_SUCCESS) && (gCallbackKey != 1));\r
878\r
879 //\r
880 //Will leave browser, check any reset required change is applied? if yes, reset system\r
881 //\r
882 SetupResetReminder ();\r
883\r
884 //\r
885 // Automatically load current entry\r
886 // Note: The following lines of code only execute when Auto boot\r
887 // takes affect\r
888 //\r
889 Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, &ConsoleControl);\r
890 ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenText);\r
891\r
892}\r