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/MdePkg/Library/SecPeiDxeTimerLibCpu/IpfTimerLib.c b/uefi/linaro-edk2/MdePkg/Library/SecPeiDxeTimerLibCpu/IpfTimerLib.c
new file mode 100644
index 0000000..714b99e
--- /dev/null
+++ b/uefi/linaro-edk2/MdePkg/Library/SecPeiDxeTimerLibCpu/IpfTimerLib.c
@@ -0,0 +1,216 @@
+/** @file

+  Timer Library functions built upon ITC on IPF.

+

+  Copyright (c) 2006 - 2011, 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 <Base.h>

+#include <Library/TimerLib.h>

+#include <Library/BaseLib.h>

+#include <Library/PalLib.h>

+

+

+/**

+  Performs a delay measured as number of ticks.

+

+  An internal function to perform a delay measured as number of ticks. It's

+  invoked by MicroSecondDelay() and NanoSecondDelay().

+

+  @param  Delay The number of ticks to delay.

+

+**/

+VOID

+EFIAPI

+InternalIpfDelay (

+  IN      INT64                     Delay

+  )

+{

+  INT64                             Ticks;

+

+  //

+  // The target timer count is calculated here

+  //

+  Ticks = (INT64)AsmReadItc () + Delay;

+

+  //

+  // Wait until time out

+  // Delay > 2^63 could not be handled by this function

+  // Timer wrap-arounds are handled correctly by this function

+  //

+  while (Ticks - (INT64)AsmReadItc() >= 0);

+}

+

+/**

+  Stalls the CPU for at least the given number of microseconds.

+

+  Stalls the CPU for the number of microseconds specified by MicroSeconds.

+

+  @param  MicroSeconds  The minimum number of microseconds to delay.

+

+  @return The value of MicroSeconds inputted.

+

+**/

+UINTN

+EFIAPI

+MicroSecondDelay (

+  IN      UINTN                     MicroSeconds

+  )

+{

+  InternalIpfDelay (

+    GetPerformanceCounterProperties (NULL, NULL) *

+    MicroSeconds /

+    1000000

+    );

+  return MicroSeconds;

+}

+

+/**

+  Stalls the CPU for at least the given number of nanoseconds.

+

+  Stalls the CPU for the number of nanoseconds specified by NanoSeconds.

+

+  @param  NanoSeconds The minimum number of nanoseconds to delay.

+

+  @return The value of NanoSeconds inputted.

+

+**/

+UINTN

+EFIAPI

+NanoSecondDelay (

+  IN      UINTN                     NanoSeconds

+  )

+{

+  InternalIpfDelay (

+    GetPerformanceCounterProperties (NULL, NULL) *

+    NanoSeconds /

+    1000000000

+    );

+  return NanoSeconds;

+}

+

+/**

+  Retrieves the current value of a 64-bit free running performance counter.

+

+  The counter can either count up by 1 or count down by 1. If the physical

+  performance counter counts by a larger increment, then the counter values

+  must be translated. The properties of the counter can be retrieved from

+  GetPerformanceCounterProperties().

+

+  @return The current value of the free running performance counter.

+

+**/

+UINT64

+EFIAPI

+GetPerformanceCounter (

+  VOID

+  )

+{

+  return AsmReadItc ();

+}

+

+/**

+  Retrieves the 64-bit frequency in Hz and the range of performance counter

+  values.

+

+  If StartValue is not NULL, then the value that the performance counter starts

+  with immediately after is it rolls over is returned in StartValue. If

+  EndValue is not NULL, then the value that the performance counter end with

+  immediately before it rolls over is returned in EndValue. The 64-bit

+  frequency of the performance counter in Hz is always returned. If StartValue

+  is less than EndValue, then the performance counter counts up. If StartValue

+  is greater than EndValue, then the performance counter counts down. For

+  example, a 64-bit free running counter that counts up would have a StartValue

+  of 0 and an EndValue of 0xFFFFFFFFFFFFFFFF. A 24-bit free running counter

+  that counts down would have a StartValue of 0xFFFFFF and an EndValue of 0.

+

+  @param  StartValue  The value the performance counter starts with when it

+                      rolls over.

+  @param  EndValue    The value that the performance counter ends with before

+                      it rolls over.

+

+  @return The frequency in Hz.

+

+**/

+UINT64

+EFIAPI

+GetPerformanceCounterProperties (

+  OUT      UINT64                    *StartValue,  OPTIONAL

+  OUT      UINT64                    *EndValue     OPTIONAL

+  )

+{

+  PAL_CALL_RETURN                   PalRet;

+  UINT64                            BaseFrequence;

+

+  if (StartValue != NULL) {

+    *StartValue = 0;

+  }

+

+  if (EndValue != NULL) {

+    *EndValue = (UINT64)(-1);

+  }

+

+  PalRet = PalCall (PAL_FREQ_BASE, 0, 0, 0);

+  if (PalRet.Status != 0) {

+    return 1000000;

+  }

+  BaseFrequence = PalRet.r9;

+

+  PalRet = PalCall (PAL_FREQ_RATIOS, 0, 0, 0);

+  if (PalRet.Status != 0) {

+    return 1000000;

+  }

+

+  return BaseFrequence * (PalRet.r11 >> 32) / (UINT32)PalRet.r11;

+}

+

+/**

+  Converts elapsed ticks of performance counter to time in nanoseconds.

+

+  This function converts the elapsed ticks of running performance counter to

+  time value in unit of nanoseconds.

+

+  @param  Ticks     The number of elapsed ticks of running performance counter.

+

+  @return The elapsed time in nanoseconds.

+

+**/

+UINT64

+EFIAPI

+GetTimeInNanoSecond (

+  IN      UINT64                     Ticks

+  )

+{

+  UINT64  Frequency;

+  UINT64  NanoSeconds;

+  UINT64  Remainder;

+  INTN    Shift;

+

+  Frequency = GetPerformanceCounterProperties (NULL, NULL);

+

+  //

+  //          Ticks

+  // Time = --------- x 1,000,000,000

+  //        Frequency

+  //

+  NanoSeconds = MultU64x32 (DivU64x64Remainder (Ticks, Frequency, &Remainder), 1000000000u);

+

+  //

+  // Ensure (Remainder * 1,000,000,000) will not overflow 64-bit.

+  // Since 2^29 < 1,000,000,000 = 0x3B9ACA00 < 2^30, Remainder should < 2^(64-30) = 2^34,

+  // i.e. highest bit set in Remainder should <= 33.

+  //

+  Shift = MAX (0, HighBitSet64 (Remainder) - 33);

+  Remainder = RShiftU64 (Remainder, (UINTN) Shift);

+  Frequency = RShiftU64 (Frequency, (UINTN) Shift);

+  NanoSeconds += DivU64x64Remainder (MultU64x32 (Remainder, 1000000000u), Frequency, NULL);

+

+  return NanoSeconds;

+}