]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/BdsDxe/FrontPage.c
1) Cleanup HiiLib, IfrSupportLib.
[mirror_edk2.git] / MdeModulePkg / Universal / BdsDxe / FrontPage.c
CommitLineData
93e3992d 1/*++\r
2\r
3Copyright (c) 2004 - 2008, 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#include "Bds.h"\r
23#include "FrontPage.h"\r
24\r
25EFI_GUID mFrontPageGuid = FRONT_PAGE_FORMSET_GUID;\r
26\r
27BOOLEAN gConnectAllHappened = FALSE;\r
28UINTN gCallbackKey;\r
29\r
30EFI_HII_DATABASE_PROTOCOL *gHiiDatabase;\r
31EFI_HII_STRING_PROTOCOL *gHiiString;\r
32EFI_FORM_BROWSER2_PROTOCOL *gFormBrowser2;\r
33EFI_HII_CONFIG_ROUTING_PROTOCOL *gHiiConfigRouting;\r
34\r
35FRONT_PAGE_CALLBACK_DATA gFrontPagePrivate = {\r
36 FRONT_PAGE_CALLBACK_DATA_SIGNATURE,\r
37 NULL,\r
38 NULL,\r
39 NULL,\r
40 {\r
41 FakeExtractConfig,\r
42 FakeRouteConfig,\r
43 FrontPageCallback\r
44 }\r
45};\r
46\r
47EFI_STATUS\r
48EFIAPI\r
49FakeExtractConfig (\r
50 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
51 IN CONST EFI_STRING Request,\r
52 OUT EFI_STRING *Progress,\r
53 OUT EFI_STRING *Results\r
54 )\r
55/*++\r
56\r
57 Routine Description:\r
58 This function allows a caller to extract the current configuration for one\r
59 or more named elements from the target driver.\r
60\r
61 Arguments:\r
62 This - Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
63 Request - A null-terminated Unicode string in <ConfigRequest> format.\r
64 Progress - On return, points to a character in the Request string.\r
65 Points to the string's null terminator if request was successful.\r
66 Points to the most recent '&' before the first failing name/value\r
67 pair (or the beginning of the string if the failure is in the\r
68 first name/value pair) if the request was not successful.\r
69 Results - A null-terminated Unicode string in <ConfigAltResp> format which\r
70 has all values filled in for the names in the Request string.\r
71 String to be allocated by the called function.\r
72\r
73 Returns:\r
74 EFI_SUCCESS - The Results is filled with the requested values.\r
75 EFI_OUT_OF_RESOURCES - Not enough memory to store the results.\r
76 EFI_INVALID_PARAMETER - Request is NULL, illegal syntax, or unknown name.\r
77 EFI_NOT_FOUND - Routing data doesn't match any storage in this driver.\r
78\r
79--*/\r
80{\r
81 return EFI_NOT_FOUND;\r
82}\r
83\r
84EFI_STATUS\r
85EFIAPI\r
86FakeRouteConfig (\r
87 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
88 IN CONST EFI_STRING Configuration,\r
89 OUT EFI_STRING *Progress\r
90 )\r
91/*++\r
92\r
93 Routine Description:\r
94 This function processes the results of changes in configuration.\r
95\r
96 Arguments:\r
97 This - Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
98 Configuration - A null-terminated Unicode string in <ConfigResp> format.\r
99 Progress - A pointer to a string filled in with the offset of the most\r
100 recent '&' before the first failing name/value pair (or the\r
101 beginning of the string if the failure is in the first\r
102 name/value pair) or the terminating NULL if all was successful.\r
103\r
104 Returns:\r
105 EFI_SUCCESS - The Results is processed successfully.\r
106 EFI_INVALID_PARAMETER - Configuration is NULL.\r
107 EFI_NOT_FOUND - Routing data doesn't match any storage in this driver.\r
108\r
109--*/\r
110{\r
111 return EFI_SUCCESS;\r
112}\r
113\r
114EFI_STATUS\r
115EFIAPI\r
116FrontPageCallback (\r
117 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
118 IN EFI_BROWSER_ACTION Action,\r
119 IN EFI_QUESTION_ID QuestionId,\r
120 IN UINT8 Type,\r
121 IN EFI_IFR_TYPE_VALUE *Value,\r
122 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
123 )\r
124/*++\r
125\r
126 Routine Description:\r
127 This function processes the results of changes in configuration.\r
128\r
129 Arguments:\r
130 This - Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
131 Action - Specifies the type of action taken by the browser.\r
132 QuestionId - A unique value which is sent to the original exporting driver\r
133 so that it can identify the type of data to expect.\r
134 Type - The type of value for the question.\r
135 Value - A pointer to the data being sent to the original exporting driver.\r
136 ActionRequest - On return, points to the action requested by the callback function.\r
137\r
138 Returns:\r
139 EFI_SUCCESS - The callback successfully handled the action.\r
140 EFI_OUT_OF_RESOURCES - Not enough storage is available to hold the variable and its data.\r
141 EFI_DEVICE_ERROR - The variable could not be saved.\r
142 EFI_UNSUPPORTED - The specified Action is not supported by the callback.\r
143\r
144--*/\r
145{\r
146 CHAR8 *LanguageString;\r
147 CHAR8 *LangCode;\r
148 CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
149#ifdef LANG_SUPPORT\r
150 CHAR8 OldLang[ISO_639_2_ENTRY_SIZE];\r
151#endif\r
152 UINTN Index;\r
153 EFI_STATUS Status;\r
154\r
155 if ((Value == NULL) || (ActionRequest == NULL)) {\r
156 return EFI_INVALID_PARAMETER;\r
157 }\r
158\r
159 gCallbackKey = QuestionId;\r
160\r
161 //\r
162 // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can\r
163 // describe to their customers in documentation how to find their setup information (namely\r
164 // under the device manager and specific buckets)\r
165 //\r
166 switch (QuestionId) {\r
167 case FRONT_PAGE_KEY_CONTINUE:\r
168 //\r
169 // This is the continue - clear the screen and return an error to get out of FrontPage loop\r
170 //\r
171 break;\r
172\r
173 case FRONT_PAGE_KEY_LANGUAGE:\r
174 //\r
175 // Collect the languages from what our current Language support is based on our VFR\r
176 //\r
9226efe5 177 LanguageString = HiiLibGetSupportedLanguages (gFrontPagePrivate.HiiHandle);\r
93e3992d 178 ASSERT (LanguageString != NULL);\r
179\r
180 Index = 0;\r
181 LangCode = LanguageString;\r
182 while (*LangCode != 0) {\r
9226efe5 183 HiiLibGetNextLanguage (&LangCode, Lang);\r
93e3992d 184\r
185 if (Index == Value->u8) {\r
186 break;\r
187 }\r
188\r
189 Index++;\r
190 }\r
191\r
192 Status = gRT->SetVariable (\r
193 L"PlatformLang",\r
194 &gEfiGlobalVariableGuid,\r
195 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
196 AsciiStrSize (Lang),\r
197 Lang\r
198 );\r
199\r
200#ifdef LANG_SUPPORT\r
201 //\r
202 // Set UEFI deprecated variable "Lang" for backwards compatibility\r
203 //\r
204 Status = ConvertRfc3066LanguageToIso639Language (Lang, OldLang);\r
205 if (!EFI_ERROR (Status)) {\r
206 Status = gRT->SetVariable (\r
207 L"Lang",\r
208 &gEfiGlobalVariableGuid,\r
209 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
210 ISO_639_2_ENTRY_SIZE,\r
211 OldLang\r
212 );\r
213 }\r
214#endif\r
215\r
216 FreePool (LanguageString);\r
217 break;\r
218\r
219 case FRONT_PAGE_KEY_BOOT_MANAGER:\r
220 //\r
221 // Boot Manager\r
222 //\r
223 break;\r
224\r
225 case FRONT_PAGE_KEY_DEVICE_MANAGER:\r
226 //\r
227 // Device Manager\r
228 //\r
229 break;\r
230\r
231 case FRONT_PAGE_KEY_BOOT_MAINTAIN:\r
232 //\r
233 // Boot Maintenance Manager\r
234 //\r
235 break;\r
236\r
237 default:\r
238 gCallbackKey = 0;\r
239 break;\r
240 }\r
241\r
242 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
243\r
244 return EFI_SUCCESS;\r
245}\r
246\r
247EFI_STATUS\r
248InitializeFrontPage (\r
249 BOOLEAN ReInitializeStrings\r
250 )\r
251/*++\r
252\r
253Routine Description:\r
254 Initialize HII information for the FrontPage\r
255\r
256Arguments:\r
257 None\r
258\r
259Returns:\r
260 EFI_SUCCESS - The operation is successful.\r
261 EFI_DEVICE_ERROR - If the dynamic opcode creation failed.\r
262\r
263--*/\r
264{\r
265 EFI_STATUS Status;\r
266 EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
267 EFI_HII_UPDATE_DATA UpdateData;\r
268 IFR_OPTION *OptionList;\r
269 CHAR8 *LanguageString;\r
270 CHAR8 *LangCode;\r
271 CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
272 CHAR8 CurrentLang[RFC_3066_ENTRY_SIZE];\r
273 UINTN OptionCount;\r
274 EFI_STRING_ID Token;\r
275 CHAR16 *StringBuffer;\r
276 UINTN BufferSize;\r
277 UINTN Index;\r
278 EFI_HII_HANDLE HiiHandle;\r
279\r
280 if (!ReInitializeStrings) {\r
281 //\r
282 // Initialize the Device Manager\r
283 //\r
284 InitializeDeviceManager ();\r
285\r
286 //\r
287 // Initialize the Device Manager\r
288 //\r
289 InitializeBootManager ();\r
290\r
291 gCallbackKey = 0;\r
292\r
293 //\r
294 // Locate Hii relative protocols\r
295 //\r
296 Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &gHiiDatabase);\r
297 if (EFI_ERROR (Status)) {\r
298 return Status;\r
299 }\r
300\r
301 Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &gHiiString);\r
302 if (EFI_ERROR (Status)) {\r
303 return Status;\r
304 }\r
305\r
306 Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &gFormBrowser2);\r
307 if (EFI_ERROR (Status)) {\r
308 return Status;\r
309 }\r
310\r
311 Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **) &gHiiConfigRouting);\r
312 if (EFI_ERROR (Status)) {\r
313 return Status;\r
314 }\r
315\r
316 //\r
317 // Create driver handle used by HII database\r
318 //\r
319 Status = HiiLibCreateHiiDriverHandle (&gFrontPagePrivate.DriverHandle);\r
320 if (EFI_ERROR (Status)) {\r
321 return Status;\r
322 }\r
323\r
324 //\r
325 // Install Config Access protocol to driver handle\r
326 //\r
327 Status = gBS->InstallProtocolInterface (\r
328 &gFrontPagePrivate.DriverHandle,\r
329 &gEfiHiiConfigAccessProtocolGuid,\r
330 EFI_NATIVE_INTERFACE,\r
331 &gFrontPagePrivate.ConfigAccess\r
332 );\r
333 ASSERT_EFI_ERROR (Status);\r
334\r
335 //\r
336 // Publish our HII data\r
337 //\r
9226efe5 338 PackageList = HiiLibPreparePackageList (2, &mFrontPageGuid, FrontPageVfrBin, BdsStrings);\r
93e3992d 339 ASSERT (PackageList != NULL);\r
340\r
341 Status = gHiiDatabase->NewPackageList (\r
342 gHiiDatabase,\r
343 PackageList,\r
344 gFrontPagePrivate.DriverHandle,\r
345 &gFrontPagePrivate.HiiHandle\r
346 );\r
347 FreePool (PackageList);\r
348 if (EFI_ERROR (Status)) {\r
349 return Status;\r
350 }\r
351 }\r
352\r
353 //\r
354 // Get current language setting\r
355 //\r
9226efe5 356 HiiLibGetCurrentLanguage (CurrentLang);\r
93e3992d 357\r
358 //\r
359 // Allocate space for creation of UpdateData Buffer\r
360 //\r
361 UpdateData.BufferSize = 0x1000;\r
362 UpdateData.Data = AllocateZeroPool (0x1000);\r
363 ASSERT (UpdateData.Data != NULL);\r
364\r
365 OptionList = AllocateZeroPool (0x1000);\r
366 ASSERT (OptionList != NULL);\r
367\r
368 //\r
369 // Collect the languages from what our current Language support is based on our VFR\r
370 //\r
371 HiiHandle = gFrontPagePrivate.HiiHandle;\r
9226efe5 372 LanguageString = HiiLibGetSupportedLanguages (HiiHandle);\r
93e3992d 373 ASSERT (LanguageString != NULL);\r
374\r
375 OptionCount = 0;\r
376 LangCode = LanguageString;\r
377 while (*LangCode != 0) {\r
9226efe5 378 HiiLibGetNextLanguage (&LangCode, Lang);\r
93e3992d 379\r
380 if (gFrontPagePrivate.LanguageToken == NULL) {\r
381 //\r
382 // Get Language Name from String Package. The StringId of Printable Language\r
383 // Name is always 1 which is generated by StringGather Tool.\r
384 //\r
385 BufferSize = 0x100;\r
386 StringBuffer = AllocatePool (BufferSize);\r
387 Status = gHiiString->GetString (\r
388 gHiiString,\r
389 Lang,\r
390 HiiHandle,\r
391 PRINTABLE_LANGUAGE_NAME_STRING_ID,\r
392 StringBuffer,\r
393 &BufferSize,\r
394 NULL\r
395 );\r
396 if (Status == EFI_BUFFER_TOO_SMALL) {\r
397 FreePool (StringBuffer);\r
398 StringBuffer = AllocatePool (BufferSize);\r
399 Status = gHiiString->GetString (\r
400 gHiiString,\r
401 Lang,\r
402 HiiHandle,\r
403 PRINTABLE_LANGUAGE_NAME_STRING_ID,\r
404 StringBuffer,\r
405 &BufferSize,\r
406 NULL\r
407 );\r
408 }\r
409 ASSERT_EFI_ERROR (Status);\r
410\r
411 Token = 0;\r
9226efe5 412 Status = HiiLibNewString (HiiHandle, &Token, StringBuffer);\r
93e3992d 413 FreePool (StringBuffer);\r
414 } else {\r
415 Token = gFrontPagePrivate.LanguageToken[OptionCount];\r
416 }\r
417\r
418 if (AsciiStrCmp (Lang, CurrentLang) == 0) {\r
419 OptionList[OptionCount].Flags = EFI_IFR_OPTION_DEFAULT;\r
420 } else {\r
421 OptionList[OptionCount].Flags = 0;\r
422 }\r
423 OptionList[OptionCount].StringToken = Token;\r
424 OptionList[OptionCount].Value.u8 = (UINT8) OptionCount;\r
425\r
426 OptionCount++;\r
427 }\r
428\r
429 FreePool (LanguageString);\r
430\r
431 UpdateData.Offset = 0;\r
432 CreateOneOfOpCode (\r
433 FRONT_PAGE_KEY_LANGUAGE,\r
434 0,\r
435 0,\r
436 STRING_TOKEN (STR_LANGUAGE_SELECT),\r
437 STRING_TOKEN (STR_LANGUAGE_SELECT_HELP),\r
438 EFI_IFR_FLAG_CALLBACK,\r
439 EFI_IFR_NUMERIC_SIZE_1,\r
440 OptionList,\r
441 OptionCount,\r
442 &UpdateData\r
443 );\r
444\r
445 Status = IfrLibUpdateForm (\r
446 HiiHandle,\r
447 &mFrontPageGuid,\r
448 FRONT_PAGE_FORM_ID,\r
449 LABEL_SELECT_LANGUAGE,\r
450 FALSE,\r
451 &UpdateData\r
452 );\r
453\r
454 //\r
455 // Save the string Id for each language\r
456 //\r
457 gFrontPagePrivate.LanguageToken = AllocatePool (OptionCount * sizeof (EFI_STRING_ID));\r
458 ASSERT (gFrontPagePrivate.LanguageToken != NULL);\r
459 for (Index = 0; Index < OptionCount; Index++) {\r
460 gFrontPagePrivate.LanguageToken[Index] = OptionList[Index].StringToken;\r
461 }\r
462\r
463 FreePool (UpdateData.Data);\r
464 FreePool (OptionList);\r
465 return Status;\r
466}\r
467\r
468EFI_STATUS\r
469CallFrontPage (\r
470 VOID\r
471 )\r
472/*++\r
473\r
474Routine Description:\r
475 Call the browser and display the front page\r
476\r
477Arguments:\r
478 None\r
479\r
480Returns:\r
481\r
482--*/\r
483{\r
484 EFI_STATUS Status;\r
485 EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
486\r
487 //\r
488 // Begin waiting for USER INPUT\r
489 //\r
490 REPORT_STATUS_CODE (\r
491 EFI_PROGRESS_CODE,\r
492 (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_INPUT_WAIT)\r
493 );\r
494\r
495\r
496 //\r
497 // Drop the TPL level from TPL_APPLICATION to TPL_APPLICATION\r
498 //\r
499 gBS->RestoreTPL (TPL_APPLICATION);\r
500\r
501 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
502 Status = gFormBrowser2->SendForm (\r
503 gFormBrowser2,\r
504 &gFrontPagePrivate.HiiHandle,\r
505 1,\r
506 NULL,\r
507 0,\r
508 NULL,\r
509 &ActionRequest\r
510 );\r
511 //\r
512 // Check whether user change any option setting which needs a reset to be effective\r
513 //\r
514 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
515 EnableResetRequired ();\r
516 }\r
517\r
518 gBS->RaiseTPL (TPL_APPLICATION);\r
519 return Status;\r
520}\r
521\r
522EFI_STATUS\r
523GetProducerString (\r
524 IN EFI_GUID *ProducerGuid,\r
525 IN EFI_STRING_ID Token,\r
526 OUT CHAR16 **String\r
527 )\r
528/*++\r
529\r
530Routine Description:\r
531 Acquire the string associated with the ProducerGuid and return it.\r
532\r
533Arguments:\r
534 ProducerGuid - The Guid to search the HII database for\r
535 Token - The token value of the string to extract\r
536 String - The string that is extracted\r
537\r
538Returns:\r
539 EFI_SUCCESS - The function returns EFI_SUCCESS always.\r
540\r
541--*/\r
542{\r
543 EFI_STATUS Status;\r
544\r
9226efe5 545 Status = HiiLibGetStringFromToken (ProducerGuid, Token, String);\r
93e3992d 546 if (EFI_ERROR (Status)) {\r
547 *String = GetStringById (STRING_TOKEN (STR_MISSING_STRING));\r
548 }\r
549\r
550 return EFI_SUCCESS;\r
551}\r
552\r
553VOID\r
554ConvertProcessorToString (\r
555 IN EFI_PROCESSOR_CORE_FREQUENCY_DATA *ProcessorFrequency,\r
556 OUT CHAR16 **String\r
557 )\r
558/*++\r
559\r
560Routine Description:\r
561 Convert Processor Frequency Data to a string\r
562\r
563Arguments:\r
564 ProcessorFrequency - The frequency data to process\r
565 String - The string that is created\r
566\r
567Returns:\r
568\r
569--*/\r
570{\r
571 CHAR16 *StringBuffer;\r
572 UINTN Index;\r
573 UINT32 FreqMhz;\r
574\r
575 if (ProcessorFrequency->Exponent >= 6) {\r
576 FreqMhz = ProcessorFrequency->Value;\r
577 for (Index = 0; Index < (UINTN) (ProcessorFrequency->Exponent - 6); Index++) {\r
578 FreqMhz *= 10;\r
579 }\r
580 } else {\r
581 FreqMhz = 0;\r
582 }\r
583\r
584 StringBuffer = AllocateZeroPool (0x20);\r
585 ASSERT (StringBuffer != NULL);\r
586 Index = UnicodeValueToString (StringBuffer, LEFT_JUSTIFY, FreqMhz / 1000, 3);\r
587 StrCat (StringBuffer, L".");\r
588 UnicodeValueToString (StringBuffer + Index + 1, PREFIX_ZERO, (FreqMhz % 1000) / 10, 2);\r
589 StrCat (StringBuffer, L" GHz");\r
590\r
591 *String = (CHAR16 *) StringBuffer;\r
592\r
593 return ;\r
594}\r
595\r
596VOID\r
597ConvertMemorySizeToString (\r
598 IN UINT32 MemorySize,\r
599 OUT CHAR16 **String\r
600 )\r
601/*++\r
602\r
603Routine Description:\r
604 Convert Memory Size to a string\r
605\r
606Arguments:\r
607 MemorySize - The size of the memory to process\r
608 String - The string that is created\r
609\r
610Returns:\r
611\r
612--*/\r
613{\r
614 CHAR16 *StringBuffer;\r
615\r
616 StringBuffer = AllocateZeroPool (0x20);\r
617 ASSERT (StringBuffer != NULL);\r
618 UnicodeValueToString (StringBuffer, LEFT_JUSTIFY, MemorySize, 6);\r
619 StrCat (StringBuffer, L" MB RAM");\r
620\r
621 *String = (CHAR16 *) StringBuffer;\r
622\r
623 return ;\r
624}\r
625\r
626VOID\r
627UpdateFrontPageStrings (\r
628 VOID\r
629 )\r
630/*++\r
631\r
632Routine Description:\r
633 Update the banner information for the Front Page based on DataHub information\r
634\r
635Arguments:\r
636 None\r
637\r
638Returns:\r
639\r
640--*/\r
641{\r
642 EFI_STATUS Status;\r
643 EFI_STRING_ID TokenToUpdate;\r
644 CHAR16 *NewString;\r
645 UINT64 MonotonicCount;\r
646 EFI_DATA_HUB_PROTOCOL *DataHub;\r
647 EFI_DATA_RECORD_HEADER *Record;\r
648 EFI_SUBCLASS_TYPE1_HEADER *DataHeader;\r
649 EFI_MISC_BIOS_VENDOR_DATA *BiosVendor;\r
650 EFI_MISC_SYSTEM_MANUFACTURER_DATA *SystemManufacturer;\r
651 EFI_PROCESSOR_VERSION_DATA *ProcessorVersion;\r
652 EFI_PROCESSOR_CORE_FREQUENCY_DATA *ProcessorFrequency;\r
653 EFI_MEMORY_ARRAY_START_ADDRESS_DATA *MemoryArray;\r
654 BOOLEAN Find[5];\r
655\r
656 ZeroMem (Find, sizeof (Find));\r
657\r
658 //\r
659 // Update Front Page strings\r
660 //\r
661 Status = gBS->LocateProtocol (\r
662 &gEfiDataHubProtocolGuid,\r
663 NULL,\r
664 (VOID **) &DataHub\r
665 );\r
666 ASSERT_EFI_ERROR (Status);\r
667\r
668 MonotonicCount = 0;\r
669 Record = NULL;\r
670 do {\r
671 Status = DataHub->GetNextRecord (DataHub, &MonotonicCount, NULL, &Record);\r
672 if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {\r
673 DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *) (Record + 1);\r
674 if (CompareGuid (&Record->DataRecordGuid, &gEfiMiscSubClassGuid) &&\r
675 (DataHeader->RecordType == EFI_MISC_BIOS_VENDOR_RECORD_NUMBER)\r
676 ) {\r
677 BiosVendor = (EFI_MISC_BIOS_VENDOR_DATA *) (DataHeader + 1);\r
678 GetProducerString (&Record->ProducerName, BiosVendor->BiosVersion, &NewString);\r
679 TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION);\r
9226efe5 680 HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString);\r
93e3992d 681 FreePool (NewString);\r
682 Find[0] = TRUE;\r
683 }\r
684\r
685 if (CompareGuid (&Record->DataRecordGuid, &gEfiMiscSubClassGuid) &&\r
686 (DataHeader->RecordType == EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER)\r
687 ) {\r
688 SystemManufacturer = (EFI_MISC_SYSTEM_MANUFACTURER_DATA *) (DataHeader + 1);\r
689 GetProducerString (&Record->ProducerName, SystemManufacturer->SystemProductName, &NewString);\r
690 TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL);\r
9226efe5 691 HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString);\r
93e3992d 692 FreePool (NewString);\r
693 Find[1] = TRUE;\r
694 }\r
695\r
696 if (CompareGuid (&Record->DataRecordGuid, &gEfiProcessorSubClassGuid) &&\r
697 (DataHeader->RecordType == ProcessorVersionRecordType)\r
698 ) {\r
699 ProcessorVersion = (EFI_PROCESSOR_VERSION_DATA *) (DataHeader + 1);\r
700 GetProducerString (&Record->ProducerName, *ProcessorVersion, &NewString);\r
701 TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL);\r
9226efe5 702 HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString);\r
93e3992d 703 FreePool (NewString);\r
704 Find[2] = TRUE;\r
705 }\r
706\r
707 if (CompareGuid (&Record->DataRecordGuid, &gEfiProcessorSubClassGuid) &&\r
708 (DataHeader->RecordType == ProcessorCoreFrequencyRecordType)\r
709 ) {\r
710 ProcessorFrequency = (EFI_PROCESSOR_CORE_FREQUENCY_DATA *) (DataHeader + 1);\r
711 ConvertProcessorToString (ProcessorFrequency, &NewString);\r
712 TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED);\r
9226efe5 713 HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString);\r
93e3992d 714 FreePool (NewString);\r
715 Find[3] = TRUE;\r
716 }\r
717\r
718 if (CompareGuid (&Record->DataRecordGuid, &gEfiMemorySubClassGuid) &&\r
719 (DataHeader->RecordType == EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER)\r
720 ) {\r
721 MemoryArray = (EFI_MEMORY_ARRAY_START_ADDRESS_DATA *) (DataHeader + 1);\r
722 ConvertMemorySizeToString (\r
723 (UINT32)(RShiftU64((MemoryArray->MemoryArrayEndAddress - MemoryArray->MemoryArrayStartAddress + 1), 20)),\r
724 &NewString\r
725 );\r
726 TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE);\r
9226efe5 727 HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString);\r
93e3992d 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
737EFI_STATUS\r
738WaitForSingleEvent (\r
739 IN EFI_EVENT Event,\r
740 IN UINT64 Timeout OPTIONAL\r
741 )\r
742/*++\r
743\r
744Routine Description:\r
745 Function waits for a given event to fire, or for an optional timeout to expire.\r
746\r
747Arguments:\r
748 Event - The event to wait for\r
749 Timeout - An optional timeout value in 100 ns units.\r
750\r
751Returns:\r
752 EFI_SUCCESS - Event fired before Timeout expired.\r
753 EFI_TIME_OUT - Timout expired before Event fired..\r
754\r
755--*/\r
756{\r
757 EFI_STATUS Status;\r
758 UINTN Index;\r
759 EFI_EVENT TimerEvent;\r
760 EFI_EVENT WaitList[2];\r
761\r
762 if (Timeout) {\r
763 //\r
764 // Create a timer event\r
765 //\r
766 Status = gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimerEvent);\r
767 if (!EFI_ERROR (Status)) {\r
768 //\r
769 // Set the timer event\r
770 //\r
771 gBS->SetTimer (\r
772 TimerEvent,\r
773 TimerRelative,\r
774 Timeout\r
775 );\r
776\r
777 //\r
778 // Wait for the original event or the timer\r
779 //\r
780 WaitList[0] = Event;\r
781 WaitList[1] = TimerEvent;\r
782 Status = gBS->WaitForEvent (2, WaitList, &Index);\r
783 gBS->CloseEvent (TimerEvent);\r
784\r
785 //\r
786 // If the timer expired, change the return to timed out\r
787 //\r
788 if (!EFI_ERROR (Status) && Index == 1) {\r
789 Status = EFI_TIMEOUT;\r
790 }\r
791 }\r
792 } else {\r
793 //\r
794 // No timeout... just wait on the event\r
795 //\r
796 Status = gBS->WaitForEvent (1, &Event, &Index);\r
797 ASSERT (!EFI_ERROR (Status));\r
798 ASSERT (Index == 0);\r
799 }\r
800\r
801 return Status;\r
802}\r
803\r
804EFI_STATUS\r
805ShowProgress (\r
806 IN UINT16 TimeoutDefault\r
807 )\r
808/*++\r
809\r
810Routine Description:\r
811 Function show progress bar to wait for user input.\r
812\r
813Arguments:\r
814 TimeoutDefault - The fault time out value before the system\r
815 continue to boot.\r
816\r
817Returns:\r
818 EFI_SUCCESS - User pressed some key except "Enter"\r
819 EFI_TIME_OUT - Timout expired or user press "Enter"\r
820\r
821--*/\r
822{\r
823 EFI_STATUS Status;\r
824 CHAR16 *TmpStr;\r
825 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
826 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
827 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color;\r
828 EFI_INPUT_KEY Key;\r
829 UINT16 TimeoutRemain;\r
830\r
831 if (TimeoutDefault == 0) {\r
832 return EFI_TIMEOUT;\r
833 }\r
834\r
835 SetMem (&Foreground, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);\r
836 SetMem (&Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0);\r
837 SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);\r
838\r
839 //\r
840 // Clear the progress status bar first\r
841 //\r
842 TmpStr = GetStringById (STRING_TOKEN (STR_START_BOOT_OPTION));\r
843 if (TmpStr != NULL) {\r
844 PlatformBdsShowProgress (Foreground, Background, TmpStr, Color, 0, 0);\r
845 }\r
846\r
847 TimeoutRemain = TimeoutDefault;\r
848 while (TimeoutRemain != 0) {\r
849 Status = WaitForSingleEvent (gST->ConIn->WaitForKey, ONE_SECOND);\r
850 if (Status != EFI_TIMEOUT) {\r
851 break;\r
852 }\r
853 TimeoutRemain--;\r
854\r
855 //\r
856 // Show progress\r
857 //\r
858 if (TmpStr != NULL) {\r
859 PlatformBdsShowProgress (\r
860 Foreground,\r
861 Background,\r
862 TmpStr,\r
863 Color,\r
864 ((TimeoutDefault - TimeoutRemain) * 100 / TimeoutDefault),\r
865 0\r
866 );\r
867 }\r
868 }\r
869 gBS->FreePool (TmpStr);\r
870\r
871 //\r
872 // Timeout expired\r
873 //\r
874 if (TimeoutRemain == 0) {\r
875 return EFI_TIMEOUT;\r
876 }\r
877\r
878 //\r
879 // User pressed some key\r
880 //\r
881 Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
882 if (EFI_ERROR (Status)) {\r
883 return Status;\r
884 }\r
885\r
886 if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
887 //\r
888 // User pressed enter, equivalent to select "continue"\r
889 //\r
890 return EFI_TIMEOUT;\r
891 }\r
892\r
893 return EFI_SUCCESS;\r
894}\r
895\r
896VOID\r
897PlatformBdsEnterFrontPage (\r
898 IN UINT16 TimeoutDefault,\r
899 IN BOOLEAN ConnectAllHappened\r
900 )\r
901/*++\r
902\r
903Routine Description:\r
904 This function is the main entry of the platform setup entry.\r
905 The function will present the main menu of the system setup,\r
906 this is the platform reference part and can be customize.\r
907\r
908Arguments:\r
909 TimeoutDefault - The fault time out value before the system\r
910 continue to boot.\r
911 ConnectAllHappened - The indicater to check if the connect all have\r
912 already happended.\r
913\r
914Returns:\r
915 None\r
916\r
917--*/\r
918{\r
919 EFI_STATUS Status;\r
920 EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl;\r
921\r
922 //\r
923 // Indicate if we need connect all in the platform setup\r
924 //\r
925 if (ConnectAllHappened) {\r
926 gConnectAllHappened = TRUE;\r
927 }\r
928\r
929 if (TimeoutDefault != 0xffff) {\r
930 gBS->RestoreTPL (TPL_APPLICATION);\r
931 Status = ShowProgress (TimeoutDefault);\r
932 gBS->RaiseTPL (TPL_APPLICATION);\r
933\r
934 if (EFI_ERROR (Status)) {\r
935 //\r
936 // Timeout or user press enter to continue\r
937 //\r
938 goto Exit;\r
939 }\r
940 }\r
941\r
942 do {\r
943\r
944 InitializeFrontPage (TRUE);\r
945\r
946 //\r
947 // Update Front Page strings\r
948 //\r
949 UpdateFrontPageStrings ();\r
950\r
951 gCallbackKey = 0;\r
952 PERF_START (0, "BdsTimeOut", "BDS", 0);\r
953 Status = CallFrontPage ();\r
954 PERF_END (0, "BdsTimeOut", "BDS", 0);\r
955\r
956 //\r
957 // If gCallbackKey is greater than 1 and less or equal to 5,\r
958 // it will lauch configuration utilities.\r
959 // 2 = set language\r
960 // 3 = boot manager\r
961 // 4 = device manager\r
962 // 5 = boot maintainenance manager\r
963 //\r
964 if (gCallbackKey != 0) {\r
965 REPORT_STATUS_CODE (\r
966 EFI_PROGRESS_CODE,\r
967 (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_USER_SETUP)\r
968 );\r
969 }\r
970 //\r
971 // Based on the key that was set, we can determine what to do\r
972 //\r
973 switch (gCallbackKey) {\r
974 //\r
975 // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can\r
976 // describe to their customers in documentation how to find their setup information (namely\r
977 // under the device manager and specific buckets)\r
978 //\r
979 // These entries consist of the Continue, Select language, Boot Manager, and Device Manager\r
980 //\r
981 case FRONT_PAGE_KEY_CONTINUE:\r
982 //\r
983 // User hit continue\r
984 //\r
985 break;\r
986\r
987 case FRONT_PAGE_KEY_LANGUAGE:\r
988 //\r
989 // User made a language setting change - display front page again\r
990 //\r
991 break;\r
992\r
993 case FRONT_PAGE_KEY_BOOT_MANAGER:\r
994 //\r
995 // User chose to run the Boot Manager\r
996 //\r
997 CallBootManager ();\r
998 break;\r
999\r
1000 case FRONT_PAGE_KEY_DEVICE_MANAGER:\r
1001 //\r
1002 // Display the Device Manager\r
1003 //\r
1004 do {\r
1005 CallDeviceManager();\r
1006 } while (gCallbackKey == FRONT_PAGE_KEY_DEVICE_MANAGER);\r
1007 break;\r
1008\r
1009 case FRONT_PAGE_KEY_BOOT_MAINTAIN:\r
1010 //\r
1011 // Display the Boot Maintenance Manager\r
1012 //\r
1013 BdsStartBootMaint ();\r
1014 break;\r
1015 }\r
1016\r
1017 } while ((Status == EFI_SUCCESS) && (gCallbackKey != FRONT_PAGE_KEY_CONTINUE));\r
1018\r
1019 //\r
1020 //Will leave browser, check any reset required change is applied? if yes, reset system\r
1021 //\r
1022 gBS->RestoreTPL (TPL_APPLICATION);\r
1023 SetupResetReminder ();\r
1024 gBS->RaiseTPL (TPL_APPLICATION);\r
1025\r
1026Exit:\r
1027 //\r
1028 // Automatically load current entry\r
1029 // Note: The following lines of code only execute when Auto boot\r
1030 // takes affect\r
1031 //\r
1032 Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, (VOID **) &ConsoleControl);\r
1033 ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenText);\r
1034\r
1035}\r