OvmfPkg: VIRTIO_DEVICE_PROTOCOL: pass VRING object to SetQueueAddress()
authorLaszlo Ersek <lersek@redhat.com>
Sat, 12 Mar 2016 02:39:00 +0000 (03:39 +0100)
committerLaszlo Ersek <lersek@redhat.com>
Wed, 6 Apr 2016 11:04:03 +0000 (13:04 +0200)
In virtio-1.0, it is not enough to pass the base address of the virtio
queue to the hypervisor (as a frame number); instead it will want the
addresses of the descriptor table, the available ring, and the used ring
separately. Pass the VRING object to the SetQueueAddress() member
function; this will enable a virtio-1.0 implementation. Convert the
current producers and consumers to this prototype.

Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
OvmfPkg/Include/Protocol/VirtioDevice.h
OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h
OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c
OvmfPkg/VirtioBlkDxe/VirtioBlk.c
OvmfPkg/VirtioNetDxe/SnpInitialize.c
OvmfPkg/VirtioPciDeviceDxe/VirtioPciDevice.h
OvmfPkg/VirtioPciDeviceDxe/VirtioPciFunctions.c
OvmfPkg/VirtioRngDxe/VirtioRng.c
OvmfPkg/VirtioScsiDxe/VirtioScsi.c

index f8afa7120a4c68724c2bc453cbbade350b64cf03..910a4866e7ac996b9bb99b026d0694c7bc5fdb58 100644 (file)
@@ -19,6 +19,8 @@
 #ifndef __VIRTIO_DEVICE_H__\r
 #define __VIRTIO_DEVICE_H__\r
 \r
+#include <IndustryStandard/Virtio.h>\r
+\r
 // VirtIo Specification Revision: Major[31:24].Minor[23:16].Revision[15:0\r
 #define VIRTIO_SPEC_REVISION(major,minor,revision) \\r
   ((((major) & 0xFF) << 24) | (((minor) & 0xFF) << 16) | ((revision) & 0xFFFF))\r
