]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/VirtioMmioDeviceLib: virtio 1.0: Fix SetQueueAddress
authorGerd Hoffmann <kraxel@redhat.com>
Fri, 27 Aug 2021 13:44:56 +0000 (21:44 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Mon, 30 Aug 2021 01:05:49 +0000 (01:05 +0000)
Virtio 1.0 allows a more flexible virtio ring layout, so we have to set
addresses for descriptors avail flags and use flags separately.  We
continue to use a ring layout compatible with virtio 0.9.5 though, so no
other changes are needed to setup the virtio queues.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Philippe Mathieu-Daude <philmd@redhat.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c

index 50a4fd2100ee1fc7c42dfea8bad265a55c2bc18a..cb1f9358eabd029e66123c127b9221271bc11b88 100644 (file)
@@ -183,13 +183,36 @@ VirtioMmioSetQueueAddress (
   )\r
 {\r
   VIRTIO_MMIO_DEVICE *Device;\r
+  UINT64 Address;\r
 \r
   ASSERT (RingBaseShift == 0);\r
 \r
   Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This);\r
 \r
-  VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_PFN,\r
-    (UINT32)((UINTN)Ring->Base >> EFI_PAGE_SHIFT));\r
+  if (Device->Version == VIRTIO_MMIO_DEVICE_VERSION_0_95) {\r
+    VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_PFN,\r
+      (UINT32)((UINTN)Ring->Base >> EFI_PAGE_SHIFT));\r
+  } else {\r
+    Address = (UINTN)Ring->Base;\r
+    VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_DESC_LO,\r
+                      (UINT32)Address);\r
+    VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_DESC_HI,\r
+                      (UINT32)RShiftU64(Address, 32));\r
+\r
+    Address = (UINTN)Ring->Avail.Flags;\r
+    VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_LO,\r
+                      (UINT32)Address);\r
+    VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_HI,\r
+                      (UINT32)RShiftU64(Address, 32));\r
+\r
+    Address = (UINTN)Ring->Used.Flags;\r
+    VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_USED_LO,\r
+                      (UINT32)Address);\r
+    VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_USED_HI,\r
+                      (UINT32)RShiftU64(Address, 32));\r
+\r
+    VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_READY, 1);\r
+  }\r
 \r
   return EFI_SUCCESS;\r
 }\r