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
Signed-off-by: Ard Biesheuvel <[email protected]>
---
 ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec              |  6 
+++++
 ArmPlatformPkg/ArmVirtualizationPkg/Include/Library/XenIoMmioLib.h        | 20 
+++++++++++++++
 ArmPlatformPkg/ArmVirtualizationPkg/Library/XenIoMmioLib/XenIoMmioLib.c   | 91 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ArmPlatformPkg/ArmVirtualizationPkg/Library/XenIoMmioLib/XenIoMmioLib.inf | 38 
+++++++++++++++++++++++++++++
 4 files changed, 155 insertions(+)

diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec 
b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec
index 868488906643..c690f1481093 100644
--- a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec
+++ b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec
@@ -30,6 +30,12 @@
 [Includes.common]
   Include                        # Root include for the package
 
+[LibraryClasses]
+  #
+  # library to create handles containing the XENIO_PROTOCOL I/O protocol
+  #
+  XenIoMmioLib|Include/Library/XenIoMmioLib.h
+
 [Guids.common]
   gArmVirtualizationTokenSpaceGuid = { 0x0B6F5CA7, 0x4F53, 0x445A, { 0xB7, 
0x6E, 0x2E, 0x36, 0x5B, 0x80, 0x63, 0x66 } }
   gEarlyPL011BaseAddressGuid       = { 0xB199DEA9, 0xFD5C, 0x4A84, { 0x80, 
0x82, 0x2F, 0x41, 0x70, 0x78, 0x03, 0x05 } }
diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/Include/Library/XenIoMmioLib.h 
b/ArmPlatformPkg/ArmVirtualizationPkg/Include/Library/XenIoMmioLib.h
new file mode 100644
index 000000000000..faeabe5affe0
--- /dev/null
+++ b/ArmPlatformPkg/ArmVirtualizationPkg/Include/Library/XenIoMmioLib.h
@@ -0,0 +1,20 @@
+/** @file
+*  Library to install the XENIO_PROTOCOL on a handle
+*
+*  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.
+*
+**/
+
+EFI_STATUS
+XenIoMmioInstall (
+  IN  EFI_HANDLE  *Handle,
+  IN  UINT64      GrantTableAddress
+  );
diff --git 
a/ArmPlatformPkg/ArmVirtualizationPkg/Library/XenIoMmioLib/XenIoMmioLib.c 
b/ArmPlatformPkg/ArmVirtualizationPkg/Library/XenIoMmioLib/XenIoMmioLib.c
new file mode 100644
index 000000000000..2d8413638680
--- /dev/null
+++ b/ArmPlatformPkg/ArmVirtualizationPkg/Library/XenIoMmioLib/XenIoMmioLib.c
@@ -0,0 +1,91 @@
+/** @file
+*  Library to install the XENIO_PROTOCOL on a handle
+*
+*  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_DEVICE_PATH_PROTOCOL            End;
+} XENBUS_ROOT_DEVICE_PATH;
+#pragma pack ()
+
+EFI_STATUS
+XenIoMmioInstall (
+  IN  EFI_HANDLE  *Handle,
+  IN  UINT64      GrantTableAddress
+  )
+{
+  EFI_STATUS                     Status;
+  XENIO_PROTOCOL                 *XenIo;
+  XENBUS_ROOT_DEVICE_PATH        *XenBusDevicePath;
+
+  ASSERT (Handle != NULL);
+
+  XenIo = AllocateZeroPool (sizeof *XenIo);
+  ASSERT (XenIo != NULL);
+  XenIo->GrantTableAddress = GrantTableAddress;
+
+  XenBusDevicePath = (XENBUS_ROOT_DEVICE_PATH *)CreateDeviceNode (
+                                HARDWARE_DEVICE_PATH,
+                                HW_VENDOR_DP,
+                                sizeof (XENBUS_ROOT_DEVICE_PATH));
+  if (XenBusDevicePath == NULL) {
+    DEBUG ((EFI_D_ERROR, "%a: Out of memory\n", __FUNCTION__));
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  CopyMem (&XenBusDevicePath->Vendor.Guid, &gXenBusRootDeviceGuid,
+    sizeof (EFI_GUID));
+  SetDevicePathNodeLength (&XenBusDevicePath->Vendor,
+    sizeof (*XenBusDevicePath) - sizeof (XenBusDevicePath->End));
+  SetDevicePathEndNode (&XenBusDevicePath->End);
+
+  Status = gBS->InstallProtocolInterface (Handle,
+                 &gEfiDevicePathProtocolGuid, EFI_NATIVE_INTERFACE,
+                 XenBusDevicePath);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((EFI_D_ERROR, "%a: Failed to install the EFI_DEVICE_PATH "
+      "protocol on handle 0x%p (Status == %r)\n",
+      __FUNCTION__, *Handle, Status));
+    FreePool (XenBusDevicePath);
+    return Status;
+  }
+
+  Status = gBS->InstallProtocolInterface (Handle,
+                 &gXenIoProtocolGuid, EFI_NATIVE_INTERFACE,
+                 XenIo);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((EFI_D_ERROR, "%a: Failed to install XENIO_PROTOCOL on handle 0x%p "
+      "(Status == %r)\n", __FUNCTION__, *Handle, Status));
+
+    Status = gBS->UninstallProtocolInterface (*Handle,
+                    &gEfiDevicePathProtocolGuid, XenBusDevicePath);
+    ASSERT_EFI_ERROR (Status);
+    FreePool (XenBusDevicePath);
+    FreePool (XenIo);
+  }
+  return Status;
+}
diff --git 
a/ArmPlatformPkg/ArmVirtualizationPkg/Library/XenIoMmioLib/XenIoMmioLib.inf 
b/ArmPlatformPkg/ArmVirtualizationPkg/Library/XenIoMmioLib/XenIoMmioLib.inf
new file mode 100644
index 000000000000..14f24ff7fd2c
--- /dev/null
+++ b/ArmPlatformPkg/ArmVirtualizationPkg/Library/XenIoMmioLib/XenIoMmioLib.inf
@@ -0,0 +1,38 @@
+## @file
+# Library to install the XENIO_PROTOCOL on a handle
+#
+# 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                      = 3CD90EEC-EBF3-425D-AAE8-B16215AC4F50
+  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
-- 
1.8.3.2


------------------------------------------------------------------------------
Dive into the World of Parallel Programming. The Go Parallel Website,
sponsored by Intel and developed in partnership with Slashdot Media, is your
hub for all things parallel software development, from weekly thought
leadership blogs to news, videos, case studies, tutorials and more. Take a
look and join the conversation now. http://goparallel.sourceforge.net/
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to