]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Application/UiApp/FrontPage.c
MdePkg: Convert all .uni files to utf-8
[mirror_edk2.git] / MdeModulePkg / Application / UiApp / FrontPage.c
CommitLineData
143f0b1d
ED
1/** @file\r
2 FrontPage routines to handle the callbacks and browser calls\r
3\r
afc244a5 4Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
143f0b1d
ED
5This 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
13**/\r
14\r
15#include "FrontPage.h"\r
16#include "Language.h"\r
17#define MAX_STRING_LEN 200\r
18\r
ce7690e2 19EFI_GUID mFrontPageGuid = FRONT_PAGE_FORMSET_GUID;\r
143f0b1d
ED
20\r
21BOOLEAN gConnectAllHappened = FALSE;\r
22BOOLEAN mFeaturerSwitch = TRUE;\r
23BOOLEAN mResetRequired = FALSE;\r
143f0b1d
ED
24\r
25EFI_FORM_BROWSER2_PROTOCOL *gFormBrowser2;\r
26CHAR8 *mLanguageString;\r
27BOOLEAN mModeInitialized = FALSE;\r
28//\r
29// Boot video resolution and text mode.\r
30//\r
31UINT32 mBootHorizontalResolution = 0;\r
32UINT32 mBootVerticalResolution = 0;\r
33UINT32 mBootTextModeColumn = 0;\r
34UINT32 mBootTextModeRow = 0;\r
35//\r
36// BIOS setup video resolution and text mode.\r
37//\r
38UINT32 mSetupTextModeColumn = 0;\r
39UINT32 mSetupTextModeRow = 0;\r
40UINT32 mSetupHorizontalResolution = 0;\r
41UINT32 mSetupVerticalResolution = 0;\r
42\r
43FRONT_PAGE_CALLBACK_DATA gFrontPagePrivate = {\r
44 FRONT_PAGE_CALLBACK_DATA_SIGNATURE,\r
45 NULL,\r
46 NULL,\r
47 NULL,\r
48 {\r
49 FakeExtractConfig,\r
50 FakeRouteConfig,\r
51 FrontPageCallback\r
52 }\r
53};\r
54\r
55HII_VENDOR_DEVICE_PATH mFrontPageHiiVendorDevicePath = {\r
56 {\r
57 {\r
58 HARDWARE_DEVICE_PATH,\r
59 HW_VENDOR_DP,\r
60 {\r
61 (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
62 (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
63 }\r
64 },\r
65 //\r
66 // {8E6D99EE-7531-48f8-8745-7F6144468FF2}\r
67 //\r
68 { 0x8e6d99ee, 0x7531, 0x48f8, { 0x87, 0x45, 0x7f, 0x61, 0x44, 0x46, 0x8f, 0xf2 } }\r
69 },\r
70 {\r
71 END_DEVICE_PATH_TYPE,\r
72 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
73 {\r
74 (UINT8) (END_DEVICE_PATH_LENGTH),\r
75 (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
76 }\r
77 }\r
78};\r
79\r
80/**\r
81 Update the banner information for the Front Page based on Smbios information.\r
82\r
83**/\r
84VOID\r
85UpdateFrontPageStrings (\r
86 VOID\r
87 );\r
88\r
89/**\r
90 This function allows a caller to extract the current configuration for one\r
91 or more named elements from the target driver.\r
92\r
93\r
94 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
95 @param Request A null-terminated Unicode string in <ConfigRequest> format.\r
96 @param Progress On return, points to a character in the Request string.\r
97 Points to the string's null terminator if request was successful.\r
98 Points to the most recent '&' before the first failing name/value\r
99 pair (or the beginning of the string if the failure is in the\r
100 first name/value pair) if the request was not successful.\r
101 @param Results A null-terminated Unicode string in <ConfigAltResp> format which\r
102 has all values filled in for the names in the Request string.\r
103 String to be allocated by the called function.\r
104\r
105 @retval EFI_SUCCESS The Results is filled with the requested values.\r
106 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
107 @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name.\r
108 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.\r
109\r
110**/\r
111EFI_STATUS\r
112EFIAPI\r
113FakeExtractConfig (\r
114 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
115 IN CONST EFI_STRING Request,\r
116 OUT EFI_STRING *Progress,\r
117 OUT EFI_STRING *Results\r
118 )\r
119{\r
120 if (Progress == NULL || Results == NULL) {\r
121 return EFI_INVALID_PARAMETER;\r
122 }\r
123 *Progress = Request;\r
124 return EFI_NOT_FOUND;\r
125}\r
126\r
127/**\r
128 This function processes the results of changes in configuration.\r
129\r
130\r
131 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
132 @param Configuration A null-terminated Unicode string in <ConfigResp> format.\r
133 @param Progress A pointer to a string filled in with the offset of the most\r
134 recent '&' before the first failing name/value pair (or the\r
135 beginning of the string if the failure is in the first\r
136 name/value pair) or the terminating NULL if all was successful.\r
137\r
138 @retval EFI_SUCCESS The Results is processed successfully.\r
139 @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
140 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.\r
141\r
142**/\r
143EFI_STATUS\r
144EFIAPI\r
145FakeRouteConfig (\r
146 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
147 IN CONST EFI_STRING Configuration,\r
148 OUT EFI_STRING *Progress\r
149 )\r
150{\r
151 if (Configuration == NULL || Progress == NULL) {\r
152 return EFI_INVALID_PARAMETER;\r
153 }\r
154\r
ce7690e2 155 return EFI_NOT_FOUND;\r
143f0b1d
ED
156}\r
157\r
158/**\r
159 Create oneof options for language.\r
160\r
161**/\r
162VOID\r
163InitializeLanguage (\r
164 VOID\r
165 )\r
166{\r
167 EFI_STATUS Status;\r
168 CHAR8 *LangCode;\r
169 CHAR8 *Lang;\r
170 CHAR8 *CurrentLang;\r
171 UINTN OptionCount;\r
172 CHAR16 *StringBuffer;\r
173 EFI_HII_HANDLE HiiHandle;\r
174 VOID *OptionsOpCodeHandle;\r
175 VOID *StartOpCodeHandle;\r
176 VOID *EndOpCodeHandle;\r
177 EFI_IFR_GUID_LABEL *StartLabel;\r
178 EFI_IFR_GUID_LABEL *EndLabel; \r
179 EFI_HII_STRING_PROTOCOL *HiiString;\r
180 UINTN StringSize;\r
181\r
182 Lang = NULL;\r
183 StringBuffer = NULL;\r
184\r
185 //\r
186 // Init OpCode Handle and Allocate space for creation of UpdateData Buffer\r
187 //\r
188 StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
189 ASSERT (StartOpCodeHandle != NULL);\r
190\r
191 EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
192 ASSERT (EndOpCodeHandle != NULL);\r
193\r
194 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
195 ASSERT (OptionsOpCodeHandle != NULL);\r
196 //\r
197 // Create Hii Extend Label OpCode as the start opcode\r
198 //\r
199 StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
200 StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
201 StartLabel->Number = LABEL_SELECT_LANGUAGE;\r
202\r
203 //\r
204 // Create Hii Extend Label OpCode as the end opcode\r
205 //\r
206 EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
207 EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
208 EndLabel->Number = LABEL_END;\r
209 //\r
210 // Collect the languages from what our current Language support is based on our VFR\r
211 //\r
212 HiiHandle = gFrontPagePrivate.HiiHandle;\r
213\r
cf34f86b 214 GetEfiGlobalVariable2 (L"PlatformLang", (VOID**)&CurrentLang, NULL);\r
143f0b1d
ED
215\r
216 if (mLanguageString == NULL) {\r
217 //\r
218 // Get Support language list from variable.\r
219 //\r
cf34f86b 220 GetEfiGlobalVariable2 (L"PlatformLangCodes", (VOID**)&mLanguageString, NULL);\r
143f0b1d
ED
221 if (mLanguageString == NULL) {\r
222 mLanguageString = AllocateCopyPool (\r
223 AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)),\r
224 (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)\r
225 );\r
226 ASSERT (mLanguageString != NULL);\r
227 }\r
228 }\r
229\r
230 if (gFrontPagePrivate.LanguageToken == NULL) {\r
231 //\r
232 // Count the language list number.\r
233 // \r
234 LangCode = mLanguageString;\r
235 Lang = AllocatePool (AsciiStrSize (mLanguageString));\r
236 ASSERT (Lang != NULL);\r
237 OptionCount = 0;\r
238 while (*LangCode != 0) {\r
239 GetNextLanguage (&LangCode, Lang);\r
240 OptionCount ++;\r
241 }\r
242\r
243 //\r
244 // Allocate extra 1 as the end tag.\r
245 //\r
246 gFrontPagePrivate.LanguageToken = AllocateZeroPool ((OptionCount + 1) * sizeof (EFI_STRING_ID));\r
247 ASSERT (gFrontPagePrivate.LanguageToken != NULL);\r
248\r
249 Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &HiiString);\r
250 ASSERT_EFI_ERROR (Status);\r
251\r
252 LangCode = mLanguageString;\r
253 OptionCount = 0;\r
254 while (*LangCode != 0) {\r
255 GetNextLanguage (&LangCode, Lang);\r
256\r
257 StringSize = 0;\r
258 Status = HiiString->GetString (HiiString, Lang, HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, StringBuffer, &StringSize, NULL);\r
259 if (Status == EFI_BUFFER_TOO_SMALL) {\r
260 StringBuffer = AllocateZeroPool (StringSize);\r
261 ASSERT (StringBuffer != NULL);\r
262 Status = HiiString->GetString (HiiString, Lang, HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, StringBuffer, &StringSize, NULL);\r
263 ASSERT_EFI_ERROR (Status);\r
264 }\r
265\r
266 if (EFI_ERROR (Status)) {\r
267 StringBuffer = AllocatePool (AsciiStrSize (Lang) * sizeof (CHAR16));\r
268 ASSERT (StringBuffer != NULL);\r
269 AsciiStrToUnicodeStr (Lang, StringBuffer);\r
270 }\r
271\r
272 ASSERT (StringBuffer != NULL);\r
273 gFrontPagePrivate.LanguageToken[OptionCount] = HiiSetString (HiiHandle, 0, StringBuffer, NULL);\r
274 FreePool (StringBuffer);\r
275\r
276 OptionCount++;\r
277 }\r
278 }\r
279\r
280 ASSERT (gFrontPagePrivate.LanguageToken != NULL);\r
281 LangCode = mLanguageString;\r
282 OptionCount = 0;\r
283 if (Lang == NULL) {\r
284 Lang = AllocatePool (AsciiStrSize (mLanguageString));\r
285 ASSERT (Lang != NULL);\r
286 }\r
287 while (*LangCode != 0) {\r
288 GetNextLanguage (&LangCode, Lang);\r
289\r
290 if (CurrentLang != NULL && AsciiStrCmp (Lang, CurrentLang) == 0) {\r
291 HiiCreateOneOfOptionOpCode (\r
292 OptionsOpCodeHandle,\r
293 gFrontPagePrivate.LanguageToken[OptionCount],\r
294 EFI_IFR_OPTION_DEFAULT,\r
295 EFI_IFR_NUMERIC_SIZE_1,\r
296 (UINT8) OptionCount\r
297 );\r
298 } else {\r
299 HiiCreateOneOfOptionOpCode (\r
300 OptionsOpCodeHandle,\r
301 gFrontPagePrivate.LanguageToken[OptionCount],\r
302 0,\r
303 EFI_IFR_NUMERIC_SIZE_1,\r
304 (UINT8) OptionCount\r
305 );\r
306 }\r
307\r
308 OptionCount++;\r
309 }\r
310\r
311 if (CurrentLang != NULL) {\r
312 FreePool (CurrentLang);\r
313 }\r
314 FreePool (Lang);\r
315\r
316 HiiCreateOneOfOpCode (\r
317 StartOpCodeHandle,\r
318 FRONT_PAGE_KEY_LANGUAGE,\r
319 0,\r
320 0,\r
321 STRING_TOKEN (STR_LANGUAGE_SELECT),\r
322 STRING_TOKEN (STR_LANGUAGE_SELECT_HELP),\r
323 EFI_IFR_FLAG_CALLBACK,\r
324 EFI_IFR_NUMERIC_SIZE_1,\r
325 OptionsOpCodeHandle,\r
326 NULL\r
327 );\r
328\r
329 Status = HiiUpdateForm (\r
330 HiiHandle,\r
331 &mFrontPageGuid,\r
332 FRONT_PAGE_FORM_ID,\r
333 StartOpCodeHandle, // LABEL_SELECT_LANGUAGE\r
334 EndOpCodeHandle // LABEL_END\r
335 );\r
336\r
337 HiiFreeOpCodeHandle (StartOpCodeHandle);\r
338 HiiFreeOpCodeHandle (EndOpCodeHandle);\r
339 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
340}\r
341\r
342/**\r
343 This function processes the results of changes in configuration.\r
344\r
345\r
346 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
347 @param Action Specifies the type of action taken by the browser.\r
348 @param QuestionId A unique value which is sent to the original exporting driver\r
349 so that it can identify the type of data to expect.\r
350 @param Type The type of value for the question.\r
351 @param Value A pointer to the data being sent to the original exporting driver.\r
352 @param ActionRequest On return, points to the action requested by the callback function.\r
353\r
354 @retval EFI_SUCCESS The callback successfully handled the action.\r
355 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the variable and its data.\r
356 @retval EFI_DEVICE_ERROR The variable could not be saved.\r
357 @retval EFI_UNSUPPORTED The specified Action is not supported by the callback.\r
358\r
359**/\r
360EFI_STATUS\r
361EFIAPI\r
362FrontPageCallback (\r
363 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
364 IN EFI_BROWSER_ACTION Action,\r
365 IN EFI_QUESTION_ID QuestionId,\r
366 IN UINT8 Type,\r
367 IN EFI_IFR_TYPE_VALUE *Value,\r
368 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
369 )\r
370{\r
371 CHAR8 *LangCode;\r
372 CHAR8 *Lang;\r
373 UINTN Index;\r
374 EFI_STATUS Status;\r
375\r
ce7690e2 376 if (Action != EFI_BROWSER_ACTION_CHANGED) {\r
143f0b1d
ED
377 //\r
378 // Do nothing for other UEFI Action. Only do call back when data is changed.\r
379 //\r
380 return EFI_UNSUPPORTED;\r
381 }\r
382\r
383 if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
384 if ((Value == NULL) || (ActionRequest == NULL)) {\r
385 return EFI_INVALID_PARAMETER;\r
386 }\r
387\r
388 switch (QuestionId) {\r
389 case FRONT_PAGE_KEY_CONTINUE:\r
390 //\r
391 // This is the continue - clear the screen and return an error to get out of FrontPage loop\r
392 //\r
393 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
394 break;\r
395\r
396 case FRONT_PAGE_KEY_LANGUAGE:\r
397 //\r
398 // Allocate working buffer for RFC 4646 language in supported LanguageString.\r
399 //\r
400 Lang = AllocatePool (AsciiStrSize (mLanguageString));\r
401 ASSERT (Lang != NULL); \r
402\r
403 Index = 0;\r
404 LangCode = mLanguageString;\r
405 while (*LangCode != 0) {\r
406 GetNextLanguage (&LangCode, Lang);\r
407\r
408 if (Index == Value->u8) {\r
409 break;\r
410 }\r
411\r
412 Index++;\r
413 }\r
414\r
415 if (Index == Value->u8) {\r
416 Status = gRT->SetVariable (\r
417 L"PlatformLang",\r
418 &gEfiGlobalVariableGuid,\r
419 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
420 AsciiStrSize (Lang),\r
421 Lang\r
422 );\r
423 ASSERT_EFI_ERROR(Status);\r
424 } else {\r
425 ASSERT (FALSE);\r
426 }\r
427 FreePool (Lang);\r
428 //\r
429 //Current language of platform is changed,recreate oneof options for language.\r
430 //\r
431 InitializeLanguage();\r
432 break;\r
433\r
143f0b1d
ED
434 default:\r
435 break;\r
436 }\r
ce7690e2
DB
437 }\r
438\r
439 return EFI_SUCCESS;\r
440}\r
441\r
442/**\r
443Update front page form base on the ClassGuid in the formset in other modules.\r
444\r
445**/\r
446VOID\r
447UpdateFrontPageForm (\r
448 VOID\r
449 )\r
450{\r
451 EFI_STATUS Status;\r
452 EFI_HII_HANDLE HiiHandle;\r
453 VOID *StartOpCodeHandle;\r
454 VOID *EndOpCodeHandle;\r
455 EFI_IFR_GUID_LABEL *StartLabel;\r
456 EFI_IFR_GUID_LABEL *EndLabel;\r
457 UINTN Index;\r
458 EFI_STRING String;\r
459 EFI_STRING_ID Token;\r
460 EFI_STRING_ID TokenHelp;\r
461 EFI_HII_HANDLE *HiiHandles;\r
462 EFI_GUID FormSetGuid;\r
463 CHAR16 *DevicePathStr;\r
464 EFI_STRING_ID DevicePathId;\r
465 EFI_IFR_FORM_SET *Buffer;\r
466 UINTN BufferSize;\r
467 UINT8 ClassGuidNum;\r
468 EFI_GUID *ClassGuid;\r
469 UINTN TempSize;\r
470 UINT8 *Ptr;\r
471\r
472 TempSize =0;\r
473 BufferSize = 0;\r
474 Buffer = NULL;\r
475\r
476 HiiHandle = gFrontPagePrivate.HiiHandle;\r
477\r
478 //\r
479 // Allocate space for creation of UpdateData Buffer\r
480 //\r
481 StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
482 ASSERT (StartOpCodeHandle != NULL);\r
483\r
484 EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
485 ASSERT (EndOpCodeHandle != NULL);\r
486 //\r
487 // Create Hii Extend Label OpCode as the start opcode\r
488 //\r
489 StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
490 StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
491 StartLabel->Number = LABEL_PLATFORM_INFORMATION;\r
492 //\r
493 // Create Hii Extend Label OpCode as the end opcode\r
494 //\r
495 EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
496 EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
497 EndLabel->Number = LABEL_END;\r
498\r
499 //\r
500 // Get all the Hii handles\r
501 //\r
502 HiiHandles = HiiGetHiiHandles (NULL);\r
503 ASSERT (HiiHandles != NULL);\r
504 //\r
505 // Search for formset of each class type\r
506 //\r
507 for (Index = 0; HiiHandles[Index] != NULL; Index++) {\r
508 Status = HiiGetFormSetFromHiiHandle(HiiHandles[Index], &Buffer,&BufferSize);\r
509 if (EFI_ERROR (Status)) {\r
510 continue;\r
143f0b1d
ED
511 }\r
512\r
ce7690e2
DB
513 Ptr = (UINT8 *)Buffer;\r
514 while(TempSize < BufferSize) {\r
515 TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
143f0b1d 516\r
ce7690e2
DB
517 if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){\r
518 Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
519 continue;\r
520 }\r
143f0b1d 521\r
143f0b1d 522 //\r
ce7690e2 523 // Find Class Guid\r
143f0b1d 524 //\r
ce7690e2
DB
525 ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);\r
526 ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));\r
527 while (ClassGuidNum-- > 0) {\r
528 if (CompareGuid (&gEfiIfrFrontPageGuid, ClassGuid) == 0){\r
529 ClassGuid ++;\r
530 continue;\r
531 }\r
143f0b1d 532\r
ce7690e2
DB
533 String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle, NULL);\r
534 if (String == NULL) {\r
535 String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
536 ASSERT (String != NULL);\r
537 }\r
538 Token = HiiSetString (HiiHandle, 0, String, NULL);\r
539 FreePool (String);\r
540\r
541 String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->Help, NULL);\r
542\r
543 if (String == NULL) {\r
544 String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
545 ASSERT (String != NULL);\r
546 }\r
547 TokenHelp = HiiSetString (HiiHandle, 0, String, NULL);\r
548 FreePool (String);\r
549\r
550 FormSetGuid = ((EFI_IFR_FORM_SET *)Ptr)->Guid;\r
551\r
552 DevicePathStr = ExtractDevicePathFromHiiHandle(HiiHandles[Index]);\r
553 DevicePathId = 0;\r
554 if (DevicePathStr != NULL){\r
555 DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);\r
556 FreePool (DevicePathStr);\r
557 }\r
558 HiiCreateGotoExOpCode (\r
559 StartOpCodeHandle,\r
560 0,\r
561 Token,\r
562 TokenHelp,\r
563 0,\r
564 (EFI_QUESTION_ID) (Index + FRONT_PAGE_KEY_OFFSET),\r
565 0,\r
566 &FormSetGuid,\r
567 DevicePathId\r
568 );\r
569 break;\r
570 }\r
571 Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
143f0b1d 572 }\r
ce7690e2
DB
573\r
574 FreePool(Buffer);\r
575 Buffer = NULL;\r
576 TempSize = 0;\r
577 BufferSize = 0;\r
143f0b1d
ED
578 }\r
579\r
ce7690e2
DB
580 HiiUpdateForm (\r
581 HiiHandle,\r
582 &mFrontPageGuid,\r
583 FRONT_PAGE_FORM_ID,\r
584 StartOpCodeHandle,\r
585 EndOpCodeHandle\r
586 );\r
587\r
588 HiiFreeOpCodeHandle (StartOpCodeHandle);\r
589 HiiFreeOpCodeHandle (EndOpCodeHandle);\r
590 FreePool (HiiHandles);\r
143f0b1d
ED
591}\r
592\r
593/**\r
594 Initialize HII information for the FrontPage\r
595\r
596\r
597 @retval EFI_SUCCESS The operation is successful.\r
598 @retval EFI_DEVICE_ERROR If the dynamic opcode creation failed.\r
599\r
600**/\r
601EFI_STATUS\r
602InitializeFrontPage (\r
603 VOID\r
604 )\r
605{\r
606 EFI_STATUS Status;\r
143f0b1d
ED
607 //\r
608 // Locate Hii relative protocols\r
609 //\r
610 Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &gFormBrowser2);\r
611 if (EFI_ERROR (Status)) {\r
612 return Status;\r
613 }\r
614\r
615 //\r
616 // Install Device Path Protocol and Config Access protocol to driver handle\r
617 //\r
618 gFrontPagePrivate.DriverHandle = NULL;\r
619 Status = gBS->InstallMultipleProtocolInterfaces (\r
620 &gFrontPagePrivate.DriverHandle,\r
621 &gEfiDevicePathProtocolGuid,\r
622 &mFrontPageHiiVendorDevicePath,\r
623 &gEfiHiiConfigAccessProtocolGuid,\r
624 &gFrontPagePrivate.ConfigAccess,\r
625 NULL\r
626 );\r
627 ASSERT_EFI_ERROR (Status);\r
628\r
629 //\r
630 // Publish our HII data\r
631 //\r
632 gFrontPagePrivate.HiiHandle = HiiAddPackages (\r
633 &mFrontPageGuid,\r
634 gFrontPagePrivate.DriverHandle,\r
635 FrontPageVfrBin,\r
636 UiAppStrings,\r
637 NULL\r
638 );\r
639 ASSERT (gFrontPagePrivate.HiiHandle != NULL);\r
640\r
641 //\r
642 //Updata Front Page strings\r
643 //\r
644 UpdateFrontPageStrings ();\r
645\r
646 //\r
647 // Initialize laguage options\r
648 //\r
649 InitializeLanguage ();\r
650\r
ce7690e2
DB
651 //\r
652 //Updata Front Page form\r
653 //\r
654 UpdateFrontPageForm();\r
655\r
143f0b1d
ED
656 return Status;\r
657}\r
658\r
659/**\r
660 Call the browser and display the front page\r
661\r
662 @return Status code that will be returned by\r
663 EFI_FORM_BROWSER2_PROTOCOL.SendForm ().\r
664\r
665**/\r
666EFI_STATUS\r
667CallFrontPage (\r
668 VOID\r
669 )\r
670{\r
671 EFI_STATUS Status;\r
672 EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
673\r
674 //\r
675 // Begin waiting for USER INPUT\r
676 //\r
677 REPORT_STATUS_CODE (\r
678 EFI_PROGRESS_CODE,\r
679 (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_INPUT_WAIT)\r
680 );\r
681\r
682 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
683 Status = gFormBrowser2->SendForm (\r
684 gFormBrowser2,\r
685 &gFrontPagePrivate.HiiHandle,\r
686 1,\r
687 &mFrontPageGuid,\r
688 0,\r
689 NULL,\r
690 &ActionRequest\r
691 );\r
692 //\r
693 // Check whether user change any option setting which needs a reset to be effective\r
694 //\r
695 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
696 EnableResetRequired ();\r
697 }\r
698\r
699 return Status;\r
700}\r
701\r
3194d76f
DB
702/**\r
703 Remove the installed packages from the HiiDatabase.\r
704\r
705**/\r
143f0b1d
ED
706VOID\r
707FreeFrontPage(\r
708 VOID\r
709 )\r
710{\r
711 EFI_STATUS Status;\r
712 Status = gBS->UninstallMultipleProtocolInterfaces (\r
713 gFrontPagePrivate.DriverHandle,\r
714 &gEfiDevicePathProtocolGuid,\r
715 &mFrontPageHiiVendorDevicePath,\r
716 &gEfiHiiConfigAccessProtocolGuid,\r
717 &gFrontPagePrivate.ConfigAccess,\r
718 NULL\r
719 );\r
720 ASSERT_EFI_ERROR (Status);\r
721\r
722 //\r
723 // Publish our HII data\r
724 //\r
725 HiiRemovePackages (gFrontPagePrivate.HiiHandle);\r
726 if (gFrontPagePrivate.LanguageToken != NULL) {\r
727 FreePool (gFrontPagePrivate.LanguageToken);\r
728 gFrontPagePrivate.LanguageToken = NULL;\r
729 }\r
730}\r
731\r
732/**\r
733 Convert Processor Frequency Data to a string.\r
734\r
735 @param ProcessorFrequency The frequency data to process\r
736 @param Base10Exponent The exponent based on 10\r
737 @param String The string that is created\r
738\r
739**/\r
740VOID\r
741ConvertProcessorToString (\r
742 IN UINT16 ProcessorFrequency,\r
743 IN UINT16 Base10Exponent,\r
744 OUT CHAR16 **String\r
745 )\r
746{\r
747 CHAR16 *StringBuffer;\r
748 UINTN Index;\r
d91cb870 749 UINTN DestMax;\r
143f0b1d
ED
750 UINT32 FreqMhz;\r
751\r
752 if (Base10Exponent >= 6) {\r
753 FreqMhz = ProcessorFrequency;\r
754 for (Index = 0; Index < (UINTN) (Base10Exponent - 6); Index++) {\r
755 FreqMhz *= 10;\r
756 }\r
757 } else {\r
758 FreqMhz = 0;\r
759 }\r
d91cb870 760 DestMax = 0x20 / sizeof (CHAR16);\r
143f0b1d
ED
761 StringBuffer = AllocateZeroPool (0x20);\r
762 ASSERT (StringBuffer != NULL);\r
763 Index = UnicodeValueToString (StringBuffer, LEFT_JUSTIFY, FreqMhz / 1000, 3);\r
d91cb870 764 StrCatS (StringBuffer, DestMax, L".");\r
143f0b1d 765 UnicodeValueToString (StringBuffer + Index + 1, PREFIX_ZERO, (FreqMhz % 1000) / 10, 2);\r
d91cb870 766 StrCatS (StringBuffer, DestMax, L" GHz");\r
143f0b1d
ED
767 *String = (CHAR16 *) StringBuffer;\r
768 return ;\r
769}\r
770\r
771\r
772/**\r
773 Convert Memory Size to a string.\r
774\r
775 @param MemorySize The size of the memory to process\r
776 @param String The string that is created\r
777\r
778**/\r
779VOID\r
780ConvertMemorySizeToString (\r
781 IN UINT32 MemorySize,\r
782 OUT CHAR16 **String\r
783 )\r
784{\r
785 CHAR16 *StringBuffer;\r
786\r
787 StringBuffer = AllocateZeroPool (0x24);\r
788 ASSERT (StringBuffer != NULL);\r
789 UnicodeValueToString (StringBuffer, LEFT_JUSTIFY, MemorySize, 10);\r
d91cb870 790 StrCatS (StringBuffer, 0x24 / sizeof (CHAR16), L" MB RAM");\r
143f0b1d
ED
791\r
792 *String = (CHAR16 *) StringBuffer;\r
793\r
794 return ;\r
795}\r
796\r
797/**\r
798\r
799 Acquire the string associated with the Index from smbios structure and return it.\r
800 The caller is responsible for free the string buffer.\r
801\r
802 @param OptionalStrStart The start position to search the string\r
803 @param Index The index of the string to extract\r
804 @param String The string that is extracted\r
805\r
806 @retval EFI_SUCCESS The function returns EFI_SUCCESS always.\r
807\r
808**/\r
809EFI_STATUS\r
810GetOptionalStringByIndex (\r
811 IN CHAR8 *OptionalStrStart,\r
812 IN UINT8 Index,\r
813 OUT CHAR16 **String\r
814 )\r
815{\r
816 UINTN StrSize;\r
817\r
818 if (Index == 0) {\r
819 *String = AllocateZeroPool (sizeof (CHAR16));\r
820 return EFI_SUCCESS;\r
821 }\r
822\r
823 StrSize = 0;\r
824 do {\r
825 Index--;\r
826 OptionalStrStart += StrSize;\r
827 StrSize = AsciiStrSize (OptionalStrStart);\r
828 } while (OptionalStrStart[StrSize] != 0 && Index != 0);\r
829\r
830 if ((Index != 0) || (StrSize == 1)) {\r
831 //\r
832 // Meet the end of strings set but Index is non-zero, or\r
833 // Find an empty string\r
834 //\r
835 *String = GetStringById (STRING_TOKEN (STR_MISSING_STRING));\r
836 } else {\r
837 *String = AllocatePool (StrSize * sizeof (CHAR16));\r
838 AsciiStrToUnicodeStr (OptionalStrStart, *String);\r
839 }\r
840\r
841 return EFI_SUCCESS;\r
842}\r
843\r
844\r
845/**\r
846 Update the banner information for the Front Page based on Smbios information.\r
847**/\r
848VOID\r
849UpdateFrontPageStrings (\r
850 VOID\r
851 )\r
852{\r
853 UINT8 StrIndex;\r
854 CHAR16 *NewString;\r
855 CHAR16 *FirmwareVersionString;\r
856 BOOLEAN Find[5];\r
857 EFI_STATUS Status;\r
858 EFI_STRING_ID TokenToUpdate;\r
859 EFI_SMBIOS_HANDLE SmbiosHandle;\r
860 EFI_SMBIOS_PROTOCOL *Smbios;\r
861 SMBIOS_TABLE_TYPE0 *Type0Record;\r
862 SMBIOS_TABLE_TYPE1 *Type1Record;\r
863 SMBIOS_TABLE_TYPE4 *Type4Record;\r
864 SMBIOS_TABLE_TYPE19 *Type19Record;\r
865 EFI_SMBIOS_TABLE_HEADER *Record;\r
866\r
867 ZeroMem (Find, sizeof (Find));\r
868\r
869 //\r
870 // Update Front Page strings\r
871 //\r
872 Status = gBS->LocateProtocol (\r
873 &gEfiSmbiosProtocolGuid,\r
874 NULL,\r
875 (VOID **) &Smbios\r
876 );\r
877 if (EFI_ERROR (Status)) {\r
878 return ;\r
879 }\r
880\r
881 SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
882 do {\r
883 Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);\r
884 if (EFI_ERROR(Status)) {\r
885 break;\r
886 }\r
887\r
888 if (Record->Type == EFI_SMBIOS_TYPE_BIOS_INFORMATION) {\r
889 Type0Record = (SMBIOS_TABLE_TYPE0 *) Record;\r
890 StrIndex = Type0Record->BiosVersion;\r
891 GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type0Record + Type0Record->Hdr.Length), StrIndex, &NewString);\r
892 TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION);\r
893 FirmwareVersionString = (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString);\r
894 if (*FirmwareVersionString != 0x0000 ) {\r
895 FreePool (NewString);\r
896 NewString = (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString);\r
897 HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
898 } else {\r
899 HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
900 FreePool (NewString);\r
901 }\r
902 Find[0] = TRUE;\r
903 } \r
904\r
905 if (Record->Type == EFI_SMBIOS_TYPE_SYSTEM_INFORMATION) {\r
906 Type1Record = (SMBIOS_TABLE_TYPE1 *) Record;\r
907 StrIndex = Type1Record->ProductName;\r
908 GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type1Record + Type1Record->Hdr.Length), StrIndex, &NewString);\r
909 TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL);\r
910 HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
911 FreePool (NewString);\r
912 Find[1] = TRUE;\r
913 }\r
914\r
915 if ((Record->Type == EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION) && !Find[2]) {\r
916 Type4Record = (SMBIOS_TABLE_TYPE4 *) Record;\r
917 //\r
918 // The information in the record should be only valid when the CPU Socket is populated. \r
919 //\r
920 if ((Type4Record->Status & SMBIOS_TYPE4_CPU_SOCKET_POPULATED) == SMBIOS_TYPE4_CPU_SOCKET_POPULATED) {\r
921 StrIndex = Type4Record->ProcessorVersion;\r
922 GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type4Record + Type4Record->Hdr.Length), StrIndex, &NewString);\r
923 TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL);\r
924 HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
925 FreePool (NewString);\r
926 Find[2] = TRUE;\r
927 }\r
928 } \r
929\r
930 if ((Record->Type == EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION) && !Find[3]) {\r
931 Type4Record = (SMBIOS_TABLE_TYPE4 *) Record;\r
932 //\r
933 // The information in the record should be only valid when the CPU Socket is populated. \r
934 //\r
935 if ((Type4Record->Status & SMBIOS_TYPE4_CPU_SOCKET_POPULATED) == SMBIOS_TYPE4_CPU_SOCKET_POPULATED) {\r
936 ConvertProcessorToString(Type4Record->CurrentSpeed, 6, &NewString);\r
937 TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED);\r
938 HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
939 FreePool (NewString);\r
940 Find[3] = TRUE;\r
941 }\r
942 } \r
943\r
944 if ( Record->Type == EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS ) {\r
945 Type19Record = (SMBIOS_TABLE_TYPE19 *) Record;\r
946 ConvertMemorySizeToString (\r
947 (UINT32)(RShiftU64((Type19Record->EndingAddress - Type19Record->StartingAddress + 1), 10)),\r
948 &NewString\r
949 );\r
950 TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE);\r
951 HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
952 FreePool (NewString);\r
953 Find[4] = TRUE; \r
954 }\r
955 } while ( !(Find[0] && Find[1] && Find[2] && Find[3] && Find[4]));\r
956 return ;\r
957}\r
958\r
959/**\r
960 This function will change video resolution and text mode\r
961 according to defined setup mode or defined boot mode \r
962\r
963 @param IsSetupMode Indicate mode is changed to setup mode or boot mode. \r
964\r
965 @retval EFI_SUCCESS Mode is changed successfully.\r
966 @retval Others Mode failed to be changed.\r
967\r
968**/\r
969EFI_STATUS\r
970EFIAPI\r
971BdsSetConsoleMode (\r
972 BOOLEAN IsSetupMode\r
973 )\r
974{\r
975 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
976 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;\r
977 UINTN SizeOfInfo;\r
978 EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
979 UINT32 MaxGopMode;\r
980 UINT32 MaxTextMode;\r
981 UINT32 ModeNumber;\r
982 UINT32 NewHorizontalResolution;\r
983 UINT32 NewVerticalResolution;\r
984 UINT32 NewColumns;\r
985 UINT32 NewRows;\r
986 UINTN HandleCount;\r
987 EFI_HANDLE *HandleBuffer;\r
988 EFI_STATUS Status;\r
989 UINTN Index;\r
990 UINTN CurrentColumn;\r
991 UINTN CurrentRow; \r
992\r
993 MaxGopMode = 0;\r
994 MaxTextMode = 0;\r
995\r
996 //\r
997 // Get current video resolution and text mode \r
998 //\r
999 Status = gBS->HandleProtocol (\r
1000 gST->ConsoleOutHandle,\r
1001 &gEfiGraphicsOutputProtocolGuid,\r
1002 (VOID**)&GraphicsOutput\r
1003 );\r
1004 if (EFI_ERROR (Status)) {\r
1005 GraphicsOutput = NULL;\r
1006 }\r
1007\r
1008 Status = gBS->HandleProtocol (\r
1009 gST->ConsoleOutHandle,\r
1010 &gEfiSimpleTextOutProtocolGuid,\r
1011 (VOID**)&SimpleTextOut\r
1012 );\r
1013 if (EFI_ERROR (Status)) {\r
1014 SimpleTextOut = NULL;\r
1015 } \r
1016\r
1017 if ((GraphicsOutput == NULL) || (SimpleTextOut == NULL)) {\r
1018 return EFI_UNSUPPORTED;\r
1019 }\r
1020\r
1021 if (IsSetupMode) {\r
1022 //\r
1023 // The requried resolution and text mode is setup mode.\r
1024 //\r
1025 NewHorizontalResolution = mSetupHorizontalResolution;\r
1026 NewVerticalResolution = mSetupVerticalResolution;\r
1027 NewColumns = mSetupTextModeColumn;\r
1028 NewRows = mSetupTextModeRow;\r
1029 } else {\r
1030 //\r
1031 // The required resolution and text mode is boot mode.\r
1032 //\r
1033 NewHorizontalResolution = mBootHorizontalResolution;\r
1034 NewVerticalResolution = mBootVerticalResolution;\r
1035 NewColumns = mBootTextModeColumn;\r
1036 NewRows = mBootTextModeRow; \r
1037 }\r
1038 \r
1039 if (GraphicsOutput != NULL) {\r
1040 MaxGopMode = GraphicsOutput->Mode->MaxMode;\r
1041 } \r
1042\r
1043 if (SimpleTextOut != NULL) {\r
1044 MaxTextMode = SimpleTextOut->Mode->MaxMode;\r
1045 }\r
1046\r
1047 //\r
1048 // 1. If current video resolution is same with required video resolution,\r
1049 // video resolution need not be changed.\r
1050 // 1.1. If current text mode is same with required text mode, text mode need not be changed.\r
1051 // 1.2. If current text mode is different from required text mode, text mode need be changed.\r
1052 // 2. If current video resolution is different from required video resolution, we need restart whole console drivers.\r
1053 //\r
1054 for (ModeNumber = 0; ModeNumber < MaxGopMode; ModeNumber++) {\r
1055 Status = GraphicsOutput->QueryMode (\r
1056 GraphicsOutput,\r
1057 ModeNumber,\r
1058 &SizeOfInfo,\r
1059 &Info\r
1060 );\r
1061 if (!EFI_ERROR (Status)) {\r
1062 if ((Info->HorizontalResolution == NewHorizontalResolution) &&\r
1063 (Info->VerticalResolution == NewVerticalResolution)) {\r
1064 if ((GraphicsOutput->Mode->Info->HorizontalResolution == NewHorizontalResolution) &&\r
1065 (GraphicsOutput->Mode->Info->VerticalResolution == NewVerticalResolution)) {\r
1066 //\r
1067 // Current resolution is same with required resolution, check if text mode need be set\r
1068 //\r
1069 Status = SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow);\r
1070 ASSERT_EFI_ERROR (Status);\r
1071 if (CurrentColumn == NewColumns && CurrentRow == NewRows) {\r
1072 //\r
1073 // If current text mode is same with required text mode. Do nothing\r
1074 //\r
1075 FreePool (Info);\r
1076 return EFI_SUCCESS;\r
1077 } else {\r
1078 //\r
1079 // If current text mode is different from requried text mode. Set new video mode\r
1080 //\r
1081 for (Index = 0; Index < MaxTextMode; Index++) {\r
1082 Status = SimpleTextOut->QueryMode (SimpleTextOut, Index, &CurrentColumn, &CurrentRow);\r
1083 if (!EFI_ERROR(Status)) {\r
1084 if ((CurrentColumn == NewColumns) && (CurrentRow == NewRows)) {\r
1085 //\r
1086 // Required text mode is supported, set it.\r
1087 //\r
1088 Status = SimpleTextOut->SetMode (SimpleTextOut, Index);\r
1089 ASSERT_EFI_ERROR (Status);\r
1090 //\r
1091 // Update text mode PCD.\r
1092 //\r
377680ae
ED
1093 Status = PcdSet32S (PcdConOutColumn, mSetupTextModeColumn);\r
1094 ASSERT_EFI_ERROR (Status);\r
1095 Status = PcdSet32S (PcdConOutRow, mSetupTextModeRow);\r
1096 ASSERT_EFI_ERROR (Status);\r
143f0b1d
ED
1097 FreePool (Info);\r
1098 return EFI_SUCCESS;\r
1099 }\r
1100 }\r
1101 }\r
1102 if (Index == MaxTextMode) {\r
1103 //\r
1104 // If requried text mode is not supported, return error.\r
1105 //\r
1106 FreePool (Info);\r
1107 return EFI_UNSUPPORTED;\r
1108 }\r
1109 }\r
1110 } else {\r
1111 //\r
1112 // If current video resolution is not same with the new one, set new video resolution.\r
1113 // In this case, the driver which produces simple text out need be restarted.\r
1114 //\r
1115 Status = GraphicsOutput->SetMode (GraphicsOutput, ModeNumber);\r
1116 if (!EFI_ERROR (Status)) {\r
1117 FreePool (Info);\r
1118 break;\r
1119 }\r
1120 }\r
1121 }\r
1122 FreePool (Info);\r
1123 }\r
1124 }\r
1125\r
1126 if (ModeNumber == MaxGopMode) {\r
1127 //\r
1128 // If the resolution is not supported, return error.\r
1129 //\r
1130 return EFI_UNSUPPORTED;\r
1131 }\r
1132\r
1133 //\r
1134 // Set PCD to Inform GraphicsConsole to change video resolution.\r
1135 // Set PCD to Inform Consplitter to change text mode.\r
1136 //\r
377680ae
ED
1137 Status = PcdSet32S (PcdVideoHorizontalResolution, NewHorizontalResolution);\r
1138 ASSERT_EFI_ERROR (Status);\r
1139 Status = PcdSet32S (PcdVideoVerticalResolution, NewVerticalResolution);\r
1140 ASSERT_EFI_ERROR (Status);\r
1141 Status = PcdSet32S (PcdConOutColumn, NewColumns);\r
1142 ASSERT_EFI_ERROR (Status);\r
1143 Status = PcdSet32S (PcdConOutRow, NewRows);\r
1144 ASSERT_EFI_ERROR (Status);\r
143f0b1d
ED
1145 \r
1146 \r
1147 //\r
1148 // Video mode is changed, so restart graphics console driver and higher level driver.\r
1149 // Reconnect graphics console driver and higher level driver.\r
1150 // Locate all the handles with GOP protocol and reconnect it.\r
1151 //\r
1152 Status = gBS->LocateHandleBuffer (\r
1153 ByProtocol,\r
1154 &gEfiSimpleTextOutProtocolGuid,\r
1155 NULL,\r
1156 &HandleCount,\r
1157 &HandleBuffer\r
1158 );\r
1159 if (!EFI_ERROR (Status)) {\r
1160 for (Index = 0; Index < HandleCount; Index++) {\r
1161 gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);\r
1162 }\r
1163 for (Index = 0; Index < HandleCount; Index++) {\r
1164 gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);\r
1165 }\r
1166 if (HandleBuffer != NULL) {\r
1167 FreePool (HandleBuffer);\r
1168 }\r
1169 }\r
1170\r
1171 return EFI_SUCCESS;\r
1172}\r
1173\r
1174/**\r
1175 The user Entry Point for Application. The user code starts with this function\r
1176 as the real entry point for the image goes into a library that calls this \r
1177 function.\r
1178\r
1179 @param[in] ImageHandle The firmware allocated handle for the EFI image. \r
1180 @param[in] SystemTable A pointer to the EFI System Table.\r
1181 \r
1182 @retval EFI_SUCCESS The entry point is executed successfully.\r
1183 @retval other Some error occurs when executing this entry point.\r
1184\r
1185**/\r
1186EFI_STATUS\r
1187EFIAPI\r
1188InitializeUserInterface (\r
1189 IN EFI_HANDLE ImageHandle,\r
1190 IN EFI_SYSTEM_TABLE *SystemTable\r
1191 )\r
1192{\r
1193 EFI_HII_HANDLE HiiHandle;\r
1194 EFI_STATUS Status;\r
1195 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
1196 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;\r
1197 UINTN BootTextColumn;\r
1198 UINTN BootTextRow;\r
1199\r
1200 if (!mModeInitialized) {\r
1201 //\r
1202 // After the console is ready, get current video resolution \r
1203 // and text mode before launching setup at first time.\r
1204 //\r
1205 Status = gBS->HandleProtocol (\r
1206 gST->ConsoleOutHandle,\r
1207 &gEfiGraphicsOutputProtocolGuid,\r
1208 (VOID**)&GraphicsOutput\r
1209 );\r
1210 if (EFI_ERROR (Status)) {\r
1211 GraphicsOutput = NULL;\r
1212 }\r
1213 \r
1214 Status = gBS->HandleProtocol (\r
1215 gST->ConsoleOutHandle,\r
1216 &gEfiSimpleTextOutProtocolGuid,\r
1217 (VOID**)&SimpleTextOut\r
1218 );\r
1219 if (EFI_ERROR (Status)) {\r
1220 SimpleTextOut = NULL;\r
1221 } \r
1222\r
1223 if (GraphicsOutput != NULL) {\r
1224 //\r
1225 // Get current video resolution and text mode.\r
1226 //\r
1227 mBootHorizontalResolution = GraphicsOutput->Mode->Info->HorizontalResolution;\r
1228 mBootVerticalResolution = GraphicsOutput->Mode->Info->VerticalResolution;\r
1229 }\r
1230\r
1231 if (SimpleTextOut != NULL) {\r
1232 Status = SimpleTextOut->QueryMode (\r
1233 SimpleTextOut,\r
1234 SimpleTextOut->Mode->Mode,\r
1235 &BootTextColumn,\r
1236 &BootTextRow\r
1237 );\r
1238 mBootTextModeColumn = (UINT32)BootTextColumn;\r
1239 mBootTextModeRow = (UINT32)BootTextRow;\r
1240 }\r
1241\r
1242 //\r
1243 // Get user defined text mode for setup.\r
1244 // \r
1245 mSetupHorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution);\r
1246 mSetupVerticalResolution = PcdGet32 (PcdSetupVideoVerticalResolution); \r
1247 mSetupTextModeColumn = PcdGet32 (PcdSetupConOutColumn);\r
1248 mSetupTextModeRow = PcdGet32 (PcdSetupConOutRow);\r
1249\r
1250 mModeInitialized = TRUE;\r
1251 }\r
1252\r
1253 gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);\r
1254 gST->ConOut->ClearScreen (gST->ConOut);\r
1255 \r
1256 //\r
1257 // Install customized fonts needed by Front Page\r
1258 //\r
1259 \r
1260 HiiHandle = ExportFonts ();\r
1261 ASSERT (HiiHandle != NULL);\r
1262\r
1263 InitializeStringSupport ();\r
1264\r
1265 BdsSetConsoleMode (TRUE);\r
1266 UiEntry (FALSE);\r
1267 BdsSetConsoleMode (FALSE);\r
1268\r
1269 UninitializeStringSupport ();\r
1270 HiiRemovePackages (HiiHandle);\r
1271\r
1272 return EFI_SUCCESS;\r
1273}\r
1274\r
1275/**\r
1276 This function is the main entry of the UI entry.\r
1277 The function will present the main menu of the system UI.\r
1278\r
1279 @param ConnectAllHappened Caller passes the value to UI to avoid unnecessary connect-all.\r
1280\r
1281**/\r
1282VOID\r
1283EFIAPI\r
1284UiEntry (\r
1285 IN BOOLEAN ConnectAllHappened\r
1286 )\r
1287{\r
1288 EFI_STATUS Status;\r
1289 EFI_BOOT_LOGO_PROTOCOL *BootLogo;\r
1290\r
1291 //\r
1292 // Indicate if the connect all has been performed before.\r
1293 //\r
1294 if (ConnectAllHappened) {\r
1295 gConnectAllHappened = TRUE;\r
1296 }\r
1297\r
1298 //\r
1299 // The boot option enumeration time is acceptable in Ui driver\r
1300 //\r
1301 EfiBootManagerRefreshAllBootOption ();\r
1302\r
1303 //\r
1304 // Boot Logo is corrupted, report it using Boot Logo protocol.\r
1305 //\r
1306 Status = gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo);\r
1307 if (!EFI_ERROR (Status) && (BootLogo != NULL)) {\r
1308 BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0);\r
1309 }\r
1310\r
1311 InitializeFrontPage ();\r
143f0b1d
ED
1312\r
1313 CallFrontPage ();\r
1314\r
143f0b1d
ED
1315 FreeFrontPage ();\r
1316\r
1317 if (mLanguageString != NULL) {\r
1318 FreePool (mLanguageString);\r
1319 mLanguageString = NULL;\r
1320 }\r
1321\r
1322 //\r
1323 //Will leave browser, check any reset required change is applied? if yes, reset system\r
1324 //\r
1325 SetupResetReminder ();\r
1326}\r
1327\r
1328/**\r
1329 Extract device path for given HII handle and class guid.\r
1330\r
1331 @param Handle The HII handle.\r
1332\r
1333 @retval NULL Fail to get the device path string.\r
1334 @return PathString Get the device path string.\r
1335\r
1336**/\r
1337CHAR16 *\r
1338ExtractDevicePathFromHiiHandle (\r
1339 IN EFI_HII_HANDLE Handle\r
1340 )\r
1341{\r
1342 EFI_STATUS Status;\r
1343 EFI_HANDLE DriverHandle;\r
ce7690e2 1344 \r
143f0b1d
ED
1345 ASSERT (Handle != NULL);\r
1346\r
1347 if (Handle == NULL) {\r
1348 return NULL;\r
1349 }\r
1350\r
1351 Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);\r
143f0b1d
ED
1352 if (EFI_ERROR (Status)) {\r
1353 return NULL;\r
1354 }\r
1355\r
ce7690e2 1356 return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE);\r
143f0b1d 1357\r
143f0b1d
ED
1358}\r
1359\r
1360//\r
1361// Following are BDS Lib functions which contain all the code about setup browser reset reminder feature.\r
1362// Setup Browser reset reminder feature is that an reset reminder will be given before user leaves the setup browser if\r
1363// user change any option setting which needs a reset to be effective, and the reset will be applied according to the user selection.\r
1364//\r
1365\r
1366\r
1367/**\r
1368 Enable the setup browser reset reminder feature.\r
1369 This routine is used in platform tip. If the platform policy need the feature, use the routine to enable it.\r
1370\r
1371**/\r
1372VOID\r
1373EFIAPI\r
1374EnableResetReminderFeature (\r
1375 VOID\r
1376 )\r
1377{\r
1378 mFeaturerSwitch = TRUE;\r
1379}\r
1380\r
1381\r
1382/**\r
1383 Disable the setup browser reset reminder feature.\r
1384 This routine is used in platform tip. If the platform policy do not want the feature, use the routine to disable it.\r
1385\r
1386**/\r
1387VOID\r
1388EFIAPI\r
1389DisableResetReminderFeature (\r
1390 VOID\r
1391 )\r
1392{\r
1393 mFeaturerSwitch = FALSE;\r
1394}\r
1395\r
1396\r
1397/**\r
1398 Record the info that a reset is required.\r
1399 A module boolean variable is used to record whether a reset is required.\r
1400\r
1401**/\r
1402VOID\r
1403EFIAPI\r
1404EnableResetRequired (\r
1405 VOID\r
1406 )\r
1407{\r
1408 mResetRequired = TRUE;\r
1409}\r
1410\r
1411\r
1412/**\r
1413 Record the info that no reset is required.\r
1414 A module boolean variable is used to record whether a reset is required.\r
1415\r
1416**/\r
1417VOID\r
1418EFIAPI\r
1419DisableResetRequired (\r
1420 VOID\r
1421 )\r
1422{\r
1423 mResetRequired = FALSE;\r
1424}\r
1425\r
1426\r
1427/**\r
1428 Check whether platform policy enable the reset reminder feature. The default is enabled.\r
1429\r
1430**/\r
1431BOOLEAN\r
1432EFIAPI\r
1433IsResetReminderFeatureEnable (\r
1434 VOID\r
1435 )\r
1436{\r
1437 return mFeaturerSwitch;\r
1438}\r
1439\r
1440\r
1441/**\r
1442 Check if user changed any option setting which needs a system reset to be effective.\r
1443\r
1444**/\r
1445BOOLEAN\r
1446EFIAPI\r
1447IsResetRequired (\r
1448 VOID\r
1449 )\r
1450{\r
1451 return mResetRequired;\r
1452}\r
1453\r
1454\r
1455/**\r
1456 Check whether a reset is needed, and finish the reset reminder feature.\r
1457 If a reset is needed, Popup a menu to notice user, and finish the feature\r
1458 according to the user selection.\r
1459\r
1460**/\r
1461VOID\r
1462EFIAPI\r
1463SetupResetReminder (\r
1464 VOID\r
1465 )\r
1466{\r
1467 EFI_INPUT_KEY Key;\r
1468 CHAR16 *StringBuffer1;\r
1469 CHAR16 *StringBuffer2;\r
1470\r
1471\r
1472 //\r
1473 //check any reset required change is applied? if yes, reset system\r
1474 //\r
1475 if (IsResetReminderFeatureEnable ()) {\r
1476 if (IsResetRequired ()) {\r
1477\r
1478 StringBuffer1 = AllocateZeroPool (MAX_STRING_LEN * sizeof (CHAR16));\r
1479 ASSERT (StringBuffer1 != NULL);\r
1480 StringBuffer2 = AllocateZeroPool (MAX_STRING_LEN * sizeof (CHAR16));\r
1481 ASSERT (StringBuffer2 != NULL);\r
d91cb870
DB
1482 StrCpyS (StringBuffer1, MAX_STRING_LEN, L"Configuration changed. Reset to apply it Now.");\r
1483 StrCpyS (StringBuffer2, MAX_STRING_LEN, L"Press ENTER to reset");\r
143f0b1d
ED
1484 //\r
1485 // Popup a menu to notice user\r
1486 //\r
1487 do {\r
1488 CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, StringBuffer1, StringBuffer2, NULL);\r
1489 } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
1490\r
1491 FreePool (StringBuffer1);\r
1492 FreePool (StringBuffer2);\r
1493\r
1494 gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
1495 }\r
1496 }\r
1497}\r
1498\r