Re: [edk2] [PATCH v1 04/14] OvmfPkg/VirtioLib: Add SharedBuffer helper functions

2017-08-09 Thread Laszlo Ersek
On 08/07/17 13:58, Brijesh Singh wrote:
> Patch adds convenience helper functions to call VIRTIO_DEVICE_PROTOCOL
> AllocateSharedPages, FreeSharedPages, MapSharedBuffer and UnmapSharedBuffer
> member functions.
> 
> Cc: Ard Biesheuvel 
> Cc: Jordan Justen 
> Cc: Tom Lendacky 
> Cc: Laszlo Ersek 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Brijesh Singh 
> ---
>  OvmfPkg/Include/Library/VirtioLib.h   | 143 +
>  OvmfPkg/Library/VirtioLib/VirtioLib.c | 220 
>  2 files changed, 363 insertions(+)

I prefer to add functions to VirtioLib that actually buy us something.
So let me evaluate that for each function:

> diff --git a/OvmfPkg/Include/Library/VirtioLib.h 
> b/OvmfPkg/Include/Library/VirtioLib.h
> index 5badfb32917f..fa82734f1852 100644
> --- a/OvmfPkg/Include/Library/VirtioLib.h
> +++ b/OvmfPkg/Include/Library/VirtioLib.h
> @@ -3,6 +3,7 @@
>Declarations of utility functions used by virtio device drivers.
>  
>Copyright (C) 2012-2016, Red Hat, Inc.
> +  Copyright (C) 2017, AMD Inc, All rights reserved.
>  
>This program and the accompanying materials are licensed and made available
>under the terms and conditions of the BSD License which accompanies this
> @@ -235,4 +236,146 @@ Virtio10WriteFeatures (
>IN OUT UINT8  *DeviceStatus
>);
>  
> +/**
> +  Helper function to allocate pages that is suitable for sharing with
> +  hypervisor.
> +
> +  @param[in]  VirtIo  The target virtio device to use. It must be valid.
> +
> +  @param[in]  Pages   The number of pages to allocate.
> +
> +  @param[out] Buffer  A pointer to store the base system memory address of
> +  the allocated range.
> +
> +  return  Returns error code from VirtIo->AllocateSharedPages()
> +**/
> +EFI_STATUS
> +EFIAPI
> +VirtioAllocateSharedPages (
> +  IN  VIRTIO_DEVICE_PROTOCOL  *VirtIo,
> +  IN  UINTN   NumPages,
> +  OUT VOID**Buffer
> +  );
> +
> +/**
> +  Helper function to free pages allocated using VirtioAllocateSharedPages().
> +
> +  @param[in]  VirtIo  The target virtio device to use. It must be valid.
> +
> +  @param[in]  Pages   The number of allocated pages.
> +
> +  @param[in]  Buffer  System memory address allocated from
> +  VirtioAllocateSharedPages ().
> +**/
> +VOID
> +EFIAPI
> +VirtioFreeSharedPages (
> +  IN  VIRTIO_DEVICE_PROTOCOL  *VirtIo,
> +  IN  UINTN   NumPages,
> +  IN  VOID*Buffer
> +  );
> +
> +/**
> +  A helper function to map a system memory to a shared bus master memory for
> +  read operation from DMA bus master.
> +
> +  @param[in]  VirtIo  The target virtio device to use. It must be
> +  valid.
> +
> +  @param[in]  HostAddress The system memory address to map to shared bus
> +  master address.
> +
> +  @param[in]  NumberOfBytes   Number of bytes to be mapped.
> +
> +  @param[out] DeviceAddress   The resulting shared map address for the bus
> +  master to access the hosts HostAddress.
> +
> +  @param[out] Mapping A resulting value to pass to Unmap().
> +
> +  return  Returns error code from
> +  VirtIo->MapSharedBuffer()
> +**/
> +EFI_STATUS
> +EFIAPI
> +VirtioMapSharedBufferRead (
> +  IN  VIRTIO_DEVICE_PROTOCOL  *VirtIo,
> +  IN  VOID*HostAddress,
> +  IN  UINTN   NumberOfBytes,
> +  OUT EFI_PHYSICAL_ADDRESS*DeviceAddress,
> +  OUT VOID**Mapping
> +  );
> +
> +/**
> +  A helper function to map a system memory to a shared bus master memory for
> +  write operation from DMA bus master.
> +
> +  @param[in]  VirtIo  The target virtio device to use. It must be
> +  valid.
> +
> +  @param[in]  HostAddress The system memory address to map to shared bus
> +  master address.
> +
> +  @param[in]  NumberOfBytes   Number of bytes to be mapped.
> +
> +  @param[out] DeviceAddress   The resulting shared map address for the bus
> +  master to access the hosts HostAddress.
> +
> +  @param[out] Mapping A resulting value to pass to Unmap().
> +
> +  return  Returns error code from
> +  VirtIo->MapSharedBuffer()
> +**/
> +EFI_STATUS
> +EFIAPI
> +VirtioMapSharedBufferWrite (
> +  IN  VIRTIO_DEVICE_PROTOCOL  *VirtIo,
> +  IN  VOID*HostAddress,
> +  IN  UINTN   NumberOfBytes,
> +  OUT EFI_PHYSICAL_ADDRESS*DeviceAddress,
> +  OUT VOID**Mapping
> +  );
> +
> +/**
> +  A helper function to map a system memory to a shared bus master memory for
> +  common operation from DMA bus master.
> +
> +  @param[in]  VirtIo  The target virtio device to use. It must be
> + 

[edk2] [PATCH v1 04/14] OvmfPkg/VirtioLib: Add SharedBuffer helper functions

2017-08-07 Thread Brijesh Singh
Patch adds convenience helper functions to call VIRTIO_DEVICE_PROTOCOL
AllocateSharedPages, FreeSharedPages, MapSharedBuffer and UnmapSharedBuffer
member functions.

Cc: Ard Biesheuvel 
Cc: Jordan Justen 
Cc: Tom Lendacky 
Cc: Laszlo Ersek 
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Brijesh Singh 
---
 OvmfPkg/Include/Library/VirtioLib.h   | 143 +
 OvmfPkg/Library/VirtioLib/VirtioLib.c | 220 
 2 files changed, 363 insertions(+)

diff --git a/OvmfPkg/Include/Library/VirtioLib.h 
b/OvmfPkg/Include/Library/VirtioLib.h
index 5badfb32917f..fa82734f1852 100644
--- a/OvmfPkg/Include/Library/VirtioLib.h
+++ b/OvmfPkg/Include/Library/VirtioLib.h
@@ -3,6 +3,7 @@
   Declarations of utility functions used by virtio device drivers.
 
   Copyright (C) 2012-2016, Red Hat, Inc.
+  Copyright (C) 2017, AMD Inc, All rights reserved.
 
   This program and the accompanying materials are licensed and made available
   under the terms and conditions of the BSD License which accompanies this
@@ -235,4 +236,146 @@ Virtio10WriteFeatures (
   IN OUT UINT8  *DeviceStatus
   );
 
+/**
+  Helper function to allocate pages that is suitable for sharing with
+  hypervisor.
+
+  @param[in]  VirtIo  The target virtio device to use. It must be valid.
+
+  @param[in]  Pages   The number of pages to allocate.
+
+  @param[out] Buffer  A pointer to store the base system memory address of
+  the allocated range.
+
+  return  Returns error code from VirtIo->AllocateSharedPages()
+**/
+EFI_STATUS
+EFIAPI
+VirtioAllocateSharedPages (
+  IN  VIRTIO_DEVICE_PROTOCOL  *VirtIo,
+  IN  UINTN   NumPages,
+  OUT VOID**Buffer
+  );
+
+/**
+  Helper function to free pages allocated using VirtioAllocateSharedPages().
+
+  @param[in]  VirtIo  The target virtio device to use. It must be valid.
+
+  @param[in]  Pages   The number of allocated pages.
+
+  @param[in]  Buffer  System memory address allocated from
+  VirtioAllocateSharedPages ().
+**/
+VOID
+EFIAPI
+VirtioFreeSharedPages (
+  IN  VIRTIO_DEVICE_PROTOCOL  *VirtIo,
+  IN  UINTN   NumPages,
+  IN  VOID*Buffer
+  );
+
+/**
+  A helper function to map a system memory to a shared bus master memory for
+  read operation from DMA bus master.
+
+  @param[in]  VirtIo  The target virtio device to use. It must be
+  valid.
+
+  @param[in]  HostAddress The system memory address to map to shared bus
+  master address.
+
+  @param[in]  NumberOfBytes   Number of bytes to be mapped.
+
+  @param[out] DeviceAddress   The resulting shared map address for the bus
+  master to access the hosts HostAddress.
+
+  @param[out] Mapping A resulting value to pass to Unmap().
+
+  return  Returns error code from
+  VirtIo->MapSharedBuffer()
+**/
+EFI_STATUS
+EFIAPI
+VirtioMapSharedBufferRead (
+  IN  VIRTIO_DEVICE_PROTOCOL  *VirtIo,
+  IN  VOID*HostAddress,
+  IN  UINTN   NumberOfBytes,
+  OUT EFI_PHYSICAL_ADDRESS*DeviceAddress,
+  OUT VOID**Mapping
+  );
+
+/**
+  A helper function to map a system memory to a shared bus master memory for
+  write operation from DMA bus master.
+
+  @param[in]  VirtIo  The target virtio device to use. It must be
+  valid.
+
+  @param[in]  HostAddress The system memory address to map to shared bus
+  master address.
+
+  @param[in]  NumberOfBytes   Number of bytes to be mapped.
+
+  @param[out] DeviceAddress   The resulting shared map address for the bus
+  master to access the hosts HostAddress.
+
+  @param[out] Mapping A resulting value to pass to Unmap().
+
+  return  Returns error code from
+  VirtIo->MapSharedBuffer()
+**/
+EFI_STATUS
+EFIAPI
+VirtioMapSharedBufferWrite (
+  IN  VIRTIO_DEVICE_PROTOCOL  *VirtIo,
+  IN  VOID*HostAddress,
+  IN  UINTN   NumberOfBytes,
+  OUT EFI_PHYSICAL_ADDRESS*DeviceAddress,
+  OUT VOID**Mapping
+  );
+
+/**
+  A helper function to map a system memory to a shared bus master memory for
+  common operation from DMA bus master.
+
+  @param[in]  VirtIo  The target virtio device to use. It must be
+  valid.
+
+  @param[in]  HostAddress The system memory address to map to shared bus
+  master address.
+
+  @param[in]  NumberOfBytes   Number of bytes to be mapped.
+
+  @param[out] Mapping A resulting value to pass to Unmap().
+
+  return  Returns error code from
+  VirtIo->MapSharedBuffer()
+**/
+EFI_STATUS
+EFIAPI
+VirtioMapSharedBuf