2 Dynamically update the pages.
4 Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
9 #include "BootMaintenanceManager.h"
12 Create the global UpdateData structure.
21 // Init OpCode Handle and Allocate space for creation of Buffer
23 mStartOpCodeHandle
= HiiAllocateOpCodeHandle ();
24 ASSERT (mStartOpCodeHandle
!= NULL
);
26 mEndOpCodeHandle
= HiiAllocateOpCodeHandle ();
27 ASSERT (mEndOpCodeHandle
!= NULL
);
30 // Create Hii Extend Label OpCode as the start opcode
32 mStartLabel
= (EFI_IFR_GUID_LABEL
*)HiiCreateGuidOpCode (mStartOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
33 mStartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
36 // Create Hii Extend Label OpCode as the end opcode
38 mEndLabel
= (EFI_IFR_GUID_LABEL
*)HiiCreateGuidOpCode (mEndOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
39 mEndLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
40 mEndLabel
->Number
= LABEL_END
;
44 Refresh the global UpdateData structure.
53 // Free current updated date
55 if (mStartOpCodeHandle
!= NULL
) {
56 HiiFreeOpCodeHandle (mStartOpCodeHandle
);
60 // Create new OpCode Handle
62 mStartOpCodeHandle
= HiiAllocateOpCodeHandle ();
65 // Create Hii Extend Label OpCode as the start opcode
67 mStartLabel
= (EFI_IFR_GUID_LABEL
*)HiiCreateGuidOpCode (mStartOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
68 mStartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
72 Add a "Go back to main page" tag in front of the form when there are no
73 "Apply changes" and "Discard changes" tags in the end of the form.
75 @param CallbackData The BMM context data.
80 IN BMM_CALLBACK_DATA
*CallbackData
84 mStartLabel
->Number
= CallbackData
->BmmCurrentPageId
;
86 if (!(CallbackData
->BmmAskSaveOrNot
)) {
88 // Add a "Go back to main page" tag in front of the form when there are no
89 // "Apply changes" and "Discard changes" tags in the end of the form.
94 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
95 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
103 Create the "Apply changes" and "Discard changes" tags. And
104 ensure user can return to the main page.
106 @param CallbackData The BMM context data.
111 IN BMM_CALLBACK_DATA
*CallbackData
115 // Create the "Apply changes" and "Discard changes" tags.
117 if (CallbackData
->BmmAskSaveOrNot
) {
118 HiiCreateSubTitleOpCode (
120 STRING_TOKEN (STR_NULL_STRING
),
126 HiiCreateActionOpCode (
128 KEY_VALUE_SAVE_AND_EXIT
,
129 STRING_TOKEN (STR_SAVE_AND_EXIT
),
130 STRING_TOKEN (STR_NULL_STRING
),
131 EFI_IFR_FLAG_CALLBACK
,
137 // Ensure user can return to the main page.
139 HiiCreateActionOpCode (
141 KEY_VALUE_NO_SAVE_AND_EXIT
,
142 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
143 STRING_TOKEN (STR_NULL_STRING
),
144 EFI_IFR_FLAG_CALLBACK
,
149 CallbackData
->BmmHiiHandle
,
151 CallbackData
->BmmCurrentPageId
,
152 mStartOpCodeHandle
, // Label CallbackData->BmmCurrentPageId
153 mEndOpCodeHandle
// LABEL_END
158 Clean up the dynamic opcode at label and form specified by both LabelId.
160 @param LabelId It is both the Form ID and Label ID for opcode deletion.
161 @param CallbackData The BMM context data.
167 IN BMM_CALLBACK_DATA
*CallbackData
170 RefreshUpdateData ();
173 // Remove all op-codes from dynamic page
175 mStartLabel
->Number
= LabelId
;
177 CallbackData
->BmmHiiHandle
,
180 mStartOpCodeHandle
, // Label LabelId
181 mEndOpCodeHandle
// LABEL_END
186 Create a list of Goto Opcode for all terminal devices logged
187 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.
189 @param CallbackData The BMM context data.
193 IN BMM_CALLBACK_DATA
*CallbackData
196 BM_MENU_ENTRY
*NewMenuEntry
;
199 CallbackData
->BmmAskSaveOrNot
= TRUE
;
201 UpdatePageStart (CallbackData
);
203 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
204 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
206 HiiCreateGotoOpCode (
208 FORM_CON_COM_SETUP_ID
,
209 NewMenuEntry
->DisplayStringToken
,
210 STRING_TOKEN (STR_NULL_STRING
),
211 EFI_IFR_FLAG_CALLBACK
,
212 (UINT16
)(TERMINAL_OPTION_OFFSET
+ Index
)
216 UpdatePageEnd (CallbackData
);
220 Create a list of boot option from global BootOptionMenu. It
221 allow user to delete the boot option.
223 @param CallbackData The BMM context data.
228 IN BMM_CALLBACK_DATA
*CallbackData
231 BM_MENU_ENTRY
*NewMenuEntry
;
232 BM_LOAD_CONTEXT
*NewLoadContext
;
235 CallbackData
->BmmAskSaveOrNot
= TRUE
;
237 UpdatePageStart (CallbackData
);
239 ASSERT (BootOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.BootOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.BootOptionDel
[0])));
240 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
241 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
242 NewLoadContext
= (BM_LOAD_CONTEXT
*)NewMenuEntry
->VariableContext
;
243 if (NewLoadContext
->IsLegacy
) {
247 NewLoadContext
->Deleted
= FALSE
;
249 if (CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] && !CallbackData
->BmmFakeNvData
.BootOptionDelMark
[Index
]) {
251 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected
252 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has
253 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser
254 // through HiiSetBrowserData function.
256 CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] = FALSE
;
257 CallbackData
->BmmOldFakeNVData
.BootOptionDel
[Index
] = FALSE
;
260 HiiCreateCheckBoxOpCode (
262 (EFI_QUESTION_ID
)(BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
263 VARSTORE_ID_BOOT_MAINT
,
264 (UINT16
)(BOOT_OPTION_DEL_VAR_OFFSET
+ Index
),
265 NewMenuEntry
->DisplayStringToken
,
266 NewMenuEntry
->HelpStringToken
,
267 EFI_IFR_FLAG_CALLBACK
,
273 UpdatePageEnd (CallbackData
);
277 Create a lit of driver option from global DriverMenu.
279 @param CallbackData The BMM context data.
283 UpdateDrvAddHandlePage (
284 IN BMM_CALLBACK_DATA
*CallbackData
287 BM_MENU_ENTRY
*NewMenuEntry
;
290 CallbackData
->BmmAskSaveOrNot
= FALSE
;
292 UpdatePageStart (CallbackData
);
294 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
295 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
297 HiiCreateGotoOpCode (
299 FORM_DRV_ADD_HANDLE_DESC_ID
,
300 NewMenuEntry
->DisplayStringToken
,
301 STRING_TOKEN (STR_NULL_STRING
),
302 EFI_IFR_FLAG_CALLBACK
,
303 (UINT16
)(HANDLE_OPTION_OFFSET
+ Index
)
307 UpdatePageEnd (CallbackData
);
311 Create a lit of driver option from global DriverOptionMenu. It
312 allow user to delete the driver option.
314 @param CallbackData The BMM context data.
319 IN BMM_CALLBACK_DATA
*CallbackData
322 BM_MENU_ENTRY
*NewMenuEntry
;
323 BM_LOAD_CONTEXT
*NewLoadContext
;
326 CallbackData
->BmmAskSaveOrNot
= TRUE
;
328 UpdatePageStart (CallbackData
);
330 ASSERT (DriverOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
[0])));
331 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
332 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
334 NewLoadContext
= (BM_LOAD_CONTEXT
*)NewMenuEntry
->VariableContext
;
335 NewLoadContext
->Deleted
= FALSE
;
337 if (CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] && !CallbackData
->BmmFakeNvData
.DriverOptionDelMark
[Index
]) {
339 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected
340 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has
341 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser
342 // through HiiSetBrowserData function.
344 CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] = FALSE
;
345 CallbackData
->BmmOldFakeNVData
.DriverOptionDel
[Index
] = FALSE
;
348 HiiCreateCheckBoxOpCode (
350 (EFI_QUESTION_ID
)(DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
351 VARSTORE_ID_BOOT_MAINT
,
352 (UINT16
)(DRIVER_OPTION_DEL_VAR_OFFSET
+ Index
),
353 NewMenuEntry
->DisplayStringToken
,
354 NewMenuEntry
->HelpStringToken
,
355 EFI_IFR_FLAG_CALLBACK
,
361 UpdatePageEnd (CallbackData
);
365 Prepare the page to allow user to add description for
368 @param CallbackData The BMM context data.
372 UpdateDriverAddHandleDescPage (
373 IN BMM_CALLBACK_DATA
*CallbackData
376 BM_MENU_ENTRY
*NewMenuEntry
;
378 CallbackData
->BmmFakeNvData
.DriverAddActive
= 0x01;
379 CallbackData
->BmmFakeNvData
.DriverAddForceReconnect
= 0x00;
380 CallbackData
->BmmAskSaveOrNot
= TRUE
;
381 NewMenuEntry
= CallbackData
->MenuEntry
;
383 UpdatePageStart (CallbackData
);
385 HiiCreateSubTitleOpCode (
387 NewMenuEntry
->DisplayStringToken
,
393 HiiCreateStringOpCode (
395 (EFI_QUESTION_ID
)DRV_ADD_HANDLE_DESC_QUESTION_ID
,
396 VARSTORE_ID_BOOT_MAINT
,
397 DRV_ADD_HANDLE_DESC_VAR_OFFSET
,
398 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
399 STRING_TOKEN (STR_NULL_STRING
),
407 HiiCreateCheckBoxOpCode (
409 (EFI_QUESTION_ID
)DRV_ADD_RECON_QUESTION_ID
,
410 VARSTORE_ID_BOOT_MAINT
,
411 DRV_ADD_RECON_VAR_OFFSET
,
412 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
413 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
419 HiiCreateStringOpCode (
421 (EFI_QUESTION_ID
)DRIVER_ADD_OPTION_QUESTION_ID
,
422 VARSTORE_ID_BOOT_MAINT
,
423 DRIVER_ADD_OPTION_VAR_OFFSET
,
424 STRING_TOKEN (STR_OPTIONAL_DATA
),
425 STRING_TOKEN (STR_NULL_STRING
),
433 UpdatePageEnd (CallbackData
);
439 @param UpdatePageId The form ID to be updated.
440 @param ConsoleMenu The console menu list.
441 @param CallbackData The BMM context data.
446 IN UINT16 UpdatePageId
,
447 IN BM_MENU_OPTION
*ConsoleMenu
,
448 IN BMM_CALLBACK_DATA
*CallbackData
451 BM_MENU_ENTRY
*NewMenuEntry
;
452 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
453 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
458 EFI_QUESTION_ID QuestionIdBase
;
459 UINT16 VariableOffsetBase
;
461 CallbackData
->BmmAskSaveOrNot
= TRUE
;
463 UpdatePageStart (CallbackData
);
467 VariableOffsetBase
= 0;
469 switch (UpdatePageId
) {
471 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleInCheck
[0];
472 QuestionIdBase
= CON_IN_DEVICE_QUESTION_ID
;
473 VariableOffsetBase
= CON_IN_DEVICE_VAR_OFFSET
;
476 case FORM_CON_OUT_ID
:
477 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleOutCheck
[0];
478 QuestionIdBase
= CON_OUT_DEVICE_QUESTION_ID
;
479 VariableOffsetBase
= CON_OUT_DEVICE_VAR_OFFSET
;
482 case FORM_CON_ERR_ID
:
483 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleErrCheck
[0];
484 QuestionIdBase
= CON_ERR_DEVICE_QUESTION_ID
;
485 VariableOffsetBase
= CON_ERR_DEVICE_VAR_OFFSET
;
489 ASSERT (ConsoleCheck
!= NULL
);
491 for (Index
= 0; ((Index
< ConsoleMenu
->MenuNumber
) && \
492 (Index
< MAX_MENU_NUMBER
)); Index
++)
495 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
496 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*)NewMenuEntry
->VariableContext
;
497 if (NewConsoleContext
->IsActive
) {
498 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
499 ConsoleCheck
[Index
] = TRUE
;
501 ConsoleCheck
[Index
] = FALSE
;
504 HiiCreateCheckBoxOpCode (
506 (EFI_QUESTION_ID
)(QuestionIdBase
+ Index
),
507 VARSTORE_ID_BOOT_MAINT
,
508 (UINT16
)(VariableOffsetBase
+ Index
),
509 NewMenuEntry
->DisplayStringToken
,
510 NewMenuEntry
->HelpStringToken
,
511 EFI_IFR_FLAG_CALLBACK
,
517 for (Index2
= 0; ((Index2
< TerminalMenu
.MenuNumber
) && \
518 (Index2
< MAX_MENU_NUMBER
)); Index2
++)
521 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
522 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*)NewMenuEntry
->VariableContext
;
524 ASSERT (Index
< MAX_MENU_NUMBER
);
525 if (((NewTerminalContext
->IsConIn
!= 0) && (UpdatePageId
== FORM_CON_IN_ID
)) ||
526 ((NewTerminalContext
->IsConOut
!= 0) && (UpdatePageId
== FORM_CON_OUT_ID
)) ||
527 ((NewTerminalContext
->IsStdErr
!= 0) && (UpdatePageId
== FORM_CON_ERR_ID
))
530 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
531 ConsoleCheck
[Index
] = TRUE
;
533 ConsoleCheck
[Index
] = FALSE
;
536 HiiCreateCheckBoxOpCode (
538 (EFI_QUESTION_ID
)(QuestionIdBase
+ Index
),
539 VARSTORE_ID_BOOT_MAINT
,
540 (UINT16
)(VariableOffsetBase
+ Index
),
541 NewMenuEntry
->DisplayStringToken
,
542 NewMenuEntry
->HelpStringToken
,
543 EFI_IFR_FLAG_CALLBACK
,
551 UpdatePageEnd (CallbackData
);
555 Update the page's NV Map if user has changed the order
556 a list. This list can be Boot Order or Driver Order.
558 @param UpdatePageId The form ID to be updated.
559 @param OptionMenu The new list.
560 @param CallbackData The BMM context data.
565 IN UINT16 UpdatePageId
,
566 IN BM_MENU_OPTION
*OptionMenu
,
567 IN BMM_CALLBACK_DATA
*CallbackData
570 BM_MENU_ENTRY
*NewMenuEntry
;
573 VOID
*OptionsOpCodeHandle
;
574 BOOLEAN BootOptionFound
;
576 EFI_QUESTION_ID QuestionId
;
579 CallbackData
->BmmAskSaveOrNot
= TRUE
;
580 UpdatePageStart (CallbackData
);
585 switch (UpdatePageId
) {
586 case FORM_BOOT_CHG_ID
:
588 // If the BootOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,
589 // means all Boot Options has been save in BootOptionMenu, we can get the date from the menu.
590 // else means browser maintains some uncommitted date which are not saved in BootOptionMenu,
591 // so we should not get the data from BootOptionMenu to show it.
593 if (CompareMem (CallbackData
->BmmFakeNvData
.BootOptionOrder
, CallbackData
->BmmOldFakeNVData
.BootOptionOrder
, sizeof (CallbackData
->BmmFakeNvData
.BootOptionOrder
)) == 0) {
594 GetBootOrder (CallbackData
);
597 OptionOrder
= CallbackData
->BmmFakeNvData
.BootOptionOrder
;
598 QuestionId
= BOOT_OPTION_ORDER_QUESTION_ID
;
599 VarOffset
= BOOT_OPTION_ORDER_VAR_OFFSET
;
602 case FORM_DRV_CHG_ID
:
604 // If the DriverOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,
605 // means all Driver Options has been save in DriverOptionMenu, we can get the DriverOptionOrder from the menu.
606 // else means browser maintains some uncommitted date which are not saved in DriverOptionMenu,
607 // so we should not get the data from DriverOptionMenu to show it.
609 if (CompareMem (CallbackData
->BmmFakeNvData
.DriverOptionOrder
, CallbackData
->BmmOldFakeNVData
.DriverOptionOrder
, sizeof (CallbackData
->BmmFakeNvData
.DriverOptionOrder
)) == 0) {
610 GetDriverOrder (CallbackData
);
613 OptionOrder
= CallbackData
->BmmFakeNvData
.DriverOptionOrder
;
614 QuestionId
= DRIVER_OPTION_ORDER_QUESTION_ID
;
615 VarOffset
= DRIVER_OPTION_ORDER_VAR_OFFSET
;
619 ASSERT (OptionOrder
!= NULL
);
621 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
622 ASSERT (OptionsOpCodeHandle
!= NULL
);
625 for (OptionIndex
= 0; (OptionOrder
[OptionIndex
] != 0 && OptionIndex
< MAX_MENU_NUMBER
); OptionIndex
++) {
626 BootOptionFound
= FALSE
;
627 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
628 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
629 if ((UINT32
)(NewMenuEntry
->OptionNumber
+ 1) == OptionOrder
[OptionIndex
]) {
630 BootOptionFound
= TRUE
;
635 if (BootOptionFound
) {
636 HiiCreateOneOfOptionOpCode (
638 NewMenuEntry
->DisplayStringToken
,
640 EFI_IFR_TYPE_NUM_SIZE_32
,
641 OptionOrder
[OptionIndex
]
646 if (OptionMenu
->MenuNumber
> 0) {
647 HiiCreateOrderedListOpCode (
648 mStartOpCodeHandle
, // Container for dynamic created opcodes
649 QuestionId
, // Question ID
650 VARSTORE_ID_BOOT_MAINT
, // VarStore ID
651 VarOffset
, // Offset in Buffer Storage
652 STRING_TOKEN (STR_CHANGE_ORDER
), // Question prompt text
653 STRING_TOKEN (STR_CHANGE_ORDER
), // Question help text
655 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET
656 EFI_IFR_TYPE_NUM_SIZE_32
, // Data type of Question value
657 100, // Maximum container
658 OptionsOpCodeHandle
, // Option Opcode list
659 NULL
// Default Opcode is NULL
663 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
665 UpdatePageEnd (CallbackData
);
669 Refresh the text mode page.
671 @param CallbackData The BMM context data.
676 IN BMM_CALLBACK_DATA
*CallbackData
683 CHAR16 ModeString
[50];
687 EFI_STRING_ID
*ModeToken
;
689 VOID
*OptionsOpCodeHandle
;
690 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
692 ConOut
= gST
->ConOut
;
695 MaxMode
= (UINTN
)(ConOut
->Mode
->MaxMode
);
697 CallbackData
->BmmAskSaveOrNot
= TRUE
;
699 UpdatePageStart (CallbackData
);
704 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
705 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
706 if (EFI_ERROR (Status
)) {
713 if (ValidMode
== 0) {
717 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
718 ASSERT (OptionsOpCodeHandle
!= NULL
);
720 ModeToken
= AllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
721 ASSERT (ModeToken
!= NULL
);
724 // Determin which mode should be the first entry in menu
726 GetConsoleOutMode (CallbackData
);
729 // Build text mode options
731 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
732 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
733 if (EFI_ERROR (Status
)) {
738 // Build mode string Column x Row
740 UnicodeValueToStringS (ModeString
, sizeof (ModeString
), 0, Col
, 0);
741 PStr
= &ModeString
[0];
742 StrnCatS (PStr
, ARRAY_SIZE (ModeString
), L
" x ", StrLen (L
" x ") + 1);
743 PStr
= PStr
+ StrLen (PStr
);
744 UnicodeValueToStringS (
746 sizeof (ModeString
) - ((UINTN
)PStr
- (UINTN
)&ModeString
[0]),
752 ModeToken
[Index
] = HiiSetString (CallbackData
->BmmHiiHandle
, 0, ModeString
, NULL
);
754 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
755 HiiCreateOneOfOptionOpCode (
758 EFI_IFR_OPTION_DEFAULT
,
759 EFI_IFR_TYPE_NUM_SIZE_16
,
763 HiiCreateOneOfOptionOpCode (
767 EFI_IFR_TYPE_NUM_SIZE_16
,
775 HiiCreateOneOfOpCode (
777 (EFI_QUESTION_ID
)CON_MODE_QUESTION_ID
,
778 VARSTORE_ID_BOOT_MAINT
,
780 STRING_TOKEN (STR_CON_MODE_SETUP
),
781 STRING_TOKEN (STR_CON_MODE_SETUP
),
782 EFI_IFR_FLAG_RESET_REQUIRED
,
783 EFI_IFR_NUMERIC_SIZE_2
,
788 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
789 FreePool (ModeToken
);
791 UpdatePageEnd (CallbackData
);
795 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,
796 Parity, Stop Bits, Terminal Type.
798 @param CallbackData The BMM context data.
803 IN BMM_CALLBACK_DATA
*CallbackData
808 BM_MENU_ENTRY
*NewMenuEntry
;
809 VOID
*OptionsOpCodeHandle
;
810 UINTN CurrentTerminal
;
812 CallbackData
->BmmAskSaveOrNot
= TRUE
;
814 UpdatePageStart (CallbackData
);
816 CurrentTerminal
= CallbackData
->CurrentTerminal
;
817 NewMenuEntry
= BOpt_GetMenuEntry (
822 if (NewMenuEntry
== NULL
) {
826 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
827 ASSERT (OptionsOpCodeHandle
!= NULL
);
829 for (Index
= 0; Index
< sizeof (BaudRateList
) / sizeof (BaudRateList
[0]); Index
++) {
831 if (BaudRateList
[Index
].Value
== 115200) {
832 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
835 HiiCreateOneOfOptionOpCode (
837 BaudRateList
[Index
].StringToken
,
839 EFI_IFR_TYPE_NUM_SIZE_8
,
844 HiiCreateOneOfOpCode (
846 (EFI_QUESTION_ID
)(COM_BAUD_RATE_QUESTION_ID
+ CurrentTerminal
),
847 VARSTORE_ID_BOOT_MAINT
,
848 (UINT16
)(COM_BAUD_RATE_VAR_OFFSET
+ CurrentTerminal
),
849 STRING_TOKEN (STR_COM_BAUD_RATE
),
850 STRING_TOKEN (STR_COM_BAUD_RATE
),
851 EFI_IFR_FLAG_CALLBACK
,
852 EFI_IFR_NUMERIC_SIZE_1
,
857 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
858 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
859 ASSERT (OptionsOpCodeHandle
!= NULL
);
861 for (Index
= 0; Index
< ARRAY_SIZE (DataBitsList
); Index
++) {
864 if (DataBitsList
[Index
].Value
== 8) {
865 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
868 HiiCreateOneOfOptionOpCode (
870 DataBitsList
[Index
].StringToken
,
872 EFI_IFR_TYPE_NUM_SIZE_8
,
877 HiiCreateOneOfOpCode (
879 (EFI_QUESTION_ID
)(COM_DATA_RATE_QUESTION_ID
+ CurrentTerminal
),
880 VARSTORE_ID_BOOT_MAINT
,
881 (UINT16
)(COM_DATA_RATE_VAR_OFFSET
+ CurrentTerminal
),
882 STRING_TOKEN (STR_COM_DATA_BITS
),
883 STRING_TOKEN (STR_COM_DATA_BITS
),
884 EFI_IFR_FLAG_CALLBACK
,
885 EFI_IFR_NUMERIC_SIZE_1
,
890 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
891 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
892 ASSERT (OptionsOpCodeHandle
!= NULL
);
894 for (Index
= 0; Index
< ARRAY_SIZE (ParityList
); Index
++) {
896 if (ParityList
[Index
].Value
== NoParity
) {
897 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
900 HiiCreateOneOfOptionOpCode (
902 ParityList
[Index
].StringToken
,
904 EFI_IFR_TYPE_NUM_SIZE_8
,
909 HiiCreateOneOfOpCode (
911 (EFI_QUESTION_ID
)(COM_PARITY_QUESTION_ID
+ CurrentTerminal
),
912 VARSTORE_ID_BOOT_MAINT
,
913 (UINT16
)(COM_PARITY_VAR_OFFSET
+ CurrentTerminal
),
914 STRING_TOKEN (STR_COM_PARITY
),
915 STRING_TOKEN (STR_COM_PARITY
),
916 EFI_IFR_FLAG_CALLBACK
,
917 EFI_IFR_NUMERIC_SIZE_1
,
922 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
923 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
924 ASSERT (OptionsOpCodeHandle
!= NULL
);
926 for (Index
= 0; Index
< ARRAY_SIZE (StopBitsList
); Index
++) {
928 if (StopBitsList
[Index
].Value
== OneStopBit
) {
929 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
932 HiiCreateOneOfOptionOpCode (
934 StopBitsList
[Index
].StringToken
,
936 EFI_IFR_TYPE_NUM_SIZE_8
,
941 HiiCreateOneOfOpCode (
943 (EFI_QUESTION_ID
)(COM_STOP_BITS_QUESTION_ID
+ CurrentTerminal
),
944 VARSTORE_ID_BOOT_MAINT
,
945 (UINT16
)(COM_STOP_BITS_VAR_OFFSET
+ CurrentTerminal
),
946 STRING_TOKEN (STR_COM_STOP_BITS
),
947 STRING_TOKEN (STR_COM_STOP_BITS
),
948 EFI_IFR_FLAG_CALLBACK
,
949 EFI_IFR_NUMERIC_SIZE_1
,
954 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
955 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
956 ASSERT (OptionsOpCodeHandle
!= NULL
);
958 for (Index
= 0; Index
< ARRAY_SIZE (TerminalType
); Index
++) {
961 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
964 HiiCreateOneOfOptionOpCode (
966 (EFI_STRING_ID
)TerminalType
[Index
],
968 EFI_IFR_TYPE_NUM_SIZE_8
,
973 HiiCreateOneOfOpCode (
975 (EFI_QUESTION_ID
)(COM_TERMINAL_QUESTION_ID
+ CurrentTerminal
),
976 VARSTORE_ID_BOOT_MAINT
,
977 (UINT16
)(COM_TERMINAL_VAR_OFFSET
+ CurrentTerminal
),
978 STRING_TOKEN (STR_COM_TERMI_TYPE
),
979 STRING_TOKEN (STR_COM_TERMI_TYPE
),
980 EFI_IFR_FLAG_CALLBACK
,
981 EFI_IFR_NUMERIC_SIZE_1
,
986 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
987 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
988 ASSERT (OptionsOpCodeHandle
!= NULL
);
990 for (Index
= 0; Index
< ARRAY_SIZE (mFlowControlType
); Index
++) {
993 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
996 HiiCreateOneOfOptionOpCode (
998 (EFI_STRING_ID
)mFlowControlType
[Index
],
1000 EFI_IFR_TYPE_NUM_SIZE_8
,
1001 mFlowControlValue
[Index
]
1005 HiiCreateOneOfOpCode (
1007 (EFI_QUESTION_ID
)(COM_FLOWCONTROL_QUESTION_ID
+ CurrentTerminal
),
1008 VARSTORE_ID_BOOT_MAINT
,
1009 (UINT16
)(COM_FLOWCONTROL_VAR_OFFSET
+ CurrentTerminal
),
1010 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
1011 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
1012 EFI_IFR_FLAG_CALLBACK
,
1013 EFI_IFR_NUMERIC_SIZE_1
,
1014 OptionsOpCodeHandle
,
1018 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1020 UpdatePageEnd (CallbackData
);
1024 Update add boot/driver option page.
1026 @param CallbackData The BMM context data.
1027 @param FormId The form ID to be updated.
1028 @param DevicePath Device path.
1033 IN BMM_CALLBACK_DATA
*CallbackData
,
1034 IN EFI_FORM_ID FormId
,
1035 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
1039 EFI_STRING_ID StringToken
;
1043 if (DevicePath
!= NULL
) {
1044 String
= ExtractFileNameFromDevicePath (DevicePath
);
1047 if (String
== NULL
) {
1048 String
= HiiGetString (CallbackData
->BmmHiiHandle
, STRING_TOKEN (STR_NULL_STRING
), NULL
);
1049 ASSERT (String
!= NULL
);
1052 StringToken
= HiiSetString (CallbackData
->BmmHiiHandle
, 0, String
, NULL
);
1055 if (FormId
== FORM_BOOT_ADD_ID
) {
1056 if (!CallbackData
->BmmFakeNvData
.BootOptionChanged
) {
1057 ZeroMem (CallbackData
->BmmFakeNvData
.BootOptionalData
, sizeof (CallbackData
->BmmFakeNvData
.BootOptionalData
));
1058 ZeroMem (CallbackData
->BmmFakeNvData
.BootDescriptionData
, sizeof (CallbackData
->BmmFakeNvData
.BootDescriptionData
));
1059 ZeroMem (CallbackData
->BmmOldFakeNVData
.BootOptionalData
, sizeof (CallbackData
->BmmOldFakeNVData
.BootOptionalData
));
1060 ZeroMem (CallbackData
->BmmOldFakeNVData
.BootDescriptionData
, sizeof (CallbackData
->BmmOldFakeNVData
.BootDescriptionData
));
1062 } else if (FormId
== FORM_DRV_ADD_FILE_ID
) {
1063 if (!CallbackData
->BmmFakeNvData
.DriverOptionChanged
) {
1064 ZeroMem (CallbackData
->BmmFakeNvData
.DriverOptionalData
, sizeof (CallbackData
->BmmFakeNvData
.DriverOptionalData
));
1065 ZeroMem (CallbackData
->BmmFakeNvData
.DriverDescriptionData
, sizeof (CallbackData
->BmmFakeNvData
.DriverDescriptionData
));
1066 ZeroMem (CallbackData
->BmmOldFakeNVData
.DriverOptionalData
, sizeof (CallbackData
->BmmOldFakeNVData
.DriverOptionalData
));
1067 ZeroMem (CallbackData
->BmmOldFakeNVData
.DriverDescriptionData
, sizeof (CallbackData
->BmmOldFakeNVData
.DriverDescriptionData
));
1071 RefreshUpdateData ();
1072 mStartLabel
->Number
= FormId
;
1074 HiiCreateSubTitleOpCode (
1083 CallbackData
->BmmHiiHandle
,
1086 mStartOpCodeHandle
, // Label FormId
1087 mEndOpCodeHandle
// LABEL_END
1092 Dispatch the correct update page function to call based on
1095 @param UpdatePageId The form ID.
1096 @param CallbackData The BMM context data.
1101 IN UINT16 UpdatePageId
,
1102 IN BMM_CALLBACK_DATA
*CallbackData
1105 CleanUpPage (UpdatePageId
, CallbackData
);
1106 switch (UpdatePageId
) {
1107 case FORM_CON_IN_ID
:
1108 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
1111 case FORM_CON_OUT_ID
:
1112 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
1115 case FORM_CON_ERR_ID
:
1116 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
1119 case FORM_BOOT_CHG_ID
:
1120 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
1123 case FORM_DRV_CHG_ID
:
1124 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
1133 Dispatch the display to the next page based on NewPageId.
1135 @param Private The BMM context data.
1136 @param NewPageId The original page ID.
1141 BMM_CALLBACK_DATA
*Private
,
1145 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1147 // If we select a handle to add driver option, advance to the add handle description page.
1149 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1150 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1152 // Return to main page after "Save Changes" or "Discard Changes".
1154 NewPageId
= FORM_MAIN_ID
;
1155 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1156 NewPageId
= FORM_CON_COM_SETUP_ID
;
1159 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1160 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1161 Private
->BmmCurrentPageId
= NewPageId
;