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