mirror of https://github.com/acidanthera/audk.git
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:
parent
60ee56295f
commit
fef6becb55
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue