OvmfPkg/Virtio10Dxe: implement IOMMU-like member functions
authorBrijesh Singh <brijesh.singh@amd.com>
Wed, 23 Aug 2017 10:57:15 +0000 (06:57 -0400)
committerLaszlo Ersek <lersek@redhat.com>
Fri, 25 Aug 2017 08:42:18 +0000 (10:42 +0200)
The patch implements the newly added IOMMU-like member functions by
respectively delegating the job to:

- VIRTIO_DEVICE_PROTOCOL.AllocateSharedPages() ->
    EFI_PCI_IO_PROTOCOL.AllocateBuffer()

- VIRTIO_DEVICE_PROTOCOL.FreeSharedPages() ->
    EFI_PCI_IO_PROTOCOL.FreeBuffer()

- VIRTIO_DEVICE_PROTOCOL.MapSharedBuffer() ->
    EFI_PCI_IO_PROTOCOL.Map()

- VIRTIO_DEVICE_PROTOCOL.UnmapSharedBuffer() ->
    EFI_PCI_IO_PROTOCOL.Unmap()

Suggested-by: Laszlo Ersek <lersek@redhat.com>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
OvmfPkg/Virtio10Dxe/Virtio10.c

index d7ea4432bcb696e1ffc3383ce2cc5a20f007427b..89ccac8c1c044f0c52ecbc186279c13305bc3415 100644 (file)
@@ -2,6 +2,7 @@
   A non-transitional driver for VirtIo 1.0 PCI devices.\r
 \r
   Copyright (C) 2016, Red Hat, Inc.\r
+  Copyright (C) 2017, AMD Inc, All rights reserved.<BR>\r
 \r
   This program and the accompanying materials are licensed and made available\r
   under the terms and conditions of the BSD License which accompanies this\r
@@ -15,6 +16,7 @@
 #include <IndustryStandard/Pci.h>\r
 #include <IndustryStandard/Virtio.h>\r
 #include <Protocol/PciIo.h>\r
+#include <Protocol/PciRootBridgeIo.h>\r
 #include <Protocol/VirtioDevice.h>\r
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/DebugLib.h>\r
@@ -772,6 +774,117 @@ Virtio10ReadDevice (
   return Status;\r
 }\r
 \r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+Virtio10AllocateSharedPages (\r
+  IN     VIRTIO_DEVICE_PROTOCOL  *This,\r
+  IN     UINTN                   Pages,\r
+  IN OUT VOID                    **HostAddress\r
+  )\r
+{\r
+  VIRTIO_1_0_DEV *Dev;\r
+  EFI_STATUS     Status;\r
+\r
+  Dev = VIRTIO_1_0_FROM_VIRTIO_DEVICE (This);\r
+\r
+  Status = Dev->PciIo->AllocateBuffer (\r
+                         Dev->PciIo,\r
+                         AllocateAnyPages,\r
+                         EfiBootServicesData,\r
+                         Pages,\r
+                         HostAddress,\r
+                         EFI_PCI_ATTRIBUTE_MEMORY_CACHED\r
+                         );\r
+  return Status;\r
+}\r
+\r
+STATIC\r
+VOID\r
+EFIAPI\r
+Virtio10FreeSharedPages (\r
+  IN  VIRTIO_DEVICE_PROTOCOL  *This,\r
+  IN  UINTN                   Pages,\r
+  IN  VOID                    *HostAddress\r
+  )\r
+{\r
+  VIRTIO_1_0_DEV *Dev;\r
+\r
+  Dev = VIRTIO_1_0_FROM_VIRTIO_DEVICE (This);\r
+\r
+  Dev->PciIo->FreeBuffer (\r
+                Dev->PciIo,\r
+                Pages,\r
+                HostAddress\r
+                );\r
+}\r
+\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+Virtio10MapSharedBuffer (\r
+  IN     VIRTIO_DEVICE_PROTOCOL  *This,\r
+  IN     VIRTIO_MAP_OPERATION    Operation,\r
+  IN     VOID                    *HostAddress,\r
+  IN OUT UINTN                   *NumberOfBytes,\r
+  OUT    EFI_PHYSICAL_ADDRESS    *DeviceAddress,\r
+  OUT    VOID                    **Mapping\r
+  )\r
+{\r
+  EFI_STATUS                    Status;\r
+  VIRTIO_1_0_DEV                *Dev;\r
+  EFI_PCI_IO_PROTOCOL_OPERATION PciIoOperation;\r
+\r
+  Dev = VIRTIO_1_0_FROM_VIRTIO_DEVICE (This);\r
+\r
+  //\r
+  // Map VIRTIO_MAP_OPERATION to EFI_PCI_IO_PROTOCOL_OPERATION\r
+  //\r
+  switch (Operation) {\r
+  case VirtioOperationBusMasterRead:\r
+    PciIoOperation = EfiPciIoOperationBusMasterRead;\r
+    break;\r
+  case VirtioOperationBusMasterWrite:\r
+    PciIoOperation = EfiPciIoOperationBusMasterWrite;\r
+    break;\r
+  case VirtioOperationBusMasterCommonBuffer:\r
+    PciIoOperation = EfiPciIoOperationBusMasterCommonBuffer;\r
+    break;\r
+  default:\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Status = Dev->PciIo->Map (\r
+                         Dev->PciIo,\r
+                         PciIoOperation,\r
+                         HostAddress,\r
+                         NumberOfBytes,\r
+                         DeviceAddress,\r
+                         Mapping\r
+                         );\r
+  return Status;\r
+}\r
+\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+Virtio10UnmapSharedBuffer (\r
+  IN  VIRTIO_DEVICE_PROTOCOL  *This,\r
+  IN  VOID                    *Mapping\r
+  )\r
+{\r
+  EFI_STATUS      Status;\r
+  VIRTIO_1_0_DEV  *Dev;\r
+\r
+  Dev = VIRTIO_1_0_FROM_VIRTIO_DEVICE (This);\r
+\r
+  Status = Dev->PciIo->Unmap (\r
+                         Dev->PciIo,\r
+                         Mapping\r
+                         );\r
+\r
+  return Status;\r
+}\r
 \r
 STATIC CONST VIRTIO_DEVICE_PROTOCOL mVirtIoTemplate = {\r
   VIRTIO_SPEC_REVISION (1, 0, 0),\r
@@ -788,7 +901,11 @@ STATIC CONST VIRTIO_DEVICE_PROTOCOL mVirtIoTemplate = {
   Virtio10GetDeviceStatus,\r
   Virtio10SetDeviceStatus,\r
   Virtio10WriteDevice,\r
-  Virtio10ReadDevice\r
+  Virtio10ReadDevice,\r
+  Virtio10AllocateSharedPages,\r
+  Virtio10FreeSharedPages,\r
+  Virtio10MapSharedBuffer,\r
+  Virtio10UnmapSharedBuffer\r
 };\r
 \r
 \r
@@ -906,7 +1023,8 @@ Virtio10BindingStart (
     goto ClosePciIo;\r
   }\r
 \r
-  SetAttributes = EFI_PCI_IO_ATTRIBUTE_BUS_MASTER;\r
+  SetAttributes = (EFI_PCI_IO_ATTRIBUTE_BUS_MASTER |\r
+                   EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE);\r
   UpdateAttributes (&Device->CommonConfig, &SetAttributes);\r
   UpdateAttributes (&Device->NotifyConfig, &SetAttributes);\r
   UpdateAttributes (&Device->SpecificConfig, &SetAttributes);\r