Platform/HiKey960: support fastboot reboot bootloader

Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org>
diff --git a/Platforms/Hisilicon/HiKey960/HiKey960FastbootDxe/HiKey960FastbootDxe.c b/Platforms/Hisilicon/HiKey960/HiKey960FastbootDxe/HiKey960FastbootDxe.c
index f5c12af..99707e4 100644
--- a/Platforms/Hisilicon/HiKey960/HiKey960FastbootDxe/HiKey960FastbootDxe.c
+++ b/Platforms/Hisilicon/HiKey960/HiKey960FastbootDxe/HiKey960FastbootDxe.c
@@ -28,8 +28,10 @@
 

 #include <Library/BaseLib.h>

 #include <Library/BaseMemoryLib.h>

+#include <Library/CacheMaintenanceLib.h>

 #include <Library/DebugLib.h>

 #include <Library/DevicePathLib.h>

+#include <Library/IoLib.h>

 #include <Library/MemoryAllocationLib.h>

 #include <Library/UefiBootServicesTableLib.h>

 #include <Library/UefiRuntimeServicesTableLib.h>

@@ -43,6 +45,9 @@
 #define RANDOM_MAX                       0x7FFFFFFFFFFFFFFF

 #define RANDOM_MAGIC                     0x9A4DBEAF

 

+#define ADB_REBOOT_ADDRESS               0x32100000

+#define ADB_REBOOT_BOOTLOADER            0x77665500

+

 typedef struct _FASTBOOT_PARTITION_LIST {

   LIST_ENTRY  Link;

   CHAR16      PartitionName[PARTITION_NAME_MAX_LENGTH];

@@ -613,6 +618,10 @@
     }

     Status = StoreSNToBlock (mFlashHandle, SERIAL_NUMBER_LBA, UnicodeSN);

     return Status;

+  } else if (AsciiStrCmp (Command, "reboot-bootloader") == 0) {

+    MmioWrite32 (ADB_REBOOT_ADDRESS, ADB_REBOOT_BOOTLOADER);

+    WriteBackInvalidateDataCacheRange ((VOID *)ADB_REBOOT_ADDRESS, 4);

+    return EFI_SUCCESS;

   } else {

     DEBUG ((DEBUG_ERROR,

       "HiKey960: Unrecognised Fastboot OEM command: %a\n",

diff --git a/Platforms/Hisilicon/HiKey960/HiKey960FastbootDxe/HiKey960FastbootDxe.inf b/Platforms/Hisilicon/HiKey960/HiKey960FastbootDxe/HiKey960FastbootDxe.inf
index 558c34f..ba15655 100644
--- a/Platforms/Hisilicon/HiKey960/HiKey960FastbootDxe/HiKey960FastbootDxe.inf
+++ b/Platforms/Hisilicon/HiKey960/HiKey960FastbootDxe/HiKey960FastbootDxe.inf
@@ -27,6 +27,7 @@
 [LibraryClasses]

   BaseLib

   BaseMemoryLib

+  CacheMaintenanceLib

   DebugLib

   DevicePathLib

   MemoryAllocationLib