2 Dynamically update the pages.
4 Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
12 Refresh the global UpdateData structure.
21 // Free current updated date
23 if (mStartOpCodeHandle
!= NULL
) {
24 HiiFreeOpCodeHandle (mStartOpCodeHandle
);
28 // Create new OpCode Handle
30 mStartOpCodeHandle
= HiiAllocateOpCodeHandle ();
33 // Create Hii Extend Label OpCode as the start opcode
35 mStartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (mStartOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
36 mStartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
41 Add a "Go back to main page" tag in front of the form when there are no
42 "Apply changes" and "Discard changes" tags in the end of the form.
44 @param CallbackData The BMM context data.
49 IN BMM_CALLBACK_DATA
*CallbackData
53 mStartLabel
->Number
= CallbackData
->BmmCurrentPageId
;
55 if (!(CallbackData
->BmmAskSaveOrNot
)) {
57 // Add a "Go back to main page" tag in front of the form when there are no
58 // "Apply changes" and "Discard changes" tags in the end of the form.
63 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
64 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
73 Create the "Apply changes" and "Discard changes" tags. And
74 ensure user can return to the main page.
76 @param CallbackData The BMM context data.
81 IN BMM_CALLBACK_DATA
*CallbackData
85 // Create the "Apply changes" and "Discard changes" tags.
87 if (CallbackData
->BmmAskSaveOrNot
) {
88 HiiCreateSubTitleOpCode (
90 STRING_TOKEN (STR_NULL_STRING
),
96 HiiCreateActionOpCode (
98 KEY_VALUE_SAVE_AND_EXIT
,
99 STRING_TOKEN (STR_SAVE_AND_EXIT
),
100 STRING_TOKEN (STR_NULL_STRING
),
101 EFI_IFR_FLAG_CALLBACK
,
107 // Ensure user can return to the main page.
109 HiiCreateActionOpCode (
111 KEY_VALUE_NO_SAVE_AND_EXIT
,
112 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
113 STRING_TOKEN (STR_NULL_STRING
),
114 EFI_IFR_FLAG_CALLBACK
,
119 CallbackData
->BmmHiiHandle
,
120 &gBootMaintFormSetGuid
,
121 CallbackData
->BmmCurrentPageId
,
122 mStartOpCodeHandle
, // Label CallbackData->BmmCurrentPageId
123 mEndOpCodeHandle
// LABEL_END
128 Clean up the dynamic opcode at label and form specified by both LabelId.
130 @param LabelId It is both the Form ID and Label ID for opcode deletion.
131 @param CallbackData The BMM context data.
137 IN BMM_CALLBACK_DATA
*CallbackData
140 RefreshUpdateData ();
143 // Remove all op-codes from dynamic page
145 mStartLabel
->Number
= LabelId
;
147 CallbackData
->BmmHiiHandle
,
148 &gBootMaintFormSetGuid
,
150 mStartOpCodeHandle
, // Label LabelId
151 mEndOpCodeHandle
// LABEL_END
156 Boot a file selected by user at File Expoloer of BMM.
158 @param FileContext The file context data, which contains the device path
159 of the file to be boot from.
161 @retval EFI_SUCCESS The function completed successfull.
162 @return Other value if the boot from the file fails.
167 IN BM_FILE_CONTEXT
*FileContext
173 BDS_COMMON_OPTION
*Option
;
175 Option
= (BDS_COMMON_OPTION
*) AllocatePool (sizeof (BDS_COMMON_OPTION
));
176 ASSERT (Option
!= NULL
);
177 Option
->Description
= (CHAR16
*) AllocateCopyPool (StrSize (FileContext
->FileName
), FileContext
->FileName
);
178 Option
->DevicePath
= FileContext
->DevicePath
;
179 Option
->LoadOptionsSize
= 0;
180 Option
->LoadOptions
= NULL
;
183 // Since current no boot from removable media directly is allowed */
185 gST
->ConOut
->ClearScreen (gST
->ConOut
);
189 Status
= BdsLibBootViaBootOption (Option
, Option
->DevicePath
, &ExitDataSize
, &ExitData
);
196 Create a list of Goto Opcode for all terminal devices logged
197 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.
199 @param CallbackData The BMM context data.
203 IN BMM_CALLBACK_DATA
*CallbackData
206 BM_MENU_ENTRY
*NewMenuEntry
;
209 CallbackData
->BmmAskSaveOrNot
= FALSE
;
211 UpdatePageStart (CallbackData
);
214 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
215 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
217 HiiCreateGotoOpCode (
219 FORM_CON_COM_SETUP_ID
,
220 NewMenuEntry
->DisplayStringToken
,
221 STRING_TOKEN (STR_NULL_STRING
),
222 EFI_IFR_FLAG_CALLBACK
,
223 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
)
227 UpdatePageEnd (CallbackData
);
231 Create a lit of boot option from global BootOptionMenu. It
232 allow user to delete the boot option.
234 @param CallbackData The BMM context data.
239 IN BMM_CALLBACK_DATA
*CallbackData
242 BM_MENU_ENTRY
*NewMenuEntry
;
243 BM_LOAD_CONTEXT
*NewLoadContext
;
246 CallbackData
->BmmAskSaveOrNot
= TRUE
;
248 UpdatePageStart (CallbackData
);
249 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
251 ASSERT (BootOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.BootOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.BootOptionDel
[0])));
252 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
253 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
254 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
255 if (NewLoadContext
->IsLegacy
) {
259 NewLoadContext
->Deleted
= FALSE
;
261 if (CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] && !CallbackData
->BmmFakeNvData
.BootOptionDelMark
[Index
]) {
263 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected
264 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has
265 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser
266 // through HiiSetBrowserData function.
268 CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] = FALSE
;
271 HiiCreateCheckBoxOpCode (
273 (EFI_QUESTION_ID
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
274 VARSTORE_ID_BOOT_MAINT
,
275 (UINT16
) (BOOT_OPTION_DEL_VAR_OFFSET
+ Index
),
276 NewMenuEntry
->DisplayStringToken
,
277 NewMenuEntry
->HelpStringToken
,
278 EFI_IFR_FLAG_CALLBACK
,
284 UpdatePageEnd (CallbackData
);
288 Create a lit of driver option from global DriverMenu.
290 @param CallbackData The BMM context data.
294 UpdateDrvAddHandlePage (
295 IN BMM_CALLBACK_DATA
*CallbackData
298 BM_MENU_ENTRY
*NewMenuEntry
;
301 CallbackData
->BmmAskSaveOrNot
= FALSE
;
303 UpdatePageStart (CallbackData
);
305 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
306 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
308 HiiCreateGotoOpCode (
310 FORM_DRV_ADD_HANDLE_DESC_ID
,
311 NewMenuEntry
->DisplayStringToken
,
312 STRING_TOKEN (STR_NULL_STRING
),
313 EFI_IFR_FLAG_CALLBACK
,
314 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
)
318 UpdatePageEnd (CallbackData
);
322 Create a lit of driver option from global DriverOptionMenu. It
323 allow user to delete the driver option.
325 @param CallbackData The BMM context data.
330 IN BMM_CALLBACK_DATA
*CallbackData
333 BM_MENU_ENTRY
*NewMenuEntry
;
334 BM_LOAD_CONTEXT
*NewLoadContext
;
337 CallbackData
->BmmAskSaveOrNot
= TRUE
;
339 UpdatePageStart (CallbackData
);
341 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &DriverOptionMenu
);
343 ASSERT (DriverOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
[0])));
344 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
345 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
347 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
348 NewLoadContext
->Deleted
= FALSE
;
350 if (CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] && !CallbackData
->BmmFakeNvData
.DriverOptionDelMark
[Index
]) {
352 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected
353 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has
354 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser
355 // through HiiSetBrowserData function.
357 CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] = FALSE
;
360 HiiCreateCheckBoxOpCode (
362 (EFI_QUESTION_ID
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
363 VARSTORE_ID_BOOT_MAINT
,
364 (UINT16
) (DRIVER_OPTION_DEL_VAR_OFFSET
+ Index
),
365 NewMenuEntry
->DisplayStringToken
,
366 NewMenuEntry
->HelpStringToken
,
367 EFI_IFR_FLAG_CALLBACK
,
373 UpdatePageEnd (CallbackData
);
377 Prepare the page to allow user to add description for
380 @param CallbackData The BMM context data.
384 UpdateDriverAddHandleDescPage (
385 IN BMM_CALLBACK_DATA
*CallbackData
388 BM_MENU_ENTRY
*NewMenuEntry
;
390 CallbackData
->BmmFakeNvData
.DriverAddActive
= 0x01;
391 CallbackData
->BmmFakeNvData
.DriverAddForceReconnect
= 0x00;
392 CallbackData
->BmmAskSaveOrNot
= TRUE
;
393 NewMenuEntry
= CallbackData
->MenuEntry
;
395 UpdatePageStart (CallbackData
);
397 HiiCreateSubTitleOpCode (
399 NewMenuEntry
->DisplayStringToken
,
405 HiiCreateStringOpCode (
407 (EFI_QUESTION_ID
) DRV_ADD_HANDLE_DESC_QUESTION_ID
,
408 VARSTORE_ID_BOOT_MAINT
,
409 DRV_ADD_HANDLE_DESC_VAR_OFFSET
,
410 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
411 STRING_TOKEN (STR_NULL_STRING
),
419 HiiCreateCheckBoxOpCode (
421 (EFI_QUESTION_ID
) DRV_ADD_RECON_QUESTION_ID
,
422 VARSTORE_ID_BOOT_MAINT
,
423 DRV_ADD_RECON_VAR_OFFSET
,
424 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
425 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
431 HiiCreateStringOpCode (
433 (EFI_QUESTION_ID
) DRIVER_ADD_OPTION_QUESTION_ID
,
434 VARSTORE_ID_BOOT_MAINT
,
435 DRIVER_ADD_OPTION_VAR_OFFSET
,
436 STRING_TOKEN (STR_OPTIONAL_DATA
),
437 STRING_TOKEN (STR_NULL_STRING
),
445 UpdatePageEnd (CallbackData
);
451 @param UpdatePageId The form ID to be updated.
452 @param ConsoleMenu The console menu list.
453 @param CallbackData The BMM context data.
458 IN UINT16 UpdatePageId
,
459 IN BM_MENU_OPTION
*ConsoleMenu
,
460 IN BMM_CALLBACK_DATA
*CallbackData
463 BM_MENU_ENTRY
*NewMenuEntry
;
467 EFI_QUESTION_ID QuestionIdBase
;
468 UINT16 VariableOffsetBase
;
470 UpdatePageStart (CallbackData
);
474 VariableOffsetBase
= 0;
476 switch (UpdatePageId
) {
478 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleInCheck
[0];
479 QuestionIdBase
= CON_IN_DEVICE_QUESTION_ID
;
480 VariableOffsetBase
= CON_IN_DEVICE_VAR_OFFSET
;
483 case FORM_CON_OUT_ID
:
484 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleOutCheck
[0];
485 QuestionIdBase
= CON_OUT_DEVICE_QUESTION_ID
;
486 VariableOffsetBase
= CON_OUT_DEVICE_VAR_OFFSET
;
489 case FORM_CON_ERR_ID
:
490 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleErrCheck
[0];
491 QuestionIdBase
= CON_ERR_DEVICE_QUESTION_ID
;
492 VariableOffsetBase
= CON_ERR_DEVICE_VAR_OFFSET
;
495 ASSERT (ConsoleCheck
!= NULL
);
497 for (Index
= 0; ((Index
< ConsoleMenu
->MenuNumber
) && \
498 (Index
< MAX_MENU_NUMBER
)) ; Index
++) {
500 if (UpdatePageId
!= FORM_CON_ERR_ID
) {
501 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
503 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
504 HiiCreateCheckBoxOpCode (
506 (EFI_QUESTION_ID
) (QuestionIdBase
+ Index
),
507 VARSTORE_ID_BOOT_MAINT
,
508 (UINT16
) (VariableOffsetBase
+ Index
),
509 NewMenuEntry
->DisplayStringToken
,
510 NewMenuEntry
->HelpStringToken
,
517 UpdatePageEnd (CallbackData
);
521 Update the page's NV Map if user has changed the order
522 a list. This list can be Boot Order or Driver Order.
524 @param UpdatePageId The form ID to be updated.
525 @param OptionMenu The new list.
526 @param CallbackData The BMM context data.
531 IN UINT16 UpdatePageId
,
532 IN BM_MENU_OPTION
*OptionMenu
,
533 IN BMM_CALLBACK_DATA
*CallbackData
536 BM_MENU_ENTRY
*NewMenuEntry
;
539 VOID
*OptionsOpCodeHandle
;
540 BOOLEAN BootOptionFound
;
542 EFI_QUESTION_ID QuestionId
;
546 UpdatePageStart (CallbackData
);
548 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
553 switch (UpdatePageId
) {
555 case FORM_BOOT_CHG_ID
:
557 // If the BootOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,
558 // means all Boot Options has been save in BootOptionMenu, we can get the date from the menu.
559 // else means browser maintains some uncommitted date which are not saved in BootOptionMenu,
560 // so we should not get the data from BootOptionMenu to show it.
562 if (CompareMem (CallbackData
->BmmFakeNvData
.BootOptionOrder
, CallbackData
->BmmOldFakeNVData
.BootOptionOrder
, sizeof (CallbackData
->BmmFakeNvData
.BootOptionOrder
)) == 0) {
563 GetBootOrder (CallbackData
);
565 OptionOrder
= CallbackData
->BmmFakeNvData
.BootOptionOrder
;
566 QuestionId
= BOOT_OPTION_ORDER_QUESTION_ID
;
567 VarOffset
= BOOT_OPTION_ORDER_VAR_OFFSET
;
570 case FORM_DRV_CHG_ID
:
572 // If the DriverOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,
573 // means all Driver Options has been save in DriverOptionMenu, we can get the DriverOptionOrder from the menu.
574 // else means browser maintains some uncommitted date which are not saved in DriverOptionMenu,
575 // so we should not get the data from DriverOptionMenu to show it.
577 if (CompareMem (CallbackData
->BmmFakeNvData
.DriverOptionOrder
, CallbackData
->BmmOldFakeNVData
.DriverOptionOrder
, sizeof (CallbackData
->BmmFakeNvData
.DriverOptionOrder
)) == 0) {
578 GetDriverOrder (CallbackData
);
580 OptionOrder
= CallbackData
->BmmFakeNvData
.DriverOptionOrder
;
581 QuestionId
= DRIVER_OPTION_ORDER_QUESTION_ID
;
582 VarOffset
= DRIVER_OPTION_ORDER_VAR_OFFSET
;
585 ASSERT (OptionOrder
!= NULL
);
587 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
588 ASSERT (OptionsOpCodeHandle
!= NULL
);
591 for (OptionIndex
= 0; (OptionIndex
< MAX_MENU_NUMBER
&& OptionOrder
[OptionIndex
] != 0); OptionIndex
++) {
592 BootOptionFound
= FALSE
;
593 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
594 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
595 if ((UINT32
) (NewMenuEntry
->OptionNumber
+ 1) == OptionOrder
[OptionIndex
]) {
596 BootOptionFound
= TRUE
;
600 if (BootOptionFound
) {
601 HiiCreateOneOfOptionOpCode (
603 NewMenuEntry
->DisplayStringToken
,
605 EFI_IFR_TYPE_NUM_SIZE_32
,
606 OptionOrder
[OptionIndex
]
611 if (OptionMenu
->MenuNumber
> 0) {
612 HiiCreateOrderedListOpCode (
613 mStartOpCodeHandle
, // Container for dynamic created opcodes
614 QuestionId
, // Question ID
615 VARSTORE_ID_BOOT_MAINT
, // VarStore ID
616 VarOffset
, // Offset in Buffer Storage
617 STRING_TOKEN (STR_CHANGE_ORDER
), // Question prompt text
618 STRING_TOKEN (STR_CHANGE_ORDER
), // Question help text
620 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET
621 EFI_IFR_TYPE_NUM_SIZE_32
, // Data type of Question value
622 100, // Maximum container
623 OptionsOpCodeHandle
, // Option Opcode list
624 NULL
// Default Opcode is NULL
628 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
630 UpdatePageEnd (CallbackData
);
634 Create the dynamic page to allow user to set
635 the "BootNext" value.
637 @param CallbackData The BMM context data.
642 IN BMM_CALLBACK_DATA
*CallbackData
645 BM_MENU_ENTRY
*NewMenuEntry
;
646 BM_LOAD_CONTEXT
*NewLoadContext
;
647 UINTN NumberOfOptions
;
649 VOID
*OptionsOpCodeHandle
;
651 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
652 CallbackData
->BmmAskSaveOrNot
= TRUE
;
654 UpdatePageStart (CallbackData
);
655 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, &BootOptionMenu
);
657 if (NumberOfOptions
> 0) {
658 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
659 ASSERT (OptionsOpCodeHandle
!= NULL
);
661 //CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);
663 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
664 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
665 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
667 if (NewLoadContext
->IsBootNext
) {
668 HiiCreateOneOfOptionOpCode (
670 NewMenuEntry
->DisplayStringToken
,
671 EFI_IFR_OPTION_DEFAULT
,
672 EFI_IFR_TYPE_NUM_SIZE_16
,
675 //CallbackData->BmmFakeNvData.BootNext = Index;
677 HiiCreateOneOfOptionOpCode (
679 NewMenuEntry
->DisplayStringToken
,
681 EFI_IFR_TYPE_NUM_SIZE_16
,
687 if (CallbackData
->BmmFakeNvData
.BootNext
== Index
) {
688 HiiCreateOneOfOptionOpCode (
690 STRING_TOKEN (STR_NONE
),
691 EFI_IFR_OPTION_DEFAULT
,
692 EFI_IFR_TYPE_NUM_SIZE_16
,
696 HiiCreateOneOfOptionOpCode (
698 STRING_TOKEN (STR_NONE
),
700 EFI_IFR_TYPE_NUM_SIZE_16
,
705 HiiCreateOneOfOpCode (
707 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
708 VARSTORE_ID_BOOT_MAINT
,
709 BOOT_NEXT_VAR_OFFSET
,
710 STRING_TOKEN (STR_BOOT_NEXT
),
711 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
713 EFI_IFR_NUMERIC_SIZE_2
,
718 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
721 UpdatePageEnd (CallbackData
);
725 Create the dynamic page to allow user to set the "TimeOut" value.
727 @param CallbackData The BMM context data.
732 IN BMM_CALLBACK_DATA
*CallbackData
736 VOID
*DefaultOpCodeHandle
;
738 CallbackData
->BmmAskSaveOrNot
= TRUE
;
740 UpdatePageStart (CallbackData
);
742 BootTimeOut
= PcdGet16 (PcdPlatformBootTimeOut
);
744 DefaultOpCodeHandle
= HiiAllocateOpCodeHandle ();
745 ASSERT (DefaultOpCodeHandle
!= NULL
);
746 HiiCreateDefaultOpCode (DefaultOpCodeHandle
, EFI_HII_DEFAULT_CLASS_STANDARD
, EFI_IFR_TYPE_NUM_SIZE_16
, BootTimeOut
);
748 HiiCreateNumericOpCode (
750 (EFI_QUESTION_ID
) BOOT_TIME_OUT_QUESTION_ID
,
751 VARSTORE_ID_BOOT_MAINT
,
752 BOOT_TIME_OUT_VAR_OFFSET
,
753 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
754 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
756 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
763 HiiFreeOpCodeHandle (DefaultOpCodeHandle
);
765 //CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;
767 UpdatePageEnd (CallbackData
);
771 Refresh the text mode page.
773 @param CallbackData The BMM context data.
778 IN BMM_CALLBACK_DATA
*CallbackData
785 CHAR16 ModeString
[50];
789 EFI_STRING_ID
*ModeToken
;
791 VOID
*OptionsOpCodeHandle
;
792 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
794 ConOut
= gST
->ConOut
;
797 MaxMode
= (UINTN
) (ConOut
->Mode
->MaxMode
);
799 CallbackData
->BmmAskSaveOrNot
= TRUE
;
801 UpdatePageStart (CallbackData
);
806 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
807 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
808 if (EFI_ERROR (Status
)) {
814 if (ValidMode
== 0) {
818 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
819 ASSERT (OptionsOpCodeHandle
!= NULL
);
821 ModeToken
= AllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
822 ASSERT(ModeToken
!= NULL
);
825 // Determin which mode should be the first entry in menu
827 // GetConsoleOutMode (CallbackData);
830 // Build text mode options
832 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
833 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
834 if (EFI_ERROR (Status
)) {
839 // Build mode string Column x Row
841 UnicodeValueToStringS (ModeString
, sizeof (ModeString
), 0, Col
, 0);
842 PStr
= &ModeString
[0];
843 StrCatS (PStr
, ARRAY_SIZE (ModeString
), L
" x ");
844 PStr
= PStr
+ StrLen (PStr
);
845 UnicodeValueToStringS (
847 sizeof (ModeString
) - ((UINTN
)PStr
- (UINTN
)&ModeString
[0]),
853 ModeToken
[Index
] = HiiSetString (CallbackData
->BmmHiiHandle
, 0, ModeString
, NULL
);
855 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
856 HiiCreateOneOfOptionOpCode (
859 EFI_IFR_OPTION_DEFAULT
,
860 EFI_IFR_TYPE_NUM_SIZE_16
,
864 HiiCreateOneOfOptionOpCode (
868 EFI_IFR_TYPE_NUM_SIZE_16
,
875 HiiCreateOneOfOpCode (
877 (EFI_QUESTION_ID
) CON_MODE_QUESTION_ID
,
878 VARSTORE_ID_BOOT_MAINT
,
880 STRING_TOKEN (STR_CON_MODE_SETUP
),
881 STRING_TOKEN (STR_CON_MODE_SETUP
),
882 EFI_IFR_FLAG_RESET_REQUIRED
,
883 EFI_IFR_NUMERIC_SIZE_2
,
888 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
889 FreePool (ModeToken
);
891 UpdatePageEnd (CallbackData
);
895 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,
896 Parity, Stop Bits, Terminal Type.
898 @param CallbackData The BMM context data.
903 IN BMM_CALLBACK_DATA
*CallbackData
908 BM_MENU_ENTRY
*NewMenuEntry
;
909 VOID
*OptionsOpCodeHandle
;
910 UINTN CurrentTerminal
;
912 UpdatePageStart (CallbackData
);
914 CurrentTerminal
= CallbackData
->CurrentTerminal
;
915 NewMenuEntry
= BOpt_GetMenuEntry (
920 if (NewMenuEntry
== NULL
) {
924 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
925 ASSERT (OptionsOpCodeHandle
!= NULL
);
927 for (Index
= 0; Index
< sizeof (BaudRateList
) / sizeof (BaudRateList
[0]); Index
++) {
929 if (BaudRateList
[Index
].Value
== 115200) {
930 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
932 HiiCreateOneOfOptionOpCode (
934 BaudRateList
[Index
].StringToken
,
936 EFI_IFR_TYPE_NUM_SIZE_8
,
941 HiiCreateOneOfOpCode (
943 (EFI_QUESTION_ID
) (COM_BAUD_RATE_QUESTION_ID
+ CurrentTerminal
),
944 VARSTORE_ID_BOOT_MAINT
,
945 (UINT16
) (COM_BAUD_RATE_VAR_OFFSET
+ CurrentTerminal
),
946 STRING_TOKEN (STR_COM_BAUD_RATE
),
947 STRING_TOKEN (STR_COM_BAUD_RATE
),
949 EFI_IFR_NUMERIC_SIZE_1
,
954 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
955 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
956 ASSERT (OptionsOpCodeHandle
!= NULL
);
958 for (Index
= 0; Index
< ARRAY_SIZE (DataBitsList
); Index
++) {
961 if (DataBitsList
[Index
].Value
== 8) {
962 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
965 HiiCreateOneOfOptionOpCode (
967 DataBitsList
[Index
].StringToken
,
969 EFI_IFR_TYPE_NUM_SIZE_8
,
974 HiiCreateOneOfOpCode (
976 (EFI_QUESTION_ID
) (COM_DATA_RATE_QUESTION_ID
+ CurrentTerminal
),
977 VARSTORE_ID_BOOT_MAINT
,
978 (UINT16
) (COM_DATA_RATE_VAR_OFFSET
+ CurrentTerminal
),
979 STRING_TOKEN (STR_COM_DATA_BITS
),
980 STRING_TOKEN (STR_COM_DATA_BITS
),
982 EFI_IFR_NUMERIC_SIZE_1
,
987 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
988 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
989 ASSERT (OptionsOpCodeHandle
!= NULL
);
991 for (Index
= 0; Index
< ARRAY_SIZE (ParityList
); Index
++) {
993 if (ParityList
[Index
].Value
== NoParity
) {
994 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
997 HiiCreateOneOfOptionOpCode (
999 ParityList
[Index
].StringToken
,
1001 EFI_IFR_TYPE_NUM_SIZE_8
,
1006 HiiCreateOneOfOpCode (
1008 (EFI_QUESTION_ID
) (COM_PARITY_QUESTION_ID
+ CurrentTerminal
),
1009 VARSTORE_ID_BOOT_MAINT
,
1010 (UINT16
) (COM_PARITY_VAR_OFFSET
+ CurrentTerminal
),
1011 STRING_TOKEN (STR_COM_PARITY
),
1012 STRING_TOKEN (STR_COM_PARITY
),
1014 EFI_IFR_NUMERIC_SIZE_1
,
1015 OptionsOpCodeHandle
,
1019 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1020 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1021 ASSERT (OptionsOpCodeHandle
!= NULL
);
1023 for (Index
= 0; Index
< ARRAY_SIZE (StopBitsList
); Index
++) {
1025 if (StopBitsList
[Index
].Value
== OneStopBit
) {
1026 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1029 HiiCreateOneOfOptionOpCode (
1030 OptionsOpCodeHandle
,
1031 StopBitsList
[Index
].StringToken
,
1033 EFI_IFR_TYPE_NUM_SIZE_8
,
1038 HiiCreateOneOfOpCode (
1040 (EFI_QUESTION_ID
) (COM_STOP_BITS_QUESTION_ID
+ CurrentTerminal
),
1041 VARSTORE_ID_BOOT_MAINT
,
1042 (UINT16
) (COM_STOP_BITS_VAR_OFFSET
+ CurrentTerminal
),
1043 STRING_TOKEN (STR_COM_STOP_BITS
),
1044 STRING_TOKEN (STR_COM_STOP_BITS
),
1046 EFI_IFR_NUMERIC_SIZE_1
,
1047 OptionsOpCodeHandle
,
1051 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1052 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1053 ASSERT (OptionsOpCodeHandle
!= NULL
);
1055 for (Index
= 0; Index
< 4; Index
++) {
1058 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1061 HiiCreateOneOfOptionOpCode (
1062 OptionsOpCodeHandle
,
1063 (EFI_STRING_ID
) TerminalType
[Index
],
1065 EFI_IFR_TYPE_NUM_SIZE_8
,
1070 HiiCreateOneOfOpCode (
1072 (EFI_QUESTION_ID
) (COM_TERMINAL_QUESTION_ID
+ CurrentTerminal
),
1073 VARSTORE_ID_BOOT_MAINT
,
1074 (UINT16
) (COM_TERMINAL_VAR_OFFSET
+ CurrentTerminal
),
1075 STRING_TOKEN (STR_COM_TERMI_TYPE
),
1076 STRING_TOKEN (STR_COM_TERMI_TYPE
),
1078 EFI_IFR_NUMERIC_SIZE_1
,
1079 OptionsOpCodeHandle
,
1083 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1084 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1085 ASSERT (OptionsOpCodeHandle
!= NULL
);
1087 for (Index
= 0; Index
< ARRAY_SIZE (mFlowControlType
); Index
++) {
1090 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1092 HiiCreateOneOfOptionOpCode (
1093 OptionsOpCodeHandle
,
1094 (EFI_STRING_ID
) mFlowControlType
[Index
],
1096 EFI_IFR_TYPE_NUM_SIZE_8
,
1097 mFlowControlValue
[Index
]
1101 HiiCreateOneOfOpCode (
1103 (EFI_QUESTION_ID
) (COM_FLOWCONTROL_QUESTION_ID
+ CurrentTerminal
),
1104 VARSTORE_ID_BOOT_MAINT
,
1105 (UINT16
) (COM_FLOWCONTROL_VAR_OFFSET
+ CurrentTerminal
),
1106 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
1107 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
1109 EFI_IFR_NUMERIC_SIZE_1
,
1110 OptionsOpCodeHandle
,
1114 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1116 UpdatePageEnd (CallbackData
);
1120 Dispatch the correct update page function to call based on
1123 @param UpdatePageId The form ID.
1124 @param CallbackData The BMM context data.
1129 IN UINT16 UpdatePageId
,
1130 IN BMM_CALLBACK_DATA
*CallbackData
1133 CleanUpPage (UpdatePageId
, CallbackData
);
1134 switch (UpdatePageId
) {
1135 case FORM_CON_IN_ID
:
1136 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
1139 case FORM_CON_OUT_ID
:
1140 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
1143 case FORM_CON_ERR_ID
:
1144 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
1147 case FORM_BOOT_CHG_ID
:
1148 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
1151 case FORM_DRV_CHG_ID
:
1152 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
1161 Create a dynamic page so that Legacy Device boot order
1162 can be set for specified device type.
1164 @param UpdatePageId The form ID. It also spefies the legacy device type.
1165 @param CallbackData The BMM context data.
1170 UpdateSetLegacyDeviceOrderPage (
1171 IN UINT16 UpdatePageId
,
1172 IN BMM_CALLBACK_DATA
*CallbackData
1175 LEGACY_DEV_ORDER_ENTRY
*DevOrder
;
1176 BM_MENU_OPTION
*OptionMenu
;
1177 BM_MENU_ENTRY
*NewMenuEntry
;
1178 EFI_STRING_ID StrRef
;
1179 EFI_STRING_ID StrRefHelp
;
1188 CHAR16
*TypeStrHelp
;
1194 VOID
*OptionsOpCodeHandle
;
1202 BbsType
= BBS_FLOPPY
;
1207 CallbackData
->BmmAskSaveOrNot
= TRUE
;
1208 UpdatePageStart (CallbackData
);
1210 DisMap
= ZeroMem (CallbackData
->BmmOldFakeNVData
.DisableMap
, sizeof (CallbackData
->BmmOldFakeNVData
.DisableMap
));
1213 // Create oneof option list
1215 switch (UpdatePageId
) {
1216 case FORM_SET_FD_ORDER_ID
:
1217 OptionMenu
= (BM_MENU_OPTION
*) &LegacyFDMenu
;
1218 Key
= (UINT16
) LEGACY_FD_QUESTION_ID
;
1219 TypeStr
= STR_FLOPPY
;
1220 TypeStrHelp
= STR_FLOPPY_HELP
;
1221 BbsType
= BBS_FLOPPY
;
1222 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyFD
;
1223 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyFD
;
1226 case FORM_SET_HD_ORDER_ID
:
1227 OptionMenu
= (BM_MENU_OPTION
*) &LegacyHDMenu
;
1228 Key
= (UINT16
) LEGACY_HD_QUESTION_ID
;
1229 TypeStr
= STR_HARDDISK
;
1230 TypeStrHelp
= STR_HARDDISK_HELP
;
1231 BbsType
= BBS_HARDDISK
;
1232 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyHD
;
1233 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyHD
;
1236 case FORM_SET_CD_ORDER_ID
:
1237 OptionMenu
= (BM_MENU_OPTION
*) &LegacyCDMenu
;
1238 Key
= (UINT16
) LEGACY_CD_QUESTION_ID
;
1239 TypeStr
= STR_CDROM
;
1240 TypeStrHelp
= STR_CDROM_HELP
;
1241 BbsType
= BBS_CDROM
;
1242 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyCD
;
1243 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyCD
;
1246 case FORM_SET_NET_ORDER_ID
:
1247 OptionMenu
= (BM_MENU_OPTION
*) &LegacyNETMenu
;
1248 Key
= (UINT16
) LEGACY_NET_QUESTION_ID
;
1250 TypeStrHelp
= STR_NET_HELP
;
1251 BbsType
= BBS_EMBED_NETWORK
;
1252 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyNET
;
1253 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyNET
;
1256 case FORM_SET_BEV_ORDER_ID
:
1257 OptionMenu
= (BM_MENU_OPTION
*) &LegacyBEVMenu
;
1258 Key
= (UINT16
) LEGACY_BEV_QUESTION_ID
;
1260 TypeStrHelp
= STR_BEV_HELP
;
1261 BbsType
= BBS_BEV_DEVICE
;
1262 LegacyOrder
= CallbackData
->BmmFakeNvData
.LegacyBEV
;
1263 OldData
= CallbackData
->BmmOldFakeNVData
.LegacyBEV
;
1267 DEBUG ((EFI_D_ERROR
, "Invalid command ID for updating page!\n"));
1271 CreateMenuStringToken (CallbackData
, CallbackData
->BmmHiiHandle
, OptionMenu
);
1273 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1274 ASSERT (OptionsOpCodeHandle
!= NULL
);
1276 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1277 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
1279 // Create OneOf for each legacy device
1281 HiiCreateOneOfOptionOpCode (
1282 OptionsOpCodeHandle
,
1283 NewMenuEntry
->DisplayStringToken
,
1285 EFI_IFR_TYPE_NUM_SIZE_8
,
1286 (UINT8
) ((BM_LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
)->BbsIndex
1291 // Create OneOf for item "Disabled"
1293 HiiCreateOneOfOptionOpCode (
1294 OptionsOpCodeHandle
,
1295 STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE
),
1297 EFI_IFR_TYPE_NUM_SIZE_8
,
1302 // Get Device Order from variable
1304 VarData
= BdsLibGetVariableAndSize (
1305 VAR_LEGACY_DEV_ORDER
,
1306 &gEfiLegacyDevOrderVariableGuid
,
1310 if (NULL
!= VarData
) {
1311 DevOrder
= (LEGACY_DEV_ORDER_ENTRY
*) VarData
;
1312 while (VarData
< VarData
+ VarSize
) {
1313 if (DevOrder
->BbsType
== BbsType
) {
1317 VarData
= (UINT8
*)((UINTN
)VarData
+ sizeof (BBS_TYPE
));
1318 VarData
+= *(UINT16
*) VarData
;
1319 DevOrder
= (LEGACY_DEV_ORDER_ENTRY
*) VarData
;
1322 // Create oneof tag here for FD/HD/CD #1 #2
1324 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1326 // Create the string for oneof tag
1328 UnicodeSPrint (String
, sizeof (String
), TypeStr
, Index
);
1329 StrRef
= HiiSetString (CallbackData
->BmmHiiHandle
, 0, String
, NULL
);
1331 UnicodeSPrint (String
, sizeof (String
), TypeStrHelp
, Index
);
1332 StrRefHelp
= HiiSetString (CallbackData
->BmmHiiHandle
, 0, String
, NULL
);
1334 HiiCreateOneOfOpCode (
1336 (EFI_QUESTION_ID
) (Key
+ Index
),
1337 VARSTORE_ID_BOOT_MAINT
,
1338 (UINT16
) (Key
+ Index
- CONFIG_OPTION_OFFSET
),
1341 EFI_IFR_FLAG_CALLBACK
,
1342 EFI_IFR_NUMERIC_SIZE_1
,
1343 OptionsOpCodeHandle
,
1347 VarDevOrder
= *(UINT16
*) ((UINTN
) DevOrder
+ sizeof (BBS_TYPE
) + sizeof (UINT16
) + Index
* sizeof (UINT16
));
1349 if (0xFF00 == (VarDevOrder
& 0xFF00)) {
1350 LegacyOrder
[Index
] = 0xFF;
1351 Pos
= (VarDevOrder
& 0xFF) / 8;
1352 Bit
= 7 - ((VarDevOrder
& 0xFF) % 8);
1353 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] | (UINT8
) (1 << Bit
));
1355 LegacyOrder
[Index
] = (UINT8
) (VarDevOrder
& 0xFF);
1360 CopyMem (OldData
, LegacyOrder
, 100);
1362 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1364 UpdatePageEnd (CallbackData
);
1369 Dispatch the display to the next page based on NewPageId.
1371 @param Private The BMM context data.
1372 @param NewPageId The original page ID.
1377 BMM_CALLBACK_DATA
*Private
,
1382 // For the question don't impact the page update, just ignore it.
1384 if (((NewPageId
>= BOOT_OPTION_DEL_QUESTION_ID
) && (NewPageId
< BOOT_OPTION_DEL_QUESTION_ID
+ MAX_MENU_NUMBER
)) ||
1385 ((NewPageId
>= DRIVER_OPTION_DEL_QUESTION_ID
) && (NewPageId
< DRIVER_OPTION_DEL_QUESTION_ID
+ MAX_MENU_NUMBER
))) {
1389 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1391 // If we select a handle to add driver option, advance to the add handle description page.
1393 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1394 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1396 // Return to main page after "Save Changes" or "Discard Changes".
1398 NewPageId
= FORM_MAIN_ID
;
1399 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1400 NewPageId
= FORM_CON_COM_SETUP_ID
;
1403 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1404 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1405 Private
->BmmCurrentPageId
= NewPageId
;