]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/VirtioPciDeviceDxe/VirtioPciFunctions.c
UefiCpuPkg/CpuDxe: Enable protection for newly added page table
[mirror_edk2.git] / OvmfPkg / VirtioPciDeviceDxe / VirtioPciFunctions.c
index 9c40fd94a6e8ef802c27649100a1b9dada5d6acf..b52060d13d97024b4fa4cc19ca0997bb5161fef8 100644 (file)
@@ -5,6 +5,7 @@
   Copyright (C) 2012, Red Hat, Inc.\r
   Copyright (c) 2012, Intel Corporation. All rights reserved.<BR>\r
   Copyright (C) 2013, ARM Ltd.\r
   Copyright (C) 2012, Red Hat, Inc.\r
   Copyright (c) 2012, Intel Corporation. All rights reserved.<BR>\r
   Copyright (C) 2013, ARM Ltd.\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
 \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
@@ -101,10 +102,12 @@ EFI_STATUS
 EFIAPI\r
 VirtioPciGetDeviceFeatures (\r
   IN VIRTIO_DEVICE_PROTOCOL *This,\r
 EFIAPI\r
 VirtioPciGetDeviceFeatures (\r
   IN VIRTIO_DEVICE_PROTOCOL *This,\r
-  OUT UINT32                *DeviceFeatures\r
+  OUT UINT64                *DeviceFeatures\r
   )\r
 {\r
   VIRTIO_PCI_DEVICE         *Dev;\r
   )\r
 {\r
   VIRTIO_PCI_DEVICE         *Dev;\r
+  EFI_STATUS                Status;\r
+  UINT32                    Features32;\r
 \r
   if (DeviceFeatures == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
 \r
   if (DeviceFeatures == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -112,27 +115,12 @@ VirtioPciGetDeviceFeatures (
 \r
   Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
 \r
 \r
   Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
 \r
-  return VirtioPciIoRead (Dev, VIRTIO_PCI_OFFSET_DEVICE_FEATURES, sizeof (UINT32),\r
-      sizeof (UINT32), DeviceFeatures);\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-VirtioPciGetQueueAddress (\r
-  IN  VIRTIO_DEVICE_PROTOCOL *This,\r
-  OUT UINT32                 *QueueAddress\r
-  )\r
-{\r
-  VIRTIO_PCI_DEVICE         *Dev;\r
-\r
-  if (QueueAddress == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
+  Status = VirtioPciIoRead (Dev, VIRTIO_PCI_OFFSET_DEVICE_FEATURES,\r
+             sizeof (UINT32), sizeof (UINT32), &Features32);\r
+  if (!EFI_ERROR (Status)) {\r
+    *DeviceFeatures = Features32;\r
   }\r
   }\r
-\r
-  Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
-\r
-  return VirtioPciIoRead (Dev, VIRTIO_PCI_OFFSET_QUEUE_ADDRESS, sizeof (UINT32),\r
-      sizeof (UINT32), QueueAddress);\r
+  return Status;\r
 }\r
 \r
 EFI_STATUS\r
 }\r
 \r
 EFI_STATUS\r
@@ -177,13 +165,16 @@ EFI_STATUS
 EFIAPI\r
 VirtioPciSetGuestFeatures (\r
   IN VIRTIO_DEVICE_PROTOCOL  *This,\r
 EFIAPI\r
 VirtioPciSetGuestFeatures (\r
   IN VIRTIO_DEVICE_PROTOCOL  *This,\r
-  IN UINT32                   Features\r
+  IN UINT64                   Features\r
   )\r
 {\r
   VIRTIO_PCI_DEVICE *Dev;\r
 \r
   Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
 \r
   )\r
 {\r
   VIRTIO_PCI_DEVICE *Dev;\r
 \r
   Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
 \r
+  if (Features > MAX_UINT32) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
   return VirtioPciIoWrite (Dev, VIRTIO_PCI_OFFSET_GUEST_FEATURES,\r
       sizeof (UINT32), Features);\r
 }\r
   return VirtioPciIoWrite (Dev, VIRTIO_PCI_OFFSET_GUEST_FEATURES,\r
       sizeof (UINT32), Features);\r
 }\r
@@ -191,23 +182,26 @@ VirtioPciSetGuestFeatures (
 EFI_STATUS\r
 EFIAPI\r
 VirtioPciSetQueueAddress (\r
 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
+  IN UINT64                  RingBaseShift\r
   )\r
 {\r
   VIRTIO_PCI_DEVICE *Dev;\r
 \r
   )\r
 {\r
   VIRTIO_PCI_DEVICE *Dev;\r
 \r
+  ASSERT (RingBaseShift == 0);\r
+\r
   Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);\r
 \r
   return VirtioPciIoWrite (Dev, VIRTIO_PCI_OFFSET_QUEUE_ADDRESS, sizeof (UINT32),\r
   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
 EFIAPI\r
 VirtioPciSetQueueSel (\r
 }\r
 \r
 EFI_STATUS\r
 EFIAPI\r
 VirtioPciSetQueueSel (\r
-  VIRTIO_DEVICE_PROTOCOL    *This,\r
-  UINT16                    Sel\r
+  IN  VIRTIO_DEVICE_PROTOCOL    *This,\r
+  IN  UINT16                    Sel\r
   )\r
 {\r
   VIRTIO_PCI_DEVICE *Dev;\r
   )\r
 {\r
   VIRTIO_PCI_DEVICE *Dev;\r
@@ -221,8 +215,8 @@ VirtioPciSetQueueSel (
 EFI_STATUS\r
 EFIAPI\r
 VirtioPciSetQueueAlignment (\r
 EFI_STATUS\r
 EFIAPI\r
 VirtioPciSetQueueAlignment (\r
-  VIRTIO_DEVICE_PROTOCOL *This,\r
-  UINT32                  Alignment\r
+  IN  VIRTIO_DEVICE_PROTOCOL *This,\r
+  IN  UINT32                  Alignment\r
   )\r
 {\r
   return EFI_SUCCESS;\r
   )\r
 {\r
   return EFI_SUCCESS;\r
@@ -231,8 +225,8 @@ VirtioPciSetQueueAlignment (
 EFI_STATUS\r
 EFIAPI\r
 VirtioPciSetPageSize (\r
 EFI_STATUS\r
 EFIAPI\r
 VirtioPciSetPageSize (\r
-  VIRTIO_DEVICE_PROTOCOL *This,\r
-  UINT32                  PageSize\r
+  IN  VIRTIO_DEVICE_PROTOCOL *This,\r
+  IN  UINT32                  PageSize\r
   )\r
 {\r
   return (PageSize == EFI_PAGE_SIZE) ? EFI_SUCCESS : EFI_UNSUPPORTED;\r
   )\r
 {\r
   return (PageSize == EFI_PAGE_SIZE) ? EFI_SUCCESS : EFI_UNSUPPORTED;\r
@@ -241,8 +235,8 @@ VirtioPciSetPageSize (
 EFI_STATUS\r
 EFIAPI\r
 VirtioPciSetQueueNotify (\r
 EFI_STATUS\r
 EFIAPI\r
 VirtioPciSetQueueNotify (\r
-  VIRTIO_DEVICE_PROTOCOL *This,\r
-  UINT16                 Index\r
+  IN  VIRTIO_DEVICE_PROTOCOL *This,\r
+  IN  UINT16                 Index\r
   )\r
 {\r
   VIRTIO_PCI_DEVICE *Dev;\r
   )\r
 {\r
   VIRTIO_PCI_DEVICE *Dev;\r
@@ -256,8 +250,8 @@ VirtioPciSetQueueNotify (
 EFI_STATUS\r
 EFIAPI\r
 VirtioPciSetQueueSize (\r
 EFI_STATUS\r
 EFIAPI\r
 VirtioPciSetQueueSize (\r
-  VIRTIO_DEVICE_PROTOCOL *This,\r
-  UINT16                 Size\r
+  IN  VIRTIO_DEVICE_PROTOCOL *This,\r
+  IN  UINT16                 Size\r
   )\r
 {\r
   //\r
   )\r
 {\r
   //\r
@@ -270,8 +264,8 @@ VirtioPciSetQueueSize (
 EFI_STATUS\r
 EFIAPI\r
 VirtioPciSetDeviceStatus (\r
 EFI_STATUS\r
 EFIAPI\r
 VirtioPciSetDeviceStatus (\r
-  VIRTIO_DEVICE_PROTOCOL *This,\r
-  UINT8                  DeviceStatus\r
+  IN  VIRTIO_DEVICE_PROTOCOL *This,\r
+  IN  UINT8                  DeviceStatus\r
   )\r
 {\r
   VIRTIO_PCI_DEVICE *Dev;\r
   )\r
 {\r
   VIRTIO_PCI_DEVICE *Dev;\r
@@ -281,3 +275,60 @@ VirtioPciSetDeviceStatus (
   return VirtioPciIoWrite (Dev, VIRTIO_PCI_OFFSET_QUEUE_DEVICE_STATUS,\r
       sizeof (UINT8), DeviceStatus);\r
 }\r
   return VirtioPciIoWrite (Dev, VIRTIO_PCI_OFFSET_QUEUE_DEVICE_STATUS,\r
       sizeof (UINT8), DeviceStatus);\r
 }\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+VirtioPciAllocateSharedPages (\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
+VirtioPciFreeSharedPages (\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
+VirtioPciMapSharedBuffer (\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
+VirtioPciUnmapSharedBuffer (\r
+  IN VIRTIO_DEVICE_PROTOCOL    *This,\r
+  IN VOID                      *Mapping\r
+  )\r
+{\r
+  return EFI_SUCCESS;\r
+}\r