Merge pull request #17 from rsalveti/hikey-aosp

HiKey: make linux sd boot entry look for BOOTAA64.EFI
diff --git a/Include/Protocol/DwUsb.h b/Include/Protocol/DwUsb.h
index 195ff55..868d956 100644
--- a/Include/Protocol/DwUsb.h
+++ b/Include/Protocol/DwUsb.h
@@ -28,6 +28,7 @@
 
 #define USB_HOST_MODE    0
 #define USB_DEVICE_MODE  1
+#define USB_CABLE_NOT_ATTACHED  2
 
 typedef
 EFI_STATUS
diff --git a/Platforms/Hisilicon/HiKey/HiKeyDxe/HiKeyDxeInternal.h b/Platforms/Hisilicon/HiKey/HiKeyDxe/HiKeyDxeInternal.h
index 564fc9f..1922a9c 100644
--- a/Platforms/Hisilicon/HiKey/HiKeyDxe/HiKeyDxeInternal.h
+++ b/Platforms/Hisilicon/HiKey/HiKeyDxe/HiKeyDxeInternal.h
@@ -45,4 +45,8 @@
   IN UINT8           Mode
   );
 
+UINTN
+HiKeyGetUsbMode (
+  IN VOID
+  );
 #endif // __HIKEY_DXE_INTERNAL_H__
diff --git a/Platforms/Hisilicon/HiKey/HiKeyDxe/InitPeripherals.c b/Platforms/Hisilicon/HiKey/HiKeyDxe/InitPeripherals.c
index 68f2ae7..d825c0b 100644
--- a/Platforms/Hisilicon/HiKey/HiKeyDxe/InitPeripherals.c
+++ b/Platforms/Hisilicon/HiKey/HiKeyDxe/InitPeripherals.c
@@ -34,28 +34,67 @@
 // Jumper on pin5-6 of J15 determines whether boot to fastboot
 #define DETECT_J15_FASTBOOT      24    // GPIO 3_0
 
