]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/VirtioGpuDxe/Commands.c
OvmfPkg/VirtioGpuDxe: map VRING for bus master common buffer operation
[mirror_edk2.git] / OvmfPkg / VirtioGpuDxe / Commands.c
index 5cb0031612077ea0bc096765d9f2f48773d8f826..4e19bac606eea0d1fda3e757344c49b3dbb784f5 100644 (file)
@@ -44,6 +44,7 @@ VirtioGpuInit (
   EFI_STATUS Status;\r
   UINT64     Features;\r
   UINT16     QueueSize;\r
+  UINT64     RingBaseShift;\r
 \r
   //\r
   // Execute virtio-v1.0-cs04, 3.1.1 Driver Requirements: Device\r
@@ -132,13 +133,28 @@ VirtioGpuInit (
   if (EFI_ERROR (Status)) {\r
     goto Failed;\r
   }\r
+  //\r
+  // If anything fails from here on, we have to release the ring.\r
+  //\r
+  Status = VirtioRingMap (\r
+             VgpuDev->VirtIo,\r
+             &VgpuDev->Ring,\r
+             &RingBaseShift,\r
+             &VgpuDev->RingMap\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    goto ReleaseQueue;\r
+  }\r
+  //\r
+  // If anything fails from here on, we have to unmap the ring.\r
+  //\r
   Status = VgpuDev->VirtIo->SetQueueAddress (\r
                               VgpuDev->VirtIo,\r
                               &VgpuDev->Ring,\r
-                              0\r
+                              RingBaseShift\r
                               );\r
   if (EFI_ERROR (Status)) {\r
-    goto ReleaseQueue;\r
+    goto UnmapQueue;\r
   }\r
 \r
   //\r
@@ -147,11 +163,14 @@ VirtioGpuInit (
   NextDevStat |= VSTAT_DRIVER_OK;\r
   Status = VgpuDev->VirtIo->SetDeviceStatus (VgpuDev->VirtIo, NextDevStat);\r
   if (EFI_ERROR (Status)) {\r
-    goto ReleaseQueue;\r
+    goto UnmapQueue;\r
   }\r
 \r
   return EFI_SUCCESS;\r
 \r
+UnmapQueue:\r
+  VgpuDev->VirtIo->UnmapSharedBuffer (VgpuDev->VirtIo, VgpuDev->RingMap);\r
+\r
 ReleaseQueue:\r
   VirtioRingUninit (VgpuDev->VirtIo, &VgpuDev->Ring);\r
 \r
@@ -188,6 +207,7 @@ VirtioGpuUninit (
   // configuration.\r
   //\r
   VgpuDev->VirtIo->SetDeviceStatus (VgpuDev->VirtIo, 0);\r
+  VgpuDev->VirtIo->UnmapSharedBuffer (VgpuDev->VirtIo, VgpuDev->RingMap);\r
   VirtioRingUninit (VgpuDev->VirtIo, &VgpuDev->Ring);\r
 }\r
 \r
@@ -215,6 +235,7 @@ VirtioGpuExitBoot (
 \r
   VgpuDev = Context;\r
   VgpuDev->VirtIo->SetDeviceStatus (VgpuDev->VirtIo, 0);\r
+  VgpuDev->VirtIo->UnmapSharedBuffer (VgpuDev->VirtIo, VgpuDev->RingMap);\r
 }\r
 \r
 /**\r