* [PATCH] MdeModulePkg: Add Platform Boot Options Protocol
@ 2019-12-17 20:18 Ashish Singhal
0 siblings, 0 replies; only message in thread
From: Ashish Singhal @ 2019-12-17 20:18 UTC (permalink / raw)
To: devel, jian.j.wang, hao.a.wu, zhichao.gao, ray.ni; +Cc: Ashish Singhal
Add platform boot options protocol which would have platform specific
overrides to the auto enumerated boot options during the call to
EfiBootManagerRefreshAllBootOption function in UefiBootManagerLib.
Signed-off-by: Ashish Singhal <ashishsingha@nvidia.com>
---
.../Include/Protocol/PlatformBootOptions.h | 114 +++++++++++++++++++++
MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c | 52 ++++++++--
.../Library/UefiBootManagerLib/InternalBm.h | 2 +
.../UefiBootManagerLib/UefiBootManagerLib.inf | 2 +
MdeModulePkg/MdeModulePkg.dec | 4 +
5 files changed, 168 insertions(+), 6 deletions(-)
create mode 100644 MdeModulePkg/Include/Protocol/PlatformBootOptions.h
diff --git a/MdeModulePkg/Include/Protocol/PlatformBootOptions.h b/MdeModulePkg/Include/Protocol/PlatformBootOptions.h
new file mode 100644
index 0000000..801188a
--- /dev/null
+++ b/MdeModulePkg/Include/Protocol/PlatformBootOptions.h
@@ -0,0 +1,114 @@
+/** @file
+
+ Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef __PLATFORM_BOOT_OPTIONS_PROTOCOL_H__
+#define __PLATFORM_BOOT_OPTIONS_PROTOCOL_H__
+
+#include <Library/UefiBootManagerLib.h>
+
+//
+// Platform Boot Options Protocol GUID value
+//
+#define EDKII_PLATFORM_BOOT_OPTIONS_PROTOCOL_GUID \
+ { \
+ 0xaa17add4, 0x756c, 0x460d, { 0x94, 0xb8, 0x43, 0x88, 0xd7, 0xfb, 0x3e, 0x59 } \
+ }
+
+//
+// Protocol interface structure
+//
+typedef struct _PLATFORM_BOOT_OPTIONS_PROTOCOL PLATFORM_BOOT_OPTIONS_PROTOCOL;
+
+//
+// Revision The revision to which the protocol interface adheres.
+// All future revisions must be backwards compatible.
+// If a future version is not back wards compatible it is not the same GUID.
+//
+#define EDKII_PLATFORM_BOOT_OPTIONS_PROTOCOL_REVISION 0x00000001
+
+//
+// Function Prototypes
+//
+
+/*
+ This function allows overrides to auto enumerated boot options for platform.
+
+ @param[in const] BootOptionsCount The number of elements in BootOptions.
+
+ @param[in const] BootOptions An array of auto enumerated platform boot options.
+ This array will be freed by caller upon successful
+ exit of this function and output array would be used.
+
+ @param[out] UpdatedBootOptionsCount The number of elements in UpdatedBootOptions.
+
+ @param[out] UpdatedBootOptions An array of boot options that have been customized
+ for the platform on top of input boot options. This
+ array would be freed by caller after processing.
+
+
+ @retval EFI_SUCCESS Platform overrides to input BootOptions and
+ BootCount have been done.
+
+ @retval EFI_OUT_OF_RESOURCES Memory allocation failed.
+
+ @retval EFI_INVALID_PARAMETER Input is not correct.
+
+ @retval EFI_UNSUPPORTED Platform specific overrides are not supported.
+*/
+typedef
+EFI_STATUS
+(EFIAPI *OVERRIDE_PLATFORM_BOOT_OPTIONS) (
+ IN CONST UINTN BootOptionsCount,
+ IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions,
+ OUT UINTN *UpdatedBootOptionsCount,
+ OUT EFI_BOOT_MANAGER_LOAD_OPTION **UpdatedBootOptions
+ );
+
+/*
+ This function allows to remove invalid platform specific boot options from NV.
+
+ @param[in const] NvBootOptionsCount The number of elements in NvBootOptions.
+
+ @param[in const] NvBootOptions An array of current boot options in NV store.
+ This array will be freed by caller upon successful
+ exit of this function and output array would be used.
+
+ @param[out] UpdatedBootOptionsCount The number of elements in UpdatedBootOptions.
+
+ @param[out] UpdatedBootOptions An array of NV boot options that have been cleaned up
+ for the platform on top of input NV boot options. This
+ array would be freed by caller after processing.
+
+
+ @retval EFI_SUCCESS Platform cleanup to input NvBootOptions and
+ NvBootCount have been done.
+
+ @retval EFI_OUT_OF_RESOURCES Memory allocation failed.
+
+ @retval EFI_INVALID_PARAMETER Input is not correct.
+
+ @retval EFI_UNSUPPORTED Platform specific overrides are not supported.
+*/
+typedef
+EFI_STATUS
+(EFIAPI *REMOVE_INVALID_PLATFORM_NV_BOOT_OPTIONS) (
+ IN CONST UINTN NvBootOptionsCount,
+ IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *NvBootOptions,
+ OUT UINTN *UpdatedBootOptionsCount,
+ OUT EFI_BOOT_MANAGER_LOAD_OPTION **UpdatedBootOptions
+ );
+
+struct _PLATFORM_BOOT_OPTIONS_PROTOCOL {
+ UINT64 Revision;
+ OVERRIDE_PLATFORM_BOOT_OPTIONS OverridePlatformBootOptions;
+ REMOVE_INVALID_PLATFORM_NV_BOOT_OPTIONS RemoveInvalidPlatformNvBootOptions;
+};
+
+extern EFI_GUID gEdkiiPlatformBootOptionsProtocolGuid;
+
+#endif /* __PLATFORM_BOOT_OPTIONS_PROTOCOL_H__ */
diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
index 760d764..41e09d5 100644
--- a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
+++ b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
@@ -1,6 +1,7 @@
/** @file
Library functions which relates with booting.
+Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
Copyright (c) 2011 - 2019, Intel Corporation. All rights reserved.<BR>
(C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -2258,12 +2259,15 @@ EfiBootManagerRefreshAllBootOption (
VOID
)
{
- EFI_STATUS Status;
- EFI_BOOT_MANAGER_LOAD_OPTION *NvBootOptions;
- UINTN NvBootOptionCount;
- EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions;
- UINTN BootOptionCount;
- UINTN Index;
+ EFI_STATUS Status;
+ EFI_BOOT_MANAGER_LOAD_OPTION *NvBootOptions;
+ UINTN NvBootOptionCount;
+ EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions;
+ UINTN BootOptionCount;
+ EFI_BOOT_MANAGER_LOAD_OPTION *UpdatedBootOptions;
+ UINTN UpdatedBootOptionCount;
+ UINTN Index;
+ PLATFORM_BOOT_OPTIONS_PROTOCOL *PlatformBootOptions;
//
// Optionally refresh the legacy boot option
@@ -2284,6 +2288,42 @@ EfiBootManagerRefreshAllBootOption (
}
//
+ // Locate Platform Boot Options Protocol
+ //
+ PlatformBootOptions = NULL;
+ Status = gBS->LocateProtocol (&gEdkiiPlatformBootOptionsProtocolGuid,
+ NULL,
+ (VOID **)&PlatformBootOptions);
+ if (!EFI_ERROR (Status)) {
+ //
+ // If found, call platform specific overrides to auto enumerated
+ // boot options.
+ //
+ Status = PlatformBootOptions->OverridePlatformBootOptions ((CONST UINTN)BootOptionCount,
+ (CONST EFI_BOOT_MANAGER_LOAD_OPTION *)BootOptions,
+ &UpdatedBootOptionCount,
+ &UpdatedBootOptions);
+ if (!EFI_ERROR (Status)) {
+ EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount);
+ BootOptions = UpdatedBootOptions;
+ BootOptionCount = UpdatedBootOptionCount;
+ }
+
+ //
+ // Call platform specific override to remove invalid boot options from NV
+ //
+ Status = PlatformBootOptions->RemoveInvalidPlatformNvBootOptions ((CONST UINTN)NvBootOptionCount,
+ (CONST EFI_BOOT_MANAGER_LOAD_OPTION *)NvBootOptions,
+ &UpdatedBootOptionCount,
+ &UpdatedBootOptions);
+ if (!EFI_ERROR (Status)) {
+ EfiBootManagerFreeLoadOptions (NvBootOptions, NvBootOptionCount);
+ NvBootOptions = UpdatedBootOptions;
+ NvBootOptionCount = UpdatedBootOptionCount;
+ }
+ }
+
+ //
// Remove invalid EFI boot options from NV
//
for (Index = 0; Index < NvBootOptionCount; Index++) {
diff --git a/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h b/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
index 027eb25..1f65860 100644
--- a/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
+++ b/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
@@ -1,6 +1,7 @@
/** @file
BDS library definition, include the file and data structure
+Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
(C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -41,6 +42,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Protocol/VariableLock.h>
#include <Protocol/RamDisk.h>
#include <Protocol/DeferredImageLoad.h>
+#include <Protocol/PlatformBootOptions.h>
#include <Guid/MemoryTypeInformation.h>
#include <Guid/FileInfo.h>
diff --git a/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf b/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
index ed6b467..d839252 100644
--- a/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
+++ b/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
@@ -5,6 +5,7 @@
# manipulation, hotkey registration, UEFI boot, connect/disconnect, console
# manipulation, driver health checking and etc.
#
+# Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
# (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
# SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -107,6 +108,7 @@
gEfiFormBrowser2ProtocolGuid ## SOMETIMES_CONSUMES
gEfiRamDiskProtocolGuid ## SOMETIMES_CONSUMES
gEfiDeferredImageLoadProtocolGuid ## SOMETIMES_CONSUMES
+ gEdkiiPlatformBootOptionsProtocolGuid ## SOMETIMES_CONSUMES
[Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange ## SOMETIMES_CONSUMES
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index 41b9e70..bb9fa8b 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -3,6 +3,7 @@
# It also provides the definitions(including PPIs/PROTOCOLs/GUIDs and library classes)
# and libraries instances, which are used for those modules.
#
+# Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
# Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR>
# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
# (C) Copyright 2016 - 2019 Hewlett Packard Enterprise Development LP<BR>
@@ -609,6 +610,9 @@
## Include/Protocol/PeCoffImageEmulator.h
gEdkiiPeCoffImageEmulatorProtocolGuid = { 0x96f46153, 0x97a7, 0x4793, { 0xac, 0xc1, 0xfa, 0x19, 0xbf, 0x78, 0xea, 0x97 } }
+ ## Include/Protocol/PlatformBootOptions.h
+ gEdkiiPlatformBootOptionsProtocolGuid = { 0xaa17add4, 0x756c, 0x460d, { 0x94, 0xb8, 0x43, 0x88, 0xd7, 0xfb, 0x3e, 0x59 } }
+
#
# [Error.gEfiMdeModulePkgTokenSpaceGuid]
# 0x80000001 | Invalid value provided.
--
2.7.4
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2019-12-17 20:18 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-12-17 20:18 [PATCH] MdeModulePkg: Add Platform Boot Options Protocol Ashish Singhal
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox