hikey: Add UEFI sources for reference

UEFI needs to be built outside Android build system.
Please follow the instructions in README.

The sources correspond to:
https://github.com/96boards/edk2/commit/14eae0c12e71fd33c4c0fc51e4475e8db02566cf
https://github.com/96boards/arm-trusted-firmware/commit/e9b4909dcd75fc4ae7041cfb83d28ab9adb7afdf
https://github.com/96boards/l-loader/commit/6b784ad5c4ab00e2b1c6f53cd5f74054e5d00a78
https://git.linaro.org/uefi/uefi-tools.git/commit/abe618f8ab72034fff1ce46c9c006a2c6bd40a7e

Change-Id: Ieeefdb63e673e0c8e64e0a1f02c7bddc63b2c7fb
Signed-off-by: Vishal Bhoj <vishal.bhoj@linaro.org>
diff --git a/uefi/linaro-edk2/IntelFspWrapperPkg/FspNotifyDxe/FspNotifyDxe.c b/uefi/linaro-edk2/IntelFspWrapperPkg/FspNotifyDxe/FspNotifyDxe.c
new file mode 100644
index 0000000..859b267
--- /dev/null
+++ b/uefi/linaro-edk2/IntelFspWrapperPkg/FspNotifyDxe/FspNotifyDxe.c
@@ -0,0 +1,148 @@
+/** @file

+  This driver will register two callbacks to call fsp's notifies.

+

+  Copyright (c) 2014 - 2015, Intel Corporation. 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 <PiDxe.h>

+

+#include <Protocol/PciEnumerationComplete.h>

+

+#include <Library/UefiDriverEntryPoint.h>

+#include <Library/UefiBootServicesTableLib.h>

+#include <Library/DebugLib.h>

+#include <Library/BaseMemoryLib.h>

+#include <Library/UefiLib.h>

+#include <Library/FspApiLib.h>

+

+FSP_INFO_HEADER *mFspHeader = NULL;

+

+/**

+  PciEnumerationComplete Protocol notification event handler.

+

+  @param[in] Event    Event whose notification function is being invoked.

+  @param[in] Context  Pointer to the notification function's context.

+**/

+VOID

+EFIAPI

+OnPciEnumerationComplete (

+  IN EFI_EVENT  Event,

+  IN VOID       *Context

+  )

+{

+  NOTIFY_PHASE_PARAMS NotifyPhaseParams;

+  EFI_STATUS          Status;

+  VOID                *Interface;

+

+  //

+  // Try to locate it because gEfiPciEnumerationCompleteProtocolGuid will trigger it once when registration.

+  // Just return if it is not found.

+  //

+  Status = gBS->LocateProtocol (

+                  &gEfiPciEnumerationCompleteProtocolGuid,

+                  NULL,

+                  &Interface

+                  );

+  if (EFI_ERROR (Status)) {

+    return ;

+  }

+

+  NotifyPhaseParams.Phase = EnumInitPhaseAfterPciEnumeration;

+  Status = CallFspNotifyPhase (mFspHeader, &NotifyPhaseParams);

+  if (Status != EFI_SUCCESS) {

+    DEBUG((DEBUG_ERROR, "FSP NotifyPhase AfterPciEnumeration failed, status: 0x%x\n", Status));

+  } else {

+    DEBUG((DEBUG_INFO, "FSP NotifyPhase AfterPciEnumeration Success.\n"));

+  }

+}

+

+/**

+  Notification function of EVT_GROUP_READY_TO_BOOT event group.

+

+  This is a notification function registered on EVT_GROUP_READY_TO_BOOT event group.

+  When the Boot Manager is about to load and execute a boot option, it reclaims variable

+  storage if free size is below the threshold.

+

+  @param[in] Event        Event whose notification function is being invoked.

+  @param[in] Context      Pointer to the notification function's context.

+

+**/

+VOID

+EFIAPI

+OnReadyToBoot (

+  IN EFI_EVENT  Event,

+  IN VOID       *Context

+  )

+{

+  NOTIFY_PHASE_PARAMS NotifyPhaseParams;

+  EFI_STATUS          Status;

+

+  gBS->CloseEvent (Event);

+

+  NotifyPhaseParams.Phase = EnumInitPhaseReadyToBoot;

+  Status = CallFspNotifyPhase (mFspHeader, &NotifyPhaseParams);

+  if (Status != EFI_SUCCESS) {

+    DEBUG((DEBUG_ERROR, "FSP NotifyPhase ReadyToBoot failed, status: 0x%x\n", Status));

+  } else {

+    DEBUG((DEBUG_INFO, "FSP NotifyPhase ReadyToBoot Success.\n"));

+  }

+}

+

+/**

+  Main entry for the FSP DXE module.

+

+  This routine registers two callbacks to call fsp's notifies.

+

+  @param[in] ImageHandle    The firmware allocated handle for the EFI image.

+  @param[in] SystemTable    A pointer to the EFI System Table.

+

+  @retval EFI_SUCCESS       The entry point is executed successfully.

+  @retval other             Some error occurs when executing this entry point.

+

+**/

+EFI_STATUS

+EFIAPI

+FspDxeEntryPoint (

+  IN EFI_HANDLE         ImageHandle,

+  IN EFI_SYSTEM_TABLE   *SystemTable

+  )

+{

+  EFI_STATUS Status;

+  EFI_EVENT  ReadyToBootEvent;

+  VOID       *Registration;

+  EFI_EVENT  ProtocolNotifyEvent;

+

+  mFspHeader = FspFindFspHeader (PcdGet32 (PcdFlashFvFspBase));

+  DEBUG ((DEBUG_INFO, "FspHeader - 0x%x\n", mFspHeader));

+  if (mFspHeader == NULL) {

+    return EFI_DEVICE_ERROR;

+  }

+

+  ProtocolNotifyEvent = EfiCreateProtocolNotifyEvent (

+                          &gEfiPciEnumerationCompleteProtocolGuid,

+                          TPL_CALLBACK,

+                          OnPciEnumerationComplete,

+                          NULL,

+                          &Registration

+                          );

+  ASSERT (ProtocolNotifyEvent != NULL);

+

+  Status = EfiCreateEventReadyToBootEx (

+             TPL_CALLBACK,

+             OnReadyToBoot,

+             NULL,

+             &ReadyToBootEvent

+             );

+  ASSERT_EFI_ERROR (Status);

+

+  return EFI_SUCCESS;

+}

+