]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/ConsoleOption.c
IntelFrameworkModulePkg BdsDxe: Remove redundant functions
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / BootMaint / ConsoleOption.c
CommitLineData
5c08e117 1/** @file\r
2 handles console redirection from boot manager\r
3\r
0a6f4824 4Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
180a5a35 5This program and the accompanying materials\r
5c08e117 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 "BootMaint.h"\r
16\r
ce68d3bc
SZ
17UART_FLOW_CONTROL_DEVICE_PATH mFlowControlDevicePath =\r
18{\r
19 {\r
20 MESSAGING_DEVICE_PATH,\r
21 MSG_VENDOR_DP,\r
22 {\r
23 (UINT8)(sizeof(UART_FLOW_CONTROL_DEVICE_PATH)),\r
24 (UINT8)((sizeof(UART_FLOW_CONTROL_DEVICE_PATH)) >> 8)\r
25 }\r
26 },\r
8e491a81
ED
27 DEVICE_PATH_MESSAGING_UART_FLOW_CONTROL,\r
28 UART_FLOW_CONTROL_HARDWARE\r
29};\r
30\r
31/**\r
32 Check the device path node whether it's the Flow Control node or not.\r
33\r
34 @param[in] FlowControl The device path node to be checked.\r
0a6f4824 35\r
8e491a81
ED
36 @retval TRUE It's the Flow Control node.\r
37 @retval FALSE It's not.\r
38\r
39**/\r
40BOOLEAN\r
41IsUartFlowControlNode (\r
42 IN UART_FLOW_CONTROL_DEVICE_PATH *FlowControl\r
43 )\r
44{\r
45 return (BOOLEAN) (\r
46 (DevicePathType (FlowControl) == MESSAGING_DEVICE_PATH) &&\r
47 (DevicePathSubType (FlowControl) == MSG_VENDOR_DP) &&\r
48 (CompareGuid (&FlowControl->Guid, &gEfiUartDevicePathGuid))\r
49 );\r
50}\r
51\r
6b008b74
RN
52/**\r
53 Check whether the device path node is ISA Serial Node.\r
54\r
55 @param Acpi Device path node to be checked\r
56\r
57 @retval TRUE It's ISA Serial Node.\r
58 @retval FALSE It's NOT ISA Serial Node.\r
59\r
60**/\r
61BOOLEAN\r
62IsIsaSerialNode (\r
63 IN ACPI_HID_DEVICE_PATH *Acpi\r
64 )\r
65{\r
66 return (BOOLEAN) (\r
67 (DevicePathType (Acpi) == ACPI_DEVICE_PATH) &&\r
68 (DevicePathSubType (Acpi) == ACPI_DP) &&\r
69 (ReadUnaligned32 (&Acpi->HID) == EISA_PNP_ID (0x0501))\r
70 );\r
71}\r
72\r
5c08e117 73/**\r
74 Update Com Ports attributes from DevicePath\r
75\r
76 @param DevicePath DevicePath that contains Com ports\r
77\r
78 @retval EFI_SUCCESS The update is successful.\r
79\r
80**/\r
81EFI_STATUS\r
82UpdateComAttributeFromVariable (\r
83 EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
84 );\r
85\r
86/**\r
87 Update the multi-instance device path of Terminal Device based on\r
0a6f4824 88 the global TerminalMenu. If ChangeTernimal is TRUE, the terminal\r
5c08e117 89 device path in the Terminal Device in TerminalMenu is also updated.\r
90\r
91 @param DevicePath The multi-instance device path.\r
0a6f4824 92 @param ChangeTerminal TRUE, then device path in the Terminal Device\r
5c08e117 93 in TerminalMenu is also updated; FALSE, no update.\r
94\r
95 @return EFI_SUCCESS The function completes successfully.\r
96\r
97**/\r
98EFI_STATUS\r
99ChangeTerminalDevicePath (\r
8e491a81 100 IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath,\r
5c08e117 101 IN BOOLEAN ChangeTerminal\r
102 )\r
103{\r
104 EFI_DEVICE_PATH_PROTOCOL *Node;\r
105 EFI_DEVICE_PATH_PROTOCOL *Node1;\r
106 ACPI_HID_DEVICE_PATH *Acpi;\r
107 UART_DEVICE_PATH *Uart;\r
108 UART_DEVICE_PATH *Uart1;\r
109 UINTN Com;\r
5c08e117 110 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
111 BM_MENU_ENTRY *NewMenuEntry;\r
8e491a81 112 UART_FLOW_CONTROL_DEVICE_PATH *FlowControlNode;\r
5c08e117 113\r
8e491a81 114 Node = *DevicePath;\r
5c08e117 115 Node = NextDevicePathNode (Node);\r
116 Com = 0;\r
117 while (!IsDevicePathEnd (Node)) {\r
6b008b74
RN
118 Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
119 if (IsIsaSerialNode (Acpi)) {\r
120 CopyMem (&Com, &Acpi->UID, sizeof (UINT32));\r
5c08e117 121 }\r
122\r
123 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Com);\r
124\r
125 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
126 if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
127 Uart = (UART_DEVICE_PATH *) Node;\r
128 CopyMem (\r
129 &Uart->BaudRate,\r
130 &NewTerminalContext->BaudRate,\r
131 sizeof (UINT64)\r
132 );\r
133\r
134 CopyMem (\r
135 &Uart->DataBits,\r
136 &NewTerminalContext->DataBits,\r
137 sizeof (UINT8)\r
138 );\r
139\r
140 CopyMem (\r
141 &Uart->Parity,\r
142 &NewTerminalContext->Parity,\r
143 sizeof (UINT8)\r
144 );\r
145\r
146 CopyMem (\r
147 &Uart->StopBits,\r
148 &NewTerminalContext->StopBits,\r
149 sizeof (UINT8)\r
150 );\r
8e491a81
ED
151\r
152 FlowControlNode = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (Node);\r
153 if (IsUartFlowControlNode (FlowControlNode)) {\r
154 FlowControlNode->FlowControlMap = NewTerminalContext->FlowControl;\r
155 } else {\r
156 //\r
157 // Append the Flow control device node when user enable flow control.\r
158 //\r
159 if (NewTerminalContext->FlowControl != 0) {\r
160 mFlowControlDevicePath.FlowControlMap = NewTerminalContext->FlowControl;\r
161 *DevicePath = AppendDevicePathNode (\r
162 *DevicePath,\r
163 (EFI_DEVICE_PATH_PROTOCOL *) (&mFlowControlDevicePath)\r
164 );\r
165 }\r
166 }\r
167\r
5c08e117 168 //\r
169 // Change the device path in the ComPort\r
170 //\r
171 if (ChangeTerminal) {\r
172 Node1 = NewTerminalContext->DevicePath;\r
173 Node1 = NextDevicePathNode (Node1);\r
174 while (!IsDevicePathEnd (Node1)) {\r
175 if ((DevicePathType (Node1) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node1) == MSG_UART_DP)) {\r
176 Uart1 = (UART_DEVICE_PATH *) Node1;\r
177 CopyMem (\r
178 &Uart1->BaudRate,\r
179 &NewTerminalContext->BaudRate,\r
180 sizeof (UINT64)\r
181 );\r
182\r
183 CopyMem (\r
184 &Uart1->DataBits,\r
185 &NewTerminalContext->DataBits,\r
186 sizeof (UINT8)\r
187 );\r
188\r
189 CopyMem (\r
190 &Uart1->Parity,\r
191 &NewTerminalContext->Parity,\r
192 sizeof (UINT8)\r
193 );\r
194\r
195 CopyMem (\r
196 &Uart1->StopBits,\r
197 &NewTerminalContext->StopBits,\r
198 sizeof (UINT8)\r
199 );\r
200 break;\r
201 }\r
202 //\r
203 // end if\r
204 //\r
205 Node1 = NextDevicePathNode (Node1);\r
206 }\r
207 //\r
208 // end while\r
209 //\r
210 break;\r
211 }\r
212 }\r
213\r
214 Node = NextDevicePathNode (Node);\r
215 }\r
216\r
217 return EFI_SUCCESS;\r
218\r
219}\r
220\r
5c08e117 221\r
5c08e117 222\r
223/**\r
224 Retrieve ACPI UID of UART from device path\r
225\r
226 @param Handle The handle for the UART device.\r
227 @param AcpiUid The ACPI UID on output.\r
228\r
229 @retval TRUE Find valid UID from device path\r
230 @retval FALSE Can't find\r
231\r
232**/\r
233BOOLEAN\r
234RetrieveUartUid (\r
235 IN EFI_HANDLE Handle,\r
236 IN OUT UINT32 *AcpiUid\r
237 )\r
238{\r
6b008b74 239 EFI_STATUS Status;\r
5c08e117 240 ACPI_HID_DEVICE_PATH *Acpi;\r
241 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
242\r
6b008b74
RN
243 Status = gBS->HandleProtocol (\r
244 Handle,\r
245 &gEfiDevicePathProtocolGuid,\r
246 (VOID **) &DevicePath\r
247 );\r
248 if (EFI_ERROR (Status)) {\r
249 return FALSE;\r
5c08e117 250 }\r
251\r
6b008b74
RN
252 Acpi = NULL;\r
253 for (; !IsDevicePathEnd (DevicePath); DevicePath = NextDevicePathNode (DevicePath)) {\r
254 if ((DevicePathType (DevicePath) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (DevicePath) == MSG_UART_DP)) {\r
255 break;\r
256 }\r
257 //\r
258 // Acpi points to the node before the Uart node\r
259 //\r
260 Acpi = (ACPI_HID_DEVICE_PATH *) DevicePath;\r
261 }\r
5c08e117 262\r
6b008b74 263 if ((Acpi != NULL) && IsIsaSerialNode (Acpi)) {\r
5c08e117 264 if (AcpiUid != NULL) {\r
6b008b74 265 CopyMem (AcpiUid, &Acpi->UID, sizeof (UINT32));\r
5c08e117 266 }\r
267 return TRUE;\r
268 } else {\r
269 return FALSE;\r
270 }\r
271}\r
272\r
273/**\r
274 Sort Uart handles array with Acpi->UID from low to high.\r
275\r
276 @param Handles EFI_SERIAL_IO_PROTOCOL handle buffer\r
277 @param NoHandles EFI_SERIAL_IO_PROTOCOL handle count\r
278**/\r
279VOID\r
280SortedUartHandle (\r
281 IN EFI_HANDLE *Handles,\r
282 IN UINTN NoHandles\r
283 )\r
284{\r
285 UINTN Index1;\r
286 UINTN Index2;\r
287 UINTN Position;\r
288 UINT32 AcpiUid1;\r
289 UINT32 AcpiUid2;\r
290 UINT32 TempAcpiUid;\r
291 EFI_HANDLE TempHandle;\r
292\r
293 for (Index1 = 0; Index1 < NoHandles-1; Index1++) {\r
294 if (!RetrieveUartUid (Handles[Index1], &AcpiUid1)) {\r
295 continue;\r
296 }\r
297 TempHandle = Handles[Index1];\r
298 Position = Index1;\r
299 TempAcpiUid = AcpiUid1;\r
300\r
301 for (Index2 = Index1+1; Index2 < NoHandles; Index2++) {\r
302 if (!RetrieveUartUid (Handles[Index2], &AcpiUid2)) {\r
303 continue;\r
304 }\r
305 if (AcpiUid2 < TempAcpiUid) {\r
306 TempAcpiUid = AcpiUid2;\r
307 TempHandle = Handles[Index2];\r
308 Position = Index2;\r
309 }\r
310 }\r
311 Handles[Position] = Handles[Index1];\r
312 Handles[Index1] = TempHandle;\r
313 }\r
314}\r
315\r
316/**\r
317 Test whether DevicePath is a valid Terminal\r
318\r
319\r
320 @param DevicePath DevicePath to be checked\r
321 @param Termi If DevicePath is valid Terminal, terminal type is returned.\r
322 @param Com If DevicePath is valid Terminal, Com Port type is returned.\r
323\r
324 @retval TRUE If DevicePath point to a Terminal.\r
325 @retval FALSE If DevicePath does not point to a Terminal.\r
326\r
327**/\r
328BOOLEAN\r
329IsTerminalDevicePath (\r
330 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
331 OUT TYPE_OF_TERMINAL *Termi,\r
332 OUT UINTN *Com\r
333 );\r
334\r
335/**\r
336 Build a list containing all serial devices.\r
337\r
338\r
339 @retval EFI_SUCCESS The function complete successfully.\r
340 @retval EFI_UNSUPPORTED No serial ports present.\r
341\r
342**/\r
343EFI_STATUS\r
344LocateSerialIo (\r
345 VOID\r
346 )\r
347{\r
5c08e117 348 UINTN Index;\r
349 UINTN Index2;\r
350 UINTN NoHandles;\r
351 EFI_HANDLE *Handles;\r
352 EFI_STATUS Status;\r
353 ACPI_HID_DEVICE_PATH *Acpi;\r
354 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
5c08e117 355 EFI_SERIAL_IO_PROTOCOL *SerialIo;\r
6b008b74 356 EFI_DEVICE_PATH_PROTOCOL *Node;\r
5c08e117 357 EFI_DEVICE_PATH_PROTOCOL *OutDevicePath;\r
358 EFI_DEVICE_PATH_PROTOCOL *InpDevicePath;\r
359 EFI_DEVICE_PATH_PROTOCOL *ErrDevicePath;\r
360 BM_MENU_ENTRY *NewMenuEntry;\r
361 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
362 EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
363 VENDOR_DEVICE_PATH Vendor;\r
8e491a81 364 UINT32 FlowControl;\r
5c08e117 365 //\r
366 // Get all handles that have SerialIo protocol installed\r
367 //\r
368 InitializeListHead (&TerminalMenu.Head);\r
369 TerminalMenu.MenuNumber = 0;\r
370 Status = gBS->LocateHandleBuffer (\r
371 ByProtocol,\r
372 &gEfiSerialIoProtocolGuid,\r
373 NULL,\r
374 &NoHandles,\r
375 &Handles\r
376 );\r
377 if (EFI_ERROR (Status)) {\r
378 //\r
379 // No serial ports present\r
380 //\r
381 return EFI_UNSUPPORTED;\r
382 }\r
383\r
384 //\r
385 // Sort Uart handles array with Acpi->UID from low to high\r
386 // then Terminal menu can be built from low Acpi->UID to high Acpi->UID\r
387 //\r
388 SortedUartHandle (Handles, NoHandles);\r
389\r
390 for (Index = 0; Index < NoHandles; Index++) {\r
391 //\r
392 // Check to see whether the handle has DevicePath Protocol installed\r
393 //\r
394 gBS->HandleProtocol (\r
395 Handles[Index],\r
396 &gEfiDevicePathProtocolGuid,\r
397 (VOID **) &DevicePath\r
398 );\r
5c08e117 399\r
6b008b74
RN
400 Acpi = NULL;\r
401 for (Node = DevicePath; !IsDevicePathEnd (Node); Node = NextDevicePathNode (Node)) {\r
402 if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
403 break;\r
404 }\r
405 //\r
406 // Acpi points to the node before Uart node\r
407 //\r
408 Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
409 }\r
5c08e117 410\r
6b008b74 411 if ((Acpi != NULL) && IsIsaSerialNode (Acpi)) {\r
5c08e117 412 NewMenuEntry = BOpt_CreateMenuEntry (BM_TERMINAL_CONTEXT_SELECT);\r
413 if (NewMenuEntry == NULL) {\r
414 FreePool (Handles);\r
415 return EFI_OUT_OF_RESOURCES;\r
416 }\r
417\r
418 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
419 CopyMem (&NewMenuEntry->OptionNumber, &Acpi->UID, sizeof (UINT32));\r
420 NewTerminalContext->DevicePath = DuplicateDevicePath (DevicePath);\r
421 //\r
422 // BugBug: I have no choice, calling EfiLibStrFromDatahub will hang the system!\r
423 // coz' the misc data for each platform is not correct, actually it's the device path stored in\r
424 // datahub which is not completed, so a searching for end of device path will enter a\r
425 // dead-loop.\r
426 //\r
427 NewMenuEntry->DisplayString = EfiLibStrFromDatahub (DevicePath);\r
428 if (NULL == NewMenuEntry->DisplayString) {\r
429 NewMenuEntry->DisplayString = DevicePathToStr (DevicePath);\r
430 }\r
431\r
432 NewMenuEntry->HelpString = NULL;\r
433\r
434 gBS->HandleProtocol (\r
435 Handles[Index],\r
436 &gEfiSerialIoProtocolGuid,\r
437 (VOID **) &SerialIo\r
438 );\r
439\r
440 CopyMem (\r
441 &NewTerminalContext->BaudRate,\r
442 &SerialIo->Mode->BaudRate,\r
443 sizeof (UINT64)\r
444 );\r
445\r
446 CopyMem (\r
447 &NewTerminalContext->DataBits,\r
448 &SerialIo->Mode->DataBits,\r
449 sizeof (UINT8)\r
450 );\r
451\r
452 CopyMem (\r
453 &NewTerminalContext->Parity,\r
454 &SerialIo->Mode->Parity,\r
455 sizeof (UINT8)\r
456 );\r
457\r
458 CopyMem (\r
459 &NewTerminalContext->StopBits,\r
460 &SerialIo->Mode->StopBits,\r
461 sizeof (UINT8)\r
462 );\r
8e491a81
ED
463\r
464 NewTerminalContext->FlowControl = 0;\r
465 SerialIo->GetControl(SerialIo, &FlowControl);\r
466 if ((FlowControl & EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE) != 0) {\r
467 NewTerminalContext->FlowControl = UART_FLOW_CONTROL_HARDWARE;\r
468 }\r
469\r
5c08e117 470 InsertTailList (&TerminalMenu.Head, &NewMenuEntry->Link);\r
471 TerminalMenu.MenuNumber++;\r
472 }\r
473 }\r
474 if (Handles != NULL) {\r
475 FreePool (Handles);\r
476 }\r
477\r
478 //\r
479 // Get L"ConOut", L"ConIn" and L"ErrOut" from the Var\r
480 //\r
481 OutDevicePath = EfiLibGetVariable (L"ConOut", &gEfiGlobalVariableGuid);\r
482 InpDevicePath = EfiLibGetVariable (L"ConIn", &gEfiGlobalVariableGuid);\r
483 ErrDevicePath = EfiLibGetVariable (L"ErrOut", &gEfiGlobalVariableGuid);\r
484 if (OutDevicePath != NULL) {\r
485 UpdateComAttributeFromVariable (OutDevicePath);\r
486 }\r
487\r
488 if (InpDevicePath != NULL) {\r
489 UpdateComAttributeFromVariable (InpDevicePath);\r
490 }\r
491\r
492 if (ErrDevicePath != NULL) {\r
493 UpdateComAttributeFromVariable (ErrDevicePath);\r
494 }\r
495\r
496 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
497 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
498 if (NULL == NewMenuEntry) {\r
499 return EFI_NOT_FOUND;\r
500 }\r
501\r
502 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
503\r
504 NewTerminalContext->TerminalType = 0;\r
505 NewTerminalContext->IsConIn = FALSE;\r
506 NewTerminalContext->IsConOut = FALSE;\r
507 NewTerminalContext->IsStdErr = FALSE;\r
508\r
509 Vendor.Header.Type = MESSAGING_DEVICE_PATH;\r
510 Vendor.Header.SubType = MSG_VENDOR_DP;\r
511\r
512 for (Index2 = 0; Index2 < 4; Index2++) {\r
513 CopyMem (&Vendor.Guid, &TerminalTypeGuid[Index2], sizeof (EFI_GUID));\r
514 SetDevicePathNodeLength (&Vendor.Header, sizeof (VENDOR_DEVICE_PATH));\r
515 NewDevicePath = AppendDevicePathNode (\r
516 NewTerminalContext->DevicePath,\r
517 (EFI_DEVICE_PATH_PROTOCOL *) &Vendor\r
518 );\r
519 if (NewMenuEntry->HelpString != NULL) {\r
520 FreePool (NewMenuEntry->HelpString);\r
521 }\r
522 //\r
523 // NewMenuEntry->HelpString = DevicePathToStr (NewDevicePath);\r
524 // NewMenuEntry->DisplayString = NewMenuEntry->HelpString;\r
525 //\r
526 NewMenuEntry->HelpString = NULL;\r
527\r
528 if (BdsLibMatchDevicePaths (OutDevicePath, NewDevicePath)) {\r
529 NewTerminalContext->IsConOut = TRUE;\r
530 NewTerminalContext->TerminalType = (UINT8) Index2;\r
531 }\r
532\r
533 if (BdsLibMatchDevicePaths (InpDevicePath, NewDevicePath)) {\r
534 NewTerminalContext->IsConIn = TRUE;\r
535 NewTerminalContext->TerminalType = (UINT8) Index2;\r
536 }\r
537\r
538 if (BdsLibMatchDevicePaths (ErrDevicePath, NewDevicePath)) {\r
539 NewTerminalContext->IsStdErr = TRUE;\r
540 NewTerminalContext->TerminalType = (UINT8) Index2;\r
541 }\r
542 }\r
543 }\r
544\r
545 return EFI_SUCCESS;\r
546}\r
547\r
548/**\r
549 Update Com Ports attributes from DevicePath\r
550\r
551 @param DevicePath DevicePath that contains Com ports\r
552\r
553 @retval EFI_SUCCESS The update is successful.\r
554 @retval EFI_NOT_FOUND Can not find specific menu entry\r
555**/\r
556EFI_STATUS\r
557UpdateComAttributeFromVariable (\r
558 EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
559 )\r
560{\r
561 EFI_DEVICE_PATH_PROTOCOL *Node;\r
562 EFI_DEVICE_PATH_PROTOCOL *SerialNode;\r
563 ACPI_HID_DEVICE_PATH *Acpi;\r
564 UART_DEVICE_PATH *Uart;\r
565 UART_DEVICE_PATH *Uart1;\r
5c08e117 566 UINTN TerminalNumber;\r
567 BM_MENU_ENTRY *NewMenuEntry;\r
568 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
569 UINTN Index;\r
8e491a81
ED
570 UART_FLOW_CONTROL_DEVICE_PATH *FlowControlNode;\r
571 BOOLEAN HasFlowControlNode;\r
5c08e117 572\r
8e491a81 573 HasFlowControlNode = FALSE;\r
5c08e117 574 Node = DevicePath;\r
575 Node = NextDevicePathNode (Node);\r
576 TerminalNumber = 0;\r
577 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
578 while (!IsDevicePathEnd (Node)) {\r
6b008b74
RN
579 Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
580 if (IsIsaSerialNode (Acpi)) {\r
581 CopyMem (&TerminalNumber, &Acpi->UID, sizeof (UINT32));\r
5c08e117 582 }\r
583\r
584 if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
585 Uart = (UART_DEVICE_PATH *) Node;\r
586 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, TerminalNumber);\r
587 if (NULL == NewMenuEntry) {\r
588 return EFI_NOT_FOUND;\r
589 }\r
590\r
591 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
592 CopyMem (\r
593 &NewTerminalContext->BaudRate,\r
594 &Uart->BaudRate,\r
595 sizeof (UINT64)\r
596 );\r
597\r
598 CopyMem (\r
599 &NewTerminalContext->DataBits,\r
600 &Uart->DataBits,\r
601 sizeof (UINT8)\r
602 );\r
603\r
604 CopyMem (\r
605 &NewTerminalContext->Parity,\r
606 &Uart->Parity,\r
607 sizeof (UINT8)\r
608 );\r
609\r
610 CopyMem (\r
611 &NewTerminalContext->StopBits,\r
612 &Uart->StopBits,\r
613 sizeof (UINT8)\r
614 );\r
615\r
8e491a81
ED
616 FlowControlNode = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (Node);\r
617 if (IsUartFlowControlNode (FlowControlNode)) {\r
618 HasFlowControlNode = TRUE;\r
619 NewTerminalContext->FlowControl = (UINT8) ReadUnaligned32 (&FlowControlNode->FlowControlMap);\r
620 } else if (NewTerminalContext->FlowControl != 0) {\r
621 //\r
622 // No Flow Control device path node, assumption no Flow control\r
623 //\r
624 NewTerminalContext->FlowControl = 0;\r
625 }\r
626\r
5c08e117 627 SerialNode = NewTerminalContext->DevicePath;\r
628 SerialNode = NextDevicePathNode (SerialNode);\r
629 while (!IsDevicePathEnd (SerialNode)) {\r
630 if ((DevicePathType (SerialNode) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (SerialNode) == MSG_UART_DP)) {\r
631 //\r
632 // Update following device paths according to\r
633 // previous acquired uart attributes\r
634 //\r
635 Uart1 = (UART_DEVICE_PATH *) SerialNode;\r
636 CopyMem (\r
637 &Uart1->BaudRate,\r
638 &NewTerminalContext->BaudRate,\r
639 sizeof (UINT64)\r
640 );\r
641\r
642 CopyMem (\r
643 &Uart1->DataBits,\r
644 &NewTerminalContext->DataBits,\r
645 sizeof (UINT8)\r
646 );\r
647 CopyMem (\r
648 &Uart1->Parity,\r
649 &NewTerminalContext->Parity,\r
650 sizeof (UINT8)\r
651 );\r
652 CopyMem (\r
653 &Uart1->StopBits,\r
654 &NewTerminalContext->StopBits,\r
655 sizeof (UINT8)\r
656 );\r
657\r
8e491a81
ED
658 FlowControlNode = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (SerialNode);\r
659 if (IsUartFlowControlNode (FlowControlNode)) {\r
660 FlowControlNode->FlowControlMap = NewTerminalContext->FlowControl;\r
661 } else {\r
662 if (HasFlowControlNode) {\r
663 mFlowControlDevicePath.FlowControlMap = NewTerminalContext->FlowControl;\r
664 NewTerminalContext->DevicePath = AppendDevicePathNode (\r
665 NewTerminalContext->DevicePath,\r
666 (EFI_DEVICE_PATH_PROTOCOL *) (&mFlowControlDevicePath)\r
667 );\r
668 }\r
669 }\r
5c08e117 670 break;\r
671 }\r
672\r
673 SerialNode = NextDevicePathNode (SerialNode);\r
674 }\r
675 //\r
676 // end while\r
677 //\r
678 }\r
679\r
680 Node = NextDevicePathNode (Node);\r
681 }\r
682 //\r
683 // end while\r
684 //\r
685 }\r
686\r
687 return EFI_SUCCESS;\r
688}\r
689\r
690/**\r
691 Build up Console Menu based on types passed in. The type can\r
692 be BM_CONSOLE_IN_CONTEXT_SELECT, BM_CONSOLE_OUT_CONTEXT_SELECT\r
693 and BM_CONSOLE_ERR_CONTEXT_SELECT.\r
694\r
695 @param ConsoleMenuType Can be BM_CONSOLE_IN_CONTEXT_SELECT, BM_CONSOLE_OUT_CONTEXT_SELECT\r
696 and BM_CONSOLE_ERR_CONTEXT_SELECT.\r
697\r
698 @retval EFI_UNSUPPORTED The type passed in is not in the 3 types defined.\r
0a6f4824 699 @retval EFI_NOT_FOUND If the EFI Variable defined in UEFI spec with name "ConOutDev",\r
5c08e117 700 "ConInDev" or "ConErrDev" doesn't exists.\r
701 @retval EFI_OUT_OF_RESOURCES Not enough resource to complete the operations.\r
702 @retval EFI_SUCCESS Function completes successfully.\r
703\r
704**/\r
705EFI_STATUS\r
706GetConsoleMenu (\r
707 IN UINTN ConsoleMenuType\r
708 )\r
709{\r
710 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
711 EFI_DEVICE_PATH_PROTOCOL *AllDevicePath;\r
712 EFI_DEVICE_PATH_PROTOCOL *MultiDevicePath;\r
713 EFI_DEVICE_PATH_PROTOCOL *DevicePathInst;\r
714 UINTN Size;\r
715 UINTN AllCount;\r
716 UINTN Index;\r
717 UINTN Index2;\r
718 BM_MENU_ENTRY *NewMenuEntry;\r
719 BM_CONSOLE_CONTEXT *NewConsoleContext;\r
720 TYPE_OF_TERMINAL Terminal;\r
721 UINTN Com;\r
722 BM_MENU_OPTION *ConsoleMenu;\r
723\r
724 DevicePath = NULL;\r
725 AllDevicePath = NULL;\r
726 AllCount = 0;\r
727 switch (ConsoleMenuType) {\r
728 case BM_CONSOLE_IN_CONTEXT_SELECT:\r
729 ConsoleMenu = &ConsoleInpMenu;\r
730 DevicePath = EfiLibGetVariable (\r
731 L"ConIn",\r
732 &gEfiGlobalVariableGuid\r
733 );\r
734\r
735 AllDevicePath = EfiLibGetVariable (\r
736 L"ConInDev",\r
737 &gEfiGlobalVariableGuid\r
738 );\r
739 break;\r
740\r
741 case BM_CONSOLE_OUT_CONTEXT_SELECT:\r
742 ConsoleMenu = &ConsoleOutMenu;\r
743 DevicePath = EfiLibGetVariable (\r
744 L"ConOut",\r
745 &gEfiGlobalVariableGuid\r
746 );\r
747\r
748 AllDevicePath = EfiLibGetVariable (\r
749 L"ConOutDev",\r
750 &gEfiGlobalVariableGuid\r
751 );\r
752 break;\r
753\r
754 case BM_CONSOLE_ERR_CONTEXT_SELECT:\r
755 ConsoleMenu = &ConsoleErrMenu;\r
756 DevicePath = EfiLibGetVariable (\r
757 L"ErrOut",\r
758 &gEfiGlobalVariableGuid\r
759 );\r
760\r
761 AllDevicePath = EfiLibGetVariable (\r
762 L"ErrOutDev",\r
763 &gEfiGlobalVariableGuid\r
764 );\r
765 break;\r
766\r
767 default:\r
768 return EFI_UNSUPPORTED;\r
769 }\r
770\r
771 if (NULL == AllDevicePath) {\r
772 return EFI_NOT_FOUND;\r
773 }\r
774\r
775 InitializeListHead (&ConsoleMenu->Head);\r
776\r
777 AllCount = EfiDevicePathInstanceCount (AllDevicePath);\r
778 ConsoleMenu->MenuNumber = 0;\r
779 //\r
780 // Following is menu building up for Console Devices selected.\r
781 //\r
782 MultiDevicePath = AllDevicePath;\r
783 Index2 = 0;\r
784 for (Index = 0; Index < AllCount; Index++) {\r
785 DevicePathInst = GetNextDevicePathInstance (&MultiDevicePath, &Size);\r
786\r
787 NewMenuEntry = BOpt_CreateMenuEntry (BM_CONSOLE_CONTEXT_SELECT);\r
788 if (NULL == NewMenuEntry) {\r
789 return EFI_OUT_OF_RESOURCES;\r
790 }\r
791\r
792 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
793 NewMenuEntry->OptionNumber = Index2;\r
794\r
795 NewConsoleContext->DevicePath = DuplicateDevicePath (DevicePathInst);\r
84fa6c17 796 ASSERT (NewConsoleContext->DevicePath != NULL);\r
5c08e117 797 NewMenuEntry->DisplayString = EfiLibStrFromDatahub (NewConsoleContext->DevicePath);\r
798 if (NULL == NewMenuEntry->DisplayString) {\r
799 NewMenuEntry->DisplayString = DevicePathToStr (NewConsoleContext->DevicePath);\r
800 }\r
801\r
802 NewConsoleContext->IsTerminal = IsTerminalDevicePath (\r
803 NewConsoleContext->DevicePath,\r
804 &Terminal,\r
805 &Com\r
806 );\r
807\r
808 NewConsoleContext->IsActive = BdsLibMatchDevicePaths (\r
809 DevicePath,\r
810 NewConsoleContext->DevicePath\r
811 );\r
812\r
813 if (NewConsoleContext->IsTerminal) {\r
814 BOpt_DestroyMenuEntry (NewMenuEntry);\r
815 } else {\r
816 Index2++;\r
817 ConsoleMenu->MenuNumber++;\r
818 InsertTailList (&ConsoleMenu->Head, &NewMenuEntry->Link);\r
819 }\r
820 }\r
821\r
822 return EFI_SUCCESS;\r
823}\r
824\r
825/**\r
826 Build up ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
827\r
828 @retval EFI_SUCCESS The function always complete successfully.\r
829\r
830**/\r
831EFI_STATUS\r
832GetAllConsoles (\r
833 VOID\r
834 )\r
835{\r
836 GetConsoleMenu (BM_CONSOLE_IN_CONTEXT_SELECT);\r
837 GetConsoleMenu (BM_CONSOLE_OUT_CONTEXT_SELECT);\r
838 GetConsoleMenu (BM_CONSOLE_ERR_CONTEXT_SELECT);\r
839 return EFI_SUCCESS;\r
840}\r
841\r
842/**\r
843 Free ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
844\r
845 @retval EFI_SUCCESS The function always complete successfully.\r
846**/\r
847EFI_STATUS\r
848FreeAllConsoles (\r
849 VOID\r
850 )\r
851{\r
852 BOpt_FreeMenu (&ConsoleOutMenu);\r
853 BOpt_FreeMenu (&ConsoleInpMenu);\r
854 BOpt_FreeMenu (&ConsoleErrMenu);\r
855 BOpt_FreeMenu (&TerminalMenu);\r
856 return EFI_SUCCESS;\r
857}\r
858\r
859/**\r
860 Test whether DevicePath is a valid Terminal\r
861\r
862\r
863 @param DevicePath DevicePath to be checked\r
864 @param Termi If DevicePath is valid Terminal, terminal type is returned.\r
865 @param Com If DevicePath is valid Terminal, Com Port type is returned.\r
866\r
867 @retval TRUE If DevicePath point to a Terminal.\r
868 @retval FALSE If DevicePath does not point to a Terminal.\r
869\r
870**/\r
871BOOLEAN\r
872IsTerminalDevicePath (\r
873 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
874 OUT TYPE_OF_TERMINAL *Termi,\r
875 OUT UINTN *Com\r
876 )\r
877{\r
6b008b74
RN
878 BOOLEAN IsTerminal;\r
879 EFI_DEVICE_PATH_PROTOCOL *Node;\r
880 VENDOR_DEVICE_PATH *Vendor;\r
881 UART_DEVICE_PATH *Uart;\r
882 ACPI_HID_DEVICE_PATH *Acpi;\r
5c08e117 883\r
884 IsTerminal = FALSE;\r
885\r
6b008b74
RN
886 Uart = NULL;\r
887 Vendor = NULL;\r
888 Acpi = NULL;\r
889 for (Node = DevicePath; !IsDevicePathEnd (Node); Node = NextDevicePathNode (Node)) {\r
890 //\r
891 // Vendor points to the node before the End node\r
892 //\r
893 Vendor = (VENDOR_DEVICE_PATH *) Node;\r
894\r
895 if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
896 Uart = (UART_DEVICE_PATH *) Node;\r
897 }\r
898\r
899 if (Uart == NULL) {\r
900 //\r
901 // Acpi points to the node before the UART node\r
902 //\r
903 Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
904 }\r
5c08e117 905 }\r
906\r
6b008b74
RN
907 if (Vendor == NULL ||\r
908 DevicePathType (Vendor) != MESSAGING_DEVICE_PATH ||\r
909 DevicePathSubType (Vendor) != MSG_VENDOR_DP ||\r
910 Uart == NULL) {\r
911 return FALSE;\r
912 }\r
5c08e117 913\r
914 //\r
915 // There are four kinds of Terminal types\r
916 // check to see whether this devicepath\r
917 // is one of that type\r
918 //\r
6b008b74 919 if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[0])) {\r
13078b3f 920 *Termi = TerminalTypePcAnsi;\r
5c08e117 921 IsTerminal = TRUE;\r
922 } else {\r
6b008b74 923 if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[1])) {\r
13078b3f 924 *Termi = TerminalTypeVt100;\r
5c08e117 925 IsTerminal = TRUE;\r
926 } else {\r
6b008b74 927 if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[2])) {\r
13078b3f 928 *Termi = TerminalTypeVt100Plus;\r
5c08e117 929 IsTerminal = TRUE;\r
930 } else {\r
6b008b74 931 if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[3])) {\r
13078b3f 932 *Termi = TerminalTypeVtUtf8;\r
5c08e117 933 IsTerminal = TRUE;\r
934 } else {\r
935 IsTerminal = FALSE;\r
936 }\r
937 }\r
938 }\r
939 }\r
940\r
941 if (!IsTerminal) {\r
942 return FALSE;\r
943 }\r
944\r
6b008b74 945 if ((Acpi != NULL) && IsIsaSerialNode (Acpi)) {\r
5c08e117 946 CopyMem (Com, &Acpi->UID, sizeof (UINT32));\r
947 } else {\r
948 return FALSE;\r
949 }\r
950\r
951 return TRUE;\r
952}\r
953\r
954/**\r
955 Get mode number according to column and row\r
956\r
957 @param CallbackData The BMM context data.\r
958**/\r
959VOID\r
960GetConsoleOutMode (\r
961 IN BMM_CALLBACK_DATA *CallbackData\r
962 )\r
963{\r
964 UINTN Col;\r
965 UINTN Row;\r
966 UINTN CurrentCol;\r
967 UINTN CurrentRow;\r
968 UINTN Mode;\r
969 UINTN MaxMode;\r
970 EFI_STATUS Status;\r
5c08e117 971 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
972\r
973 ConOut = gST->ConOut;\r
974 MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
6aa22a17 975\r
32bc1227 976 CurrentCol = PcdGet32 (PcdSetupConOutColumn);\r
977 CurrentRow = PcdGet32 (PcdSetupConOutRow);\r
6aa22a17 978 for (Mode = 0; Mode < MaxMode; Mode++) {\r
979 Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
980 if (!EFI_ERROR(Status)) {\r
981 if (CurrentCol == Col && CurrentRow == Row) {\r
982 CallbackData->BmmFakeNvData.ConsoleOutMode = (UINT16) Mode;\r
983 break;\r
5c08e117 984 }\r
985 }\r
5c08e117 986 }\r
987}\r
be9304f3
ED
988\r
989/**\r
990\r
991 Initialize console input device check box to ConsoleInCheck[MAX_MENU_NUMBER]\r
992 in BMM_FAKE_NV_DATA structure.\r
993\r
994 @param CallbackData The BMM context data.\r
995\r
0a6f4824
LG
996**/\r
997VOID\r
be9304f3
ED
998GetConsoleInCheck (\r
999 IN BMM_CALLBACK_DATA *CallbackData\r
1000 )\r
1001{\r
1002 UINT16 Index;\r
0a6f4824 1003 BM_MENU_ENTRY *NewMenuEntry;\r
be9304f3
ED
1004 UINT8 *ConInCheck;\r
1005 BM_CONSOLE_CONTEXT *NewConsoleContext;\r
0a6f4824 1006\r
be9304f3 1007 ASSERT (CallbackData != NULL);\r
0a6f4824 1008\r
be9304f3
ED
1009 ConInCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
1010 for (Index = 0; ((Index < ConsoleInpMenu.MenuNumber) && \\r
0a6f4824 1011 (Index < MAX_MENU_NUMBER)) ; Index++) {\r
be9304f3 1012 NewMenuEntry = BOpt_GetMenuEntry (&ConsoleInpMenu, Index);\r
0a6f4824 1013 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
be9304f3
ED
1014 ConInCheck[Index] = NewConsoleContext->IsActive;\r
1015 }\r
1016}\r
1017\r
1018/**\r
1019\r
1020 Initialize console output device check box to ConsoleOutCheck[MAX_MENU_NUMBER]\r
1021 in BMM_FAKE_NV_DATA structure.\r
1022\r
1023 @param CallbackData The BMM context data.\r
1024\r
0a6f4824
LG
1025**/\r
1026VOID\r
be9304f3
ED
1027GetConsoleOutCheck (\r
1028 IN BMM_CALLBACK_DATA *CallbackData\r
1029 )\r
1030{\r
1031 UINT16 Index;\r
0a6f4824 1032 BM_MENU_ENTRY *NewMenuEntry;\r
be9304f3
ED
1033 UINT8 *ConOutCheck;\r
1034 BM_CONSOLE_CONTEXT *NewConsoleContext;\r
0a6f4824 1035\r
be9304f3
ED
1036 ASSERT (CallbackData != NULL);\r
1037 ConOutCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
1038 for (Index = 0; ((Index < ConsoleOutMenu.MenuNumber) && \\r
0a6f4824 1039 (Index < MAX_MENU_NUMBER)) ; Index++) {\r
be9304f3 1040 NewMenuEntry = BOpt_GetMenuEntry (&ConsoleOutMenu, Index);\r
0a6f4824 1041 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
be9304f3
ED
1042 ConOutCheck[Index] = NewConsoleContext->IsActive;\r
1043 }\r
1044}\r
0a6f4824 1045\r
be9304f3
ED
1046/**\r
1047\r
1048 Initialize standard error output device check box to ConsoleErrCheck[MAX_MENU_NUMBER]\r
1049 in BMM_FAKE_NV_DATA structure.\r
1050\r
1051 @param CallbackData The BMM context data.\r
1052\r
0a6f4824
LG
1053**/\r
1054VOID\r
be9304f3
ED
1055GetConsoleErrCheck (\r
1056 IN BMM_CALLBACK_DATA *CallbackData\r
1057 )\r
1058{\r
1059 UINT16 Index;\r
0a6f4824 1060 BM_MENU_ENTRY *NewMenuEntry;\r
be9304f3
ED
1061 UINT8 *ConErrCheck;\r
1062 BM_CONSOLE_CONTEXT *NewConsoleContext;\r
0a6f4824 1063\r
be9304f3
ED
1064 ASSERT (CallbackData != NULL);\r
1065 ConErrCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
1066 for (Index = 0; ((Index < ConsoleErrMenu.MenuNumber) && \\r
0a6f4824 1067 (Index < MAX_MENU_NUMBER)) ; Index++) {\r
be9304f3 1068 NewMenuEntry = BOpt_GetMenuEntry (&ConsoleErrMenu, Index);\r
0a6f4824 1069 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
be9304f3
ED
1070 ConErrCheck[Index] = NewConsoleContext->IsActive;\r
1071 }\r
1072}\r
1073\r
1074/**\r
1075\r
1076 Initialize terminal attributes (baudrate, data rate, stop bits, parity and terminal type)\r
1077 to BMM_FAKE_NV_DATA structure.\r
1078\r
1079 @param CallbackData The BMM context data.\r
1080\r
0a6f4824
LG
1081**/\r
1082VOID\r
be9304f3
ED
1083GetTerminalAttribute (\r
1084 IN BMM_CALLBACK_DATA *CallbackData\r
1085 )\r
1086{\r
1087 BMM_FAKE_NV_DATA *CurrentFakeNVMap;\r
1088 BM_MENU_ENTRY *NewMenuEntry;\r
0a6f4824
LG
1089 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
1090 UINT16 TerminalIndex;\r
be9304f3
ED
1091 UINT8 AttributeIndex;\r
1092\r
1093 ASSERT (CallbackData != NULL);\r
0a6f4824
LG
1094\r
1095 CurrentFakeNVMap = &CallbackData->BmmFakeNvData;\r
be9304f3 1096 for (TerminalIndex = 0; ((TerminalIndex < TerminalMenu.MenuNumber) && \\r
0a6f4824 1097 (TerminalIndex < MAX_MENU_NUMBER)); TerminalIndex++) {\r
be9304f3
ED
1098 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, TerminalIndex);\r
1099 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
1100 for (AttributeIndex = 0; AttributeIndex < sizeof (BaudRateList) / sizeof (BaudRateList [0]); AttributeIndex++) {\r
1101 if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[AttributeIndex].Value)) {\r
1102 NewTerminalContext->BaudRateIndex = AttributeIndex;\r
1103 break;\r
1104 }\r
1105 }\r
bdb898a5 1106 for (AttributeIndex = 0; AttributeIndex < ARRAY_SIZE (DataBitsList); AttributeIndex++) {\r
be9304f3
ED
1107 if (NewTerminalContext->DataBits == (UINT64) (DataBitsList[AttributeIndex].Value)) {\r
1108 NewTerminalContext->DataBitsIndex = AttributeIndex;\r
1109 break;\r
1110 }\r
0a6f4824
LG
1111 }\r
1112\r
bdb898a5 1113 for (AttributeIndex = 0; AttributeIndex < ARRAY_SIZE (ParityList); AttributeIndex++) {\r
be9304f3
ED
1114 if (NewTerminalContext->Parity == (UINT64) (ParityList[AttributeIndex].Value)) {\r
1115 NewTerminalContext->ParityIndex = AttributeIndex;\r
1116 break;\r
1117 }\r
0a6f4824
LG
1118 }\r
1119\r
bdb898a5 1120 for (AttributeIndex = 0; AttributeIndex < ARRAY_SIZE (StopBitsList); AttributeIndex++) {\r
be9304f3
ED
1121 if (NewTerminalContext->StopBits == (UINT64) (StopBitsList[AttributeIndex].Value)) {\r
1122 NewTerminalContext->StopBitsIndex = AttributeIndex;\r
1123 break;\r
1124 }\r
0a6f4824 1125 }\r
be9304f3
ED
1126 CurrentFakeNVMap->COMBaudRate[TerminalIndex] = NewTerminalContext->BaudRateIndex;\r
1127 CurrentFakeNVMap->COMDataRate[TerminalIndex] = NewTerminalContext->DataBitsIndex;\r
1128 CurrentFakeNVMap->COMStopBits[TerminalIndex] = NewTerminalContext->StopBitsIndex;\r
0a6f4824 1129 CurrentFakeNVMap->COMParity[TerminalIndex] = NewTerminalContext->ParityIndex;\r
be9304f3
ED
1130 CurrentFakeNVMap->COMTerminalType[TerminalIndex] = NewTerminalContext->TerminalType;\r
1131 CurrentFakeNVMap->COMFlowControl[TerminalIndex] = NewTerminalContext->FlowControl;\r
0a6f4824 1132 }\r
be9304f3
ED
1133}\r
1134\r