]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/QemuVideoDxe/Driver.c
1. Add S3BootScriptDone Debug message when meeting S3_BOOT_SCRIPT_LIB_TERMINATE_OPCODE.
[mirror_edk2.git] / OvmfPkg / QemuVideoDxe / Driver.c
CommitLineData
eaf4f336 1/** @file\r
2 This driver is a sample implementation of the Graphics Output Protocol for\r
3 the QEMU (Cirrus Logic 5446) video controller.\r
4\r
5 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
6\r
7 This program and the accompanying materials\r
8 are licensed and made available under the terms and conditions of the BSD License\r
9 which accompanies this distribution. The full text of the license may be found at\r
10 http://opensource.org/licenses/bsd-license.php\r
11\r
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15**/\r
16\r
17#include "Qemu.h"\r
18\r
19EFI_DRIVER_BINDING_PROTOCOL gQemuVideoDriverBinding = {\r
20 QemuVideoControllerDriverSupported,\r
21 QemuVideoControllerDriverStart,\r
22 QemuVideoControllerDriverStop,\r
23 0x10,\r
24 NULL,\r
25 NULL\r
26};\r
27\r
28/**\r
29 Check if this device is supported.\r
30\r
31 @param This The driver binding protocol.\r
32 @param Controller The controller handle to check.\r
33 @param RemainingDevicePath The remaining device path.\r
34\r
35 @retval EFI_SUCCESS The bus supports this controller.\r
36 @retval EFI_UNSUPPORTED This device isn't supported.\r
37\r
38**/\r
39EFI_STATUS\r
40EFIAPI\r
41QemuVideoControllerDriverSupported (\r
42 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
43 IN EFI_HANDLE Controller,\r
44 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
45 )\r
46{\r
47 EFI_STATUS Status;\r
48 EFI_PCI_IO_PROTOCOL *PciIo;\r
49 PCI_TYPE00 Pci;\r
50 EFI_DEV_PATH *Node;\r
51\r
52 //\r
53 // Open the PCI I/O Protocol\r
54 //\r
55 Status = gBS->OpenProtocol (\r
56 Controller,\r
57 &gEfiPciIoProtocolGuid,\r
58 (VOID **) &PciIo,\r
59 This->DriverBindingHandle,\r
60 Controller,\r
61 EFI_OPEN_PROTOCOL_BY_DRIVER\r
62 );\r
63 if (EFI_ERROR (Status)) {\r
64 return Status;\r
65 }\r
66\r
67 //\r
68 // Read the PCI Configuration Header from the PCI Device\r
69 //\r
70 Status = PciIo->Pci.Read (\r
71 PciIo,\r
72 EfiPciIoWidthUint32,\r
73 0,\r
74 sizeof (Pci) / sizeof (UINT32),\r
75 &Pci\r
76 );\r
77 if (EFI_ERROR (Status)) {\r
78 goto Done;\r
79 }\r
80\r
81 Status = EFI_UNSUPPORTED;\r
82 //\r
83 // See if the I/O enable is on. Most systems only allow one VGA device to be turned on\r
84 // at a time, so see if this is one that is turned on.\r
85 //\r
86 // if (((Pci.Hdr.Command & 0x01) == 0x01)) {\r
87 //\r
88 // See if this is a Cirrus Logic PCI controller\r
89 //\r
90 if (Pci.Hdr.VendorId == CIRRUS_LOGIC_VENDOR_ID) {\r
91 //\r
92 // See if this is a 5430 or a 5446 PCI controller\r
93 //\r
94 if (Pci.Hdr.DeviceId == CIRRUS_LOGIC_5430_DEVICE_ID || \r
95 Pci.Hdr.DeviceId == CIRRUS_LOGIC_5430_ALTERNATE_DEVICE_ID ||\r
96 Pci.Hdr.DeviceId == CIRRUS_LOGIC_5446_DEVICE_ID) {\r
97 \r
98 Status = EFI_SUCCESS;\r
99 //\r
100 // If this is an Intel 945 graphics controller,\r
101 // go further check RemainingDevicePath validation\r
102 //\r
103 if (RemainingDevicePath != NULL) {\r
104 Node = (EFI_DEV_PATH *) RemainingDevicePath;\r
105 //\r
106 // Check if RemainingDevicePath is the End of Device Path Node, \r
107 // if yes, return EFI_SUCCESS\r
108 //\r
109 if (!IsDevicePathEnd (Node)) {\r
110 //\r
111 // If RemainingDevicePath isn't the End of Device Path Node,\r
112 // check its validation\r
113 //\r
114 if (Node->DevPath.Type != ACPI_DEVICE_PATH ||\r
115 Node->DevPath.SubType != ACPI_ADR_DP ||\r
116 DevicePathNodeLength(&Node->DevPath) != sizeof(ACPI_ADR_DEVICE_PATH)) {\r
117 Status = EFI_UNSUPPORTED;\r
118 }\r
119 }\r
120 }\r
121 }\r
122 }\r
123\r
124Done:\r
125 //\r
126 // Close the PCI I/O Protocol\r
127 //\r
128 gBS->CloseProtocol (\r
129 Controller,\r
130 &gEfiPciIoProtocolGuid,\r
131 This->DriverBindingHandle,\r
132 Controller\r
133 );\r
134\r
135 return Status;\r
136}\r
137\r
138/**\r
139 Start to process the controller.\r
140\r
141 @param This The USB bus driver binding instance.\r
142 @param Controller The controller to check.\r
143 @param RemainingDevicePath The remaining device patch.\r
144\r
145 @retval EFI_SUCCESS The controller is controlled by the usb bus.\r
146 @retval EFI_ALREADY_STARTED The controller is already controlled by the usb\r
147 bus.\r
148 @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.\r
149\r
150**/\r
151EFI_STATUS\r
152EFIAPI\r
153QemuVideoControllerDriverStart (\r
154 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
155 IN EFI_HANDLE Controller,\r
156 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
157 )\r
158{\r
159 EFI_STATUS Status;\r
160 QEMU_VIDEO_PRIVATE_DATA *Private;\r
161 BOOLEAN PciAttributesSaved;\r
162 EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
163 ACPI_ADR_DEVICE_PATH AcpiDeviceNode;\r
164\r
165 PciAttributesSaved = FALSE;\r
166 //\r
167 // Allocate Private context data for GOP inteface.\r
168 //\r
169 Private = AllocateZeroPool (sizeof (QEMU_VIDEO_PRIVATE_DATA));\r
170 if (Private == NULL) {\r
171 Status = EFI_OUT_OF_RESOURCES;\r
172 goto Error;\r
173 }\r
174\r
175 //\r
176 // Set up context record\r
177 //\r
178 Private->Signature = QEMU_VIDEO_PRIVATE_DATA_SIGNATURE;\r
179 Private->Handle = NULL;\r
180\r
181 //\r
182 // Open PCI I/O Protocol\r
183 //\r
184 Status = gBS->OpenProtocol (\r
185 Controller,\r
186 &gEfiPciIoProtocolGuid,\r
187 (VOID **) &Private->PciIo,\r
188 This->DriverBindingHandle,\r
189 Controller,\r
190 EFI_OPEN_PROTOCOL_BY_DRIVER\r
191 );\r
192 if (EFI_ERROR (Status)) {\r
193 goto Error;\r
194 }\r
195\r
196 //\r
197 // Save original PCI attributes\r
198 //\r
199 Status = Private->PciIo->Attributes (\r
200 Private->PciIo,\r
201 EfiPciIoAttributeOperationGet,\r
202 0,\r
203 &Private->OriginalPciAttributes\r
204 );\r
205\r
206 if (EFI_ERROR (Status)) {\r
207 goto Error;\r
208 }\r
209 PciAttributesSaved = TRUE;\r
210\r
211 Status = Private->PciIo->Attributes (\r
212 Private->PciIo,\r
213 EfiPciIoAttributeOperationEnable,\r
214 EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY | EFI_PCI_IO_ATTRIBUTE_VGA_IO,\r
215 NULL\r
216 );\r
217 if (EFI_ERROR (Status)) {\r
218 goto Error;\r
219 }\r
220\r
221 //\r
222 // Get ParentDevicePath\r
223 //\r
224 Status = gBS->HandleProtocol (\r
225 Controller,\r
226 &gEfiDevicePathProtocolGuid,\r
227 (VOID **) &ParentDevicePath\r
228 );\r
229 if (EFI_ERROR (Status)) {\r
230 goto Error;\r
231 }\r
232\r
233 //\r
234 // Set Gop Device Path\r
235 //\r
236 if (RemainingDevicePath == NULL) {\r
237 ZeroMem (&AcpiDeviceNode, sizeof (ACPI_ADR_DEVICE_PATH));\r
238 AcpiDeviceNode.Header.Type = ACPI_DEVICE_PATH;\r
239 AcpiDeviceNode.Header.SubType = ACPI_ADR_DP;\r
240 AcpiDeviceNode.ADR = ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA, 0, 0);\r
241 SetDevicePathNodeLength (&AcpiDeviceNode.Header, sizeof (ACPI_ADR_DEVICE_PATH));\r
242\r
243 Private->GopDevicePath = AppendDevicePathNode (\r
244 ParentDevicePath,\r
245 (EFI_DEVICE_PATH_PROTOCOL *) &AcpiDeviceNode\r
246 );\r
247 } else if (!IsDevicePathEnd (RemainingDevicePath)) {\r
248 //\r
249 // If RemainingDevicePath isn't the End of Device Path Node, \r
250 // only scan the specified device by RemainingDevicePath\r
251 //\r
252 Private->GopDevicePath = AppendDevicePathNode (ParentDevicePath, RemainingDevicePath);\r
253 } else {\r
254 //\r
255 // If RemainingDevicePath is the End of Device Path Node, \r
256 // don't create child device and return EFI_SUCCESS\r
257 //\r
258 Private->GopDevicePath = NULL;\r
259 }\r
260 \r
261 if (Private->GopDevicePath != NULL) {\r
262 //\r
263 // Creat child handle and device path protocol firstly\r
264 //\r
265 Private->Handle = NULL;\r
266 Status = gBS->InstallMultipleProtocolInterfaces (\r
267 &Private->Handle,\r
268 &gEfiDevicePathProtocolGuid,\r
269 Private->GopDevicePath,\r
270 NULL\r
271 );\r
272 }\r
273\r
274 //\r
275 // Construct video mode buffer\r
276 //\r
277 Status = QemuVideoVideoModeSetup (Private);\r
278 if (EFI_ERROR (Status)) {\r
279 goto Error;\r
280 }\r
281\r
282 if (Private->GopDevicePath == NULL) {\r
283 //\r
284 // If RemainingDevicePath is the End of Device Path Node, \r
285 // don't create child device and return EFI_SUCCESS\r
286 //\r
287 Status = EFI_SUCCESS;\r
288 } else {\r
289\r
290 //\r
291 // Start the GOP software stack.\r
292 //\r
293 Status = QemuVideoGraphicsOutputConstructor (Private);\r
294 ASSERT_EFI_ERROR (Status);\r
295\r
296 Status = gBS->InstallMultipleProtocolInterfaces (\r
297 &Private->Handle,\r
298 &gEfiGraphicsOutputProtocolGuid,\r
299 &Private->GraphicsOutput,\r
300 NULL\r
301 );\r
302 }\r
303\r
304Error:\r
305 if (EFI_ERROR (Status)) {\r
306 if (Private) {\r
307 if (Private->PciIo) {\r
308 if (PciAttributesSaved == TRUE) {\r
309 //\r
310 // Restore original PCI attributes\r
311 //\r
312 Private->PciIo->Attributes (\r
313 Private->PciIo,\r
314 EfiPciIoAttributeOperationSet,\r
315 Private->OriginalPciAttributes,\r
316 NULL\r
317 );\r
318 }\r
319 //\r
320 // Close the PCI I/O Protocol\r
321 //\r
322 gBS->CloseProtocol (\r
323 Private->Handle,\r
324 &gEfiPciIoProtocolGuid,\r
325 This->DriverBindingHandle,\r
326 Private->Handle\r
327 );\r
328 }\r
329\r
330 gBS->FreePool (Private);\r
331 }\r
332 }\r
333\r
334 return Status;\r
335}\r
336\r
337/**\r
338 Stop this device\r
339\r
340 @param This The USB bus driver binding protocol.\r
341 @param Controller The controller to release.\r
342 @param NumberOfChildren The number of children of this device that\r
343 opened the controller BY_CHILD.\r
344 @param ChildHandleBuffer The array of child handle.\r
345\r
346 @retval EFI_SUCCESS The controller or children are stopped.\r
347 @retval EFI_DEVICE_ERROR Failed to stop the driver.\r
348\r
349**/\r
350EFI_STATUS\r
351EFIAPI\r
352QemuVideoControllerDriverStop (\r
353 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
354 IN EFI_HANDLE Controller,\r
355 IN UINTN NumberOfChildren,\r
356 IN EFI_HANDLE *ChildHandleBuffer\r
357 )\r
358{\r
359 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
360\r
361 EFI_STATUS Status;\r
362 QEMU_VIDEO_PRIVATE_DATA *Private;\r
363\r
364 Status = gBS->OpenProtocol (\r
365 Controller,\r
366 &gEfiGraphicsOutputProtocolGuid,\r
367 (VOID **) &GraphicsOutput,\r
368 This->DriverBindingHandle,\r
369 Controller,\r
370 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
371 );\r
372 if (EFI_ERROR (Status)) {\r
373 return Status;\r
374 }\r
375\r
376 //\r
377 // Get our private context information\r
378 //\r
379 Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (GraphicsOutput);\r
380\r
381 QemuVideoGraphicsOutputDestructor (Private);\r
382 //\r
383 // Remove the GOP protocol interface from the system\r
384 //\r
385 Status = gBS->UninstallMultipleProtocolInterfaces (\r
386 Private->Handle,\r
387 &gEfiGraphicsOutputProtocolGuid,\r
388 &Private->GraphicsOutput,\r
389 NULL\r
390 );\r
391\r
392 if (EFI_ERROR (Status)) {\r
393 return Status;\r
394 }\r
395\r
396 //\r
397 // Restore original PCI attributes\r
398 //\r
399 Private->PciIo->Attributes (\r
400 Private->PciIo,\r
401 EfiPciIoAttributeOperationSet,\r
402 Private->OriginalPciAttributes,\r
403 NULL\r
404 );\r
405\r
406 //\r
407 // Close the PCI I/O Protocol\r
408 //\r
409 gBS->CloseProtocol (\r
410 Controller,\r
411 &gEfiPciIoProtocolGuid,\r
412 This->DriverBindingHandle,\r
413 Controller\r
414 );\r
415\r
416 //\r
417 // Free our instance data\r
418 //\r
419 gBS->FreePool (Private);\r
420\r
421 return EFI_SUCCESS;\r
422}\r
423\r
424/**\r
425 TODO: Add function description\r
426\r
427 @param Private TODO: add argument description\r
428 @param Address TODO: add argument description\r
429 @param Data TODO: add argument description\r
430\r
431 TODO: add return values\r
432\r
433**/\r
434VOID\r
435outb (\r
436 QEMU_VIDEO_PRIVATE_DATA *Private,\r
437 UINTN Address,\r
438 UINT8 Data\r
439 )\r
440{\r
441 Private->PciIo->Io.Write (\r
442 Private->PciIo,\r
443 EfiPciIoWidthUint8,\r
444 EFI_PCI_IO_PASS_THROUGH_BAR,\r
445 Address,\r
446 1,\r
447 &Data\r
448 );\r
449}\r
450\r
451/**\r
452 TODO: Add function description\r
453\r
454 @param Private TODO: add argument description\r
455 @param Address TODO: add argument description\r
456 @param Data TODO: add argument description\r
457\r
458 TODO: add return values\r
459\r
460**/\r
461VOID\r
462outw (\r
463 QEMU_VIDEO_PRIVATE_DATA *Private,\r
464 UINTN Address,\r
465 UINT16 Data\r
466 )\r
467{\r
468 Private->PciIo->Io.Write (\r
469 Private->PciIo,\r
470 EfiPciIoWidthUint16,\r
471 EFI_PCI_IO_PASS_THROUGH_BAR,\r
472 Address,\r
473 1,\r
474 &Data\r
475 );\r
476}\r
477\r
478/**\r
479 TODO: Add function description\r
480\r
481 @param Private TODO: add argument description\r
482 @param Address TODO: add argument description\r
483\r
484 TODO: add return values\r
485\r
486**/\r
487UINT8\r
488inb (\r
489 QEMU_VIDEO_PRIVATE_DATA *Private,\r
490 UINTN Address\r
491 )\r
492{\r
493 UINT8 Data;\r
494\r
495 Private->PciIo->Io.Read (\r
496 Private->PciIo,\r
497 EfiPciIoWidthUint8,\r
498 EFI_PCI_IO_PASS_THROUGH_BAR,\r
499 Address,\r
500 1,\r
501 &Data\r
502 );\r
503 return Data;\r
504}\r
505\r
506/**\r
507 TODO: Add function description\r
508\r
509 @param Private TODO: add argument description\r
510 @param Address TODO: add argument description\r
511\r
512 TODO: add return values\r
513\r
514**/\r
515UINT16\r
516inw (\r
517 QEMU_VIDEO_PRIVATE_DATA *Private,\r
518 UINTN Address\r
519 )\r
520{\r
521 UINT16 Data;\r
522\r
523 Private->PciIo->Io.Read (\r
524 Private->PciIo,\r
525 EfiPciIoWidthUint16,\r
526 EFI_PCI_IO_PASS_THROUGH_BAR,\r
527 Address,\r
528 1,\r
529 &Data\r
530 );\r
531 return Data;\r
532}\r
533\r
534/**\r
535 TODO: Add function description\r
536\r
537 @param Private TODO: add argument description\r
538 @param Index TODO: add argument description\r
539 @param Red TODO: add argument description\r
540 @param Green TODO: add argument description\r
541 @param Blue TODO: add argument description\r
542\r
543 TODO: add return values\r
544\r
545**/\r
546VOID\r
547SetPaletteColor (\r
548 QEMU_VIDEO_PRIVATE_DATA *Private,\r
549 UINTN Index,\r
550 UINT8 Red,\r
551 UINT8 Green,\r
552 UINT8 Blue\r
553 )\r
554{\r
555 outb (Private, PALETTE_INDEX_REGISTER, (UINT8) Index);\r
556 outb (Private, PALETTE_DATA_REGISTER, (UINT8) (Red >> 2));\r
557 outb (Private, PALETTE_DATA_REGISTER, (UINT8) (Green >> 2));\r
558 outb (Private, PALETTE_DATA_REGISTER, (UINT8) (Blue >> 2));\r
559}\r
560\r
561/**\r
562 TODO: Add function description\r
563\r
564 @param Private TODO: add argument description\r
565\r
566 TODO: add return values\r
567\r
568**/\r
569VOID\r
570SetDefaultPalette (\r
571 QEMU_VIDEO_PRIVATE_DATA *Private\r
572 )\r
573{\r
574 UINTN Index;\r
575 UINTN RedIndex;\r
576 UINTN GreenIndex;\r
577 UINTN BlueIndex;\r
578\r
579 Index = 0;\r
580 for (RedIndex = 0; RedIndex < 8; RedIndex++) {\r
581 for (GreenIndex = 0; GreenIndex < 8; GreenIndex++) {\r
582 for (BlueIndex = 0; BlueIndex < 4; BlueIndex++) {\r
583 SetPaletteColor (Private, Index, (UINT8) (RedIndex << 5), (UINT8) (GreenIndex << 5), (UINT8) (BlueIndex << 6));\r
584 Index++;\r
585 }\r
586 }\r
587 }\r
588}\r
589\r
590/**\r
591 TODO: Add function description\r
592\r
593 @param Private TODO: add argument description\r
594\r
595 TODO: add return values\r
596\r
597**/\r
598VOID\r
599ClearScreen (\r
600 QEMU_VIDEO_PRIVATE_DATA *Private\r
601 )\r
602{\r
603 UINT32 Color;\r
604\r
605 Color = 0;\r
606 Private->PciIo->Mem.Write (\r
607 Private->PciIo,\r
608 EfiPciIoWidthFillUint32,\r
609 0,\r
610 0,\r
611 0x400000 >> 2,\r
612 &Color\r
613 );\r
614}\r
615\r
616/**\r
617 TODO: Add function description\r
618\r
619 @param Private TODO: add argument description\r
620\r
621 TODO: add return values\r
622\r
623**/\r
624VOID\r
625DrawLogo (\r
626 QEMU_VIDEO_PRIVATE_DATA *Private,\r
627 UINTN ScreenWidth,\r
628 UINTN ScreenHeight\r
629 )\r
630{\r
631}\r
632\r
633/**\r
634 TODO: Add function description\r
635\r
636 @param Private TODO: add argument description\r
637 @param ModeData TODO: add argument description\r
638\r
639 TODO: add return values\r
640\r
641**/\r
642VOID\r
643InitializeGraphicsMode (\r
644 QEMU_VIDEO_PRIVATE_DATA *Private,\r
645 QEMU_VIDEO_VIDEO_MODES *ModeData\r
646 )\r
647{\r
648 UINT8 Byte;\r
649 UINTN Index;\r
650 UINT16 DeviceId;\r
651 EFI_STATUS Status;\r
652\r
653 Status = Private->PciIo->Pci.Read (\r
654 Private->PciIo,\r
655 EfiPciIoWidthUint16,\r
656 PCI_DEVICE_ID_OFFSET,\r
657 1,\r
658 &DeviceId\r
659 );\r
660 //\r
661 // Read the PCI Configuration Header from the PCI Device\r
662 //\r
663 ASSERT_EFI_ERROR (Status);\r
664\r
665 outw (Private, SEQ_ADDRESS_REGISTER, 0x1206);\r
666 outw (Private, SEQ_ADDRESS_REGISTER, 0x0012);\r
667\r
668 for (Index = 0; Index < 15; Index++) {\r
669 outw (Private, SEQ_ADDRESS_REGISTER, ModeData->SeqSettings[Index]);\r
670 }\r
671\r
672 if (DeviceId != CIRRUS_LOGIC_5446_DEVICE_ID) {\r
673 outb (Private, SEQ_ADDRESS_REGISTER, 0x0f);\r
674 Byte = (UINT8) ((inb (Private, SEQ_DATA_REGISTER) & 0xc7) ^ 0x30);\r
675 outb (Private, SEQ_DATA_REGISTER, Byte);\r
676 }\r
677\r
678 outb (Private, MISC_OUTPUT_REGISTER, ModeData->MiscSetting);\r
679 outw (Private, GRAPH_ADDRESS_REGISTER, 0x0506);\r
680 outw (Private, SEQ_ADDRESS_REGISTER, 0x0300);\r
681 outw (Private, CRTC_ADDRESS_REGISTER, 0x2011);\r
682\r
683 for (Index = 0; Index < 28; Index++) {\r
684 outw (Private, CRTC_ADDRESS_REGISTER, (UINT16) ((ModeData->CrtcSettings[Index] << 8) | Index));\r
685 }\r
686\r
687 for (Index = 0; Index < 9; Index++) {\r
688 outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((GraphicsController[Index] << 8) | Index));\r
689 }\r
690\r
691 inb (Private, INPUT_STATUS_1_REGISTER);\r
692\r
693 for (Index = 0; Index < 21; Index++) {\r
694 outb (Private, ATT_ADDRESS_REGISTER, (UINT8) Index);\r
695 outb (Private, ATT_ADDRESS_REGISTER, AttributeController[Index]);\r
696 }\r
697\r
698 outb (Private, ATT_ADDRESS_REGISTER, 0x20);\r
699\r
700 outw (Private, GRAPH_ADDRESS_REGISTER, 0x0009);\r
701 outw (Private, GRAPH_ADDRESS_REGISTER, 0x000a);\r
702 outw (Private, GRAPH_ADDRESS_REGISTER, 0x000b);\r
703 outb (Private, DAC_PIXEL_MASK_REGISTER, 0xff);\r
704\r
705 SetDefaultPalette (Private);\r
706 ClearScreen (Private);\r
707}\r
708\r
709EFI_STATUS\r
710EFIAPI\r
711InitializeQemuVideo (\r
712 IN EFI_HANDLE ImageHandle,\r
713 IN EFI_SYSTEM_TABLE *SystemTable\r
714 )\r
715{\r
716 EFI_STATUS Status;\r
717\r
718 Status = EfiLibInstallDriverBindingComponentName2 (\r
719 ImageHandle,\r
720 SystemTable,\r
721 &gQemuVideoDriverBinding,\r
722 ImageHandle,\r
723 &gQemuVideoComponentName,\r
724 &gQemuVideoComponentName2\r
725 );\r
726 ASSERT_EFI_ERROR (Status);\r
727\r
728 //\r
729 // Install EFI Driver Supported EFI Version Protocol required for\r
730 // EFI drivers that are on PCI and other plug in cards.\r
731 //\r
732 gQemuVideoDriverSupportedEfiVersion.FirmwareVersion = PcdGet32 (PcdDriverSupportedEfiVersion);\r
733 Status = gBS->InstallMultipleProtocolInterfaces (\r
734 &ImageHandle,\r
735 &gEfiDriverSupportedEfiVersionProtocolGuid,\r
736 &gQemuVideoDriverSupportedEfiVersion,\r
737 NULL\r
738 );\r
739 ASSERT_EFI_ERROR (Status);\r
740\r
741 return Status;\r
742}\r