Platforms/HiKey960Dxe: fill serialno in command line
Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org>
diff --git a/Platforms/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.c b/Platforms/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.c
index bf917be..63847ec 100644
--- a/Platforms/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.c
+++ b/Platforms/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.c
@@ -13,6 +13,7 @@
**/
#include <Guid/EventGroup.h>
+#include <Guid/HiKey960Variable.h>
#include <Hi3660.h>
#include <Hkadc.h>
@@ -21,6 +22,7 @@
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
+#include <Library/DevicePathLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/NonDiscoverableDeviceRegistrationLib.h>
#include <Library/IoLib.h>
@@ -31,6 +33,8 @@
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Protocol/Abootimg.h>
+#include <Protocol/BlockIo.h>
+#include <Protocol/DevicePathToText.h>
#include <Protocol/NonDiscoverableDevice.h>
#define ADC_ADCIN0 0
@@ -71,6 +75,18 @@
#define HIKEY960_COMPATIBLE_HUB_V1 "hisilicon,gpio_hubv1"
#define HIKEY960_COMPATIBLE_HUB_V2 "hisilicon,gpio_hubv2"
+#define SERIAL_NUMBER_SIZE 17
+#define SERIAL_NUMBER_BLOCK_SIZE EFI_PAGE_SIZE
+#define SERIAL_NUMBER_LBA 20
+#define RANDOM_MAX 0x7FFFFFFFFFFFFFFF
+#define RANDOM_MAGIC 0x9A4DBEAF
+
+typedef struct {
+ UINT64 Magic;
+ UINT64 Data;
+ CHAR16 UnicodeSN[SERIAL_NUMBER_SIZE];
+} RANDOM_SERIAL_NUMBER;
+
STATIC UINTN mBoardId;
STATIC
@@ -259,15 +275,76 @@
IN UINTN Size
)
{
+ EFI_STATUS Status;
+ EFI_BLOCK_IO_PROTOCOL *BlockIoProtocol;
+ VOID *DataPtr;
+ RANDOM_SERIAL_NUMBER *RandomSN;
+ EFI_DEVICE_PATH_PROTOCOL *FlashDevicePath;
+ EFI_HANDLE FlashHandle;
+
if (Args == NULL) {
return EFI_INVALID_PARAMETER;
}
- if (mBoardId == HIKEY960_BOARDID_V1) {
- StrCatS (Args, Size, L" earlycon=pl011,0xfdf05000,115200 console=ttyAMA5");
- } else {
- StrCatS (Args, Size, L" earlycon=pl011,0xfff32000,115200 console=ttyAMA6");
+ FlashDevicePath = ConvertTextToDevicePath ((CHAR16*)FixedPcdGetPtr (PcdAndroidFastbootNvmDevicePath));
+ Status = gBS->LocateDevicePath (&gEfiBlockIoProtocolGuid, &FlashDevicePath, &FlashHandle);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "Warning: Couldn't locate Android NVM device (status: %r)\n", Status));
+ // Failing to locate partitions should not prevent to do other Android FastBoot actions
+ return EFI_SUCCESS;
}
+ Status = gBS->OpenProtocol (
+ FlashHandle,
+ &gEfiBlockIoProtocolGuid,
+ (VOID **) &BlockIoProtocol,
+ gImageHandle,
+ NULL,
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_WARN, "Warning: Couldn't open block device (status: %r)\n", Status));
+ return EFI_DEVICE_ERROR;
+ }
+
+ DataPtr = AllocatePages (1);
+ if (DataPtr == NULL) {
+ return EFI_BUFFER_TOO_SMALL;
+ }
+ Status = BlockIoProtocol->ReadBlocks (
+ BlockIoProtocol,
+ BlockIoProtocol->Media->MediaId,
+ SERIAL_NUMBER_LBA,
+ SERIAL_NUMBER_BLOCK_SIZE,
+ DataPtr
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_WARN, "Warning: Failed on reading blocks\n"));
+ goto Exit;
+ }
+ RandomSN = (RANDOM_SERIAL_NUMBER *)DataPtr;
+ if (RandomSN->Magic != RANDOM_MAGIC) {
+ UnicodeSPrint(
+ RandomSN->UnicodeSN, SERIAL_NUMBER_SIZE * sizeof (CHAR16),
+ L"0123456789abcdef"
+ );
+ }
+ if (mBoardId == HIKEY960_BOARDID_V1) {
+ UnicodeSPrint (
+ Args + StrLen (Args), Size - StrLen (Args),
+ L" earlycon=pl011,0xfdf05000,115200 console=ttyAMA5 androidboot.serialno=%s",
+ RandomSN->UnicodeSN
+ );
+ } else {
+ UnicodeSPrint (
+ Args + StrLen (Args), Size - StrLen (Args),
+ L" earlycon=pl011,0xfff32000,115200 console=ttyAMA6 androidboot.serialno=%s",
+ RandomSN->UnicodeSN
+ );
+ }
+ FreePages (DataPtr, 1);
return EFI_SUCCESS;
+Exit:
+ FreePages (DataPtr, 1);
+ return Status;
}
EFI_STATUS
diff --git a/Platforms/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf b/Platforms/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf
index 87fd435..bf80833 100644
--- a/Platforms/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf
+++ b/Platforms/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf
@@ -26,6 +26,7 @@
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
OpenPlatformPkg/Drivers/Block/DwUfsHcDxe/DwUfsHcDxe.dec
+ OpenPlatformPkg/Platforms/Hisilicon/HiKey960/HiKey960.dec
[LibraryClasses]
BaseMemoryLib
@@ -44,6 +45,8 @@
[Protocols]
gAbootimgProtocolGuid
+ gEfiBlockIoProtocolGuid
+ gEfiDevicePathToTextProtocolGuid
[Guids]
gEfiEndOfDxeEventGroupGuid
@@ -51,6 +54,7 @@
[Pcd]
gDwUfsHcDxeTokenSpaceGuid.PcdDwUfsHcDxeBaseAddress
+ gHiKey960TokenSpaceGuid.PcdAndroidFastbootNvmDevicePath
[Depex]
TRUE