]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
Refine the save action for the BdsDxe.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / BootMaint / UpdatePage.c
CommitLineData
5c08e117 1/** @file\r
2Dynamically update the pages.\r
3\r
be9304f3 4Copyright (c) 2004 - 2014, 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
546 BM_LOAD_CONTEXT *NewLoadContext;\r
547 BOOLEAN BootOptionFound;\r
548 UINT32 *OptionOrder;\r
549 EFI_QUESTION_ID QuestionId;\r
550 UINT16 VarOffset;\r
5c08e117 551\r
5c08e117 552\r
553 UpdatePageStart (CallbackData);\r
554\r
555 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
be9304f3
ED
556 \r
557 OptionOrder = NULL;\r
558 QuestionId = 0;\r
559 VarOffset = 0;\r
560 switch (UpdatePageId) { \r
5c08e117 561\r
be9304f3
ED
562 case FORM_BOOT_CHG_ID:\r
563 //GetBootOrder (CallbackData);\r
564 OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder;\r
565 QuestionId = BOOT_OPTION_ORDER_QUESTION_ID;\r
566 VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET;\r
567 break;\r
568\r
569 case FORM_DRV_CHG_ID:\r
570 //GetDriverOrder (CallbackData);\r
571 OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;\r
572 QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;\r
573 VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;\r
574 break;\r
575 } \r
576 ASSERT (OptionOrder != NULL);\r
5c08e117 577\r
75bf9d0e
LG
578 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
579 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 580 \r
be9304f3
ED
581 NewMenuEntry = NULL;\r
582 for (OptionIndex = 0; (OptionOrder[OptionIndex] != 0 && OptionIndex < MAX_MENU_NUMBER); OptionIndex++) {\r
583 BootOptionFound = FALSE;\r
584 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
585 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
586 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
587 if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {\r
588 BootOptionFound = TRUE;\r
589 break;\r
22d1f978
RN
590 }\r
591 }\r
be9304f3
ED
592 if (BootOptionFound) {\r
593 HiiCreateOneOfOptionOpCode (\r
594 OptionsOpCodeHandle,\r
595 NewMenuEntry->DisplayStringToken,\r
596 0,\r
597 EFI_IFR_TYPE_NUM_SIZE_32,\r
598 OptionOrder[OptionIndex]\r
599 );\r
600 }\r
5c08e117 601 }\r
be9304f3 602 \r
5c08e117 603 if (OptionMenu->MenuNumber > 0) {\r
75bf9d0e
LG
604 HiiCreateOrderedListOpCode ( \r
605 mStartOpCodeHandle, // Container for dynamic created opcodes \r
be9304f3 606 QuestionId, // Question ID \r
75bf9d0e 607 VARSTORE_ID_BOOT_MAINT, // VarStore ID \r
be9304f3 608 VarOffset, // Offset in Buffer Storage \r
75bf9d0e
LG
609 STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text \r
610 STRING_TOKEN (STR_CHANGE_ORDER), // Question help text \r
611 0, // Question flag \r
612 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
b452ca89 613 EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value \r
75bf9d0e
LG
614 100, // Maximum container \r
615 OptionsOpCodeHandle, // Option Opcode list \r
616 NULL // Default Opcode is NULL \r
5c08e117 617 );\r
618 }\r
619\r
75bf9d0e 620 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 621\r
622 UpdatePageEnd (CallbackData);\r
5c08e117 623}\r
624\r
625/**\r
626 Create the dynamic page to allow user to set\r
627 the "BootNext" value.\r
628\r
629 @param CallbackData The BMM context data.\r
630\r
631**/\r
632VOID\r
633UpdateBootNextPage (\r
634 IN BMM_CALLBACK_DATA *CallbackData\r
635 )\r
636{\r
637 BM_MENU_ENTRY *NewMenuEntry;\r
638 BM_LOAD_CONTEXT *NewLoadContext;\r
5c08e117 639 UINTN NumberOfOptions;\r
640 UINT16 Index;\r
75bf9d0e 641 VOID *OptionsOpCodeHandle;\r
5c08e117 642\r
5c08e117 643 NumberOfOptions = BootOptionMenu.MenuNumber;\r
644 CallbackData->BmmAskSaveOrNot = TRUE;\r
645\r
646 UpdatePageStart (CallbackData);\r
647 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
648\r
649 if (NumberOfOptions > 0) {\r
75bf9d0e
LG
650 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
651 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 652\r
be9304f3 653 //CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);\r
5c08e117 654\r
655 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
656 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
657 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
75bf9d0e 658\r
5c08e117 659 if (NewLoadContext->IsBootNext) {\r
75bf9d0e
LG
660 HiiCreateOneOfOptionOpCode (\r
661 OptionsOpCodeHandle,\r
662 NewMenuEntry->DisplayStringToken,\r
663 EFI_IFR_OPTION_DEFAULT,\r
b452ca89 664 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
665 Index\r
666 );\r
be9304f3 667 //CallbackData->BmmFakeNvData.BootNext = Index;\r
5c08e117 668 } else {\r
75bf9d0e
LG
669 HiiCreateOneOfOptionOpCode (\r
670 OptionsOpCodeHandle,\r
671 NewMenuEntry->DisplayStringToken,\r
672 0,\r
b452ca89 673 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
674 Index\r
675 );\r
5c08e117 676 }\r
5c08e117 677 }\r
678\r
5c08e117 679 if (CallbackData->BmmFakeNvData.BootNext == Index) {\r
75bf9d0e
LG
680 HiiCreateOneOfOptionOpCode (\r
681 OptionsOpCodeHandle,\r
682 STRING_TOKEN (STR_NONE),\r
683 EFI_IFR_OPTION_DEFAULT,\r
b452ca89 684 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
685 Index\r
686 );\r
687 } else {\r
688 HiiCreateOneOfOptionOpCode (\r
689 OptionsOpCodeHandle,\r
690 STRING_TOKEN (STR_NONE),\r
691 0,\r
b452ca89 692 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
693 Index\r
694 );\r
695 } \r
5c08e117 696\r
75bf9d0e
LG
697 HiiCreateOneOfOpCode (\r
698 mStartOpCodeHandle,\r
5c08e117 699 (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,\r
700 VARSTORE_ID_BOOT_MAINT,\r
701 BOOT_NEXT_VAR_OFFSET,\r
702 STRING_TOKEN (STR_BOOT_NEXT),\r
703 STRING_TOKEN (STR_BOOT_NEXT_HELP),\r
704 0,\r
705 EFI_IFR_NUMERIC_SIZE_2,\r
75bf9d0e
LG
706 OptionsOpCodeHandle,\r
707 NULL\r
5c08e117 708 );\r
709\r
75bf9d0e 710 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 711 }\r
712\r
713 UpdatePageEnd (CallbackData);\r
714}\r
715\r
716/**\r
717 Create the dynamic page to allow user to set the "TimeOut" value.\r
718\r
719 @param CallbackData The BMM context data.\r
720\r
721**/\r
722VOID\r
723UpdateTimeOutPage (\r
724 IN BMM_CALLBACK_DATA *CallbackData\r
725 )\r
726{\r
727 UINT16 BootTimeOut;\r
75bf9d0e 728 VOID *DefaultOpCodeHandle;\r
5c08e117 729\r
730 CallbackData->BmmAskSaveOrNot = TRUE;\r
731\r
732 UpdatePageStart (CallbackData);\r
733\r
8c81cb83 734 BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut);\r
5c08e117 735\r
75bf9d0e
LG
736 DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();\r
737 ASSERT (DefaultOpCodeHandle != NULL);\r
b452ca89 738 HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_NUM_SIZE_16, BootTimeOut);\r
75bf9d0e
LG
739\r
740 HiiCreateNumericOpCode (\r
741 mStartOpCodeHandle,\r
5c08e117 742 (EFI_QUESTION_ID) BOOT_TIME_OUT_QUESTION_ID,\r
743 VARSTORE_ID_BOOT_MAINT,\r
744 BOOT_TIME_OUT_VAR_OFFSET,\r
745 STRING_TOKEN (STR_NUM_AUTO_BOOT),\r
746 STRING_TOKEN (STR_HLP_AUTO_BOOT),\r
747 0,\r
748 EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,\r
749 0,\r
750 65535,\r
751 0,\r
75bf9d0e 752 DefaultOpCodeHandle\r
5c08e117 753 );\r
75bf9d0e
LG
754 \r
755 HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
5c08e117 756\r
be9304f3 757 //CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
5c08e117 758\r
759 UpdatePageEnd (CallbackData);\r
760}\r
761\r
762/**\r
763 Refresh the text mode page.\r
764\r
765 @param CallbackData The BMM context data.\r
766\r
767**/\r
768VOID\r
769UpdateConModePage (\r
770 IN BMM_CALLBACK_DATA *CallbackData\r
771 )\r
772{\r
773 UINTN Mode;\r
774 UINTN Index;\r
775 UINTN Col;\r
776 UINTN Row;\r
5c08e117 777 CHAR16 ModeString[50];\r
19bf20e1 778 CHAR16 *PStr;\r
5c08e117 779 UINTN MaxMode;\r
780 UINTN ValidMode;\r
781 EFI_STRING_ID *ModeToken;\r
5c08e117 782 EFI_STATUS Status;\r
75bf9d0e 783 VOID *OptionsOpCodeHandle;\r
5c08e117 784 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
785\r
786 ConOut = gST->ConOut;\r
787 Index = 0;\r
788 ValidMode = 0;\r
789 MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
790\r
791 CallbackData->BmmAskSaveOrNot = TRUE;\r
792\r
793 UpdatePageStart (CallbackData);\r
794\r
795 //\r
796 // Check valid mode\r
797 //\r
798 for (Mode = 0; Mode < MaxMode; Mode++) {\r
799 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
800 if (EFI_ERROR (Status)) {\r
801 continue;\r
802 }\r
803 ValidMode++;\r
804 }\r
805\r
806 if (ValidMode == 0) {\r
807 return;\r
808 }\r
809\r
75bf9d0e
LG
810 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
811 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 812\r
813 ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
814 ASSERT(ModeToken != NULL);\r
815\r
816 //\r
817 // Determin which mode should be the first entry in menu\r
818 //\r
be9304f3 819 // GetConsoleOutMode (CallbackData);\r
5c08e117 820\r
821 //\r
822 // Build text mode options\r
823 //\r
824 for (Mode = 0; Mode < MaxMode; Mode++) {\r
825 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
826 if (EFI_ERROR (Status)) {\r
827 continue;\r
828 }\r
829 \r
830 //\r
831 // Build mode string Column x Row\r
832 //\r
7a45e5aa 833 UnicodeValueToString (ModeString, 0, Col, 0);\r
19bf20e1 834 PStr = &ModeString[0];\r
b55f8b01
LG
835 StrnCat (PStr, L" x ", StrLen(L" x ") + 1);\r
836 PStr = PStr + StrLen (PStr);\r
837 UnicodeValueToString (PStr , 0, Row, 0);\r
5c08e117 838\r
cb7d01c0 839 ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
5c08e117 840\r
5c08e117 841 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
75bf9d0e
LG
842 HiiCreateOneOfOptionOpCode (\r
843 OptionsOpCodeHandle,\r
844 ModeToken[Index],\r
845 EFI_IFR_OPTION_DEFAULT,\r
b452ca89 846 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
847 (UINT16) Mode\r
848 );\r
5c08e117 849 } else {\r
75bf9d0e
LG
850 HiiCreateOneOfOptionOpCode (\r
851 OptionsOpCodeHandle,\r
852 ModeToken[Index],\r
853 0,\r
b452ca89 854 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
855 (UINT16) Mode\r
856 );\r
5c08e117 857 }\r
858 Index++;\r
859 }\r
860\r
75bf9d0e
LG
861 HiiCreateOneOfOpCode (\r
862 mStartOpCodeHandle,\r
5c08e117 863 (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
864 VARSTORE_ID_BOOT_MAINT,\r
865 CON_MODE_VAR_OFFSET,\r
866 STRING_TOKEN (STR_CON_MODE_SETUP),\r
867 STRING_TOKEN (STR_CON_MODE_SETUP),\r
868 EFI_IFR_FLAG_RESET_REQUIRED,\r
869 EFI_IFR_NUMERIC_SIZE_2,\r
75bf9d0e
LG
870 OptionsOpCodeHandle,\r
871 NULL\r
5c08e117 872 );\r
75bf9d0e
LG
873\r
874 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 875 FreePool (ModeToken);\r
876\r
877 UpdatePageEnd (CallbackData);\r
878}\r
879\r
880/**\r
881 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
882 Parity, Stop Bits, Terminal Type.\r
883\r
884 @param CallbackData The BMM context data.\r
885\r
886**/\r
887VOID\r
888UpdateTerminalPage (\r
889 IN BMM_CALLBACK_DATA *CallbackData\r
890 )\r
891{\r
892 UINT8 Index;\r
893 UINT8 CheckFlags;\r
5c08e117 894 BM_MENU_ENTRY *NewMenuEntry;\r
895 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
75bf9d0e 896 VOID *OptionsOpCodeHandle;\r
be9304f3 897 UINTN CurrentTerminal;\r
5c08e117 898\r
899 UpdatePageStart (CallbackData);\r
900\r
be9304f3 901 CurrentTerminal = CallbackData->CurrentTerminal;\r
5c08e117 902 NewMenuEntry = BOpt_GetMenuEntry (\r
903 &TerminalMenu,\r
be9304f3 904 CurrentTerminal\r
5c08e117 905 );\r
906\r
907 if (NewMenuEntry == NULL) {\r
908 return ;\r
909 }\r
910\r
911 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
912\r
75bf9d0e
LG
913 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
914 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 915\r
916 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
917 CheckFlags = 0;\r
be9304f3 918 if (BaudRateList[Index].Value == 115200) {\r
5c08e117 919 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 920 }\r
75bf9d0e
LG
921 HiiCreateOneOfOptionOpCode (\r
922 OptionsOpCodeHandle,\r
923 BaudRateList[Index].StringToken,\r
924 CheckFlags,\r
b452ca89 925 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
926 Index\r
927 );\r
5c08e117 928 }\r
929\r
75bf9d0e
LG
930 HiiCreateOneOfOpCode (\r
931 mStartOpCodeHandle,\r
be9304f3 932 (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
5c08e117 933 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 934 (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
5c08e117 935 STRING_TOKEN (STR_COM_BAUD_RATE),\r
936 STRING_TOKEN (STR_COM_BAUD_RATE),\r
937 0,\r
938 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
939 OptionsOpCodeHandle,\r
940 NULL\r
5c08e117 941 );\r
75bf9d0e
LG
942 \r
943 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
944 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
945 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 946\r
947 for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {\r
948 CheckFlags = 0;\r
949\r
be9304f3 950 if (DataBitsList[Index].Value == 8) {\r
5c08e117 951 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
952 }\r
953\r
75bf9d0e
LG
954 HiiCreateOneOfOptionOpCode (\r
955 OptionsOpCodeHandle,\r
956 DataBitsList[Index].StringToken,\r
957 CheckFlags,\r
b452ca89 958 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
959 Index\r
960 );\r
5c08e117 961 }\r
962\r
75bf9d0e
LG
963 HiiCreateOneOfOpCode (\r
964 mStartOpCodeHandle,\r
be9304f3 965 (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
5c08e117 966 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 967 (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
5c08e117 968 STRING_TOKEN (STR_COM_DATA_BITS),\r
969 STRING_TOKEN (STR_COM_DATA_BITS),\r
970 0,\r
971 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
972 OptionsOpCodeHandle,\r
973 NULL\r
5c08e117 974 );\r
975\r
75bf9d0e
LG
976 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
977 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
978 ASSERT (OptionsOpCodeHandle != NULL);\r
979\r
5c08e117 980 for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
981 CheckFlags = 0;\r
be9304f3 982 if (ParityList[Index].Value == NoParity) {\r
5c08e117 983 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 984 }\r
985\r
75bf9d0e
LG
986 HiiCreateOneOfOptionOpCode (\r
987 OptionsOpCodeHandle,\r
988 ParityList[Index].StringToken,\r
989 CheckFlags,\r
b452ca89 990 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
991 Index\r
992 );\r
5c08e117 993 }\r
994\r
75bf9d0e
LG
995 HiiCreateOneOfOpCode (\r
996 mStartOpCodeHandle,\r
be9304f3 997 (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
5c08e117 998 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 999 (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
5c08e117 1000 STRING_TOKEN (STR_COM_PARITY),\r
1001 STRING_TOKEN (STR_COM_PARITY),\r
1002 0,\r
1003 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1004 OptionsOpCodeHandle,\r
1005 NULL\r
5c08e117 1006 );\r
1007\r
75bf9d0e
LG
1008 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1009 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1010 ASSERT (OptionsOpCodeHandle != NULL);\r
1011\r
5c08e117 1012 for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
1013 CheckFlags = 0;\r
be9304f3 1014 if (StopBitsList[Index].Value == OneStopBit) {\r
5c08e117 1015 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 1016 }\r
1017\r
75bf9d0e
LG
1018 HiiCreateOneOfOptionOpCode (\r
1019 OptionsOpCodeHandle,\r
1020 StopBitsList[Index].StringToken,\r
1021 CheckFlags,\r
b452ca89 1022 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
1023 Index\r
1024 );\r
5c08e117 1025 }\r
1026\r
75bf9d0e
LG
1027 HiiCreateOneOfOpCode (\r
1028 mStartOpCodeHandle,\r
be9304f3 1029 (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
5c08e117 1030 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 1031 (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
5c08e117 1032 STRING_TOKEN (STR_COM_STOP_BITS),\r
1033 STRING_TOKEN (STR_COM_STOP_BITS),\r
1034 0,\r
1035 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1036 OptionsOpCodeHandle,\r
1037 NULL\r
5c08e117 1038 );\r
1039\r
75bf9d0e
LG
1040 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1041 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1042 ASSERT (OptionsOpCodeHandle != NULL);\r
1043\r
5c08e117 1044 for (Index = 0; Index < 4; Index++) {\r
1045 CheckFlags = 0;\r
be9304f3 1046 if (Index == 0) {\r
5c08e117 1047 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 1048 }\r
1049\r
75bf9d0e
LG
1050 HiiCreateOneOfOptionOpCode (\r
1051 OptionsOpCodeHandle,\r
1052 (EFI_STRING_ID) TerminalType[Index],\r
1053 CheckFlags,\r
b452ca89 1054 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
1055 Index\r
1056 );\r
5c08e117 1057 }\r
1058\r
75bf9d0e
LG
1059 HiiCreateOneOfOpCode (\r
1060 mStartOpCodeHandle,\r
be9304f3 1061 (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
5c08e117 1062 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 1063 (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
5c08e117 1064 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
1065 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
1066 0,\r
1067 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1068 OptionsOpCodeHandle,\r
1069 NULL\r
5c08e117 1070 );\r
1071\r
8e491a81
ED
1072 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1073 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1074 ASSERT (OptionsOpCodeHandle != NULL);\r
1075\r
8e491a81 1076 for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) {\r
be9304f3
ED
1077 CheckFlags = 0;\r
1078 if (Index == 0) {\r
1079 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
1080 }\r
8e491a81
ED
1081 HiiCreateOneOfOptionOpCode (\r
1082 OptionsOpCodeHandle,\r
1083 (EFI_STRING_ID) mFlowControlType[Index],\r
be9304f3 1084 CheckFlags,\r
8e491a81
ED
1085 EFI_IFR_TYPE_NUM_SIZE_8,\r
1086 mFlowControlValue[Index]\r
1087 );\r
1088 }\r
1089\r
1090 HiiCreateOneOfOpCode (\r
1091 mStartOpCodeHandle,\r
be9304f3 1092 (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
8e491a81 1093 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 1094 (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
8e491a81
ED
1095 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
1096 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
1097 0,\r
1098 EFI_IFR_NUMERIC_SIZE_1,\r
1099 OptionsOpCodeHandle,\r
1100 NULL\r
1101 );\r
1102\r
75bf9d0e 1103 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 1104\r
1105 UpdatePageEnd (CallbackData);\r
1106}\r
1107\r
1108/**\r
1109 Dispatch the correct update page function to call based on\r
1110 the UpdatePageId.\r
1111\r
1112 @param UpdatePageId The form ID.\r
1113 @param CallbackData The BMM context data.\r
1114\r
1115**/\r
1116VOID\r
1117UpdatePageBody (\r
1118 IN UINT16 UpdatePageId,\r
1119 IN BMM_CALLBACK_DATA *CallbackData\r
1120 )\r
1121{\r
1122 CleanUpPage (UpdatePageId, CallbackData);\r
1123 switch (UpdatePageId) {\r
1124 case FORM_CON_IN_ID:\r
1125 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
1126 break;\r
1127\r
1128 case FORM_CON_OUT_ID:\r
1129 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
1130 break;\r
1131\r
1132 case FORM_CON_ERR_ID:\r
1133 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
1134 break;\r
1135\r
1136 case FORM_BOOT_CHG_ID:\r
1137 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
1138 break;\r
1139\r
1140 case FORM_DRV_CHG_ID:\r
1141 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
1142 break;\r
1143\r
1144 default:\r
1145 break;\r
1146 }\r
1147}\r
1148\r
5c08e117 1149/**\r
1150 Create a dynamic page so that Legacy Device boot order\r
1151 can be set for specified device type.\r
1152\r
1153 @param UpdatePageId The form ID. It also spefies the legacy device type.\r
1154 @param CallbackData The BMM context data.\r
1155\r
1156\r
1157**/\r
1158VOID\r
1159UpdateSetLegacyDeviceOrderPage (\r
1160 IN UINT16 UpdatePageId,\r
1161 IN BMM_CALLBACK_DATA *CallbackData\r
1162 )\r
1163{\r
e24fc103 1164 LEGACY_DEV_ORDER_ENTRY *DevOrder;\r
5c08e117 1165 BM_MENU_OPTION *OptionMenu;\r
1166 BM_MENU_ENTRY *NewMenuEntry;\r
5c08e117 1167 EFI_STRING_ID StrRef;\r
1168 EFI_STRING_ID StrRefHelp;\r
1169 BBS_TYPE BbsType;\r
1170 UINTN VarSize;\r
1171 UINTN Pos;\r
1172 UINTN Bit;\r
1173 UINT16 Index;\r
1174 UINT16 Key;\r
1175 CHAR16 String[100];\r
1176 CHAR16 *TypeStr;\r
1177 CHAR16 *TypeStrHelp;\r
1178 UINT16 VarDevOrder;\r
1179 UINT8 *VarData;\r
1180 UINT8 *LegacyOrder;\r
1181 UINT8 *OldData;\r
1182 UINT8 *DisMap;\r
75bf9d0e 1183 VOID *OptionsOpCodeHandle;\r
5c08e117 1184\r
1185 OptionMenu = NULL;\r
1186 Key = 0;\r
1187 StrRef = 0;\r
1188 StrRefHelp = 0;\r
1189 TypeStr = NULL;\r
1190 TypeStrHelp = NULL;\r
1191 BbsType = BBS_FLOPPY;\r
1192 LegacyOrder = NULL;\r
1193 OldData = NULL;\r
1194 DisMap = NULL;\r
1195\r
1196 CallbackData->BmmAskSaveOrNot = TRUE;\r
1197 UpdatePageStart (CallbackData);\r
1198\r
22d1f978 1199 DisMap = ZeroMem (CallbackData->BmmOldFakeNVData.DisableMap, sizeof (CallbackData->BmmOldFakeNVData.DisableMap));\r
5c08e117 1200\r
5c08e117 1201 //\r
1202 // Create oneof option list\r
1203 //\r
1204 switch (UpdatePageId) {\r
1205 case FORM_SET_FD_ORDER_ID:\r
1206 OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu;\r
1207 Key = (UINT16) LEGACY_FD_QUESTION_ID;\r
1208 TypeStr = STR_FLOPPY;\r
1209 TypeStrHelp = STR_FLOPPY_HELP;\r
1210 BbsType = BBS_FLOPPY;\r
1211 LegacyOrder = CallbackData->BmmFakeNvData.LegacyFD;\r
1212 OldData = CallbackData->BmmOldFakeNVData.LegacyFD;\r
1213 break;\r
1214\r
1215 case FORM_SET_HD_ORDER_ID:\r
1216 OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu;\r
1217 Key = (UINT16) LEGACY_HD_QUESTION_ID;\r
1218 TypeStr = STR_HARDDISK;\r
1219 TypeStrHelp = STR_HARDDISK_HELP;\r
1220 BbsType = BBS_HARDDISK;\r
1221 LegacyOrder = CallbackData->BmmFakeNvData.LegacyHD;\r
1222 OldData = CallbackData->BmmOldFakeNVData.LegacyHD;\r
1223 break;\r
1224\r
1225 case FORM_SET_CD_ORDER_ID:\r
1226 OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu;\r
1227 Key = (UINT16) LEGACY_CD_QUESTION_ID;\r
1228 TypeStr = STR_CDROM;\r
1229 TypeStrHelp = STR_CDROM_HELP;\r
1230 BbsType = BBS_CDROM;\r
1231 LegacyOrder = CallbackData->BmmFakeNvData.LegacyCD;\r
1232 OldData = CallbackData->BmmOldFakeNVData.LegacyCD;\r
1233 break;\r
1234\r
1235 case FORM_SET_NET_ORDER_ID:\r
1236 OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu;\r
1237 Key = (UINT16) LEGACY_NET_QUESTION_ID;\r
1238 TypeStr = STR_NET;\r
1239 TypeStrHelp = STR_NET_HELP;\r
1240 BbsType = BBS_EMBED_NETWORK;\r
1241 LegacyOrder = CallbackData->BmmFakeNvData.LegacyNET;\r
1242 OldData = CallbackData->BmmOldFakeNVData.LegacyNET;\r
1243 break;\r
1244\r
1245 case FORM_SET_BEV_ORDER_ID:\r
1246 OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu;\r
1247 Key = (UINT16) LEGACY_BEV_QUESTION_ID;\r
1248 TypeStr = STR_BEV;\r
1249 TypeStrHelp = STR_BEV_HELP;\r
1250 BbsType = BBS_BEV_DEVICE;\r
1251 LegacyOrder = CallbackData->BmmFakeNvData.LegacyBEV;\r
1252 OldData = CallbackData->BmmOldFakeNVData.LegacyBEV;\r
1253 break;\r
1254\r
1255 default:\r
1256 DEBUG ((EFI_D_ERROR, "Invalid command ID for updating page!\n"));\r
1257 return;\r
1258 }\r
1259\r
1260 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
1261\r
75bf9d0e
LG
1262 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1263 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 1264\r
1265 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1266 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
b1620d0b 1267 //\r
22d1f978 1268 // Create OneOf for each legacy device\r
b1620d0b 1269 //\r
75bf9d0e
LG
1270 HiiCreateOneOfOptionOpCode (\r
1271 OptionsOpCodeHandle,\r
1272 NewMenuEntry->DisplayStringToken,\r
22d1f978 1273 0,\r
b452ca89 1274 EFI_IFR_TYPE_NUM_SIZE_8,\r
22d1f978 1275 (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->BbsIndex\r
75bf9d0e 1276 );\r
5c08e117 1277 }\r
75bf9d0e 1278\r
5c08e117 1279 //\r
22d1f978 1280 // Create OneOf for item "Disabled"\r
5c08e117 1281 //\r
75bf9d0e
LG
1282 HiiCreateOneOfOptionOpCode (\r
1283 OptionsOpCodeHandle,\r
1284 STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE),\r
1285 0,\r
b452ca89 1286 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
1287 0xFF\r
1288 );\r
5c08e117 1289\r
1290 //\r
1291 // Get Device Order from variable\r
1292 //\r
1293 VarData = BdsLibGetVariableAndSize (\r
1294 VAR_LEGACY_DEV_ORDER,\r
e24fc103 1295 &gEfiLegacyDevOrderVariableGuid,\r
5c08e117 1296 &VarSize\r
1297 );\r
1298\r
1299 if (NULL != VarData) {\r
e24fc103 1300 DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData;\r
5c08e117 1301 while (VarData < VarData + VarSize) {\r
1302 if (DevOrder->BbsType == BbsType) {\r
1303 break;\r
1304 }\r
1305\r
1306 VarData += sizeof (BBS_TYPE);\r
1307 VarData += *(UINT16 *) VarData;\r
e24fc103 1308 DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData;\r
5c08e117 1309 }\r
1310 //\r
1311 // Create oneof tag here for FD/HD/CD #1 #2\r
1312 //\r
1313 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1314 //\r
1315 // Create the string for oneof tag\r
1316 //\r
1317 UnicodeSPrint (String, sizeof (String), TypeStr, Index);\r
cb7d01c0 1318 StrRef = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
5c08e117 1319\r
1320 UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index);\r
cb7d01c0 1321 StrRefHelp = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
5c08e117 1322\r
75bf9d0e
LG
1323 HiiCreateOneOfOpCode (\r
1324 mStartOpCodeHandle,\r
5c08e117 1325 (EFI_QUESTION_ID) (Key + Index),\r
1326 VARSTORE_ID_BOOT_MAINT,\r
1327 (UINT16) (Key + Index - CONFIG_OPTION_OFFSET),\r
1328 StrRef,\r
1329 StrRefHelp,\r
1330 EFI_IFR_FLAG_CALLBACK,\r
1331 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1332 OptionsOpCodeHandle,\r
1333 NULL\r
5c08e117 1334 );\r
1335\r
1336 VarDevOrder = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16));\r
1337\r
1338 if (0xFF00 == (VarDevOrder & 0xFF00)) {\r
1339 LegacyOrder[Index] = 0xFF;\r
1340 Pos = (VarDevOrder & 0xFF) / 8;\r
1341 Bit = 7 - ((VarDevOrder & 0xFF) % 8);\r
1342 DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));\r
1343 } else {\r
1344 LegacyOrder[Index] = (UINT8) (VarDevOrder & 0xFF);\r
1345 }\r
1346 }\r
1347 }\r
1348\r
1349 CopyMem (OldData, LegacyOrder, 100);\r
1350\r
75bf9d0e 1351 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 1352\r
1353 UpdatePageEnd (CallbackData);\r
1354}\r
1355\r
be9304f3 1356\r
5c08e117 1357/**\r
1358 Dispatch the display to the next page based on NewPageId.\r
1359\r
1360 @param Private The BMM context data.\r
1361 @param NewPageId The original page ID.\r
1362\r
1363**/\r
1364VOID\r
1365UpdatePageId (\r
1366 BMM_CALLBACK_DATA *Private,\r
1367 UINT16 NewPageId\r
1368 )\r
1369{\r
8acb3f7b
ED
1370 //\r
1371 // For the question don't impact the page update, just ignore it.\r
1372 //\r
1373 if (((NewPageId >= BOOT_OPTION_DEL_QUESTION_ID) && (NewPageId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) ||\r
1374 ((NewPageId >= DRIVER_OPTION_DEL_QUESTION_ID) && (NewPageId < DRIVER_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER))) {\r
1375 return;\r
1376 }\r
1377\r
5c08e117 1378 if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
1379 //\r
1380 // If we select a handle to add driver option, advance to the add handle description page.\r
1381 //\r
1382 NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
1383 } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
1384 //\r
1385 // Return to main page after "Save Changes" or "Discard Changes".\r
1386 //\r
1387 NewPageId = FORM_MAIN_ID;\r
1388 } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
1389 NewPageId = FORM_CON_COM_SETUP_ID;\r
1390 }\r
1391\r
1392 if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
1393 Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
1394 Private->BmmCurrentPageId = NewPageId;\r
1395 }\r
1396}\r