]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
Support RouteConfig function for BdsDxe driver.
[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
be9304f3 266 //CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
5c08e117 267\r
75bf9d0e
LG
268 HiiCreateCheckBoxOpCode (\r
269 mStartOpCodeHandle,\r
be9304f3 270 (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
5c08e117 271 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 272 (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
5c08e117 273 NewMenuEntry->DisplayStringToken,\r
274 NewMenuEntry->HelpStringToken,\r
275 0,\r
276 0,\r
75bf9d0e 277 NULL\r
5c08e117 278 );\r
279 }\r
280\r
281 UpdatePageEnd (CallbackData);\r
282}\r
283\r
284/**\r
285 Create a lit of driver option from global DriverMenu.\r
286\r
287 @param CallbackData The BMM context data.\r
288\r
289**/\r
290VOID\r
291UpdateDrvAddHandlePage (\r
292 IN BMM_CALLBACK_DATA *CallbackData\r
293 )\r
294{\r
295 BM_MENU_ENTRY *NewMenuEntry;\r
296 UINT16 Index;\r
297\r
298 CallbackData->BmmAskSaveOrNot = FALSE;\r
299\r
300 UpdatePageStart (CallbackData);\r
301\r
302 for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {\r
303 NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);\r
304\r
75bf9d0e
LG
305 HiiCreateGotoOpCode (\r
306 mStartOpCodeHandle,\r
5c08e117 307 FORM_DRV_ADD_HANDLE_DESC_ID,\r
308 NewMenuEntry->DisplayStringToken,\r
309 STRING_TOKEN (STR_NULL_STRING),\r
310 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 311 (UINT16) (HANDLE_OPTION_OFFSET + Index)\r
5c08e117 312 );\r
313 }\r
314\r
315 UpdatePageEnd (CallbackData);\r
316}\r
317\r
318/**\r
319 Create a lit of driver option from global DriverOptionMenu. It\r
320 allow user to delete the driver option.\r
321\r
322 @param CallbackData The BMM context data.\r
323\r
324**/\r
325VOID\r
326UpdateDrvDelPage (\r
327 IN BMM_CALLBACK_DATA *CallbackData\r
328 )\r
329{\r
330 BM_MENU_ENTRY *NewMenuEntry;\r
331 BM_LOAD_CONTEXT *NewLoadContext;\r
332 UINT16 Index;\r
333\r
334 CallbackData->BmmAskSaveOrNot = TRUE;\r
335\r
336 UpdatePageStart (CallbackData);\r
337\r
338 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &DriverOptionMenu);\r
339 \r
be9304f3 340 ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionDel) / sizeof (CallbackData->BmmFakeNvData.DriverOptionDel[0])));\r
5c08e117 341 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
342 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
343\r
344 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
345 NewLoadContext->Deleted = FALSE;\r
be9304f3 346 //CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
5c08e117 347\r
75bf9d0e
LG
348 HiiCreateCheckBoxOpCode (\r
349 mStartOpCodeHandle,\r
be9304f3 350 (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
5c08e117 351 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 352 (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
5c08e117 353 NewMenuEntry->DisplayStringToken,\r
354 NewMenuEntry->HelpStringToken,\r
355 0,\r
356 0,\r
75bf9d0e 357 NULL\r
5c08e117 358 );\r
359 }\r
360\r
361 UpdatePageEnd (CallbackData);\r
362}\r
363\r
364/**\r
365 Prepare the page to allow user to add description for \r
366 a Driver Option.\r
367\r
368 @param CallbackData The BMM context data.\r
369\r
370**/\r
371VOID\r
372UpdateDriverAddHandleDescPage (\r
373 IN BMM_CALLBACK_DATA *CallbackData\r
374 )\r
375{\r
376 BM_MENU_ENTRY *NewMenuEntry;\r
377\r
378 CallbackData->BmmFakeNvData.DriverAddActive = 0x01;\r
379 CallbackData->BmmFakeNvData.DriverAddForceReconnect = 0x00;\r
380 CallbackData->BmmAskSaveOrNot = TRUE;\r
381 NewMenuEntry = CallbackData->MenuEntry;\r
382\r
383 UpdatePageStart (CallbackData);\r
384\r
75bf9d0e
LG
385 HiiCreateSubTitleOpCode (\r
386 mStartOpCodeHandle,\r
5c08e117 387 NewMenuEntry->DisplayStringToken,\r
388 0,\r
389 0,\r
75bf9d0e 390 0\r
5c08e117 391 );\r
392\r
75bf9d0e
LG
393 HiiCreateStringOpCode (\r
394 mStartOpCodeHandle,\r
5c08e117 395 (EFI_QUESTION_ID) DRV_ADD_HANDLE_DESC_QUESTION_ID,\r
396 VARSTORE_ID_BOOT_MAINT,\r
397 DRV_ADD_HANDLE_DESC_VAR_OFFSET,\r
398 STRING_TOKEN (STR_LOAD_OPTION_DESC),\r
399 STRING_TOKEN (STR_NULL_STRING),\r
400 0,\r
401 0,\r
402 6,\r
403 75,\r
75bf9d0e 404 NULL\r
5c08e117 405 );\r
406\r
75bf9d0e
LG
407 HiiCreateCheckBoxOpCode (\r
408 mStartOpCodeHandle,\r
5c08e117 409 (EFI_QUESTION_ID) DRV_ADD_RECON_QUESTION_ID,\r
410 VARSTORE_ID_BOOT_MAINT,\r
411 DRV_ADD_RECON_VAR_OFFSET,\r
412 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
413 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
414 0,\r
415 0,\r
75bf9d0e 416 NULL\r
5c08e117 417 );\r
418\r
75bf9d0e
LG
419 HiiCreateStringOpCode (\r
420 mStartOpCodeHandle,\r
5c08e117 421 (EFI_QUESTION_ID) DRIVER_ADD_OPTION_QUESTION_ID,\r
422 VARSTORE_ID_BOOT_MAINT,\r
423 DRIVER_ADD_OPTION_VAR_OFFSET,\r
424 STRING_TOKEN (STR_OPTIONAL_DATA),\r
425 STRING_TOKEN (STR_NULL_STRING),\r
426 0,\r
427 0,\r
428 6,\r
429 75,\r
75bf9d0e 430 NULL\r
5c08e117 431 );\r
432\r
433 UpdatePageEnd (CallbackData);\r
434}\r
435\r
436/**\r
437 Update console page.\r
438\r
439 @param UpdatePageId The form ID to be updated.\r
440 @param ConsoleMenu The console menu list.\r
441 @param CallbackData The BMM context data.\r
442\r
443**/\r
444VOID\r
445UpdateConsolePage (\r
446 IN UINT16 UpdatePageId,\r
447 IN BM_MENU_OPTION *ConsoleMenu,\r
448 IN BMM_CALLBACK_DATA *CallbackData\r
449 )\r
450{\r
451 BM_MENU_ENTRY *NewMenuEntry;\r
5c08e117 452 UINT16 Index;\r
5c08e117 453 UINT8 CheckFlags;\r
be9304f3
ED
454 UINT8 *ConsoleCheck;\r
455 EFI_QUESTION_ID QuestionIdBase;\r
456 UINT16 VariableOffsetBase;\r
5c08e117 457\r
458 UpdatePageStart (CallbackData);\r
459\r
be9304f3
ED
460 ConsoleCheck = NULL;\r
461 QuestionIdBase = 0;\r
462 VariableOffsetBase = 0;\r
5c08e117 463\r
be9304f3
ED
464 switch (UpdatePageId) {\r
465 case FORM_CON_IN_ID:\r
466 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
467 QuestionIdBase = CON_IN_DEVICE_QUESTION_ID;\r
468 VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;\r
469 break;\r
470\r
471 case FORM_CON_OUT_ID:\r
472 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
473 QuestionIdBase = CON_OUT_DEVICE_QUESTION_ID;\r
474 VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;\r
475 break;\r
476\r
477 case FORM_CON_ERR_ID:\r
478 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
479 QuestionIdBase = CON_ERR_DEVICE_QUESTION_ID;\r
480 VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;\r
481 break;\r
5c08e117 482 }\r
be9304f3 483 ASSERT (ConsoleCheck != NULL);\r
5c08e117 484\r
be9304f3
ED
485 for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
486 (Index < MAX_MENU_NUMBER)) ; Index++) {\r
487 CheckFlags = 0;\r
488 if (UpdatePageId != FORM_CON_ERR_ID) {\r
5c08e117 489 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
5c08e117 490 }\r
be9304f3 491 NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
75bf9d0e
LG
492 HiiCreateCheckBoxOpCode (\r
493 mStartOpCodeHandle,\r
be9304f3 494 (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
5c08e117 495 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 496 (UINT16) (VariableOffsetBase + Index),\r
5c08e117 497 NewMenuEntry->DisplayStringToken,\r
498 NewMenuEntry->HelpStringToken,\r
499 0,\r
500 CheckFlags,\r
75bf9d0e 501 NULL\r
5c08e117 502 );\r
5c08e117 503 }\r
504\r
505 UpdatePageEnd (CallbackData);\r
506}\r
507\r
508/**\r
509 Update the page's NV Map if user has changed the order\r
510 a list. This list can be Boot Order or Driver Order.\r
511\r
512 @param UpdatePageId The form ID to be updated.\r
513 @param OptionMenu The new list.\r
514 @param CallbackData The BMM context data.\r
515\r
516**/\r
517VOID\r
518UpdateOrderPage (\r
519 IN UINT16 UpdatePageId,\r
520 IN BM_MENU_OPTION *OptionMenu,\r
521 IN BMM_CALLBACK_DATA *CallbackData\r
522 )\r
523{\r
be9304f3
ED
524 BM_MENU_ENTRY *NewMenuEntry;\r
525 UINT16 Index;\r
526 UINT16 OptionIndex;\r
527 VOID *OptionsOpCodeHandle;\r
528 BM_LOAD_CONTEXT *NewLoadContext;\r
529 BOOLEAN BootOptionFound;\r
530 UINT32 *OptionOrder;\r
531 EFI_QUESTION_ID QuestionId;\r
532 UINT16 VarOffset;\r
5c08e117 533\r
5c08e117 534\r
535 UpdatePageStart (CallbackData);\r
536\r
537 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
be9304f3
ED
538 \r
539 OptionOrder = NULL;\r
540 QuestionId = 0;\r
541 VarOffset = 0;\r
542 switch (UpdatePageId) { \r
5c08e117 543\r
be9304f3
ED
544 case FORM_BOOT_CHG_ID:\r
545 //GetBootOrder (CallbackData);\r
546 OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder;\r
547 QuestionId = BOOT_OPTION_ORDER_QUESTION_ID;\r
548 VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET;\r
549 break;\r
550\r
551 case FORM_DRV_CHG_ID:\r
552 //GetDriverOrder (CallbackData);\r
553 OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;\r
554 QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;\r
555 VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;\r
556 break;\r
557 } \r
558 ASSERT (OptionOrder != NULL);\r
5c08e117 559\r
75bf9d0e
LG
560 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
561 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 562 \r
be9304f3
ED
563 NewMenuEntry = NULL;\r
564 for (OptionIndex = 0; (OptionOrder[OptionIndex] != 0 && OptionIndex < MAX_MENU_NUMBER); OptionIndex++) {\r
565 BootOptionFound = FALSE;\r
566 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
567 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
568 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
569 if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {\r
570 BootOptionFound = TRUE;\r
571 break;\r
22d1f978
RN
572 }\r
573 }\r
be9304f3
ED
574 if (BootOptionFound) {\r
575 HiiCreateOneOfOptionOpCode (\r
576 OptionsOpCodeHandle,\r
577 NewMenuEntry->DisplayStringToken,\r
578 0,\r
579 EFI_IFR_TYPE_NUM_SIZE_32,\r
580 OptionOrder[OptionIndex]\r
581 );\r
582 }\r
5c08e117 583 }\r
be9304f3 584 \r
5c08e117 585 if (OptionMenu->MenuNumber > 0) {\r
75bf9d0e
LG
586 HiiCreateOrderedListOpCode ( \r
587 mStartOpCodeHandle, // Container for dynamic created opcodes \r
be9304f3 588 QuestionId, // Question ID \r
75bf9d0e 589 VARSTORE_ID_BOOT_MAINT, // VarStore ID \r
be9304f3 590 VarOffset, // Offset in Buffer Storage \r
75bf9d0e
LG
591 STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text \r
592 STRING_TOKEN (STR_CHANGE_ORDER), // Question help text \r
593 0, // Question flag \r
594 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
b452ca89 595 EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value \r
75bf9d0e
LG
596 100, // Maximum container \r
597 OptionsOpCodeHandle, // Option Opcode list \r
598 NULL // Default Opcode is NULL \r
5c08e117 599 );\r
600 }\r
601\r
75bf9d0e 602 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 603\r
604 UpdatePageEnd (CallbackData);\r
5c08e117 605}\r
606\r
607/**\r
608 Create the dynamic page to allow user to set\r
609 the "BootNext" value.\r
610\r
611 @param CallbackData The BMM context data.\r
612\r
613**/\r
614VOID\r
615UpdateBootNextPage (\r
616 IN BMM_CALLBACK_DATA *CallbackData\r
617 )\r
618{\r
619 BM_MENU_ENTRY *NewMenuEntry;\r
620 BM_LOAD_CONTEXT *NewLoadContext;\r
5c08e117 621 UINTN NumberOfOptions;\r
622 UINT16 Index;\r
75bf9d0e 623 VOID *OptionsOpCodeHandle;\r
5c08e117 624\r
5c08e117 625 NumberOfOptions = BootOptionMenu.MenuNumber;\r
626 CallbackData->BmmAskSaveOrNot = TRUE;\r
627\r
628 UpdatePageStart (CallbackData);\r
629 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
630\r
631 if (NumberOfOptions > 0) {\r
75bf9d0e
LG
632 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
633 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 634\r
be9304f3 635 //CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);\r
5c08e117 636\r
637 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
638 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
639 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
75bf9d0e 640\r
5c08e117 641 if (NewLoadContext->IsBootNext) {\r
75bf9d0e
LG
642 HiiCreateOneOfOptionOpCode (\r
643 OptionsOpCodeHandle,\r
644 NewMenuEntry->DisplayStringToken,\r
645 EFI_IFR_OPTION_DEFAULT,\r
b452ca89 646 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
647 Index\r
648 );\r
be9304f3 649 //CallbackData->BmmFakeNvData.BootNext = Index;\r
5c08e117 650 } else {\r
75bf9d0e
LG
651 HiiCreateOneOfOptionOpCode (\r
652 OptionsOpCodeHandle,\r
653 NewMenuEntry->DisplayStringToken,\r
654 0,\r
b452ca89 655 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
656 Index\r
657 );\r
5c08e117 658 }\r
5c08e117 659 }\r
660\r
5c08e117 661 if (CallbackData->BmmFakeNvData.BootNext == Index) {\r
75bf9d0e
LG
662 HiiCreateOneOfOptionOpCode (\r
663 OptionsOpCodeHandle,\r
664 STRING_TOKEN (STR_NONE),\r
665 EFI_IFR_OPTION_DEFAULT,\r
b452ca89 666 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
667 Index\r
668 );\r
669 } else {\r
670 HiiCreateOneOfOptionOpCode (\r
671 OptionsOpCodeHandle,\r
672 STRING_TOKEN (STR_NONE),\r
673 0,\r
b452ca89 674 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
675 Index\r
676 );\r
677 } \r
5c08e117 678\r
75bf9d0e
LG
679 HiiCreateOneOfOpCode (\r
680 mStartOpCodeHandle,\r
5c08e117 681 (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,\r
682 VARSTORE_ID_BOOT_MAINT,\r
683 BOOT_NEXT_VAR_OFFSET,\r
684 STRING_TOKEN (STR_BOOT_NEXT),\r
685 STRING_TOKEN (STR_BOOT_NEXT_HELP),\r
686 0,\r
687 EFI_IFR_NUMERIC_SIZE_2,\r
75bf9d0e
LG
688 OptionsOpCodeHandle,\r
689 NULL\r
5c08e117 690 );\r
691\r
75bf9d0e 692 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 693 }\r
694\r
695 UpdatePageEnd (CallbackData);\r
696}\r
697\r
698/**\r
699 Create the dynamic page to allow user to set the "TimeOut" value.\r
700\r
701 @param CallbackData The BMM context data.\r
702\r
703**/\r
704VOID\r
705UpdateTimeOutPage (\r
706 IN BMM_CALLBACK_DATA *CallbackData\r
707 )\r
708{\r
709 UINT16 BootTimeOut;\r
75bf9d0e 710 VOID *DefaultOpCodeHandle;\r
5c08e117 711\r
712 CallbackData->BmmAskSaveOrNot = TRUE;\r
713\r
714 UpdatePageStart (CallbackData);\r
715\r
8c81cb83 716 BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut);\r
5c08e117 717\r
75bf9d0e
LG
718 DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();\r
719 ASSERT (DefaultOpCodeHandle != NULL);\r
b452ca89 720 HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_NUM_SIZE_16, BootTimeOut);\r
75bf9d0e
LG
721\r
722 HiiCreateNumericOpCode (\r
723 mStartOpCodeHandle,\r
5c08e117 724 (EFI_QUESTION_ID) BOOT_TIME_OUT_QUESTION_ID,\r
725 VARSTORE_ID_BOOT_MAINT,\r
726 BOOT_TIME_OUT_VAR_OFFSET,\r
727 STRING_TOKEN (STR_NUM_AUTO_BOOT),\r
728 STRING_TOKEN (STR_HLP_AUTO_BOOT),\r
729 0,\r
730 EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,\r
731 0,\r
732 65535,\r
733 0,\r
75bf9d0e 734 DefaultOpCodeHandle\r
5c08e117 735 );\r
75bf9d0e
LG
736 \r
737 HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
5c08e117 738\r
be9304f3 739 //CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
5c08e117 740\r
741 UpdatePageEnd (CallbackData);\r
742}\r
743\r
744/**\r
745 Refresh the text mode page.\r
746\r
747 @param CallbackData The BMM context data.\r
748\r
749**/\r
750VOID\r
751UpdateConModePage (\r
752 IN BMM_CALLBACK_DATA *CallbackData\r
753 )\r
754{\r
755 UINTN Mode;\r
756 UINTN Index;\r
757 UINTN Col;\r
758 UINTN Row;\r
5c08e117 759 CHAR16 ModeString[50];\r
19bf20e1 760 CHAR16 *PStr;\r
5c08e117 761 UINTN MaxMode;\r
762 UINTN ValidMode;\r
763 EFI_STRING_ID *ModeToken;\r
5c08e117 764 EFI_STATUS Status;\r
75bf9d0e 765 VOID *OptionsOpCodeHandle;\r
5c08e117 766 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
767\r
768 ConOut = gST->ConOut;\r
769 Index = 0;\r
770 ValidMode = 0;\r
771 MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
772\r
773 CallbackData->BmmAskSaveOrNot = TRUE;\r
774\r
775 UpdatePageStart (CallbackData);\r
776\r
777 //\r
778 // Check valid mode\r
779 //\r
780 for (Mode = 0; Mode < MaxMode; Mode++) {\r
781 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
782 if (EFI_ERROR (Status)) {\r
783 continue;\r
784 }\r
785 ValidMode++;\r
786 }\r
787\r
788 if (ValidMode == 0) {\r
789 return;\r
790 }\r
791\r
75bf9d0e
LG
792 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
793 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 794\r
795 ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
796 ASSERT(ModeToken != NULL);\r
797\r
798 //\r
799 // Determin which mode should be the first entry in menu\r
800 //\r
be9304f3 801 // GetConsoleOutMode (CallbackData);\r
5c08e117 802\r
803 //\r
804 // Build text mode options\r
805 //\r
806 for (Mode = 0; Mode < MaxMode; Mode++) {\r
807 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
808 if (EFI_ERROR (Status)) {\r
809 continue;\r
810 }\r
811 \r
812 //\r
813 // Build mode string Column x Row\r
814 //\r
7a45e5aa 815 UnicodeValueToString (ModeString, 0, Col, 0);\r
19bf20e1 816 PStr = &ModeString[0];\r
b55f8b01
LG
817 StrnCat (PStr, L" x ", StrLen(L" x ") + 1);\r
818 PStr = PStr + StrLen (PStr);\r
819 UnicodeValueToString (PStr , 0, Row, 0);\r
5c08e117 820\r
cb7d01c0 821 ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
5c08e117 822\r
5c08e117 823 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
75bf9d0e
LG
824 HiiCreateOneOfOptionOpCode (\r
825 OptionsOpCodeHandle,\r
826 ModeToken[Index],\r
827 EFI_IFR_OPTION_DEFAULT,\r
b452ca89 828 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
829 (UINT16) Mode\r
830 );\r
5c08e117 831 } else {\r
75bf9d0e
LG
832 HiiCreateOneOfOptionOpCode (\r
833 OptionsOpCodeHandle,\r
834 ModeToken[Index],\r
835 0,\r
b452ca89 836 EFI_IFR_TYPE_NUM_SIZE_16,\r
75bf9d0e
LG
837 (UINT16) Mode\r
838 );\r
5c08e117 839 }\r
840 Index++;\r
841 }\r
842\r
75bf9d0e
LG
843 HiiCreateOneOfOpCode (\r
844 mStartOpCodeHandle,\r
5c08e117 845 (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
846 VARSTORE_ID_BOOT_MAINT,\r
847 CON_MODE_VAR_OFFSET,\r
848 STRING_TOKEN (STR_CON_MODE_SETUP),\r
849 STRING_TOKEN (STR_CON_MODE_SETUP),\r
850 EFI_IFR_FLAG_RESET_REQUIRED,\r
851 EFI_IFR_NUMERIC_SIZE_2,\r
75bf9d0e
LG
852 OptionsOpCodeHandle,\r
853 NULL\r
5c08e117 854 );\r
75bf9d0e
LG
855\r
856 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 857 FreePool (ModeToken);\r
858\r
859 UpdatePageEnd (CallbackData);\r
860}\r
861\r
862/**\r
863 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
864 Parity, Stop Bits, Terminal Type.\r
865\r
866 @param CallbackData The BMM context data.\r
867\r
868**/\r
869VOID\r
870UpdateTerminalPage (\r
871 IN BMM_CALLBACK_DATA *CallbackData\r
872 )\r
873{\r
874 UINT8 Index;\r
875 UINT8 CheckFlags;\r
5c08e117 876 BM_MENU_ENTRY *NewMenuEntry;\r
877 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
75bf9d0e 878 VOID *OptionsOpCodeHandle;\r
be9304f3 879 UINTN CurrentTerminal;\r
5c08e117 880\r
881 UpdatePageStart (CallbackData);\r
882\r
be9304f3 883 CurrentTerminal = CallbackData->CurrentTerminal;\r
5c08e117 884 NewMenuEntry = BOpt_GetMenuEntry (\r
885 &TerminalMenu,\r
be9304f3 886 CurrentTerminal\r
5c08e117 887 );\r
888\r
889 if (NewMenuEntry == NULL) {\r
890 return ;\r
891 }\r
892\r
893 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
894\r
75bf9d0e
LG
895 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
896 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 897\r
898 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
899 CheckFlags = 0;\r
be9304f3 900 if (BaudRateList[Index].Value == 115200) {\r
5c08e117 901 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 902 }\r
75bf9d0e
LG
903 HiiCreateOneOfOptionOpCode (\r
904 OptionsOpCodeHandle,\r
905 BaudRateList[Index].StringToken,\r
906 CheckFlags,\r
b452ca89 907 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
908 Index\r
909 );\r
5c08e117 910 }\r
911\r
75bf9d0e
LG
912 HiiCreateOneOfOpCode (\r
913 mStartOpCodeHandle,\r
be9304f3 914 (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
5c08e117 915 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 916 (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
5c08e117 917 STRING_TOKEN (STR_COM_BAUD_RATE),\r
918 STRING_TOKEN (STR_COM_BAUD_RATE),\r
919 0,\r
920 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
921 OptionsOpCodeHandle,\r
922 NULL\r
5c08e117 923 );\r
75bf9d0e
LG
924 \r
925 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
926 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
927 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 928\r
929 for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {\r
930 CheckFlags = 0;\r
931\r
be9304f3 932 if (DataBitsList[Index].Value == 8) {\r
5c08e117 933 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
934 }\r
935\r
75bf9d0e
LG
936 HiiCreateOneOfOptionOpCode (\r
937 OptionsOpCodeHandle,\r
938 DataBitsList[Index].StringToken,\r
939 CheckFlags,\r
b452ca89 940 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
941 Index\r
942 );\r
5c08e117 943 }\r
944\r
75bf9d0e
LG
945 HiiCreateOneOfOpCode (\r
946 mStartOpCodeHandle,\r
be9304f3 947 (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
5c08e117 948 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 949 (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
5c08e117 950 STRING_TOKEN (STR_COM_DATA_BITS),\r
951 STRING_TOKEN (STR_COM_DATA_BITS),\r
952 0,\r
953 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
954 OptionsOpCodeHandle,\r
955 NULL\r
5c08e117 956 );\r
957\r
75bf9d0e
LG
958 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
959 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
960 ASSERT (OptionsOpCodeHandle != NULL);\r
961\r
5c08e117 962 for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
963 CheckFlags = 0;\r
be9304f3 964 if (ParityList[Index].Value == NoParity) {\r
5c08e117 965 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 966 }\r
967\r
75bf9d0e
LG
968 HiiCreateOneOfOptionOpCode (\r
969 OptionsOpCodeHandle,\r
970 ParityList[Index].StringToken,\r
971 CheckFlags,\r
b452ca89 972 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
973 Index\r
974 );\r
5c08e117 975 }\r
976\r
75bf9d0e
LG
977 HiiCreateOneOfOpCode (\r
978 mStartOpCodeHandle,\r
be9304f3 979 (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
5c08e117 980 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 981 (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
5c08e117 982 STRING_TOKEN (STR_COM_PARITY),\r
983 STRING_TOKEN (STR_COM_PARITY),\r
984 0,\r
985 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
986 OptionsOpCodeHandle,\r
987 NULL\r
5c08e117 988 );\r
989\r
75bf9d0e
LG
990 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
991 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
992 ASSERT (OptionsOpCodeHandle != NULL);\r
993\r
5c08e117 994 for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
995 CheckFlags = 0;\r
be9304f3 996 if (StopBitsList[Index].Value == OneStopBit) {\r
5c08e117 997 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 998 }\r
999\r
75bf9d0e
LG
1000 HiiCreateOneOfOptionOpCode (\r
1001 OptionsOpCodeHandle,\r
1002 StopBitsList[Index].StringToken,\r
1003 CheckFlags,\r
b452ca89 1004 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
1005 Index\r
1006 );\r
5c08e117 1007 }\r
1008\r
75bf9d0e
LG
1009 HiiCreateOneOfOpCode (\r
1010 mStartOpCodeHandle,\r
be9304f3 1011 (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
5c08e117 1012 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 1013 (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
5c08e117 1014 STRING_TOKEN (STR_COM_STOP_BITS),\r
1015 STRING_TOKEN (STR_COM_STOP_BITS),\r
1016 0,\r
1017 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1018 OptionsOpCodeHandle,\r
1019 NULL\r
5c08e117 1020 );\r
1021\r
75bf9d0e
LG
1022 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1023 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1024 ASSERT (OptionsOpCodeHandle != NULL);\r
1025\r
5c08e117 1026 for (Index = 0; Index < 4; Index++) {\r
1027 CheckFlags = 0;\r
be9304f3 1028 if (Index == 0) {\r
5c08e117 1029 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
5c08e117 1030 }\r
1031\r
75bf9d0e
LG
1032 HiiCreateOneOfOptionOpCode (\r
1033 OptionsOpCodeHandle,\r
1034 (EFI_STRING_ID) TerminalType[Index],\r
1035 CheckFlags,\r
b452ca89 1036 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
1037 Index\r
1038 );\r
5c08e117 1039 }\r
1040\r
75bf9d0e
LG
1041 HiiCreateOneOfOpCode (\r
1042 mStartOpCodeHandle,\r
be9304f3 1043 (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
5c08e117 1044 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 1045 (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
5c08e117 1046 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
1047 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
1048 0,\r
1049 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1050 OptionsOpCodeHandle,\r
1051 NULL\r
5c08e117 1052 );\r
1053\r
8e491a81
ED
1054 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1055 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1056 ASSERT (OptionsOpCodeHandle != NULL);\r
1057\r
8e491a81 1058 for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) {\r
be9304f3
ED
1059 CheckFlags = 0;\r
1060 if (Index == 0) {\r
1061 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
1062 }\r
8e491a81
ED
1063 HiiCreateOneOfOptionOpCode (\r
1064 OptionsOpCodeHandle,\r
1065 (EFI_STRING_ID) mFlowControlType[Index],\r
be9304f3 1066 CheckFlags,\r
8e491a81
ED
1067 EFI_IFR_TYPE_NUM_SIZE_8,\r
1068 mFlowControlValue[Index]\r
1069 );\r
1070 }\r
1071\r
1072 HiiCreateOneOfOpCode (\r
1073 mStartOpCodeHandle,\r
be9304f3 1074 (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
8e491a81 1075 VARSTORE_ID_BOOT_MAINT,\r
be9304f3 1076 (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
8e491a81
ED
1077 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
1078 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
1079 0,\r
1080 EFI_IFR_NUMERIC_SIZE_1,\r
1081 OptionsOpCodeHandle,\r
1082 NULL\r
1083 );\r
1084\r
75bf9d0e 1085 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 1086\r
1087 UpdatePageEnd (CallbackData);\r
1088}\r
1089\r
1090/**\r
1091 Dispatch the correct update page function to call based on\r
1092 the UpdatePageId.\r
1093\r
1094 @param UpdatePageId The form ID.\r
1095 @param CallbackData The BMM context data.\r
1096\r
1097**/\r
1098VOID\r
1099UpdatePageBody (\r
1100 IN UINT16 UpdatePageId,\r
1101 IN BMM_CALLBACK_DATA *CallbackData\r
1102 )\r
1103{\r
1104 CleanUpPage (UpdatePageId, CallbackData);\r
1105 switch (UpdatePageId) {\r
1106 case FORM_CON_IN_ID:\r
1107 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
1108 break;\r
1109\r
1110 case FORM_CON_OUT_ID:\r
1111 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
1112 break;\r
1113\r
1114 case FORM_CON_ERR_ID:\r
1115 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
1116 break;\r
1117\r
1118 case FORM_BOOT_CHG_ID:\r
1119 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
1120 break;\r
1121\r
1122 case FORM_DRV_CHG_ID:\r
1123 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
1124 break;\r
1125\r
1126 default:\r
1127 break;\r
1128 }\r
1129}\r
1130\r
5c08e117 1131/**\r
1132 Create a dynamic page so that Legacy Device boot order\r
1133 can be set for specified device type.\r
1134\r
1135 @param UpdatePageId The form ID. It also spefies the legacy device type.\r
1136 @param CallbackData The BMM context data.\r
1137\r
1138\r
1139**/\r
1140VOID\r
1141UpdateSetLegacyDeviceOrderPage (\r
1142 IN UINT16 UpdatePageId,\r
1143 IN BMM_CALLBACK_DATA *CallbackData\r
1144 )\r
1145{\r
e24fc103 1146 LEGACY_DEV_ORDER_ENTRY *DevOrder;\r
5c08e117 1147 BM_MENU_OPTION *OptionMenu;\r
1148 BM_MENU_ENTRY *NewMenuEntry;\r
5c08e117 1149 EFI_STRING_ID StrRef;\r
1150 EFI_STRING_ID StrRefHelp;\r
1151 BBS_TYPE BbsType;\r
1152 UINTN VarSize;\r
1153 UINTN Pos;\r
1154 UINTN Bit;\r
1155 UINT16 Index;\r
1156 UINT16 Key;\r
1157 CHAR16 String[100];\r
1158 CHAR16 *TypeStr;\r
1159 CHAR16 *TypeStrHelp;\r
1160 UINT16 VarDevOrder;\r
1161 UINT8 *VarData;\r
1162 UINT8 *LegacyOrder;\r
1163 UINT8 *OldData;\r
1164 UINT8 *DisMap;\r
75bf9d0e 1165 VOID *OptionsOpCodeHandle;\r
5c08e117 1166\r
1167 OptionMenu = NULL;\r
1168 Key = 0;\r
1169 StrRef = 0;\r
1170 StrRefHelp = 0;\r
1171 TypeStr = NULL;\r
1172 TypeStrHelp = NULL;\r
1173 BbsType = BBS_FLOPPY;\r
1174 LegacyOrder = NULL;\r
1175 OldData = NULL;\r
1176 DisMap = NULL;\r
1177\r
1178 CallbackData->BmmAskSaveOrNot = TRUE;\r
1179 UpdatePageStart (CallbackData);\r
1180\r
22d1f978 1181 DisMap = ZeroMem (CallbackData->BmmOldFakeNVData.DisableMap, sizeof (CallbackData->BmmOldFakeNVData.DisableMap));\r
5c08e117 1182\r
5c08e117 1183 //\r
1184 // Create oneof option list\r
1185 //\r
1186 switch (UpdatePageId) {\r
1187 case FORM_SET_FD_ORDER_ID:\r
1188 OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu;\r
1189 Key = (UINT16) LEGACY_FD_QUESTION_ID;\r
1190 TypeStr = STR_FLOPPY;\r
1191 TypeStrHelp = STR_FLOPPY_HELP;\r
1192 BbsType = BBS_FLOPPY;\r
1193 LegacyOrder = CallbackData->BmmFakeNvData.LegacyFD;\r
1194 OldData = CallbackData->BmmOldFakeNVData.LegacyFD;\r
1195 break;\r
1196\r
1197 case FORM_SET_HD_ORDER_ID:\r
1198 OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu;\r
1199 Key = (UINT16) LEGACY_HD_QUESTION_ID;\r
1200 TypeStr = STR_HARDDISK;\r
1201 TypeStrHelp = STR_HARDDISK_HELP;\r
1202 BbsType = BBS_HARDDISK;\r
1203 LegacyOrder = CallbackData->BmmFakeNvData.LegacyHD;\r
1204 OldData = CallbackData->BmmOldFakeNVData.LegacyHD;\r
1205 break;\r
1206\r
1207 case FORM_SET_CD_ORDER_ID:\r
1208 OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu;\r
1209 Key = (UINT16) LEGACY_CD_QUESTION_ID;\r
1210 TypeStr = STR_CDROM;\r
1211 TypeStrHelp = STR_CDROM_HELP;\r
1212 BbsType = BBS_CDROM;\r
1213 LegacyOrder = CallbackData->BmmFakeNvData.LegacyCD;\r
1214 OldData = CallbackData->BmmOldFakeNVData.LegacyCD;\r
1215 break;\r
1216\r
1217 case FORM_SET_NET_ORDER_ID:\r
1218 OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu;\r
1219 Key = (UINT16) LEGACY_NET_QUESTION_ID;\r
1220 TypeStr = STR_NET;\r
1221 TypeStrHelp = STR_NET_HELP;\r
1222 BbsType = BBS_EMBED_NETWORK;\r
1223 LegacyOrder = CallbackData->BmmFakeNvData.LegacyNET;\r
1224 OldData = CallbackData->BmmOldFakeNVData.LegacyNET;\r
1225 break;\r
1226\r
1227 case FORM_SET_BEV_ORDER_ID:\r
1228 OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu;\r
1229 Key = (UINT16) LEGACY_BEV_QUESTION_ID;\r
1230 TypeStr = STR_BEV;\r
1231 TypeStrHelp = STR_BEV_HELP;\r
1232 BbsType = BBS_BEV_DEVICE;\r
1233 LegacyOrder = CallbackData->BmmFakeNvData.LegacyBEV;\r
1234 OldData = CallbackData->BmmOldFakeNVData.LegacyBEV;\r
1235 break;\r
1236\r
1237 default:\r
1238 DEBUG ((EFI_D_ERROR, "Invalid command ID for updating page!\n"));\r
1239 return;\r
1240 }\r
1241\r
1242 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
1243\r
75bf9d0e
LG
1244 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1245 ASSERT (OptionsOpCodeHandle != NULL);\r
5c08e117 1246\r
1247 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1248 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
b1620d0b 1249 //\r
22d1f978 1250 // Create OneOf for each legacy device\r
b1620d0b 1251 //\r
75bf9d0e
LG
1252 HiiCreateOneOfOptionOpCode (\r
1253 OptionsOpCodeHandle,\r
1254 NewMenuEntry->DisplayStringToken,\r
22d1f978 1255 0,\r
b452ca89 1256 EFI_IFR_TYPE_NUM_SIZE_8,\r
22d1f978 1257 (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->BbsIndex\r
75bf9d0e 1258 );\r
5c08e117 1259 }\r
75bf9d0e 1260\r
5c08e117 1261 //\r
22d1f978 1262 // Create OneOf for item "Disabled"\r
5c08e117 1263 //\r
75bf9d0e
LG
1264 HiiCreateOneOfOptionOpCode (\r
1265 OptionsOpCodeHandle,\r
1266 STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE),\r
1267 0,\r
b452ca89 1268 EFI_IFR_TYPE_NUM_SIZE_8,\r
75bf9d0e
LG
1269 0xFF\r
1270 );\r
5c08e117 1271\r
1272 //\r
1273 // Get Device Order from variable\r
1274 //\r
1275 VarData = BdsLibGetVariableAndSize (\r
1276 VAR_LEGACY_DEV_ORDER,\r
e24fc103 1277 &gEfiLegacyDevOrderVariableGuid,\r
5c08e117 1278 &VarSize\r
1279 );\r
1280\r
1281 if (NULL != VarData) {\r
e24fc103 1282 DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData;\r
5c08e117 1283 while (VarData < VarData + VarSize) {\r
1284 if (DevOrder->BbsType == BbsType) {\r
1285 break;\r
1286 }\r
1287\r
1288 VarData += sizeof (BBS_TYPE);\r
1289 VarData += *(UINT16 *) VarData;\r
e24fc103 1290 DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData;\r
5c08e117 1291 }\r
1292 //\r
1293 // Create oneof tag here for FD/HD/CD #1 #2\r
1294 //\r
1295 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1296 //\r
1297 // Create the string for oneof tag\r
1298 //\r
1299 UnicodeSPrint (String, sizeof (String), TypeStr, Index);\r
cb7d01c0 1300 StrRef = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
5c08e117 1301\r
1302 UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index);\r
cb7d01c0 1303 StrRefHelp = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
5c08e117 1304\r
75bf9d0e
LG
1305 HiiCreateOneOfOpCode (\r
1306 mStartOpCodeHandle,\r
5c08e117 1307 (EFI_QUESTION_ID) (Key + Index),\r
1308 VARSTORE_ID_BOOT_MAINT,\r
1309 (UINT16) (Key + Index - CONFIG_OPTION_OFFSET),\r
1310 StrRef,\r
1311 StrRefHelp,\r
1312 EFI_IFR_FLAG_CALLBACK,\r
1313 EFI_IFR_NUMERIC_SIZE_1,\r
75bf9d0e
LG
1314 OptionsOpCodeHandle,\r
1315 NULL\r
5c08e117 1316 );\r
1317\r
1318 VarDevOrder = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16));\r
1319\r
1320 if (0xFF00 == (VarDevOrder & 0xFF00)) {\r
1321 LegacyOrder[Index] = 0xFF;\r
1322 Pos = (VarDevOrder & 0xFF) / 8;\r
1323 Bit = 7 - ((VarDevOrder & 0xFF) % 8);\r
1324 DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));\r
1325 } else {\r
1326 LegacyOrder[Index] = (UINT8) (VarDevOrder & 0xFF);\r
1327 }\r
1328 }\r
1329 }\r
1330\r
1331 CopyMem (OldData, LegacyOrder, 100);\r
1332\r
75bf9d0e 1333 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
5c08e117 1334\r
1335 UpdatePageEnd (CallbackData);\r
1336}\r
1337\r
be9304f3 1338\r
5c08e117 1339/**\r
1340 Dispatch the display to the next page based on NewPageId.\r
1341\r
1342 @param Private The BMM context data.\r
1343 @param NewPageId The original page ID.\r
1344\r
1345**/\r
1346VOID\r
1347UpdatePageId (\r
1348 BMM_CALLBACK_DATA *Private,\r
1349 UINT16 NewPageId\r
1350 )\r
1351{\r
1352 if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
1353 //\r
1354 // If we select a handle to add driver option, advance to the add handle description page.\r
1355 //\r
1356 NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
1357 } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
1358 //\r
1359 // Return to main page after "Save Changes" or "Discard Changes".\r
1360 //\r
1361 NewPageId = FORM_MAIN_ID;\r
1362 } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
1363 NewPageId = FORM_CON_COM_SETUP_ID;\r
1364 }\r
1365\r
1366 if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
1367 Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
1368 Private->BmmCurrentPageId = NewPageId;\r
1369 }\r
1370}\r