OvmfPkg/VirtioMmioDeviceLib: implement IOMMU-like member functions

The patch implements the newly added IOMMU-like member functions by
respectively delegating the job to:

- VIRTIO_DEVICE_PROTOCOL.AllocateSharedPages () ->
    MemoryAllocationLib.AllocatePages()

- VIRTIO_DEVICE_PROTOCOL.FreeSharedPages () ->
    MemoryAllocationLib.FreePages ()

- VIRTIO_DEVICE_PROTOCOL.MapSharedBuffer () -> no-op

- VIRTIO_DEVICE_PROTOCOL.UnmapSharedBuffer () -> no-op

Suggested-by: Laszlo Ersek <lersek@redhat.com>
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>
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:16 -04:00 committed by Laszlo Ersek
parent 4157b8416a
commit 084cfc1a35
3 changed files with 99 additions and 2 deletions

View File

@ -3,6 +3,7 @@
This driver produces Virtio Device Protocol instances for Virtio Mmio devices. This driver produces Virtio Device Protocol instances for Virtio Mmio devices.
Copyright (C) 2013, ARM Ltd. Copyright (C) 2013, ARM Ltd.
Copyright (C) 2017, AMD Inc. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available This program and the accompanying materials are licensed and made available
under the terms and conditions of the BSD License which accompanies this under the terms and conditions of the BSD License which accompanies this
@ -15,7 +16,6 @@
**/ **/
#include <Library/BaseMemoryLib.h> #include <Library/BaseMemoryLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h> #include <Library/UefiBootServicesTableLib.h>
#include "VirtioMmioDevice.h" #include "VirtioMmioDevice.h"
@ -35,7 +35,11 @@ static VIRTIO_DEVICE_PROTOCOL mMmioDeviceProtocolTemplate = {
VirtioMmioGetDeviceStatus, // GetDeviceStatus VirtioMmioGetDeviceStatus, // GetDeviceStatus
VirtioMmioSetDeviceStatus, // SetDeviceStatus VirtioMmioSetDeviceStatus, // SetDeviceStatus
VirtioMmioDeviceWrite, // WriteDevice VirtioMmioDeviceWrite, // WriteDevice
VirtioMmioDeviceRead // ReadDevice VirtioMmioDeviceRead, // ReadDevice
VirtioMmioAllocateSharedPages, // AllocateSharedPages
VirtioMmioFreeSharedPages, // FreeSharedPages
VirtioMmioMapSharedBuffer, // MapSharedBuffer
VirtioMmioUnmapSharedBuffer // UnmapSharedBuffer
}; };
/** /**

View File

@ -3,6 +3,7 @@
Internal definitions for the VirtIo MMIO Device driver Internal definitions for the VirtIo MMIO Device driver
Copyright (C) 2013, ARM Ltd Copyright (C) 2013, ARM Ltd
Copyright (C) 2017, AMD Inc. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available This program and the accompanying materials are licensed and made available
under the terms and conditions of the BSD License which accompanies this under the terms and conditions of the BSD License which accompanies this
@ -25,6 +26,7 @@
#include <Library/IoLib.h> #include <Library/IoLib.h>
#include <Library/UefiLib.h> #include <Library/UefiLib.h>
#include <Library/VirtioMmioDeviceLib.h> #include <Library/VirtioMmioDeviceLib.h>
#include <Library/MemoryAllocationLib.h>
#define VIRTIO_MMIO_DEVICE_SIGNATURE SIGNATURE_32 ('V', 'M', 'I', 'O') #define VIRTIO_MMIO_DEVICE_SIGNATURE SIGNATURE_32 ('V', 'M', 'I', 'O')
@ -137,4 +139,38 @@ VirtioMmioSetGuestFeatures (
IN UINT64 Features IN UINT64 Features
); );
EFI_STATUS
EFIAPI
VirtioMmioAllocateSharedPages (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINTN NumPages,
OUT VOID **HostAddress
);
VOID
EFIAPI
VirtioMmioFreeSharedPages (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINTN NumPages,
IN VOID *HostAddress
);
EFI_STATUS
EFIAPI
VirtioMmioMapSharedBuffer (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_MAP_OPERATION Operation,
IN VOID *HostAddress,
IN OUT UINTN *NumberOfBytes,
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
OUT VOID **Mapping
);
EFI_STATUS
EFIAPI
VirtioMmioUnmapSharedBuffer (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VOID *Mapping
);
#endif // _VIRTIO_MMIO_DEVICE_INTERNAL_H_ #endif // _VIRTIO_MMIO_DEVICE_INTERNAL_H_

View File

@ -293,3 +293,60 @@ VirtioMmioDeviceRead (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
EFI_STATUS
EFIAPI
VirtioMmioAllocateSharedPages (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINTN NumPages,
OUT VOID **HostAddress
)
{
VOID *Buffer;
Buffer = AllocatePages (NumPages);
if (Buffer == NULL) {
return EFI_OUT_OF_RESOURCES;
}
*HostAddress = Buffer;
return EFI_SUCCESS;
}
VOID
EFIAPI
VirtioMmioFreeSharedPages (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN UINTN NumPages,
IN VOID *HostAddress
)
{
FreePages (HostAddress, NumPages);
}
EFI_STATUS
EFIAPI
VirtioMmioMapSharedBuffer (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VIRTIO_MAP_OPERATION Operation,
IN VOID *HostAddress,
IN OUT UINTN *NumberOfBytes,
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
OUT VOID **Mapping
)
{
*DeviceAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress;
*Mapping = NULL;
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
VirtioMmioUnmapSharedBuffer (
IN VIRTIO_DEVICE_PROTOCOL *This,
IN VOID *Mapping
)
{
return EFI_SUCCESS;
}