(This is migrated from edk2-platforms:Platform/RISC-V)
Common Platform Boot Manager library for RISC-V platform.

Signed-off-by: Abner Chang <abner.ch...@hpe.com>
Co-authored-by: Gilbert Chen <gilbert.c...@hpe.com>
Reviewed-by: Leif Lindholm <leif.lindh...@linaro.org>

Cc: Leif Lindholm <leif.lindh...@linaro.org>
Cc: Gilbert Chen <gilbert.c...@hpe.com>
---
 .../PlatformBootManagerLib.inf                |  61 +++++
 .../PlatformBootManager.h                     | 117 +++++++++
 .../PlatformBootManager.c                     | 243 ++++++++++++++++++
 .../PlatformBootManagerLib/PlatformData.c     |  49 ++++
 .../PlatformBootManagerLib/Strings.uni        |  28 ++
 5 files changed, 498 insertions(+)
 create mode 100644 
Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
 create mode 100644 
Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager.h
 create mode 100644 
Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager.c
 create mode 100644 
Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/PlatformData.c
 create mode 100644 
Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/Strings.uni

diff --git 
a/Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
 
b/Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
new file mode 100644
index 0000000000..afba07573f
--- /dev/null
+++ 
b/Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
@@ -0,0 +1,61 @@
+## @file

+#  Include all platform action which can be customized by IBV/OEM.

+#

+#  Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights 
reserved.<BR>

+#

+#  SPDX-License-Identifier: BSD-2-Clause-Patent

+#

+##

+

+[Defines]

+  INF_VERSION                    = 0x0001001b

+  BASE_NAME                      = PlatformBootManagerLib

+  FILE_GUID                      = 7DDA7916-6139-4D46-A415-30E854AF3BC7

+  MODULE_TYPE                    = DXE_DRIVER

+  VERSION_STRING                 = 1.0

+  LIBRARY_CLASS                  = PlatformBootManagerLib|DXE_DRIVER

+

+#

+# The following information is for reference only and not required by the 
build tools.

+#

+#  VALID_ARCHITECTURES           = RISCV64

+#

+

+[Sources]

+  PlatformData.c

+  PlatformBootManager.c

+  PlatformBootManager.h

+  Strings.uni

+

+[Packages]

+  MdePkg/MdePkg.dec

+  MdeModulePkg/MdeModulePkg.dec

+  Platform/RISC-V/PlatformPkg/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/Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager.h
 
b/Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager.h
new file mode 100644
index 0000000000..58c363a48b
--- /dev/null
+++ 
b/Platform/RISC-V/PlatformPkg/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 rights 
reserved.<BR>

+Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>

+

+SPDX-License-Identifier: BSD-2-Clause-Patent

+

+**/

+

+#ifndef PLATFORM_BOOT_MANAGER_H_

+#define PLATFORM_BOOT_MANAGER_H_

+

+#include <PiDxe.h>

+#include <IndustryStandard/Bmp.h>

+#include <Protocol/GenericMemoryTest.h>

+#include <Protocol/LoadedImage.h>

+#include <Protocol/GraphicsOutput.h>

+#include <Protocol/BootLogo.h>

+#include <Protocol/DevicePath.h>

+

+#include <Library/DebugLib.h>

+#include <Library/BaseMemoryLib.h>

+#include <Library/UefiBootServicesTableLib.h>

+#include <Library/UefiRuntimeServicesTableLib.h>

+#include <Library/MemoryAllocationLib.h>

+#include <Library/BaseLib.h>

+#include <Library/UefiLib.h>

+#include <Library/UefiBootManagerLib.h>

+#include <Library/PcdLib.h>

+#include <Library/DevicePathLib.h>

+#include <Library/HiiLib.h>

+#include <Library/PrintLib.h>

+

+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, 0x72, 
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 output 
devices

+

+  @retval EFI_SUCCESS     UGA devices are back in text mode and synced up.

+

+**/

+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/Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager.c
 
