0x0100,\r
QEMU_VIDEO_BOCHS,\r
L"QEMU QXL VGA"\r
+ },{\r
+ 0x1af4,\r
+ 0x1050,\r
+ QEMU_VIDEO_BOCHS_MMIO,\r
+ L"QEMU VirtIO VGA"\r
},{\r
0 /* end of list */\r
}\r
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
{\r
+ EFI_TPL OldTpl;\r
EFI_STATUS Status;\r
QEMU_VIDEO_PRIVATE_DATA *Private;\r
+ BOOLEAN IsQxl;\r
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
ACPI_ADR_DEVICE_PATH AcpiDeviceNode;\r
PCI_TYPE00 Pci;\r
QEMU_VIDEO_CARD *Card;\r
EFI_PCI_IO_PROTOCOL *ChildPciIo;\r
\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
+\r
//\r
// Allocate Private context data for GOP inteface.\r
//\r
Private = AllocateZeroPool (sizeof (QEMU_VIDEO_PRIVATE_DATA));\r
if (Private == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto RestoreTpl;\r
}\r
\r
//\r
}\r
Private->Variant = Card->Variant;\r
\r
+ //\r
+ // IsQxl is based on the detected Card->Variant, which at a later point might\r
+ // not match Private->Variant.\r
+ //\r
+ IsQxl = (BOOLEAN)(Card->Variant == QEMU_VIDEO_BOCHS);\r
+\r
//\r
// Save original PCI attributes\r
//\r
break;\r
case QEMU_VIDEO_BOCHS_MMIO:\r
case QEMU_VIDEO_BOCHS:\r
- Status = QemuVideoBochsModeSetup (Private);\r
+ Status = QemuVideoBochsModeSetup (Private, IsQxl);\r
break;\r
default:\r
ASSERT (FALSE);\r
goto UninstallGop;\r
}\r
\r
+#if defined MDE_CPU_IA32 || defined MDE_CPU_X64\r
+ if (Private->Variant == QEMU_VIDEO_BOCHS_MMIO ||\r
+ Private->Variant == QEMU_VIDEO_BOCHS) {\r
+ InstallVbeShim (Card->Name, Private->GraphicsOutput.Mode->FrameBufferBase);\r
+ }\r
+#endif\r
+\r
+ gBS->RestoreTPL (OldTpl);\r
return EFI_SUCCESS;\r
\r
UninstallGop:\r
FreePrivate:\r
FreePool (Private);\r
\r
+RestoreTpl:\r
+ gBS->RestoreTPL (OldTpl);\r
+\r
return Status;\r
}\r
\r
EFI_STATUS Status;\r
QEMU_VIDEO_PRIVATE_DATA *Private;\r
\r
+ if (NumberOfChildren == 0) {\r
+ //\r
+ // Close the PCI I/O Protocol\r
+ //\r
+ gBS->CloseProtocol (\r
+ Controller,\r
+ &gEfiPciIoProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Controller\r
+ );\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ //\r
+ // free all resources for whose access we need the child handle, because the\r
+ // child handle is going away\r
+ //\r
+ ASSERT (NumberOfChildren == 1);\r
Status = gBS->OpenProtocol (\r
- Controller,\r
+ ChildHandleBuffer[0],\r
&gEfiGraphicsOutputProtocolGuid,\r
(VOID **) &GraphicsOutput,\r
This->DriverBindingHandle,\r
// Get our private context information\r
//\r
Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (GraphicsOutput);\r
+ ASSERT (Private->Handle == ChildHandleBuffer[0]);\r
\r
QemuVideoGraphicsOutputDestructor (Private);\r
//\r
NULL\r
);\r
\r
- //\r
- // Close the PCI I/O Protocol\r
- //\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiPciIoProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
-\r
gBS->CloseProtocol (\r
Controller,\r
&gEfiPciIoProtocolGuid,\r
Private->Handle\r
);\r
\r
+ FreePool (Private->ModeData);\r
+ gBS->UninstallProtocolInterface (Private->Handle,\r
+ &gEfiDevicePathProtocolGuid, Private->GopDevicePath);\r
+ FreePool (Private->GopDevicePath);\r
+\r
//\r
// Free our instance data\r
//\r