]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
IntelFrameworkModulePkg/BootMaint: Show "Change Boot order" page correctly
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / BootMaint / UpdatePage.c
CommitLineData
5c08e117 1/** @file\r
2Dynamically update the pages.\r
3\r
e135e4a7 4Copyright (c) 2004 - 2016, 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
28 // \r
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
49 \r
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
134 Clean up the dynamic opcode at label and form specified by both LabelId. \r
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
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
383 Prepare the page to allow user to add description for \r
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
be9304f3
ED
555 \r
556 OptionOrder = NULL;\r
557 QuestionId = 0;\r
558 VarOffset = 0;\r
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
590 } \r
591 ASSERT (OptionOrder != NULL);\r
5c08e117 592\r
75bf9d0e
LG
593 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
594 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 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
be9304f3 616 \r
5c08e117 617 if (OptionMenu->MenuNumber > 0) {\r
75bf9d0e
LG
618 HiiCreateOrderedListOpCode ( \r
619 mStartOpCodeHandle, // Container for dynamic created opcodes \r
be9304f3 620 QuestionId, // Question ID \r
75bf9d0e 621 VARSTORE_ID_BOOT_MAINT, // VarStore ID \r
be9304f3 622 VarOffset, // Offset in Buffer Storage \r
75bf9d0e
LG
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
626 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
b452ca89 627 EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value \r
75bf9d0e
LG
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
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
75bf9d0e
LG
768 \r
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
843 \r
844 //\r
845 // Build mode string Column x Row\r
846 //\r
7a45e5aa 847 UnicodeValueToString (ModeString, 0, Col, 0);\r
19bf20e1 848 PStr = &ModeString[0];\r
bdb898a5 849 StrCatS (PStr, ARRAY_SIZE (ModeString), L" x ");\r
b55f8b01
LG
850 PStr = PStr + StrLen (PStr);\r
851 UnicodeValueToString (PStr , 0, Row, 0);\r
5c08e117 852\r
cb7d01c0 853 ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
5c08e117 854\r
5c08e117 855 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
75bf9d0e
LG
856 HiiCreateOneOfOptionOpCode (\r
857 OptionsOpCodeHandle,\r
858 ModeToken[Index],\r
859 EFI_IFR_OPTION_DEFAULT,\r
b452ca89 860 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
861 (UINT16) Mode\r
862 );\r
5c08e117 863 } else {\r
75bf9d0e
LG
864 HiiCreateOneOfOptionOpCode (\r
865 OptionsOpCodeHandle,\r
866 ModeToken[Index],\r
867 0,\r
b452ca89 868 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
869 (UINT16) Mode\r
870 );\r
5c08e117 871 }\r
872 Index++;\r
873 }\r
874\r
75bf9d0e
LG
875 HiiCreateOneOfOpCode (\r
876 mStartOpCodeHandle,\r
5c08e117 877 (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
878 VARSTORE_ID_BOOT_MAINT,\r
879 CON_MODE_VAR_OFFSET,\r
880 STRING_TOKEN (STR_CON_MODE_SETUP),\r
881 STRING_TOKEN (STR_CON_MODE_SETUP),\r
882 EFI_IFR_FLAG_RESET_REQUIRED,\r
883 EFI_IFR_NUMERIC_SIZE_2,\r
75bf9d0e
LG
884 OptionsOpCodeHandle,\r
885 NULL\r
5c08e117 886 );\r
75bf9d0e
LG
887\r
888 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 889 FreePool (ModeToken);\r
890\r
891 UpdatePageEnd (CallbackData);\r
892}\r
893\r
894/**\r
895 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
896 Parity, Stop Bits, Terminal Type.\r
897\r
898 @param CallbackData The BMM context data.\r
899\r
900**/\r
901VOID\r
902UpdateTerminalPage (\r
903 IN BMM_CALLBACK_DATA *CallbackData\r
904 )\r
905{\r
906 UINT8 Index;\r
907 UINT8 CheckFlags;\r
5c08e117 908 BM_MENU_ENTRY *NewMenuEntry;\r
75bf9d0e 909 VOID *OptionsOpCodeHandle;\r
be9304f3 910 UINTN CurrentTerminal;\r
5c08e117 911\r
912 UpdatePageStart (CallbackData);\r
913\r
be9304f3 914 CurrentTerminal = CallbackData->CurrentTerminal;\r
5c08e117 915 NewMenuEntry = BOpt_GetMenuEntry (\r
916 &TerminalMenu,\r
be9304f3 917 CurrentTerminal\r
5c08e117 918 );\r
919\r
920 if (NewMenuEntry == NULL) {\r
921 return ;\r
922 }\r
923\r
75bf9d0e
LG
924 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
925 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 926\r
927 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
928 CheckFlags = 0;\r
be9304f3 929 if (BaudRateList[Index].Value == 115200) {\r
5c08e117 930 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 931 }\r
75bf9d0e
LG
932 HiiCreateOneOfOptionOpCode (\r
933 OptionsOpCodeHandle,\r
934 BaudRateList[Index].StringToken,\r
935 CheckFlags,\r
b452ca89 936 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
937 Index\r
938 );\r
5c08e117 939 }\r
940\r
75bf9d0e
LG
941 HiiCreateOneOfOpCode (\r
942 mStartOpCodeHandle,\r
be9304f3 943 (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
5c08e117 944 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 945 (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
5c08e117 946 STRING_TOKEN (STR_COM_BAUD_RATE),\r
947 STRING_TOKEN (STR_COM_BAUD_RATE),\r
948 0,\r
949 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
950 OptionsOpCodeHandle,\r
951 NULL\r
5c08e117 952 );\r
75bf9d0e
LG
953 \r
954 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
955 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
956 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 957\r
bdb898a5 958 for (Index = 0; Index < ARRAY_SIZE (DataBitsList); Index++) {\r
5c08e117 959 CheckFlags = 0;\r
960\r
be9304f3 961 if (DataBitsList[Index].Value == 8) {\r
5c08e117 962 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
963 }\r
964\r
75bf9d0e
LG
965 HiiCreateOneOfOptionOpCode (\r
966 OptionsOpCodeHandle,\r
967 DataBitsList[Index].StringToken,\r
968 CheckFlags,\r
b452ca89 969 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
970 Index\r
971 );\r
5c08e117 972 }\r
973\r
75bf9d0e
LG
974 HiiCreateOneOfOpCode (\r
975 mStartOpCodeHandle,\r
be9304f3 976 (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
5c08e117 977 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 978 (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
5c08e117 979 STRING_TOKEN (STR_COM_DATA_BITS),\r
980 STRING_TOKEN (STR_COM_DATA_BITS),\r
981 0,\r
982 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
983 OptionsOpCodeHandle,\r
984 NULL\r
5c08e117 985 );\r
986\r
75bf9d0e
LG
987 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
988 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
989 ASSERT (OptionsOpCodeHandle != NULL);\r
990\r
bdb898a5 991 for (Index = 0; Index < ARRAY_SIZE (ParityList); Index++) {\r
5c08e117 992 CheckFlags = 0;\r
be9304f3 993 if (ParityList[Index].Value == NoParity) {\r
5c08e117 994 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 995 }\r
996\r
75bf9d0e
LG
997 HiiCreateOneOfOptionOpCode (\r
998 OptionsOpCodeHandle,\r
999 ParityList[Index].StringToken,\r
1000 CheckFlags,\r
b452ca89 1001 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
1002 Index\r
1003 );\r
5c08e117 1004 }\r
1005\r
75bf9d0e
LG
1006 HiiCreateOneOfOpCode (\r
1007 mStartOpCodeHandle,\r
be9304f3 1008 (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
5c08e117 1009 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 1010 (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
5c08e117 1011 STRING_TOKEN (STR_COM_PARITY),\r
1012 STRING_TOKEN (STR_COM_PARITY),\r
1013 0,\r
1014 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1015 OptionsOpCodeHandle,\r
1016 NULL\r
5c08e117 1017 );\r
1018\r
75bf9d0e
LG
1019 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1020 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1021 ASSERT (OptionsOpCodeHandle != NULL);\r
1022\r
bdb898a5 1023 for (Index = 0; Index < ARRAY_SIZE (StopBitsList); Index++) {\r
5c08e117 1024 CheckFlags = 0;\r
be9304f3 1025 if (StopBitsList[Index].Value == OneStopBit) {\r
5c08e117 1026 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 1027 }\r
1028\r
75bf9d0e
LG
1029 HiiCreateOneOfOptionOpCode (\r
1030 OptionsOpCodeHandle,\r
1031 StopBitsList[Index].StringToken,\r
1032 CheckFlags,\r
b452ca89 1033 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
1034 Index\r
1035 );\r
5c08e117 1036 }\r
1037\r
75bf9d0e
LG
1038 HiiCreateOneOfOpCode (\r
1039 mStartOpCodeHandle,\r
be9304f3 1040 (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
5c08e117 1041 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 1042 (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
5c08e117 1043 STRING_TOKEN (STR_COM_STOP_BITS),\r
1044 STRING_TOKEN (STR_COM_STOP_BITS),\r
1045 0,\r
1046 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1047 OptionsOpCodeHandle,\r
1048 NULL\r
5c08e117 1049 );\r
1050\r
75bf9d0e
LG
1051 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1052 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1053 ASSERT (OptionsOpCodeHandle != NULL);\r
1054\r
5c08e117 1055 for (Index = 0; Index < 4; Index++) {\r
1056 CheckFlags = 0;\r
be9304f3 1057 if (Index == 0) {\r
5c08e117 1058 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 1059 }\r
1060\r
75bf9d0e
LG
1061 HiiCreateOneOfOptionOpCode (\r
1062 OptionsOpCodeHandle,\r
1063 (EFI_STRING_ID) TerminalType[Index],\r
1064 CheckFlags,\r
b452ca89 1065 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
1066 Index\r
1067 );\r
5c08e117 1068 }\r
1069\r
75bf9d0e
LG
1070 HiiCreateOneOfOpCode (\r
1071 mStartOpCodeHandle,\r
be9304f3 1072 (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
5c08e117 1073 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 1074 (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
5c08e117 1075 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
1076 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
1077 0,\r
1078 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1079 OptionsOpCodeHandle,\r
1080 NULL\r
5c08e117 1081 );\r
1082\r
8e491a81
ED
1083 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1084 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1085 ASSERT (OptionsOpCodeHandle != NULL);\r
1086\r
bdb898a5 1087 for (Index = 0; Index < ARRAY_SIZE (mFlowControlType); Index++) {\r
be9304f3
ED
1088 CheckFlags = 0;\r
1089 if (Index == 0) {\r
1090 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
1091 }\r
8e491a81
ED
1092 HiiCreateOneOfOptionOpCode (\r
1093 OptionsOpCodeHandle,\r
1094 (EFI_STRING_ID) mFlowControlType[Index],\r
be9304f3 1095 CheckFlags,\r
8e491a81
ED
1096 EFI_IFR_TYPE_NUM_SIZE_8,\r
1097 mFlowControlValue[Index]\r
1098 );\r
1099 }\r
1100\r
1101 HiiCreateOneOfOpCode (\r
1102 mStartOpCodeHandle,\r
be9304f3 1103 (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
8e491a81 1104 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 1105 (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
8e491a81
ED
1106 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
1107 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
1108 0,\r
1109 EFI_IFR_NUMERIC_SIZE_1,\r
1110 OptionsOpCodeHandle,\r
1111 NULL\r
1112 );\r
1113\r
75bf9d0e 1114 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 1115\r
1116 UpdatePageEnd (CallbackData);\r
1117}\r
1118\r
1119/**\r
1120 Dispatch the correct update page function to call based on\r
1121 the UpdatePageId.\r
1122\r
1123 @param UpdatePageId The form ID.\r
1124 @param CallbackData The BMM context data.\r
1125\r
1126**/\r
1127VOID\r
1128UpdatePageBody (\r
1129 IN UINT16 UpdatePageId,\r
1130 IN BMM_CALLBACK_DATA *CallbackData\r
1131 )\r
1132{\r
1133 CleanUpPage (UpdatePageId, CallbackData);\r
1134 switch (UpdatePageId) {\r
1135 case FORM_CON_IN_ID:\r
1136 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
1137 break;\r
1138\r
1139 case FORM_CON_OUT_ID:\r
1140 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
1141 break;\r
1142\r
1143 case FORM_CON_ERR_ID:\r
1144 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
1145 break;\r
1146\r
1147 case FORM_BOOT_CHG_ID:\r
1148 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
1149 break;\r
1150\r
1151 case FORM_DRV_CHG_ID:\r
1152 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
1153 break;\r
1154\r
1155 default:\r
1156 break;\r
1157 }\r
1158}\r
1159\r
5c08e117 1160/**\r
1161 Create a dynamic page so that Legacy Device boot order\r
1162 can be set for specified device type.\r
1163\r
1164 @param UpdatePageId The form ID. It also spefies the legacy device type.\r
1165 @param CallbackData The BMM context data.\r
1166\r
1167\r
1168**/\r
1169VOID\r
1170UpdateSetLegacyDeviceOrderPage (\r
1171 IN UINT16 UpdatePageId,\r
1172 IN BMM_CALLBACK_DATA *CallbackData\r
1173 )\r
1174{\r
e24fc103 1175 LEGACY_DEV_ORDER_ENTRY *DevOrder;\r
5c08e117 1176 BM_MENU_OPTION *OptionMenu;\r
1177 BM_MENU_ENTRY *NewMenuEntry;\r
5c08e117 1178 EFI_STRING_ID StrRef;\r
1179 EFI_STRING_ID StrRefHelp;\r
1180 BBS_TYPE BbsType;\r
1181 UINTN VarSize;\r
1182 UINTN Pos;\r
1183 UINTN Bit;\r
1184 UINT16 Index;\r
1185 UINT16 Key;\r
1186 CHAR16 String[100];\r
1187 CHAR16 *TypeStr;\r
1188 CHAR16 *TypeStrHelp;\r
1189 UINT16 VarDevOrder;\r
1190 UINT8 *VarData;\r
1191 UINT8 *LegacyOrder;\r
1192 UINT8 *OldData;\r
1193 UINT8 *DisMap;\r
75bf9d0e 1194 VOID *OptionsOpCodeHandle;\r
5c08e117 1195\r
1196 OptionMenu = NULL;\r
1197 Key = 0;\r
1198 StrRef = 0;\r
1199 StrRefHelp = 0;\r
1200 TypeStr = NULL;\r
1201 TypeStrHelp = NULL;\r
1202 BbsType = BBS_FLOPPY;\r
1203 LegacyOrder = NULL;\r
1204 OldData = NULL;\r
1205 DisMap = NULL;\r
1206\r
1207 CallbackData->BmmAskSaveOrNot = TRUE;\r
1208 UpdatePageStart (CallbackData);\r
1209\r
22d1f978 1210 DisMap = ZeroMem (CallbackData->BmmOldFakeNVData.DisableMap, sizeof (CallbackData->BmmOldFakeNVData.DisableMap));\r
5c08e117 1211\r
5c08e117 1212 //\r
1213 // Create oneof option list\r
1214 //\r
1215 switch (UpdatePageId) {\r
1216 case FORM_SET_FD_ORDER_ID:\r
1217 OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu;\r
1218 Key = (UINT16) LEGACY_FD_QUESTION_ID;\r
1219 TypeStr = STR_FLOPPY;\r
1220 TypeStrHelp = STR_FLOPPY_HELP;\r
1221 BbsType = BBS_FLOPPY;\r
1222 LegacyOrder = CallbackData->BmmFakeNvData.LegacyFD;\r
1223 OldData = CallbackData->BmmOldFakeNVData.LegacyFD;\r
1224 break;\r
1225\r
1226 case FORM_SET_HD_ORDER_ID:\r
1227 OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu;\r
1228 Key = (UINT16) LEGACY_HD_QUESTION_ID;\r
1229 TypeStr = STR_HARDDISK;\r
1230 TypeStrHelp = STR_HARDDISK_HELP;\r
1231 BbsType = BBS_HARDDISK;\r
1232 LegacyOrder = CallbackData->BmmFakeNvData.LegacyHD;\r
1233 OldData = CallbackData->BmmOldFakeNVData.LegacyHD;\r
1234 break;\r
1235\r
1236 case FORM_SET_CD_ORDER_ID:\r
1237 OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu;\r
1238 Key = (UINT16) LEGACY_CD_QUESTION_ID;\r
1239 TypeStr = STR_CDROM;\r
1240 TypeStrHelp = STR_CDROM_HELP;\r
1241 BbsType = BBS_CDROM;\r
1242 LegacyOrder = CallbackData->BmmFakeNvData.LegacyCD;\r
1243 OldData = CallbackData->BmmOldFakeNVData.LegacyCD;\r
1244 break;\r
1245\r
1246 case FORM_SET_NET_ORDER_ID:\r
1247 OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu;\r
1248 Key = (UINT16) LEGACY_NET_QUESTION_ID;\r
1249 TypeStr = STR_NET;\r
1250 TypeStrHelp = STR_NET_HELP;\r
1251 BbsType = BBS_EMBED_NETWORK;\r
1252 LegacyOrder = CallbackData->BmmFakeNvData.LegacyNET;\r
1253 OldData = CallbackData->BmmOldFakeNVData.LegacyNET;\r
1254 break;\r
1255\r
1256 case FORM_SET_BEV_ORDER_ID:\r
1257 OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu;\r
1258 Key = (UINT16) LEGACY_BEV_QUESTION_ID;\r
1259 TypeStr = STR_BEV;\r
1260 TypeStrHelp = STR_BEV_HELP;\r
1261 BbsType = BBS_BEV_DEVICE;\r
1262 LegacyOrder = CallbackData->BmmFakeNvData.LegacyBEV;\r
1263 OldData = CallbackData->BmmOldFakeNVData.LegacyBEV;\r
1264 break;\r
1265\r
1266 default:\r
1267 DEBUG ((EFI_D_ERROR, "Invalid command ID for updating page!\n"));\r
1268 return;\r
1269 }\r
1270\r
1271 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
1272\r
75bf9d0e
LG
1273 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1274 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 1275\r
1276 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1277 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
b1620d0b 1278 //\r
22d1f978 1279 // Create OneOf for each legacy device\r
b1620d0b 1280 //\r
75bf9d0e
LG
1281 HiiCreateOneOfOptionOpCode (\r
1282 OptionsOpCodeHandle,\r
1283 NewMenuEntry->DisplayStringToken,\r
22d1f978 1284 0,\r
b452ca89 1285 EFI_IFR_TYPE_NUM_SIZE_8,\r
22d1f978 1286 (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->BbsIndex\r
75bf9d0e 1287 );\r
5c08e117 1288 }\r
75bf9d0e 1289\r
5c08e117 1290 //\r
22d1f978 1291 // Create OneOf for item "Disabled"\r
5c08e117 1292 //\r
75bf9d0e
LG
1293 HiiCreateOneOfOptionOpCode (\r
1294 OptionsOpCodeHandle,\r
1295 STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE),\r
1296 0,\r
b452ca89 1297 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
1298 0xFF\r
1299 );\r
5c08e117 1300\r
1301 //\r
1302 // Get Device Order from variable\r
1303 //\r
1304 VarData = BdsLibGetVariableAndSize (\r
1305 VAR_LEGACY_DEV_ORDER,\r
e24fc103 1306 &gEfiLegacyDevOrderVariableGuid,\r
5c08e117 1307 &VarSize\r
1308 );\r
1309\r
1310 if (NULL != VarData) {\r
e24fc103 1311 DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData;\r
5c08e117 1312 while (VarData < VarData + VarSize) {\r
1313 if (DevOrder->BbsType == BbsType) {\r
1314 break;\r
1315 }\r
1316\r
1a45b15e 1317 VarData = (UINT8 *)((UINTN)VarData + sizeof (BBS_TYPE));\r
5c08e117 1318 VarData += *(UINT16 *) VarData;\r
e24fc103 1319 DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData;\r
5c08e117 1320 }\r
1321 //\r
1322 // Create oneof tag here for FD/HD/CD #1 #2\r
1323 //\r
1324 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1325 //\r
1326 // Create the string for oneof tag\r
1327 //\r
1328 UnicodeSPrint (String, sizeof (String), TypeStr, Index);\r
cb7d01c0 1329 StrRef = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
5c08e117 1330\r
1331 UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index);\r
cb7d01c0 1332 StrRefHelp = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
5c08e117 1333\r
75bf9d0e
LG
1334 HiiCreateOneOfOpCode (\r
1335 mStartOpCodeHandle,\r
5c08e117 1336 (EFI_QUESTION_ID) (Key + Index),\r
1337 VARSTORE_ID_BOOT_MAINT,\r
1338 (UINT16) (Key + Index - CONFIG_OPTION_OFFSET),\r
1339 StrRef,\r
1340 StrRefHelp,\r
1341 EFI_IFR_FLAG_CALLBACK,\r
1342 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1343 OptionsOpCodeHandle,\r
1344 NULL\r
5c08e117 1345 );\r
1346\r
1a45b15e 1347 VarDevOrder = *(UINT16 *) ((UINTN) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16));\r
5c08e117 1348\r
1349 if (0xFF00 == (VarDevOrder & 0xFF00)) {\r
1350 LegacyOrder[Index] = 0xFF;\r
1351 Pos = (VarDevOrder & 0xFF) / 8;\r
1352 Bit = 7 - ((VarDevOrder & 0xFF) % 8);\r
1353 DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));\r
1354 } else {\r
1355 LegacyOrder[Index] = (UINT8) (VarDevOrder & 0xFF);\r
1356 }\r
1357 }\r
1358 }\r
1359\r
1360 CopyMem (OldData, LegacyOrder, 100);\r
1361\r
75bf9d0e 1362 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 1363\r
1364 UpdatePageEnd (CallbackData);\r
1365}\r
1366\r
be9304f3 1367\r
5c08e117 1368/**\r
1369 Dispatch the display to the next page based on NewPageId.\r
1370\r
1371 @param Private The BMM context data.\r
1372 @param NewPageId The original page ID.\r
1373\r
1374**/\r
1375VOID\r
1376UpdatePageId (\r
1377 BMM_CALLBACK_DATA *Private,\r
1378 UINT16 NewPageId\r
1379 )\r
1380{\r
8acb3f7b
ED
1381 //\r
1382 // For the question don't impact the page update, just ignore it.\r
1383 //\r
1384 if (((NewPageId >= BOOT_OPTION_DEL_QUESTION_ID) && (NewPageId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) ||\r
1385 ((NewPageId >= DRIVER_OPTION_DEL_QUESTION_ID) && (NewPageId < DRIVER_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER))) {\r
1386 return;\r
1387 }\r
1388\r
5c08e117 1389 if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
1390 //\r
1391 // If we select a handle to add driver option, advance to the add handle description page.\r
1392 //\r
1393 NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
1394 } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
1395 //\r
1396 // Return to main page after "Save Changes" or "Discard Changes".\r
1397 //\r
1398 NewPageId = FORM_MAIN_ID;\r
1399 } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
1400 NewPageId = FORM_CON_COM_SETUP_ID;\r
1401 }\r
1402\r
1403 if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
1404 Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
1405 Private->BmmCurrentPageId = NewPageId;\r
1406 }\r
1407}\r