]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c
OvmfPkg/VirtioMmioDeviceLib: virtio 1.0: Fix SetQueueAddress
[mirror_edk2.git] / 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