public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Ashish Singhal" <ashishsingha@nvidia.com>
To: <devel@edk2.groups.io>, <jian.j.wang@intel.com>,
	<hao.a.wu@intel.com>, <zhichao.gao@intel.com>, <ray.ni@intel.com>
Cc: Ashish Singhal <ashishsingha@nvidia.com>
Subject: [PATCH v3] MdeModulePkg: Add Platform Boot Options Protocol
Date: Tue, 17 Dec 2019 13:36:28 -0700	[thread overview]
Message-ID: <6f24dc6e1495eded1c77fa35aff40b574a75d7be.1576614938.git.ashishsingha@nvidia.com> (raw)

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         | 116 +++++++++++++++++++++
 MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c   |  52 +++++++--
 .../Library/UefiBootManagerLib/InternalBm.h        |   2 +
 .../UefiBootManagerLib/UefiBootManagerLib.inf      |   2 +
 MdeModulePkg/MdeModulePkg.dec                      |   4 +
 5 files changed, 170 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..3e08155
--- /dev/null
+++ b/MdeModulePkg/Include/Protocol/PlatformBootOptions.h
@@ -0,0 +1,116 @@
+/** @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 allocated by OVERRIDE_PLATFORM_BOOT_OPTIONS
+                                           and would be freed by caller after consuming it.
+
+
+  @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 allocated by REMOVE_INVALID_PLATFORM_NV_BOOT_OPTIONS
+                                             and would be freed by caller after consuming it.
+
+
+  @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


             reply	other threads:[~2019-12-17 20:36 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-17 20:36 Ashish Singhal [this message]
2019-12-18  0:55 ` [PATCH v3] MdeModulePkg: Add Platform Boot Options Protocol Ni, Ray
2019-12-18  4:21   ` Ashish Singhal
2019-12-18  8:42     ` Ni, Ray
2019-12-18 19:14       ` Ashish Singhal

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6f24dc6e1495eded1c77fa35aff40b574a75d7be.1576614938.git.ashishsingha@nvidia.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox