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