]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/BootMaintenanceManagerLib/UpdatePage.c
MdeModulePkg:Change the type of BootNext
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerLib / UpdatePage.c
CommitLineData
4af04335
DB
1/** @file\r
2Dynamically update the pages.\r
3\r
4Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "BootMaintenanceManager.h"\r
16\r
17/**\r
18 Create the global UpdateData structure.\r
19\r
20**/\r
21VOID\r
22CreateUpdateData (\r
23 VOID\r
24 )\r
25{\r
26 //\r
27 // Init OpCode Handle and Allocate space for creation of Buffer\r
28 //\r
29 mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
30 ASSERT (mStartOpCodeHandle != NULL);\r
31 \r
32 mEndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
33 ASSERT (mEndOpCodeHandle != NULL);\r
34 \r
35 //\r
36 // Create Hii Extend Label OpCode as the start opcode\r
37 //\r
38 mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
39 mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
40 \r
41 //\r
42 // Create Hii Extend Label OpCode as the end opcode\r
43 //\r
44 mEndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mEndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
45 mEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
46 mEndLabel->Number = LABEL_END;\r
47}\r
48\r
49/**\r
50 Refresh the global UpdateData structure.\r
51\r
52**/\r
53VOID\r
54RefreshUpdateData (\r
55 VOID\r
56 )\r
57{\r
58 //\r
59 // Free current updated date\r
60 // \r
61 if (mStartOpCodeHandle != NULL) {\r
62 HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
63 }\r
64\r
65 //\r
66 // Create new OpCode Handle\r
67 //\r
68 mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
69\r
70 //\r
71 // Create Hii Extend Label OpCode as the start opcode\r
72 //\r
73 mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
74 mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
75\r
76}\r
77\r
78/**\r
79 Add a "Go back to main page" tag in front of the form when there are no\r
80 "Apply changes" and "Discard changes" tags in the end of the form.\r
81 \r
82 @param CallbackData The BMM context data.\r
83\r
84**/\r
85VOID\r
86UpdatePageStart (\r
87 IN BMM_CALLBACK_DATA *CallbackData\r
88 )\r
89{\r
90 RefreshUpdateData ();\r
91 mStartLabel->Number = CallbackData->BmmCurrentPageId;\r
92\r
93 if (!(CallbackData->BmmAskSaveOrNot)) {\r
94 //\r
95 // Add a "Go back to main page" tag in front of the form when there are no\r
96 // "Apply changes" and "Discard changes" tags in the end of the form.\r
97 //\r
98 HiiCreateGotoOpCode (\r
99 mStartOpCodeHandle,\r
100 FORM_MAIN_ID,\r
101 STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
102 STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
103 0,\r
104 FORM_MAIN_ID\r
105 );\r
106 }\r
107}\r
108\r
109/**\r
110 Create the "Apply changes" and "Discard changes" tags. And\r
111 ensure user can return to the main page.\r
112\r
113 @param CallbackData The BMM context data.\r
114\r
115**/\r
116VOID\r
117UpdatePageEnd (\r
118 IN BMM_CALLBACK_DATA *CallbackData\r
119 )\r
120{\r
121 //\r
122 // Create the "Apply changes" and "Discard changes" tags.\r
123 //\r
124 if (CallbackData->BmmAskSaveOrNot) {\r
125 HiiCreateSubTitleOpCode (\r
126 mStartOpCodeHandle,\r
127 STRING_TOKEN (STR_NULL_STRING),\r
128 0,\r
129 0,\r
130 0\r
131 );\r
132\r
133 HiiCreateActionOpCode (\r
134 mStartOpCodeHandle,\r
135 KEY_VALUE_SAVE_AND_EXIT,\r
136 STRING_TOKEN (STR_SAVE_AND_EXIT),\r
137 STRING_TOKEN (STR_NULL_STRING),\r
138 EFI_IFR_FLAG_CALLBACK,\r
139 0\r
140 );\r
141 }\r
142\r
143 //\r
144 // Ensure user can return to the main page.\r
145 //\r
146 HiiCreateActionOpCode (\r
147 mStartOpCodeHandle,\r
148 KEY_VALUE_NO_SAVE_AND_EXIT,\r
149 STRING_TOKEN (STR_NO_SAVE_AND_EXIT),\r
150 STRING_TOKEN (STR_NULL_STRING),\r
151 EFI_IFR_FLAG_CALLBACK,\r
152 0\r
153 );\r
154\r
155 HiiUpdateForm (\r
156 CallbackData->BmmHiiHandle,\r
157 &mBootMaintGuid,\r
158 CallbackData->BmmCurrentPageId,\r
159 mStartOpCodeHandle, // Label CallbackData->BmmCurrentPageId\r
160 mEndOpCodeHandle // LABEL_END\r
161 );\r
162}\r
163\r
164/**\r
165 Clean up the dynamic opcode at label and form specified by both LabelId. \r
166\r
167 @param LabelId It is both the Form ID and Label ID for opcode deletion.\r
168 @param CallbackData The BMM context data.\r
169\r
170**/\r
171VOID\r
172CleanUpPage (\r
173 IN UINT16 LabelId,\r
174 IN BMM_CALLBACK_DATA *CallbackData\r
175 )\r
176{\r
177 RefreshUpdateData ();\r
178\r
179 //\r
180 // Remove all op-codes from dynamic page\r
181 //\r
182 mStartLabel->Number = LabelId;\r
183 HiiUpdateForm (\r
184 CallbackData->BmmHiiHandle,\r
185 &mBootMaintGuid,\r
186 LabelId,\r
187 mStartOpCodeHandle, // Label LabelId\r
188 mEndOpCodeHandle // LABEL_END\r
189 );\r
190}\r
191\r
192/**\r
193 Create a list of Goto Opcode for all terminal devices logged\r
194 by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.\r
195\r
196 @param CallbackData The BMM context data.\r
197**/\r
198VOID\r
199UpdateConCOMPage (\r
200 IN BMM_CALLBACK_DATA *CallbackData\r
201 )\r
202{\r
203 BM_MENU_ENTRY *NewMenuEntry;\r
204 UINT16 Index;\r
205\r
206 CallbackData->BmmAskSaveOrNot = TRUE;\r
207\r
208 UpdatePageStart (CallbackData);\r
209\r
210 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
211 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
212\r
213 HiiCreateGotoOpCode (\r
214 mStartOpCodeHandle,\r
215 FORM_CON_COM_SETUP_ID,\r
216 NewMenuEntry->DisplayStringToken,\r
217 STRING_TOKEN (STR_NULL_STRING),\r
218 EFI_IFR_FLAG_CALLBACK,\r
219 (UINT16) (TERMINAL_OPTION_OFFSET + Index)\r
220 );\r
221 }\r
222\r
223 UpdatePageEnd (CallbackData);\r
224}\r
225\r
226\r
227/**\r
228 Create a list of boot option from global BootOptionMenu. It\r
229 allow user to delete the boot option.\r
230\r
231 @param CallbackData The BMM context data.\r
232\r
233**/\r
234VOID\r
235UpdateBootDelPage (\r
236 IN BMM_CALLBACK_DATA *CallbackData\r
237 )\r
238{\r
239 BM_MENU_ENTRY *NewMenuEntry;\r
240 BM_LOAD_CONTEXT *NewLoadContext;\r
241 UINT16 Index;\r
242\r
243 CallbackData->BmmAskSaveOrNot = TRUE;\r
244\r
245 UpdatePageStart (CallbackData);\r
246\r
247 ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionDel) / sizeof (CallbackData->BmmFakeNvData.BootOptionDel[0])));\r
248 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
249 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
250 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
251 if (NewLoadContext->IsLegacy) {\r
252 continue;\r
253 }\r
254\r
255 NewLoadContext->Deleted = FALSE;\r
256\r
257 if (CallbackData->BmmFakeNvData.BootOptionDel[Index] && !CallbackData->BmmFakeNvData.BootOptionDelMark[Index]) {\r
258 //\r
259 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
260 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
261 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
262 // through HiiSetBrowserData function.\r
263 //\r
264 CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
265 }\r
266 \r
267 HiiCreateCheckBoxOpCode (\r
268 mStartOpCodeHandle,\r
269 (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
270 VARSTORE_ID_BOOT_MAINT,\r
271 (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
272 NewMenuEntry->DisplayStringToken,\r
273 NewMenuEntry->HelpStringToken,\r
274 EFI_IFR_FLAG_CALLBACK,\r
275 0,\r
276 NULL\r
277 );\r
278 }\r
279 UpdatePageEnd (CallbackData);\r
280}\r
281\r
282/**\r
283 Create a lit of driver option from global DriverMenu.\r
284\r
285 @param CallbackData The BMM context data.\r
286\r
287**/\r
288VOID\r
289UpdateDrvAddHandlePage (\r
290 IN BMM_CALLBACK_DATA *CallbackData\r
291 )\r
292{\r
293 BM_MENU_ENTRY *NewMenuEntry;\r
294 UINT16 Index;\r
295\r
296 CallbackData->BmmAskSaveOrNot = FALSE;\r
297\r
298 UpdatePageStart (CallbackData);\r
299\r
300 for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {\r
301 NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);\r
302\r
303 HiiCreateGotoOpCode (\r
304 mStartOpCodeHandle,\r
305 FORM_DRV_ADD_HANDLE_DESC_ID,\r
306 NewMenuEntry->DisplayStringToken,\r
307 STRING_TOKEN (STR_NULL_STRING),\r
308 EFI_IFR_FLAG_CALLBACK,\r
309 (UINT16) (HANDLE_OPTION_OFFSET + Index)\r
310 );\r
311 }\r
312\r
313 UpdatePageEnd (CallbackData);\r
314}\r
315\r
316/**\r
317 Create a lit of driver option from global DriverOptionMenu. It\r
318 allow user to delete the driver option.\r
319\r
320 @param CallbackData The BMM context data.\r
321\r
322**/\r
323VOID\r
324UpdateDrvDelPage (\r
325 IN BMM_CALLBACK_DATA *CallbackData\r
326 )\r
327{\r
328 BM_MENU_ENTRY *NewMenuEntry;\r
329 BM_LOAD_CONTEXT *NewLoadContext;\r
330 UINT16 Index;\r
331\r
332 CallbackData->BmmAskSaveOrNot = TRUE;\r
333\r
334 UpdatePageStart (CallbackData);\r
335\r
336 ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionDel) / sizeof (CallbackData->BmmFakeNvData.DriverOptionDel[0])));\r
337 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
338 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
339\r
340 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
341 NewLoadContext->Deleted = FALSE;\r
342\r
343 if (CallbackData->BmmFakeNvData.DriverOptionDel[Index] && !CallbackData->BmmFakeNvData.DriverOptionDelMark[Index]) {\r
344 //\r
345 // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
346 // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
347 // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
348 // through HiiSetBrowserData function.\r
349 //\r
350 CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
351 }\r
352 HiiCreateCheckBoxOpCode (\r
353 mStartOpCodeHandle,\r
354 (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
355 VARSTORE_ID_BOOT_MAINT,\r
356 (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
357 NewMenuEntry->DisplayStringToken,\r
358 NewMenuEntry->HelpStringToken,\r
359 EFI_IFR_FLAG_CALLBACK,\r
360 0,\r
361 NULL\r
362 );\r
363 }\r
364\r
365 UpdatePageEnd (CallbackData);\r
366}\r
367\r
368/**\r
369 Prepare the page to allow user to add description for \r
370 a Driver Option.\r
371\r
372 @param CallbackData The BMM context data.\r
373\r
374**/\r
375VOID\r
376UpdateDriverAddHandleDescPage (\r
377 IN BMM_CALLBACK_DATA *CallbackData\r
378 )\r
379{\r
380 BM_MENU_ENTRY *NewMenuEntry;\r
381\r
382 CallbackData->BmmFakeNvData.DriverAddActive = 0x01;\r
383 CallbackData->BmmFakeNvData.DriverAddForceReconnect = 0x00;\r
384 CallbackData->BmmAskSaveOrNot = TRUE;\r
385 NewMenuEntry = CallbackData->MenuEntry;\r
386\r
387 UpdatePageStart (CallbackData);\r
388\r
389 HiiCreateSubTitleOpCode (\r
390 mStartOpCodeHandle,\r
391 NewMenuEntry->DisplayStringToken,\r
392 0,\r
393 0,\r
394 0\r
395 );\r
396\r
397 HiiCreateStringOpCode (\r
398 mStartOpCodeHandle,\r
399 (EFI_QUESTION_ID) DRV_ADD_HANDLE_DESC_QUESTION_ID,\r
400 VARSTORE_ID_BOOT_MAINT,\r
401 DRV_ADD_HANDLE_DESC_VAR_OFFSET,\r
402 STRING_TOKEN (STR_LOAD_OPTION_DESC),\r
403 STRING_TOKEN (STR_NULL_STRING),\r
404 0,\r
405 0,\r
406 6,\r
407 75,\r
408 NULL\r
409 );\r
410\r
411 HiiCreateCheckBoxOpCode (\r
412 mStartOpCodeHandle,\r
413 (EFI_QUESTION_ID) DRV_ADD_RECON_QUESTION_ID,\r
414 VARSTORE_ID_BOOT_MAINT,\r
415 DRV_ADD_RECON_VAR_OFFSET,\r
416 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
417 STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
418 0,\r
419 0,\r
420 NULL\r
421 );\r
422\r
423 HiiCreateStringOpCode (\r
424 mStartOpCodeHandle,\r
425 (EFI_QUESTION_ID) DRIVER_ADD_OPTION_QUESTION_ID,\r
426 VARSTORE_ID_BOOT_MAINT,\r
427 DRIVER_ADD_OPTION_VAR_OFFSET,\r
428 STRING_TOKEN (STR_OPTIONAL_DATA),\r
429 STRING_TOKEN (STR_NULL_STRING),\r
430 0,\r
431 0,\r
432 6,\r
433 75,\r
434 NULL\r
435 );\r
436\r
437 UpdatePageEnd (CallbackData);\r
438}\r
439\r
440/**\r
441 Update console page.\r
442\r
443 @param UpdatePageId The form ID to be updated.\r
444 @param ConsoleMenu The console menu list.\r
445 @param CallbackData The BMM context data.\r
446\r
447**/\r
448VOID\r
449UpdateConsolePage (\r
450 IN UINT16 UpdatePageId,\r
451 IN BM_MENU_OPTION *ConsoleMenu,\r
452 IN BMM_CALLBACK_DATA *CallbackData\r
453 )\r
454{\r
455 BM_MENU_ENTRY *NewMenuEntry;\r
456 BM_CONSOLE_CONTEXT *NewConsoleContext;\r
457 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
458 UINT16 Index;\r
459 UINT16 Index2;\r
460 UINT8 CheckFlags;\r
461 UINT8 *ConsoleCheck;\r
462 UINT8 *OldConsoleCheck;\r
463 UINTN ConsoleCheckSize;\r
464 EFI_QUESTION_ID QuestionIdBase;\r
465 UINT16 VariableOffsetBase;\r
466\r
467 CallbackData->BmmAskSaveOrNot = TRUE;\r
468\r
469 UpdatePageStart (CallbackData);\r
470\r
471 ConsoleCheck = NULL;\r
472 OldConsoleCheck = NULL;\r
473 QuestionIdBase = 0;\r
474 VariableOffsetBase = 0;\r
475 ConsoleCheckSize = 0;\r
476\r
477 switch (UpdatePageId) {\r
478 case FORM_CON_IN_ID:\r
479 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
480 OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleInCheck[0];\r
481 ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleInCheck);\r
482 QuestionIdBase = CON_IN_DEVICE_QUESTION_ID;\r
483 VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;\r
484 break;\r
485\r
486 case FORM_CON_OUT_ID:\r
487 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
488 OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleOutCheck[0];\r
489 ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleOutCheck);\r
490 QuestionIdBase = CON_OUT_DEVICE_QUESTION_ID;\r
491 VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;\r
492 break;\r
493\r
494 case FORM_CON_ERR_ID:\r
495 ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
496 OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleErrCheck[0];\r
497 ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleErrCheck);\r
498 QuestionIdBase = CON_ERR_DEVICE_QUESTION_ID;\r
499 VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;\r
500 break;\r
501 }\r
502 ASSERT (ConsoleCheck != NULL);\r
503\r
504 for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
505 (Index < MAX_MENU_NUMBER)) ; Index++) {\r
506 CheckFlags = 0;\r
507 NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
508 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
509 if (NewConsoleContext->IsActive) {\r
510 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
511 ConsoleCheck[Index] = TRUE;\r
512 } else {\r
513 ConsoleCheck[Index] = FALSE;\r
514 }\r
515 HiiCreateCheckBoxOpCode (\r
516 mStartOpCodeHandle,\r
517 (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
518 VARSTORE_ID_BOOT_MAINT,\r
519 (UINT16) (VariableOffsetBase + Index),\r
520 NewMenuEntry->DisplayStringToken,\r
521 NewMenuEntry->HelpStringToken,\r
522 0,\r
523 CheckFlags,\r
524 NULL\r
525 );\r
526 }\r
527\r
528 for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \\r
529 (Index2 < MAX_MENU_NUMBER)); Index2++) {\r
530 CheckFlags = 0;\r
531 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2);\r
532 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
533\r
534 ASSERT (Index < MAX_MENU_NUMBER);\r
535 if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||\r
536 ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
537 ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
538 ) {\r
539 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
540 ConsoleCheck[Index] = TRUE;\r
541 } else {\r
542 ConsoleCheck[Index] = FALSE;\r
543 }\r
544 HiiCreateCheckBoxOpCode (\r
545 mStartOpCodeHandle,\r
546 (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
547 VARSTORE_ID_BOOT_MAINT,\r
548 (UINT16) (VariableOffsetBase + Index),\r
549 NewMenuEntry->DisplayStringToken,\r
550 NewMenuEntry->HelpStringToken,\r
551 0,\r
552 CheckFlags,\r
553 NULL\r
554 );\r
555\r
556 Index++;\r
557 }\r
558\r
559 CopyMem (OldConsoleCheck, ConsoleCheck, ConsoleCheckSize);\r
560\r
561 UpdatePageEnd (CallbackData);\r
562}\r
563\r
564/**\r
565 Update the page's NV Map if user has changed the order\r
566 a list. This list can be Boot Order or Driver Order.\r
567\r
568 @param UpdatePageId The form ID to be updated.\r
569 @param OptionMenu The new list.\r
570 @param CallbackData The BMM context data.\r
571\r
572**/\r
573VOID\r
574UpdateOrderPage (\r
575 IN UINT16 UpdatePageId,\r
576 IN BM_MENU_OPTION *OptionMenu,\r
577 IN BMM_CALLBACK_DATA *CallbackData\r
578 )\r
579{\r
580 BM_MENU_ENTRY *NewMenuEntry;\r
581 UINT16 Index;\r
582 UINT16 OptionIndex;\r
583 VOID *OptionsOpCodeHandle;\r
584 BM_LOAD_CONTEXT *NewLoadContext;\r
585 BOOLEAN BootOptionFound;\r
586 UINT32 *OptionOrder;\r
587 EFI_QUESTION_ID QuestionId;\r
588 UINT16 VarOffset;\r
589\r
590 CallbackData->BmmAskSaveOrNot = TRUE;\r
591 UpdatePageStart (CallbackData);\r
592\r
593 OptionOrder = NULL;\r
594 QuestionId = 0;\r
595 VarOffset = 0;\r
596 switch (UpdatePageId) { \r
597 \r
598 case FORM_BOOT_CHG_ID:\r
599 GetBootOrder (CallbackData);\r
600 OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder;\r
601 QuestionId = BOOT_OPTION_ORDER_QUESTION_ID;\r
602 VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET;\r
603 break;\r
604 \r
605 case FORM_DRV_CHG_ID:\r
606 GetDriverOrder (CallbackData);\r
607 OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;\r
608 QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;\r
609 VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;\r
610 break;\r
611 } \r
612 ASSERT (OptionOrder != NULL); \r
613 \r
614 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
615 ASSERT (OptionsOpCodeHandle != NULL);\r
616 \r
617 NewMenuEntry = NULL;\r
618 for (OptionIndex = 0; (OptionOrder[OptionIndex] != 0 && OptionIndex < MAX_MENU_NUMBER); OptionIndex++) {\r
619 BootOptionFound = FALSE;\r
620 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
621 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
622 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
623 if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {\r
624 BootOptionFound = TRUE;\r
625 break;\r
626 }\r
627 }\r
628 if (BootOptionFound) {\r
629 HiiCreateOneOfOptionOpCode (\r
630 OptionsOpCodeHandle,\r
631 NewMenuEntry->DisplayStringToken,\r
632 0,\r
633 EFI_IFR_TYPE_NUM_SIZE_32,\r
634 OptionOrder[OptionIndex]\r
635 );\r
636 }\r
637 }\r
638 \r
639 if (OptionMenu->MenuNumber > 0) {\r
640 HiiCreateOrderedListOpCode ( \r
641 mStartOpCodeHandle, // Container for dynamic created opcodes \r
642 QuestionId, // Question ID \r
643 VARSTORE_ID_BOOT_MAINT, // VarStore ID \r
644 VarOffset, // Offset in Buffer Storage \r
645 STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text \r
646 STRING_TOKEN (STR_CHANGE_ORDER), // Question help text \r
647 0, // Question flag \r
648 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
649 EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value \r
650 100, // Maximum container \r
651 OptionsOpCodeHandle, // Option Opcode list \r
652 NULL // Default Opcode is NULL \r
653 );\r
654 }\r
655\r
656 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
657\r
658 UpdatePageEnd (CallbackData);\r
659\r
660}\r
661\r
662/**\r
663 Create the dynamic page to allow user to set\r
664 the "BootNext" value.\r
665\r
666 @param CallbackData The BMM context data.\r
667\r
668**/\r
669VOID\r
670UpdateBootNextPage (\r
671 IN BMM_CALLBACK_DATA *CallbackData\r
672 )\r
673{\r
674 BM_MENU_ENTRY *NewMenuEntry;\r
675 BM_LOAD_CONTEXT *NewLoadContext;\r
676 UINTN NumberOfOptions;\r
677 UINT16 Index;\r
678 VOID *OptionsOpCodeHandle;\r
679\r
680 NumberOfOptions = BootOptionMenu.MenuNumber;\r
681 CallbackData->BmmAskSaveOrNot = TRUE;\r
682\r
683 UpdatePageStart (CallbackData);\r
684\r
685 if (NumberOfOptions > 0) {\r
686 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
687 ASSERT (OptionsOpCodeHandle != NULL);\r
688\r
f7986526 689 CallbackData->BmmFakeNvData.BootNext = NONE_BOOTNEXT_VALUE;\r
4af04335
DB
690\r
691 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
692 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
693 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
694\r
695 if (NewLoadContext->IsBootNext) {\r
696 HiiCreateOneOfOptionOpCode (\r
697 OptionsOpCodeHandle,\r
698 NewMenuEntry->DisplayStringToken,\r
699 EFI_IFR_OPTION_DEFAULT,\r
f7986526 700 EFI_IFR_TYPE_NUM_SIZE_32,\r
4af04335
DB
701 Index\r
702 );\r
703 CallbackData->BmmFakeNvData.BootNext = Index;\r
704 } else {\r
705 HiiCreateOneOfOptionOpCode (\r
706 OptionsOpCodeHandle,\r
707 NewMenuEntry->DisplayStringToken,\r
708 0,\r
f7986526 709 EFI_IFR_TYPE_NUM_SIZE_32,\r
4af04335
DB
710 Index\r
711 );\r
712 }\r
713 }\r
714\r
f7986526 715 if (CallbackData->BmmFakeNvData.BootNext == NONE_BOOTNEXT_VALUE) {\r
4af04335
DB
716 HiiCreateOneOfOptionOpCode (\r
717 OptionsOpCodeHandle,\r
718 STRING_TOKEN (STR_NONE),\r
719 EFI_IFR_OPTION_DEFAULT,\r
f7986526
DB
720 EFI_IFR_TYPE_NUM_SIZE_32,\r
721 NONE_BOOTNEXT_VALUE\r
4af04335
DB
722 );\r
723 } else {\r
724 HiiCreateOneOfOptionOpCode (\r
725 OptionsOpCodeHandle,\r
726 STRING_TOKEN (STR_NONE),\r
727 0,\r
f7986526
DB
728 EFI_IFR_TYPE_NUM_SIZE_32,\r
729 NONE_BOOTNEXT_VALUE\r
4af04335
DB
730 );\r
731 } \r
732\r
733 HiiCreateOneOfOpCode (\r
734 mStartOpCodeHandle,\r
735 (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,\r
736 VARSTORE_ID_BOOT_MAINT,\r
737 BOOT_NEXT_VAR_OFFSET,\r
738 STRING_TOKEN (STR_BOOT_NEXT),\r
739 STRING_TOKEN (STR_BOOT_NEXT_HELP),\r
740 0,\r
f7986526 741 EFI_IFR_NUMERIC_SIZE_4,\r
4af04335
DB
742 OptionsOpCodeHandle,\r
743 NULL\r
744 );\r
745\r
746 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
747 }\r
748\r
749 UpdatePageEnd (CallbackData);\r
750}\r
751\r
752/**\r
753 Create the dynamic page to allow user to set the "TimeOut" value.\r
754\r
755 @param CallbackData The BMM context data.\r
756\r
757**/\r
758VOID\r
759UpdateTimeOutPage (\r
760 IN BMM_CALLBACK_DATA *CallbackData\r
761 )\r
762{\r
763 VOID *DefaultOpCodeHandle;\r
764\r
765 CallbackData->BmmAskSaveOrNot = TRUE;\r
766\r
767 UpdatePageStart (CallbackData);\r
768\r
769 DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();\r
770 ASSERT (DefaultOpCodeHandle != NULL);\r
771 HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_NUM_SIZE_16, CallbackData->BmmFakeNvData.BootTimeOut);\r
772\r
773 HiiCreateNumericOpCode (\r
774 mStartOpCodeHandle,\r
775 (EFI_QUESTION_ID) BOOT_TIME_OUT_QUESTION_ID,\r
776 VARSTORE_ID_BOOT_MAINT,\r
777 BOOT_TIME_OUT_VAR_OFFSET,\r
778 STRING_TOKEN (STR_NUM_AUTO_BOOT),\r
779 STRING_TOKEN (STR_HLP_AUTO_BOOT),\r
780 0,\r
781 EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,\r
782 0,\r
783 65535,\r
784 0,\r
785 DefaultOpCodeHandle\r
786 );\r
787 \r
788 HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
789\r
790 UpdatePageEnd (CallbackData);\r
791}\r
792\r
793\r
794/**\r
795 Refresh the text mode page.\r
796\r
797 @param CallbackData The BMM context data.\r
798\r
799**/\r
800VOID\r
801UpdateConModePage (\r
802 IN BMM_CALLBACK_DATA *CallbackData\r
803 )\r
804{\r
805 UINTN Mode;\r
806 UINTN Index;\r
807 UINTN Col;\r
808 UINTN Row;\r
809 CHAR16 ModeString[50];\r
810 CHAR16 *PStr;\r
811 UINTN MaxMode;\r
812 UINTN ValidMode;\r
813 EFI_STRING_ID *ModeToken;\r
814 EFI_STATUS Status;\r
815 VOID *OptionsOpCodeHandle;\r
816 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
817\r
818 ConOut = gST->ConOut;\r
819 Index = 0;\r
820 ValidMode = 0;\r
821 MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
822\r
823 CallbackData->BmmAskSaveOrNot = TRUE;\r
824\r
825 UpdatePageStart (CallbackData);\r
826\r
827 //\r
828 // Check valid mode\r
829 //\r
830 for (Mode = 0; Mode < MaxMode; Mode++) {\r
831 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
832 if (EFI_ERROR (Status)) {\r
833 continue;\r
834 }\r
835 ValidMode++;\r
836 }\r
837\r
838 if (ValidMode == 0) {\r
839 return;\r
840 }\r
841\r
842 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
843 ASSERT (OptionsOpCodeHandle != NULL);\r
844\r
845 ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
846 ASSERT(ModeToken != NULL);\r
847\r
848 //\r
849 // Determin which mode should be the first entry in menu\r
850 //\r
851 GetConsoleOutMode (CallbackData);\r
852\r
853 //\r
854 // Build text mode options\r
855 //\r
856 for (Mode = 0; Mode < MaxMode; Mode++) {\r
857 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
858 if (EFI_ERROR (Status)) {\r
859 continue;\r
860 }\r
861 \r
862 //\r
863 // Build mode string Column x Row\r
864 //\r
865 UnicodeValueToString (ModeString, 0, Col, 0);\r
866 PStr = &ModeString[0];\r
867 StrnCatS (PStr, sizeof (ModeString) / sizeof (ModeString[0]), L" x ", StrLen(L" x ") + 1);\r
868 PStr = PStr + StrLen (PStr);\r
869 UnicodeValueToString (PStr , 0, Row, 0);\r
870\r
871 ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
872\r
873 if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
874 HiiCreateOneOfOptionOpCode (\r
875 OptionsOpCodeHandle,\r
876 ModeToken[Index],\r
877 EFI_IFR_OPTION_DEFAULT,\r
878 EFI_IFR_TYPE_NUM_SIZE_16,\r
879 (UINT16) Mode\r
880 );\r
881 } else {\r
882 HiiCreateOneOfOptionOpCode (\r
883 OptionsOpCodeHandle,\r
884 ModeToken[Index],\r
885 0,\r
886 EFI_IFR_TYPE_NUM_SIZE_16,\r
887 (UINT16) Mode\r
888 );\r
889 }\r
890 Index++;\r
891 }\r
892\r
893 HiiCreateOneOfOpCode (\r
894 mStartOpCodeHandle,\r
895 (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
896 VARSTORE_ID_BOOT_MAINT,\r
897 CON_MODE_VAR_OFFSET,\r
898 STRING_TOKEN (STR_CON_MODE_SETUP),\r
899 STRING_TOKEN (STR_CON_MODE_SETUP),\r
900 EFI_IFR_FLAG_RESET_REQUIRED,\r
901 EFI_IFR_NUMERIC_SIZE_2,\r
902 OptionsOpCodeHandle,\r
903 NULL\r
904 );\r
905\r
906 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
907 FreePool (ModeToken);\r
908\r
909 UpdatePageEnd (CallbackData);\r
910}\r
911\r
912 /**\r
913 Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
914 Parity, Stop Bits, Terminal Type.\r
915\r
916 @param CallbackData The BMM context data.\r
917\r
918**/\r
919VOID\r
920UpdateTerminalPage (\r
921 IN BMM_CALLBACK_DATA *CallbackData\r
922 )\r
923{\r
924 UINT8 Index;\r
925 UINT8 CheckFlags;\r
926 BM_MENU_ENTRY *NewMenuEntry;\r
927 VOID *OptionsOpCodeHandle;\r
928 UINTN CurrentTerminal;\r
929\r
930 CallbackData->BmmAskSaveOrNot = TRUE;\r
931\r
932 UpdatePageStart (CallbackData);\r
933\r
934 CurrentTerminal = CallbackData->CurrentTerminal;\r
935 NewMenuEntry = BOpt_GetMenuEntry (\r
936 &TerminalMenu,\r
937 CurrentTerminal\r
938 );\r
939\r
940 if (NewMenuEntry == NULL) {\r
941 return ;\r
942 }\r
943\r
944 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
945 ASSERT (OptionsOpCodeHandle != NULL);\r
946\r
947 for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
948 CheckFlags = 0;\r
949 if (BaudRateList[Index].Value == 115200) {\r
950 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
951 }\r
952 HiiCreateOneOfOptionOpCode (\r
953 OptionsOpCodeHandle,\r
954 BaudRateList[Index].StringToken,\r
955 CheckFlags,\r
956 EFI_IFR_TYPE_NUM_SIZE_8,\r
957 Index\r
958 );\r
959 }\r
960\r
961 HiiCreateOneOfOpCode (\r
962 mStartOpCodeHandle,\r
963 (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
964 VARSTORE_ID_BOOT_MAINT,\r
965 (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
966 STRING_TOKEN (STR_COM_BAUD_RATE),\r
967 STRING_TOKEN (STR_COM_BAUD_RATE),\r
968 0,\r
969 EFI_IFR_NUMERIC_SIZE_1,\r
970 OptionsOpCodeHandle,\r
971 NULL\r
972 );\r
973 \r
974 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
975 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
976 ASSERT (OptionsOpCodeHandle != NULL);\r
977\r
978 for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {\r
979 CheckFlags = 0;\r
980\r
981 if (DataBitsList[Index].Value == 8) {\r
982 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
983 }\r
984\r
985 HiiCreateOneOfOptionOpCode (\r
986 OptionsOpCodeHandle,\r
987 DataBitsList[Index].StringToken,\r
988 CheckFlags,\r
989 EFI_IFR_TYPE_NUM_SIZE_8,\r
990 Index\r
991 );\r
992 }\r
993\r
994 HiiCreateOneOfOpCode (\r
995 mStartOpCodeHandle,\r
996 (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
997 VARSTORE_ID_BOOT_MAINT,\r
998 (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
999 STRING_TOKEN (STR_COM_DATA_BITS),\r
1000 STRING_TOKEN (STR_COM_DATA_BITS),\r
1001 0,\r
1002 EFI_IFR_NUMERIC_SIZE_1,\r
1003 OptionsOpCodeHandle,\r
1004 NULL\r
1005 );\r
1006\r
1007 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1008 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1009 ASSERT (OptionsOpCodeHandle != NULL);\r
1010\r
1011 for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
1012 CheckFlags = 0;\r
1013 if (ParityList[Index].Value == NoParity) {\r
1014 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
1015 }\r
1016\r
1017 HiiCreateOneOfOptionOpCode (\r
1018 OptionsOpCodeHandle,\r
1019 ParityList[Index].StringToken,\r
1020 CheckFlags,\r
1021 EFI_IFR_TYPE_NUM_SIZE_8,\r
1022 Index\r
1023 );\r
1024 }\r
1025\r
1026 HiiCreateOneOfOpCode (\r
1027 mStartOpCodeHandle,\r
1028 (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
1029 VARSTORE_ID_BOOT_MAINT,\r
1030 (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
1031 STRING_TOKEN (STR_COM_PARITY),\r
1032 STRING_TOKEN (STR_COM_PARITY),\r
1033 0,\r
1034 EFI_IFR_NUMERIC_SIZE_1,\r
1035 OptionsOpCodeHandle,\r
1036 NULL\r
1037 );\r
1038\r
1039 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1040 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1041 ASSERT (OptionsOpCodeHandle != NULL);\r
1042\r
1043 for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
1044 CheckFlags = 0;\r
1045 if (StopBitsList[Index].Value == OneStopBit) {\r
1046 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
1047 }\r
1048\r
1049 HiiCreateOneOfOptionOpCode (\r
1050 OptionsOpCodeHandle,\r
1051 StopBitsList[Index].StringToken,\r
1052 CheckFlags,\r
1053 EFI_IFR_TYPE_NUM_SIZE_8,\r
1054 Index\r
1055 );\r
1056 }\r
1057\r
1058 HiiCreateOneOfOpCode (\r
1059 mStartOpCodeHandle,\r
1060 (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
1061 VARSTORE_ID_BOOT_MAINT,\r
1062 (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
1063 STRING_TOKEN (STR_COM_STOP_BITS),\r
1064 STRING_TOKEN (STR_COM_STOP_BITS),\r
1065 0,\r
1066 EFI_IFR_NUMERIC_SIZE_1,\r
1067 OptionsOpCodeHandle,\r
1068 NULL\r
1069 );\r
1070\r
1071 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1072 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1073 ASSERT (OptionsOpCodeHandle != NULL);\r
1074\r
1075 for (Index = 0; Index < sizeof (TerminalType) / sizeof (TerminalType[0]); Index++) {\r
1076 CheckFlags = 0;\r
1077 if (Index == 0) {\r
1078 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
1079 }\r
1080\r
1081 HiiCreateOneOfOptionOpCode (\r
1082 OptionsOpCodeHandle,\r
1083 (EFI_STRING_ID) TerminalType[Index],\r
1084 CheckFlags,\r
1085 EFI_IFR_TYPE_NUM_SIZE_8,\r
1086 Index\r
1087 );\r
1088 }\r
1089\r
1090 HiiCreateOneOfOpCode (\r
1091 mStartOpCodeHandle,\r
1092 (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
1093 VARSTORE_ID_BOOT_MAINT,\r
1094 (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
1095 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
1096 STRING_TOKEN (STR_COM_TERMI_TYPE),\r
1097 0,\r
1098 EFI_IFR_NUMERIC_SIZE_1,\r
1099 OptionsOpCodeHandle,\r
1100 NULL\r
1101 );\r
1102\r
1103 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1104 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1105 ASSERT (OptionsOpCodeHandle != NULL);\r
1106\r
1107 for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) {\r
1108 CheckFlags = 0;\r
1109 if (Index == 0) {\r
1110 CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
1111 }\r
1112 HiiCreateOneOfOptionOpCode (\r
1113 OptionsOpCodeHandle,\r
1114 (EFI_STRING_ID) mFlowControlType[Index],\r
1115 CheckFlags,\r
1116 EFI_IFR_TYPE_NUM_SIZE_8,\r
1117 mFlowControlValue[Index]\r
1118 );\r
1119 }\r
1120\r
1121 HiiCreateOneOfOpCode (\r
1122 mStartOpCodeHandle,\r
1123 (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
1124 VARSTORE_ID_BOOT_MAINT,\r
1125 (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
1126 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
1127 STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
1128 0,\r
1129 EFI_IFR_NUMERIC_SIZE_1,\r
1130 OptionsOpCodeHandle,\r
1131 NULL\r
1132 );\r
1133\r
1134 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
1135\r
1136 UpdatePageEnd (CallbackData);\r
1137}\r
1138 \r
1139/**\r
1140Update add boot/driver option page.\r
1141\r
1142@param CallbackData The BMM context data.\r
1143@param FormId The form ID to be updated.\r
1144@param DevicePath Device path.\r
1145\r
1146**/\r
1147VOID\r
1148UpdateOptionPage(\r
1149 IN BMM_CALLBACK_DATA *CallbackData,\r
1150 IN EFI_FORM_ID FormId,\r
1151 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
1152 )\r
1153{\r
1154 CHAR16 *String;\r
1155 EFI_STRING_ID StringToken;\r
1156\r
1157 if (DevicePath != NULL){\r
1158 String = ExtractFileNameFromDevicePath(DevicePath);\r
1159 StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
1160 FreePool(String);\r
1161 } else {\r
1162 String = HiiGetString (CallbackData->BmmHiiHandle, STRING_TOKEN (STR_NULL_STRING), NULL);\r
1163 ASSERT (String != NULL);\r
1164 StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
1165 FreePool (String);\r
1166 }\r
1167\r
1168 if(FormId == FORM_BOOT_ADD_ID){\r
1169 if (!CallbackData->BmmFakeNvData.BootOptionChanged) {\r
1170 ZeroMem (CallbackData->BmmFakeNvData.BootOptionalData, sizeof (CallbackData->BmmFakeNvData.BootOptionalData));\r
1171 ZeroMem (CallbackData->BmmFakeNvData.BootDescriptionData, sizeof (CallbackData->BmmFakeNvData.BootDescriptionData));\r
1172 }\r
1173 } else if (FormId == FORM_DRV_ADD_FILE_ID){\r
1174 if (!CallbackData->BmmFakeNvData.DriverOptionChanged) {\r
1175 ZeroMem (CallbackData->BmmFakeNvData.DriverOptionalData, sizeof (CallbackData->BmmFakeNvData.DriverOptionalData));\r
1176 ZeroMem (CallbackData->BmmFakeNvData.DriverDescriptionData, sizeof (CallbackData->BmmFakeNvData.DriverDescriptionData));\r
1177 }\r
1178 }\r
1179\r
1180 RefreshUpdateData();\r
1181 mStartLabel->Number = FormId;\r
1182\r
1183 HiiCreateSubTitleOpCode (\r
1184 mStartOpCodeHandle,\r
1185 StringToken,\r
1186 0,\r
1187 0,\r
1188 0\r
1189 );\r
1190\r
1191 HiiUpdateForm (\r
1192 CallbackData->BmmHiiHandle,\r
1193 &mBootMaintGuid,\r
1194 FormId,\r
1195 mStartOpCodeHandle,// Label FormId\r
1196 mEndOpCodeHandle // LABEL_END\r
1197 );\r
1198}\r
1199\r
1200/**\r
1201 Dispatch the correct update page function to call based on\r
1202 the UpdatePageId.\r
1203\r
1204 @param UpdatePageId The form ID.\r
1205 @param CallbackData The BMM context data.\r
1206\r
1207**/\r
1208VOID\r
1209UpdatePageBody (\r
1210 IN UINT16 UpdatePageId,\r
1211 IN BMM_CALLBACK_DATA *CallbackData\r
1212 )\r
1213{\r
1214 CleanUpPage (UpdatePageId, CallbackData);\r
1215 switch (UpdatePageId) {\r
1216 case FORM_CON_IN_ID:\r
1217 UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
1218 break;\r
1219\r
1220 case FORM_CON_OUT_ID:\r
1221 UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
1222 break;\r
1223\r
1224 case FORM_CON_ERR_ID:\r
1225 UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
1226 break;\r
1227\r
1228 case FORM_BOOT_CHG_ID:\r
1229 UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
1230 break;\r
1231\r
1232 case FORM_DRV_CHG_ID:\r
1233 UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
1234 break;\r
1235\r
1236 default:\r
1237 break;\r
1238 }\r
1239}\r
1240\r
1241/**\r
1242 Dispatch the display to the next page based on NewPageId.\r
1243\r
1244 @param Private The BMM context data.\r
1245 @param NewPageId The original page ID.\r
1246\r
1247**/\r
1248VOID\r
1249UpdatePageId (\r
1250 BMM_CALLBACK_DATA *Private,\r
1251 UINT16 NewPageId\r
1252 )\r
1253{\r
1254 if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
1255 //\r
1256 // If we select a handle to add driver option, advance to the add handle description page.\r
1257 //\r
1258 NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
1259 } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
1260 //\r
1261 // Return to main page after "Save Changes" or "Discard Changes".\r
1262 //\r
1263 NewPageId = FORM_MAIN_ID;\r
1264 } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
1265 NewPageId = FORM_CON_COM_SETUP_ID;\r
1266 }\r
1267\r
1268 if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
1269 Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
1270 Private->BmmCurrentPageId = NewPageId;\r
1271 }\r
1272}\r