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>
This commit is contained in:
Brijesh Singh 2017-08-23 06:57:18 -04:00 committed by Laszlo Ersek
parent 60ee56295f
commit fef6becb55
2 changed files with 71 additions and 0 deletions

View File

@ -60,6 +60,32 @@ VirtioRingInit (
); );
/**
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
);
/** /**
Tear down the internal resources of a configured virtio ring. Tear down the internal resources of a configured virtio ring.

View File

@ -505,3 +505,48 @@ Failed:
VirtIo->UnmapSharedBuffer (VirtIo, MapInfo); VirtIo->UnmapSharedBuffer (VirtIo, MapInfo);
return EFI_OUT_OF_RESOURCES; 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;
}