@@ -127,14 +129,12 @@ EFI_STATUS
   );\r
 \r
 /**\r
-  Write the queue address field in the Virtio Header.\r
-\r
-  The parameter Address must be the base address of the virtqueue divided\r
-  by 4096.\r
+  Write the queue address field(s) in the Virtio Header.\r
 \r
   @param[in] This             This instance of VIRTIO_DEVICE_PROTOCOL\r
 \r
-  @param[in] Address          The 32-bit Queue Address field\r
+  @param[in] Ring             The initialized VRING object to take the\r
+                              addresses from.\r
 \r
   @retval EFI_SUCCESS         The data was written successfully.\r
   @retval EFI_UNSUPPORTED     The underlying IO device doesn't support the\r
@@ -144,7 +144,7 @@ typedef
 EFI_STATUS\r
 (EFIAPI *VIRTIO_SET_QUEUE_ADDRESS) (\r
   IN VIRTIO_DEVICE_PROTOCOL  *This,\r
-  IN UINT32                   Address\r
+  IN VRING                   *Ring\r
   );\r
 \r
 /**\r
index 3b1e90ba9f3b391d0dab4cd8b45157d9b6077e3e..4130dbc043df9e6843230622fde1623e05e0cfdd 100644 (file)
@@ -112,8 +112,8 @@ VirtioMmioSetQueueSel (
 \r
 EFI_STATUS\r
 VirtioMmioSetQueueAddress (\r
-  VIRTIO_DEVICE_PROTOCOL *This,\r
-  UINT32                  Address\r
+  IN VIRTIO_DEVICE_PROTOCOL  *This,\r
+  IN VRING                   *Ring\r
   );\r
 \r
 EFI_STATUS\r
index 2cd293ab88d9459bdf31cc0f980cdd5c497e5418..53c734f6b1af10cbc2eaf7b4fa730547dcbf8a08 100644 (file)
@@ -180,15 +180,16 @@ VirtioMmioSetQueueSel (
 \r
 EFI_STATUS\r
 VirtioMmioSetQueueAddress (\r
-  VIRTIO_DEVICE_PROTOCOL *This,\r
-  UINT32                  Address\r
+  IN VIRTIO_DEVICE_PROTOCOL  *This,\r
+  IN VRING                   *Ring\r
   )\r
 {\r
   VIRTIO_MMIO_DEVICE *Device;\r
 \r
   Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This);\r
 \r
-  VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_PFN, Address);\r
+  VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_PFN,\r
+    (UINT32)((UINTN)Ring->Base >> EFI_PAGE_SHIFT));\r
 \r
   return EFI_SUCCESS;\r
 }\r
index b35f60c9d23385ac3205e30b225aa284354dafb3..daccc7a5d06b48ebcbe8cb4ed28ceaba647c9344 100644 (file)
@@ -730,8 +730,7 @@ VirtioBlkInit (
   //\r
   // step 4c -- Report GPFN (guest-physical frame number) of queue.\r
   //\r
-  Status = Dev->VirtIo->SetQueueAddress (Dev->VirtIo,\r
-      (UINT32) ((UINTN) Dev->Ring.Base >> EFI_PAGE_SHIFT));\r
+  Status = Dev->VirtIo->SetQueueAddress (Dev->VirtIo, &Dev->Ring);\r
   if (EFI_ERROR (Status)) {\r
     goto ReleaseQueue;\r
   }\r
index 71b67fa52df9978a1dd3e9375bf596ddc42618c8..f06b0a5a5742bef6ea1945bfba5357d7e189f878 100644 (file)
@@ -95,8 +95,7 @@ VirtioNetInitRing (
   //\r
   // step 4c -- report GPFN (guest-physical frame number) of queue\r
   //\r
-  Status = Dev->VirtIo->SetQueueAddress (Dev->VirtIo,\r
-      (UINT32) ((UINTN) Ring->Base >> EFI_PAGE_SHIFT));\r
+  Status = Dev->VirtIo->SetQueueAddress (Dev->VirtIo, Ring);\r
   if (EFI_ERROR (Status)) {\r
     goto ReleaseQueue;\r
   }\r
index 95f82611e29505fbc3ecd1eb4c918dd6dad07ad7..8f17a16c88f5b21bc3faa2fb4f863cc26813b281 100644 (file)
@@ -124,8 +124,8 @@ VirtioPciSetGuestFeatures (
 EFI_STATUS\r
 EFIAPI\r
 VirtioPciSetQueueAddress (\r
-  VIRTIO_DEVICE_PROTOCOL         *This,\r
-  UINT32                         Address\r
+  IN VIRTIO_DEVICE_PROTOCOL  *This,\r
+  IN VRING                   *Ring\r
   );\r
 \r
 EFI_STATUS\r
index 4ba37a2d1ceb79229577f28973d2d1bf46343f35..243aa14c24212a6cfa3fd090ab2cdf24ca76af95 100644 (file)
@@ -181,8 +181,8 @@ VirtioPciSetGuestFeatures (
 EFI_STATUS\r
 EFIAPI\r
 VirtioPciSetQueueAddress (\r
-  VIRTIO_DEVICE_PROTOCOL    *This,\r
-  UINT32                    Address\r
+  IN VIRTIO_DEVICE_PROTOCOL  *This,\r
+  IN VRING                   *Ring\r
   )\r
 {\r
   VIRTIO_PCI_DEVICE *Dev;\r
@@ -190,7 +190,7 @@ VirtioPciSetQueueAddress (
   Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
 \r
   return VirtioPciIoWrite (Dev, VIRTIO_PCI_OFFSET_QUEUE_ADDRESS, sizeof (UINT32),\r
-      Address);\r
+      (UINT32)((UINTN)Ring->Base >> EFI_PAGE_SHIFT));\r
 }\r
 \r
 EFI_STATUS\r
index de4afefe7000c68217457ac2983f7c1a2eb80f11..290bddeeecae2a5995d724581981074977733c43 100644 (file)
@@ -284,8 +284,7 @@ VirtioRngInit (
   //\r
   // step 4c -- Report GPFN (guest-physical frame number) of queue.\r
   //\r
-  Status = Dev->VirtIo->SetQueueAddress (Dev->VirtIo,\r
-      (UINT32) ((UINTN) Dev->Ring.Base >> EFI_PAGE_SHIFT));\r
+  Status = Dev->VirtIo->SetQueueAddress (Dev->VirtIo, &Dev->Ring);\r
   if (EFI_ERROR (Status)) {\r
     goto ReleaseQueue;\r
   }\r
index 52952886226b57c186cd72f15a04e18aec025e18..162577bcb9611c7b8610d0c5de8ec6de72ef8524 100644 (file)
@@ -841,8 +841,7 @@ VirtioScsiInit (
   //\r
   // step 4c -- Report GPFN (guest-physical frame number) of queue.\r
   //\r
-  Status = Dev->VirtIo->SetQueueAddress (Dev->VirtIo,\r
-      (UINT32) ((UINTN) Dev->Ring.Base >> EFI_PAGE_SHIFT));\r
+  Status = Dev->VirtIo->SetQueueAddress (Dev->VirtIo, &Dev->Ring);\r
   if (EFI_ERROR (Status)) {\r
     goto ReleaseQueue;\r
   }\r