Revision: 16979
          http://sourceforge.net/p/edk2/code/16979
Author:   lersek
Date:     2015-02-28 20:34:16 +0000 (Sat, 28 Feb 2015)
Log Message:
-----------
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 <[email protected]>
Signed-off-by: Ard Biesheuvel <[email protected]>
Signed-off-by: Laszlo Ersek <[email protected]>

Modified Paths:
--------------
    trunk/edk2/OvmfPkg/OvmfPkg.dec

Added Paths:
-----------
    trunk/edk2/OvmfPkg/Include/Library/XenIoMmioLib.h
    trunk/edk2/OvmfPkg/Library/XenIoMmioLib/
    trunk/edk2/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.c
    trunk/edk2/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.inf

Added: trunk/edk2/OvmfPkg/Include/Library/XenIoMmioLib.h
===================================================================
--- trunk/edk2/OvmfPkg/Include/Library/XenIoMmioLib.h                           
(rev 0)
+++ trunk/edk2/OvmfPkg/Include/Library/XenIoMmioLib.h   2015-02-28 20:34:16 UTC 
(rev 16979)
@@ -0,0 +1,64 @@
+/** @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.
+*
+**/
+
+#ifndef _XENIO_MMIO_DEVICE_LIB_H_
+#define _XENIO_MMIO_DEVICE_LIB_H_
+
+/**
+
+  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
+  );
+
+
+/**
+
+  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
+  );
+
+#endif

Added: trunk/edk2/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.c
===================================================================
--- trunk/edk2/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.c                      
        (rev 0)
+++ trunk/edk2/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.c      2015-02-28 
20:34:16 UTC (rev 16979)
@@ -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;
+}

Added: trunk/edk2/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.inf
===================================================================
--- trunk/edk2/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.inf                    
        (rev 0)
+++ trunk/edk2/OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.inf    2015-02-28 
20:34:16 UTC (rev 16979)
@@ -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

Modified: trunk/edk2/OvmfPkg/OvmfPkg.dec
===================================================================
--- trunk/edk2/OvmfPkg/OvmfPkg.dec      2015-02-28 20:34:06 UTC (rev 16978)
+++ trunk/edk2/OvmfPkg/OvmfPkg.dec      2015-02-28 20:34:16 UTC (rev 16979)
@@ -48,6 +48,10 @@
   #
   XenHypercallLib|Include/Library/XenHypercallLib.h
 
+  ##  @libraryclass  Manage XenBus device path and I/O handles
+  #
+  XenIoMmioLib|Include/Library/XenIoMmioLib.h
+
 [Guids]
   gUefiOvmfPkgTokenSpaceGuid      = {0x93bb96af, 0xb9f2, 0x4eb8, {0x94, 0x62, 
0xe0, 0xba, 0x74, 0x56, 0x42, 0x36}}
   gEfiXenInfoGuid                 = {0xd3b46f3b, 0xd441, 0x1244, {0x9a, 0x12, 
0x0, 0x12, 0x27, 0x3f, 0xc1, 0x4d}}


------------------------------------------------------------------------------
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-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to