diff options
author | Brijesh Singh <brijesh.singh@amd.com> | 2017-08-23 06:57:18 -0400 |
---|---|---|
committer | Laszlo Ersek <lersek@redhat.com> | 2017-08-25 10:42:19 +0200 |
commit | fef6becb55355c2f6cf0a99f6e7e564d3165ee49 (patch) | |
tree | 4a053f610e193a3b93976cf1240b266a6e9b6329 /OvmfPkg/Library/VirtioLib | |
parent | 60ee56295fb672bf5a324d4016582c88facb2ecf (diff) | |
download | edk2-fef6becb55355c2f6cf0a99f6e7e564d3165ee49.zip edk2-fef6becb55355c2f6cf0a99f6e7e564d3165ee49.tar.gz edk2-fef6becb55355c2f6cf0a99f6e7e564d3165ee49.tar.bz2 |
OvmfPkg/VirtioLib: add function to map VRING
Add a function to map the ring buffer with BusMasterCommonBuffer so that
ring can be accessed by both guest and hypervisor.
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>
[lersek@redhat.com: fix typo in commit message]
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
Diffstat (limited to 'OvmfPkg/Library/VirtioLib')
-rw-r--r-- | OvmfPkg/Library/VirtioLib/VirtioLib.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/OvmfPkg/Library/VirtioLib/VirtioLib.c b/OvmfPkg/Library/VirtioLib/VirtioLib.c index 78405c7..84acfe6 100644 --- a/OvmfPkg/Library/VirtioLib/VirtioLib.c +++ b/OvmfPkg/Library/VirtioLib/VirtioLib.c @@ -505,3 +505,48 @@ Failed: VirtIo->UnmapSharedBuffer (VirtIo, MapInfo);
return EFI_OUT_OF_RESOURCES;
}
+
+/**
+
+ Map the ring buffer so that it can be accessed equally by both guest
+ and hypervisor.
+
+ @param[in] VirtIo The virtio device instance.
+
+ @param[in] Ring The virtio ring to map.
+
+ @param[out] RingBaseShift A resulting translation offset, to be
+ passed to VirtIo->SetQueueAddress().
+
+ @param[out] Mapping A resulting token to pass to
+ VirtIo->UnmapSharedBuffer().
+
+ @return Status code from VirtIo->MapSharedBuffer()
+**/
+EFI_STATUS
+EFIAPI
+VirtioRingMap (
+ IN VIRTIO_DEVICE_PROTOCOL *VirtIo,
+ IN VRING *Ring,
+ OUT UINT64 *RingBaseShift,
+ OUT VOID **Mapping
+ )
+{
+ EFI_STATUS Status;
+ EFI_PHYSICAL_ADDRESS DeviceAddress;
+
+ Status = VirtioMapAllBytesInSharedBuffer (
+ VirtIo,
+ VirtioOperationBusMasterCommonBuffer,
+ Ring->Base,
+ EFI_PAGES_TO_SIZE (Ring->NumPages),
+ &DeviceAddress,
+ Mapping
+ );
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ *RingBaseShift = DeviceAddress - (UINT64)(UINTN)Ring->Base;
+ return EFI_SUCCESS;
+}
|