2 Dynamically update the pages.
4 Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "BootMaintenanceManager.h"
18 Create the global UpdateData structure.
27 // Init OpCode Handle and Allocate space for creation of Buffer
29 mStartOpCodeHandle
= HiiAllocateOpCodeHandle ();
30 ASSERT (mStartOpCodeHandle
!= NULL
);
32 mEndOpCodeHandle
= HiiAllocateOpCodeHandle ();
33 ASSERT (mEndOpCodeHandle
!= NULL
);
36 // Create Hii Extend Label OpCode as the start opcode
38 mStartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (mStartOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
39 mStartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
42 // Create Hii Extend Label OpCode as the end opcode
44 mEndLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (mEndOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
45 mEndLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
46 mEndLabel
->Number
= LABEL_END
;
50 Refresh the global UpdateData structure.
59 // Free current updated date
61 if (mStartOpCodeHandle
!= NULL
) {
62 HiiFreeOpCodeHandle (mStartOpCodeHandle
);
66 // Create new OpCode Handle
68 mStartOpCodeHandle
= HiiAllocateOpCodeHandle ();
71 // Create Hii Extend Label OpCode as the start opcode
73 mStartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (mStartOpCodeHandle
, &gEfiIfrTianoGuid
, NULL
, sizeof (EFI_IFR_GUID_LABEL
));
74 mStartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
79 Add a "Go back to main page" tag in front of the form when there are no
80 "Apply changes" and "Discard changes" tags in the end of the form.
82 @param CallbackData The BMM context data.
87 IN BMM_CALLBACK_DATA
*CallbackData
91 mStartLabel
->Number
= CallbackData
->BmmCurrentPageId
;
93 if (!(CallbackData
->BmmAskSaveOrNot
)) {
95 // Add a "Go back to main page" tag in front of the form when there are no
96 // "Apply changes" and "Discard changes" tags in the end of the form.
101 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
102 STRING_TOKEN (STR_FORM_GOTO_MAIN
),
110 Create the "Apply changes" and "Discard changes" tags. And
111 ensure user can return to the main page.
113 @param CallbackData The BMM context data.
118 IN BMM_CALLBACK_DATA
*CallbackData
122 // Create the "Apply changes" and "Discard changes" tags.
124 if (CallbackData
->BmmAskSaveOrNot
) {
125 HiiCreateSubTitleOpCode (
127 STRING_TOKEN (STR_NULL_STRING
),
133 HiiCreateActionOpCode (
135 KEY_VALUE_SAVE_AND_EXIT
,
136 STRING_TOKEN (STR_SAVE_AND_EXIT
),
137 STRING_TOKEN (STR_NULL_STRING
),
138 EFI_IFR_FLAG_CALLBACK
,
144 // Ensure user can return to the main page.
146 HiiCreateActionOpCode (
148 KEY_VALUE_NO_SAVE_AND_EXIT
,
149 STRING_TOKEN (STR_NO_SAVE_AND_EXIT
),
150 STRING_TOKEN (STR_NULL_STRING
),
151 EFI_IFR_FLAG_CALLBACK
,
156 CallbackData
->BmmHiiHandle
,
158 CallbackData
->BmmCurrentPageId
,
159 mStartOpCodeHandle
, // Label CallbackData->BmmCurrentPageId
160 mEndOpCodeHandle
// LABEL_END
165 Clean up the dynamic opcode at label and form specified by both LabelId.
167 @param LabelId It is both the Form ID and Label ID for opcode deletion.
168 @param CallbackData The BMM context data.
174 IN BMM_CALLBACK_DATA
*CallbackData
177 RefreshUpdateData ();
180 // Remove all op-codes from dynamic page
182 mStartLabel
->Number
= LabelId
;
184 CallbackData
->BmmHiiHandle
,
187 mStartOpCodeHandle
, // Label LabelId
188 mEndOpCodeHandle
// LABEL_END
193 Create a list of Goto Opcode for all terminal devices logged
194 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.
196 @param CallbackData The BMM context data.
200 IN BMM_CALLBACK_DATA
*CallbackData
203 BM_MENU_ENTRY
*NewMenuEntry
;
206 CallbackData
->BmmAskSaveOrNot
= TRUE
;
208 UpdatePageStart (CallbackData
);
210 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
211 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
213 HiiCreateGotoOpCode (
215 FORM_CON_COM_SETUP_ID
,
216 NewMenuEntry
->DisplayStringToken
,
217 STRING_TOKEN (STR_NULL_STRING
),
218 EFI_IFR_FLAG_CALLBACK
,
219 (UINT16
) (TERMINAL_OPTION_OFFSET
+ Index
)
223 UpdatePageEnd (CallbackData
);
228 Create a list of boot option from global BootOptionMenu. It
229 allow user to delete the boot option.
231 @param CallbackData The BMM context data.
236 IN BMM_CALLBACK_DATA
*CallbackData
239 BM_MENU_ENTRY
*NewMenuEntry
;
240 BM_LOAD_CONTEXT
*NewLoadContext
;
243 CallbackData
->BmmAskSaveOrNot
= TRUE
;
245 UpdatePageStart (CallbackData
);
247 ASSERT (BootOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.BootOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.BootOptionDel
[0])));
248 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
249 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
250 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
251 if (NewLoadContext
->IsLegacy
) {
255 NewLoadContext
->Deleted
= FALSE
;
257 if (CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] && !CallbackData
->BmmFakeNvData
.BootOptionDelMark
[Index
]) {
259 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected
260 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has
261 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser
262 // through HiiSetBrowserData function.
264 CallbackData
->BmmFakeNvData
.BootOptionDel
[Index
] = FALSE
;
265 CallbackData
->BmmOldFakeNVData
.BootOptionDel
[Index
] = FALSE
;
268 HiiCreateCheckBoxOpCode (
270 (EFI_QUESTION_ID
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
271 VARSTORE_ID_BOOT_MAINT
,
272 (UINT16
) (BOOT_OPTION_DEL_VAR_OFFSET
+ Index
),
273 NewMenuEntry
->DisplayStringToken
,
274 NewMenuEntry
->HelpStringToken
,
275 EFI_IFR_FLAG_CALLBACK
,
280 UpdatePageEnd (CallbackData
);
284 Create a lit of driver option from global DriverMenu.
286 @param CallbackData The BMM context data.
290 UpdateDrvAddHandlePage (
291 IN BMM_CALLBACK_DATA
*CallbackData
294 BM_MENU_ENTRY
*NewMenuEntry
;
297 CallbackData
->BmmAskSaveOrNot
= FALSE
;
299 UpdatePageStart (CallbackData
);
301 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
302 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
304 HiiCreateGotoOpCode (
306 FORM_DRV_ADD_HANDLE_DESC_ID
,
307 NewMenuEntry
->DisplayStringToken
,
308 STRING_TOKEN (STR_NULL_STRING
),
309 EFI_IFR_FLAG_CALLBACK
,
310 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
)
314 UpdatePageEnd (CallbackData
);
318 Create a lit of driver option from global DriverOptionMenu. It
319 allow user to delete the driver option.
321 @param CallbackData The BMM context data.
326 IN BMM_CALLBACK_DATA
*CallbackData
329 BM_MENU_ENTRY
*NewMenuEntry
;
330 BM_LOAD_CONTEXT
*NewLoadContext
;
333 CallbackData
->BmmAskSaveOrNot
= TRUE
;
335 UpdatePageStart (CallbackData
);
337 ASSERT (DriverOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
[0])));
338 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
339 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
341 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
342 NewLoadContext
->Deleted
= FALSE
;
344 if (CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] && !CallbackData
->BmmFakeNvData
.DriverOptionDelMark
[Index
]) {
346 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected
347 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has
348 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser
349 // through HiiSetBrowserData function.
351 CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] = FALSE
;
352 CallbackData
->BmmOldFakeNVData
.DriverOptionDel
[Index
] = FALSE
;
354 HiiCreateCheckBoxOpCode (
356 (EFI_QUESTION_ID
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
357 VARSTORE_ID_BOOT_MAINT
,
358 (UINT16
) (DRIVER_OPTION_DEL_VAR_OFFSET
+ Index
),
359 NewMenuEntry
->DisplayStringToken
,
360 NewMenuEntry
->HelpStringToken
,
361 EFI_IFR_FLAG_CALLBACK
,
367 UpdatePageEnd (CallbackData
);
371 Prepare the page to allow user to add description for
374 @param CallbackData The BMM context data.
378 UpdateDriverAddHandleDescPage (
379 IN BMM_CALLBACK_DATA
*CallbackData
382 BM_MENU_ENTRY
*NewMenuEntry
;
384 CallbackData
->BmmFakeNvData
.DriverAddActive
= 0x01;
385 CallbackData
->BmmFakeNvData
.DriverAddForceReconnect
= 0x00;
386 CallbackData
->BmmAskSaveOrNot
= TRUE
;
387 NewMenuEntry
= CallbackData
->MenuEntry
;
389 UpdatePageStart (CallbackData
);
391 HiiCreateSubTitleOpCode (
393 NewMenuEntry
->DisplayStringToken
,
399 HiiCreateStringOpCode (
401 (EFI_QUESTION_ID
) DRV_ADD_HANDLE_DESC_QUESTION_ID
,
402 VARSTORE_ID_BOOT_MAINT
,
403 DRV_ADD_HANDLE_DESC_VAR_OFFSET
,
404 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
405 STRING_TOKEN (STR_NULL_STRING
),
413 HiiCreateCheckBoxOpCode (
415 (EFI_QUESTION_ID
) DRV_ADD_RECON_QUESTION_ID
,
416 VARSTORE_ID_BOOT_MAINT
,
417 DRV_ADD_RECON_VAR_OFFSET
,
418 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
419 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
425 HiiCreateStringOpCode (
427 (EFI_QUESTION_ID
) DRIVER_ADD_OPTION_QUESTION_ID
,
428 VARSTORE_ID_BOOT_MAINT
,
429 DRIVER_ADD_OPTION_VAR_OFFSET
,
430 STRING_TOKEN (STR_OPTIONAL_DATA
),
431 STRING_TOKEN (STR_NULL_STRING
),
439 UpdatePageEnd (CallbackData
);
445 @param UpdatePageId The form ID to be updated.
446 @param ConsoleMenu The console menu list.
447 @param CallbackData The BMM context data.
452 IN UINT16 UpdatePageId
,
453 IN BM_MENU_OPTION
*ConsoleMenu
,
454 IN BMM_CALLBACK_DATA
*CallbackData
457 BM_MENU_ENTRY
*NewMenuEntry
;
458 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
459 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
464 EFI_QUESTION_ID QuestionIdBase
;
465 UINT16 VariableOffsetBase
;
467 CallbackData
->BmmAskSaveOrNot
= TRUE
;
469 UpdatePageStart (CallbackData
);
473 VariableOffsetBase
= 0;
475 switch (UpdatePageId
) {
477 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleInCheck
[0];
478 QuestionIdBase
= CON_IN_DEVICE_QUESTION_ID
;
479 VariableOffsetBase
= CON_IN_DEVICE_VAR_OFFSET
;
482 case FORM_CON_OUT_ID
:
483 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleOutCheck
[0];
484 QuestionIdBase
= CON_OUT_DEVICE_QUESTION_ID
;
485 VariableOffsetBase
= CON_OUT_DEVICE_VAR_OFFSET
;
488 case FORM_CON_ERR_ID
:
489 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleErrCheck
[0];
490 QuestionIdBase
= CON_ERR_DEVICE_QUESTION_ID
;
491 VariableOffsetBase
= CON_ERR_DEVICE_VAR_OFFSET
;
494 ASSERT (ConsoleCheck
!= NULL
);
496 for (Index
= 0; ((Index
< ConsoleMenu
->MenuNumber
) && \
497 (Index
< MAX_MENU_NUMBER
)) ; Index
++) {
499 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
500 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
501 if (NewConsoleContext
->IsActive
) {
502 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
503 ConsoleCheck
[Index
] = TRUE
;
505 ConsoleCheck
[Index
] = FALSE
;
507 HiiCreateCheckBoxOpCode (
509 (EFI_QUESTION_ID
) (QuestionIdBase
+ Index
),
510 VARSTORE_ID_BOOT_MAINT
,
511 (UINT16
) (VariableOffsetBase
+ Index
),
512 NewMenuEntry
->DisplayStringToken
,
513 NewMenuEntry
->HelpStringToken
,
514 EFI_IFR_FLAG_CALLBACK
,
520 for (Index2
= 0; ((Index2
< TerminalMenu
.MenuNumber
) && \
521 (Index2
< MAX_MENU_NUMBER
)); Index2
++) {
523 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
524 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
526 ASSERT (Index
< MAX_MENU_NUMBER
);
527 if (((NewTerminalContext
->IsConIn
!= 0) && (UpdatePageId
== FORM_CON_IN_ID
)) ||
528 ((NewTerminalContext
->IsConOut
!= 0) && (UpdatePageId
== FORM_CON_OUT_ID
)) ||
529 ((NewTerminalContext
->IsStdErr
!= 0) && (UpdatePageId
== FORM_CON_ERR_ID
))
531 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
532 ConsoleCheck
[Index
] = TRUE
;
534 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
) {
587 case FORM_BOOT_CHG_ID
:
589 // If the BootOptionOrder in the BmmFakeNvData are same with the date in the BmmOldFakeNVData,
590 // means all Boot Options has been save in BootOptionMenu, we can get the date from the menu.
591 // else means browser maintains some uncommitted date which are not saved in BootOptionMenu,
592 // so we should not get the data from BootOptionMenu to show it.
594 if (CompareMem (CallbackData
->BmmFakeNvData
.BootOptionOrder
, CallbackData
->BmmOldFakeNVData
.BootOptionOrder
, sizeof (CallbackData
->BmmFakeNvData
.BootOptionOrder
)) == 0) {
595 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
);
612 OptionOrder
= CallbackData
->BmmFakeNvData
.DriverOptionOrder
;
613 QuestionId
= DRIVER_OPTION_ORDER_QUESTION_ID
;
614 VarOffset
= DRIVER_OPTION_ORDER_VAR_OFFSET
;
617 ASSERT (OptionOrder
!= NULL
);
619 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
620 ASSERT (OptionsOpCodeHandle
!= NULL
);
623 for (OptionIndex
= 0; (OptionOrder
[OptionIndex
] != 0 && OptionIndex
< MAX_MENU_NUMBER
); OptionIndex
++) {
624 BootOptionFound
= FALSE
;
625 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
626 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
627 if ((UINT32
) (NewMenuEntry
->OptionNumber
+ 1) == OptionOrder
[OptionIndex
]) {
628 BootOptionFound
= TRUE
;
632 if (BootOptionFound
) {
633 HiiCreateOneOfOptionOpCode (
635 NewMenuEntry
->DisplayStringToken
,
637 EFI_IFR_TYPE_NUM_SIZE_32
,
638 OptionOrder
[OptionIndex
]
643 if (OptionMenu
->MenuNumber
> 0) {
644 HiiCreateOrderedListOpCode (
645 mStartOpCodeHandle
, // Container for dynamic created opcodes
646 QuestionId
, // Question ID
647 VARSTORE_ID_BOOT_MAINT
, // VarStore ID
648 VarOffset
, // Offset in Buffer Storage
649 STRING_TOKEN (STR_CHANGE_ORDER
), // Question prompt text
650 STRING_TOKEN (STR_CHANGE_ORDER
), // Question help text
652 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET
653 EFI_IFR_TYPE_NUM_SIZE_32
, // Data type of Question value
654 100, // Maximum container
655 OptionsOpCodeHandle
, // Option Opcode list
656 NULL
// Default Opcode is NULL
660 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
662 UpdatePageEnd (CallbackData
);
667 Refresh the text mode page.
669 @param CallbackData The BMM context data.
674 IN BMM_CALLBACK_DATA
*CallbackData
681 CHAR16 ModeString
[50];
685 EFI_STRING_ID
*ModeToken
;
687 VOID
*OptionsOpCodeHandle
;
688 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
690 ConOut
= gST
->ConOut
;
693 MaxMode
= (UINTN
) (ConOut
->Mode
->MaxMode
);
695 CallbackData
->BmmAskSaveOrNot
= TRUE
;
697 UpdatePageStart (CallbackData
);
702 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
703 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
704 if (EFI_ERROR (Status
)) {
710 if (ValidMode
== 0) {
714 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
715 ASSERT (OptionsOpCodeHandle
!= NULL
);
717 ModeToken
= AllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
718 ASSERT(ModeToken
!= NULL
);
721 // Determin which mode should be the first entry in menu
723 GetConsoleOutMode (CallbackData
);
726 // Build text mode options
728 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
729 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
730 if (EFI_ERROR (Status
)) {
735 // Build mode string Column x Row
737 UnicodeValueToStringS (ModeString
, sizeof (ModeString
), 0, Col
, 0);
738 PStr
= &ModeString
[0];
739 StrnCatS (PStr
, ARRAY_SIZE (ModeString
), L
" x ", StrLen(L
" x ") + 1);
740 PStr
= PStr
+ StrLen (PStr
);
741 UnicodeValueToStringS (
743 sizeof (ModeString
) - ((UINTN
)PStr
- (UINTN
)&ModeString
[0]),
749 ModeToken
[Index
] = HiiSetString (CallbackData
->BmmHiiHandle
, 0, ModeString
, NULL
);
751 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
752 HiiCreateOneOfOptionOpCode (
755 EFI_IFR_OPTION_DEFAULT
,
756 EFI_IFR_TYPE_NUM_SIZE_16
,
760 HiiCreateOneOfOptionOpCode (
764 EFI_IFR_TYPE_NUM_SIZE_16
,
771 HiiCreateOneOfOpCode (
773 (EFI_QUESTION_ID
) CON_MODE_QUESTION_ID
,
774 VARSTORE_ID_BOOT_MAINT
,
776 STRING_TOKEN (STR_CON_MODE_SETUP
),
777 STRING_TOKEN (STR_CON_MODE_SETUP
),
778 EFI_IFR_FLAG_RESET_REQUIRED
,
779 EFI_IFR_NUMERIC_SIZE_2
,
784 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
785 FreePool (ModeToken
);
787 UpdatePageEnd (CallbackData
);
791 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,
792 Parity, Stop Bits, Terminal Type.
794 @param CallbackData The BMM context data.
799 IN BMM_CALLBACK_DATA
*CallbackData
804 BM_MENU_ENTRY
*NewMenuEntry
;
805 VOID
*OptionsOpCodeHandle
;
806 UINTN CurrentTerminal
;
808 CallbackData
->BmmAskSaveOrNot
= TRUE
;
810 UpdatePageStart (CallbackData
);
812 CurrentTerminal
= CallbackData
->CurrentTerminal
;
813 NewMenuEntry
= BOpt_GetMenuEntry (
818 if (NewMenuEntry
== NULL
) {
822 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
823 ASSERT (OptionsOpCodeHandle
!= NULL
);
825 for (Index
= 0; Index
< sizeof (BaudRateList
) / sizeof (BaudRateList
[0]); Index
++) {
827 if (BaudRateList
[Index
].Value
== 115200) {
828 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
830 HiiCreateOneOfOptionOpCode (
832 BaudRateList
[Index
].StringToken
,
834 EFI_IFR_TYPE_NUM_SIZE_8
,
839 HiiCreateOneOfOpCode (
841 (EFI_QUESTION_ID
) (COM_BAUD_RATE_QUESTION_ID
+ CurrentTerminal
),
842 VARSTORE_ID_BOOT_MAINT
,
843 (UINT16
) (COM_BAUD_RATE_VAR_OFFSET
+ CurrentTerminal
),
844 STRING_TOKEN (STR_COM_BAUD_RATE
),
845 STRING_TOKEN (STR_COM_BAUD_RATE
),
846 EFI_IFR_FLAG_CALLBACK
,
847 EFI_IFR_NUMERIC_SIZE_1
,
852 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
853 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
854 ASSERT (OptionsOpCodeHandle
!= NULL
);
856 for (Index
= 0; Index
< ARRAY_SIZE (DataBitsList
); Index
++) {
859 if (DataBitsList
[Index
].Value
== 8) {
860 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
863 HiiCreateOneOfOptionOpCode (
865 DataBitsList
[Index
].StringToken
,
867 EFI_IFR_TYPE_NUM_SIZE_8
,
872 HiiCreateOneOfOpCode (
874 (EFI_QUESTION_ID
) (COM_DATA_RATE_QUESTION_ID
+ CurrentTerminal
),
875 VARSTORE_ID_BOOT_MAINT
,
876 (UINT16
) (COM_DATA_RATE_VAR_OFFSET
+ CurrentTerminal
),
877 STRING_TOKEN (STR_COM_DATA_BITS
),
878 STRING_TOKEN (STR_COM_DATA_BITS
),
879 EFI_IFR_FLAG_CALLBACK
,
880 EFI_IFR_NUMERIC_SIZE_1
,
885 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
886 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
887 ASSERT (OptionsOpCodeHandle
!= NULL
);
889 for (Index
= 0; Index
< ARRAY_SIZE (ParityList
); Index
++) {
891 if (ParityList
[Index
].Value
== NoParity
) {
892 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
895 HiiCreateOneOfOptionOpCode (
897 ParityList
[Index
].StringToken
,
899 EFI_IFR_TYPE_NUM_SIZE_8
,
904 HiiCreateOneOfOpCode (
906 (EFI_QUESTION_ID
) (COM_PARITY_QUESTION_ID
+ CurrentTerminal
),
907 VARSTORE_ID_BOOT_MAINT
,
908 (UINT16
) (COM_PARITY_VAR_OFFSET
+ CurrentTerminal
),
909 STRING_TOKEN (STR_COM_PARITY
),
910 STRING_TOKEN (STR_COM_PARITY
),
911 EFI_IFR_FLAG_CALLBACK
,
912 EFI_IFR_NUMERIC_SIZE_1
,
917 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
918 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
919 ASSERT (OptionsOpCodeHandle
!= NULL
);
921 for (Index
= 0; Index
< ARRAY_SIZE (StopBitsList
); Index
++) {
923 if (StopBitsList
[Index
].Value
== OneStopBit
) {
924 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
927 HiiCreateOneOfOptionOpCode (
929 StopBitsList
[Index
].StringToken
,
931 EFI_IFR_TYPE_NUM_SIZE_8
,
936 HiiCreateOneOfOpCode (
938 (EFI_QUESTION_ID
) (COM_STOP_BITS_QUESTION_ID
+ CurrentTerminal
),
939 VARSTORE_ID_BOOT_MAINT
,
940 (UINT16
) (COM_STOP_BITS_VAR_OFFSET
+ CurrentTerminal
),
941 STRING_TOKEN (STR_COM_STOP_BITS
),
942 STRING_TOKEN (STR_COM_STOP_BITS
),
943 EFI_IFR_FLAG_CALLBACK
,
944 EFI_IFR_NUMERIC_SIZE_1
,
949 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
950 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
951 ASSERT (OptionsOpCodeHandle
!= NULL
);
953 for (Index
= 0; Index
< ARRAY_SIZE (TerminalType
); Index
++) {
956 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
959 HiiCreateOneOfOptionOpCode (
961 (EFI_STRING_ID
) TerminalType
[Index
],
963 EFI_IFR_TYPE_NUM_SIZE_8
,
968 HiiCreateOneOfOpCode (
970 (EFI_QUESTION_ID
) (COM_TERMINAL_QUESTION_ID
+ CurrentTerminal
),
971 VARSTORE_ID_BOOT_MAINT
,
972 (UINT16
) (COM_TERMINAL_VAR_OFFSET
+ CurrentTerminal
),
973 STRING_TOKEN (STR_COM_TERMI_TYPE
),
974 STRING_TOKEN (STR_COM_TERMI_TYPE
),
975 EFI_IFR_FLAG_CALLBACK
,
976 EFI_IFR_NUMERIC_SIZE_1
,
981 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
982 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
983 ASSERT (OptionsOpCodeHandle
!= NULL
);
985 for (Index
= 0; Index
< ARRAY_SIZE (mFlowControlType
); Index
++) {
988 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
990 HiiCreateOneOfOptionOpCode (
992 (EFI_STRING_ID
) mFlowControlType
[Index
],
994 EFI_IFR_TYPE_NUM_SIZE_8
,
995 mFlowControlValue
[Index
]
999 HiiCreateOneOfOpCode (
1001 (EFI_QUESTION_ID
) (COM_FLOWCONTROL_QUESTION_ID
+ CurrentTerminal
),
1002 VARSTORE_ID_BOOT_MAINT
,
1003 (UINT16
) (COM_FLOWCONTROL_VAR_OFFSET
+ CurrentTerminal
),
1004 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
1005 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
1006 EFI_IFR_FLAG_CALLBACK
,
1007 EFI_IFR_NUMERIC_SIZE_1
,
1008 OptionsOpCodeHandle
,
1012 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1014 UpdatePageEnd (CallbackData
);
1018 Update add boot/driver option page.
1020 @param CallbackData The BMM context data.
1021 @param FormId The form ID to be updated.
1022 @param DevicePath Device path.
1027 IN BMM_CALLBACK_DATA
*CallbackData
,
1028 IN EFI_FORM_ID FormId
,
1029 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
1033 EFI_STRING_ID StringToken
;
1037 if (DevicePath
!= NULL
){
1038 String
= ExtractFileNameFromDevicePath(DevicePath
);
1040 if (String
== NULL
) {
1041 String
= HiiGetString (CallbackData
->BmmHiiHandle
, STRING_TOKEN (STR_NULL_STRING
), NULL
);
1042 ASSERT (String
!= NULL
);
1045 StringToken
= HiiSetString (CallbackData
->BmmHiiHandle
, 0, String
, NULL
);
1048 if(FormId
== FORM_BOOT_ADD_ID
){
1049 if (!CallbackData
->BmmFakeNvData
.BootOptionChanged
) {
1050 ZeroMem (CallbackData
->BmmFakeNvData
.BootOptionalData
, sizeof (CallbackData
->BmmFakeNvData
.BootOptionalData
));
1051 ZeroMem (CallbackData
->BmmFakeNvData
.BootDescriptionData
, sizeof (CallbackData
->BmmFakeNvData
.BootDescriptionData
));
1052 ZeroMem (CallbackData
->BmmOldFakeNVData
.BootOptionalData
, sizeof (CallbackData
->BmmOldFakeNVData
.BootOptionalData
));
1053 ZeroMem (CallbackData
->BmmOldFakeNVData
.BootDescriptionData
, sizeof (CallbackData
->BmmOldFakeNVData
.BootDescriptionData
));
1055 } else if (FormId
== FORM_DRV_ADD_FILE_ID
){
1056 if (!CallbackData
->BmmFakeNvData
.DriverOptionChanged
) {
1057 ZeroMem (CallbackData
->BmmFakeNvData
.DriverOptionalData
, sizeof (CallbackData
->BmmFakeNvData
.DriverOptionalData
));
1058 ZeroMem (CallbackData
->BmmFakeNvData
.DriverDescriptionData
, sizeof (CallbackData
->BmmFakeNvData
.DriverDescriptionData
));
1059 ZeroMem (CallbackData
->BmmOldFakeNVData
.DriverOptionalData
, sizeof (CallbackData
->BmmOldFakeNVData
.DriverOptionalData
));
1060 ZeroMem (CallbackData
->BmmOldFakeNVData
.DriverDescriptionData
, sizeof (CallbackData
->BmmOldFakeNVData
.DriverDescriptionData
));
1064 RefreshUpdateData();
1065 mStartLabel
->Number
= FormId
;
1067 HiiCreateSubTitleOpCode (
1076 CallbackData
->BmmHiiHandle
,
1079 mStartOpCodeHandle
,// Label FormId
1080 mEndOpCodeHandle
// LABEL_END
1085 Dispatch the correct update page function to call based on
1088 @param UpdatePageId The form ID.
1089 @param CallbackData The BMM context data.
1094 IN UINT16 UpdatePageId
,
1095 IN BMM_CALLBACK_DATA
*CallbackData
1098 CleanUpPage (UpdatePageId
, CallbackData
);
1099 switch (UpdatePageId
) {
1100 case FORM_CON_IN_ID
:
1101 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
1104 case FORM_CON_OUT_ID
:
1105 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
1108 case FORM_CON_ERR_ID
:
1109 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
1112 case FORM_BOOT_CHG_ID
:
1113 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
1116 case FORM_DRV_CHG_ID
:
1117 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
1126 Dispatch the display to the next page based on NewPageId.
1128 @param Private The BMM context data.
1129 @param NewPageId The original page ID.
1134 BMM_CALLBACK_DATA
*Private
,
1138 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1140 // If we select a handle to add driver option, advance to the add handle description page.
1142 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1143 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1145 // Return to main page after "Save Changes" or "Discard Changes".
1147 NewPageId
= FORM_MAIN_ID
;
1148 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1149 NewPageId
= FORM_CON_COM_SETUP_ID
;
1152 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1153 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1154 Private
->BmmCurrentPageId
= NewPageId
;