2 Dynamically update the pages.
4 Copyright (c) 2004 - 2015, 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
;
267 HiiCreateCheckBoxOpCode (
269 (EFI_QUESTION_ID
) (BOOT_OPTION_DEL_QUESTION_ID
+ Index
),
270 VARSTORE_ID_BOOT_MAINT
,
271 (UINT16
) (BOOT_OPTION_DEL_VAR_OFFSET
+ Index
),
272 NewMenuEntry
->DisplayStringToken
,
273 NewMenuEntry
->HelpStringToken
,
274 EFI_IFR_FLAG_CALLBACK
,
279 UpdatePageEnd (CallbackData
);
283 Create a lit of driver option from global DriverMenu.
285 @param CallbackData The BMM context data.
289 UpdateDrvAddHandlePage (
290 IN BMM_CALLBACK_DATA
*CallbackData
293 BM_MENU_ENTRY
*NewMenuEntry
;
296 CallbackData
->BmmAskSaveOrNot
= FALSE
;
298 UpdatePageStart (CallbackData
);
300 for (Index
= 0; Index
< DriverMenu
.MenuNumber
; Index
++) {
301 NewMenuEntry
= BOpt_GetMenuEntry (&DriverMenu
, Index
);
303 HiiCreateGotoOpCode (
305 FORM_DRV_ADD_HANDLE_DESC_ID
,
306 NewMenuEntry
->DisplayStringToken
,
307 STRING_TOKEN (STR_NULL_STRING
),
308 EFI_IFR_FLAG_CALLBACK
,
309 (UINT16
) (HANDLE_OPTION_OFFSET
+ Index
)
313 UpdatePageEnd (CallbackData
);
317 Create a lit of driver option from global DriverOptionMenu. It
318 allow user to delete the driver option.
320 @param CallbackData The BMM context data.
325 IN BMM_CALLBACK_DATA
*CallbackData
328 BM_MENU_ENTRY
*NewMenuEntry
;
329 BM_LOAD_CONTEXT
*NewLoadContext
;
332 CallbackData
->BmmAskSaveOrNot
= TRUE
;
334 UpdatePageStart (CallbackData
);
336 ASSERT (DriverOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
) / sizeof (CallbackData
->BmmFakeNvData
.DriverOptionDel
[0])));
337 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
338 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, Index
);
340 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
341 NewLoadContext
->Deleted
= FALSE
;
343 if (CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] && !CallbackData
->BmmFakeNvData
.DriverOptionDelMark
[Index
]) {
345 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected
346 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has
347 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser
348 // through HiiSetBrowserData function.
350 CallbackData
->BmmFakeNvData
.DriverOptionDel
[Index
] = FALSE
;
352 HiiCreateCheckBoxOpCode (
354 (EFI_QUESTION_ID
) (DRIVER_OPTION_DEL_QUESTION_ID
+ Index
),
355 VARSTORE_ID_BOOT_MAINT
,
356 (UINT16
) (DRIVER_OPTION_DEL_VAR_OFFSET
+ Index
),
357 NewMenuEntry
->DisplayStringToken
,
358 NewMenuEntry
->HelpStringToken
,
359 EFI_IFR_FLAG_CALLBACK
,
365 UpdatePageEnd (CallbackData
);
369 Prepare the page to allow user to add description for
372 @param CallbackData The BMM context data.
376 UpdateDriverAddHandleDescPage (
377 IN BMM_CALLBACK_DATA
*CallbackData
380 BM_MENU_ENTRY
*NewMenuEntry
;
382 CallbackData
->BmmFakeNvData
.DriverAddActive
= 0x01;
383 CallbackData
->BmmFakeNvData
.DriverAddForceReconnect
= 0x00;
384 CallbackData
->BmmAskSaveOrNot
= TRUE
;
385 NewMenuEntry
= CallbackData
->MenuEntry
;
387 UpdatePageStart (CallbackData
);
389 HiiCreateSubTitleOpCode (
391 NewMenuEntry
->DisplayStringToken
,
397 HiiCreateStringOpCode (
399 (EFI_QUESTION_ID
) DRV_ADD_HANDLE_DESC_QUESTION_ID
,
400 VARSTORE_ID_BOOT_MAINT
,
401 DRV_ADD_HANDLE_DESC_VAR_OFFSET
,
402 STRING_TOKEN (STR_LOAD_OPTION_DESC
),
403 STRING_TOKEN (STR_NULL_STRING
),
411 HiiCreateCheckBoxOpCode (
413 (EFI_QUESTION_ID
) DRV_ADD_RECON_QUESTION_ID
,
414 VARSTORE_ID_BOOT_MAINT
,
415 DRV_ADD_RECON_VAR_OFFSET
,
416 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
417 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON
),
423 HiiCreateStringOpCode (
425 (EFI_QUESTION_ID
) DRIVER_ADD_OPTION_QUESTION_ID
,
426 VARSTORE_ID_BOOT_MAINT
,
427 DRIVER_ADD_OPTION_VAR_OFFSET
,
428 STRING_TOKEN (STR_OPTIONAL_DATA
),
429 STRING_TOKEN (STR_NULL_STRING
),
437 UpdatePageEnd (CallbackData
);
443 @param UpdatePageId The form ID to be updated.
444 @param ConsoleMenu The console menu list.
445 @param CallbackData The BMM context data.
450 IN UINT16 UpdatePageId
,
451 IN BM_MENU_OPTION
*ConsoleMenu
,
452 IN BMM_CALLBACK_DATA
*CallbackData
455 BM_MENU_ENTRY
*NewMenuEntry
;
456 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
457 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
462 UINT8
*OldConsoleCheck
;
463 UINTN ConsoleCheckSize
;
464 EFI_QUESTION_ID QuestionIdBase
;
465 UINT16 VariableOffsetBase
;
467 CallbackData
->BmmAskSaveOrNot
= TRUE
;
469 UpdatePageStart (CallbackData
);
472 OldConsoleCheck
= NULL
;
474 VariableOffsetBase
= 0;
475 ConsoleCheckSize
= 0;
477 switch (UpdatePageId
) {
479 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleInCheck
[0];
480 OldConsoleCheck
= &CallbackData
->BmmOldFakeNVData
.ConsoleInCheck
[0];
481 ConsoleCheckSize
= sizeof (CallbackData
->BmmFakeNvData
.ConsoleInCheck
);
482 QuestionIdBase
= CON_IN_DEVICE_QUESTION_ID
;
483 VariableOffsetBase
= CON_IN_DEVICE_VAR_OFFSET
;
486 case FORM_CON_OUT_ID
:
487 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleOutCheck
[0];
488 OldConsoleCheck
= &CallbackData
->BmmOldFakeNVData
.ConsoleOutCheck
[0];
489 ConsoleCheckSize
= sizeof (CallbackData
->BmmFakeNvData
.ConsoleOutCheck
);
490 QuestionIdBase
= CON_OUT_DEVICE_QUESTION_ID
;
491 VariableOffsetBase
= CON_OUT_DEVICE_VAR_OFFSET
;
494 case FORM_CON_ERR_ID
:
495 ConsoleCheck
= &CallbackData
->BmmFakeNvData
.ConsoleErrCheck
[0];
496 OldConsoleCheck
= &CallbackData
->BmmOldFakeNVData
.ConsoleErrCheck
[0];
497 ConsoleCheckSize
= sizeof (CallbackData
->BmmFakeNvData
.ConsoleErrCheck
);
498 QuestionIdBase
= CON_ERR_DEVICE_QUESTION_ID
;
499 VariableOffsetBase
= CON_ERR_DEVICE_VAR_OFFSET
;
502 ASSERT (ConsoleCheck
!= NULL
);
504 for (Index
= 0; ((Index
< ConsoleMenu
->MenuNumber
) && \
505 (Index
< MAX_MENU_NUMBER
)) ; Index
++) {
507 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
508 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
509 if (NewConsoleContext
->IsActive
) {
510 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
511 ConsoleCheck
[Index
] = TRUE
;
513 ConsoleCheck
[Index
] = FALSE
;
515 HiiCreateCheckBoxOpCode (
517 (EFI_QUESTION_ID
) (QuestionIdBase
+ Index
),
518 VARSTORE_ID_BOOT_MAINT
,
519 (UINT16
) (VariableOffsetBase
+ Index
),
520 NewMenuEntry
->DisplayStringToken
,
521 NewMenuEntry
->HelpStringToken
,
528 for (Index2
= 0; ((Index2
< TerminalMenu
.MenuNumber
) && \
529 (Index2
< MAX_MENU_NUMBER
)); Index2
++) {
531 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index2
);
532 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
534 ASSERT (Index
< MAX_MENU_NUMBER
);
535 if (((NewTerminalContext
->IsConIn
!= 0) && (UpdatePageId
== FORM_CON_IN_ID
)) ||
536 ((NewTerminalContext
->IsConOut
!= 0) && (UpdatePageId
== FORM_CON_OUT_ID
)) ||
537 ((NewTerminalContext
->IsStdErr
!= 0) && (UpdatePageId
== FORM_CON_ERR_ID
))
539 CheckFlags
|= EFI_IFR_CHECKBOX_DEFAULT
;
540 ConsoleCheck
[Index
] = TRUE
;
542 ConsoleCheck
[Index
] = FALSE
;
544 HiiCreateCheckBoxOpCode (
546 (EFI_QUESTION_ID
) (QuestionIdBase
+ Index
),
547 VARSTORE_ID_BOOT_MAINT
,
548 (UINT16
) (VariableOffsetBase
+ Index
),
549 NewMenuEntry
->DisplayStringToken
,
550 NewMenuEntry
->HelpStringToken
,
559 CopyMem (OldConsoleCheck
, ConsoleCheck
, ConsoleCheckSize
);
561 UpdatePageEnd (CallbackData
);
565 Update the page's NV Map if user has changed the order
566 a list. This list can be Boot Order or Driver Order.
568 @param UpdatePageId The form ID to be updated.
569 @param OptionMenu The new list.
570 @param CallbackData The BMM context data.
575 IN UINT16 UpdatePageId
,
576 IN BM_MENU_OPTION
*OptionMenu
,
577 IN BMM_CALLBACK_DATA
*CallbackData
580 BM_MENU_ENTRY
*NewMenuEntry
;
583 VOID
*OptionsOpCodeHandle
;
584 BM_LOAD_CONTEXT
*NewLoadContext
;
585 BOOLEAN BootOptionFound
;
587 EFI_QUESTION_ID QuestionId
;
590 CallbackData
->BmmAskSaveOrNot
= TRUE
;
591 UpdatePageStart (CallbackData
);
596 switch (UpdatePageId
) {
598 case FORM_BOOT_CHG_ID
:
599 GetBootOrder (CallbackData
);
600 OptionOrder
= CallbackData
->BmmFakeNvData
.BootOptionOrder
;
601 QuestionId
= BOOT_OPTION_ORDER_QUESTION_ID
;
602 VarOffset
= BOOT_OPTION_ORDER_VAR_OFFSET
;
605 case FORM_DRV_CHG_ID
:
606 GetDriverOrder (CallbackData
);
607 OptionOrder
= CallbackData
->BmmFakeNvData
.DriverOptionOrder
;
608 QuestionId
= DRIVER_OPTION_ORDER_QUESTION_ID
;
609 VarOffset
= DRIVER_OPTION_ORDER_VAR_OFFSET
;
612 ASSERT (OptionOrder
!= NULL
);
614 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
615 ASSERT (OptionsOpCodeHandle
!= NULL
);
618 for (OptionIndex
= 0; (OptionOrder
[OptionIndex
] != 0 && OptionIndex
< MAX_MENU_NUMBER
); OptionIndex
++) {
619 BootOptionFound
= FALSE
;
620 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
621 NewMenuEntry
= BOpt_GetMenuEntry (OptionMenu
, Index
);
622 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
623 if ((UINT32
) (NewMenuEntry
->OptionNumber
+ 1) == OptionOrder
[OptionIndex
]) {
624 BootOptionFound
= TRUE
;
628 if (BootOptionFound
) {
629 HiiCreateOneOfOptionOpCode (
631 NewMenuEntry
->DisplayStringToken
,
633 EFI_IFR_TYPE_NUM_SIZE_32
,
634 OptionOrder
[OptionIndex
]
639 if (OptionMenu
->MenuNumber
> 0) {
640 HiiCreateOrderedListOpCode (
641 mStartOpCodeHandle
, // Container for dynamic created opcodes
642 QuestionId
, // Question ID
643 VARSTORE_ID_BOOT_MAINT
, // VarStore ID
644 VarOffset
, // Offset in Buffer Storage
645 STRING_TOKEN (STR_CHANGE_ORDER
), // Question prompt text
646 STRING_TOKEN (STR_CHANGE_ORDER
), // Question help text
648 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET
649 EFI_IFR_TYPE_NUM_SIZE_32
, // Data type of Question value
650 100, // Maximum container
651 OptionsOpCodeHandle
, // Option Opcode list
652 NULL
// Default Opcode is NULL
656 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
658 UpdatePageEnd (CallbackData
);
663 Create the dynamic page to allow user to set
664 the "BootNext" value.
666 @param CallbackData The BMM context data.
671 IN BMM_CALLBACK_DATA
*CallbackData
674 BM_MENU_ENTRY
*NewMenuEntry
;
675 BM_LOAD_CONTEXT
*NewLoadContext
;
676 UINTN NumberOfOptions
;
678 VOID
*OptionsOpCodeHandle
;
680 NumberOfOptions
= BootOptionMenu
.MenuNumber
;
681 CallbackData
->BmmAskSaveOrNot
= TRUE
;
683 UpdatePageStart (CallbackData
);
685 if (NumberOfOptions
> 0) {
686 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
687 ASSERT (OptionsOpCodeHandle
!= NULL
);
689 CallbackData
->BmmFakeNvData
.BootNext
= NONE_BOOTNEXT_VALUE
;
691 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
692 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
693 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
695 if (NewLoadContext
->IsBootNext
) {
696 HiiCreateOneOfOptionOpCode (
698 NewMenuEntry
->DisplayStringToken
,
699 EFI_IFR_OPTION_DEFAULT
,
700 EFI_IFR_TYPE_NUM_SIZE_32
,
703 CallbackData
->BmmFakeNvData
.BootNext
= Index
;
705 HiiCreateOneOfOptionOpCode (
707 NewMenuEntry
->DisplayStringToken
,
709 EFI_IFR_TYPE_NUM_SIZE_32
,
715 if (CallbackData
->BmmFakeNvData
.BootNext
== NONE_BOOTNEXT_VALUE
) {
716 HiiCreateOneOfOptionOpCode (
718 STRING_TOKEN (STR_NONE
),
719 EFI_IFR_OPTION_DEFAULT
,
720 EFI_IFR_TYPE_NUM_SIZE_32
,
724 HiiCreateOneOfOptionOpCode (
726 STRING_TOKEN (STR_NONE
),
728 EFI_IFR_TYPE_NUM_SIZE_32
,
733 HiiCreateOneOfOpCode (
735 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
736 VARSTORE_ID_BOOT_MAINT
,
737 BOOT_NEXT_VAR_OFFSET
,
738 STRING_TOKEN (STR_BOOT_NEXT
),
739 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
741 EFI_IFR_NUMERIC_SIZE_4
,
746 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
749 UpdatePageEnd (CallbackData
);
753 Create the dynamic page to allow user to set the "TimeOut" value.
755 @param CallbackData The BMM context data.
760 IN BMM_CALLBACK_DATA
*CallbackData
763 VOID
*DefaultOpCodeHandle
;
765 CallbackData
->BmmAskSaveOrNot
= TRUE
;
767 UpdatePageStart (CallbackData
);
769 DefaultOpCodeHandle
= HiiAllocateOpCodeHandle ();
770 ASSERT (DefaultOpCodeHandle
!= NULL
);
771 HiiCreateDefaultOpCode (DefaultOpCodeHandle
, EFI_HII_DEFAULT_CLASS_STANDARD
, EFI_IFR_TYPE_NUM_SIZE_16
, CallbackData
->BmmFakeNvData
.BootTimeOut
);
773 HiiCreateNumericOpCode (
775 (EFI_QUESTION_ID
) BOOT_TIME_OUT_QUESTION_ID
,
776 VARSTORE_ID_BOOT_MAINT
,
777 BOOT_TIME_OUT_VAR_OFFSET
,
778 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
779 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
781 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
788 HiiFreeOpCodeHandle (DefaultOpCodeHandle
);
790 UpdatePageEnd (CallbackData
);
795 Refresh the text mode page.
797 @param CallbackData The BMM context data.
802 IN BMM_CALLBACK_DATA
*CallbackData
809 CHAR16 ModeString
[50];
813 EFI_STRING_ID
*ModeToken
;
815 VOID
*OptionsOpCodeHandle
;
816 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*ConOut
;
818 ConOut
= gST
->ConOut
;
821 MaxMode
= (UINTN
) (ConOut
->Mode
->MaxMode
);
823 CallbackData
->BmmAskSaveOrNot
= TRUE
;
825 UpdatePageStart (CallbackData
);
830 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
831 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
832 if (EFI_ERROR (Status
)) {
838 if (ValidMode
== 0) {
842 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
843 ASSERT (OptionsOpCodeHandle
!= NULL
);
845 ModeToken
= AllocateZeroPool (sizeof (EFI_STRING_ID
) * ValidMode
);
846 ASSERT(ModeToken
!= NULL
);
849 // Determin which mode should be the first entry in menu
851 GetConsoleOutMode (CallbackData
);
854 // Build text mode options
856 for (Mode
= 0; Mode
< MaxMode
; Mode
++) {
857 Status
= ConOut
->QueryMode (ConOut
, Mode
, &Col
, &Row
);
858 if (EFI_ERROR (Status
)) {
863 // Build mode string Column x Row
865 UnicodeValueToString (ModeString
, 0, Col
, 0);
866 PStr
= &ModeString
[0];
867 StrnCatS (PStr
, sizeof (ModeString
) / sizeof (ModeString
[0]), L
" x ", StrLen(L
" x ") + 1);
868 PStr
= PStr
+ StrLen (PStr
);
869 UnicodeValueToString (PStr
, 0, Row
, 0);
871 ModeToken
[Index
] = HiiSetString (CallbackData
->BmmHiiHandle
, 0, ModeString
, NULL
);
873 if (Mode
== CallbackData
->BmmFakeNvData
.ConsoleOutMode
) {
874 HiiCreateOneOfOptionOpCode (
877 EFI_IFR_OPTION_DEFAULT
,
878 EFI_IFR_TYPE_NUM_SIZE_16
,
882 HiiCreateOneOfOptionOpCode (
886 EFI_IFR_TYPE_NUM_SIZE_16
,
893 HiiCreateOneOfOpCode (
895 (EFI_QUESTION_ID
) CON_MODE_QUESTION_ID
,
896 VARSTORE_ID_BOOT_MAINT
,
898 STRING_TOKEN (STR_CON_MODE_SETUP
),
899 STRING_TOKEN (STR_CON_MODE_SETUP
),
900 EFI_IFR_FLAG_RESET_REQUIRED
,
901 EFI_IFR_NUMERIC_SIZE_2
,
906 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
907 FreePool (ModeToken
);
909 UpdatePageEnd (CallbackData
);
913 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,
914 Parity, Stop Bits, Terminal Type.
916 @param CallbackData The BMM context data.
921 IN BMM_CALLBACK_DATA
*CallbackData
926 BM_MENU_ENTRY
*NewMenuEntry
;
927 VOID
*OptionsOpCodeHandle
;
928 UINTN CurrentTerminal
;
930 CallbackData
->BmmAskSaveOrNot
= TRUE
;
932 UpdatePageStart (CallbackData
);
934 CurrentTerminal
= CallbackData
->CurrentTerminal
;
935 NewMenuEntry
= BOpt_GetMenuEntry (
940 if (NewMenuEntry
== NULL
) {
944 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
945 ASSERT (OptionsOpCodeHandle
!= NULL
);
947 for (Index
= 0; Index
< sizeof (BaudRateList
) / sizeof (BaudRateList
[0]); Index
++) {
949 if (BaudRateList
[Index
].Value
== 115200) {
950 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
952 HiiCreateOneOfOptionOpCode (
954 BaudRateList
[Index
].StringToken
,
956 EFI_IFR_TYPE_NUM_SIZE_8
,
961 HiiCreateOneOfOpCode (
963 (EFI_QUESTION_ID
) (COM_BAUD_RATE_QUESTION_ID
+ CurrentTerminal
),
964 VARSTORE_ID_BOOT_MAINT
,
965 (UINT16
) (COM_BAUD_RATE_VAR_OFFSET
+ CurrentTerminal
),
966 STRING_TOKEN (STR_COM_BAUD_RATE
),
967 STRING_TOKEN (STR_COM_BAUD_RATE
),
969 EFI_IFR_NUMERIC_SIZE_1
,
974 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
975 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
976 ASSERT (OptionsOpCodeHandle
!= NULL
);
978 for (Index
= 0; Index
< sizeof (DataBitsList
) / sizeof (DataBitsList
[0]); Index
++) {
981 if (DataBitsList
[Index
].Value
== 8) {
982 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
985 HiiCreateOneOfOptionOpCode (
987 DataBitsList
[Index
].StringToken
,
989 EFI_IFR_TYPE_NUM_SIZE_8
,
994 HiiCreateOneOfOpCode (
996 (EFI_QUESTION_ID
) (COM_DATA_RATE_QUESTION_ID
+ CurrentTerminal
),
997 VARSTORE_ID_BOOT_MAINT
,
998 (UINT16
) (COM_DATA_RATE_VAR_OFFSET
+ CurrentTerminal
),
999 STRING_TOKEN (STR_COM_DATA_BITS
),
1000 STRING_TOKEN (STR_COM_DATA_BITS
),
1002 EFI_IFR_NUMERIC_SIZE_1
,
1003 OptionsOpCodeHandle
,
1007 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1008 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1009 ASSERT (OptionsOpCodeHandle
!= NULL
);
1011 for (Index
= 0; Index
< sizeof (ParityList
) / sizeof (ParityList
[0]); Index
++) {
1013 if (ParityList
[Index
].Value
== NoParity
) {
1014 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1017 HiiCreateOneOfOptionOpCode (
1018 OptionsOpCodeHandle
,
1019 ParityList
[Index
].StringToken
,
1021 EFI_IFR_TYPE_NUM_SIZE_8
,
1026 HiiCreateOneOfOpCode (
1028 (EFI_QUESTION_ID
) (COM_PARITY_QUESTION_ID
+ CurrentTerminal
),
1029 VARSTORE_ID_BOOT_MAINT
,
1030 (UINT16
) (COM_PARITY_VAR_OFFSET
+ CurrentTerminal
),
1031 STRING_TOKEN (STR_COM_PARITY
),
1032 STRING_TOKEN (STR_COM_PARITY
),
1034 EFI_IFR_NUMERIC_SIZE_1
,
1035 OptionsOpCodeHandle
,
1039 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1040 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1041 ASSERT (OptionsOpCodeHandle
!= NULL
);
1043 for (Index
= 0; Index
< sizeof (StopBitsList
) / sizeof (StopBitsList
[0]); Index
++) {
1045 if (StopBitsList
[Index
].Value
== OneStopBit
) {
1046 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1049 HiiCreateOneOfOptionOpCode (
1050 OptionsOpCodeHandle
,
1051 StopBitsList
[Index
].StringToken
,
1053 EFI_IFR_TYPE_NUM_SIZE_8
,
1058 HiiCreateOneOfOpCode (
1060 (EFI_QUESTION_ID
) (COM_STOP_BITS_QUESTION_ID
+ CurrentTerminal
),
1061 VARSTORE_ID_BOOT_MAINT
,
1062 (UINT16
) (COM_STOP_BITS_VAR_OFFSET
+ CurrentTerminal
),
1063 STRING_TOKEN (STR_COM_STOP_BITS
),
1064 STRING_TOKEN (STR_COM_STOP_BITS
),
1066 EFI_IFR_NUMERIC_SIZE_1
,
1067 OptionsOpCodeHandle
,
1071 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1072 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1073 ASSERT (OptionsOpCodeHandle
!= NULL
);
1075 for (Index
= 0; Index
< sizeof (TerminalType
) / sizeof (TerminalType
[0]); Index
++) {
1078 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1081 HiiCreateOneOfOptionOpCode (
1082 OptionsOpCodeHandle
,
1083 (EFI_STRING_ID
) TerminalType
[Index
],
1085 EFI_IFR_TYPE_NUM_SIZE_8
,
1090 HiiCreateOneOfOpCode (
1092 (EFI_QUESTION_ID
) (COM_TERMINAL_QUESTION_ID
+ CurrentTerminal
),
1093 VARSTORE_ID_BOOT_MAINT
,
1094 (UINT16
) (COM_TERMINAL_VAR_OFFSET
+ CurrentTerminal
),
1095 STRING_TOKEN (STR_COM_TERMI_TYPE
),
1096 STRING_TOKEN (STR_COM_TERMI_TYPE
),
1098 EFI_IFR_NUMERIC_SIZE_1
,
1099 OptionsOpCodeHandle
,
1103 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1104 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
1105 ASSERT (OptionsOpCodeHandle
!= NULL
);
1107 for (Index
= 0; Index
< sizeof (mFlowControlType
) / sizeof (mFlowControlType
[0]); Index
++) {
1110 CheckFlags
|= EFI_IFR_OPTION_DEFAULT
;
1112 HiiCreateOneOfOptionOpCode (
1113 OptionsOpCodeHandle
,
1114 (EFI_STRING_ID
) mFlowControlType
[Index
],
1116 EFI_IFR_TYPE_NUM_SIZE_8
,
1117 mFlowControlValue
[Index
]
1121 HiiCreateOneOfOpCode (
1123 (EFI_QUESTION_ID
) (COM_FLOWCONTROL_QUESTION_ID
+ CurrentTerminal
),
1124 VARSTORE_ID_BOOT_MAINT
,
1125 (UINT16
) (COM_FLOWCONTROL_VAR_OFFSET
+ CurrentTerminal
),
1126 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
1127 STRING_TOKEN (STR_COM_FLOW_CONTROL
),
1129 EFI_IFR_NUMERIC_SIZE_1
,
1130 OptionsOpCodeHandle
,
1134 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
1136 UpdatePageEnd (CallbackData
);
1140 Update add boot/driver option page.
1142 @param CallbackData The BMM context data.
1143 @param FormId The form ID to be updated.
1144 @param DevicePath Device path.
1149 IN BMM_CALLBACK_DATA
*CallbackData
,
1150 IN EFI_FORM_ID FormId
,
1151 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
1155 EFI_STRING_ID StringToken
;
1157 if (DevicePath
!= NULL
){
1158 String
= ExtractFileNameFromDevicePath(DevicePath
);
1159 StringToken
= HiiSetString (CallbackData
->BmmHiiHandle
, 0, String
, NULL
);
1162 String
= HiiGetString (CallbackData
->BmmHiiHandle
, STRING_TOKEN (STR_NULL_STRING
), NULL
);
1163 ASSERT (String
!= NULL
);
1164 StringToken
= HiiSetString (CallbackData
->BmmHiiHandle
, 0, String
, NULL
);
1168 if(FormId
== FORM_BOOT_ADD_ID
){
1169 if (!CallbackData
->BmmFakeNvData
.BootOptionChanged
) {
1170 ZeroMem (CallbackData
->BmmFakeNvData
.BootOptionalData
, sizeof (CallbackData
->BmmFakeNvData
.BootOptionalData
));
1171 ZeroMem (CallbackData
->BmmFakeNvData
.BootDescriptionData
, sizeof (CallbackData
->BmmFakeNvData
.BootDescriptionData
));
1173 } else if (FormId
== FORM_DRV_ADD_FILE_ID
){
1174 if (!CallbackData
->BmmFakeNvData
.DriverOptionChanged
) {
1175 ZeroMem (CallbackData
->BmmFakeNvData
.DriverOptionalData
, sizeof (CallbackData
->BmmFakeNvData
.DriverOptionalData
));
1176 ZeroMem (CallbackData
->BmmFakeNvData
.DriverDescriptionData
, sizeof (CallbackData
->BmmFakeNvData
.DriverDescriptionData
));
1180 RefreshUpdateData();
1181 mStartLabel
->Number
= FormId
;
1183 HiiCreateSubTitleOpCode (
1192 CallbackData
->BmmHiiHandle
,
1195 mStartOpCodeHandle
,// Label FormId
1196 mEndOpCodeHandle
// LABEL_END
1201 Dispatch the correct update page function to call based on
1204 @param UpdatePageId The form ID.
1205 @param CallbackData The BMM context data.
1210 IN UINT16 UpdatePageId
,
1211 IN BMM_CALLBACK_DATA
*CallbackData
1214 CleanUpPage (UpdatePageId
, CallbackData
);
1215 switch (UpdatePageId
) {
1216 case FORM_CON_IN_ID
:
1217 UpdateConsolePage (UpdatePageId
, &ConsoleInpMenu
, CallbackData
);
1220 case FORM_CON_OUT_ID
:
1221 UpdateConsolePage (UpdatePageId
, &ConsoleOutMenu
, CallbackData
);
1224 case FORM_CON_ERR_ID
:
1225 UpdateConsolePage (UpdatePageId
, &ConsoleErrMenu
, CallbackData
);
1228 case FORM_BOOT_CHG_ID
:
1229 UpdateOrderPage (UpdatePageId
, &BootOptionMenu
, CallbackData
);
1232 case FORM_DRV_CHG_ID
:
1233 UpdateOrderPage (UpdatePageId
, &DriverOptionMenu
, CallbackData
);
1242 Dispatch the display to the next page based on NewPageId.
1244 @param Private The BMM context data.
1245 @param NewPageId The original page ID.
1250 BMM_CALLBACK_DATA
*Private
,
1254 if ((NewPageId
< FILE_OPTION_OFFSET
) && (NewPageId
>= HANDLE_OPTION_OFFSET
)) {
1256 // If we select a handle to add driver option, advance to the add handle description page.
1258 NewPageId
= FORM_DRV_ADD_HANDLE_DESC_ID
;
1259 } else if ((NewPageId
== KEY_VALUE_SAVE_AND_EXIT
) || (NewPageId
== KEY_VALUE_NO_SAVE_AND_EXIT
)) {
1261 // Return to main page after "Save Changes" or "Discard Changes".
1263 NewPageId
= FORM_MAIN_ID
;
1264 } else if ((NewPageId
>= TERMINAL_OPTION_OFFSET
) && (NewPageId
< CONSOLE_OPTION_OFFSET
)) {
1265 NewPageId
= FORM_CON_COM_SETUP_ID
;
1268 if ((NewPageId
> 0) && (NewPageId
< MAXIMUM_FORM_ID
)) {
1269 Private
->BmmPreviousPageId
= Private
->BmmCurrentPageId
;
1270 Private
->BmmCurrentPageId
= NewPageId
;