-EFI_STATUS
-HiKeyUsbPhyInit (
-  IN UINT8        Mode
+STATIC EMBEDDED_GPIO *mGpio;
+
+STATIC
+VOID
+HiKeyDetectUsbModeInit (
+  IN VOID
   )
 {
-  EMBEDDED_GPIO *Gpio;
-  EFI_STATUS    Status;
-  UINTN         Value;
-  UINT32        Data;
-  UINTN         GpioId, GpioVbus;
+  EFI_STATUS     Status;
 
   /* set pullup on both GPIO2_5 & GPIO2_6. It's required for inupt. */
   MmioWrite32 (0xf8001864, 1);
   MmioWrite32 (0xf8001868, 1);
 
-  Status = gBS->LocateProtocol (&gEmbeddedGpioProtocolGuid, NULL, (VOID **)&Gpio);
+  Status = gBS->LocateProtocol (&gEmbeddedGpioProtocolGuid, NULL, (VOID **)&mGpio);
   ASSERT_EFI_ERROR (Status);
-  Status = Gpio->Set (Gpio, USB_SEL_GPIO0_3, GPIO_MODE_OUTPUT_0);
+  Status = mGpio->Set (mGpio, USB_SEL_GPIO0_3, GPIO_MODE_OUTPUT_0);
   ASSERT_EFI_ERROR (Status);
-  Status = Gpio->Set (Gpio, USB_5V_HUB_EN, GPIO_MODE_OUTPUT_0);
+  Status = mGpio->Set (mGpio, USB_5V_HUB_EN, GPIO_MODE_OUTPUT_0);
   ASSERT_EFI_ERROR (Status);
   MicroSecondDelay (1000);
+
+  Status = mGpio->Set (mGpio, USB_ID_DET_GPIO2_5, GPIO_MODE_INPUT);
+  ASSERT_EFI_ERROR (Status);
+  Status = mGpio->Set (mGpio, USB_VBUS_DET_GPIO2_6, GPIO_MODE_INPUT);
+  ASSERT_EFI_ERROR (Status);
+}
+
+UINTN
+HiKeyGetUsbMode (
+  IN VOID
+  )
+{
+  EFI_STATUS     Status;
+  UINTN          GpioId, GpioVbus;
+  UINTN          Value;
+
+  Status = mGpio->Get (mGpio, USB_ID_DET_GPIO2_5, &Value);
+  ASSERT_EFI_ERROR (Status);
+  GpioId = Value;
+  Status = mGpio->Get (mGpio, USB_VBUS_DET_GPIO2_6, &Value);
+  ASSERT_EFI_ERROR (Status);
+  GpioVbus = Value;
+
+  if ((GpioId == 1) && (GpioVbus == 0))
+    return USB_DEVICE_MODE;
+  else if ((GpioId == 0) && (GpioVbus == 1))
+    return USB_CABLE_NOT_ATTACHED;
+  return USB_HOST_MODE;
+}
+
+EFI_STATUS
+HiKeyUsbPhyInit (
+  IN UINT8        Mode
+  )
+{
+  UINTN         Value;
+  UINT32        Data;
+
+  HiKeyDetectUsbModeInit ();
+
   //setup clock
   MmioWrite32 (PERI_CTRL_BASE + SC_PERIPH_CLKEN0, BIT4);
   do {
@@ -78,21 +117,10 @@
   MmioWrite32 (PERI_CTRL_BASE + SC_PERIPH_CTRL4, Value);
   MicroSecondDelay (1000);
 
-  Status = Gpio->Set (Gpio, USB_ID_DET_GPIO2_5, GPIO_MODE_INPUT);
-  ASSERT_EFI_ERROR (Status);
-  Status = Gpio->Get (Gpio, USB_ID_DET_GPIO2_5, &Value);
-  ASSERT_EFI_ERROR (Status);
-  GpioId = Value;
-  Status = Gpio->Set (Gpio, USB_VBUS_DET_GPIO2_6, GPIO_MODE_INPUT);
-  ASSERT_EFI_ERROR (Status);
-  Status = Gpio->Get (Gpio, USB_VBUS_DET_GPIO2_6, &Value);
-  ASSERT_EFI_ERROR (Status);
-  GpioVbus = Value;
-
   //If Mode = 1, USB in Device Mode
   //If Mode = 0, USB in Host Mode
   if (Mode == USB_DEVICE_MODE) {
-    if ((GpioId == 1) && (GpioVbus == 0)) {
+    if (HiKeyGetUsbMode () == USB_DEVICE_MODE) {
       DEBUG ((EFI_D_ERROR, "usb work as device mode.\n"));
     } else {
       return EFI_INVALID_PARAMETER;
@@ -103,10 +131,10 @@
      MmioWrite32 (PERI_CTRL_BASE + SC_PERIPH_CTRL5, Value);
      MicroSecondDelay (20000);
   } else {
-    if ((GpioId == 1) && (GpioVbus == 0)) {
-      return EFI_INVALID_PARAMETER;
-    } else {
+    if (HiKeyGetUsbMode () == USB_HOST_MODE) {
       DEBUG ((EFI_D_ERROR, "usb work as host mode.\n"));
+    } else {
+      return EFI_INVALID_PARAMETER;
     }
 
     /*CTRL5*/
diff --git a/Platforms/Hisilicon/HiKey/HiKeyDxe/InstallBootMenu.c b/Platforms/Hisilicon/HiKey/HiKeyDxe/InstallBootMenu.c
index 25eb3dc..67d65dc 100644
--- a/Platforms/Hisilicon/HiKey/HiKeyDxe/InstallBootMenu.c
+++ b/Platforms/Hisilicon/HiKey/HiKeyDxe/InstallBootMenu.c
@@ -27,6 +27,7 @@
 #include <Protocol/BlockIo.h>
 #include <Protocol/DevicePathFromText.h>
 #include <Protocol/DevicePathToText.h>
+#include <Protocol/DwUsb.h>
 #include <Protocol/EmbeddedGpio.h>
 #include <Protocol/SimpleFileSystem.h>
 
@@ -776,16 +777,19 @@
     return;
   }
 
-  if (DtbType == HIKEY_DTB_SD)
+  if (DtbType == HIKEY_DTB_SD) {
     mBootIndex = HIKEY_BOOT_ENTRY_BOOT_SD;
-  else
+  } else {
     mBootIndex = HIKEY_BOOT_ENTRY_BOOT_EMMC;
+  }
 
-  if (HiKeyIsJumperConnected () == TRUE)
-    mBootIndex = HIKEY_BOOT_ENTRY_FASTBOOT;
-  /* Set mBootIndex as HIKEY_BOOT_ENTRY_FASTBOOT if adb reboot-bootloader is specified */
-  if (HiKeyDetectRebootReason () == TRUE)
-    mBootIndex = HIKEY_BOOT_ENTRY_FASTBOOT;
+  if (HiKeyGetUsbMode () == USB_DEVICE_MODE) {
+    if (HiKeyIsJumperConnected () == TRUE)
+      mBootIndex = HIKEY_BOOT_ENTRY_FASTBOOT;
+    /* Set mBootIndex as HIKEY_BOOT_ENTRY_FASTBOOT if adb reboot-bootloader is specified */
+    if (HiKeyDetectRebootReason () == TRUE)
+      mBootIndex = HIKEY_BOOT_ENTRY_FASTBOOT;
+  }
 
   Status = HiKeyCreateBootNext ();
   if (EFI_ERROR (Status)) {
diff --git a/Platforms/Hisilicon/HiKey/Library/HiKeyLib/HiKeyMem.c b/Platforms/Hisilicon/HiKey/Library/HiKeyLib/HiKeyMem.c
index a5ce05b..2d118e0 100644
--- a/Platforms/Hisilicon/HiKey/Library/HiKeyLib/HiKeyMem.c
+++ b/Platforms/Hisilicon/HiKey/Library/HiKeyLib/HiKeyMem.c
@@ -89,6 +89,24 @@
 
   MemorySize = HiKeyInitMemorySize ();
 
+  ResourceAttributes = (
+      EFI_RESOURCE_ATTRIBUTE_PRESENT |
+      EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
+      EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
+      EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
+      EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
+      EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE |
+      EFI_RESOURCE_ATTRIBUTE_TESTED
+  );
+
+  // Create initial Base Hob for system memory.
+  BuildResourceDescriptorHob (
+      EFI_RESOURCE_SYSTEM_MEMORY,
+      ResourceAttributes,
+      PcdGet64 (PcdSystemMemoryBase),
+      PcdGet64 (PcdSystemMemorySize)
+  );
+
   NextHob.Raw = GetHobList ();
   Count = sizeof (HiKeyReservedMemoryBuffer) / sizeof (struct HiKeyReservedMemory);
   while ((NextHob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, NextHob.Raw)) != NULL)