b/Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager.c
new file mode 100644
index 0000000000..82cd311df5
--- /dev/null
+++ 
b/Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/PlatformBootManager.c
@@ -0,0 +1,243 @@
+/** @file

+  This file include all platform actions

+

+Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights 
reserved.<BR>

+Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>

+

+SPDX-License-Identifier: BSD-2-Clause-Patent

+

+**/

+

+#include "PlatformBootManager.h"

+

+

+EFI_GUID mUefiShellFileGuid = { 0x7C04A583, 0x9E3E, 0x4f1c, {0xAD, 0x65, 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 = PlatformBootManagerMemoryTest (MemoryTestLevel);

+    return;

+  }

+

+  //

+  // Perform system diagnostic

+  //

+  Status = 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 equal.

+

+  @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 = 0; Index < Count; Index++) {

+    if ((Key->OptionType == Array[Index].OptionType) &&

+        (Key->Attributes == Array[Index].Attributes) &&

+        (StrCmp (Key->Description, Array[Index].Description) == 0) &&

+        (CompareMem (Key->FilePath, Array[Index].FilePath, GetDevicePathSize 
(Key->FilePath)) == 0) &&

+        (Key->OptionalDataSize == Array[Index].OptionalDataSize) &&

+        (CompareMem (Key->OptionalData, Array[Index].OptionalData, 
Key->OptionalDataSize) == 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 = gBS->HandleProtocol (gImageHandle, &gEfiLoadedImageProtocolGuid, 
(VOID **) &LoadedImage);

+  ASSERT_EFI_ERROR (Status);

+

+  EfiInitializeFwVolDevicepathNode (&FileNode, FileGuid);

+  DevicePath = AppendDevicePathNode (

+                 DevicePathFromHandle (LoadedImage->DeviceHandle),

+                 (EFI_DEVICE_PATH_PROTOCOL *) &FileNode

+                 );

+

+  Status = EfiBootManagerInitializeLoadOption (

+             &NewOption,

+             LoadOptionNumberUnassigned,

+             LoadOptionTypeBoot,

+             Attributes,

+             Description,

+             DevicePath,

+             NULL,

+             0

+             );

+  if (!EFI_ERROR (Status)) {

+    BootOptions = EfiBootManagerGetLoadOptions (&BootOptionCount, 
LoadOptionTypeBoot);

+

+    OptionIndex = PlatformFindLoadOption (&NewOption, BootOptions, 
BootOptionCount);

+

+    if (OptionIndex == -1) {

+      Status = 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 = 0; gPlatformConsole[Index].DevicePath != NULL; Index++) {

+    DEBUG ((DEBUG_INFO, "Check gPlatformConsole %d\n", Index));

+    if ((gPlatformConsole[Index].ConnectType & CONSOLE_IN) == CONSOLE_IN) {

+      Status = EfiBootManagerUpdateConsoleVariable (ConIn, 
gPlatformConsole[Index].DevicePath, NULL);

+      DEBUG ((DEBUG_INFO, "CONSOLE_IN variable set %s : %r\n", 
ConvertDevicePathToText (gPlatformConsole[Index].DevicePath, FALSE, FALSE), 
Status));

+    }

+

+    if ((gPlatformConsole[Index].ConnectType & CONSOLE_OUT) == CONSOLE_OUT) {

+      Status = EfiBootManagerUpdateConsoleVariable (ConOut, 
gPlatformConsole[Index].DevicePath, NULL);

+      DEBUG ((DEBUG_INFO, "CONSOLE_OUT variable set %s : %r\n", 
ConvertDevicePathToText (gPlatformConsole[Index].DevicePath, FALSE, FALSE), 
Status));

+    }

+

+    if ((gPlatformConsole[Index].ConnectType & STD_ERROR) == STD_ERROR) {

+      Status = EfiBootManagerUpdateConsoleVariable (ErrOut, 
gPlatformConsole[Index].DevicePath, NULL);

+      DEBUG ((DEBUG_INFO, "STD_ERROR variable set %r", Status));

+    }

+  }

+

+  //

+  // Register ENTER as CONTINUE key

+  //

+  Enter.ScanCode    = SCAN_NULL;

+  Enter.UnicodeChar = CHAR_CARRIAGE_RETURN;

+  EfiBootManagerRegisterContinueKeyOption (0, &Enter, NULL);

+  //

+  // Map F2 to Boot Manager Menu

+  //

+  F2.ScanCode    = SCAN_F2;

+  F2.UnicodeChar = CHAR_NULL;

+  EfiBootManagerGetBootManagerMenu (&BootOption);

+  EfiBootManagerAddKeyOptionVariable (NULL, (UINT16) BootOption.OptionNumber, 
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 = Black.Green = Black.Red = Black.Reserved = 0;

+  White.Blue = White.Green = White.Red = White.Reserved = 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 applications

+  built into firmware volumes.

+

+  If this function returns, BDS attempts to enter an infinite loop.

+**/

+VOID

+EFIAPI

+PlatformBootManagerUnableToBoot (

+  VOID

+  )

+{

+  return;

+}

diff --git 
a/Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/PlatformData.c 
b/Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/PlatformData.c
new file mode 100644
index 0000000000..3208051e16
--- /dev/null
+++ b/Platform/RISC-V/PlatformPkg/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 rights 
reserved.<BR>

+Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>

+

+SPDX-License-Identifier: BSD-2-Clause-Patent

+

+**/

+

+#include "PlatformBootManager.h"

+

+//

+// Platform specific serial device path

+//

+SERIAL_CONSOLE_DEVICE_PATH gSerialConsoleDevicePath0 = {

+  {

+    { 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[] = {

+  {

+    (EFI_DEVICE_PATH_PROTOCOL *) &gSerialConsoleDevicePath0,

+    CONSOLE_OUT | CONSOLE_IN

+  },

+  {

+    NULL,

+    0

+  }

+};

diff --git 
a/Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/Strings.uni 
b/Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/Strings.uni
new file mode 100644
index 0000000000..357cced6d7
--- /dev/null
+++ b/Platform/RISC-V/PlatformPkg/Library/PlatformBootManagerLib/Strings.uni
@@ -0,0 +1,28 @@
+///** @file

+//

+//    String definitions for PlatformBootManagerLib.

+//

+//  Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights 
reserved.<BR>

+//  Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>

+//

+//  SPDX-License-Identifier: BSD-2-Clause-Patent

+//

+//**/

+

+/=#

+

+#langdef   en-US "English"

+#langdef   fr-FR "Français"

+

+#string STR_PERFORM_MEM_TEST           #language en-US  "Perform memory test 
(ESC to skip)"

+                                       #language fr-FR  "Exécute l'examen de 
mémoire (ESC pour sauter)"

+#string STR_MEMORY_TEST_PERCENT        #language en-US  "% of the system 
memory tested OK"

+                                       #language fr-FR  "% de la mémoire de 
système essayée D'ACCORD"

+#string STR_ESC_TO_SKIP_MEM_TEST       #language en-US  "Press ESC key to skip 
memory test"

+                                       #language fr-FR  "Appuie sur ESC sauter 
examen de mémoire"

+#string STR_MEM_TEST_COMPLETED         #language en-US  " bytes of system 
memory tested OK\r\n"

+                                       #language fr-FR  " octets dela mémoire 
de système essayée D'ACCORD\r\n"

+#string STR_SYSTEM_MEM_ERROR           #language en-US  "System encounters 
memory errors"

+                                       #language fr-FR  "le Système rencontre 
les erreurs de mémoire"

+#string STR_START_BOOT_OPTION          #language en-US  "Start boot option"

+                                       #language fr-FR  "l'option de botte de 
Début"

-- 
2.31.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#85359): https://edk2.groups.io/g/devel/message/85359
Mute This Topic: https://groups.io/mt/88278533/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to