]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c
OvmfPkg/VirtioMmioDeviceLib: implement IOMMU-like member functions
[mirror_edk2.git] / OvmfPkg / Library / VirtioMmioDeviceLib / VirtioMmioDeviceFunctions.c
index 3950c07f7f5d9a0ef1ab54b461b740e1eec82010..644ec65e1788b1e319d1f6c7bcf4ee33295cda17 100644 (file)
@@ -22,7 +22,7 @@ EFI_STATUS
 EFIAPI\r
 VirtioMmioGetDeviceFeatures (\r
   IN VIRTIO_DEVICE_PROTOCOL *This,\r
-  OUT UINT32                *DeviceFeatures\r
+  OUT UINT64                *DeviceFeatures\r
   )\r
 {\r
   VIRTIO_MMIO_DEVICE *Device;\r
@@ -38,26 +38,6 @@ VirtioMmioGetDeviceFeatures (
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
-EFIAPI\r
-VirtioMmioGetQueueAddress (\r
-  IN  VIRTIO_DEVICE_PROTOCOL *This,\r
-  OUT UINT32                 *QueueAddress\r
-  )\r
-{\r
-  VIRTIO_MMIO_DEVICE *Device;\r
-\r
-  if (QueueAddress == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This);\r
-\r
-  *QueueAddress = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_QUEUE_PFN);\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
 EFI_STATUS\r
 EFIAPI\r
 VirtioMmioGetQueueSize (\r
@@ -101,8 +81,8 @@ VirtioMmioGetDeviceStatus (
 EFI_STATUS\r
 EFIAPI\r
 VirtioMmioSetQueueSize (\r
-  VIRTIO_DEVICE_PROTOCOL *This,\r
-  UINT16                  QueueSize\r
+  IN VIRTIO_DEVICE_PROTOCOL *This,\r
+  IN UINT16                  QueueSize\r
   )\r
 {\r
   VIRTIO_MMIO_DEVICE *Device;\r
@@ -117,8 +97,8 @@ VirtioMmioSetQueueSize (
 EFI_STATUS\r
 EFIAPI\r
 VirtioMmioSetDeviceStatus (\r
-  VIRTIO_DEVICE_PROTOCOL *This,\r
-  UINT8                   DeviceStatus\r
+  IN VIRTIO_DEVICE_PROTOCOL *This,\r
+  IN UINT8                   DeviceStatus\r
   )\r
 {\r
   VIRTIO_MMIO_DEVICE *Device;\r
@@ -133,8 +113,8 @@ VirtioMmioSetDeviceStatus (
 EFI_STATUS\r
 EFIAPI\r
 VirtioMmioSetQueueNotify (\r
-  VIRTIO_DEVICE_PROTOCOL *This,\r
-  UINT16                  QueueNotify\r
+  IN VIRTIO_DEVICE_PROTOCOL *This,\r
+  IN UINT16                  QueueNotify\r
   )\r
 {\r
   VIRTIO_MMIO_DEVICE *Device;\r
@@ -149,8 +129,8 @@ VirtioMmioSetQueueNotify (
 EFI_STATUS\r
 EFIAPI\r
 VirtioMmioSetQueueAlignment (\r
-  VIRTIO_DEVICE_PROTOCOL *This,\r
-  UINT32                  Alignment\r
+  IN VIRTIO_DEVICE_PROTOCOL *This,\r
+  IN UINT32                  Alignment\r
   )\r
 {\r
   VIRTIO_MMIO_DEVICE *Device;\r
@@ -165,8 +145,8 @@ VirtioMmioSetQueueAlignment (
 EFI_STATUS\r
 EFIAPI\r
 VirtioMmioSetPageSize (\r
-  VIRTIO_DEVICE_PROTOCOL *This,\r
-  UINT32                  PageSize\r
+  IN VIRTIO_DEVICE_PROTOCOL *This,\r
+  IN UINT32                  PageSize\r
   )\r
 {\r
   VIRTIO_MMIO_DEVICE *Device;\r
@@ -185,8 +165,8 @@ VirtioMmioSetPageSize (
 EFI_STATUS\r
 EFIAPI\r
 VirtioMmioSetQueueSel (\r
-  VIRTIO_DEVICE_PROTOCOL *This,\r
-  UINT16                  Sel\r
+  IN VIRTIO_DEVICE_PROTOCOL *This,\r
+  IN UINT16                  Sel\r
   )\r
 {\r
   VIRTIO_MMIO_DEVICE *Device;\r
@@ -200,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
@@ -216,15 +197,19 @@ VirtioMmioSetQueueAddress (
 EFI_STATUS\r
 EFIAPI\r
 VirtioMmioSetGuestFeatures (\r
-  VIRTIO_DEVICE_PROTOCOL *This,\r
-  UINT32                  Features\r
+  IN VIRTIO_DEVICE_PROTOCOL *This,\r
+  IN UINT64                  Features\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_GUEST_FEATURES, Features);\r
+  if (Features > MAX_UINT32) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+  VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_FEATURES,\r
+    (UINT32)Features);\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -308,3 +293,60 @@ VirtioMmioDeviceRead (
 \r
   return EFI_SUCCESS;\r
 }\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+VirtioMmioAllocateSharedPages (\r
+  IN  VIRTIO_DEVICE_PROTOCOL  *This,\r
+  IN  UINTN                   NumPages,\r
+  OUT VOID                    **HostAddress\r
+  )\r
+{\r
+  VOID        *Buffer;\r
+\r
+  Buffer = AllocatePages (NumPages);\r
+  if (Buffer == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  *HostAddress = Buffer;\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+VOID\r
+EFIAPI\r
+VirtioMmioFreeSharedPages (\r
+  IN  VIRTIO_DEVICE_PROTOCOL  *This,\r
+  IN  UINTN                   NumPages,\r
+  IN  VOID                    *HostAddress\r
+  )\r
+{\r
+  FreePages (HostAddress, NumPages);\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+VirtioMmioMapSharedBuffer (\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
+  *DeviceAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress;\r
+  *Mapping = NULL;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+VirtioMmioUnmapSharedBuffer (\r
+  IN VIRTIO_DEVICE_PROTOCOL    *This,\r
+  IN VOID                      *Mapping\r
+  )\r
+{\r
+  return EFI_SUCCESS;\r
+}\r