]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c
Update comment for function header.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / FrontPage.c
CommitLineData
5c08e117 1/** @file\r
2 FrontPage routines to handle the callbacks and browser calls\r
3\r
d394581d 4Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
180a5a35 5This program and the accompanying materials\r
5c08e117 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
13**/\r
14\r
15#include "Bds.h"\r
16#include "FrontPage.h"\r
ad5a96ab 17#include "Language.h"\r
d394581d 18#include "Hotkey.h"\r
5c08e117 19\r
5c08e117 20BOOLEAN gConnectAllHappened = FALSE;\r
21UINTN gCallbackKey;\r
22\r
5c08e117 23EFI_FORM_BROWSER2_PROTOCOL *gFormBrowser2;\r
5c08e117 24\r
25FRONT_PAGE_CALLBACK_DATA gFrontPagePrivate = {\r
26 FRONT_PAGE_CALLBACK_DATA_SIGNATURE,\r
27 NULL,\r
28 NULL,\r
29 NULL,\r
30 {\r
31 FakeExtractConfig,\r
32 FakeRouteConfig,\r
33 FrontPageCallback\r
34 }\r
35};\r
36\r
f6f910dd 37HII_VENDOR_DEVICE_PATH mFrontPageHiiVendorDevicePath = {\r
38 {\r
39 {\r
40 HARDWARE_DEVICE_PATH,\r
41 HW_VENDOR_DP,\r
42 {\r
43 (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
44 (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
45 }\r
46 },\r
e24fc103 47 FRONT_PAGE_FORMSET_GUID\r
f6f910dd 48 },\r
49 {\r
50 END_DEVICE_PATH_TYPE,\r
51 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
128efbbc 52 {\r
f6f910dd 53 (UINT8) (END_DEVICE_PATH_LENGTH),\r
54 (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
55 }\r
56 }\r
57};\r
58\r
5c08e117 59/**\r
60 This function allows a caller to extract the current configuration for one\r
61 or more named elements from the target driver.\r
62\r
63\r
64 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
65 @param Request A null-terminated Unicode string in <ConfigRequest> format.\r
66 @param Progress On return, points to a character in the Request string.\r
67 Points to the string's null terminator if request was successful.\r
68 Points to the most recent '&' before the first failing name/value\r
69 pair (or the beginning of the string if the failure is in the\r
70 first name/value pair) if the request was not successful.\r
71 @param Results A null-terminated Unicode string in <ConfigAltResp> format which\r
72 has all values filled in for the names in the Request string.\r
73 String to be allocated by the called function.\r
74\r
75 @retval EFI_SUCCESS The Results is filled with the requested values.\r
76 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
59aefb7e 77 @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name.\r
5c08e117 78 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.\r
79\r
80**/\r
81EFI_STATUS\r
82EFIAPI\r
83FakeExtractConfig (\r
84 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
85 IN CONST EFI_STRING Request,\r
86 OUT EFI_STRING *Progress,\r
87 OUT EFI_STRING *Results\r
88 )\r
89{\r
59aefb7e 90 if (Progress == NULL || Results == NULL) {\r
dedfc3bb
LG
91 return EFI_INVALID_PARAMETER;\r
92 }\r
cdcc36ae 93 *Progress = Request;\r
5c08e117 94 return EFI_NOT_FOUND;\r
95}\r
96\r
97/**\r
98 This function processes the results of changes in configuration.\r
99\r
100\r
101 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
102 @param Configuration A null-terminated Unicode string in <ConfigResp> format.\r
103 @param Progress A pointer to a string filled in with the offset of the most\r
104 recent '&' before the first failing name/value pair (or the\r
105 beginning of the string if the failure is in the first\r
106 name/value pair) or the terminating NULL if all was successful.\r
107\r
108 @retval EFI_SUCCESS The Results is processed successfully.\r
109 @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
110 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.\r
111\r
112**/\r
113EFI_STATUS\r
114EFIAPI\r
115FakeRouteConfig (\r
116 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
117 IN CONST EFI_STRING Configuration,\r
118 OUT EFI_STRING *Progress\r
119 )\r
120{\r
dedfc3bb 121 if (Configuration == NULL || Progress == NULL) {\r
cdcc36ae
LG
122 return EFI_INVALID_PARAMETER;\r
123 }\r
124\r
dedfc3bb 125 *Progress = Configuration;\r
e24fc103
LG
126 if (!HiiIsConfigHdrMatch (Configuration, &gBootMaintFormSetGuid, mBootMaintStorageName)\r
127 && !HiiIsConfigHdrMatch (Configuration, &gFileExploreFormSetGuid, mFileExplorerStorageName)) {\r
dedfc3bb 128 return EFI_NOT_FOUND;\r
cdcc36ae
LG
129 }\r
130\r
dedfc3bb
LG
131 *Progress = Configuration + StrLen (Configuration);\r
132 return EFI_SUCCESS;\r
5c08e117 133}\r
134\r
135/**\r
136 This function processes the results of changes in configuration.\r
137\r
138\r
139 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
140 @param Action Specifies the type of action taken by the browser.\r
141 @param QuestionId A unique value which is sent to the original exporting driver\r
142 so that it can identify the type of data to expect.\r
143 @param Type The type of value for the question.\r
144 @param Value A pointer to the data being sent to the original exporting driver.\r
145 @param ActionRequest On return, points to the action requested by the callback function.\r
146\r
147 @retval EFI_SUCCESS The callback successfully handled the action.\r
148 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the variable and its data.\r
149 @retval EFI_DEVICE_ERROR The variable could not be saved.\r
150 @retval EFI_UNSUPPORTED The specified Action is not supported by the callback.\r
151\r
152**/\r
153EFI_STATUS\r
154EFIAPI\r
155FrontPageCallback (\r
156 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
157 IN EFI_BROWSER_ACTION Action,\r
158 IN EFI_QUESTION_ID QuestionId,\r
159 IN UINT8 Type,\r
160 IN EFI_IFR_TYPE_VALUE *Value,\r
161 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
162 )\r
163{\r
164 CHAR8 *LanguageString;\r
165 CHAR8 *LangCode;\r
a3a795af 166 CHAR8 *Lang;\r
5c08e117 167 UINTN Index;\r
168 EFI_STATUS Status;\r
a3a795af 169 CHAR8 *PlatformSupportedLanguages;\r
170 CHAR8 *BestLanguage;\r
5c08e117 171\r
d88f86f1
ED
172 if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
173 if ((Value == NULL) || (ActionRequest == NULL)) {\r
174 return EFI_INVALID_PARAMETER;\r
175 }\r
5c08e117 176\r
d88f86f1 177 gCallbackKey = QuestionId;\r
5c08e117 178\r
5c08e117 179 //\r
d88f86f1
ED
180 // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can\r
181 // describe to their customers in documentation how to find their setup information (namely\r
182 // under the device manager and specific buckets)\r
5c08e117 183 //\r
d88f86f1
ED
184 switch (QuestionId) {\r
185 case FRONT_PAGE_KEY_CONTINUE:\r
186 //\r
187 // This is the continue - clear the screen and return an error to get out of FrontPage loop\r
188 //\r
189 break;\r
190\r
191 case FRONT_PAGE_KEY_LANGUAGE:\r
192 //\r
193 // Collect the languages from what our current Language support is based on our VFR\r
194 //\r
195 LanguageString = HiiGetSupportedLanguages (gFrontPagePrivate.HiiHandle);\r
196 ASSERT (LanguageString != NULL);\r
197 //\r
198 // Allocate working buffer for RFC 4646 language in supported LanguageString.\r
199 //\r
200 Lang = AllocatePool (AsciiStrSize (LanguageString));\r
201 ASSERT (Lang != NULL);\r
202\r
203 Index = 0;\r
204 LangCode = LanguageString;\r
205 while (*LangCode != 0) {\r
206 GetNextLanguage (&LangCode, Lang);\r
207\r
208 if (Index == Value->u8) {\r
209 break;\r
210 }\r
211\r
212 Index++;\r
5c08e117 213 }\r
214\r
d88f86f1
ED
215 PlatformSupportedLanguages = GetEfiGlobalVariable (L"PlatformLangCodes");\r
216 if (PlatformSupportedLanguages == NULL) {\r
217 PlatformSupportedLanguages = AllocateCopyPool (\r
218 AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)),\r
219 (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)\r
220 );\r
221 ASSERT (PlatformSupportedLanguages != NULL);\r
222 }\r
5c08e117 223\r
d88f86f1
ED
224 //\r
225 // Select the best language in platform supported Language.\r
226 //\r
227 BestLanguage = GetBestLanguage (\r
228 PlatformSupportedLanguages,\r
229 FALSE,\r
230 Lang,\r
231 NULL\r
232 );\r
233 if (BestLanguage != NULL) {\r
234 Status = gRT->SetVariable (\r
235 L"PlatformLang",\r
236 &gEfiGlobalVariableGuid,\r
237 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
238 AsciiStrSize (BestLanguage),\r
239 Lang\r
240 );\r
241 ASSERT_EFI_ERROR(Status);\r
242 FreePool (BestLanguage);\r
243 } else {\r
244 ASSERT (FALSE);\r
245 }\r
128efbbc 246\r
d88f86f1
ED
247 FreePool (PlatformSupportedLanguages);\r
248 FreePool (Lang);\r
249 FreePool (LanguageString);\r
250 break;\r
251\r
252 case FRONT_PAGE_KEY_BOOT_MANAGER:\r
253 //\r
254 // Boot Manager\r
255 //\r
256 break;\r
257\r
258 case FRONT_PAGE_KEY_DEVICE_MANAGER:\r
259 //\r
260 // Device Manager\r
261 //\r
262 break;\r
263\r
264 case FRONT_PAGE_KEY_BOOT_MAINTAIN:\r
265 //\r
266 // Boot Maintenance Manager\r
267 //\r
268 break;\r
269\r
270 default:\r
271 gCallbackKey = 0;\r
272 break;\r
5c08e117 273 }\r
d357145f 274\r
d88f86f1 275 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
5c08e117 276\r
d88f86f1 277 return EFI_SUCCESS;\r
5c08e117 278 }\r
279\r
d88f86f1
ED
280 //\r
281 // All other action return unsupported.\r
282 //\r
283 return EFI_UNSUPPORTED;\r
5c08e117 284}\r
285\r
286/**\r
287 Initialize HII information for the FrontPage\r
288\r
289\r
290 @param InitializeHiiData TRUE if HII elements need to be initialized.\r
291\r
292 @retval EFI_SUCCESS The operation is successful.\r
293 @retval EFI_DEVICE_ERROR If the dynamic opcode creation failed.\r
294\r
295**/\r
296EFI_STATUS\r
297InitializeFrontPage (\r
298 IN BOOLEAN InitializeHiiData\r
299 )\r
300{\r
301 EFI_STATUS Status;\r
5c08e117 302 CHAR8 *LanguageString;\r
303 CHAR8 *LangCode;\r
a3a795af 304 CHAR8 *Lang;\r
305 CHAR8 *CurrentLang;\r
306 CHAR8 *BestLanguage;\r
5c08e117 307 UINTN OptionCount;\r
5c08e117 308 CHAR16 *StringBuffer;\r
5c08e117 309 EFI_HII_HANDLE HiiHandle;\r
75bf9d0e
LG
310 VOID *OptionsOpCodeHandle;\r
311 VOID *StartOpCodeHandle;\r
312 VOID *EndOpCodeHandle;\r
313 EFI_IFR_GUID_LABEL *StartLabel;\r
314 EFI_IFR_GUID_LABEL *EndLabel;\r
315 BOOLEAN FirstFlag;\r
5c08e117 316\r
317 if (InitializeHiiData) {\r
318 //\r
319 // Initialize the Device Manager\r
320 //\r
321 InitializeDeviceManager ();\r
322\r
323 //\r
324 // Initialize the Device Manager\r
325 //\r
326 InitializeBootManager ();\r
327\r
328 gCallbackKey = 0;\r
329\r
330 //\r
331 // Locate Hii relative protocols\r
332 //\r
5c08e117 333 Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &gFormBrowser2);\r
334 if (EFI_ERROR (Status)) {\r
335 return Status;\r
336 }\r
337\r
5c08e117 338 //\r
f6f910dd 339 // Install Device Path Protocol and Config Access protocol to driver handle\r
5c08e117 340 //\r
f6f910dd 341 Status = gBS->InstallMultipleProtocolInterfaces (\r
5c08e117 342 &gFrontPagePrivate.DriverHandle,\r
f6f910dd 343 &gEfiDevicePathProtocolGuid,\r
344 &mFrontPageHiiVendorDevicePath,\r
5c08e117 345 &gEfiHiiConfigAccessProtocolGuid,\r
f6f910dd 346 &gFrontPagePrivate.ConfigAccess,\r
347 NULL\r
5c08e117 348 );\r
349 ASSERT_EFI_ERROR (Status);\r
350\r
351 //\r
352 // Publish our HII data\r
353 //\r
cb7d01c0 354 gFrontPagePrivate.HiiHandle = HiiAddPackages (\r
e24fc103 355 &gFrontPageFormSetGuid,\r
cb7d01c0 356 gFrontPagePrivate.DriverHandle,\r
357 FrontPageVfrBin,\r
358 BdsDxeStrings,\r
359 NULL\r
360 );\r
361 if (gFrontPagePrivate.HiiHandle == NULL) {\r
362 return EFI_OUT_OF_RESOURCES;\r
5c08e117 363 }\r
364 }\r
365\r
5c08e117 366\r
367 //\r
75bf9d0e 368 // Init OpCode Handle and Allocate space for creation of UpdateData Buffer\r
5c08e117 369 //\r
75bf9d0e
LG
370 StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
371 ASSERT (StartOpCodeHandle != NULL);\r
5c08e117 372\r
75bf9d0e
LG
373 EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
374 ASSERT (EndOpCodeHandle != NULL);\r
375\r
376 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
377 ASSERT (OptionsOpCodeHandle != NULL);\r
378 //\r
379 // Create Hii Extend Label OpCode as the start opcode\r
380 //\r
381 StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
382 StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
383 StartLabel->Number = LABEL_SELECT_LANGUAGE;\r
384\r
385 //\r
386 // Create Hii Extend Label OpCode as the end opcode\r
387 //\r
388 EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
389 EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
390 EndLabel->Number = LABEL_END;\r
5c08e117 391\r
392 //\r
393 // Collect the languages from what our current Language support is based on our VFR\r
394 //\r
395 HiiHandle = gFrontPagePrivate.HiiHandle;\r
cb7d01c0 396 LanguageString = HiiGetSupportedLanguages (HiiHandle);\r
5c08e117 397 ASSERT (LanguageString != NULL);\r
a3a795af 398 //\r
399 // Allocate working buffer for RFC 4646 language in supported LanguageString.\r
400 //\r
401 Lang = AllocatePool (AsciiStrSize (LanguageString));\r
402 ASSERT (Lang != NULL);\r
403\r
404 CurrentLang = GetEfiGlobalVariable (L"PlatformLang");\r
405 //\r
406 // Select the best language in LanguageString as the default one.\r
407 //\r
408 BestLanguage = GetBestLanguage (\r
409 LanguageString,\r
410 FALSE,\r
411 (CurrentLang != NULL) ? CurrentLang : "",\r
412 (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang),\r
413 LanguageString,\r
414 NULL\r
415 );\r
416 //\r
417 // BestLanguage must be selected as it is the first language in LanguageString by default\r
418 //\r
419 ASSERT (BestLanguage != NULL);\r
5c08e117 420\r
75bf9d0e
LG
421 OptionCount = 0;\r
422 LangCode = LanguageString;\r
423 FirstFlag = FALSE;\r
128efbbc 424\r
75bf9d0e
LG
425 if (gFrontPagePrivate.LanguageToken == NULL) {\r
426 while (*LangCode != 0) {\r
0b3f5a4d 427 GetNextLanguage (&LangCode, Lang);\r
75bf9d0e
LG
428 OptionCount ++;\r
429 }\r
8df1634c 430 gFrontPagePrivate.LanguageToken = AllocatePool (OptionCount * sizeof (EFI_STRING_ID));\r
75bf9d0e
LG
431 ASSERT (gFrontPagePrivate.LanguageToken != NULL);\r
432 FirstFlag = TRUE;\r
433 }\r
434\r
5c08e117 435 OptionCount = 0;\r
436 LangCode = LanguageString;\r
437 while (*LangCode != 0) {\r
0f268521 438 GetNextLanguage (&LangCode, Lang);\r
5c08e117 439\r
75bf9d0e 440 if (FirstFlag) {\r
33bb6326 441 StringBuffer = HiiGetString (HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, Lang);\r
7f97c9bb 442 ASSERT (StringBuffer != NULL);\r
5c08e117 443\r
75bf9d0e
LG
444 //\r
445 // Save the string Id for each language\r
446 //\r
447 gFrontPagePrivate.LanguageToken[OptionCount] = HiiSetString (HiiHandle, 0, StringBuffer, NULL);\r
5c08e117 448 FreePool (StringBuffer);\r
5c08e117 449 }\r
450\r
a3a795af 451 if (AsciiStrCmp (Lang, BestLanguage) == 0) {\r
75bf9d0e
LG
452 HiiCreateOneOfOptionOpCode (\r
453 OptionsOpCodeHandle,\r
454 gFrontPagePrivate.LanguageToken[OptionCount],\r
455 EFI_IFR_OPTION_DEFAULT,\r
456 EFI_IFR_NUMERIC_SIZE_1,\r
457 (UINT8) OptionCount\r
458 );\r
5c08e117 459 } else {\r
75bf9d0e
LG
460 HiiCreateOneOfOptionOpCode (\r
461 OptionsOpCodeHandle,\r
462 gFrontPagePrivate.LanguageToken[OptionCount],\r
463 0,\r
464 EFI_IFR_NUMERIC_SIZE_1,\r
465 (UINT8) OptionCount\r
466 );\r
5c08e117 467 }\r
5c08e117 468\r
469 OptionCount++;\r
470 }\r
471\r
a3a795af 472 if (CurrentLang != NULL) {\r
473 FreePool (CurrentLang);\r
474 }\r
475 FreePool (BestLanguage);\r
476 FreePool (Lang);\r
5c08e117 477 FreePool (LanguageString);\r
478\r
75bf9d0e
LG
479 HiiCreateOneOfOpCode (\r
480 StartOpCodeHandle,\r
5c08e117 481 FRONT_PAGE_KEY_LANGUAGE,\r
482 0,\r
483 0,\r
484 STRING_TOKEN (STR_LANGUAGE_SELECT),\r
485 STRING_TOKEN (STR_LANGUAGE_SELECT_HELP),\r
486 EFI_IFR_FLAG_CALLBACK,\r
487 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
488 OptionsOpCodeHandle,\r
489 NULL\r
5c08e117 490 );\r
491\r
75bf9d0e 492 Status = HiiUpdateForm (\r
5c08e117 493 HiiHandle,\r
e24fc103 494 &gFrontPageFormSetGuid,\r
5c08e117 495 FRONT_PAGE_FORM_ID,\r
75bf9d0e
LG
496 StartOpCodeHandle, // LABEL_SELECT_LANGUAGE\r
497 EndOpCodeHandle // LABEL_END\r
5c08e117 498 );\r
499\r
75bf9d0e
LG
500 HiiFreeOpCodeHandle (StartOpCodeHandle);\r
501 HiiFreeOpCodeHandle (EndOpCodeHandle);\r
502 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 503 return Status;\r
504}\r
505\r
506/**\r
507 Call the browser and display the front page\r
508\r
509 @return Status code that will be returned by\r
510 EFI_FORM_BROWSER2_PROTOCOL.SendForm ().\r
511\r
512**/\r
513EFI_STATUS\r
514CallFrontPage (\r
515 VOID\r
516 )\r
517{\r
518 EFI_STATUS Status;\r
519 EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
520\r
521 //\r
522 // Begin waiting for USER INPUT\r
523 //\r
524 REPORT_STATUS_CODE (\r
525 EFI_PROGRESS_CODE,\r
526 (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_INPUT_WAIT)\r
527 );\r
528\r
529 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
530 Status = gFormBrowser2->SendForm (\r
531 gFormBrowser2,\r
532 &gFrontPagePrivate.HiiHandle,\r
533 1,\r
e24fc103 534 &gFrontPageFormSetGuid,\r
5c08e117 535 0,\r
536 NULL,\r
537 &ActionRequest\r
538 );\r
539 //\r
baf46e70 540 // Check whether user change any option setting which needs a reset to be effective\r
5c08e117 541 //\r
542 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
543 EnableResetRequired ();\r
544 }\r
545\r
546 return Status;\r
547}\r
548\r
549/**\r
550 Acquire the string associated with the ProducerGuid and return it.\r
551\r
552\r
553 @param ProducerGuid The Guid to search the HII database for\r
554 @param Token The token value of the string to extract\r
555 @param String The string that is extracted\r
556\r
557 @retval EFI_SUCCESS The function returns EFI_SUCCESS always.\r
558\r
559**/\r
560EFI_STATUS\r
561GetProducerString (\r
562 IN EFI_GUID *ProducerGuid,\r
563 IN EFI_STRING_ID Token,\r
564 OUT CHAR16 **String\r
565 )\r
566{\r
cb7d01c0 567 EFI_STRING TmpString;\r
5c08e117 568\r
cb7d01c0 569 TmpString = HiiGetPackageString (ProducerGuid, Token, NULL);\r
570 if (TmpString == NULL) {\r
5c08e117 571 *String = GetStringById (STRING_TOKEN (STR_MISSING_STRING));\r
cb7d01c0 572 } else {\r
573 *String = TmpString;\r
5c08e117 574 }\r
575\r
576 return EFI_SUCCESS;\r
577}\r
578\r
579/**\r
13078b3f 580 Convert Processor Frequency Data to a string.\r
5c08e117 581\r
582 @param ProcessorFrequency The frequency data to process\r
6cfbf7ad 583 @param Base10Exponent The exponent based on 10\r
5c08e117 584 @param String The string that is created\r
585\r
586**/\r
587VOID\r
588ConvertProcessorToString (\r
6cfbf7ad 589 IN UINT16 ProcessorFrequency,\r
590 IN UINT16 Base10Exponent,\r
591 OUT CHAR16 **String\r
5c08e117 592 )\r
593{\r
594 CHAR16 *StringBuffer;\r
595 UINTN Index;\r
596 UINT32 FreqMhz;\r
597\r
6cfbf7ad 598 if (Base10Exponent >= 6) {\r
599 FreqMhz = ProcessorFrequency;\r
600 for (Index = 0; Index < (UINTN) (Base10Exponent - 6); Index++) {\r
5c08e117 601 FreqMhz *= 10;\r
602 }\r
603 } else {\r
604 FreqMhz = 0;\r
605 }\r
606\r
607 StringBuffer = AllocateZeroPool (0x20);\r
608 ASSERT (StringBuffer != NULL);\r
609 Index = UnicodeValueToString (StringBuffer, LEFT_JUSTIFY, FreqMhz / 1000, 3);\r
610 StrCat (StringBuffer, L".");\r
611 UnicodeValueToString (StringBuffer + Index + 1, PREFIX_ZERO, (FreqMhz % 1000) / 10, 2);\r
612 StrCat (StringBuffer, L" GHz");\r
5c08e117 613 *String = (CHAR16 *) StringBuffer;\r
5c08e117 614 return ;\r
615}\r
616\r
6cfbf7ad 617\r
5c08e117 618/**\r
619 Convert Memory Size to a string.\r
620\r
621 @param MemorySize The size of the memory to process\r
622 @param String The string that is created\r
623\r
624**/\r
625VOID\r
626ConvertMemorySizeToString (\r
627 IN UINT32 MemorySize,\r
628 OUT CHAR16 **String\r
629 )\r
630{\r
631 CHAR16 *StringBuffer;\r
632\r
633 StringBuffer = AllocateZeroPool (0x20);\r
634 ASSERT (StringBuffer != NULL);\r
635 UnicodeValueToString (StringBuffer, LEFT_JUSTIFY, MemorySize, 6);\r
636 StrCat (StringBuffer, L" MB RAM");\r
637\r
638 *String = (CHAR16 *) StringBuffer;\r
639\r
640 return ;\r
641}\r
642\r
6cfbf7ad 643/**\r
644\r
645 Acquire the string associated with the Index from smbios structure and return it.\r
646 The caller is responsible for free the string buffer.\r
647\r
648 @param OptionalStrStart The start position to search the string\r
649 @param Index The index of the string to extract\r
650 @param String The string that is extracted\r
651\r
652 @retval EFI_SUCCESS The function returns EFI_SUCCESS always.\r
653\r
654**/\r
655EFI_STATUS\r
656GetOptionalStringByIndex (\r
657 IN CHAR8 *OptionalStrStart,\r
658 IN UINT8 Index,\r
659 OUT CHAR16 **String\r
660 )\r
661{\r
2ca7eca4 662 UINTN StrSize;\r
6cfbf7ad 663\r
2ca7eca4
RN
664 if (Index == 0) {\r
665 *String = AllocateZeroPool (sizeof (CHAR16));\r
666 return EFI_SUCCESS;\r
667 }\r
6cfbf7ad 668\r
2ca7eca4
RN
669 StrSize = 0;\r
670 do {\r
671 Index--;\r
672 OptionalStrStart += StrSize;\r
673 StrSize = AsciiStrSize (OptionalStrStart);\r
674 } while (OptionalStrStart[StrSize] != 0 && Index != 0);\r
675\r
d69bf66d
RN
676 if ((Index != 0) || (StrSize == 1)) {\r
677 //\r
678 // Meet the end of strings set but Index is non-zero, or\r
679 // Find an empty string\r
680 //\r
2ca7eca4 681 *String = GetStringById (STRING_TOKEN (STR_MISSING_STRING));\r
6cfbf7ad 682 } else {\r
2ca7eca4
RN
683 *String = AllocatePool (StrSize * sizeof (CHAR16));\r
684 AsciiStrToUnicodeStr (OptionalStrStart, *String);\r
6cfbf7ad 685 }\r
686\r
6cfbf7ad 687 return EFI_SUCCESS;\r
688}\r
689\r
690\r
5c08e117 691/**\r
692 Update the banner information for the Front Page based on DataHub information.\r
693\r
694**/\r
695VOID\r
696UpdateFrontPageStrings (\r
697 VOID\r
698 )\r
699{\r
6cfbf7ad 700 UINT8 StrIndex;\r
5c08e117 701 CHAR16 *NewString;\r
5c08e117 702 BOOLEAN Find[5];\r
6cfbf7ad 703 EFI_STATUS Status;\r
704 EFI_STRING_ID TokenToUpdate;\r
705 EFI_SMBIOS_HANDLE SmbiosHandle;\r
706 EFI_SMBIOS_PROTOCOL *Smbios;\r
707 SMBIOS_TABLE_TYPE0 *Type0Record;\r
708 SMBIOS_TABLE_TYPE1 *Type1Record;\r
709 SMBIOS_TABLE_TYPE4 *Type4Record;\r
710 SMBIOS_TABLE_TYPE19 *Type19Record;\r
711 EFI_SMBIOS_TABLE_HEADER *Record;\r
5c08e117 712\r
713 ZeroMem (Find, sizeof (Find));\r
714\r
715 //\r
716 // Update Front Page strings\r
717 //\r
718 Status = gBS->LocateProtocol (\r
6cfbf7ad 719 &gEfiSmbiosProtocolGuid,\r
5c08e117 720 NULL,\r
6cfbf7ad 721 (VOID **) &Smbios\r
5c08e117 722 );\r
723 ASSERT_EFI_ERROR (Status);\r
724\r
6cfbf7ad 725 SmbiosHandle = 0;\r
5c08e117 726 do {\r
6cfbf7ad 727 Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);\r
728 if (EFI_ERROR(Status)) {\r
b55f8b01
LG
729 break;\r
730 }\r
5c08e117 731\r
6cfbf7ad 732 if (Record->Type == EFI_SMBIOS_TYPE_BIOS_INFORMATION) {\r
733 Type0Record = (SMBIOS_TABLE_TYPE0 *) Record;\r
734 StrIndex = Type0Record->BiosVersion;\r
ed79462b 735 GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type0Record + Type0Record->Hdr.Length), StrIndex, &NewString);\r
6cfbf7ad 736 TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION);\r
737 HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
738 FreePool (NewString);\r
739 Find[0] = TRUE;\r
740 } \r
741\r
742 if (Record->Type == EFI_SMBIOS_TYPE_SYSTEM_INFORMATION) {\r
743 Type1Record = (SMBIOS_TABLE_TYPE1 *) Record;\r
744 StrIndex = Type1Record->ProductName;\r
ed79462b 745 GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type1Record + Type1Record->Hdr.Length), StrIndex, &NewString);\r
6cfbf7ad 746 TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL);\r
747 HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
748 FreePool (NewString);\r
749 Find[1] = TRUE;\r
5c08e117 750 }\r
6cfbf7ad 751 \r
752 if (Record->Type == EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION) {\r
753 Type4Record = (SMBIOS_TABLE_TYPE4 *) Record;\r
754 StrIndex = Type4Record->ProcessorVersion;\r
ed79462b 755 GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type4Record + Type4Record->Hdr.Length), StrIndex, &NewString);\r
6cfbf7ad 756 TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL);\r
757 HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
758 FreePool (NewString);\r
759 Find[2] = TRUE;\r
760 } \r
761\r
762 if (Record->Type == EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION) {\r
763 Type4Record = (SMBIOS_TABLE_TYPE4 *) Record;\r
764 ConvertProcessorToString(Type4Record->CurrentSpeed, 6, &NewString);\r
765 TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED);\r
766 HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
767 FreePool (NewString);\r
768 Find[3] = TRUE;\r
769 } \r
770\r
771 if ( Record->Type == EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS ) {\r
772 Type19Record = (SMBIOS_TABLE_TYPE19 *) Record;\r
773 ConvertMemorySizeToString (\r
774 (UINT32)(RShiftU64((Type19Record->EndingAddress - Type19Record->StartingAddress + 1), 10)),\r
775 &NewString\r
776 );\r
777 TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE);\r
778 HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
779 FreePool (NewString);\r
780 Find[4] = TRUE; \r
781 }\r
782 } while ( !(Find[0] && Find[1] && Find[2] && Find[3] && Find[4]));\r
5c08e117 783 return ;\r
784}\r
785\r
6cfbf7ad 786\r
5c08e117 787/**\r
788 Function waits for a given event to fire, or for an optional timeout to expire.\r
789\r
6cfbf7ad 790 @param Event The event to wait for\r
791 @param Timeout An optional timeout value in 100 ns units.\r
5c08e117 792\r
793 @retval EFI_SUCCESS Event fired before Timeout expired.\r
794 @retval EFI_TIME_OUT Timout expired before Event fired..\r
795\r
796**/\r
797EFI_STATUS\r
798WaitForSingleEvent (\r
799 IN EFI_EVENT Event,\r
800 IN UINT64 Timeout OPTIONAL\r
801 )\r
802{\r
5c08e117 803 UINTN Index;\r
6cfbf7ad 804 EFI_STATUS Status;\r
5c08e117 805 EFI_EVENT TimerEvent;\r
806 EFI_EVENT WaitList[2];\r
807\r
808 if (Timeout != 0) {\r
809 //\r
810 // Create a timer event\r
811 //\r
812 Status = gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimerEvent);\r
813 if (!EFI_ERROR (Status)) {\r
814 //\r
815 // Set the timer event\r
816 //\r
817 gBS->SetTimer (\r
6cfbf7ad 818 TimerEvent,\r
819 TimerRelative,\r
820 Timeout\r
821 );\r
5c08e117 822\r
823 //\r
824 // Wait for the original event or the timer\r
825 //\r
826 WaitList[0] = Event;\r
827 WaitList[1] = TimerEvent;\r
828 Status = gBS->WaitForEvent (2, WaitList, &Index);\r
829 gBS->CloseEvent (TimerEvent);\r
830\r
831 //\r
832 // If the timer expired, change the return to timed out\r
833 //\r
834 if (!EFI_ERROR (Status) && Index == 1) {\r
835 Status = EFI_TIMEOUT;\r
836 }\r
837 }\r
838 } else {\r
839 //\r
840 // No timeout... just wait on the event\r
841 //\r
842 Status = gBS->WaitForEvent (1, &Event, &Index);\r
843 ASSERT (!EFI_ERROR (Status));\r
844 ASSERT (Index == 0);\r
845 }\r
846\r
847 return Status;\r
848}\r
849\r
850/**\r
851 Function show progress bar to wait for user input.\r
852\r
853\r
6cfbf7ad 854 @param TimeoutDefault The fault time out value before the system continue to boot.\r
5c08e117 855\r
856 @retval EFI_SUCCESS User pressed some key except "Enter"\r
baf46e70 857 @retval EFI_TIME_OUT Timeout expired or user press "Enter"\r
5c08e117 858\r
859**/\r
860EFI_STATUS\r
861ShowProgress (\r
862 IN UINT16 TimeoutDefault\r
863 )\r
864{\r
5c08e117 865 CHAR16 *TmpStr;\r
6cfbf7ad 866 UINT16 TimeoutRemain;\r
867 EFI_STATUS Status;\r
868 EFI_INPUT_KEY Key;\r
5c08e117 869 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
870 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
871 EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color;\r
5c08e117 872\r
873 if (TimeoutDefault == 0) {\r
874 return EFI_TIMEOUT;\r
875 }\r
876\r
877 DEBUG ((EFI_D_INFO, "\n\nStart showing progress bar... Press any key to stop it! ...Zzz....\n"));\r
128efbbc 878\r
5c08e117 879 SetMem (&Foreground, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);\r
880 SetMem (&Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0);\r
881 SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);\r
882\r
883 //\r
884 // Clear the progress status bar first\r
885 //\r
886 TmpStr = GetStringById (STRING_TOKEN (STR_START_BOOT_OPTION));\r
887 if (TmpStr != NULL) {\r
888 PlatformBdsShowProgress (Foreground, Background, TmpStr, Color, 0, 0);\r
889 }\r
890\r
891 TimeoutRemain = TimeoutDefault;\r
892 while (TimeoutRemain != 0) {\r
893 DEBUG ((EFI_D_INFO, "Showing progress bar...Remaining %d second!\n", TimeoutRemain));\r
128efbbc 894\r
5c08e117 895 Status = WaitForSingleEvent (gST->ConIn->WaitForKey, ONE_SECOND);\r
896 if (Status != EFI_TIMEOUT) {\r
897 break;\r
898 }\r
899 TimeoutRemain--;\r
900\r
901 //\r
902 // Show progress\r
903 //\r
904 if (TmpStr != NULL) {\r
905 PlatformBdsShowProgress (\r
906 Foreground,\r
907 Background,\r
908 TmpStr,\r
909 Color,\r
910 ((TimeoutDefault - TimeoutRemain) * 100 / TimeoutDefault),\r
911 0\r
912 );\r
913 }\r
914 }\r
915 gBS->FreePool (TmpStr);\r
916\r
917 //\r
918 // Timeout expired\r
919 //\r
920 if (TimeoutRemain == 0) {\r
921 return EFI_TIMEOUT;\r
922 }\r
923\r
924 //\r
925 // User pressed some key\r
926 //\r
927 Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
928 if (EFI_ERROR (Status)) {\r
929 return Status;\r
930 }\r
931\r
932 if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
933 //\r
934 // User pressed enter, equivalent to select "continue"\r
935 //\r
936 return EFI_TIMEOUT;\r
937 }\r
938\r
939 return EFI_SUCCESS;\r
940}\r
941\r
72861c22 942/**\r
943 This function will change video resolution and text mode for setup when setup is launched.\r
944\r
945 @param None.\r
946\r
947 @retval EFI_SUCCESS Mode is changed successfully.\r
948 @retval Others Mode failed to changed.\r
949\r
950**/\r
951EFI_STATUS\r
952EFIAPI\r
953ChangeModeForSetup (\r
954 VOID\r
955 )\r
956{\r
957 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
958 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;\r
959 UINTN SizeOfInfo;\r
960 EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
961 UINT32 MaxGopMode;\r
962 UINT32 MaxTextMode;\r
963 UINT32 ModeNumber;\r
964 UINT32 SetupTextModeColumn;\r
965 UINT32 SetupTextModeRow;\r
966 UINT32 SetupHorizontalResolution;\r
967 UINT32 SetupVerticalResolution;\r
968 UINTN HandleCount;\r
969 EFI_HANDLE *HandleBuffer;\r
970 EFI_STATUS Status;\r
971 UINTN Index;\r
972 UINTN CurrentColumn;\r
973 UINTN CurrentRow; \r
974\r
975 Status = gBS->HandleProtocol (\r
976 gST->ConsoleOutHandle,\r
977 &gEfiGraphicsOutputProtocolGuid,\r
978 (VOID**)&GraphicsOutput\r
979 );\r
980 if (EFI_ERROR (Status)) {\r
981 GraphicsOutput = NULL;\r
982 }\r
983\r
984 Status = gBS->HandleProtocol (\r
985 gST->ConsoleOutHandle,\r
986 &gEfiSimpleTextOutProtocolGuid,\r
987 (VOID**)&SimpleTextOut\r
988 );\r
989 if (EFI_ERROR (Status)) {\r
990 SimpleTextOut = NULL;\r
991 } \r
992\r
993 if ((GraphicsOutput == NULL) && (SimpleTextOut == NULL)) {\r
994 return EFI_UNSUPPORTED;\r
995 }\r
996\r
997 //\r
998 // Get user defined text mode for setup.\r
999 // \r
1000 SetupHorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution);\r
1001 SetupVerticalResolution = PcdGet32 (PcdSetupVideoVerticalResolution); \r
1002 SetupTextModeColumn = PcdGet32 (PcdSetupConOutColumn);\r
1003 SetupTextModeRow = PcdGet32 (PcdSetupConOutRow);\r
1004\r
1005 MaxGopMode = GraphicsOutput->Mode->MaxMode;\r
1006 MaxTextMode = SimpleTextOut->Mode->MaxMode;\r
1007\r
1008 //\r
1009 // 1. If current video resolution is same with setup video resolution,\r
1010 // video resolution need not be changed.\r
1011 // 1.1. If current text mode is same with setup text mode, text mode need not be changed.\r
1012 // 1.2. If current text mode is different with setup text mode, text mode need be changed to setup text mode.\r
1013 // 2. If current video resolution is different with setup video resolution, we need restart whole console drivers.\r
1014 //\r
1015 for (ModeNumber = 0; ModeNumber < MaxGopMode; ModeNumber++) {\r
1016 Status = GraphicsOutput->QueryMode (\r
1017 GraphicsOutput,\r
1018 ModeNumber,\r
1019 &SizeOfInfo,\r
1020 &Info\r
1021 );\r
1022 if (!EFI_ERROR (Status)) {\r
1023 if ((Info->HorizontalResolution == SetupHorizontalResolution) &&\r
1024 (Info->VerticalResolution == SetupVerticalResolution)) {\r
1025 if ((GraphicsOutput->Mode->Info->HorizontalResolution == SetupHorizontalResolution) &&\r
1026 (GraphicsOutput->Mode->Info->VerticalResolution == SetupVerticalResolution)) {\r
1027 //\r
1028 // If current video resolution is same with setup video resolution, \r
1029 // then check if current text mode is same with setup text mode.\r
1030 //\r
1031 Status = SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow);\r
1032 ASSERT_EFI_ERROR (Status);\r
1033 if (CurrentColumn == SetupTextModeColumn && CurrentRow == SetupTextModeRow) {\r
1034 //\r
1035 // Current text mode is same with setup text mode, text mode need not be change.\r
1036 //\r
1037 FreePool (Info);\r
1038 return EFI_SUCCESS;\r
1039 } else {\r
1040 //\r
1041 // Current text mode is different with setup text mode, text mode need be change to new text mode.\r
1042 //\r
1043 for (Index = 0; Index < MaxTextMode; Index++) {\r
1044 Status = SimpleTextOut->QueryMode (SimpleTextOut, Index, &CurrentColumn, &CurrentRow);\r
1045 if (!EFI_ERROR(Status)) {\r
1046 if ((CurrentColumn == SetupTextModeColumn) && (CurrentRow == SetupTextModeRow)) {\r
1047 //\r
1048 // setup text mode is supported, set it.\r
1049 //\r
1050 Status = SimpleTextOut->SetMode (SimpleTextOut, Index);\r
1051 ASSERT_EFI_ERROR (Status);\r
1052 //\r
1053 // Update text mode PCD.\r
1054 //\r
1055 PcdSet32 (PcdConOutColumn, SetupTextModeColumn);\r
1056 PcdSet32 (PcdConOutRow, SetupTextModeRow);\r
1057 FreePool (Info);\r
1058 return EFI_SUCCESS;\r
1059 }\r
1060 }\r
1061 }\r
1062 if (Index == MaxTextMode) {\r
1063 //\r
1064 // If setup text mode is not supported, return error.\r
1065 //\r
1066 FreePool (Info);\r
1067 return EFI_UNSUPPORTED;\r
1068 }\r
1069 }\r
1070 } else {\r
1071 FreePool (Info);\r
1072 //\r
1073 // If current video resolution is not same with the setup video resolution, set new video resolution.\r
1074 // In this case, the drivers which produce simple text out need be restarted.\r
1075 //\r
1076 Status = GraphicsOutput->SetMode (GraphicsOutput, ModeNumber);\r
1077 if (!EFI_ERROR (Status)) {\r
1078 //\r
1079 // Set PCD to restart GraphicsConsole and Consplitter to change video resolution \r
1080 // and produce new text mode based on new resolution.\r
1081 //\r
1082 PcdSet32 (PcdVideoHorizontalResolution, SetupHorizontalResolution);\r
1083 PcdSet32 (PcdVideoVerticalResolution, SetupVerticalResolution);\r
1084 PcdSet32 (PcdConOutColumn, SetupTextModeColumn);\r
1085 PcdSet32 (PcdConOutRow, SetupTextModeRow);\r
1086 \r
1087 Status = gBS->LocateHandleBuffer (\r
1088 ByProtocol,\r
1089 &gEfiSimpleTextOutProtocolGuid,\r
1090 NULL,\r
1091 &HandleCount,\r
1092 &HandleBuffer\r
1093 );\r
1094 if (!EFI_ERROR (Status)) {\r
1095 for (Index = 0; Index < HandleCount; Index++) {\r
1096 gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);\r
1097 }\r
1098 for (Index = 0; Index < HandleCount; Index++) {\r
1099 gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);\r
1100 }\r
1101 if (HandleBuffer != NULL) {\r
1102 FreePool (HandleBuffer);\r
1103 }\r
1104 break;\r
1105 }\r
1106 }\r
1107 }\r
1108 }\r
1109 FreePool (Info);\r
1110 }\r
1111 }\r
1112\r
1113 if (ModeNumber == MaxGopMode) {\r
1114 //\r
1115 // If the new resolution is not supported, return error.\r
1116 //\r
1117 return EFI_UNSUPPORTED;\r
1118 }\r
1119\r
1120 return EFI_SUCCESS;\r
1121}\r
1122\r
5c08e117 1123/**\r
1124 This function is the main entry of the platform setup entry.\r
1125 The function will present the main menu of the system setup,\r
1126 this is the platform reference part and can be customize.\r
1127\r
1128\r
1129 @param TimeoutDefault The fault time out value before the system\r
1130 continue to boot.\r
1131 @param ConnectAllHappened The indicater to check if the connect all have\r
baf46e70 1132 already happened.\r
5c08e117 1133\r
1134**/\r
1135VOID\r
1136PlatformBdsEnterFrontPage (\r
1137 IN UINT16 TimeoutDefault,\r
1138 IN BOOLEAN ConnectAllHappened\r
1139 )\r
1140{\r
1141 EFI_STATUS Status;\r
a637802c 1142 EFI_BOOT_LOGO_PROTOCOL *BootLogo;\r
5c08e117 1143\r
128efbbc 1144 PERF_START (NULL, "BdsTimeOut", "BDS", 0);\r
5c08e117 1145 //\r
1146 // Indicate if we need connect all in the platform setup\r
1147 //\r
1148 if (ConnectAllHappened) {\r
1149 gConnectAllHappened = TRUE;\r
1150 }\r
1151\r
d394581d 1152 HotkeyBoot ();\r
5c08e117 1153 if (TimeoutDefault != 0xffff) {\r
1154 Status = ShowProgress (TimeoutDefault);\r
d394581d 1155 HotkeyBoot ();\r
5c08e117 1156\r
1157 //\r
1158 // Ensure screen is clear when switch Console from Graphics mode to Text mode\r
1159 //\r
1160 gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
1161 gST->ConOut->ClearScreen (gST->ConOut);\r
1162\r
1163 if (EFI_ERROR (Status)) {\r
1164 //\r
1165 // Timeout or user press enter to continue\r
1166 //\r
1167 goto Exit;\r
1168 }\r
1169 }\r
1170\r
a637802c 1171 //\r
1172 // Boot Logo is corrupted, report it using Boot Logo protocol.\r
1173 //\r
1174 Status = gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo);\r
1175 if (!EFI_ERROR (Status) && (BootLogo != NULL)) {\r
1176 BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0);\r
1177 }\r
1178\r
5c08e117 1179 do {\r
72861c22 1180 //\r
1181 // Set proper video resolution and text mode for setup\r
1182 //\r
1183 ChangeModeForSetup ();\r
1184 \r
5c08e117 1185 InitializeFrontPage (FALSE);\r
1186\r
1187 //\r
1188 // Update Front Page strings\r
1189 //\r
1190 UpdateFrontPageStrings ();\r
1191\r
1192 gCallbackKey = 0;\r
1193 Status = CallFrontPage ();\r
1194\r
1195 //\r
1196 // If gCallbackKey is greater than 1 and less or equal to 5,\r
baf46e70 1197 // it will launch configuration utilities.\r
5c08e117 1198 // 2 = set language\r
1199 // 3 = boot manager\r
1200 // 4 = device manager\r
baf46e70 1201 // 5 = boot maintenance manager\r
5c08e117 1202 //\r
1203 if (gCallbackKey != 0) {\r
1204 REPORT_STATUS_CODE (\r
1205 EFI_PROGRESS_CODE,\r
1206 (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_USER_SETUP)\r
1207 );\r
1208 }\r
1209 //\r
1210 // Based on the key that was set, we can determine what to do\r
1211 //\r
1212 switch (gCallbackKey) {\r
1213 //\r
1214 // The first 4 entries in the Front Page are to be GUARANTEED to remain constant so IHV's can\r
1215 // describe to their customers in documentation how to find their setup information (namely\r
1216 // under the device manager and specific buckets)\r
1217 //\r
1218 // These entries consist of the Continue, Select language, Boot Manager, and Device Manager\r
1219 //\r
1220 case FRONT_PAGE_KEY_CONTINUE:\r
1221 //\r
1222 // User hit continue\r
1223 //\r
1224 break;\r
1225\r
1226 case FRONT_PAGE_KEY_LANGUAGE:\r
1227 //\r
1228 // User made a language setting change - display front page again\r
1229 //\r
1230 break;\r
1231\r
1232 case FRONT_PAGE_KEY_BOOT_MANAGER:\r
1233 //\r
1234 // User chose to run the Boot Manager\r
1235 //\r
bd2057a8 1236 CallBootManager ();\r
5c08e117 1237 break;\r
1238\r
1239 case FRONT_PAGE_KEY_DEVICE_MANAGER:\r
1240 //\r
1241 // Display the Device Manager\r
1242 //\r
1243 do {\r
bd2057a8 1244 CallDeviceManager ();\r
5c08e117 1245 } while (gCallbackKey == FRONT_PAGE_KEY_DEVICE_MANAGER);\r
1246 break;\r
1247\r
1248 case FRONT_PAGE_KEY_BOOT_MAINTAIN:\r
1249 //\r
1250 // Display the Boot Maintenance Manager\r
1251 //\r
1252 BdsStartBootMaint ();\r
1253 break;\r
1254 }\r
1255\r
1256 } while ((Status == EFI_SUCCESS) && (gCallbackKey != FRONT_PAGE_KEY_CONTINUE));\r
1257\r
1258 //\r
1259 //Will leave browser, check any reset required change is applied? if yes, reset system\r
1260 //\r
1261 SetupResetReminder ();\r
1262\r
1263Exit:\r
1264 //\r
1265 // Automatically load current entry\r
1266 // Note: The following lines of code only execute when Auto boot\r
1267 // takes affect\r
1268 //\r
128efbbc 1269 PERF_END (NULL, "BdsTimeOut", "BDS", 0);\r
5c08e117 1270}\r