summaryrefslogtreecommitdiffstats
path: root/OvmfPkg/Library/XenIoMmioLib
diff options
context:
space:
mode:
authorArd Biesheuvel <ard.biesheuvel@linaro.org>2015-02-28 20:34:16 +0000
committerlersek <lersek@Edk2>2015-02-28 20:34:16 +0000
commit0169352eaa357281fba57d176cceba3baf67400c (patch)
tree5672fd2d1f0e4ce8699b07ba3e4fcaab267d181f /OvmfPkg/Library/XenIoMmioLib
parentb0022ab871d3590f2d074ad1359a4cd0627a2741 (diff)
downloadedk2-0169352eaa357281fba57d176cceba3baf67400c.tar.gz
edk2-0169352eaa357281fba57d176cceba3baf67400c.tar.bz2
edk2-0169352eaa357281fba57d176cceba3baf67400c.zip
ArmVirtualizationPkg: add XenIoMmioLib
This adds a XenIoMmioLib declaration and implementation that can be invoked to install the XENIO_PROTOCOL and a corresponding grant table address on a EFI handle. Contributed-under: TianoCore Contribution Agreement 1.0 Reviewed-by: Laszlo Ersek <lersek@redhat.com> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Laszlo Ersek <lersek@redhat.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16979 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'OvmfPkg/Library/XenIoMmioLib')
-rw-r--r--OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.c166
-rw-r--r--OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.inf39
2 files changed, 205 insertions, 0 deletions
diff --git a/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.c b/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.c
new file mode 100644
index 0000000000..c710e85865
--- /dev/null
+++ b/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.c
@@ -0,0 +1,166 @@
+/** @file
+* Manage XenBus device path and I/O handles
+*
+* Copyright (c) 2015, Linaro Ltd. All rights reserved.<BR>
+*
+* This program and the accompanying materials are
+* licensed and made available under the terms and conditions of the BSD License
+* which accompanies this distribution. The full text of the license may be found at
+* http://opensource.org/licenses/bsd-license.php
+*
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#include <Library/BaseLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/DebugLib.h>
+#include <Library/UefiLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/XenIoMmioLib.h>
+
+#include <Protocol/XenIo.h>
+#include <Guid/XenBusRootDevice.h>
+
+#pragma pack (1)
+typedef struct {
+ VENDOR_DEVICE_PATH Vendor;
+ EFI_PHYSICAL_ADDRESS GrantTableAddress;
+ EFI_DEVICE_PATH_PROTOCOL End;
+} XENBUS_ROOT_DEVICE_PATH;
+#pragma pack ()
+
+STATIC CONST XENBUS_ROOT_DEVICE_PATH mXenBusRootDevicePathTemplate = {
+ {
+ {
+ HARDWARE_DEVICE_PATH,
+ HW_VENDOR_DP,
+ { sizeof (VENDOR_DEVICE_PATH) + sizeof (EFI_PHYSICAL_ADDRESS), 0 }
+ },
+ XENBUS_ROOT_DEVICE_GUID,
+ },
+ 0,
+ {
+ END_DEVICE_PATH_TYPE,
+ END_ENTIRE_DEVICE_PATH_SUBTYPE,
+ { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 }
+ }
+};
+
+/**
+
+ Install the XENBUS_ROOT_DEVICE_PATH and XENIO_PROTOCOL protocols on
+ the handle pointed to by @Handle, or on a new handle if it points to
+ NULL
+
+ @param Handle Pointer to the handle to install the protocols
+ on, may point to a NULL handle.
+
+ @param GrantTableAddress The address of the Xen grant table
+
+ @retval EFI_SUCCESS Protocols were installed successfully
+
+ @retval EFI_OUT_OF_RESOURCES The function failed to allocate memory required
+ by the XenIo MMIO and device path protocols
+
+ @return Status code returned by the boot service
+ InstallMultipleProtocolInterfaces ()
+
+**/
+EFI_STATUS
+XenIoMmioInstall (
+ IN OUT EFI_HANDLE *Handle,
+ IN EFI_PHYSICAL_ADDRESS GrantTableAddress
+ )
+{
+ EFI_STATUS Status;
+ XENIO_PROTOCOL *XenIo;
+ XENBUS_ROOT_DEVICE_PATH *XenBusDevicePath;
+ EFI_HANDLE OutHandle;
+
+ ASSERT (Handle != NULL);
+
+ OutHandle = *Handle;
+
+ XenIo = AllocateZeroPool (sizeof *XenIo);
+ if (!XenIo) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ XenIo->GrantTableAddress = GrantTableAddress;
+
+ XenBusDevicePath = AllocateCopyPool (sizeof *XenBusDevicePath,
+ &mXenBusRootDevicePathTemplate);
+ if (!XenBusDevicePath) {
+ DEBUG ((EFI_D_ERROR, "%a: Out of memory\n", __FUNCTION__));
+ Status = EFI_OUT_OF_RESOURCES;
+ goto FreeXenIo;
+ }
+ XenBusDevicePath->GrantTableAddress = GrantTableAddress;
+
+ Status = gBS->InstallMultipleProtocolInterfaces (&OutHandle,
+ &gEfiDevicePathProtocolGuid, XenBusDevicePath,
+ &gXenIoProtocolGuid, XenIo,
+ NULL);
+ if (!EFI_ERROR (Status)) {
+ *Handle = OutHandle;
+ return EFI_SUCCESS;
+ }
+
+ DEBUG ((EFI_D_ERROR, "%a: Failed to install the EFI_DEVICE_PATH and "
+ "XENIO_PROTOCOL protocols on handle %p (Status == %r)\n",
+ __FUNCTION__, OutHandle, Status));
+
+ FreePool (XenBusDevicePath);
+
+FreeXenIo:
+ FreePool (XenIo);
+ return Status;
+}
+
+/**
+
+ Uninstall the XENBUS_ROOT_DEVICE_PATH and XENIO_PROTOCOL protocols
+
+ @param Handle Handle onto which the protocols have been installed
+ earlier by XenIoMmioInstall ()
+
+ @retval EFI_SUCCESS Protocols were uninstalled successfully
+
+ @return Status code returned by the boot service
+ UninstallMultipleProtocolInterfaces ()
+
+**/
+EFI_STATUS
+XenIoMmioUninstall (
+ IN EFI_HANDLE Handle
+ )
+{
+ EFI_STATUS Status;
+ VOID *XenIo;
+ VOID *XenBusDevicePath;
+
+ XenBusDevicePath = NULL;
+ gBS->OpenProtocol (Handle, &gEfiDevicePathProtocolGuid, &XenBusDevicePath,
+ NULL, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+
+ XenIo = NULL;
+ gBS->OpenProtocol (Handle, &gXenIoProtocolGuid, &XenIo,
+ NULL, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+
+ Status = gBS->UninstallMultipleProtocolInterfaces (Handle,
+ &gEfiDevicePathProtocolGuid, XenBusDevicePath,
+ &gXenIoProtocolGuid, XenIo,
+ NULL);
+
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ FreePool (XenBusDevicePath);
+ FreePool (XenIo);
+
+ return EFI_SUCCESS;
+}
diff --git a/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.inf b/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.inf
new file mode 100644
index 0000000000..16cc453035
--- /dev/null
+++ b/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.inf
@@ -0,0 +1,39 @@
+## @file
+# Manage XenBus device path and I/O handles
+#
+# Copyright (c) 2015, Linaro Ltd. All rights reserved.<BR>
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php.
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = XenIoMmioLib
+ FILE_GUID = de9bdc19-8434-47bb-be3c-7f28f2101fd0
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = XenIoMmioLib
+
+[Sources]
+ XenIoMmioLib.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ OvmfPkg/OvmfPkg.dec
+
+[LibraryClasses]
+ BaseMemoryLib
+
+[Guids]
+ gXenBusRootDeviceGuid
+
+[Protocols]
+ gEfiDevicePathProtocolGuid
+ gXenIoProtocolGuid