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
;
73 Add a "Go back to main page" tag in front of the form when there are no
74 "Apply changes" and "Discard changes" tags in the end of the form.
76 @param CallbackData The BMM context data.
81 IN BMM_CALLBACK_DATA
*CallbackData
85 mStartLabel
->Number
= CallbackData
->BmmCurrentPageId
;
87 if (!(CallbackData
->BmmAskSaveOrNot
)) {
89 // Add a "Go back to main page" tag in front of the form when there are no
90 // "Apply changes" and "Discard changes" tags in the end of the form.
95 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
96 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
104 Create the "Apply changes" and "Discard changes" tags. And
105 ensure user can return to the main page.
107 @param CallbackData The BMM context data.
112 IN BMM_CALLBACK_DATA
*CallbackData
116 // Create the "Apply changes" and "Discard changes" tags.
118 if (CallbackData
->BmmAskSaveOrNot
) {
119 HiiCreateSubTitleOpCode (
121 STRING_TOKEN (STR_NULL_STRING
),
127 HiiCreateActionOpCode (
129 KEY_VALUE_SAVE_AND_EXIT
,
130 STRING_TOKEN (STR_SAVE_AND_EXIT
),
131 STRING_TOKEN (STR_NULL_STRING
),
132 EFI_IFR_FLAG_CALLBACK
,
138 // Ensure user can return to the main page.
140 HiiCreateActionOpCode (
142 KEY_VALUE_NO_SAVE_AND_EXIT
,
143 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
144 STRING_TOKEN (STR_NULL_STRING
),
145 EFI_IFR_FLAG_CALLBACK
,
150 CallbackData
->BmmHiiHandle
,
152 CallbackData
->BmmCurrentPageId
,
153 mStartOpCodeHandle
, // Label CallbackData->BmmCurrentPageId
154 mEndOpCodeHandle
// LABEL_END
159 Clean up the dynamic opcode at label and form specified by both LabelId.
161 @param LabelId It is both the Form ID and Label ID for opcode deletion.
162 @param CallbackData The BMM context data.
168 IN BMM_CALLBACK_DATA
*CallbackData
171 RefreshUpdateData ();
174 // Remove all op-codes from dynamic page
176 mStartLabel
->Number
= LabelId
;
178 CallbackData
->BmmHiiHandle
,
181 mStartOpCodeHandle
, // Label LabelId
182 mEndOpCodeHandle
// LABEL_END
187 Create a list of Goto Opcode for all terminal devices logged
188 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.
190 @param CallbackData The BMM context data.
194 IN BMM_CALLBACK_DATA
*CallbackData
197 BM_MENU_ENTRY
*NewMenuEntry
;
200 CallbackData
->BmmAskSaveOrNot
= TRUE
;
202 UpdatePageStart (CallbackData
);
204 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
205 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
207 HiiCreateGotoOpCode (
209 FORM_CON_COM_SETUP_ID
,
210 NewMenuEntry
->DisplayStringToken
,
211 STRING_TOKEN (STR_NULL_STRING
),
212 EFI_IFR_FLAG_CALLBACK
,
213 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
)
217 UpdatePageEnd (CallbackData
);
222 Create a list of boot option from global BootOptionMenu. It
223 allow user to delete the boot option.
225 @param CallbackData The BMM context data.
230 IN BMM_CALLBACK_DATA
*CallbackData
233 BM_MENU_ENTRY
*NewMenuEntry
;
234 BM_LOAD_CONTEXT
*NewLoadContext
;
237 CallbackData
->BmmAskSaveOrNot
= TRUE
;
239 UpdatePageStart (CallbackData
);
241 ASSERT (BootOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.BootOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.BootOptionDel
[0])));
242 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
243 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
244 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
245 if (NewLoadContext
->IsLegacy
) {
249 NewLoadContext
->Deleted
= FALSE
;
251 if (CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] && !CallbackData
->BmmFakeNvData
.BootOptionDelMark
[Index
]) {
253 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected
254 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has
255 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser
256 // through HiiSetBrowserData function.
258 CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] = FALSE
;
259 CallbackData
->BmmOldFakeNVData
.BootOptionDel
[Index
] = FALSE
;
262 HiiCreateCheckBoxOpCode (
264 (EFI_QUESTION_ID
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
265 VARSTORE_ID_BOOT_MAINT
,
266 (UINT16
) (BOOT_OPTION_DEL_VAR_OFFSET
+ Index
),
267 NewMenuEntry
->DisplayStringToken
,
268 NewMenuEntry
->HelpStringToken
,
269 EFI_IFR_FLAG_CALLBACK
,
274 UpdatePageEnd (CallbackData
);
278 Create a lit of driver option from global DriverMenu.
280 @param CallbackData The BMM context data.
284 UpdateDrvAddHandlePage (
285 IN BMM_CALLBACK_DATA
*CallbackData
288 BM_MENU_ENTRY
*NewMenuEntry
;
291 CallbackData
->BmmAskSaveOrNot
= FALSE
;
293 UpdatePageStart (CallbackData
);
295 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
296 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
298 HiiCreateGotoOpCode (
300 FORM_DRV_ADD_HANDLE_DESC_ID
,
301 NewMenuEntry
->DisplayStringToken
,
302 STRING_TOKEN (STR_NULL_STRING
),
303 EFI_IFR_FLAG_CALLBACK
,
304 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
)
308 UpdatePageEnd (CallbackData
);
312 Create a lit of driver option from global DriverOptionMenu. It
313 allow user to delete the driver option.
315 @param CallbackData The BMM context data.
320 IN BMM_CALLBACK_DATA
*CallbackData
323 BM_MENU_ENTRY
*NewMenuEntry
;
324 BM_LOAD_CONTEXT
*NewLoadContext
;
327 CallbackData
->BmmAskSaveOrNot
= TRUE
;
329 UpdatePageStart (CallbackData
);
331 ASSERT (DriverOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
[0])));
332 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
333 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
335 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
336 NewLoadContext
->Deleted
= FALSE
;
338 if (CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] && !CallbackData
->BmmFakeNvData
.DriverOptionDelMark
[Index
]) {
340 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected
341 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has
342 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser
343 // through HiiSetBrowserData function.
345 CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] = FALSE
;
346 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
;
488 ASSERT (ConsoleCheck
!= NULL
);
490 for (Index
= 0; ((Index
< ConsoleMenu
->MenuNumber
) && \
491 (Index
< MAX_MENU_NUMBER
)) ; Index
++) {
493 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
494 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
495 if (NewConsoleContext
->IsActive
) {
496 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
497 ConsoleCheck
[Index
] = TRUE
;
499 ConsoleCheck
[Index
] = FALSE
;
501 HiiCreateCheckBoxOpCode (
503 (EFI_QUESTION_ID
) (QuestionIdBase
+ Index
),
504 VARSTORE_ID_BOOT_MAINT
,
505 (UINT16
) (VariableOffsetBase
+ Index
),
506 NewMenuEntry
->DisplayStringToken
,
507 NewMenuEntry
->HelpStringToken
,
508 EFI_IFR_FLAG_CALLBACK
,
514 for (Index2
= 0; ((Index2
< TerminalMenu
.MenuNumber
) && \
515 (Index2
< MAX_MENU_NUMBER
)); Index2
++) {
517 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
518 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
520 ASSERT (Index
< MAX_MENU_NUMBER
);
521 if (((NewTerminalContext
->IsConIn
!= 0) && (UpdatePageId
== FORM_CON_IN_ID
)) ||
522 ((NewTerminalContext
->IsConOut
!= 0) && (UpdatePageId
== FORM_CON_OUT_ID
)) ||
523 ((NewTerminalContext
->IsStdErr
!= 0) && (UpdatePageId
== FORM_CON_ERR_ID
))
525 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
526 ConsoleCheck
[Index
] = TRUE
;
528 ConsoleCheck
[Index
] = FALSE
;
530 HiiCreateCheckBoxOpCode (
532 (EFI_QUESTION_ID
) (QuestionIdBase
+ Index
),
533 VARSTORE_ID_BOOT_MAINT
,
534 (UINT16
) (VariableOffsetBase
+ Index
),
535 NewMenuEntry
->DisplayStringToken
,
536 NewMenuEntry
->HelpStringToken
,
537 EFI_IFR_FLAG_CALLBACK
,
545 UpdatePageEnd (CallbackData
);
549 Update the page's NV Map if user has changed the order
550 a list. This list can be Boot Order or Driver Order.
552 @param UpdatePageId The form ID to be updated.
553 @param OptionMenu The new list.
554 @param CallbackData The BMM context data.
559 IN UINT16 UpdatePageId
,
560 IN BM_MENU_OPTION
*OptionMenu
,
561 IN BMM_CALLBACK_DATA
*CallbackData
564 BM_MENU_ENTRY
*NewMenuEntry
;
567 VOID
*OptionsOpCodeHandle
;
568 BOOLEAN BootOptionFound
;
570 EFI_QUESTION_ID QuestionId
;
573 CallbackData
->BmmAskSaveOrNot
= TRUE
;
574 UpdatePageStart (CallbackData
);
579 switch (UpdatePageId
) {
581 case FORM_BOOT_CHG_ID
:
583 // If the BootOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,
584 // means all Boot Options has been save in BootOptionMenu, we can get the date from the menu.
585 // else means browser maintains some uncommitted date which are not saved in BootOptionMenu,
586 // so we should not get the data from BootOptionMenu to show it.
588 if (CompareMem (CallbackData
->BmmFakeNvData
.BootOptionOrder
, CallbackData
->BmmOldFakeNVData
.BootOptionOrder
, sizeof (CallbackData
->BmmFakeNvData
.BootOptionOrder
)) == 0) {
589 GetBootOrder (CallbackData
);
591 OptionOrder
= CallbackData
->BmmFakeNvData
.BootOptionOrder
;
592 QuestionId
= BOOT_OPTION_ORDER_QUESTION_ID
;
593 VarOffset
= BOOT_OPTION_ORDER_VAR_OFFSET
;
596 case FORM_DRV_CHG_ID
:
598 // If the DriverOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,
599 // means all Driver Options has been save in DriverOptionMenu, we can get the DriverOptionOrder from the menu.
600 // else means browser maintains some uncommitted date which are not saved in DriverOptionMenu,
601 // so we should not get the data from DriverOptionMenu to show it.
603 if (CompareMem (CallbackData
->BmmFakeNvData
.DriverOptionOrder
, CallbackData
->BmmOldFakeNVData
.DriverOptionOrder
, sizeof (CallbackData
->BmmFakeNvData
.DriverOptionOrder
)) == 0) {
604 GetDriverOrder (CallbackData
);
606 OptionOrder
= CallbackData
->BmmFakeNvData
.DriverOptionOrder
;
607 QuestionId
= DRIVER_OPTION_ORDER_QUESTION_ID
;
608 VarOffset
= DRIVER_OPTION_ORDER_VAR_OFFSET
;
611 ASSERT (OptionOrder
!= NULL
);
613 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
614 ASSERT (OptionsOpCodeHandle
!= NULL
);
617 for (OptionIndex
= 0; (OptionOrder
[OptionIndex
] != 0 && OptionIndex
< MAX_MENU_NUMBER
); OptionIndex
++) {
618 BootOptionFound
= FALSE
;
619 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
620 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
621 if ((UINT32
) (NewMenuEntry
->OptionNumber
+ 1) == OptionOrder
[OptionIndex
]) {
622 BootOptionFound
= TRUE
;
626 if (BootOptionFound
) {
627 HiiCreateOneOfOptionOpCode (
629 NewMenuEntry
->DisplayStringToken
,
631 EFI_IFR_TYPE_NUM_SIZE_32
,
632 OptionOrder
[OptionIndex
]
637 if (OptionMenu
->MenuNumber
> 0) {
638 HiiCreateOrderedListOpCode (
639 mStartOpCodeHandle
, // Container for dynamic created opcodes
640 QuestionId
, // Question ID
641 VARSTORE_ID_BOOT_MAINT
, // VarStore ID
642 VarOffset
, // Offset in Buffer Storage
643 STRING_TOKEN (STR_CHANGE_ORDER
), // Question prompt text
644 STRING_TOKEN (STR_CHANGE_ORDER
), // Question help text
646 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET
647 EFI_IFR_TYPE_NUM_SIZE_32
, // Data type of Question value
648 100, // Maximum container
649 OptionsOpCodeHandle
, // Option Opcode list
650 NULL
// Default Opcode is NULL
654 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
656 UpdatePageEnd (CallbackData
);
661 Refresh the text mode page.
663 @param CallbackData The BMM context data.
668 IN BMM_CALLBACK_DATA
*CallbackData
675 CHAR16 ModeString
[50];
679 EFI_STRING_ID
*ModeToken
;
681 VOID
*OptionsOpCodeHandle
;
682 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
684 ConOut
= gST
->ConOut
;
687 MaxMode
= (UINTN
) (ConOut
->Mode
->MaxMode
);
689 CallbackData
->BmmAskSaveOrNot
= TRUE
;
691 UpdatePageStart (CallbackData
);
696 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
697 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
698 if (EFI_ERROR (Status
)) {
704 if (ValidMode
== 0) {
708 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
709 ASSERT (OptionsOpCodeHandle
!= NULL
);
711 ModeToken
= AllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
712 ASSERT(ModeToken
!= NULL
);
715 // Determin which mode should be the first entry in menu
717 GetConsoleOutMode (CallbackData
);
720 // Build text mode options
722 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
723 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
724 if (EFI_ERROR (Status
)) {
729 // Build mode string Column x Row
731 UnicodeValueToStringS (ModeString
, sizeof (ModeString
), 0, Col
, 0);
732 PStr
= &ModeString
[0];
733 StrnCatS (PStr
, ARRAY_SIZE (ModeString
), L
" x ", StrLen(L
" x ") + 1);
734 PStr
= PStr
+ StrLen (PStr
);
735 UnicodeValueToStringS (
737 sizeof (ModeString
) - ((UINTN
)PStr
- (UINTN
)&ModeString
[0]),
743 ModeToken
[Index
] = HiiSetString (CallbackData
->BmmHiiHandle
, 0, ModeString
, NULL
);
745 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
746 HiiCreateOneOfOptionOpCode (
749 EFI_IFR_OPTION_DEFAULT
,
750 EFI_IFR_TYPE_NUM_SIZE_16
,
754 HiiCreateOneOfOptionOpCode (
758 EFI_IFR_TYPE_NUM_SIZE_16
,
765 HiiCreateOneOfOpCode (
767 (EFI_QUESTION_ID
) CON_MODE_QUESTION_ID
,
768 VARSTORE_ID_BOOT_MAINT
,
770 STRING_TOKEN (STR_CON_MODE_SETUP
),
771 STRING_TOKEN (STR_CON_MODE_SETUP
),
772 EFI_IFR_FLAG_RESET_REQUIRED
,
773 EFI_IFR_NUMERIC_SIZE_2
,
778 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
779 FreePool (ModeToken
);
781 UpdatePageEnd (CallbackData
);
785 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,
786 Parity, Stop Bits, Terminal Type.
788 @param CallbackData The BMM context data.
793 IN BMM_CALLBACK_DATA
*CallbackData
798 BM_MENU_ENTRY
*NewMenuEntry
;
799 VOID
*OptionsOpCodeHandle
;
800 UINTN CurrentTerminal
;
802 CallbackData
->BmmAskSaveOrNot
= TRUE
;
804 UpdatePageStart (CallbackData
);
806 CurrentTerminal
= CallbackData
->CurrentTerminal
;
807 NewMenuEntry
= BOpt_GetMenuEntry (
812 if (NewMenuEntry
== NULL
) {
816 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
817 ASSERT (OptionsOpCodeHandle
!= NULL
);
819 for (Index
= 0; Index
< sizeof (BaudRateList
) / sizeof (BaudRateList
[0]); Index
++) {
821 if (BaudRateList
[Index
].Value
== 115200) {
822 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
824 HiiCreateOneOfOptionOpCode (
826 BaudRateList
[Index
].StringToken
,
828 EFI_IFR_TYPE_NUM_SIZE_8
,
833 HiiCreateOneOfOpCode (
835 (EFI_QUESTION_ID
) (COM_BAUD_RATE_QUESTION_ID
+ CurrentTerminal
),
836 VARSTORE_ID_BOOT_MAINT
,
837 (UINT16
) (COM_BAUD_RATE_VAR_OFFSET
+ CurrentTerminal
),
838 STRING_TOKEN (STR_COM_BAUD_RATE
),
839 STRING_TOKEN (STR_COM_BAUD_RATE
),
840 EFI_IFR_FLAG_CALLBACK
,
841 EFI_IFR_NUMERIC_SIZE_1
,
846 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
847 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
848 ASSERT (OptionsOpCodeHandle
!= NULL
);
850 for (Index
= 0; Index
< ARRAY_SIZE (DataBitsList
); Index
++) {
853 if (DataBitsList
[Index
].Value
== 8) {
854 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
857 HiiCreateOneOfOptionOpCode (
859 DataBitsList
[Index
].StringToken
,
861 EFI_IFR_TYPE_NUM_SIZE_8
,
866 HiiCreateOneOfOpCode (
868 (EFI_QUESTION_ID
) (COM_DATA_RATE_QUESTION_ID
+ CurrentTerminal
),
869 VARSTORE_ID_BOOT_MAINT
,
870 (UINT16
) (COM_DATA_RATE_VAR_OFFSET
+ CurrentTerminal
),
871 STRING_TOKEN (STR_COM_DATA_BITS
),
872 STRING_TOKEN (STR_COM_DATA_BITS
),
873 EFI_IFR_FLAG_CALLBACK
,
874 EFI_IFR_NUMERIC_SIZE_1
,
879 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
880 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
881 ASSERT (OptionsOpCodeHandle
!= NULL
);
883 for (Index
= 0; Index
< ARRAY_SIZE (ParityList
); Index
++) {
885 if (ParityList
[Index
].Value
== NoParity
) {
886 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
889 HiiCreateOneOfOptionOpCode (
891 ParityList
[Index
].StringToken
,
893 EFI_IFR_TYPE_NUM_SIZE_8
,
898 HiiCreateOneOfOpCode (
900 (EFI_QUESTION_ID
) (COM_PARITY_QUESTION_ID
+ CurrentTerminal
),
901 VARSTORE_ID_BOOT_MAINT
,
902 (UINT16
) (COM_PARITY_VAR_OFFSET
+ CurrentTerminal
),
903 STRING_TOKEN (STR_COM_PARITY
),
904 STRING_TOKEN (STR_COM_PARITY
),
905 EFI_IFR_FLAG_CALLBACK
,
906 EFI_IFR_NUMERIC_SIZE_1
,
911 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
912 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
913 ASSERT (OptionsOpCodeHandle
!= NULL
);
915 for (Index
= 0; Index
< ARRAY_SIZE (StopBitsList
); Index
++) {
917 if (StopBitsList
[Index
].Value
== OneStopBit
) {
918 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
921 HiiCreateOneOfOptionOpCode (
923 StopBitsList
[Index
].StringToken
,
925 EFI_IFR_TYPE_NUM_SIZE_8
,
930 HiiCreateOneOfOpCode (
932 (EFI_QUESTION_ID
) (COM_STOP_BITS_QUESTION_ID
+ CurrentTerminal
),
933 VARSTORE_ID_BOOT_MAINT
,
934 (UINT16
) (COM_STOP_BITS_VAR_OFFSET
+ CurrentTerminal
),
935 STRING_TOKEN (STR_COM_STOP_BITS
),
936 STRING_TOKEN (STR_COM_STOP_BITS
),
937 EFI_IFR_FLAG_CALLBACK
,
938 EFI_IFR_NUMERIC_SIZE_1
,
943 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
944 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
945 ASSERT (OptionsOpCodeHandle
!= NULL
);
947 for (Index
= 0; Index
< ARRAY_SIZE (TerminalType
); Index
++) {
950 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
953 HiiCreateOneOfOptionOpCode (
955 (EFI_STRING_ID
) TerminalType
[Index
],
957 EFI_IFR_TYPE_NUM_SIZE_8
,
962 HiiCreateOneOfOpCode (
964 (EFI_QUESTION_ID
) (COM_TERMINAL_QUESTION_ID
+ CurrentTerminal
),
965 VARSTORE_ID_BOOT_MAINT
,
966 (UINT16
) (COM_TERMINAL_VAR_OFFSET
+ CurrentTerminal
),
967 STRING_TOKEN (STR_COM_TERMI_TYPE
),
968 STRING_TOKEN (STR_COM_TERMI_TYPE
),
969 EFI_IFR_FLAG_CALLBACK
,
970 EFI_IFR_NUMERIC_SIZE_1
,
975 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
976 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
977 ASSERT (OptionsOpCodeHandle
!= NULL
);
979 for (Index
= 0; Index
< ARRAY_SIZE (mFlowControlType
); Index
++) {
982 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
984 HiiCreateOneOfOptionOpCode (
986 (EFI_STRING_ID
) mFlowControlType
[Index
],
988 EFI_IFR_TYPE_NUM_SIZE_8
,
989 mFlowControlValue
[Index
]
993 HiiCreateOneOfOpCode (
995 (EFI_QUESTION_ID
) (COM_FLOWCONTROL_QUESTION_ID
+ CurrentTerminal
),
996 VARSTORE_ID_BOOT_MAINT
,
997 (UINT16
) (COM_FLOWCONTROL_VAR_OFFSET
+ CurrentTerminal
),
998 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
999 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
1000 EFI_IFR_FLAG_CALLBACK
,
1001 EFI_IFR_NUMERIC_SIZE_1
,
1002 OptionsOpCodeHandle
,
1006 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1008 UpdatePageEnd (CallbackData
);
1012 Update add boot/driver option page.
1014 @param CallbackData The BMM context data.
1015 @param FormId The form ID to be updated.
1016 @param DevicePath Device path.
1021 IN BMM_CALLBACK_DATA
*CallbackData
,
1022 IN EFI_FORM_ID FormId
,
1023 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
1027 EFI_STRING_ID StringToken
;
1031 if (DevicePath
!= NULL
){
1032 String
= ExtractFileNameFromDevicePath(DevicePath
);
1034 if (String
== NULL
) {
1035 String
= HiiGetString (CallbackData
->BmmHiiHandle
, STRING_TOKEN (STR_NULL_STRING
), NULL
);
1036 ASSERT (String
!= NULL
);
1039 StringToken
= HiiSetString (CallbackData
->BmmHiiHandle
, 0, String
, NULL
);
1042 if(FormId
== FORM_BOOT_ADD_ID
){
1043 if (!CallbackData
->BmmFakeNvData
.BootOptionChanged
) {
1044 ZeroMem (CallbackData
->BmmFakeNvData
.BootOptionalData
, sizeof (CallbackData
->BmmFakeNvData
.BootOptionalData
));
1045 ZeroMem (CallbackData
->BmmFakeNvData
.BootDescriptionData
, sizeof (CallbackData
->BmmFakeNvData
.BootDescriptionData
));
1046 ZeroMem (CallbackData
->BmmOldFakeNVData
.BootOptionalData
, sizeof (CallbackData
->BmmOldFakeNVData
.BootOptionalData
));
1047 ZeroMem (CallbackData
->BmmOldFakeNVData
.BootDescriptionData
, sizeof (CallbackData
->BmmOldFakeNVData
.BootDescriptionData
));
1049 } else if (FormId
== FORM_DRV_ADD_FILE_ID
){
1050 if (!CallbackData
->BmmFakeNvData
.DriverOptionChanged
) {
1051 ZeroMem (CallbackData
->BmmFakeNvData
.DriverOptionalData
, sizeof (CallbackData
->BmmFakeNvData
.DriverOptionalData
));
1052 ZeroMem (CallbackData
->BmmFakeNvData
.DriverDescriptionData
, sizeof (CallbackData
->BmmFakeNvData
.DriverDescriptionData
));
1053 ZeroMem (CallbackData
->BmmOldFakeNVData
.DriverOptionalData
, sizeof (CallbackData
->BmmOldFakeNVData
.DriverOptionalData
));
1054 ZeroMem (CallbackData
->BmmOldFakeNVData
.DriverDescriptionData
, sizeof (CallbackData
->BmmOldFakeNVData
.DriverDescriptionData
));
1058 RefreshUpdateData();
1059 mStartLabel
->Number
= FormId
;
1061 HiiCreateSubTitleOpCode (
1070 CallbackData
->BmmHiiHandle
,
1073 mStartOpCodeHandle
,// Label FormId
1074 mEndOpCodeHandle
// LABEL_END
1079 Dispatch the correct update page function to call based on
1082 @param UpdatePageId The form ID.
1083 @param CallbackData The BMM context data.
1088 IN UINT16 UpdatePageId
,
1089 IN BMM_CALLBACK_DATA
*CallbackData
1092 CleanUpPage (UpdatePageId
, CallbackData
);
1093 switch (UpdatePageId
) {
1094 case FORM_CON_IN_ID
:
1095 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
1098 case FORM_CON_OUT_ID
:
1099 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
1102 case FORM_CON_ERR_ID
:
1103 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
1106 case FORM_BOOT_CHG_ID
:
1107 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
1110 case FORM_DRV_CHG_ID
:
1111 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
1120 Dispatch the display to the next page based on NewPageId.
1122 @param Private The BMM context data.
1123 @param NewPageId The original page ID.
1128 BMM_CALLBACK_DATA
*Private
,
1132 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1134 // If we select a handle to add driver option, advance to the add handle description page.
1136 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1137 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1139 // Return to main page after "Save Changes" or "Discard Changes".
1141 NewPageId
= FORM_MAIN_ID
;
1142 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1143 NewPageId
= FORM_CON_COM_SETUP_ID
;
1146 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1147 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1148 Private
->BmmCurrentPageId
= NewPageId
;