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