From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0b-002e3701.pphosted.com (mx0b-002e3701.pphosted.com [148.163.143.35]) by mx.groups.io with SMTP id smtpd.web09.632.1572229937200667201 for ; Sun, 27 Oct 2019 19:32:17 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: hpe.com, ip: 148.163.143.35, mailfrom: prvs=02044412f4=abner.chang@hpe.com) Received: from pps.filterd (m0134424.ppops.net [127.0.0.1]) by mx0b-002e3701.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id x9S2Vj9a007258; Mon, 28 Oct 2019 02:32:16 GMT Received: from g9t5009.houston.hpe.com (g9t5009.houston.hpe.com [15.241.48.73]) by mx0b-002e3701.pphosted.com with ESMTP id 2vvd4qrwj5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 28 Oct 2019 02:32:16 +0000 Received: from g4t3433.houston.hpecorp.net (g4t3433.houston.hpecorp.net [16.208.49.245]) by g9t5009.houston.hpe.com (Postfix) with ESMTP id 7F3D151; Mon, 28 Oct 2019 02:32:15 +0000 (UTC) Received: from UB16Abner.asiapacific.hpqcorp.net (ub16abner.asiapacific.hpqcorp.net [15.119.209.229]) by g4t3433.houston.hpecorp.net (Postfix) with ESMTP id 29C9749; Mon, 28 Oct 2019 02:32:13 +0000 (UTC) From: "Abner Chang" To: devel@edk2.groups.io Cc: abner.chang@hpe.com, Leif Lindholm , Gilbert Chen Subject: [edk2-staging/RISC-V-V2 PATCH v3 33/39] RiscVPlatformPkg/PlatformBootManagerLib: Platform Boot Manager library. Date: Mon, 28 Oct 2019 09:59:11 +0800 Message-Id: <1572227957-13169-34-git-send-email-abner.chang@hpe.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1572227957-13169-1-git-send-email-abner.chang@hpe.com> References: <1572227957-13169-1-git-send-email-abner.chang@hpe.com> MIME-Version: 1.0 X-HPE-SCL: -1 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.95,1.0.8 definitions=2019-10-27_09:2019-10-25,2019-10-27 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 mlxscore=0 priorityscore=1501 phishscore=0 suspectscore=1 impostorscore=0 adultscore=0 malwarescore=0 mlxlogscore=999 bulkscore=0 spamscore=0 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-1908290000 definitions=main-1910280025 X-MIME-Autoconverted: from 8bit to quoted-printable by mx0b-002e3701.pphosted.com id x9S2Vj9a007258 Content-Type: text/plain; charset=y Content-Transfer-Encoding: quoted-printable Common Platform Boot Manager library for RISC-V platform. Signed-off-by: Abner Chang Cc: Leif Lindholm Cc: Gilbert Chen --- .../PlatformBootManagerLib.inf | 61 ++++++ .../PlatformBootManagerLib/PlatformBootManager.h | 117 ++++++++++ .../PlatformBootManagerLib/PlatformBootManager.c | 243 +++++++++++++++= ++++++ .../Library/PlatformBootManagerLib/PlatformData.c | 49 +++++ .../Library/PlatformBootManagerLib/Strings.uni | 28 +++ 5 files changed, 498 insertions(+) create mode 100644 RiscVPlatformPkg/Library/PlatformBootManagerLib/Platf= ormBootManagerLib.inf create mode 100644 RiscVPlatformPkg/Library/PlatformBootManagerLib/Platf= ormBootManager.h create mode 100644 RiscVPlatformPkg/Library/PlatformBootManagerLib/Platf= ormBootManager.c create mode 100644 RiscVPlatformPkg/Library/PlatformBootManagerLib/Platf= ormData.c create mode 100644 RiscVPlatformPkg/Library/PlatformBootManagerLib/Strin= gs.uni diff --git a/RiscVPlatformPkg/Library/PlatformBootManagerLib/PlatformBoot= ManagerLib.inf b/RiscVPlatformPkg/Library/PlatformBootManagerLib/Platform= BootManagerLib.inf new file mode 100644 index 0000000..6086e54 --- /dev/null +++ b/RiscVPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager= Lib.inf @@ -0,0 +1,61 @@ +## @file +# Include all platform action which can be customized by IBV/OEM. +# +# Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All ri= ghts reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x0001001b + BASE_NAME =3D PlatformBootManagerLib + FILE_GUID =3D 7DDA7916-6139-4D46-A415-30E854AF3BC= 7 + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D PlatformBootManagerLib|DXE_DRIVER + +# +# The following information is for reference only and not required by th= e build tools. +# +# VALID_ARCHITECTURES =3D RISCV64 +# + +[Sources] + PlatformData.c + PlatformBootManager.c + PlatformBootManager.h + Strings.uni + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + RiscVPlatformPkg/RiscVPlatformPkg.dec + +[LibraryClasses] + BaseLib + UefiBootServicesTableLib + UefiRuntimeServicesTableLib + UefiLib + UefiBootManagerLib + PcdLib + PlatformMemoryTestLib + PlatformUpdateProgressLib + DxeServicesLib + MemoryAllocationLib + DevicePathLib + HiiLib + PrintLib + +[Guids] + +[Protocols] + gEfiGenericMemTestProtocolGuid ## CONSUMES + gEfiGraphicsOutputProtocolGuid ## CONSUMES + +[Pcd] + gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut + gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow + gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn + gEfiMdeModulePkgTokenSpaceGuid.PcdConInConnectOnDemand + gUefiRiscVPlatformPkgTokenSpaceGuid.PcdBootlogoOnlyEnable diff --git a/RiscVPlatformPkg/Library/PlatformBootManagerLib/PlatformBoot= Manager.h b/RiscVPlatformPkg/Library/PlatformBootManagerLib/PlatformBootM= anager.h new file mode 100644 index 0000000..58c363a --- /dev/null +++ b/RiscVPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager= .h @@ -0,0 +1,117 @@ +/**@file + Head file for BDS Platform specific code + +Copyright (c) 2016, Hewlett Packard Enterprise Development LP. All right= s reserved.
+Copyright (c) 2015, Intel Corporation. All rights reserved.
+ +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PLATFORM_BOOT_MANAGER_H_ +#define PLATFORM_BOOT_MANAGER_H_ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct { + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + UINTN ConnectType; +} PLATFORM_CONSOLE_CONNECT_ENTRY; + +extern PLATFORM_CONSOLE_CONNECT_ENTRY gPlatformConsole[]; + +#define gEndEntire \ + { \ + END_DEVICE_PATH_TYPE,\ + END_ENTIRE_DEVICE_PATH_SUBTYPE,\ + END_DEVICE_PATH_LENGTH,\ + 0\ + } + +#define CONSOLE_OUT BIT0 +#define CONSOLE_IN BIT1 +#define STD_ERROR BIT2 + +//D3987D4B-971A-435F-8CAF-4967EB627241 +#define EFI_SERIAL_DXE_GUID \ + { 0xD3987D4B, 0x971A, 0x435F, { 0x8C, 0xAF, 0x49, 0x67, 0xEB, 0x62, 0x= 72, 0x41 } } + +typedef struct { + VENDOR_DEVICE_PATH Guid; + UART_DEVICE_PATH Uart; + VENDOR_DEVICE_PATH TerminalType; + EFI_DEVICE_PATH_PROTOCOL End; +} SERIAL_CONSOLE_DEVICE_PATH; + +/** + Use SystemTable Conout to turn on video based Simple Text Out consoles= . The + Simple Text Out screens will now be synced up with all non video outpu= t devices + + @retval EFI_SUCCESS UGA devices are back in text mode and synced u= p. + +**/ +EFI_STATUS +PlatformBootManagerDisableQuietBoot ( + VOID + ); + +/** + Perform the memory test base on the memory test intensive level, + and update the memory resource. + + @param Level The memory test intensive level. + + @retval EFI_STATUS Success test all the system memory and update + the memory resource + +**/ +EFI_STATUS +PlatformBootManagerMemoryTest ( + IN EXTENDMEM_COVERAGE_LEVEL Level + ); + +/** + + Show progress bar with title above it. It only works in Graphics mode. + + + @param TitleForeground Foreground color for Title. + @param TitleBackground Background color for Title. + @param Title Title above progress bar. + @param ProgressColor Progress bar color. + @param Progress Progress (0-100) + @param PreviousValue The previous value of the progress. + + @retval EFI_STATUS Success update the progress bar + +**/ +EFI_STATUS +PlatformBootManagerShowProgress ( + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleForeground, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleBackground, + IN CHAR16 *Title, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL ProgressColor, + IN UINTN Progress, + IN UINTN PreviousValue + ); + +#endif // _PLATFORM_BOOT_MANAGER_H diff --git a/RiscVPlatformPkg/Library/PlatformBootManagerLib/PlatformBoot= Manager.c b/RiscVPlatformPkg/Library/PlatformBootManagerLib/PlatformBootM= anager.c new file mode 100644 index 0000000..82cd311 --- /dev/null +++ b/RiscVPlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager= .c @@ -0,0 +1,243 @@ +/** @file + This file include all platform actions + +Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All right= s reserved.
+Copyright (c) 2015, Intel Corporation. All rights reserved.
+ +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "PlatformBootManager.h" + + +EFI_GUID mUefiShellFileGuid =3D { 0x7C04A583, 0x9E3E, 0x4f1c, {0xAD, 0x6= 5, 0xE0, 0x52, 0x68, 0xD0, 0xB4, 0xD1}}; + +/** + Perform the platform diagnostic, such like test memory. OEM/IBV also + can customize this function to support specific platform diagnostic. + + @param MemoryTestLevel The memory test intensive level + @param QuietBoot Indicate if need to enable the quiet boot + +**/ +VOID +PlatformBootManagerDiagnostics ( + IN EXTENDMEM_COVERAGE_LEVEL MemoryTestLevel, + IN BOOLEAN QuietBoot + ) +{ + EFI_STATUS Status; + + // + // Here we can decide if we need to show + // the diagnostics screen + // Notes: this quiet boot code should be remove + // from the graphic lib + // + if (QuietBoot) { + + // + // Perform system diagnostic + // + Status =3D PlatformBootManagerMemoryTest (MemoryTestLevel); + return; + } + + // + // Perform system diagnostic + // + Status =3D PlatformBootManagerMemoryTest (MemoryTestLevel); +} + +/** + Return the index of the load option in the load option array. + + The function consider two load options are equal when the + OptionType, Attributes, Description, FilePath and OptionalData are equ= al. + + @param Key Pointer to the load option to be found. + @param Array Pointer to the array of load options to be found. + @param Count Number of entries in the Array. + + @retval -1 Key wasn't found in the Array. + @retval 0 ~ Count-1 The index of the Key in the Array. +**/ +INTN +PlatformFindLoadOption ( + IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Key, + IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Array, + IN UINTN Count + ) +{ + UINTN Index; + + for (Index =3D 0; Index < Count; Index++) { + if ((Key->OptionType =3D=3D Array[Index].OptionType) && + (Key->Attributes =3D=3D Array[Index].Attributes) && + (StrCmp (Key->Description, Array[Index].Description) =3D=3D 0) &= & + (CompareMem (Key->FilePath, Array[Index].FilePath, GetDevicePath= Size (Key->FilePath)) =3D=3D 0) && + (Key->OptionalDataSize =3D=3D Array[Index].OptionalDataSize) && + (CompareMem (Key->OptionalData, Array[Index].OptionalData, Key->= OptionalDataSize) =3D=3D 0)) { + return (INTN) Index; + } + } + + return -1; +} + +VOID +PlatformRegisterFvBootOption ( + EFI_GUID *FileGuid, + CHAR16 *Description, + UINT32 Attributes + ) +{ + EFI_STATUS Status; + UINTN OptionIndex; + EFI_BOOT_MANAGER_LOAD_OPTION NewOption; + EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions; + UINTN BootOptionCount; + MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode; + EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + + Status =3D gBS->HandleProtocol (gImageHandle, &gEfiLoadedImageProtocol= Guid, (VOID **) &LoadedImage); + ASSERT_EFI_ERROR (Status); + + EfiInitializeFwVolDevicepathNode (&FileNode, FileGuid); + DevicePath =3D AppendDevicePathNode ( + DevicePathFromHandle (LoadedImage->DeviceHandle), + (EFI_DEVICE_PATH_PROTOCOL *) &FileNode + ); + + Status =3D EfiBootManagerInitializeLoadOption ( + &NewOption, + LoadOptionNumberUnassigned, + LoadOptionTypeBoot, + Attributes, + Description, + DevicePath, + NULL, + 0 + ); + if (!EFI_ERROR (Status)) { + BootOptions =3D EfiBootManagerGetLoadOptions (&BootOptionCount, Load= OptionTypeBoot); + + OptionIndex =3D PlatformFindLoadOption (&NewOption, BootOptions, Boo= tOptionCount); + + if (OptionIndex =3D=3D -1) { + Status =3D EfiBootManagerAddLoadOptionVariable (&NewOption, (UINTN= ) -1); + ASSERT_EFI_ERROR (Status); + } + EfiBootManagerFreeLoadOption (&NewOption); + EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount); + } +} + +/** + Do the platform specific action before the console is connected. + + Such as: + Update console variable; + Register new Driver#### or Boot####; + Signal ReadyToLock event. +**/ +VOID +EFIAPI +PlatformBootManagerBeforeConsole ( + VOID + ) +{ + UINTN Index; + EFI_STATUS Status; + EFI_INPUT_KEY Enter; + EFI_INPUT_KEY F2; + EFI_BOOT_MANAGER_LOAD_OPTION BootOption; + + // + // Update the console variables. + // + for (Index =3D 0; gPlatformConsole[Index].DevicePath !=3D NULL; Index+= +) { + DEBUG ((DEBUG_INFO, "Check gPlatformConsole %d\n", Index)); + if ((gPlatformConsole[Index].ConnectType & CONSOLE_IN) =3D=3D CONSOL= E_IN) { + Status =3D EfiBootManagerUpdateConsoleVariable (ConIn, gPlatformCo= nsole[Index].DevicePath, NULL); + DEBUG ((DEBUG_INFO, "CONSOLE_IN variable set %s : %r\n", ConvertDe= vicePathToText (gPlatformConsole[Index].DevicePath, FALSE, FALSE), Status= )); + } + + if ((gPlatformConsole[Index].ConnectType & CONSOLE_OUT) =3D=3D CONSO= LE_OUT) { + Status =3D EfiBootManagerUpdateConsoleVariable (ConOut, gPlatformC= onsole[Index].DevicePath, NULL); + DEBUG ((DEBUG_INFO, "CONSOLE_OUT variable set %s : %r\n", ConvertD= evicePathToText (gPlatformConsole[Index].DevicePath, FALSE, FALSE), Statu= s)); + } + + if ((gPlatformConsole[Index].ConnectType & STD_ERROR) =3D=3D STD_ERR= OR) { + Status =3D EfiBootManagerUpdateConsoleVariable (ErrOut, gPlatformC= onsole[Index].DevicePath, NULL); + DEBUG ((DEBUG_INFO, "STD_ERROR variable set %r", Status)); + } + } + + // + // Register ENTER as CONTINUE key + // + Enter.ScanCode =3D SCAN_NULL; + Enter.UnicodeChar =3D CHAR_CARRIAGE_RETURN; + EfiBootManagerRegisterContinueKeyOption (0, &Enter, NULL); + // + // Map F2 to Boot Manager Menu + // + F2.ScanCode =3D SCAN_F2; + F2.UnicodeChar =3D CHAR_NULL; + EfiBootManagerGetBootManagerMenu (&BootOption); + EfiBootManagerAddKeyOptionVariable (NULL, (UINT16) BootOption.OptionNu= mber, 0, &F2, NULL); + // + // Register UEFI Shell + // + PlatformRegisterFvBootOption (&mUefiShellFileGuid, L"UEFI Shell", LOAD= _OPTION_ACTIVE); +} + +/** + Do the platform specific action after the console is connected. + + Such as: + Dynamically switch output mode; + Signal console ready platform customized event; + Run diagnostics like memory testing; + Connect certain devices; + Dispatch aditional option roms. +**/ +VOID +EFIAPI +PlatformBootManagerAfterConsole ( + VOID + ) +{ + EFI_GRAPHICS_OUTPUT_BLT_PIXEL Black; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL White; + + Black.Blue =3D Black.Green =3D Black.Red =3D Black.Reserved =3D 0; + White.Blue =3D White.Green =3D White.Red =3D White.Reserved =3D 0xFF; + + EfiBootManagerConnectAll (); + EfiBootManagerRefreshAllBootOption (); + + PlatformBootManagerDiagnostics (QUICK, TRUE); + + PrintXY (10, 10, &White, &Black, L"F2 to enter Boot Manager Menu. = "); + PrintXY (10, 30, &White, &Black, L"Enter to boot directly."); +} + +/** + The function is called when no boot option could be launched, + including platform recovery options and options pointing to applicatio= ns + built into firmware volumes. + + If this function returns, BDS attempts to enter an infinite loop. +**/ +VOID +EFIAPI +PlatformBootManagerUnableToBoot ( + VOID + ) +{ + return; +} diff --git a/RiscVPlatformPkg/Library/PlatformBootManagerLib/PlatformData= .c b/RiscVPlatformPkg/Library/PlatformBootManagerLib/PlatformData.c new file mode 100644 index 0000000..3208051 --- /dev/null +++ b/RiscVPlatformPkg/Library/PlatformBootManagerLib/PlatformData.c @@ -0,0 +1,49 @@ +/**@file + Defined the platform specific device path which will be filled to + ConIn/ConOut variables. + +Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All right= s reserved.
+Copyright (c) 2015, Intel Corporation. All rights reserved.
+ +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "PlatformBootManager.h" + +// +// Platform specific serial device path +// +SERIAL_CONSOLE_DEVICE_PATH gSerialConsoleDevicePath0 =3D { + { + { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH),= 0} }, + EFI_SERIAL_DXE_GUID // Use the driver's GUID + }, + { + { MESSAGING_DEVICE_PATH, MSG_UART_DP, { sizeof (UART_DEVICE_PATH), 0= } }, + 0, // Reserved + 115200, // BaudRate + 8, // DataBits + 1, // Parity + 1 // StopBits + }, + { + { MESSAGING_DEVICE_PATH, MSG_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH= ), 0} }, + DEVICE_PATH_MESSAGING_PC_ANSI + }, + { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_= DEVICE_PATH_PROTOCOL), 0 } } +}; + +// +// Predefined platform default console device path +// +PLATFORM_CONSOLE_CONNECT_ENTRY gPlatformConsole[] =3D { + { + (EFI_DEVICE_PATH_PROTOCOL *) &gSerialConsoleDevicePath0, + CONSOLE_OUT | CONSOLE_IN + }, + { + NULL, + 0 + } +}; diff --git a/RiscVPlatformPkg/Library/PlatformBootManagerLib/Strings.uni = b/RiscVPlatformPkg/Library/PlatformBootManagerLib/Strings.uni new file mode 100644 index 0000000..357cced --- /dev/null +++ b/RiscVPlatformPkg/Library/PlatformBootManagerLib/Strings.uni @@ -0,0 +1,28 @@ +///** @file +// +// String definitions for PlatformBootManagerLib. +// +// Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All r= ights reserved.
+// Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved. +// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +//**/ + +/=3D# + +#langdef en-US "English" +#langdef fr-FR "Fran=C3=A7ais" + +#string STR_PERFORM_MEM_TEST #language en-US "Perform memory = test (ESC to skip)" + #language fr-FR "Ex=C3=A9cute l'= examen de m=C3=A9moire (ESC pour sauter)" +#string STR_MEMORY_TEST_PERCENT #language en-US "% of the system= memory tested OK" + #language fr-FR "% de la m=C3=A9= moire de syst=C3=A8me essay=C3=A9e D'ACCORD" +#string STR_ESC_TO_SKIP_MEM_TEST #language en-US "Press ESC key t= o skip memory test" + #language fr-FR "Appuie sur ESC = sauter examen de m=C3=A9moire" +#string STR_MEM_TEST_COMPLETED #language en-US " bytes of syste= m memory tested OK\r\n" + #language fr-FR " octets dela m=C3= =A9moire de syst=C3=A8me essay=C3=A9e D'ACCORD\r\n" +#string STR_SYSTEM_MEM_ERROR #language en-US "System encounte= rs memory errors" + #language fr-FR "le Syst=C3=A8me= rencontre les erreurs de m=C3=A9moire" +#string STR_START_BOOT_OPTION #language en-US "Start boot opti= on" + #language fr-FR "l'option de bot= te de D=C3=A9but" --=20 2.7.4