]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c
Support RouteConfig function for BdsDxe driver.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / BootMaint / UpdatePage.c
... / ...
CommitLineData
1/** @file\r
2Dynamically update the pages.\r
3\r
4Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "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
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
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
59 mStartLabel->Number = CallbackData->BmmCurrentPageId;\r
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
66 HiiCreateGotoOpCode (\r
67 mStartOpCodeHandle,\r
68 FORM_MAIN_ID,\r
69 STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
70 STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
71 0,\r
72 FORM_MAIN_ID\r
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
94 HiiCreateSubTitleOpCode (\r
95 mStartOpCodeHandle,\r
96 STRING_TOKEN (STR_NULL_STRING),\r
97 0,\r
98 0,\r
99 0\r
100 );\r
101\r
102 HiiCreateActionOpCode (\r
103 mStartOpCodeHandle,\r
104 KEY_VALUE_SAVE_AND_EXIT,\r
105 STRING_TOKEN (STR_SAVE_AND_EXIT),\r
106 STRING_TOKEN (STR_NULL_STRING),\r
107 EFI_IFR_FLAG_CALLBACK,\r
108 0\r
109 );\r
110 }\r
111\r
112 //\r
113 // Ensure user can return to the main page.\r
114 //\r
115 HiiCreateActionOpCode (\r
116 mStartOpCodeHandle,\r
117 KEY_VALUE_NO_SAVE_AND_EXIT,\r
118 STRING_TOKEN (STR_NO_SAVE_AND_EXIT),\r
119 STRING_TOKEN (STR_NULL_STRING),\r
120 EFI_IFR_FLAG_CALLBACK,\r
121 0\r
122 );\r
123\r
124 HiiUpdateForm (\r
125 CallbackData->BmmHiiHandle,\r
126 &gBootMaintFormSetGuid,\r
127 CallbackData->BmmCurrentPageId,\r
128 mStartOpCodeHandle, // Label CallbackData->BmmCurrentPageId\r
129 mEndOpCodeHandle // LABEL_END\r
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
151 mStartLabel->Number = LabelId;\r
152 HiiUpdateForm (\r
153 CallbackData->BmmHiiHandle,\r
154 &gBootMaintFormSetGuid,\r
155 LabelId,\r
156 mStartOpCodeHandle, // Label LabelId\r
157 mEndOpCodeHandle // LABEL_END\r
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
183 Option->Description = (CHAR16 *) AllocateCopyPool (StrSize (FileContext->FileName), FileContext->FileName);\r
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
223 HiiCreateGotoOpCode (\r
224 mStartOpCodeHandle,\r
225 FORM_CON_COM_SETUP_ID,\r
226 NewMenuEntry->DisplayStringToken,\r
227 STRING_TOKEN (STR_NULL_STRING),\r
228 EFI_IFR_FLAG_CALLBACK,\r
229 (UINT16) (TERMINAL_OPTION_OFFSET + Index)\r
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
257 ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionDel) / sizeof (CallbackData->BmmFakeNvData.BootOptionDel[0])));\r
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
266 //CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
267\r
268 HiiCreateCheckBoxOpCode (\r
269 mStartOpCodeHandle,\r
270 (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
271 VARSTORE_ID_BOOT_MAINT,\r
272 (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
273 NewMenuEntry->DisplayStringToken,\r
274 NewMenuEntry->HelpStringToken,\r
275 0,\r
276 0,\r
277 NULL\r
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
305 HiiCreateGotoOpCode (\r
306 mStartOpCodeHandle,\r
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
311 (UINT16) (HANDLE_OPTION_OFFSET + Index)\r
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
340 ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionDel) / sizeof (CallbackData->BmmFakeNvData.DriverOptionDel[0])));\r
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
346 //CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
347\r
348 HiiCreateCheckBoxOpCode (\r
349 mStartOpCodeHandle,\r
350 (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
351 VARSTORE_ID_BOOT_MAINT,\r
352 (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
353 NewMenuEntry->DisplayStringToken,\r
354 NewMenuEntry->HelpStringToken,\r
355 0,\r
356 0,\r
357 NULL\r
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
385 HiiCreateSubTitleOpCode (\r
386 mStartOpCodeHandle,\r
387 NewMenuEntry->DisplayStringToken,\r
388 0,\r
389 0,\r
390 0\r
391 );\r
392\r
393 HiiCreateStringOpCode (\r
394 mStartOpCodeHandle,\r
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
404 NULL\r
405 );\r
406\r
407 HiiCreateCheckBoxOpCode (\r
408 mStartOpCodeHandle,\r
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
416 NULL\r
417 );\r
418\r
419 HiiCreateStringOpCode (\r
420 mStartOpCodeHandle,\r
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
430 NULL\r
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
452 UINT16 Index;\r
453 UINT8 CheckFlags;\r
454 UINT8 *ConsoleCheck;\r
455 EFI_QUESTION_ID QuestionIdBase;\r
456 UINT16 VariableOffsetBase;\r
457\r
458 UpdatePageStart (CallbackData);\r
459\r
460 ConsoleCheck = NULL;\r
461 QuestionIdBase = 0;\r
462 VariableOffsetBase = 0;\r
463\r
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
482 }\r
483 ASSERT (ConsoleCheck != NULL);\r
484\r
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
489 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
490 }\r
491 NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
492 HiiCreateCheckBoxOpCode (\r
493 mStartOpCodeHandle,\r
494 (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
495 VARSTORE_ID_BOOT_MAINT,\r
496 (UINT16) (VariableOffsetBase + Index),\r
497 NewMenuEntry->DisplayStringToken,\r
498 NewMenuEntry->HelpStringToken,\r
499 0,\r
500 CheckFlags,\r
501 NULL\r
502 );\r
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
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
533\r
534\r
535 UpdatePageStart (CallbackData);\r
536\r
537 CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);\r
538 \r
539 OptionOrder = NULL;\r
540 QuestionId = 0;\r
541 VarOffset = 0;\r
542 switch (UpdatePageId) { \r
543\r
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
559\r
560 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
561 ASSERT (OptionsOpCodeHandle != NULL);\r
562 \r
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
572 }\r
573 }\r
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
583 }\r
584 \r
585 if (OptionMenu->MenuNumber > 0) {\r
586 HiiCreateOrderedListOpCode ( \r
587 mStartOpCodeHandle, // Container for dynamic created opcodes \r
588 QuestionId, // Question ID \r
589 VARSTORE_ID_BOOT_MAINT, // VarStore ID \r
590 VarOffset, // Offset in Buffer Storage \r
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
595 EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value \r
596 100, // Maximum container \r
597 OptionsOpCodeHandle, // Option Opcode list \r
598 NULL // Default Opcode is NULL \r
599 );\r
600 }\r
601\r
602 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
603\r
604 UpdatePageEnd (CallbackData);\r
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
621 UINTN NumberOfOptions;\r
622 UINT16 Index;\r
623 VOID *OptionsOpCodeHandle;\r
624\r
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
632 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
633 ASSERT (OptionsOpCodeHandle != NULL);\r
634\r
635 //CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);\r
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
640\r
641 if (NewLoadContext->IsBootNext) {\r
642 HiiCreateOneOfOptionOpCode (\r
643 OptionsOpCodeHandle,\r
644 NewMenuEntry->DisplayStringToken,\r
645 EFI_IFR_OPTION_DEFAULT,\r
646 EFI_IFR_TYPE_NUM_SIZE_16,\r
647 Index\r
648 );\r
649 //CallbackData->BmmFakeNvData.BootNext = Index;\r
650 } else {\r
651 HiiCreateOneOfOptionOpCode (\r
652 OptionsOpCodeHandle,\r
653 NewMenuEntry->DisplayStringToken,\r
654 0,\r
655 EFI_IFR_TYPE_NUM_SIZE_16,\r
656 Index\r
657 );\r
658 }\r
659 }\r
660\r
661 if (CallbackData->BmmFakeNvData.BootNext == Index) {\r
662 HiiCreateOneOfOptionOpCode (\r
663 OptionsOpCodeHandle,\r
664 STRING_TOKEN (STR_NONE),\r
665 EFI_IFR_OPTION_DEFAULT,\r
666 EFI_IFR_TYPE_NUM_SIZE_16,\r
667 Index\r
668 );\r
669 } else {\r
670 HiiCreateOneOfOptionOpCode (\r
671 OptionsOpCodeHandle,\r
672 STRING_TOKEN (STR_NONE),\r
673 0,\r
674 EFI_IFR_TYPE_NUM_SIZE_16,\r
675 Index\r
676 );\r
677 } \r
678\r
679 HiiCreateOneOfOpCode (\r
680 mStartOpCodeHandle,\r
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
688 OptionsOpCodeHandle,\r
689 NULL\r
690 );\r
691\r
692 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
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
710 VOID *DefaultOpCodeHandle;\r
711\r
712 CallbackData->BmmAskSaveOrNot = TRUE;\r
713\r
714 UpdatePageStart (CallbackData);\r
715\r
716 BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut);\r
717\r
718 DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();\r
719 ASSERT (DefaultOpCodeHandle != NULL);\r
720 HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_NUM_SIZE_16, BootTimeOut);\r
721\r
722 HiiCreateNumericOpCode (\r
723 mStartOpCodeHandle,\r
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
734 DefaultOpCodeHandle\r
735 );\r
736 \r
737 HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
738\r
739 //CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;\r
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
759 CHAR16 ModeString[50];\r
760 CHAR16 *PStr;\r
761 UINTN MaxMode;\r
762 UINTN ValidMode;\r
763 EFI_STRING_ID *ModeToken;\r
764 EFI_STATUS Status;\r
765 VOID *OptionsOpCodeHandle;\r
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
792 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
793 ASSERT (OptionsOpCodeHandle != NULL);\r
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
801 // GetConsoleOutMode (CallbackData);\r
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
815 UnicodeValueToString (ModeString, 0, Col, 0);\r
816 PStr = &ModeString[0];\r
817 StrnCat (PStr, L" x ", StrLen(L" x ") + 1);\r
818 PStr = PStr + StrLen (PStr);\r
819 UnicodeValueToString (PStr , 0, Row, 0);\r
820\r
821 ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
822\r
823 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
824 HiiCreateOneOfOptionOpCode (\r
825 OptionsOpCodeHandle,\r
826 ModeToken[Index],\r
827 EFI_IFR_OPTION_DEFAULT,\r
828 EFI_IFR_TYPE_NUM_SIZE_16,\r
829 (UINT16) Mode\r
830 );\r
831 } else {\r
832 HiiCreateOneOfOptionOpCode (\r
833 OptionsOpCodeHandle,\r
834 ModeToken[Index],\r
835 0,\r
836 EFI_IFR_TYPE_NUM_SIZE_16,\r
837 (UINT16) Mode\r
838 );\r
839 }\r
840 Index++;\r
841 }\r
842\r
843 HiiCreateOneOfOpCode (\r
844 mStartOpCodeHandle,\r
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
852 OptionsOpCodeHandle,\r
853 NULL\r
854 );\r
855\r
856 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
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
876 BM_MENU_ENTRY *NewMenuEntry;\r
877 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
878 VOID *OptionsOpCodeHandle;\r
879 UINTN CurrentTerminal;\r
880\r
881 UpdatePageStart (CallbackData);\r
882\r
883 CurrentTerminal = CallbackData->CurrentTerminal;\r
884 NewMenuEntry = BOpt_GetMenuEntry (\r
885 &TerminalMenu,\r
886 CurrentTerminal\r
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
895 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
896 ASSERT (OptionsOpCodeHandle != NULL);\r
897\r
898 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
899 CheckFlags = 0;\r
900 if (BaudRateList[Index].Value == 115200) {\r
901 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
902 }\r
903 HiiCreateOneOfOptionOpCode (\r
904 OptionsOpCodeHandle,\r
905 BaudRateList[Index].StringToken,\r
906 CheckFlags,\r
907 EFI_IFR_TYPE_NUM_SIZE_8,\r
908 Index\r
909 );\r
910 }\r
911\r
912 HiiCreateOneOfOpCode (\r
913 mStartOpCodeHandle,\r
914 (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
915 VARSTORE_ID_BOOT_MAINT,\r
916 (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
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
921 OptionsOpCodeHandle,\r
922 NULL\r
923 );\r
924 \r
925 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
926 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
927 ASSERT (OptionsOpCodeHandle != NULL);\r
928\r
929 for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {\r
930 CheckFlags = 0;\r
931\r
932 if (DataBitsList[Index].Value == 8) {\r
933 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
934 }\r
935\r
936 HiiCreateOneOfOptionOpCode (\r
937 OptionsOpCodeHandle,\r
938 DataBitsList[Index].StringToken,\r
939 CheckFlags,\r
940 EFI_IFR_TYPE_NUM_SIZE_8,\r
941 Index\r
942 );\r
943 }\r
944\r
945 HiiCreateOneOfOpCode (\r
946 mStartOpCodeHandle,\r
947 (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
948 VARSTORE_ID_BOOT_MAINT,\r
949 (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
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
954 OptionsOpCodeHandle,\r
955 NULL\r
956 );\r
957\r
958 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
959 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
960 ASSERT (OptionsOpCodeHandle != NULL);\r
961\r
962 for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
963 CheckFlags = 0;\r
964 if (ParityList[Index].Value == NoParity) {\r
965 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
966 }\r
967\r
968 HiiCreateOneOfOptionOpCode (\r
969 OptionsOpCodeHandle,\r
970 ParityList[Index].StringToken,\r
971 CheckFlags,\r
972 EFI_IFR_TYPE_NUM_SIZE_8,\r
973 Index\r
974 );\r
975 }\r
976\r
977 HiiCreateOneOfOpCode (\r
978 mStartOpCodeHandle,\r
979 (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
980 VARSTORE_ID_BOOT_MAINT,\r
981 (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
982 STRING_TOKEN (STR_COM_PARITY),\r
983 STRING_TOKEN (STR_COM_PARITY),\r
984 0,\r
985 EFI_IFR_NUMERIC_SIZE_1,\r
986 OptionsOpCodeHandle,\r
987 NULL\r
988 );\r
989\r
990 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
991 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
992 ASSERT (OptionsOpCodeHandle != NULL);\r
993\r
994 for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
995 CheckFlags = 0;\r
996 if (StopBitsList[Index].Value == OneStopBit) {\r
997 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
998 }\r
999\r
1000 HiiCreateOneOfOptionOpCode (\r
1001 OptionsOpCodeHandle,\r
1002 StopBitsList[Index].StringToken,\r
1003 CheckFlags,\r
1004 EFI_IFR_TYPE_NUM_SIZE_8,\r
1005 Index\r
1006 );\r
1007 }\r
1008\r
1009 HiiCreateOneOfOpCode (\r
1010 mStartOpCodeHandle,\r
1011 (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
1012 VARSTORE_ID_BOOT_MAINT,\r
1013 (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
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
1018 OptionsOpCodeHandle,\r
1019 NULL\r
1020 );\r
1021\r
1022 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1023 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1024 ASSERT (OptionsOpCodeHandle != NULL);\r
1025\r
1026 for (Index = 0; Index < 4; Index++) {\r
1027 CheckFlags = 0;\r
1028 if (Index == 0) {\r
1029 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
1030 }\r
1031\r
1032 HiiCreateOneOfOptionOpCode (\r
1033 OptionsOpCodeHandle,\r
1034 (EFI_STRING_ID) TerminalType[Index],\r
1035 CheckFlags,\r
1036 EFI_IFR_TYPE_NUM_SIZE_8,\r
1037 Index\r
1038 );\r
1039 }\r
1040\r
1041 HiiCreateOneOfOpCode (\r
1042 mStartOpCodeHandle,\r
1043 (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
1044 VARSTORE_ID_BOOT_MAINT,\r
1045 (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
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
1050 OptionsOpCodeHandle,\r
1051 NULL\r
1052 );\r
1053\r
1054 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1055 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1056 ASSERT (OptionsOpCodeHandle != NULL);\r
1057\r
1058 for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) {\r
1059 CheckFlags = 0;\r
1060 if (Index == 0) {\r
1061 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
1062 }\r
1063 HiiCreateOneOfOptionOpCode (\r
1064 OptionsOpCodeHandle,\r
1065 (EFI_STRING_ID) mFlowControlType[Index],\r
1066 CheckFlags,\r
1067 EFI_IFR_TYPE_NUM_SIZE_8,\r
1068 mFlowControlValue[Index]\r
1069 );\r
1070 }\r
1071\r
1072 HiiCreateOneOfOpCode (\r
1073 mStartOpCodeHandle,\r
1074 (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
1075 VARSTORE_ID_BOOT_MAINT,\r
1076 (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
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
1085 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
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
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
1146 LEGACY_DEV_ORDER_ENTRY *DevOrder;\r
1147 BM_MENU_OPTION *OptionMenu;\r
1148 BM_MENU_ENTRY *NewMenuEntry;\r
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
1165 VOID *OptionsOpCodeHandle;\r
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
1181 DisMap = ZeroMem (CallbackData->BmmOldFakeNVData.DisableMap, sizeof (CallbackData->BmmOldFakeNVData.DisableMap));\r
1182\r
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
1244 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1245 ASSERT (OptionsOpCodeHandle != NULL);\r
1246\r
1247 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1248 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
1249 //\r
1250 // Create OneOf for each legacy device\r
1251 //\r
1252 HiiCreateOneOfOptionOpCode (\r
1253 OptionsOpCodeHandle,\r
1254 NewMenuEntry->DisplayStringToken,\r
1255 0,\r
1256 EFI_IFR_TYPE_NUM_SIZE_8,\r
1257 (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->BbsIndex\r
1258 );\r
1259 }\r
1260\r
1261 //\r
1262 // Create OneOf for item "Disabled"\r
1263 //\r
1264 HiiCreateOneOfOptionOpCode (\r
1265 OptionsOpCodeHandle,\r
1266 STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE),\r
1267 0,\r
1268 EFI_IFR_TYPE_NUM_SIZE_8,\r
1269 0xFF\r
1270 );\r
1271\r
1272 //\r
1273 // Get Device Order from variable\r
1274 //\r
1275 VarData = BdsLibGetVariableAndSize (\r
1276 VAR_LEGACY_DEV_ORDER,\r
1277 &gEfiLegacyDevOrderVariableGuid,\r
1278 &VarSize\r
1279 );\r
1280\r
1281 if (NULL != VarData) {\r
1282 DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData;\r
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
1290 DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData;\r
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
1300 StrRef = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
1301\r
1302 UnicodeSPrint (String, sizeof (String), TypeStrHelp, Index);\r
1303 StrRefHelp = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
1304\r
1305 HiiCreateOneOfOpCode (\r
1306 mStartOpCodeHandle,\r
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
1314 OptionsOpCodeHandle,\r
1315 NULL\r
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
1333 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1334\r
1335 UpdatePageEnd (CallbackData);\r
1336}\r
1337\r
1338\r
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