]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/VirtioGpuDxe/DriverBinding.c
OvmfPkg/VirtioGpuDxe: initialize and tear down VirtIo GPU device
[mirror_edk2.git] / OvmfPkg / VirtioGpuDxe / DriverBinding.c
index b902a07871e0226703573286658e756ed4bc2bb2..bdea55ef7dbf4b69edc38968a32a77154c8b26ec 100644 (file)
@@ -646,13 +646,25 @@ VirtioGpuDriverBindingStart (
       goto FreeVgpuDev;\r
     }\r
 \r
+    Status = VirtioGpuInit (VgpuDev);\r
+    if (EFI_ERROR (Status)) {\r
+      goto FreeVgpuDevBusName;\r
+    }\r
+\r
+    Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_CALLBACK,\r
+                    VirtioGpuExitBoot, VgpuDev /* NotifyContext */,\r
+                    &VgpuDev->ExitBoot);\r
+    if (EFI_ERROR (Status)) {\r
+      goto UninitGpu;\r
+    }\r
+\r
     //\r
     // Install the VGPU_DEV "protocol interface" on ControllerHandle.\r
     //\r
     Status = gBS->InstallProtocolInterface (&ControllerHandle,\r
                     &gEfiCallerIdGuid, EFI_NATIVE_INTERFACE, VgpuDev);\r
     if (EFI_ERROR (Status)) {\r
-      goto FreeVgpuDevBusName;\r
+      goto CloseExitBoot;\r
     }\r
 \r
     if (RemainingDevicePath != NULL && IsDevicePathEnd (RemainingDevicePath)) {\r
@@ -693,6 +705,16 @@ UninstallVgpuDev:
            VgpuDev);\r
   }\r
 \r
+CloseExitBoot:\r
+  if (VirtIoBoundJustNow) {\r
+    gBS->CloseEvent (VgpuDev->ExitBoot);\r
+  }\r
+\r
+UninitGpu:\r
+  if (VirtIoBoundJustNow) {\r
+    VirtioGpuUninit (VgpuDev);\r
+  }\r
+\r
 FreeVgpuDevBusName:\r
   if (VirtIoBoundJustNow) {\r
     FreeUnicodeStringTable (VgpuDev->BusName);\r
@@ -761,6 +783,10 @@ VirtioGpuDriverBindingStop (
                     &gEfiCallerIdGuid, VgpuDev);\r
     ASSERT_EFI_ERROR (Status);\r
 \r
+    Status = gBS->CloseEvent (VgpuDev->ExitBoot);\r
+    ASSERT_EFI_ERROR (Status);\r
+\r
+    VirtioGpuUninit (VgpuDev);\r
     FreeUnicodeStringTable (VgpuDev->BusName);\r
     FreePool (VgpuDev);\r
 \r