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/Nt32Pkg/StallPei/Stall.c b/uefi/linaro-edk2/Nt32Pkg/StallPei/Stall.c
new file mode 100644
index 0000000..c00ada8
--- /dev/null
+++ b/uefi/linaro-edk2/Nt32Pkg/StallPei/Stall.c
@@ -0,0 +1,106 @@
+/**@file

+  EFI_PEI_STALL implementation for NT32 simulation environment.

+  

+Copyright (c) 2009 - 2013, 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 "WinNtPeim.h"

+

+#include <Ppi/NtThunk.h>

+#include <Ppi/Stall.h>

+#include <Library/DebugLib.h>

+

+EFI_STATUS

+EFIAPI 

+Stall (

+  IN CONST EFI_PEI_SERVICES     **PeiServices,

+  IN CONST EFI_PEI_STALL_PPI    *This,

+  IN UINTN                      Microseconds

+  );

+  

+EFI_PEI_STALL_PPI mStallPpi = {1000, Stall};

+

+EFI_PEI_PPI_DESCRIPTOR  mPpiListStall[1] = {

+  {

+    (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),

+    &gEfiPeiStallPpiGuid,

+    &mStallPpi

+  }

+};

+

+

+/**

+  PEIM's entry point.

+  

+  This routine installs the simulation instance of EFI_PEI_STALL_PPI based

+  on Win API Sleep().

+  

+  @param  FileHandle  Handle of the file being invoked. 

+  @param  PeiServices Describes the list of possible PEI Services.

+

+  @retval  EFI_SUCCESS   The PEIM executed normally.

+  @retval  !EFI_SUCCESS  The PEIM failed to execute normally.

+**/

+EFI_STATUS

+EFIAPI

+InitializeStall (

+  IN       EFI_PEI_FILE_HANDLE  FileHandle,

+  IN CONST EFI_PEI_SERVICES     **PeiServices

+  )

+{

+  EFI_STATUS  Status;

+  Status = (*PeiServices)->InstallPpi (PeiServices, &mPpiListStall[0]);

+  ASSERT_EFI_ERROR (Status);

+

+  return Status;

+}

+

+/**

+  The Stall() function provides a blocking stall for at least the number 

+  of microseconds stipulated in the final argument of the API.

+

+  @param  PeiServices    An indirect pointer to the PEI Services Table

+                         published by the PEI Foundation.

+  @param  This           Pointer to the local data for the interface.

+  @param  Microseconds   Number of microseconds for which to stall.

+

+  @retval EFI_SUCCESS    The service provided at least the required delay.

+

+**/

+EFI_STATUS

+EFIAPI 

+Stall (

+  IN CONST EFI_PEI_SERVICES     **PeiServices,

+  IN CONST EFI_PEI_STALL_PPI    *This,

+  IN UINTN                      Microseconds

+  )

+{

+  EFI_STATUS                Status;

+  PEI_NT_THUNK_PPI          *PeiNtService;

+  EFI_WIN_NT_THUNK_PROTOCOL *NtThunk;

+  

+  Status = (**PeiServices).LocatePpi (

+                            (const EFI_PEI_SERVICES **)PeiServices,

+                            &gPeiNtThunkPpiGuid,

+                            0,                  

+                            NULL,

+                            (VOID**)&PeiNtService

+                            );

+  ASSERT_EFI_ERROR (Status);

+    

+  //

+  // Calculate the time to sleep.  Win API smallest unit to sleep is 1 millisec

+  // so micro second units need be divided by 1000 to convert to ms

+  //

+  NtThunk = (EFI_WIN_NT_THUNK_PROTOCOL*) PeiNtService->NtThunk();

+  NtThunk->Sleep ((DWORD)((Microseconds + 999) / 1000)); 

+  

+  return EFI_SUCCESS;

+}