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)