]> git.proxmox.com Git - mirror_edk2.git/blame - Nt32Pkg/PlatformBdsDxe/Generic/FrontPage.c
remove EFI_ACPI_30_TABLE_GUID and gEfiAcpi30TableGuid which is not defined in any...
[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
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
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
335 //\r
336 // Try for a 512 byte Buffer\r
337 //\r
338 BufferSize = 0x200;\r
339\r
340 //\r
341 // Allocate memory for our Form binary\r
342 //\r
343 StringBuffer = AllocateZeroPool (BufferSize);\r
344 ASSERT (StringBuffer != NULL);\r
345\r
346 for (Index = 0; LanguageString[Index] != 0; Index += 3) {\r
347 Token = 0;\r
348 CopyMem (Lang, &LanguageString[Index], 6);\r
349 Lang[3] = 0;\r
350\r
351 if (!StrCmp (Lang, UnicodeLang)) {\r
352 mLastSelection = (UINT16) OptionCount;\r
353 }\r
354\r
d1477e4d
A
355 Status = gHii->GetString (gHii, gStringPackHandle, 1, TRUE, Lang, &BufferSize, StringBuffer);\r
356 gHii->NewString (gHii, NULL, gStringPackHandle, &Token, StringBuffer);\r
bc11b829 357 CopyMem (&OptionList[OptionCount].StringToken, &Token, sizeof (UINT16));\r
358 CopyMem (&OptionList[OptionCount].Value, &OptionCount, sizeof (UINT16));\r
359 Key = 0x1234;\r
360 CopyMem (&OptionList[OptionCount].Key, &Key, sizeof (UINT16));\r
361 OptionList[OptionCount].Flags = EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS;\r
362 OptionCount++;\r
363 }\r
364\r
365 FreePool (LanguageString);\r
366\r
367 if (ReInitializeStrings) {\r
368 FreePool (StringBuffer);\r
369 FreePool (OptionList);\r
370 return EFI_SUCCESS;\r
371 }\r
372\r
373 Status = CreateOneOfOpCode (\r
374 FRONT_PAGE_QUESTION_ID, // Question ID\r
375 FRONT_PAGE_DATA_WIDTH, // Data Width\r
376 (STRING_REF) STRING_TOKEN (STR_LANGUAGE_SELECT), // Prompt Token\r
377 (STRING_REF) STRING_TOKEN (STR_LANGUAGE_SELECT_HELP), // Help Token\r
378 OptionList, // List of Options\r
379 OptionCount, // Number of Options\r
380 &UpdateData->Data // Data Buffer\r
381 );\r
382\r
383 //\r
384 // Assign the number of options and the oneof and endoneof op-codes to count\r
385 //\r
386 UpdateData->DataCount = (UINT8) (OptionCount + 2);\r
387\r
d1477e4d 388 gHii->UpdateForm (gHii, gFrontPageHandle, (EFI_FORM_LABEL) 0x0002, TRUE, UpdateData);\r
bc11b829 389\r
390 FreePool (UpdateData);\r
391 //\r
392 // FreePool (OptionList);\r
393 //\r
394 FreePool (StringBuffer);\r
395 return Status;\r
396}\r
397\r
398EFI_STATUS\r
399CallFrontPage (\r
400 VOID\r
401 )\r
402/*++\r
403\r
404Routine Description:\r
405\r
406 Call the browser and display the front page\r
407\r
408Arguments:\r
409\r
410 None\r
411\r
412Returns:\r
413\r
414--*/\r
415{\r
416 EFI_STATUS Status;\r
417 UINT8 FakeNvRamMap[1];\r
418 BOOLEAN FrontPageMenuResetRequired;\r
419\r
420 //\r
421 // Begin waiting for USER INPUT\r
422 //\r
423 REPORT_STATUS_CODE (\r
424 EFI_PROGRESS_CODE,\r
425 (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_INPUT_WAIT)\r
426 );\r
427\r
428 FakeNvRamMap[0] = (UINT8) mLastSelection;\r
429 FrontPageMenuResetRequired = FALSE;\r
430 Status = gBrowser->SendForm (\r
431 gBrowser,\r
432 TRUE, // Use the database\r
433 &gFrontPageHandle, // The HII Handle\r
434 1,\r
435 NULL,\r
436 FrontPageCallbackHandle, // This is the handle that the interface to the callback was installed on\r
437 FakeNvRamMap,\r
438 NULL,\r
439 &FrontPageMenuResetRequired\r
440 );\r
441 //\r
442 // Check whether user change any option setting which needs a reset to be effective\r
443 //\r
444 if (FrontPageMenuResetRequired) {\r
445 EnableResetRequired ();\r
446 }\r
447\r
d1477e4d 448 gHii->ResetStrings (gHii, gFrontPageHandle);\r
bc11b829 449\r
450 return Status;\r
451}\r
452\r
453EFI_STATUS\r
454GetStringFromToken (\r
455 IN EFI_GUID *ProducerGuid,\r
456 IN STRING_REF Token,\r
457 OUT CHAR16 **String\r
458 )\r
459/*++\r
460\r
461Routine Description:\r
462\r
463 Acquire the string associated with the ProducerGuid and return it.\r
464\r
465Arguments:\r
466\r
467 ProducerGuid - The Guid to search the HII database for\r
468 Token - The token value of the string to extract\r
469 String - The string that is extracted\r
470\r
471Returns:\r
472\r
473 EFI_SUCCESS - The function returns EFI_SUCCESS always.\r
474\r
475--*/\r
476{\r
477 EFI_STATUS Status;\r
478 UINT16 HandleBufferLength;\r
479 EFI_HII_HANDLE *HiiHandleBuffer;\r
480 UINTN StringBufferLength;\r
481 UINTN NumberOfHiiHandles;\r
482 UINTN Index;\r
483 UINT16 Length;\r
484 EFI_GUID HiiGuid;\r
485\r
486 //\r
487 // Initialize params.\r
488 //\r
489 HandleBufferLength = 0;\r
490 HiiHandleBuffer = NULL;\r
491\r
492 //\r
493 // Get all the Hii handles\r
494 //\r
d1477e4d 495 Status = BdsLibGetHiiHandles (gHii, &HandleBufferLength, &HiiHandleBuffer);\r
bc11b829 496 ASSERT_EFI_ERROR (Status);\r
497\r
498 //\r
d1477e4d 499 // Get the gHii Handle that matches the StructureNode->ProducerName\r
bc11b829 500 //\r
501 NumberOfHiiHandles = HandleBufferLength / sizeof (EFI_HII_HANDLE);\r
502 for (Index = 0; Index < NumberOfHiiHandles; Index++) {\r
503 Length = 0;\r
504 Status = ExtractDataFromHiiHandle (\r
505 HiiHandleBuffer[Index],\r
506 &Length,\r
507 NULL,\r
508 &HiiGuid\r
509 );\r
510 if (CompareGuid (ProducerGuid, &HiiGuid)) {\r
511 break;\r
512 }\r
513 }\r
514 //\r
515 // Find the string based on the current language\r
516 //\r
517 StringBufferLength = 0x100;\r
518 *String = AllocateZeroPool (0x100);\r
d1477e4d
A
519 Status = gHii->GetString (\r
520 gHii,\r
bc11b829 521 HiiHandleBuffer[Index],\r
522 Token,\r
523 FALSE,\r
524 NULL,\r
525 &StringBufferLength,\r
526 *String\r
527 );\r
528\r
529 if (EFI_ERROR (Status)) {\r
530 FreePool (*String);\r
531 *String = GetStringById (STRING_TOKEN (STR_MISSING_STRING));\r
532 }\r
533\r
534 FreePool (HiiHandleBuffer);\r
535 return EFI_SUCCESS;\r
536}\r
537\r
538VOID\r
539ConvertProcessorToString (\r
540 IN EFI_PROCESSOR_CORE_FREQUENCY_DATA *ProcessorFrequency,\r
541 OUT CHAR16 **String\r
542 )\r
543/*++\r
544\r
545Routine Description:\r
546\r
547 Convert Processor Frequency Data to a string\r
548\r
549Arguments:\r
550\r
551 ProcessorFrequency - The frequency data to process\r
552 String - The string that is created\r
553\r
554Returns:\r
555\r
556--*/\r
557{\r
558 CHAR16 *StringBuffer;\r
559 UINTN Index;\r
560 UINT32 FreqMhz;\r
561\r
562 if (ProcessorFrequency->Exponent >= 6) {\r
563 FreqMhz = ProcessorFrequency->Value;\r
564 for (Index = 0; Index < (UINTN) (ProcessorFrequency->Exponent - 6); Index++) {\r
565 FreqMhz *= 10;\r
566 }\r
567 } else {\r
568 FreqMhz = 0;\r
569 }\r
570\r
571 StringBuffer = AllocateZeroPool (0x20);\r
572 ASSERT (StringBuffer != NULL);\r
573 Index = UnicodeValueToString (StringBuffer, LEFT_JUSTIFY, FreqMhz / 1000, 3);\r
574 StrCat (StringBuffer, L".");\r
575 UnicodeValueToString (StringBuffer + Index + 1, PREFIX_ZERO, (FreqMhz % 1000) / 10, 2);\r
576 StrCat (StringBuffer, L" GHz");\r
577\r
578 *String = (CHAR16 *) StringBuffer;\r
579\r
580 return ;\r
581}\r
582\r
583VOID\r
584ConvertMemorySizeToString (\r
585 IN UINT32 MemorySize,\r
586 OUT CHAR16 **String\r
587 )\r
588/*++\r
589\r
590Routine Description:\r
591\r
592 Convert Memory Size to a string\r
593\r
594Arguments:\r
595\r
596 MemorySize - The size of the memory to process\r
597 String - The string that is created\r
598\r
599Returns:\r
600\r
601--*/\r
602{\r
603 CHAR16 *StringBuffer;\r
604\r
605 StringBuffer = AllocateZeroPool (0x20);\r
606 ASSERT (StringBuffer != NULL);\r
607 UnicodeValueToString (StringBuffer, LEFT_JUSTIFY, MemorySize, 6);\r
608 StrCat (StringBuffer, L" MB RAM");\r
609\r
610 *String = (CHAR16 *) StringBuffer;\r
611\r
612 return ;\r
613}\r
614\r
615VOID\r
616UpdateFrontPageStrings (\r
617 VOID\r
618 )\r
619/*++\r
620\r
621Routine Description:\r
622\r
623 Update the banner information for the Front Page based on DataHub information\r
624\r
625Arguments:\r
626\r
627 None\r
628\r
629Returns:\r
630\r
631--*/\r
632{\r
633 EFI_STATUS Status;\r
634 STRING_REF TokenToUpdate;\r
635 CHAR16 *NewString;\r
636 UINT64 MonotonicCount;\r
637 EFI_DATA_HUB_PROTOCOL *DataHub;\r
638 EFI_DATA_RECORD_HEADER *Record;\r
639 EFI_SUBCLASS_TYPE1_HEADER *DataHeader;\r
640 EFI_MISC_BIOS_VENDOR_DATA *BiosVendor;\r
641 EFI_MISC_SYSTEM_MANUFACTURER_DATA *SystemManufacturer;\r
642 EFI_PROCESSOR_VERSION_DATA *ProcessorVersion;\r
643 EFI_PROCESSOR_CORE_FREQUENCY_DATA *ProcessorFrequency;\r
644 EFI_MEMORY_ARRAY_START_ADDRESS_DATA *MemoryArray;\r
645 CHAR8 LangCode[3];\r
646 CHAR16 Lang[3];\r
647 UINTN Size;\r
648 UINTN Index;\r
649 BOOLEAN Find[5];\r
650\r
651 ZeroMem (Find, sizeof (Find));\r
652\r
653 //\r
654 // Update Front Page strings\r
655 //\r
656 Status = gBS->LocateProtocol (\r
657 &gEfiDataHubProtocolGuid,\r
658 NULL,\r
659 &DataHub\r
660 );\r
661 ASSERT_EFI_ERROR (Status);\r
662\r
663 Size = 3;\r
664\r
665 Status = gRT->GetVariable (\r
666 L"Lang",\r
667 &gEfiGlobalVariableGuid,\r
668 NULL,\r
669 &Size,\r
670 LangCode\r
671 );\r
672\r
673 for (Index = 0; Index < 3; Index++) {\r
674 Lang[Index] = (CHAR16) LangCode[Index];\r
675 }\r
676\r
677 MonotonicCount = 0;\r
678 Record = NULL;\r
679 do {\r
680 Status = DataHub->GetNextRecord (DataHub, &MonotonicCount, NULL, &Record);\r
681 if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {\r
682 DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *) (Record + 1);\r
683 if (CompareGuid (&Record->DataRecordGuid, &mMiscSubClass) &&\r
684 (DataHeader->RecordType == EFI_MISC_BIOS_VENDOR_RECORD_NUMBER)\r
685 ) {\r
686 BiosVendor = (EFI_MISC_BIOS_VENDOR_DATA *) (DataHeader + 1);\r
687 GetStringFromToken (&Record->ProducerName, BiosVendor->BiosVersion, &NewString);\r
688 TokenToUpdate = (STRING_REF) STR_FRONT_PAGE_BIOS_VERSION;\r
d1477e4d 689 gHii->NewString (gHii, Lang, gFrontPageHandle, &TokenToUpdate, NewString);\r
bc11b829 690 FreePool (NewString);\r
691 Find[0] = TRUE;\r
692 }\r
693\r
694 if (CompareGuid (&Record->DataRecordGuid, &mMiscSubClass) &&\r
695 (DataHeader->RecordType == EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER)\r
696 ) {\r
697 SystemManufacturer = (EFI_MISC_SYSTEM_MANUFACTURER_DATA *) (DataHeader + 1);\r
698 GetStringFromToken (&Record->ProducerName, SystemManufacturer->SystemProductName, &NewString);\r
699 TokenToUpdate = (STRING_REF) STR_FRONT_PAGE_COMPUTER_MODEL;\r
d1477e4d 700 gHii->NewString (gHii, Lang, gFrontPageHandle, &TokenToUpdate, NewString);\r
bc11b829 701 FreePool (NewString);\r
702 Find[1] = TRUE;\r
703 }\r
704\r
705 if (CompareGuid (&Record->DataRecordGuid, &mProcessorSubClass) &&\r
706 (DataHeader->RecordType == ProcessorVersionRecordType)\r
707 ) {\r
708 ProcessorVersion = (EFI_PROCESSOR_VERSION_DATA *) (DataHeader + 1);\r
709 GetStringFromToken (&Record->ProducerName, *ProcessorVersion, &NewString);\r
710 TokenToUpdate = (STRING_REF) STR_FRONT_PAGE_CPU_MODEL;\r
d1477e4d 711 gHii->NewString (gHii, Lang, gFrontPageHandle, &TokenToUpdate, NewString);\r
bc11b829 712 FreePool (NewString);\r
713 Find[2] = TRUE;\r
714 }\r
715\r
716 if (CompareGuid (&Record->DataRecordGuid, &mProcessorSubClass) &&\r
717 (DataHeader->RecordType == ProcessorCoreFrequencyRecordType)\r
718 ) {\r
719 ProcessorFrequency = (EFI_PROCESSOR_CORE_FREQUENCY_DATA *) (DataHeader + 1);\r
720 ConvertProcessorToString (ProcessorFrequency, &NewString);\r
721 TokenToUpdate = (STRING_REF) STR_FRONT_PAGE_CPU_SPEED;\r
d1477e4d 722 gHii->NewString (gHii, Lang, gFrontPageHandle, &TokenToUpdate, NewString);\r
bc11b829 723 FreePool (NewString);\r
724 Find[3] = TRUE;\r
725 }\r
726\r
727 if (CompareGuid (&Record->DataRecordGuid, &mMemorySubClass) &&\r
728 (DataHeader->RecordType == EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER)\r
729 ) {\r
730 MemoryArray = (EFI_MEMORY_ARRAY_START_ADDRESS_DATA *) (DataHeader + 1);\r
731 ConvertMemorySizeToString((UINT32)(RShiftU64((MemoryArray->MemoryArrayEndAddress -\r
732 MemoryArray->MemoryArrayStartAddress + 1), 20)),\r
733 &NewString);\r
734 TokenToUpdate = (STRING_REF) STR_FRONT_PAGE_MEMORY_SIZE;\r
d1477e4d 735 gHii->NewString (gHii, Lang, gFrontPageHandle, &TokenToUpdate, NewString);\r
bc11b829 736 FreePool (NewString);\r
737 Find[4] = TRUE;\r
738 }\r
739 }\r
740 } while (!EFI_ERROR (Status) && (MonotonicCount != 0) && !(Find[0] && Find[1] && Find[2] && Find[3] && Find[4]));\r
741\r
742 return ;\r
743}\r
744\r
745VOID\r
746PlatformBdsEnterFrontPage (\r
747 IN UINT16 TimeoutDefault,\r
748 IN BOOLEAN ConnectAllHappened\r
749 )\r
750/*++\r
751\r
752Routine Description:\r
753 This function is the main entry of the platform setup entry.\r
754 The function will present the main menu of the system setup,\r
755 this is the platform reference part and can be customize.\r
756\r
757Arguments:\r
758 TimeoutDefault - The fault time out value before the system\r
759 continue to boot.\r
760 ConnectAllHappened - The indicater to check if the connect all have\r
761 already happended.\r
762\r
763Returns:\r
764 None\r
765\r
766--*/\r
767{\r
768 EFI_STATUS Status;\r
769 EFI_HII_UPDATE_DATA *UpdateData;\r
770 EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl;\r
771\r
772 //\r
773 // Indicate if we need connect all in the platform setup\r
774 //\r
775 if (ConnectAllHappened) {\r
776 gConnectAllHappened = TRUE;\r
777 }\r
778 //\r
779 // Allocate space for creation of Buffer\r
780 //\r
781 UpdateData = AllocateZeroPool (0x1000);\r
782 ASSERT (UpdateData != NULL);\r
783\r
784 UpdateData->FormSetUpdate = FALSE;\r
785 UpdateData->FormCallbackHandle = 0;\r
786 UpdateData->FormUpdate = FALSE;\r
787 UpdateData->FormTitle = 0;\r
788 UpdateData->DataCount = 1;\r
789\r
790 //\r
791 // Remove Banner Op-code if any at this label\r
792 //\r
d1477e4d 793 gHii->UpdateForm (gHii, gFrontPageHandle, (EFI_FORM_LABEL) 0xFFFF, FALSE, UpdateData);\r
bc11b829 794\r
795 //\r
796 // Create Banner Op-code which reflects correct timeout value\r
797 //\r
798 CreateBannerOpCode (\r
799 STRING_TOKEN (STR_TIME_OUT_PROMPT),\r
800 TimeoutDefault,\r
801 (UINT8) EFI_IFR_BANNER_TIMEOUT,\r
802 &UpdateData->Data\r
803 );\r
804\r
805 //\r
806 // Add Banner Op-code at this label\r
807 //\r
d1477e4d 808 gHii->UpdateForm (gHii, gFrontPageHandle, (EFI_FORM_LABEL) 0xFFFF, TRUE, UpdateData);\r
bc11b829 809\r
810 do {\r
811\r
812 InitializeFrontPage (TRUE);\r
813\r
814 //\r
815 // Update Front Page strings\r
816 //\r
817 UpdateFrontPageStrings ();\r
818\r
819 gCallbackKey = 0;\r
820 PERF_START (0, "BdsTimeOut", "BDS", 0);\r
821 Status = CallFrontPage ();\r
822 PERF_END (0, "BdsTimeOut", "BDS", 0);\r
823\r
824 //\r
825 // If gCallbackKey is greater than 1 and less or equal to 5,\r
826 // it will lauch configuration utilities.\r
827 // 2 = set language\r
828 // 3 = boot manager\r
829 // 4 = device manager\r
830 // 5 = boot maintainenance manager\r
831 //\r
832 if ((gCallbackKey > 0x0001) && (gCallbackKey <= 0x0005)) {\r
833 REPORT_STATUS_CODE (\r
834 EFI_PROGRESS_CODE,\r
835 (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_USER_SETUP)\r
836 );\r
837 }\r
838 //\r
839 // Based on the key that was set, we can determine what to do\r
840 //\r
841 switch (gCallbackKey) {\r
842 //\r
843 // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can\r
844 // describe to their customers in documentation how to find their setup information (namely\r
845 // under the device manager and specific buckets)\r
846 //\r
847 // These entries consist of the Continue, Select language, Boot Manager, and Device Manager\r
848 //\r
849 case 0x0001:\r
850 //\r
851 // User hit continue\r
852 //\r
853 break;\r
854\r
855 case 0x0002:\r
856 //\r
857 // User made a language setting change - display front page again\r
858 //\r
859 break;\r
860\r
861 case 0x0003:\r
862 //\r
863 // User chose to run the Boot Manager\r
864 //\r
865 CallBootManager ();\r
866 break;\r
867\r
868 case 0x0004:\r
869 //\r
870 // Display the Device Manager\r
871 //\r
872 do {\r
873 CallDeviceManager();\r
874 } while (gCallbackKey == 4);\r
875 break;\r
876\r
877 case 0x0005:\r
878 //\r
879 // Display the Boot Maintenance Manager\r
880 //\r
881 BdsStartBootMaint ();\r
882 break;\r
883 }\r
884\r
885 } while ((Status == EFI_SUCCESS) && (gCallbackKey != 1));\r
886\r
887 //\r
888 //Will leave browser, check any reset required change is applied? if yes, reset system\r
889 //\r
890 SetupResetReminder ();\r
891\r
892 //\r
893 // Automatically load current entry\r
894 // Note: The following lines of code only execute when Auto boot\r
895 // takes affect\r
896 //\r
897 Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, &ConsoleControl);\r
898 ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenText);\r
899\r
900}\r