]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
IntelFrameworkModulePkg: Clean up source files
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / BootMaint / UpdatePage.c
CommitLineData
5c08e117 1/** @file\r
2Dynamically update the pages.\r
3\r
0a6f4824 4Copyright (c) 2004 - 2018, 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 "BootMaint.h"\r
16\r
17/**\r
18 Refresh the global UpdateData structure.\r
19\r
20**/\r
21VOID\r
22RefreshUpdateData (\r
23 VOID\r
24 )\r
25{\r
75bf9d0e
LG
26 //\r
27 // Free current updated date\r
0a6f4824 28 //\r
75bf9d0e
LG
29 if (mStartOpCodeHandle != NULL) {\r
30 HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
31 }\r
32\r
33 //\r
34 // Create new OpCode Handle\r
35 //\r
36 mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
37\r
38 //\r
39 // Create Hii Extend Label OpCode as the start opcode\r
40 //\r
41 mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
42 mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
43\r
5c08e117 44}\r
45\r
46/**\r
47 Add a "Go back to main page" tag in front of the form when there are no\r
48 "Apply changes" and "Discard changes" tags in the end of the form.\r
0a6f4824 49\r
5c08e117 50 @param CallbackData The BMM context data.\r
51\r
52**/\r
53VOID\r
54UpdatePageStart (\r
55 IN BMM_CALLBACK_DATA *CallbackData\r
56 )\r
57{\r
58 RefreshUpdateData ();\r
75bf9d0e 59 mStartLabel->Number = CallbackData->BmmCurrentPageId;\r
5c08e117 60\r
61 if (!(CallbackData->BmmAskSaveOrNot)) {\r
62 //\r
63 // Add a "Go back to main page" tag in front of the form when there are no\r
64 // "Apply changes" and "Discard changes" tags in the end of the form.\r
65 //\r
75bf9d0e
LG
66 HiiCreateGotoOpCode (\r
67 mStartOpCodeHandle,\r
5c08e117 68 FORM_MAIN_ID,\r
69 STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
70 STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
71 0,\r
75bf9d0e 72 FORM_MAIN_ID\r
5c08e117 73 );\r
74 }\r
75\r
76}\r
77\r
78/**\r
79 Create the "Apply changes" and "Discard changes" tags. And\r
80 ensure user can return to the main page.\r
81\r
82 @param CallbackData The BMM context data.\r
83\r
84**/\r
85VOID\r
86UpdatePageEnd (\r
87 IN BMM_CALLBACK_DATA *CallbackData\r
88 )\r
89{\r
90 //\r
91 // Create the "Apply changes" and "Discard changes" tags.\r
92 //\r
93 if (CallbackData->BmmAskSaveOrNot) {\r
75bf9d0e
LG
94 HiiCreateSubTitleOpCode (\r
95 mStartOpCodeHandle,\r
5c08e117 96 STRING_TOKEN (STR_NULL_STRING),\r
97 0,\r
98 0,\r
75bf9d0e 99 0\r
5c08e117 100 );\r
101\r
84724077 102 HiiCreateActionOpCode (\r
75bf9d0e 103 mStartOpCodeHandle,\r
84724077 104 KEY_VALUE_SAVE_AND_EXIT,\r
5c08e117 105 STRING_TOKEN (STR_SAVE_AND_EXIT),\r
106 STRING_TOKEN (STR_NULL_STRING),\r
107 EFI_IFR_FLAG_CALLBACK,\r
84724077 108 0\r
5c08e117 109 );\r
110 }\r
111\r
112 //\r
113 // Ensure user can return to the main page.\r
114 //\r
84724077 115 HiiCreateActionOpCode (\r
75bf9d0e 116 mStartOpCodeHandle,\r
84724077 117 KEY_VALUE_NO_SAVE_AND_EXIT,\r
5c08e117 118 STRING_TOKEN (STR_NO_SAVE_AND_EXIT),\r
119 STRING_TOKEN (STR_NULL_STRING),\r
120 EFI_IFR_FLAG_CALLBACK,\r
84724077 121 0\r
5c08e117 122 );\r
123\r
75bf9d0e 124 HiiUpdateForm (\r
5c08e117 125 CallbackData->BmmHiiHandle,\r
e24fc103 126 &gBootMaintFormSetGuid,\r
5c08e117 127 CallbackData->BmmCurrentPageId,\r
75bf9d0e
LG
128 mStartOpCodeHandle, // Label CallbackData->BmmCurrentPageId\r
129 mEndOpCodeHandle // LABEL_END\r
5c08e117 130 );\r
131}\r
132\r
133/**\r
0a6f4824 134 Clean up the dynamic opcode at label and form specified by both LabelId.\r
5c08e117 135\r
136 @param LabelId It is both the Form ID and Label ID for opcode deletion.\r
137 @param CallbackData The BMM context data.\r
138\r
139**/\r
140VOID\r
141CleanUpPage (\r
142 IN UINT16 LabelId,\r
143 IN BMM_CALLBACK_DATA *CallbackData\r
144 )\r
145{\r
146 RefreshUpdateData ();\r
147\r
148 //\r
149 // Remove all op-codes from dynamic page\r
150 //\r
75bf9d0e
LG
151 mStartLabel->Number = LabelId;\r
152 HiiUpdateForm (\r
5c08e117 153 CallbackData->BmmHiiHandle,\r
e24fc103 154 &gBootMaintFormSetGuid,\r
5c08e117 155 LabelId,\r
75bf9d0e
LG
156 mStartOpCodeHandle, // Label LabelId\r
157 mEndOpCodeHandle // LABEL_END\r
5c08e117 158 );\r
159}\r
160\r
161/**\r
162 Boot a file selected by user at File Expoloer of BMM.\r
163\r
164 @param FileContext The file context data, which contains the device path\r
165 of the file to be boot from.\r
166\r
167 @retval EFI_SUCCESS The function completed successfull.\r
168 @return Other value if the boot from the file fails.\r
169\r
170**/\r
171EFI_STATUS\r
172BootThisFile (\r
173 IN BM_FILE_CONTEXT *FileContext\r
174 )\r
175{\r
176 EFI_STATUS Status;\r
177 UINTN ExitDataSize;\r
178 CHAR16 *ExitData;\r
179 BDS_COMMON_OPTION *Option;\r
180\r
181 Option = (BDS_COMMON_OPTION *) AllocatePool (sizeof (BDS_COMMON_OPTION));\r
182 ASSERT (Option != NULL);\r
326f0711 183 Option->Description = (CHAR16 *) AllocateCopyPool (StrSize (FileContext->FileName), FileContext->FileName);\r
5c08e117 184 Option->DevicePath = FileContext->DevicePath;\r
185 Option->LoadOptionsSize = 0;\r
186 Option->LoadOptions = NULL;\r
187\r
188 //\r
189 // Since current no boot from removable media directly is allowed */\r
190 //\r
191 gST->ConOut->ClearScreen (gST->ConOut);\r
192\r
193 ExitDataSize = 0;\r
194\r
195 Status = BdsLibBootViaBootOption (Option, Option->DevicePath, &ExitDataSize, &ExitData);\r
196\r
197 return Status;\r
198\r
199}\r
200\r
201/**\r
202 Create a list of Goto Opcode for all terminal devices logged\r
203 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.\r
204\r
205 @param CallbackData The BMM context data.\r
206**/\r
207VOID\r
208UpdateConCOMPage (\r
209 IN BMM_CALLBACK_DATA *CallbackData\r
210 )\r
211{\r
212 BM_MENU_ENTRY *NewMenuEntry;\r
213 UINT16 Index;\r
214\r
215 CallbackData->BmmAskSaveOrNot = FALSE;\r
216\r
217 UpdatePageStart (CallbackData);\r
218\r
219\r
220 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
221 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
222\r
75bf9d0e
LG
223 HiiCreateGotoOpCode (\r
224 mStartOpCodeHandle,\r
5c08e117 225 FORM_CON_COM_SETUP_ID,\r
226 NewMenuEntry->DisplayStringToken,\r
227 STRING_TOKEN (STR_NULL_STRING),\r
228 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 229 (UINT16) (TERMINAL_OPTION_OFFSET + Index)\r
5c08e117 230 );\r
231 }\r
232\r
233 UpdatePageEnd (CallbackData);\r
234}\r
235\r
236/**\r
237 Create a lit of boot option from global BootOptionMenu. It\r
238 allow user to delete the boot option.\r
239\r
240 @param CallbackData The BMM context data.\r
241\r
242**/\r
243VOID\r
244UpdateBootDelPage (\r
245 IN BMM_CALLBACK_DATA *CallbackData\r
246 )\r
247{\r
248 BM_MENU_ENTRY *NewMenuEntry;\r
249 BM_LOAD_CONTEXT *NewLoadContext;\r
250 UINT16 Index;\r
251\r
252 CallbackData->BmmAskSaveOrNot = TRUE;\r
253\r
254 UpdatePageStart (CallbackData);\r
255 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
256\r
be9304f3 257 ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionDel) / sizeof (CallbackData->BmmFakeNvData.BootOptionDel[0])));\r
5c08e117 258 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
259 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
260 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
261 if (NewLoadContext->IsLegacy) {\r
262 continue;\r
263 }\r
264\r
265 NewLoadContext->Deleted = FALSE;\r
8acb3f7b
ED
266\r
267 if (CallbackData->BmmFakeNvData.BootOptionDel[Index] && !CallbackData->BmmFakeNvData.BootOptionDelMark[Index]) {\r
268 //\r
269 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
270 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
271 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
272 // through HiiSetBrowserData function.\r
273 //\r
274 CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
275 }\r
5c08e117 276\r
75bf9d0e
LG
277 HiiCreateCheckBoxOpCode (\r
278 mStartOpCodeHandle,\r
be9304f3 279 (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
5c08e117 280 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 281 (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
5c08e117 282 NewMenuEntry->DisplayStringToken,\r
283 NewMenuEntry->HelpStringToken,\r
8acb3f7b 284 EFI_IFR_FLAG_CALLBACK,\r
5c08e117 285 0,\r
75bf9d0e 286 NULL\r
5c08e117 287 );\r
288 }\r
289\r
290 UpdatePageEnd (CallbackData);\r
291}\r
292\r
293/**\r
294 Create a lit of driver option from global DriverMenu.\r
295\r
296 @param CallbackData The BMM context data.\r
297\r
298**/\r
299VOID\r
300UpdateDrvAddHandlePage (\r
301 IN BMM_CALLBACK_DATA *CallbackData\r
302 )\r
303{\r
304 BM_MENU_ENTRY *NewMenuEntry;\r
305 UINT16 Index;\r
306\r
307 CallbackData->BmmAskSaveOrNot = FALSE;\r
308\r
309 UpdatePageStart (CallbackData);\r
310\r
311 for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {\r
312 NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);\r
313\r
75bf9d0e
LG
314 HiiCreateGotoOpCode (\r
315 mStartOpCodeHandle,\r
5c08e117 316 FORM_DRV_ADD_HANDLE_DESC_ID,\r
317 NewMenuEntry->DisplayStringToken,\r
318 STRING_TOKEN (STR_NULL_STRING),\r
319 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 320 (UINT16) (HANDLE_OPTION_OFFSET + Index)\r
5c08e117 321 );\r
322 }\r
323\r
324 UpdatePageEnd (CallbackData);\r
325}\r
326\r
327/**\r
328 Create a lit of driver option from global DriverOptionMenu. It\r
329 allow user to delete the driver option.\r
330\r
331 @param CallbackData The BMM context data.\r
332\r
333**/\r
334VOID\r
335UpdateDrvDelPage (\r
336 IN BMM_CALLBACK_DATA *CallbackData\r
337 )\r
338{\r
339 BM_MENU_ENTRY *NewMenuEntry;\r
340 BM_LOAD_CONTEXT *NewLoadContext;\r
341 UINT16 Index;\r
342\r
343 CallbackData->BmmAskSaveOrNot = TRUE;\r
344\r
345 UpdatePageStart (CallbackData);\r
346\r
347 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &DriverOptionMenu);\r
0a6f4824 348\r
be9304f3 349 ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionDel) / sizeof (CallbackData->BmmFakeNvData.DriverOptionDel[0])));\r
5c08e117 350 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
351 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
352\r
353 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
354 NewLoadContext->Deleted = FALSE;\r
8acb3f7b
ED
355\r
356 if (CallbackData->BmmFakeNvData.DriverOptionDel[Index] && !CallbackData->BmmFakeNvData.DriverOptionDelMark[Index]) {\r
357 //\r
358 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
359 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
360 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
361 // through HiiSetBrowserData function.\r
362 //\r
363 CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
364 }\r
5c08e117 365\r
75bf9d0e
LG
366 HiiCreateCheckBoxOpCode (\r
367 mStartOpCodeHandle,\r
be9304f3 368 (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
5c08e117 369 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 370 (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
5c08e117 371 NewMenuEntry->DisplayStringToken,\r
372 NewMenuEntry->HelpStringToken,\r
8acb3f7b 373 EFI_IFR_FLAG_CALLBACK,\r
5c08e117 374 0,\r
75bf9d0e 375 NULL\r
5c08e117 376 );\r
377 }\r
378\r
379 UpdatePageEnd (CallbackData);\r
380}\r
381\r
382/**\r
0a6f4824 383 Prepare the page to allow user to add description for\r
5c08e117 384 a Driver Option.\r
385\r
386 @param CallbackData The BMM context data.\r
387\r
388**/\r
389VOID\r
390UpdateDriverAddHandleDescPage (\r
391 IN BMM_CALLBACK_DATA *CallbackData\r
392 )\r
393{\r
394 BM_MENU_ENTRY *NewMenuEntry;\r
395\r
396 CallbackData->BmmFakeNvData.DriverAddActive = 0x01;\r
397 CallbackData->BmmFakeNvData.DriverAddForceReconnect = 0x00;\r
398 CallbackData->BmmAskSaveOrNot = TRUE;\r
399 NewMenuEntry = CallbackData->MenuEntry;\r
400\r
401 UpdatePageStart (CallbackData);\r
402\r
75bf9d0e
LG
403 HiiCreateSubTitleOpCode (\r
404 mStartOpCodeHandle,\r
5c08e117 405 NewMenuEntry->DisplayStringToken,\r
406 0,\r
407 0,\r
75bf9d0e 408 0\r
5c08e117 409 );\r
410\r
75bf9d0e
LG
411 HiiCreateStringOpCode (\r
412 mStartOpCodeHandle,\r
5c08e117 413 (EFI_QUESTION_ID) DRV_ADD_HANDLE_DESC_QUESTION_ID,\r
414 VARSTORE_ID_BOOT_MAINT,\r
415 DRV_ADD_HANDLE_DESC_VAR_OFFSET,\r
416 STRING_TOKEN (STR_LOAD_OPTION_DESC),\r
417 STRING_TOKEN (STR_NULL_STRING),\r
418 0,\r
419 0,\r
420 6,\r
421 75,\r
75bf9d0e 422 NULL\r
5c08e117 423 );\r
424\r
75bf9d0e
LG
425 HiiCreateCheckBoxOpCode (\r
426 mStartOpCodeHandle,\r
5c08e117 427 (EFI_QUESTION_ID) DRV_ADD_RECON_QUESTION_ID,\r
428 VARSTORE_ID_BOOT_MAINT,\r
429 DRV_ADD_RECON_VAR_OFFSET,\r
430 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
431 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
432 0,\r
433 0,\r
75bf9d0e 434 NULL\r
5c08e117 435 );\r
436\r
75bf9d0e
LG
437 HiiCreateStringOpCode (\r
438 mStartOpCodeHandle,\r
5c08e117 439 (EFI_QUESTION_ID) DRIVER_ADD_OPTION_QUESTION_ID,\r
440 VARSTORE_ID_BOOT_MAINT,\r
441 DRIVER_ADD_OPTION_VAR_OFFSET,\r
442 STRING_TOKEN (STR_OPTIONAL_DATA),\r
443 STRING_TOKEN (STR_NULL_STRING),\r
444 0,\r
445 0,\r
446 6,\r
447 75,\r
75bf9d0e 448 NULL\r
5c08e117 449 );\r
450\r
451 UpdatePageEnd (CallbackData);\r
452}\r
453\r
454/**\r
455 Update console page.\r
456\r
457 @param UpdatePageId The form ID to be updated.\r
458 @param ConsoleMenu The console menu list.\r
459 @param CallbackData The BMM context data.\r
460\r
461**/\r
462VOID\r
463UpdateConsolePage (\r
464 IN UINT16 UpdatePageId,\r
465 IN BM_MENU_OPTION *ConsoleMenu,\r
466 IN BMM_CALLBACK_DATA *CallbackData\r
467 )\r
468{\r
469 BM_MENU_ENTRY *NewMenuEntry;\r
5c08e117 470 UINT16 Index;\r
5c08e117 471 UINT8 CheckFlags;\r
be9304f3
ED
472 UINT8 *ConsoleCheck;\r
473 EFI_QUESTION_ID QuestionIdBase;\r
474 UINT16 VariableOffsetBase;\r
5c08e117 475\r
476 UpdatePageStart (CallbackData);\r
477\r
be9304f3
ED
478 ConsoleCheck = NULL;\r
479 QuestionIdBase = 0;\r
480 VariableOffsetBase = 0;\r
5c08e117 481\r
be9304f3
ED
482 switch (UpdatePageId) {\r
483 case FORM_CON_IN_ID:\r
484 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
485 QuestionIdBase = CON_IN_DEVICE_QUESTION_ID;\r
486 VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;\r
487 break;\r
488\r
489 case FORM_CON_OUT_ID:\r
490 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
491 QuestionIdBase = CON_OUT_DEVICE_QUESTION_ID;\r
492 VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;\r
493 break;\r
494\r
495 case FORM_CON_ERR_ID:\r
496 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
497 QuestionIdBase = CON_ERR_DEVICE_QUESTION_ID;\r
498 VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;\r
499 break;\r
5c08e117 500 }\r
be9304f3 501 ASSERT (ConsoleCheck != NULL);\r
5c08e117 502\r
be9304f3
ED
503 for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
504 (Index < MAX_MENU_NUMBER)) ; Index++) {\r
505 CheckFlags = 0;\r
506 if (UpdatePageId != FORM_CON_ERR_ID) {\r
5c08e117 507 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
5c08e117 508 }\r
be9304f3 509 NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
75bf9d0e
LG
510 HiiCreateCheckBoxOpCode (\r
511 mStartOpCodeHandle,\r
be9304f3 512 (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
5c08e117 513 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 514 (UINT16) (VariableOffsetBase + Index),\r
5c08e117 515 NewMenuEntry->DisplayStringToken,\r
516 NewMenuEntry->HelpStringToken,\r
517 0,\r
518 CheckFlags,\r
75bf9d0e 519 NULL\r
5c08e117 520 );\r
5c08e117 521 }\r
522\r
523 UpdatePageEnd (CallbackData);\r
524}\r
525\r
526/**\r
527 Update the page's NV Map if user has changed the order\r
528 a list. This list can be Boot Order or Driver Order.\r
529\r
530 @param UpdatePageId The form ID to be updated.\r
531 @param OptionMenu The new list.\r
532 @param CallbackData The BMM context data.\r
533\r
534**/\r
535VOID\r
536UpdateOrderPage (\r
537 IN UINT16 UpdatePageId,\r
538 IN BM_MENU_OPTION *OptionMenu,\r
539 IN BMM_CALLBACK_DATA *CallbackData\r
540 )\r
541{\r
be9304f3
ED
542 BM_MENU_ENTRY *NewMenuEntry;\r
543 UINT16 Index;\r
544 UINT16 OptionIndex;\r
545 VOID *OptionsOpCodeHandle;\r
be9304f3
ED
546 BOOLEAN BootOptionFound;\r
547 UINT32 *OptionOrder;\r
548 EFI_QUESTION_ID QuestionId;\r
549 UINT16 VarOffset;\r
5c08e117 550\r
5c08e117 551\r
552 UpdatePageStart (CallbackData);\r
553\r
554 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
0a6f4824 555\r
be9304f3
ED
556 OptionOrder = NULL;\r
557 QuestionId = 0;\r
558 VarOffset = 0;\r
0a6f4824 559 switch (UpdatePageId) {\r
5c08e117 560\r
be9304f3 561 case FORM_BOOT_CHG_ID:\r
e135e4a7
DB
562 //\r
563 // If the BootOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,\r
564 // means all Boot Options has been save in BootOptionMenu, we can get the date from the menu.\r
565 // else means browser maintains some uncommitted date which are not saved in BootOptionMenu,\r
566 // so we should not get the data from BootOptionMenu to show it.\r
567 //\r
568 if (CompareMem (CallbackData->BmmFakeNvData.BootOptionOrder, CallbackData->BmmOldFakeNVData.BootOptionOrder, sizeof (CallbackData->BmmFakeNvData.BootOptionOrder)) == 0) {\r
569 GetBootOrder (CallbackData);\r
570 }\r
be9304f3
ED
571 OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder;\r
572 QuestionId = BOOT_OPTION_ORDER_QUESTION_ID;\r
573 VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET;\r
574 break;\r
575\r
576 case FORM_DRV_CHG_ID:\r
e135e4a7
DB
577 //\r
578 // If the DriverOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,\r
579 // means all Driver Options has been save in DriverOptionMenu, we can get the DriverOptionOrder from the menu.\r
580 // else means browser maintains some uncommitted date which are not saved in DriverOptionMenu,\r
581 // so we should not get the data from DriverOptionMenu to show it.\r
582 //\r
583 if (CompareMem (CallbackData->BmmFakeNvData.DriverOptionOrder, CallbackData->BmmOldFakeNVData.DriverOptionOrder, sizeof (CallbackData->BmmFakeNvData.DriverOptionOrder)) == 0) {\r
584 GetDriverOrder (CallbackData);\r
585 }\r
be9304f3
ED
586 OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;\r
587 QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;\r
588 VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;\r
589 break;\r
0a6f4824 590 }\r
be9304f3 591 ASSERT (OptionOrder != NULL);\r
5c08e117 592\r
75bf9d0e
LG
593 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
594 ASSERT (OptionsOpCodeHandle != NULL);\r
0a6f4824 595\r
be9304f3 596 NewMenuEntry = NULL;\r
0fb44022 597 for (OptionIndex = 0; (OptionIndex < MAX_MENU_NUMBER && OptionOrder[OptionIndex] != 0); OptionIndex++) {\r
be9304f3
ED
598 BootOptionFound = FALSE;\r
599 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
600 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
be9304f3
ED
601 if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {\r
602 BootOptionFound = TRUE;\r
603 break;\r
22d1f978
RN
604 }\r
605 }\r
be9304f3
ED
606 if (BootOptionFound) {\r
607 HiiCreateOneOfOptionOpCode (\r
608 OptionsOpCodeHandle,\r
609 NewMenuEntry->DisplayStringToken,\r
610 0,\r
611 EFI_IFR_TYPE_NUM_SIZE_32,\r
612 OptionOrder[OptionIndex]\r
613 );\r
614 }\r
5c08e117 615 }\r
0a6f4824 616\r
5c08e117 617 if (OptionMenu->MenuNumber > 0) {\r
0a6f4824
LG
618 HiiCreateOrderedListOpCode (\r
619 mStartOpCodeHandle, // Container for dynamic created opcodes\r
620 QuestionId, // Question ID\r
621 VARSTORE_ID_BOOT_MAINT, // VarStore ID\r
622 VarOffset, // Offset in Buffer Storage\r
623 STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text\r
624 STRING_TOKEN (STR_CHANGE_ORDER), // Question help text\r
625 0, // Question flag\r
75bf9d0e 626 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
0a6f4824
LG
627 EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value\r
628 100, // Maximum container\r
629 OptionsOpCodeHandle, // Option Opcode list\r
630 NULL // Default Opcode is NULL\r
5c08e117 631 );\r
632 }\r
633\r
75bf9d0e 634 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 635\r
636 UpdatePageEnd (CallbackData);\r
5c08e117 637}\r
638\r
639/**\r
640 Create the dynamic page to allow user to set\r
641 the "BootNext" value.\r
642\r
643 @param CallbackData The BMM context data.\r
644\r
645**/\r
646VOID\r
647UpdateBootNextPage (\r
648 IN BMM_CALLBACK_DATA *CallbackData\r
649 )\r
650{\r
651 BM_MENU_ENTRY *NewMenuEntry;\r
652 BM_LOAD_CONTEXT *NewLoadContext;\r
5c08e117 653 UINTN NumberOfOptions;\r
654 UINT16 Index;\r
75bf9d0e 655 VOID *OptionsOpCodeHandle;\r
5c08e117 656\r
5c08e117 657 NumberOfOptions = BootOptionMenu.MenuNumber;\r
658 CallbackData->BmmAskSaveOrNot = TRUE;\r
659\r
660 UpdatePageStart (CallbackData);\r
661 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
662\r
663 if (NumberOfOptions > 0) {\r
75bf9d0e
LG
664 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
665 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 666\r
be9304f3 667 //CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);\r
5c08e117 668\r
669 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
670 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
671 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
75bf9d0e 672\r
5c08e117 673 if (NewLoadContext->IsBootNext) {\r
75bf9d0e
LG
674 HiiCreateOneOfOptionOpCode (\r
675 OptionsOpCodeHandle,\r
676 NewMenuEntry->DisplayStringToken,\r
677 EFI_IFR_OPTION_DEFAULT,\r
b452ca89 678 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
679 Index\r
680 );\r
be9304f3 681 //CallbackData->BmmFakeNvData.BootNext = Index;\r
5c08e117 682 } else {\r
75bf9d0e
LG
683 HiiCreateOneOfOptionOpCode (\r
684 OptionsOpCodeHandle,\r
685 NewMenuEntry->DisplayStringToken,\r
686 0,\r
b452ca89 687 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
688 Index\r
689 );\r
5c08e117 690 }\r
5c08e117 691 }\r
692\r
5c08e117 693 if (CallbackData->BmmFakeNvData.BootNext == Index) {\r
75bf9d0e
LG
694 HiiCreateOneOfOptionOpCode (\r
695 OptionsOpCodeHandle,\r
696 STRING_TOKEN (STR_NONE),\r
697 EFI_IFR_OPTION_DEFAULT,\r
b452ca89 698 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
699 Index\r
700 );\r
701 } else {\r
702 HiiCreateOneOfOptionOpCode (\r
703 OptionsOpCodeHandle,\r
704 STRING_TOKEN (STR_NONE),\r
705 0,\r
b452ca89 706 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
707 Index\r
708 );\r
0a6f4824 709 }\r
5c08e117 710\r
75bf9d0e
LG
711 HiiCreateOneOfOpCode (\r
712 mStartOpCodeHandle,\r
5c08e117 713 (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,\r
714 VARSTORE_ID_BOOT_MAINT,\r
715 BOOT_NEXT_VAR_OFFSET,\r
716 STRING_TOKEN (STR_BOOT_NEXT),\r
717 STRING_TOKEN (STR_BOOT_NEXT_HELP),\r
718 0,\r
719 EFI_IFR_NUMERIC_SIZE_2,\r
75bf9d0e
LG
720 OptionsOpCodeHandle,\r
721 NULL\r
5c08e117 722 );\r
723\r
75bf9d0e 724 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 725 }\r
726\r
727 UpdatePageEnd (CallbackData);\r
728}\r
729\r
730/**\r
731 Create the dynamic page to allow user to set the "TimeOut" value.\r
732\r
733 @param CallbackData The BMM context data.\r
734\r
735**/\r
736VOID\r
737UpdateTimeOutPage (\r
738 IN BMM_CALLBACK_DATA *CallbackData\r
739 )\r
740{\r
741 UINT16 BootTimeOut;\r
75bf9d0e 742 VOID *DefaultOpCodeHandle;\r
5c08e117 743\r
744 CallbackData->BmmAskSaveOrNot = TRUE;\r
745\r
746 UpdatePageStart (CallbackData);\r
747\r
8c81cb83 748 BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut);\r
5c08e117 749\r
75bf9d0e
LG
750 DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();\r
751 ASSERT (DefaultOpCodeHandle != NULL);\r
b452ca89 752 HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_NUM_SIZE_16, BootTimeOut);\r
75bf9d0e
LG
753\r
754 HiiCreateNumericOpCode (\r
755 mStartOpCodeHandle,\r
5c08e117 756 (EFI_QUESTION_ID) BOOT_TIME_OUT_QUESTION_ID,\r
757 VARSTORE_ID_BOOT_MAINT,\r
758 BOOT_TIME_OUT_VAR_OFFSET,\r
759 STRING_TOKEN (STR_NUM_AUTO_BOOT),\r
760 STRING_TOKEN (STR_HLP_AUTO_BOOT),\r
761 0,\r
762 EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,\r
763 0,\r
764 65535,\r
765 0,\r
75bf9d0e 766 DefaultOpCodeHandle\r
5c08e117 767 );\r
0a6f4824 768\r
75bf9d0e 769 HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
5c08e117 770\r
be9304f3 771 //CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
5c08e117 772\r
773 UpdatePageEnd (CallbackData);\r
774}\r
775\r
776/**\r
777 Refresh the text mode page.\r
778\r
779 @param CallbackData The BMM context data.\r
780\r
781**/\r
782VOID\r
783UpdateConModePage (\r
784 IN BMM_CALLBACK_DATA *CallbackData\r
785 )\r
786{\r
787 UINTN Mode;\r
788 UINTN Index;\r
789 UINTN Col;\r
790 UINTN Row;\r
5c08e117 791 CHAR16 ModeString[50];\r
19bf20e1 792 CHAR16 *PStr;\r
5c08e117 793 UINTN MaxMode;\r
794 UINTN ValidMode;\r
795 EFI_STRING_ID *ModeToken;\r
5c08e117 796 EFI_STATUS Status;\r
75bf9d0e 797 VOID *OptionsOpCodeHandle;\r
5c08e117 798 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
799\r
800 ConOut = gST->ConOut;\r
801 Index = 0;\r
802 ValidMode = 0;\r
803 MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
804\r
805 CallbackData->BmmAskSaveOrNot = TRUE;\r
806\r
807 UpdatePageStart (CallbackData);\r
808\r
809 //\r
810 // Check valid mode\r
811 //\r
812 for (Mode = 0; Mode < MaxMode; Mode++) {\r
813 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
814 if (EFI_ERROR (Status)) {\r
815 continue;\r
816 }\r
817 ValidMode++;\r
818 }\r
819\r
820 if (ValidMode == 0) {\r
821 return;\r
822 }\r
823\r
75bf9d0e
LG
824 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
825 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 826\r
827 ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
828 ASSERT(ModeToken != NULL);\r
829\r
830 //\r
831 // Determin which mode should be the first entry in menu\r
832 //\r
be9304f3 833 // GetConsoleOutMode (CallbackData);\r
5c08e117 834\r
835 //\r
836 // Build text mode options\r
837 //\r
838 for (Mode = 0; Mode < MaxMode; Mode++) {\r
839 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
840 if (EFI_ERROR (Status)) {\r
841 continue;\r
842 }\r
0a6f4824 843\r
5c08e117 844 //\r
845 // Build mode string Column x Row\r
846 //\r
0438f5e2 847 UnicodeValueToStringS (ModeString, sizeof (ModeString), 0, Col, 0);\r
19bf20e1 848 PStr = &ModeString[0];\r
bdb898a5 849 StrCatS (PStr, ARRAY_SIZE (ModeString), L" x ");\r
b55f8b01 850 PStr = PStr + StrLen (PStr);\r
0438f5e2
HW
851 UnicodeValueToStringS (\r
852 PStr,\r
853 sizeof (ModeString) - ((UINTN)PStr - (UINTN)&ModeString[0]),\r
854 0,\r
855 Row,\r
856 0\r
857 );\r
5c08e117 858\r
cb7d01c0 859 ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
5c08e117 860\r
5c08e117 861 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
75bf9d0e
LG
862 HiiCreateOneOfOptionOpCode (\r
863 OptionsOpCodeHandle,\r
864 ModeToken[Index],\r
865 EFI_IFR_OPTION_DEFAULT,\r
b452ca89 866 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
867 (UINT16) Mode\r
868 );\r
5c08e117 869 } else {\r
75bf9d0e
LG
870 HiiCreateOneOfOptionOpCode (\r
871 OptionsOpCodeHandle,\r
872 ModeToken[Index],\r
873 0,\r
b452ca89 874 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
875 (UINT16) Mode\r
876 );\r
5c08e117 877 }\r
878 Index++;\r
879 }\r
880\r
75bf9d0e
LG
881 HiiCreateOneOfOpCode (\r
882 mStartOpCodeHandle,\r
5c08e117 883 (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
884 VARSTORE_ID_BOOT_MAINT,\r
885 CON_MODE_VAR_OFFSET,\r
886 STRING_TOKEN (STR_CON_MODE_SETUP),\r
887 STRING_TOKEN (STR_CON_MODE_SETUP),\r
888 EFI_IFR_FLAG_RESET_REQUIRED,\r
889 EFI_IFR_NUMERIC_SIZE_2,\r
75bf9d0e
LG
890 OptionsOpCodeHandle,\r
891 NULL\r
5c08e117 892 );\r
75bf9d0e
LG
893\r
894 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 895 FreePool (ModeToken);\r
896\r
897 UpdatePageEnd (CallbackData);\r
898}\r
899\r
900/**\r
901 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
902 Parity, Stop Bits, Terminal Type.\r
903\r
904 @param CallbackData The BMM context data.\r
905\r
906**/\r
907VOID\r
908UpdateTerminalPage (\r
909 IN BMM_CALLBACK_DATA *CallbackData\r
910 )\r
911{\r
912 UINT8 Index;\r
913 UINT8 CheckFlags;\r
5c08e117 914 BM_MENU_ENTRY *NewMenuEntry;\r
75bf9d0e 915 VOID *OptionsOpCodeHandle;\r
be9304f3 916 UINTN CurrentTerminal;\r
5c08e117 917\r
918 UpdatePageStart (CallbackData);\r
919\r
be9304f3 920 CurrentTerminal = CallbackData->CurrentTerminal;\r
5c08e117 921 NewMenuEntry = BOpt_GetMenuEntry (\r
922 &TerminalMenu,\r
be9304f3 923 CurrentTerminal\r
5c08e117 924 );\r
925\r
926 if (NewMenuEntry == NULL) {\r
927 return ;\r
928 }\r
929\r
75bf9d0e
LG
930 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
931 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 932\r
933 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
934 CheckFlags = 0;\r
be9304f3 935 if (BaudRateList[Index].Value == 115200) {\r
5c08e117 936 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 937 }\r
75bf9d0e
LG
938 HiiCreateOneOfOptionOpCode (\r
939 OptionsOpCodeHandle,\r
940 BaudRateList[Index].StringToken,\r
941 CheckFlags,\r
b452ca89 942 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
943 Index\r
944 );\r
5c08e117 945 }\r
946\r
75bf9d0e
LG
947 HiiCreateOneOfOpCode (\r
948 mStartOpCodeHandle,\r
be9304f3 949 (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
5c08e117 950 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 951 (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
5c08e117 952 STRING_TOKEN (STR_COM_BAUD_RATE),\r
953 STRING_TOKEN (STR_COM_BAUD_RATE),\r
954 0,\r
955 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
956 OptionsOpCodeHandle,\r
957 NULL\r
5c08e117 958 );\r
0a6f4824 959\r
75bf9d0e
LG
960 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
961 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
962 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 963\r
bdb898a5 964 for (Index = 0; Index < ARRAY_SIZE (DataBitsList); Index++) {\r
5c08e117 965 CheckFlags = 0;\r
966\r
be9304f3 967 if (DataBitsList[Index].Value == 8) {\r
5c08e117 968 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
969 }\r
970\r
75bf9d0e
LG
971 HiiCreateOneOfOptionOpCode (\r
972 OptionsOpCodeHandle,\r
973 DataBitsList[Index].StringToken,\r
974 CheckFlags,\r
b452ca89 975 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
976 Index\r
977 );\r
5c08e117 978 }\r
979\r
75bf9d0e
LG
980 HiiCreateOneOfOpCode (\r
981 mStartOpCodeHandle,\r
be9304f3 982 (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
5c08e117 983 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 984 (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
5c08e117 985 STRING_TOKEN (STR_COM_DATA_BITS),\r
986 STRING_TOKEN (STR_COM_DATA_BITS),\r
987 0,\r
988 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
989 OptionsOpCodeHandle,\r
990 NULL\r
5c08e117 991 );\r
992\r
75bf9d0e
LG
993 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
994 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
995 ASSERT (OptionsOpCodeHandle != NULL);\r
996\r
bdb898a5 997 for (Index = 0; Index < ARRAY_SIZE (ParityList); Index++) {\r
5c08e117 998 CheckFlags = 0;\r
be9304f3 999 if (ParityList[Index].Value == NoParity) {\r
5c08e117 1000 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 1001 }\r
1002\r
75bf9d0e
LG
1003 HiiCreateOneOfOptionOpCode (\r
1004 OptionsOpCodeHandle,\r
1005 ParityList[Index].StringToken,\r
1006 CheckFlags,\r
b452ca89 1007 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
1008 Index\r
1009 );\r
5c08e117 1010 }\r
1011\r
75bf9d0e
LG
1012 HiiCreateOneOfOpCode (\r
1013 mStartOpCodeHandle,\r
be9304f3 1014 (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
5c08e117 1015 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 1016 (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
5c08e117 1017 STRING_TOKEN (STR_COM_PARITY),\r
1018 STRING_TOKEN (STR_COM_PARITY),\r
1019 0,\r
1020 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1021 OptionsOpCodeHandle,\r
1022 NULL\r
5c08e117 1023 );\r
1024\r
75bf9d0e
LG
1025 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1026 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1027 ASSERT (OptionsOpCodeHandle != NULL);\r
1028\r
bdb898a5 1029 for (Index = 0; Index < ARRAY_SIZE (StopBitsList); Index++) {\r
5c08e117 1030 CheckFlags = 0;\r
be9304f3 1031 if (StopBitsList[Index].Value == OneStopBit) {\r
5c08e117 1032 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 1033 }\r
1034\r
75bf9d0e
LG
1035 HiiCreateOneOfOptionOpCode (\r
1036 OptionsOpCodeHandle,\r
1037 StopBitsList[Index].StringToken,\r
1038 CheckFlags,\r
b452ca89 1039 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
1040 Index\r
1041 );\r
5c08e117 1042 }\r
1043\r
75bf9d0e
LG
1044 HiiCreateOneOfOpCode (\r
1045 mStartOpCodeHandle,\r
be9304f3 1046 (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
5c08e117 1047 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 1048 (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
5c08e117 1049 STRING_TOKEN (STR_COM_STOP_BITS),\r
1050 STRING_TOKEN (STR_COM_STOP_BITS),\r
1051 0,\r
1052 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1053 OptionsOpCodeHandle,\r
1054 NULL\r
5c08e117 1055 );\r
1056\r
75bf9d0e
LG
1057 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1058 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1059 ASSERT (OptionsOpCodeHandle != NULL);\r
1060\r
5c08e117 1061 for (Index = 0; Index < 4; Index++) {\r
1062 CheckFlags = 0;\r
be9304f3 1063 if (Index == 0) {\r
5c08e117 1064 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 1065 }\r
1066\r
75bf9d0e
LG
1067 HiiCreateOneOfOptionOpCode (\r
1068 OptionsOpCodeHandle,\r
1069 (EFI_STRING_ID) TerminalType[Index],\r
1070 CheckFlags,\r
b452ca89 1071 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
1072 Index\r
1073 );\r
5c08e117 1074 }\r
1075\r
75bf9d0e
LG
1076 HiiCreateOneOfOpCode (\r
1077 mStartOpCodeHandle,\r
be9304f3 1078 (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
5c08e117 1079 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 1080 (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
5c08e117 1081 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
1082 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
1083 0,\r
1084 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1085 OptionsOpCodeHandle,\r
1086 NULL\r
5c08e117 1087 );\r
1088\r
8e491a81
ED
1089 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1090 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1091 ASSERT (OptionsOpCodeHandle != NULL);\r
1092\r
bdb898a5 1093 for (Index = 0; Index < ARRAY_SIZE (mFlowControlType); Index++) {\r
be9304f3
ED
1094 CheckFlags = 0;\r
1095 if (Index == 0) {\r
1096 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
1097 }\r
8e491a81
ED
1098 HiiCreateOneOfOptionOpCode (\r
1099 OptionsOpCodeHandle,\r
1100 (EFI_STRING_ID) mFlowControlType[Index],\r
be9304f3 1101 CheckFlags,\r
8e491a81
ED
1102 EFI_IFR_TYPE_NUM_SIZE_8,\r
1103 mFlowControlValue[Index]\r
1104 );\r
1105 }\r
1106\r
1107 HiiCreateOneOfOpCode (\r
1108 mStartOpCodeHandle,\r
be9304f3 1109 (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
8e491a81 1110 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 1111 (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
8e491a81
ED
1112 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
1113 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
1114 0,\r
1115 EFI_IFR_NUMERIC_SIZE_1,\r
1116 OptionsOpCodeHandle,\r
1117 NULL\r
1118 );\r
1119\r
75bf9d0e 1120 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 1121\r
1122 UpdatePageEnd (CallbackData);\r
1123}\r
1124\r
1125/**\r
1126 Dispatch the correct update page function to call based on\r
1127 the UpdatePageId.\r
1128\r
1129 @param UpdatePageId The form ID.\r
1130 @param CallbackData The BMM context data.\r
1131\r
1132**/\r
1133VOID\r
1134UpdatePageBody (\r
1135 IN UINT16 UpdatePageId,\r
1136 IN BMM_CALLBACK_DATA *CallbackData\r
1137 )\r
1138{\r
1139 CleanUpPage (UpdatePageId, CallbackData);\r
1140 switch (UpdatePageId) {\r
1141 case FORM_CON_IN_ID:\r
1142 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
1143 break;\r
1144\r
1145 case FORM_CON_OUT_ID:\r
1146 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
1147 break;\r
1148\r
1149 case FORM_CON_ERR_ID:\r
1150 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
1151 break;\r
1152\r
1153 case FORM_BOOT_CHG_ID:\r
1154 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
1155 break;\r
1156\r
1157 case FORM_DRV_CHG_ID:\r
1158 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
1159 break;\r
1160\r
1161 default:\r
1162 break;\r
1163 }\r
1164}\r
1165\r
5c08e117 1166/**\r
1167 Create a dynamic page so that Legacy Device boot order\r
1168 can be set for specified device type.\r
1169\r
1170 @param UpdatePageId The form ID. It also spefies the legacy device type.\r
1171 @param CallbackData The BMM context data.\r
1172\r
1173\r
1174**/\r
1175VOID\r
1176UpdateSetLegacyDeviceOrderPage (\r
1177 IN UINT16 UpdatePageId,\r
1178 IN BMM_CALLBACK_DATA *CallbackData\r
1179 )\r
1180{\r
e24fc103 1181 LEGACY_DEV_ORDER_ENTRY *DevOrder;\r
5c08e117 1182 BM_MENU_OPTION *OptionMenu;\r
1183 BM_MENU_ENTRY *NewMenuEntry;\r
5c08e117 1184 EFI_STRING_ID StrRef;\r
1185 EFI_STRING_ID StrRefHelp;\r
1186 BBS_TYPE BbsType;\r
1187 UINTN VarSize;\r
1188 UINTN Pos;\r
1189 UINTN Bit;\r
1190 UINT16 Index;\r
1191 UINT16 Key;\r
1192 CHAR16 String[100];\r
1193 CHAR16 *TypeStr;\r
1194 CHAR16 *TypeStrHelp;\r
1195 UINT16 VarDevOrder;\r
1196 UINT8 *VarData;\r
1197 UINT8 *LegacyOrder;\r
1198 UINT8 *OldData;\r
1199 UINT8 *DisMap;\r
75bf9d0e 1200 VOID *OptionsOpCodeHandle;\r
5c08e117 1201\r
1202 OptionMenu = NULL;\r
1203 Key = 0;\r
1204 StrRef = 0;\r
1205 StrRefHelp = 0;\r
1206 TypeStr = NULL;\r
1207 TypeStrHelp = NULL;\r
1208 BbsType = BBS_FLOPPY;\r
1209 LegacyOrder = NULL;\r
1210 OldData = NULL;\r
1211 DisMap = NULL;\r
1212\r
1213 CallbackData->BmmAskSaveOrNot = TRUE;\r
1214 UpdatePageStart (CallbackData);\r
1215\r
22d1f978 1216 DisMap = ZeroMem (CallbackData->BmmOldFakeNVData.DisableMap, sizeof (CallbackData->BmmOldFakeNVData.DisableMap));\r
5c08e117 1217\r
5c08e117 1218 //\r
1219 // Create oneof option list\r
1220 //\r
1221 switch (UpdatePageId) {\r
1222 case FORM_SET_FD_ORDER_ID:\r
1223 OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu;\r
1224 Key = (UINT16) LEGACY_FD_QUESTION_ID;\r
1225 TypeStr = STR_FLOPPY;\r
1226 TypeStrHelp = STR_FLOPPY_HELP;\r
1227 BbsType = BBS_FLOPPY;\r
1228 LegacyOrder = CallbackData->BmmFakeNvData.LegacyFD;\r
1229 OldData = CallbackData->BmmOldFakeNVData.LegacyFD;\r
1230 break;\r
1231\r
1232 case FORM_SET_HD_ORDER_ID:\r
1233 OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu;\r
1234 Key = (UINT16) LEGACY_HD_QUESTION_ID;\r
1235 TypeStr = STR_HARDDISK;\r
1236 TypeStrHelp = STR_HARDDISK_HELP;\r
1237 BbsType = BBS_HARDDISK;\r
1238 LegacyOrder = CallbackData->BmmFakeNvData.LegacyHD;\r
1239 OldData = CallbackData->BmmOldFakeNVData.LegacyHD;\r
1240 break;\r
1241\r
1242 case FORM_SET_CD_ORDER_ID:\r
1243 OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu;\r
1244 Key = (UINT16) LEGACY_CD_QUESTION_ID;\r
1245 TypeStr = STR_CDROM;\r
1246 TypeStrHelp = STR_CDROM_HELP;\r
1247 BbsType = BBS_CDROM;\r
1248 LegacyOrder = CallbackData->BmmFakeNvData.LegacyCD;\r
1249 OldData = CallbackData->BmmOldFakeNVData.LegacyCD;\r
1250 break;\r
1251\r
1252 case FORM_SET_NET_ORDER_ID:\r
1253 OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu;\r
1254 Key = (UINT16) LEGACY_NET_QUESTION_ID;\r
1255 TypeStr = STR_NET;\r
1256 TypeStrHelp = STR_NET_HELP;\r
1257 BbsType = BBS_EMBED_NETWORK;\r
1258 LegacyOrder = CallbackData->BmmFakeNvData.LegacyNET;\r
1259 OldData = CallbackData->BmmOldFakeNVData.LegacyNET;\r
1260 break;\r
1261\r
1262 case FORM_SET_BEV_ORDER_ID:\r
1263 OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu;\r
1264 Key = (UINT16) LEGACY_BEV_QUESTION_ID;\r
1265 TypeStr = STR_BEV;\r
1266 TypeStrHelp = STR_BEV_HELP;\r
1267 BbsType = BBS_BEV_DEVICE;\r
1268 LegacyOrder = CallbackData->BmmFakeNvData.LegacyBEV;\r
1269 OldData = CallbackData->BmmOldFakeNVData.LegacyBEV;\r
1270 break;\r
1271\r
1272 default:\r
1273 DEBUG ((EFI_D_ERROR, "Invalid command ID for updating page!\n"));\r
1274 return;\r
1275 }\r
1276\r
1277 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
1278\r
75bf9d0e
LG
1279 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1280 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 1281\r
1282 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1283 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
b1620d0b 1284 //\r
22d1f978 1285 // Create OneOf for each legacy device\r
b1620d0b 1286 //\r
75bf9d0e
LG
1287 HiiCreateOneOfOptionOpCode (\r
1288 OptionsOpCodeHandle,\r
1289 NewMenuEntry->DisplayStringToken,\r
22d1f978 1290 0,\r
b452ca89 1291 EFI_IFR_TYPE_NUM_SIZE_8,\r
22d1f978 1292 (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->BbsIndex\r
75bf9d0e 1293 );\r
5c08e117 1294 }\r
75bf9d0e 1295\r
5c08e117 1296 //\r
22d1f978 1297 // Create OneOf for item "Disabled"\r
5c08e117 1298 //\r
75bf9d0e
LG
1299 HiiCreateOneOfOptionOpCode (\r
1300 OptionsOpCodeHandle,\r
1301 STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE),\r
1302 0,\r
b452ca89 1303 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
1304 0xFF\r
1305 );\r
5c08e117 1306\r
1307 //\r
1308 // Get Device Order from variable\r
1309 //\r
1310 VarData = BdsLibGetVariableAndSize (\r
1311 VAR_LEGACY_DEV_ORDER,\r
e24fc103 1312 &gEfiLegacyDevOrderVariableGuid,\r
5c08e117 1313 &VarSize\r
1314 );\r
1315\r
1316 if (NULL != VarData) {\r
e24fc103 1317 DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData;\r
5c08e117 1318 while (VarData < VarData + VarSize) {\r
1319 if (DevOrder->BbsType == BbsType) {\r
1320 break;\r
1321 }\r
1322\r
1a45b15e 1323 VarData = (UINT8 *)((UINTN)VarData + sizeof (BBS_TYPE));\r
5c08e117 1324 VarData += *(UINT16 *) VarData;\r
e24fc103 1325 DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData;\r
5c08e117 1326 }\r
1327 //\r
1328 // Create oneof tag here for FD/HD/CD #1 #2\r
1329 //\r
1330 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1331 //\r
1332 // Create the string for oneof tag\r
1333 //\r
1334 UnicodeSPrint (String, sizeof (String), TypeStr, Index);\r
cb7d01c0 1335 StrRef = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
5c08e117 1336\r
1337 UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index);\r
cb7d01c0 1338 StrRefHelp = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
5c08e117 1339\r
75bf9d0e
LG
1340 HiiCreateOneOfOpCode (\r
1341 mStartOpCodeHandle,\r
5c08e117 1342 (EFI_QUESTION_ID) (Key + Index),\r
1343 VARSTORE_ID_BOOT_MAINT,\r
1344 (UINT16) (Key + Index - CONFIG_OPTION_OFFSET),\r
1345 StrRef,\r
1346 StrRefHelp,\r
1347 EFI_IFR_FLAG_CALLBACK,\r
1348 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1349 OptionsOpCodeHandle,\r
1350 NULL\r
5c08e117 1351 );\r
1352\r
1a45b15e 1353 VarDevOrder = *(UINT16 *) ((UINTN) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16));\r
5c08e117 1354\r
1355 if (0xFF00 == (VarDevOrder & 0xFF00)) {\r
1356 LegacyOrder[Index] = 0xFF;\r
1357 Pos = (VarDevOrder & 0xFF) / 8;\r
1358 Bit = 7 - ((VarDevOrder & 0xFF) % 8);\r
1359 DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));\r
1360 } else {\r
1361 LegacyOrder[Index] = (UINT8) (VarDevOrder & 0xFF);\r
1362 }\r
1363 }\r
1364 }\r
1365\r
1366 CopyMem (OldData, LegacyOrder, 100);\r
1367\r
75bf9d0e 1368 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 1369\r
1370 UpdatePageEnd (CallbackData);\r
1371}\r
1372\r
be9304f3 1373\r
5c08e117 1374/**\r
1375 Dispatch the display to the next page based on NewPageId.\r
1376\r
1377 @param Private The BMM context data.\r
1378 @param NewPageId The original page ID.\r
1379\r
1380**/\r
1381VOID\r
1382UpdatePageId (\r
1383 BMM_CALLBACK_DATA *Private,\r
1384 UINT16 NewPageId\r
1385 )\r
1386{\r
8acb3f7b
ED
1387 //\r
1388 // For the question don't impact the page update, just ignore it.\r
1389 //\r
1390 if (((NewPageId >= BOOT_OPTION_DEL_QUESTION_ID) && (NewPageId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) ||\r
1391 ((NewPageId >= DRIVER_OPTION_DEL_QUESTION_ID) && (NewPageId < DRIVER_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER))) {\r
1392 return;\r
1393 }\r
1394\r
5c08e117 1395 if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
1396 //\r
1397 // If we select a handle to add driver option, advance to the add handle description page.\r
1398 //\r
1399 NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
1400 } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
1401 //\r
1402 // Return to main page after "Save Changes" or "Discard Changes".\r
1403 //\r
1404 NewPageId = FORM_MAIN_ID;\r
1405 } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
1406 NewPageId = FORM_CON_COM_SETUP_ID;\r
1407 }\r
1408\r
1409 if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
1410 Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
1411 Private->BmmCurrentPageId = NewPageId;\r
1412 }\r
1413}\r