Re: [edk2] [PATCH v1 04/14] OvmfPkg/VirtioLib: Add SharedBuffer helper functions
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
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