2 BDS Lib functions which contain all the code to connect console device
4 Copyright (c) 2004 - 2008, Intel Corporation. <BR>
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "InternalBdsLib.h"
18 Check if we need to save the EFI variable with "ConVarName" as name
21 @param ConVarName The name of the EFI variable.
23 @retval TRUE Set the EFI variabel as NV type.
24 @retval FALSE EFI variabel as NV type can be set NonNV.
36 // If the variable includes "Dev" at last, we consider
37 // it does not support NV attribute.
39 while (*Ptr
!= L
'\0') {
43 if ((*(Ptr
- 3) == 'D') && (*(Ptr
- 2) == 'e') && (*(Ptr
- 1) == 'v')) {
52 This function update console variable based on ConVarName, it can
53 add or remove one specific console device path from the variable
55 @param ConVarName Console related variable name, ConIn, ConOut,
57 @param CustomizedConDevicePath The console device path which will be added to
58 the console variable ConVarName, this parameter
59 can not be multi-instance.
60 @param ExclusiveDevicePath The console device path which will be removed
61 from the console variable ConVarName, this
62 parameter can not be multi-instance.
64 @retval EFI_UNSUPPORTED Add or remove the same device path.
65 @retval EFI_SUCCESS Success add or remove the device path from the
71 BdsLibUpdateConsoleVariable (
72 IN CHAR16
*ConVarName
,
73 IN EFI_DEVICE_PATH_PROTOCOL
*CustomizedConDevicePath
,
74 IN EFI_DEVICE_PATH_PROTOCOL
*ExclusiveDevicePath
77 EFI_DEVICE_PATH_PROTOCOL
*VarConsole
;
79 EFI_DEVICE_PATH_PROTOCOL
*NewDevicePath
;
80 EFI_DEVICE_PATH_PROTOCOL
*TempNewDevicePath
;
87 // Notes: check the device path point, here should check
88 // with compare memory
90 if (CustomizedConDevicePath
== ExclusiveDevicePath
) {
91 return EFI_UNSUPPORTED
;
94 // Delete the ExclusiveDevicePath from current default console
96 VarConsole
= BdsLibGetVariableAndSize (
98 &gEfiGlobalVariableGuid
,
103 // Initialize NewDevicePath
105 NewDevicePath
= VarConsole
;
108 // If ExclusiveDevicePath is even the part of the instance in VarConsole, delete it.
109 // In the end, NewDevicePath is the final device path.
111 if (ExclusiveDevicePath
!= NULL
&& VarConsole
!= NULL
) {
112 NewDevicePath
= BdsLibDelPartMatchInstance (VarConsole
, ExclusiveDevicePath
);
115 // Try to append customized device path to NewDevicePath.
117 if (CustomizedConDevicePath
!= NULL
) {
118 if (!BdsLibMatchDevicePaths (NewDevicePath
, CustomizedConDevicePath
)) {
120 // Check if there is part of CustomizedConDevicePath in NewDevicePath, delete it.
122 NewDevicePath
= BdsLibDelPartMatchInstance (NewDevicePath
, CustomizedConDevicePath
);
124 // In the first check, the default console variable will be _ModuleEntryPoint,
125 // just append current customized device path
127 TempNewDevicePath
= NewDevicePath
;
128 NewDevicePath
= AppendDevicePathInstance (NewDevicePath
, CustomizedConDevicePath
);
129 if (TempNewDevicePath
!= NULL
) {
130 FreePool(TempNewDevicePath
);
136 // The attribute for ConInDev, ConOutDev and ErrOutDev does not include NV.
138 if (IsNvNeed(ConVarName
)) {
140 // ConVarName has NV attribute.
142 Attributes
= EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_RUNTIME_ACCESS
| EFI_VARIABLE_NON_VOLATILE
;
145 // ConVarName does not have NV attribute.
147 Attributes
= EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_RUNTIME_ACCESS
;
151 // Finally, Update the variable of the default console by NewDevicePath
155 &gEfiGlobalVariableGuid
,
157 GetDevicePathSize (NewDevicePath
),
161 if (VarConsole
== NewDevicePath
) {
162 if (VarConsole
!= NULL
) {
163 FreePool(VarConsole
);
166 if (VarConsole
!= NULL
) {
167 FreePool(VarConsole
);
170 FreePool(NewDevicePath
);
180 Connect the console device base on the variable ConVarName, if
181 device path of the ConVarName is multi-instance device path, if
182 anyone of the instances is connected success, then this function
185 @param ConVarName Console related variable name, ConIn, ConOut,
188 @retval EFI_NOT_FOUND There is not any console devices connected
190 @retval EFI_SUCCESS Success connect any one instance of the console
191 device path base on the variable ConVarName.
196 BdsLibConnectConsoleVariable (
197 IN CHAR16
*ConVarName
201 EFI_DEVICE_PATH_PROTOCOL
*StartDevicePath
;
203 EFI_DEVICE_PATH_PROTOCOL
*Instance
;
204 EFI_DEVICE_PATH_PROTOCOL
*Next
;
205 EFI_DEVICE_PATH_PROTOCOL
*CopyOfDevicePath
;
209 Status
= EFI_SUCCESS
;
213 // Check if the console variable exist
215 StartDevicePath
= BdsLibGetVariableAndSize (
217 &gEfiGlobalVariableGuid
,
220 if (StartDevicePath
== NULL
) {
221 return EFI_UNSUPPORTED
;
224 CopyOfDevicePath
= StartDevicePath
;
227 // Check every instance of the console variable
229 Instance
= GetNextDevicePathInstance (&CopyOfDevicePath
, &Size
);
231 while (!IsDevicePathEndType (Next
)) {
232 Next
= NextDevicePathNode (Next
);
235 SetDevicePathEndNode (Next
);
237 // Check USB1.1 console
239 if ((DevicePathType (Instance
) == MESSAGING_DEVICE_PATH
) &&
240 ((DevicePathSubType (Instance
) == MSG_USB_CLASS_DP
)
241 || (DevicePathSubType (Instance
) == MSG_USB_WWID_DP
)
244 // Check the Usb console in Usb2.0 bus firstly, then Usb1.1 bus
246 Status
= BdsLibConnectUsbDevByShortFormDP (PCI_CLASSC_PI_EHCI
, Instance
);
247 if (!EFI_ERROR (Status
)) {
251 Status
= BdsLibConnectUsbDevByShortFormDP (PCI_CLASSC_PI_UHCI
, Instance
);
252 if (!EFI_ERROR (Status
)) {
257 // Connect the instance device path
259 Status
= BdsLibConnectDevicePath (Instance
);
260 if (EFI_ERROR (Status
)) {
262 // Delete the instance from the console varialbe
264 BdsLibUpdateConsoleVariable (ConVarName
, NULL
, Instance
);
270 } while (CopyOfDevicePath
!= NULL
);
272 FreePool (StartDevicePath
);
275 return EFI_NOT_FOUND
;
283 This function will search every simpletxt devive in current system,
284 and make every simpletxt device as pertantial console device.
289 BdsLibConnectAllConsoles (
294 EFI_DEVICE_PATH_PROTOCOL
*ConDevicePath
;
296 EFI_HANDLE
*HandleBuffer
;
301 ConDevicePath
= NULL
;
304 // Update all the console varables
306 gBS
->LocateHandleBuffer (
308 &gEfiSimpleTextInProtocolGuid
,
314 for (Index
= 0; Index
< HandleCount
; Index
++) {
315 gBS
->HandleProtocol (
317 &gEfiDevicePathProtocolGuid
,
318 (VOID
**) &ConDevicePath
320 BdsLibUpdateConsoleVariable (L
"ConIn", ConDevicePath
, NULL
);
323 if (HandleBuffer
!= NULL
) {
324 FreePool(HandleBuffer
);
328 gBS
->LocateHandleBuffer (
330 &gEfiSimpleTextOutProtocolGuid
,
335 for (Index
= 0; Index
< HandleCount
; Index
++) {
336 gBS
->HandleProtocol (
338 &gEfiDevicePathProtocolGuid
,
339 (VOID
**) &ConDevicePath
341 BdsLibUpdateConsoleVariable (L
"ConOut", ConDevicePath
, NULL
);
342 BdsLibUpdateConsoleVariable (L
"ErrOut", ConDevicePath
, NULL
);
345 if (HandleBuffer
!= NULL
) {
346 FreePool(HandleBuffer
);
350 // Connect all console variables
352 BdsLibConnectAllDefaultConsoles ();
357 This function will connect console device base on the console
358 device variable ConIn, ConOut and ErrOut.
360 @retval EFI_SUCCESS At least one of the ConIn and ConOut device have
361 been connected success.
362 @retval EFI_STATUS Return the status of
363 BdsLibConnectConsoleVariable ().
368 BdsLibConnectAllDefaultConsoles (
375 // Connect all default console variables
379 // It seems impossible not to have any ConOut device on platform,
380 // so we check the status here.
382 Status
= BdsLibConnectConsoleVariable (L
"ConOut");
383 if (EFI_ERROR (Status
)) {
388 // Insert the performance probe for Console Out
390 PERF_START (NULL
, "ConOut", "BDS", 1);
391 PERF_END (NULL
, "ConOut", "BDS", 0);
394 // Because possibly the platform is legacy free, in such case,
395 // ConIn devices (Serial Port and PS2 Keyboard ) does not exist,
396 // so we need not check the status.
398 BdsLibConnectConsoleVariable (L
"ConIn");
401 // The _ModuleEntryPoint err out var is legal.
403 BdsLibConnectConsoleVariable (L
"ErrOut");