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