]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConsole.c
Update file guid to avoid conflict with other file.
[mirror_edk2.git] / IntelFrameworkModulePkg / Library / GenericBdsLib / BdsConsole.c
CommitLineData
5c08e117 1/** @file\r
2 BDS Lib functions which contain all the code to connect console device\r
3\r
2df686c6 4Copyright (c) 2004 - 2012, 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 "InternalBdsLib.h"\r
a637802c 16#include <IndustryStandard/Bmp.h>\r
17\r
5c08e117 18\r
19/**\r
20 Check if we need to save the EFI variable with "ConVarName" as name\r
21 as NV type\r
775a9b19 22 If ConVarName is NULL, then ASSERT().\r
23 \r
5c08e117 24 @param ConVarName The name of the EFI variable.\r
25\r
26 @retval TRUE Set the EFI variable as NV type.\r
27 @retval FALSE EFI variable as NV type can be set NonNV.\r
28**/\r
29BOOLEAN\r
30IsNvNeed (\r
31 IN CHAR16 *ConVarName\r
32 )\r
33{\r
34 CHAR16 *Ptr;\r
35\r
775a9b19 36 ASSERT (ConVarName != NULL);\r
37 \r
5c08e117 38 Ptr = ConVarName;\r
39\r
40 //\r
41 // If the variable includes "Dev" at last, we consider\r
42 // it does not support NV attribute.\r
43 //\r
44 while (*Ptr != L'\0') {\r
45 Ptr++;\r
46 }\r
47\r
9260b915 48 if (((INTN)((UINTN)Ptr - (UINTN)ConVarName) / sizeof (CHAR16)) <= 3) {\r
f0a3b1a2 49 return TRUE;\r
50 }\r
51 \r
5c08e117 52 if ((*(Ptr - 3) == 'D') && (*(Ptr - 2) == 'e') && (*(Ptr - 1) == 'v')) {\r
53 return FALSE;\r
54 } else {\r
55 return TRUE;\r
56 }\r
57}\r
58\r
dad60833 59/**\r
60 Fill console handle in System Table if there are no valid console handle in.\r
61\r
62 Firstly, check the validation of console handle in System Table. If it is invalid,\r
63 update it by the first console device handle from EFI console variable. \r
64\r
65 @param VarName The name of the EFI console variable.\r
66 @param ConsoleGuid Specified Console protocol GUID.\r
67 @param ConsoleHandle On IN, console handle in System Table to be checked. \r
68 On OUT, new console hanlde in system table.\r
69 @param ProtocolInterface On IN, console protocol on console handle in System Table to be checked. \r
70 On OUT, new console protocol on new console hanlde in system table.\r
406ddad3 71\r
72 @retval TRUE System Table has been updated.\r
73 @retval FALSE System Table hasn't been updated.\r
74\r
dad60833 75**/\r
406ddad3 76BOOLEAN \r
dad60833 77UpdateSystemTableConsole (\r
78 IN CHAR16 *VarName,\r
79 IN EFI_GUID *ConsoleGuid,\r
80 IN OUT EFI_HANDLE *ConsoleHandle,\r
81 IN OUT VOID **ProtocolInterface\r
82 )\r
83{\r
84 EFI_STATUS Status;\r
85 UINTN DevicePathSize;\r
86 EFI_DEVICE_PATH_PROTOCOL *FullDevicePath;\r
87 EFI_DEVICE_PATH_PROTOCOL *VarConsole;\r
88 EFI_DEVICE_PATH_PROTOCOL *Instance;\r
89 VOID *Interface;\r
90 EFI_HANDLE NewHandle;\r
91\r
92 ASSERT (VarName != NULL);\r
93 ASSERT (ConsoleHandle != NULL);\r
94 ASSERT (ConsoleGuid != NULL);\r
95 ASSERT (ProtocolInterface != NULL);\r
96\r
97 if (*ConsoleHandle != NULL) {\r
98 Status = gBS->HandleProtocol (\r
99 *ConsoleHandle,\r
100 ConsoleGuid,\r
101 &Interface\r
102 );\r
103 if (Status == EFI_SUCCESS && Interface == *ProtocolInterface) {\r
104 //\r
105 // If ConsoleHandle is valid and console protocol on this handle also\r
106 // also matched, just return.\r
107 //\r
406ddad3 108 return FALSE;\r
dad60833 109 }\r
110 }\r
111 \r
112 //\r
113 // Get all possible consoles device path from EFI variable\r
114 //\r
115 VarConsole = BdsLibGetVariableAndSize (\r
116 VarName,\r
117 &gEfiGlobalVariableGuid,\r
118 &DevicePathSize\r
119 );\r
120 if (VarConsole == NULL) {\r
121 //\r
122 // If there is no any console device, just return.\r
123 //\r
406ddad3 124 return FALSE;\r
dad60833 125 }\r
126\r
127 FullDevicePath = VarConsole;\r
128\r
129 do {\r
130 //\r
131 // Check every instance of the console variable\r
132 //\r
133 Instance = GetNextDevicePathInstance (&VarConsole, &DevicePathSize);\r
134 if (Instance == NULL) {\r
135 FreePool (FullDevicePath);\r
136 ASSERT (FALSE);\r
137 }\r
138 \r
139 //\r
140 // Find console device handle by device path instance\r
141 //\r
142 Status = gBS->LocateDevicePath (\r
143 ConsoleGuid,\r
144 &Instance,\r
145 &NewHandle\r
146 );\r
147 if (!EFI_ERROR (Status)) {\r
148 //\r
149 // Get the console protocol on this console device handle\r
150 //\r
151 Status = gBS->HandleProtocol (\r
152 NewHandle,\r
153 ConsoleGuid,\r
154 &Interface\r
155 );\r
156 if (!EFI_ERROR (Status)) {\r
157 //\r
158 // Update new console handle in System Table.\r
159 //\r
160 *ConsoleHandle = NewHandle;\r
161 *ProtocolInterface = Interface;\r
406ddad3 162 return TRUE;\r
dad60833 163 }\r
164 }\r
165\r
166 } while (Instance != NULL);\r
167\r
168 //\r
169 // No any available console devcie found.\r
170 //\r
406ddad3 171 return FALSE;\r
dad60833 172}\r
173\r
5c08e117 174/**\r
175 This function update console variable based on ConVarName, it can\r
176 add or remove one specific console device path from the variable\r
177\r
178 @param ConVarName Console related variable name, ConIn, ConOut,\r
179 ErrOut.\r
180 @param CustomizedConDevicePath The console device path which will be added to\r
181 the console variable ConVarName, this parameter\r
182 can not be multi-instance.\r
183 @param ExclusiveDevicePath The console device path which will be removed\r
184 from the console variable ConVarName, this\r
185 parameter can not be multi-instance.\r
186\r
187 @retval EFI_UNSUPPORTED The added device path is same to the removed one.\r
188 @retval EFI_SUCCESS Success add or remove the device path from the\r
189 console variable.\r
190\r
191**/\r
192EFI_STATUS\r
193EFIAPI\r
194BdsLibUpdateConsoleVariable (\r
195 IN CHAR16 *ConVarName,\r
196 IN EFI_DEVICE_PATH_PROTOCOL *CustomizedConDevicePath,\r
197 IN EFI_DEVICE_PATH_PROTOCOL *ExclusiveDevicePath\r
198 )\r
199{\r
63b30616 200 EFI_STATUS Status;\r
5c08e117 201 EFI_DEVICE_PATH_PROTOCOL *VarConsole;\r
202 UINTN DevicePathSize;\r
203 EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
204 EFI_DEVICE_PATH_PROTOCOL *TempNewDevicePath;\r
205 UINT32 Attributes;\r
206\r
207 VarConsole = NULL;\r
208 DevicePathSize = 0;\r
209\r
210 //\r
211 // Notes: check the device path point, here should check\r
212 // with compare memory\r
213 //\r
214 if (CustomizedConDevicePath == ExclusiveDevicePath) {\r
215 return EFI_UNSUPPORTED;\r
216 }\r
217 //\r
218 // Delete the ExclusiveDevicePath from current default console\r
219 //\r
220 VarConsole = BdsLibGetVariableAndSize (\r
221 ConVarName,\r
222 &gEfiGlobalVariableGuid,\r
223 &DevicePathSize\r
224 );\r
225\r
226 //\r
227 // Initialize NewDevicePath\r
228 //\r
229 NewDevicePath = VarConsole;\r
230\r
231 //\r
232 // If ExclusiveDevicePath is even the part of the instance in VarConsole, delete it.\r
233 // In the end, NewDevicePath is the final device path.\r
234 //\r
235 if (ExclusiveDevicePath != NULL && VarConsole != NULL) {\r
236 NewDevicePath = BdsLibDelPartMatchInstance (VarConsole, ExclusiveDevicePath);\r
237 }\r
238 //\r
239 // Try to append customized device path to NewDevicePath.\r
240 //\r
241 if (CustomizedConDevicePath != NULL) {\r
242 if (!BdsLibMatchDevicePaths (NewDevicePath, CustomizedConDevicePath)) {\r
243 //\r
244 // Check if there is part of CustomizedConDevicePath in NewDevicePath, delete it.\r
245 //\r
246 NewDevicePath = BdsLibDelPartMatchInstance (NewDevicePath, CustomizedConDevicePath);\r
247 //\r
248 // In the first check, the default console variable will be _ModuleEntryPoint,\r
249 // just append current customized device path\r
250 //\r
251 TempNewDevicePath = NewDevicePath;\r
252 NewDevicePath = AppendDevicePathInstance (NewDevicePath, CustomizedConDevicePath);\r
253 if (TempNewDevicePath != NULL) {\r
254 FreePool(TempNewDevicePath);\r
255 }\r
256 }\r
257 }\r
258\r
259 //\r
260 // The attribute for ConInDev, ConOutDev and ErrOutDev does not include NV.\r
261 //\r
262 if (IsNvNeed(ConVarName)) {\r
263 //\r
264 // ConVarName has NV attribute.\r
265 //\r
266 Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE;\r
267 } else {\r
268 //\r
269 // ConVarName does not have NV attribute.\r
270 //\r
271 Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS;\r
272 }\r
273\r
274 //\r
275 // Finally, Update the variable of the default console by NewDevicePath\r
276 //\r
f6079c70 277 DevicePathSize = GetDevicePathSize (NewDevicePath);\r
63b30616
RN
278 Status = gRT->SetVariable (\r
279 ConVarName,\r
280 &gEfiGlobalVariableGuid,\r
281 Attributes,\r
f6079c70 282 DevicePathSize,\r
63b30616
RN
283 NewDevicePath\r
284 );\r
f6079c70 285 if ((DevicePathSize == 0) && (Status == EFI_NOT_FOUND)) {\r
286 Status = EFI_SUCCESS;\r
287 }\r
63b30616 288 ASSERT_EFI_ERROR (Status);\r
5c08e117 289\r
290 if (VarConsole == NewDevicePath) {\r
291 if (VarConsole != NULL) {\r
292 FreePool(VarConsole);\r
293 }\r
294 } else {\r
295 if (VarConsole != NULL) {\r
296 FreePool(VarConsole);\r
297 }\r
298 if (NewDevicePath != NULL) {\r
299 FreePool(NewDevicePath);\r
300 }\r
301 }\r
302\r
f6079c70 303 return Status;\r
5c08e117 304\r
305}\r
306\r
307\r
308/**\r
309 Connect the console device base on the variable ConVarName, if\r
310 device path of the ConVarName is multi-instance device path, if\r
311 anyone of the instances is connected success, then this function\r
312 will return success.\r
313\r
314 @param ConVarName Console related variable name, ConIn, ConOut,\r
315 ErrOut.\r
316\r
317 @retval EFI_NOT_FOUND There is not any console devices connected\r
318 success\r
319 @retval EFI_SUCCESS Success connect any one instance of the console\r
320 device path base on the variable ConVarName.\r
321\r
322**/\r
323EFI_STATUS\r
324EFIAPI\r
325BdsLibConnectConsoleVariable (\r
326 IN CHAR16 *ConVarName\r
327 )\r
328{\r
329 EFI_STATUS Status;\r
330 EFI_DEVICE_PATH_PROTOCOL *StartDevicePath;\r
331 UINTN VariableSize;\r
332 EFI_DEVICE_PATH_PROTOCOL *Instance;\r
333 EFI_DEVICE_PATH_PROTOCOL *Next;\r
334 EFI_DEVICE_PATH_PROTOCOL *CopyOfDevicePath;\r
335 UINTN Size;\r
336 BOOLEAN DeviceExist;\r
337\r
338 Status = EFI_SUCCESS;\r
339 DeviceExist = FALSE;\r
340\r
341 //\r
342 // Check if the console variable exist\r
343 //\r
344 StartDevicePath = BdsLibGetVariableAndSize (\r
345 ConVarName,\r
346 &gEfiGlobalVariableGuid,\r
347 &VariableSize\r
348 );\r
349 if (StartDevicePath == NULL) {\r
350 return EFI_UNSUPPORTED;\r
351 }\r
352\r
353 CopyOfDevicePath = StartDevicePath;\r
354 do {\r
355 //\r
356 // Check every instance of the console variable\r
357 //\r
358 Instance = GetNextDevicePathInstance (&CopyOfDevicePath, &Size);\r
359 if (Instance == NULL) {\r
360 FreePool (StartDevicePath);\r
361 return EFI_UNSUPPORTED;\r
362 }\r
363 \r
364 Next = Instance;\r
365 while (!IsDevicePathEndType (Next)) {\r
366 Next = NextDevicePathNode (Next);\r
367 }\r
368\r
369 SetDevicePathEndNode (Next);\r
370 //\r
9572320f
RN
371 // Connect the USB console\r
372 // USB console device path is a short-form device path that \r
373 // starts with the first element being a USB WWID\r
374 // or a USB Class device path\r
5c08e117 375 //\r
a29a93b4 376 if ((DevicePathType (Instance) == MESSAGING_DEVICE_PATH) &&\r
377 ((DevicePathSubType (Instance) == MSG_USB_CLASS_DP)\r
378 || (DevicePathSubType (Instance) == MSG_USB_WWID_DP)\r
379 )) {\r
9572320f 380 Status = BdsLibConnectUsbDevByShortFormDP (0xFF, Instance);\r
a29a93b4 381 if (!EFI_ERROR (Status)) {\r
382 DeviceExist = TRUE;\r
383 }\r
5c08e117 384 } else {\r
a29a93b4 385 //\r
386 // Connect the instance device path\r
387 //\r
388 Status = BdsLibConnectDevicePath (Instance);\r
389 if (EFI_ERROR (Status)) {\r
390 //\r
391 // Delete the instance from the console varialbe\r
392 //\r
393 BdsLibUpdateConsoleVariable (ConVarName, NULL, Instance);\r
394 } else {\r
395 DeviceExist = TRUE;\r
396 }\r
5c08e117 397 }\r
398 FreePool(Instance);\r
399 } while (CopyOfDevicePath != NULL);\r
400\r
401 FreePool (StartDevicePath);\r
402\r
403 if (!DeviceExist) {\r
404 return EFI_NOT_FOUND;\r
405 }\r
406\r
407 return EFI_SUCCESS;\r
408}\r
409\r
410\r
411/**\r
412 This function will search every simpletext device in current system,\r
413 and make every simpletext device as pertantial console device.\r
414\r
415**/\r
416VOID\r
417EFIAPI\r
418BdsLibConnectAllConsoles (\r
419 VOID\r
420 )\r
421{\r
422 UINTN Index;\r
423 EFI_DEVICE_PATH_PROTOCOL *ConDevicePath;\r
424 UINTN HandleCount;\r
425 EFI_HANDLE *HandleBuffer;\r
426\r
427 Index = 0;\r
428 HandleCount = 0;\r
429 HandleBuffer = NULL;\r
430 ConDevicePath = NULL;\r
431\r
432 //\r
433 // Update all the console variables\r
434 //\r
435 gBS->LocateHandleBuffer (\r
436 ByProtocol,\r
437 &gEfiSimpleTextInProtocolGuid,\r
438 NULL,\r
439 &HandleCount,\r
440 &HandleBuffer\r
441 );\r
442\r
443 for (Index = 0; Index < HandleCount; Index++) {\r
444 gBS->HandleProtocol (\r
445 HandleBuffer[Index],\r
446 &gEfiDevicePathProtocolGuid,\r
447 (VOID **) &ConDevicePath\r
448 );\r
449 BdsLibUpdateConsoleVariable (L"ConIn", ConDevicePath, NULL);\r
450 }\r
451\r
452 if (HandleBuffer != NULL) {\r
453 FreePool(HandleBuffer);\r
454 HandleBuffer = NULL;\r
455 }\r
456\r
457 gBS->LocateHandleBuffer (\r
458 ByProtocol,\r
459 &gEfiSimpleTextOutProtocolGuid,\r
460 NULL,\r
461 &HandleCount,\r
462 &HandleBuffer\r
463 );\r
464 for (Index = 0; Index < HandleCount; Index++) {\r
465 gBS->HandleProtocol (\r
466 HandleBuffer[Index],\r
467 &gEfiDevicePathProtocolGuid,\r
468 (VOID **) &ConDevicePath\r
469 );\r
470 BdsLibUpdateConsoleVariable (L"ConOut", ConDevicePath, NULL);\r
471 BdsLibUpdateConsoleVariable (L"ErrOut", ConDevicePath, NULL);\r
472 }\r
473\r
474 if (HandleBuffer != NULL) {\r
475 FreePool(HandleBuffer);\r
476 }\r
477\r
478 //\r
479 // Connect all console variables\r
480 //\r
481 BdsLibConnectAllDefaultConsoles ();\r
482\r
483}\r
484\r
485/**\r
486 This function will connect console device base on the console\r
487 device variable ConIn, ConOut and ErrOut.\r
488\r
489 @retval EFI_SUCCESS At least one of the ConIn and ConOut device have\r
490 been connected success.\r
491 @retval EFI_STATUS Return the status of BdsLibConnectConsoleVariable ().\r
492\r
493**/\r
494EFI_STATUS\r
495EFIAPI\r
496BdsLibConnectAllDefaultConsoles (\r
497 VOID\r
498 )\r
499{\r
500 EFI_STATUS Status;\r
406ddad3 501 BOOLEAN SystemTableUpdated;\r
5c08e117 502\r
503 //\r
504 // Connect all default console variables\r
505 //\r
506\r
507 //\r
508 // It seems impossible not to have any ConOut device on platform,\r
509 // so we check the status here.\r
510 //\r
511 Status = BdsLibConnectConsoleVariable (L"ConOut");\r
512 if (EFI_ERROR (Status)) {\r
513 return Status;\r
514 }\r
515\r
516 //\r
517 // Insert the performance probe for Console Out\r
518 //\r
519 PERF_START (NULL, "ConOut", "BDS", 1);\r
520 PERF_END (NULL, "ConOut", "BDS", 0);\r
521\r
522 //\r
523 // Because possibly the platform is legacy free, in such case,\r
524 // ConIn devices (Serial Port and PS2 Keyboard ) does not exist,\r
525 // so we need not check the status.\r
526 //\r
527 BdsLibConnectConsoleVariable (L"ConIn");\r
528\r
529 //\r
530 // The _ModuleEntryPoint err out var is legal.\r
531 //\r
532 BdsLibConnectConsoleVariable (L"ErrOut");\r
533\r
406ddad3 534 SystemTableUpdated = FALSE;\r
dad60833 535 //\r
536 // Fill console handles in System Table if no console device assignd.\r
537 //\r
406ddad3 538 if (UpdateSystemTableConsole (L"ConIn", &gEfiSimpleTextInProtocolGuid, &gST->ConsoleInHandle, (VOID **) &gST->ConIn)) {\r
539 SystemTableUpdated = TRUE;\r
540 }\r
541 if (UpdateSystemTableConsole (L"ConOut", &gEfiSimpleTextOutProtocolGuid, &gST->ConsoleOutHandle, (VOID **) &gST->ConOut)) {\r
542 SystemTableUpdated = TRUE;\r
543 }\r
544 if (UpdateSystemTableConsole (L"ErrOut", &gEfiSimpleTextOutProtocolGuid, &gST->StandardErrorHandle, (VOID **) &gST->StdErr)) {\r
545 SystemTableUpdated = TRUE;\r
546 }\r
547\r
18cf3950 548 if (SystemTableUpdated) {\r
549 //\r
550 // Update the CRC32 in the EFI System Table header\r
551 //\r
552 gST->Hdr.CRC32 = 0;\r
553 gBS->CalculateCrc32 (\r
554 (UINT8 *) &gST->Hdr,\r
555 gST->Hdr.HeaderSize,\r
556 &gST->Hdr.CRC32\r
557 );\r
558 }\r
559\r
560 return EFI_SUCCESS;\r
561\r
562}\r
563\r
564/**\r
565 This function will connect console device except ConIn base on the console\r
566 device variable ConOut and ErrOut.\r
567\r
568 @retval EFI_SUCCESS At least one of the ConOut device have\r
569 been connected success.\r
570 @retval EFI_STATUS Return the status of BdsLibConnectConsoleVariable ().\r
571\r
572**/\r
573EFI_STATUS\r
574EFIAPI\r
575BdsLibConnectAllDefaultConsolesWithOutConIn (\r
576 VOID\r
577 )\r
578{\r
579 EFI_STATUS Status;\r
580 BOOLEAN SystemTableUpdated;\r
581\r
582 //\r
583 // Connect all default console variables except ConIn\r
584 //\r
585\r
586 //\r
587 // It seems impossible not to have any ConOut device on platform,\r
588 // so we check the status here.\r
589 //\r
590 Status = BdsLibConnectConsoleVariable (L"ConOut");\r
591 if (EFI_ERROR (Status)) {\r
592 return Status;\r
593 }\r
594\r
595 //\r
596 // Insert the performance probe for Console Out\r
597 //\r
598 PERF_START (NULL, "ConOut", "BDS", 1);\r
599 PERF_END (NULL, "ConOut", "BDS", 0);\r
600\r
601 //\r
602 // The _ModuleEntryPoint err out var is legal.\r
603 //\r
604 BdsLibConnectConsoleVariable (L"ErrOut");\r
605\r
606 SystemTableUpdated = FALSE;\r
607 //\r
608 // Fill console handles in System Table if no console device assignd.\r
609 //\r
610 if (UpdateSystemTableConsole (L"ConOut", &gEfiSimpleTextOutProtocolGuid, &gST->ConsoleOutHandle, (VOID **) &gST->ConOut)) {\r
611 SystemTableUpdated = TRUE;\r
612 }\r
613 if (UpdateSystemTableConsole (L"ErrOut", &gEfiSimpleTextOutProtocolGuid, &gST->StandardErrorHandle, (VOID **) &gST->StdErr)) {\r
614 SystemTableUpdated = TRUE;\r
615 }\r
616\r
406ddad3 617 if (SystemTableUpdated) {\r
618 //\r
619 // Update the CRC32 in the EFI System Table header\r
620 //\r
621 gST->Hdr.CRC32 = 0;\r
622 gBS->CalculateCrc32 (\r
623 (UINT8 *) &gST->Hdr,\r
624 gST->Hdr.HeaderSize,\r
625 &gST->Hdr.CRC32\r
626 );\r
627 }\r
dad60833 628\r
5c08e117 629 return EFI_SUCCESS;\r
630\r
631}\r
632\r
633/**\r
634 Convert a *.BMP graphics image to a GOP blt buffer. If a NULL Blt buffer\r
635 is passed in a GopBlt buffer will be allocated by this routine. If a GopBlt\r
636 buffer is passed in it will be used if it is big enough.\r
637\r
638 @param BmpImage Pointer to BMP file\r
639 @param BmpImageSize Number of bytes in BmpImage\r
640 @param GopBlt Buffer containing GOP version of BmpImage.\r
641 @param GopBltSize Size of GopBlt in bytes.\r
642 @param PixelHeight Height of GopBlt/BmpImage in pixels\r
643 @param PixelWidth Width of GopBlt/BmpImage in pixels\r
644\r
645 @retval EFI_SUCCESS GopBlt and GopBltSize are returned.\r
646 @retval EFI_UNSUPPORTED BmpImage is not a valid *.BMP image\r
647 @retval EFI_BUFFER_TOO_SMALL The passed in GopBlt buffer is not big enough.\r
648 GopBltSize will contain the required size.\r
649 @retval EFI_OUT_OF_RESOURCES No enough buffer to allocate.\r
650\r
651**/\r
652EFI_STATUS\r
653ConvertBmpToGopBlt (\r
654 IN VOID *BmpImage,\r
655 IN UINTN BmpImageSize,\r
656 IN OUT VOID **GopBlt,\r
657 IN OUT UINTN *GopBltSize,\r
658 OUT UINTN *PixelHeight,\r
659 OUT UINTN *PixelWidth\r
660 )\r
661{\r
662 UINT8 *Image;\r
663 UINT8 *ImageHeader;\r
664 BMP_IMAGE_HEADER *BmpHeader;\r
665 BMP_COLOR_MAP *BmpColorMap;\r
666 EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer;\r
667 EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;\r
88f2bdb5 668 UINT64 BltBufferSize;\r
5c08e117 669 UINTN Index;\r
670 UINTN Height;\r
671 UINTN Width;\r
672 UINTN ImageIndex;\r
a46c3657 673 UINT32 DataSizePerLine;\r
5c08e117 674 BOOLEAN IsAllocated;\r
a46c3657
ED
675 UINT32 ColorMapNum;\r
676\r
677 if (sizeof (BMP_IMAGE_HEADER) > BmpImageSize) {\r
678 return EFI_INVALID_PARAMETER;\r
679 }\r
5c08e117 680\r
681 BmpHeader = (BMP_IMAGE_HEADER *) BmpImage;\r
682\r
683 if (BmpHeader->CharB != 'B' || BmpHeader->CharM != 'M') {\r
684 return EFI_UNSUPPORTED;\r
685 }\r
686\r
687 //\r
688 // Doesn't support compress.\r
689 //\r
690 if (BmpHeader->CompressionType != 0) {\r
691 return EFI_UNSUPPORTED;\r
692 }\r
693\r
a46c3657
ED
694 //\r
695 // Only support BITMAPINFOHEADER format.\r
696 // BITMAPFILEHEADER + BITMAPINFOHEADER = BMP_IMAGE_HEADER\r
697 //\r
698 if (BmpHeader->HeaderSize != sizeof (BMP_IMAGE_HEADER) - OFFSET_OF(BMP_IMAGE_HEADER, HeaderSize)) {\r
699 return EFI_UNSUPPORTED;\r
700 }\r
701\r
702 //\r
703 // The data size in each line must be 4 byte alignment.\r
704 //\r
705 DataSizePerLine = ((BmpHeader->PixelWidth * BmpHeader->BitPerPixel + 31) >> 3) & (~0x3);\r
706 BltBufferSize = MultU64x32 (DataSizePerLine, BmpHeader->PixelHeight);\r
707 if (BltBufferSize > (UINT32) ~0) {\r
708 return EFI_INVALID_PARAMETER;\r
709 }\r
710\r
711 if ((BmpHeader->Size != BmpImageSize) || \r
712 (BmpHeader->Size < BmpHeader->ImageOffset) ||\r
713 (BmpHeader->Size - BmpHeader->ImageOffset != BmpHeader->PixelHeight * DataSizePerLine)) {\r
714 return EFI_INVALID_PARAMETER;\r
715 }\r
716\r
5c08e117 717 //\r
718 // Calculate Color Map offset in the image.\r
719 //\r
720 Image = BmpImage;\r
721 BmpColorMap = (BMP_COLOR_MAP *) (Image + sizeof (BMP_IMAGE_HEADER));\r
a46c3657
ED
722 if (BmpHeader->ImageOffset < sizeof (BMP_IMAGE_HEADER)) {\r
723 return EFI_INVALID_PARAMETER;\r
724 }\r
725\r
726 if (BmpHeader->ImageOffset > sizeof (BMP_IMAGE_HEADER)) {\r
727 switch (BmpHeader->BitPerPixel) {\r
728 case 1:\r
729 ColorMapNum = 2;\r
730 break;\r
731 case 4:\r
732 ColorMapNum = 16;\r
733 break;\r
734 case 8:\r
735 ColorMapNum = 256;\r
736 break;\r
737 default:\r
738 ColorMapNum = 0;\r
739 break;\r
740 }\r
741 if (BmpHeader->ImageOffset - sizeof (BMP_IMAGE_HEADER) != sizeof (BMP_COLOR_MAP) * ColorMapNum) {\r
742 return EFI_INVALID_PARAMETER;\r
743 }\r
744 }\r
5c08e117 745\r
746 //\r
747 // Calculate graphics image data address in the image\r
748 //\r
749 Image = ((UINT8 *) BmpImage) + BmpHeader->ImageOffset;\r
750 ImageHeader = Image;\r
751\r
752 //\r
753 // Calculate the BltBuffer needed size.\r
754 //\r
d2eec319 755 BltBufferSize = MultU64x32 ((UINT64) BmpHeader->PixelWidth, BmpHeader->PixelHeight);\r
756 //\r
757 // Ensure the BltBufferSize * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) doesn't overflow\r
758 //\r
759 if (BltBufferSize > DivU64x32 ((UINTN) ~0, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))) {\r
a46c3657
ED
760 return EFI_UNSUPPORTED;\r
761 }\r
d2eec319 762 BltBufferSize = MultU64x32 (BltBufferSize, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
763\r
5c08e117 764 IsAllocated = FALSE;\r
765 if (*GopBlt == NULL) {\r
766 //\r
767 // GopBlt is not allocated by caller.\r
768 //\r
88f2bdb5 769 *GopBltSize = (UINTN) BltBufferSize;\r
5c08e117 770 *GopBlt = AllocatePool (*GopBltSize);\r
771 IsAllocated = TRUE;\r
772 if (*GopBlt == NULL) {\r
773 return EFI_OUT_OF_RESOURCES;\r
774 }\r
775 } else {\r
776 //\r
777 // GopBlt has been allocated by caller.\r
778 //\r
2bf3421a 779 if (*GopBltSize < (UINTN) BltBufferSize) {\r
88f2bdb5 780 *GopBltSize = (UINTN) BltBufferSize;\r
5c08e117 781 return EFI_BUFFER_TOO_SMALL;\r
782 }\r
783 }\r
784\r
785 *PixelWidth = BmpHeader->PixelWidth;\r
786 *PixelHeight = BmpHeader->PixelHeight;\r
787\r
788 //\r
789 // Convert image from BMP to Blt buffer format\r
790 //\r
791 BltBuffer = *GopBlt;\r
792 for (Height = 0; Height < BmpHeader->PixelHeight; Height++) {\r
793 Blt = &BltBuffer[(BmpHeader->PixelHeight - Height - 1) * BmpHeader->PixelWidth];\r
794 for (Width = 0; Width < BmpHeader->PixelWidth; Width++, Image++, Blt++) {\r
795 switch (BmpHeader->BitPerPixel) {\r
796 case 1:\r
797 //\r
798 // Convert 1-bit (2 colors) BMP to 24-bit color\r
799 //\r
800 for (Index = 0; Index < 8 && Width < BmpHeader->PixelWidth; Index++) {\r
801 Blt->Red = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Red;\r
802 Blt->Green = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Green;\r
803 Blt->Blue = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Blue;\r
804 Blt++;\r
805 Width++;\r
806 }\r
807\r
808 Blt--;\r
809 Width--;\r
810 break;\r
811\r
812 case 4:\r
813 //\r
814 // Convert 4-bit (16 colors) BMP Palette to 24-bit color\r
815 //\r
816 Index = (*Image) >> 4;\r
817 Blt->Red = BmpColorMap[Index].Red;\r
818 Blt->Green = BmpColorMap[Index].Green;\r
819 Blt->Blue = BmpColorMap[Index].Blue;\r
820 if (Width < (BmpHeader->PixelWidth - 1)) {\r
821 Blt++;\r
822 Width++;\r
823 Index = (*Image) & 0x0f;\r
824 Blt->Red = BmpColorMap[Index].Red;\r
825 Blt->Green = BmpColorMap[Index].Green;\r
826 Blt->Blue = BmpColorMap[Index].Blue;\r
827 }\r
828 break;\r
829\r
830 case 8:\r
831 //\r
832 // Convert 8-bit (256 colors) BMP Palette to 24-bit color\r
833 //\r
834 Blt->Red = BmpColorMap[*Image].Red;\r
835 Blt->Green = BmpColorMap[*Image].Green;\r
836 Blt->Blue = BmpColorMap[*Image].Blue;\r
837 break;\r
838\r
839 case 24:\r
840 //\r
841 // It is 24-bit BMP.\r
842 //\r
843 Blt->Blue = *Image++;\r
844 Blt->Green = *Image++;\r
845 Blt->Red = *Image;\r
846 break;\r
847\r
848 default:\r
849 //\r
850 // Other bit format BMP is not supported.\r
851 //\r
852 if (IsAllocated) {\r
853 FreePool (*GopBlt);\r
854 *GopBlt = NULL;\r
855 }\r
856 return EFI_UNSUPPORTED;\r
857 break;\r
858 };\r
859\r
860 }\r
861\r
862 ImageIndex = (UINTN) (Image - ImageHeader);\r
863 if ((ImageIndex % 4) != 0) {\r
864 //\r
865 // Bmp Image starts each row on a 32-bit boundary!\r
866 //\r
867 Image = Image + (4 - (ImageIndex % 4));\r
868 }\r
869 }\r
870\r
871 return EFI_SUCCESS;\r
872}\r
873\r
5c08e117 874/**\r
24cdd14e
LG
875 Use SystemTable Conout to stop video based Simple Text Out consoles from going\r
876 to the video device. Put up LogoFile on every video device that is a console.\r
5c08e117 877\r
878 @param[in] LogoFile File name of logo to display on the center of the screen.\r
879\r
880 @retval EFI_SUCCESS ConsoleControl has been flipped to graphics and logo displayed.\r
881 @retval EFI_UNSUPPORTED Logo not found\r
882\r
883**/\r
884EFI_STATUS\r
885EFIAPI\r
886EnableQuietBoot (\r
887 IN EFI_GUID *LogoFile\r
888 )\r
889{\r
890 EFI_STATUS Status;\r
5c08e117 891 EFI_OEM_BADGING_PROTOCOL *Badging;\r
892 UINT32 SizeOfX;\r
893 UINT32 SizeOfY;\r
894 INTN DestX;\r
895 INTN DestY;\r
896 UINT8 *ImageData;\r
897 UINTN ImageSize;\r
898 UINTN BltSize;\r
899 UINT32 Instance;\r
900 EFI_BADGING_FORMAT Format;\r
901 EFI_BADGING_DISPLAY_ATTRIBUTE Attribute;\r
902 UINTN CoordinateX;\r
903 UINTN CoordinateY;\r
904 UINTN Height;\r
905 UINTN Width;\r
906 EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;\r
907 EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
908 UINT32 ColorDepth;\r
909 UINT32 RefreshRate;\r
910 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
a637802c 911 EFI_BOOT_LOGO_PROTOCOL *BootLogo;\r
912 UINTN NumberOfLogos;\r
913 EFI_GRAPHICS_OUTPUT_BLT_PIXEL *LogoBlt;\r
914 UINTN LogoDestX;\r
915 UINTN LogoDestY;\r
916 UINTN LogoHeight;\r
917 UINTN LogoWidth;\r
918 UINTN NewDestX;\r
919 UINTN NewDestY;\r
920 UINTN NewHeight;\r
921 UINTN NewWidth;\r
a46c3657 922 UINT64 BufferSize;\r
5c08e117 923\r
5c08e117 924 UgaDraw = NULL;\r
925 //\r
926 // Try to open GOP first\r
927 //\r
928 Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiGraphicsOutputProtocolGuid, (VOID **) &GraphicsOutput);\r
929 if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
930 GraphicsOutput = NULL;\r
931 //\r
932 // Open GOP failed, try to open UGA\r
933 //\r
934 Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiUgaDrawProtocolGuid, (VOID **) &UgaDraw);\r
935 }\r
936 if (EFI_ERROR (Status)) {\r
937 return EFI_UNSUPPORTED;\r
938 }\r
939\r
a637802c 940 //\r
941 // Try to open Boot Logo Protocol.\r
942 //\r
943 BootLogo = NULL;\r
944 gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo);\r
945\r
5c08e117 946 //\r
5d7c1609 947 // Erase Cursor from screen\r
5c08e117 948 //\r
5d7c1609 949 gST->ConOut->EnableCursor (gST->ConOut, FALSE);\r
950\r
951 Badging = NULL;\r
952 Status = gBS->LocateProtocol (&gEfiOEMBadgingProtocolGuid, NULL, (VOID **) &Badging);\r
5c08e117 953\r
954 if (GraphicsOutput != NULL) {\r
955 SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution;\r
956 SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution;\r
957\r
958 } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
959 Status = UgaDraw->GetMode (UgaDraw, &SizeOfX, &SizeOfY, &ColorDepth, &RefreshRate);\r
960 if (EFI_ERROR (Status)) {\r
961 return EFI_UNSUPPORTED;\r
962 }\r
963 } else {\r
964 return EFI_UNSUPPORTED;\r
965 }\r
966\r
a637802c 967 Blt = NULL;\r
968 NumberOfLogos = 0;\r
969 LogoDestX = 0;\r
970 LogoDestY = 0;\r
971 LogoHeight = 0;\r
972 LogoWidth = 0;\r
973 NewDestX = 0;\r
974 NewDestY = 0;\r
975 NewHeight = 0;\r
976 NewWidth = 0;\r
5c08e117 977 Instance = 0;\r
978 while (1) {\r
979 ImageData = NULL;\r
980 ImageSize = 0;\r
981\r
982 if (Badging != NULL) {\r
983 //\r
984 // Get image from OEMBadging protocol.\r
985 //\r
986 Status = Badging->GetImage (\r
987 Badging,\r
988 &Instance,\r
989 &Format,\r
990 &ImageData,\r
991 &ImageSize,\r
992 &Attribute,\r
993 &CoordinateX,\r
994 &CoordinateY\r
995 );\r
996 if (EFI_ERROR (Status)) {\r
a637802c 997 goto Done;\r
5c08e117 998 }\r
999\r
1000 //\r
1001 // Currently only support BMP format.\r
1002 //\r
1003 if (Format != EfiBadgingFormatBMP) {\r
1004 if (ImageData != NULL) {\r
1005 FreePool (ImageData);\r
1006 }\r
1007 continue;\r
1008 }\r
1009 } else {\r
1010 //\r
1011 // Get the specified image from FV.\r
1012 //\r
1013 Status = GetSectionFromAnyFv (LogoFile, EFI_SECTION_RAW, 0, (VOID **) &ImageData, &ImageSize);\r
1014 if (EFI_ERROR (Status)) {\r
1015 return EFI_UNSUPPORTED;\r
1016 }\r
1017\r
1018 CoordinateX = 0;\r
1019 CoordinateY = 0;\r
2df686c6 1020 if (!FeaturePcdGet(PcdBootlogoOnlyEnable)) {\r
1021 Attribute = EfiBadgingDisplayAttributeCenter;\r
1022 } else {\r
1023 Attribute = EfiBadgingDisplayAttributeCustomized;\r
1024 } \r
5c08e117 1025 }\r
1026\r
a637802c 1027 if (Blt != NULL) {\r
1028 FreePool (Blt);\r
1029 }\r
5c08e117 1030 Blt = NULL;\r
1031 Status = ConvertBmpToGopBlt (\r
1032 ImageData,\r
1033 ImageSize,\r
1034 (VOID **) &Blt,\r
1035 &BltSize,\r
1036 &Height,\r
1037 &Width\r
1038 );\r
1039 if (EFI_ERROR (Status)) {\r
1040 FreePool (ImageData);\r
1041\r
1042 if (Badging == NULL) {\r
1043 return Status;\r
1044 } else {\r
1045 continue;\r
1046 }\r
1047 }\r
1048\r
1049 //\r
1050 // Calculate the display position according to Attribute.\r
1051 //\r
1052 switch (Attribute) {\r
1053 case EfiBadgingDisplayAttributeLeftTop:\r
1054 DestX = CoordinateX;\r
1055 DestY = CoordinateY;\r
1056 break;\r
1057\r
1058 case EfiBadgingDisplayAttributeCenterTop:\r
1059 DestX = (SizeOfX - Width) / 2;\r
1060 DestY = CoordinateY;\r
1061 break;\r
1062\r
1063 case EfiBadgingDisplayAttributeRightTop:\r
1064 DestX = (SizeOfX - Width - CoordinateX);\r
1065 DestY = CoordinateY;;\r
1066 break;\r
1067\r
1068 case EfiBadgingDisplayAttributeCenterRight:\r
1069 DestX = (SizeOfX - Width - CoordinateX);\r
1070 DestY = (SizeOfY - Height) / 2;\r
1071 break;\r
1072\r
1073 case EfiBadgingDisplayAttributeRightBottom:\r
1074 DestX = (SizeOfX - Width - CoordinateX);\r
1075 DestY = (SizeOfY - Height - CoordinateY);\r
1076 break;\r
1077\r
1078 case EfiBadgingDisplayAttributeCenterBottom:\r
1079 DestX = (SizeOfX - Width) / 2;\r
1080 DestY = (SizeOfY - Height - CoordinateY);\r
1081 break;\r
1082\r
1083 case EfiBadgingDisplayAttributeLeftBottom:\r
1084 DestX = CoordinateX;\r
1085 DestY = (SizeOfY - Height - CoordinateY);\r
1086 break;\r
1087\r
1088 case EfiBadgingDisplayAttributeCenterLeft:\r
1089 DestX = CoordinateX;\r
1090 DestY = (SizeOfY - Height) / 2;\r
1091 break;\r
1092\r
1093 case EfiBadgingDisplayAttributeCenter:\r
1094 DestX = (SizeOfX - Width) / 2;\r
1095 DestY = (SizeOfY - Height) / 2;\r
1096 break;\r
1097\r
2df686c6 1098 case EfiBadgingDisplayAttributeCustomized:\r
1099 DestX = (SizeOfX - Width) / 2;\r
1100 DestY = ((SizeOfY * 382) / 1000) - Height / 2;\r
1101 break;\r
1102\r
5c08e117 1103 default:\r
1104 DestX = CoordinateX;\r
1105 DestY = CoordinateY;\r
1106 break;\r
1107 }\r
1108\r
1109 if ((DestX >= 0) && (DestY >= 0)) {\r
1110 if (GraphicsOutput != NULL) {\r
1111 Status = GraphicsOutput->Blt (\r
1112 GraphicsOutput,\r
1113 Blt,\r
1114 EfiBltBufferToVideo,\r
1115 0,\r
1116 0,\r
1117 (UINTN) DestX,\r
1118 (UINTN) DestY,\r
1119 Width,\r
1120 Height,\r
1121 Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
1122 );\r
1123 } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
1124 Status = UgaDraw->Blt (\r
1125 UgaDraw,\r
1126 (EFI_UGA_PIXEL *) Blt,\r
1127 EfiUgaBltBufferToVideo,\r
1128 0,\r
1129 0,\r
1130 (UINTN) DestX,\r
1131 (UINTN) DestY,\r
1132 Width,\r
1133 Height,\r
1134 Width * sizeof (EFI_UGA_PIXEL)\r
1135 );\r
1136 } else {\r
a637802c 1137 Status = EFI_UNSUPPORTED;\r
1138 }\r
1139\r
1140 //\r
1141 // Report displayed Logo information.\r
1142 //\r
1143 if (!EFI_ERROR (Status)) {\r
1144 NumberOfLogos++;\r
1145\r
1146 if (LogoWidth == 0) {\r
1147 //\r
1148 // The first Logo.\r
1149 //\r
6ba8465f 1150 LogoDestX = (UINTN) DestX;\r
1151 LogoDestY = (UINTN) DestY;\r
a637802c 1152 LogoWidth = Width;\r
1153 LogoHeight = Height;\r
1154 } else {\r
1155 //\r
1156 // Merge new logo with old one.\r
1157 //\r
1158 NewDestX = MIN ((UINTN) DestX, LogoDestX);\r
1159 NewDestY = MIN ((UINTN) DestY, LogoDestY);\r
1160 NewWidth = MAX ((UINTN) DestX + Width, LogoDestX + LogoWidth) - NewDestX;\r
1161 NewHeight = MAX ((UINTN) DestY + Height, LogoDestY + LogoHeight) - NewDestY;\r
1162\r
1163 LogoDestX = NewDestX;\r
1164 LogoDestY = NewDestY;\r
1165 LogoWidth = NewWidth;\r
1166 LogoHeight = NewHeight;\r
1167 }\r
5c08e117 1168 }\r
1169 }\r
1170\r
1171 FreePool (ImageData);\r
1172\r
a637802c 1173 if (Badging == NULL) {\r
1174 break;\r
1175 }\r
1176 }\r
1177\r
1178Done:\r
1179 if (BootLogo == NULL || NumberOfLogos == 0) {\r
1180 //\r
1181 // No logo displayed.\r
1182 //\r
5c08e117 1183 if (Blt != NULL) {\r
1184 FreePool (Blt);\r
1185 }\r
1186\r
a637802c 1187 return Status;\r
1188 }\r
1189\r
1190 //\r
1191 // Advertise displayed Logo information.\r
1192 //\r
1193 if (NumberOfLogos == 1) {\r
1194 //\r
1195 // Only one logo displayed, use its Blt buffer directly for BootLogo protocol.\r
1196 //\r
1197 LogoBlt = Blt;\r
1198 Status = EFI_SUCCESS;\r
1199 } else {\r
1200 //\r
1201 // More than one Logo displayed, get merged BltBuffer using VideoToBuffer operation. \r
1202 //\r
1203 if (Blt != NULL) {\r
1204 FreePool (Blt);\r
1205 }\r
1206\r
a46c3657
ED
1207 //\r
1208 // Ensure the LogoHeight * LogoWidth doesn't overflow\r
1209 //\r
1210 if (LogoHeight > DivU64x64Remainder ((UINTN) ~0, LogoWidth, NULL)) {\r
1211 return EFI_UNSUPPORTED;\r
1212 }\r
1213 BufferSize = MultU64x64 (LogoWidth, LogoHeight);\r
1214\r
1215 //\r
1216 // Ensure the BufferSize * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) doesn't overflow\r
1217 //\r
1218 if (BufferSize > DivU64x32 ((UINTN) ~0, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))) {\r
1219 return EFI_UNSUPPORTED;\r
1220 }\r
1221\r
1222 LogoBlt = AllocateZeroPool ((UINTN)BufferSize * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
a637802c 1223 if (LogoBlt == NULL) {\r
1224 return EFI_OUT_OF_RESOURCES;\r
1225 }\r
1226\r
1227 if (GraphicsOutput != NULL) {\r
1228 Status = GraphicsOutput->Blt (\r
1229 GraphicsOutput,\r
1230 LogoBlt,\r
1231 EfiBltVideoToBltBuffer,\r
1232 LogoDestX,\r
1233 LogoDestY,\r
1234 0,\r
1235 0,\r
1236 LogoWidth,\r
1237 LogoHeight,\r
1238 LogoWidth * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
1239 );\r
1240 } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
1241 Status = UgaDraw->Blt (\r
1242 UgaDraw,\r
1243 (EFI_UGA_PIXEL *) LogoBlt,\r
1244 EfiUgaVideoToBltBuffer,\r
1245 LogoDestX,\r
1246 LogoDestY,\r
1247 0,\r
1248 0,\r
1249 LogoWidth,\r
1250 LogoHeight,\r
1251 LogoWidth * sizeof (EFI_UGA_PIXEL)\r
1252 );\r
1253 } else {\r
1254 Status = EFI_UNSUPPORTED;\r
5c08e117 1255 }\r
1256 }\r
1257\r
a637802c 1258 if (!EFI_ERROR (Status)) {\r
1259 BootLogo->SetBootLogo (BootLogo, LogoBlt, LogoDestX, LogoDestY, LogoWidth, LogoHeight);\r
1260 }\r
1261 FreePool (LogoBlt);\r
1262\r
5c08e117 1263 return Status;\r
1264}\r
1265\r
1266/**\r
24cdd14e
LG
1267 Use SystemTable Conout to turn on video based Simple Text Out consoles. The \r
1268 Simple Text Out screens will now be synced up with all non video output devices\r
5c08e117 1269\r
1270 @retval EFI_SUCCESS UGA devices are back in text mode and synced up.\r
1271\r
1272**/\r
1273EFI_STATUS\r
1274EFIAPI\r
1275DisableQuietBoot (\r
1276 VOID\r
1277 )\r
1278{\r
5c08e117 1279\r
1280 //\r
5d7c1609 1281 // Enable Cursor on Screen\r
5c08e117 1282 //\r
5d7c1609 1283 gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
1284 return EFI_SUCCESS;\r
5c08e117 1285}\r
1286\r