]> 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 454f008827be8c2deb13e4b25fbc360ea3b51b69..cb1f9358eabd029e66123c127b9221271bc11b88 100644 (file)
@@ -151,7 +151,9 @@ VirtioMmioSetPageSize (
 \r
   Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This);\r
 \r
-  VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_PAGE_SIZE, PageSize);\r
+  if (Device->Version == VIRTIO_MMIO_DEVICE_VERSION_0_95) {\r
+    VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_PAGE_SIZE, PageSize);\r
+  }\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -173,6 +175,7 @@ VirtioMmioSetQueueSel (
 }\r
 \r
 EFI_STATUS\r
+EFIAPI\r
 VirtioMmioSetQueueAddress (\r
   IN VIRTIO_DEVICE_PROTOCOL  *This,\r
   IN VRING                   *Ring,\r
@@ -180,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