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/DuetPkg/LegacyMetronome/Metronome.c b/uefi/linaro-edk2/DuetPkg/LegacyMetronome/Metronome.c
new file mode 100644
index 0000000..1fd3ecf
--- /dev/null
+++ b/uefi/linaro-edk2/DuetPkg/LegacyMetronome/Metronome.c
@@ -0,0 +1,125 @@
+/*++

+

+Copyright (c) 2005, 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.             

+

+Module Name:

+  LegacyMetronome.c

+

+Abstract:

+

+  This contains the installation function for the driver.

+

+--*/

+

+#include "Metronome.h"

+

+//

+// Handle for the Metronome Architectural Protocol instance produced by this driver

+//

+EFI_HANDLE                  mMetronomeHandle = NULL;

+

+//

+// The Metronome Architectural Protocol instance produced by this driver

+//

+EFI_METRONOME_ARCH_PROTOCOL mMetronome = {

+  WaitForTick,

+  TICK_PERIOD

+};

+

+//

+// Worker Functions

+//

+EFI_STATUS

+EFIAPI

+WaitForTick (

+  IN EFI_METRONOME_ARCH_PROTOCOL  *This,

+  IN UINT32                       TickNumber

+  )

+/*++

+

+Routine Description:

+

+  Waits for the TickNumber of ticks from a known platform time source.

+

+Arguments:

+

+  This                Pointer to the protocol instance.

+

+Returns: 

+

+  EFI_SUCCESS         If number of ticks occurred.

+  EFI_NOT_FOUND       Could not locate CPU IO protocol

+

+--*/

+// TODO:    TickNumber - add argument and description to function comment

+{

+  //

+  // Wait for TickNumber toggles of the Refresh bit

+  //

+  for (; TickNumber != 0x00; TickNumber--) {

+    while ((IoRead8(REFRESH_PORT) & REFRESH_ON) == REFRESH_ON);

+    while ((IoRead8(REFRESH_PORT) & REFRESH_ON) == REFRESH_OFF);

+  }

+

+  return EFI_SUCCESS;

+}

+

+EFI_STATUS

+EFIAPI

+InstallMetronome (

+  IN EFI_HANDLE        ImageHandle,

+  IN EFI_SYSTEM_TABLE  *SystemTable

+  )

+/*++

+

+Routine Description:

+  

+  Install the LegacyMetronome driver.  Loads a Metronome Arch Protocol based

+  on the Port 61 timer.

+

+Arguments:

+

+  (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)

+

+Returns:

+

+  EFI_SUCCESS - Metronome Architectural Protocol Installed

+

+--*/

+// TODO:    ImageHandle - add argument and description to function comment

+// TODO:    SystemTable - add argument and description to function comment

+{

+  EFI_STATUS  Status;

+

+  //

+  // Make sure the Metronome Architectural Protocol is not already installed in the system

+  //

+  ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiMetronomeArchProtocolGuid);

+

+  //

+  // Program port 61 timer 1 as refresh timer. We could use ACPI timer in the

+  // future.

+  //

+  IoWrite8 (TIMER1_CONTROL_PORT, LOAD_COUNTER1_LSB);

+  IoWrite8 (TIMER1_COUNT_PORT, COUNTER1_COUNT);

+

+  //

+  // Install on a new handle

+  //

+  Status = gBS->InstallMultipleProtocolInterfaces (

+                  &mMetronomeHandle,

+                  &gEfiMetronomeArchProtocolGuid,

+                  &mMetronome,

+                  NULL

+                  );

+  ASSERT_EFI_ERROR (Status);

+

+  return Status;

+}