public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH v4 0/2] add platform boot manager protocol
@ 2018-04-23  6:21 Haojian Zhuang
  2018-04-23  6:21 ` [PATCH v4 1/2] EmbeddedPkg: " Haojian Zhuang
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Haojian Zhuang @ 2018-04-23  6:21 UTC (permalink / raw)
  To: edk2-devel; +Cc: Haojian Zhuang

Changelog:
v4:
  * Add BootCount parameter in the interface.
  * Clean the logic on boot options according to Laszlo's comment.
v3:
  * Update the name of interface.
  * Move the initialization into platform driver.
  * Fix comment style.
  * Fix minor issues with comments.
v2:
  * Avoid to use hardcoding value. Create boot options by functions.

Haojian Zhuang (2):
  EmbeddedPkg: add platform boot manager protocol
  ArmPkg/PlatformBootManagerLib: load platform boot options

 ArmPkg/Library/PlatformBootManagerLib/PlatformBm.c | 103 +++++++++++++++++++++
 .../PlatformBootManagerLib.inf                     |   2 +
 EmbeddedPkg/EmbeddedPkg.dec                        |   1 +
 EmbeddedPkg/Include/Protocol/PlatformBootManager.h |  86 +++++++++++++++++
 4 files changed, 192 insertions(+)
 create mode 100644 EmbeddedPkg/Include/Protocol/PlatformBootManager.h

-- 
2.7.4



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v4 1/2] EmbeddedPkg: add platform boot manager protocol
  2018-04-23  6:21 [PATCH v4 0/2] add platform boot manager protocol Haojian Zhuang
@ 2018-04-23  6:21 ` Haojian Zhuang
  2018-04-23  6:21 ` [PATCH v4 2/2] ArmPkg/PlatformBootManagerLib: load platform boot options Haojian Zhuang
  2018-04-23 20:15 ` [PATCH v4 0/2] add platform boot manager protocol Laszlo Ersek
  2 siblings, 0 replies; 5+ messages in thread
From: Haojian Zhuang @ 2018-04-23  6:21 UTC (permalink / raw)
  To: edk2-devel; +Cc: Haojian Zhuang, Laszlo Ersek, Leif Lindholm, Ard Biesheuvel

Create the PlatformBootManagerProtocol that is used to add
predefined boot options in platform driver. This interface
will be used in ArmPkg/PlatformBootManagerLib.

Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Leif Lindholm <leif.lindholm@linaro.org>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org>
---
 EmbeddedPkg/EmbeddedPkg.dec                        |  1 +
 EmbeddedPkg/Include/Protocol/PlatformBootManager.h | 86 ++++++++++++++++++++++
 2 files changed, 87 insertions(+)
 create mode 100644 EmbeddedPkg/Include/Protocol/PlatformBootManager.h

diff --git a/EmbeddedPkg/EmbeddedPkg.dec b/EmbeddedPkg/EmbeddedPkg.dec
index eb135340b173..9cd50738363b 100644
--- a/EmbeddedPkg/EmbeddedPkg.dec
+++ b/EmbeddedPkg/EmbeddedPkg.dec
@@ -81,6 +81,7 @@ [Protocols.common]
   gPlatformGpioProtocolGuid = { 0x52ce9845, 0x5af4, 0x43e2, {0xba, 0xfd, 0x23, 0x08, 0x12, 0x54, 0x7a, 0xc2 }}
   gAndroidBootImgProtocolGuid = { 0x9859bb19, 0x407c, 0x4f8b, {0xbc, 0xe1, 0xf8, 0xda, 0x65, 0x65, 0xf4, 0xa5 }}
   gPlatformVirtualKeyboardProtocolGuid = { 0x0e3606d2, 0x1dc3, 0x4e6f, { 0xbe, 0x65, 0x39, 0x49, 0x82, 0xa2, 0x65, 0x47 }}
+  gPlatformBootManagerProtocolGuid = { 0x7197c8a7, 0x6559, 0x4c93, { 0x93, 0xd5, 0x8a, 0x84, 0xf9, 0x88, 0x79, 0x8b }}
 
 [Ppis]
   gEdkiiEmbeddedGpioPpiGuid = { 0x21c3b115, 0x4e0b, 0x470c, { 0x85, 0xc7, 0xe1, 0x05, 0xa5, 0x75, 0xc9, 0x7b }}
diff --git a/EmbeddedPkg/Include/Protocol/PlatformBootManager.h b/EmbeddedPkg/Include/Protocol/PlatformBootManager.h
new file mode 100644
index 000000000000..9fa27985b469
--- /dev/null
+++ b/EmbeddedPkg/Include/Protocol/PlatformBootManager.h
@@ -0,0 +1,86 @@
+/** @file
+
+  Copyright (c) 2018, Linaro. All rights reserved.<BR>
+
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __PLATFORM_BOOT_MANAGER_PROTOCOL_H__
+#define __PLATFORM_BOOT_MANAGER_PROTOCOL_H__
+
+//
+// Protocol interface structure
+//
+typedef struct _PLATFORM_BOOT_MANAGER_PROTOCOL    PLATFORM_BOOT_MANAGER_PROTOCOL;
+
+//
+// Function Prototypes
+//
+
+/*
+  Get predefined boot options for platform.
+
+  @param[out] Count            The number of elements in each of
+                               BootOptions and BootKeys. On successful
+                               return, Count is at least one.
+
+  @param[out] BootOptions      An array of platform boot options.
+                               BootOptions is pool-allocated by
+                               GET_PLATFORM_BOOT_OPTIONS_AND_KEYS, and
+                               GET_PLATFORM_BOOT_OPTIONS_AND_KEYS populates
+                               every element in BootOptions with
+                               EfiBootManagerInitializeLoadOption().
+                               BootOptions shall not contain duplicate
+                               entries. The caller is responsible for
+                               releasing BootOptions after use with
+                               EfiBootManagerFreeLoadOptions().
+
+  @param[out] BootKeys         A pool-allocated array of platform boot
+                               hotkeys. For every 0 <= Index < Count, if
+                               BootOptions[Index] is not to be associated
+                               with a hotkey, then BootKeys[Index] is
+                               zero-filled. Otherwise, BootKeys[Index]
+                               specifies the boot hotkey for
+                               BootOptions[Index]. BootKeys shall not
+                               contain duplicate entries (other than
+                               zero-filled entries). The caller is
+                               responsible for releasing BootKeys with
+                               FreePool() after use.
+
+  @retval EFI_SUCCESS          Count, BootOptions and BootKeys have
+                               been set.
+
+  @retval EFI_OUT_OF_RESOURCES Memory allocation failed.
+
+  @retval EFI_UNSUPPORTED      The platform doesn't provide boot options
+                               as a feature.
+
+  @retval EFI_NOT_FOUND        The platform could provide boot options
+                               as a feature, but none have been
+                               configured.
+
+  @return                      Error codes propagated from underlying
+                               functions.
+*/
+typedef
+EFI_STATUS
+(EFIAPI *GET_PLATFORM_BOOT_OPTIONS_AND_KEYS) (
+  OUT UINTN                              *Count,
+  OUT EFI_BOOT_MANAGER_LOAD_OPTION       **BootOptions,
+  OUT EFI_INPUT_KEY                      **BootKeys
+  );
+
+struct _PLATFORM_BOOT_MANAGER_PROTOCOL {
+  GET_PLATFORM_BOOT_OPTIONS_AND_KEYS     GetPlatformBootOptionsAndKeys;
+};
+
+extern EFI_GUID gPlatformBootManagerProtocolGuid;
+
+#endif /* __PLATFORM_BOOT_MANAGER_PROTOCOL_H__ */
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v4 2/2] ArmPkg/PlatformBootManagerLib: load platform boot options
  2018-04-23  6:21 [PATCH v4 0/2] add platform boot manager protocol Haojian Zhuang
  2018-04-23  6:21 ` [PATCH v4 1/2] EmbeddedPkg: " Haojian Zhuang
@ 2018-04-23  6:21 ` Haojian Zhuang
  2018-04-23 20:15 ` [PATCH v4 0/2] add platform boot manager protocol Laszlo Ersek
  2 siblings, 0 replies; 5+ messages in thread
From: Haojian Zhuang @ 2018-04-23  6:21 UTC (permalink / raw)
  To: edk2-devel; +Cc: Haojian Zhuang, Laszlo Ersek, Leif Lindholm, Ard Biesheuvel

Make platform driver to create predefined boot options and related
hot keys.

Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Leif Lindholm <leif.lindholm@linaro.org>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org>
---
 ArmPkg/Library/PlatformBootManagerLib/PlatformBm.c | 103 +++++++++++++++++++++
 .../PlatformBootManagerLib.inf                     |   2 +
 2 files changed, 105 insertions(+)

diff --git a/ArmPkg/Library/PlatformBootManagerLib/PlatformBm.c b/ArmPkg/Library/PlatformBootManagerLib/PlatformBm.c
index 61ab61ccc780..3456a71fbb9c 100644
--- a/ArmPkg/Library/PlatformBootManagerLib/PlatformBm.c
+++ b/ArmPkg/Library/PlatformBootManagerLib/PlatformBm.c
@@ -30,6 +30,7 @@
 #include <Protocol/LoadedImage.h>
 #include <Protocol/PciIo.h>
 #include <Protocol/PciRootBridgeIo.h>
+#include <Protocol/PlatformBootManager.h>
 #include <Guid/EventGroup.h>
 #include <Guid/TtyTerm.h>
 
@@ -392,6 +393,106 @@ PlatformRegisterFvBootOption (
 
 STATIC
 VOID
+GetPlatformOptions (
+  VOID
+  )
+{
+  EFI_STATUS                      Status;
+  EFI_BOOT_MANAGER_LOAD_OPTION    *CurrentBootOptions;
+  EFI_BOOT_MANAGER_LOAD_OPTION    *BootOptions;
+  EFI_INPUT_KEY                   *BootKeys;
+  PLATFORM_BOOT_MANAGER_PROTOCOL  *PlatformBootManager;
+  UINTN                           CurrentBootOptionCount;
+  UINTN                           Index;
+  UINTN                           BootCount;
+
+  Status = gBS->LocateProtocol (&gPlatformBootManagerProtocolGuid, NULL,
+                  (VOID **)&PlatformBootManager);
+  if (EFI_ERROR (Status)) {
+    return;
+  }
+  Status = PlatformBootManager->GetPlatformBootOptionsAndKeys (
+                                  &BootCount,
+                                  &BootOptions,
+                                  &BootKeys
+                                  );
+  if (EFI_ERROR (Status)) {
+    return;
+  }
+  //
+  // Fetch the existent boot options. If there are none, CurrentBootCount
+  // will be zeroed.
+  //
+  CurrentBootOptions = EfiBootManagerGetLoadOptions (
+                         &CurrentBootOptionCount,
+                         LoadOptionTypeBoot
+                         );
+  //
+  // Process the platform boot options.
+  //
+  for (Index = 0; Index < BootCount; Index++) {
+    INTN    Match;
+    UINTN   BootOptionNumber;
+
+    //
+    // If there are any preexistent boot options, and the subject platform boot
+    // option is already among them, then don't try to add it. Just get its
+    // assigned boot option number so we can associate a hotkey with it. Note
+    // that EfiBootManagerFindLoadOption() deals fine with (CurrentBootOptions
+    // == NULL) if (CurrentBootCount == 0).
+    //
+    Match = EfiBootManagerFindLoadOption (
+              &BootOptions[Index],
+              CurrentBootOptions,
+              CurrentBootOptionCount
+              );
+    if (Match >= 0) {
+      BootOptionNumber = CurrentBootOptions[Match].OptionNumber;
+    } else {
+      //
+      // Add the platform boot options as a new one, at the end of the boot
+      // order. Note that if the platform provided this boot option with an
+      // unassigned option number, then the below function call will assign a
+      // number.
+      //
+      Status = EfiBootManagerAddLoadOptionVariable (
+                 &BootOptions[Index],
+                 MAX_UINTN
+                 );
+      if (EFI_ERROR (Status)) {
+        DEBUG ((DEBUG_ERROR, "%a: failed to register \"%s\": %r\n",
+          __FUNCTION__, BootOptions[Index].Description, Status));
+        continue;
+      }
+      BootOptionNumber = BootOptions[Index].OptionNumber;
+    }
+
+    //
+    // Register a hotkey with the boot option, if requested.
+    //
+    if (BootKeys[Index].UnicodeChar == L'\0') {
+      continue;
+    }
+
+    Status = EfiBootManagerAddKeyOptionVariable (
+               NULL,
+               BootOptionNumber,
+               0,
+               BootKeys[Index],
+               NULL
+               );
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "%a: failed to register hotkey for \"%s\": %r\n",
+        __FUNCTION__, BootOptions[Index].Description, Status));
+    }
+  }
+  EfiBootManagerFreeLoadOptions (CurrentBootOptions, CurrentBootOptionCount);
+  EfiBootManagerFreeLoadOptions (BootOptions, BootCount);
+  FreePool (BootKeys);
+}
+
+STATIC
+VOID
 PlatformRegisterOptionsAndKeys (
   VOID
   )
@@ -402,6 +503,8 @@ PlatformRegisterOptionsAndKeys (
   EFI_INPUT_KEY                Esc;
   EFI_BOOT_MANAGER_LOAD_OPTION BootOption;
 
+  GetPlatformOptions ();
+
   //
   // Register ENTER as CONTINUE key
   //
diff --git a/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
index 71f1d04a87ee..e8cbb10dabdd 100644
--- a/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
+++ b/ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
@@ -35,6 +35,7 @@ [Sources]
   PlatformBm.c
 
 [Packages]
+  EmbeddedPkg/EmbeddedPkg.dec
   MdeModulePkg/MdeModulePkg.dec
   MdePkg/MdePkg.dec
   ShellPkg/ShellPkg.dec
@@ -84,3 +85,4 @@ [Protocols]
   gEfiPciRootBridgeIoProtocolGuid
   gEfiSimpleFileSystemProtocolGuid
   gEsrtManagementProtocolGuid
+  gPlatformBootManagerProtocolGuid
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v4 0/2] add platform boot manager protocol
  2018-04-23  6:21 [PATCH v4 0/2] add platform boot manager protocol Haojian Zhuang
  2018-04-23  6:21 ` [PATCH v4 1/2] EmbeddedPkg: " Haojian Zhuang
  2018-04-23  6:21 ` [PATCH v4 2/2] ArmPkg/PlatformBootManagerLib: load platform boot options Haojian Zhuang
@ 2018-04-23 20:15 ` Laszlo Ersek
  2018-06-05 14:55   ` Leif Lindholm
  2 siblings, 1 reply; 5+ messages in thread
From: Laszlo Ersek @ 2018-04-23 20:15 UTC (permalink / raw)
  To: Haojian Zhuang, edk2-devel; +Cc: Leif Lindholm (Linaro address), Ard Biesheuvel

On 04/23/18 08:21, Haojian Zhuang wrote:
> Changelog:
> v4:
>   * Add BootCount parameter in the interface.
>   * Clean the logic on boot options according to Laszlo's comment.
> v3:
>   * Update the name of interface.
>   * Move the initialization into platform driver.
>   * Fix comment style.
>   * Fix minor issues with comments.
> v2:
>   * Avoid to use hardcoding value. Create boot options by functions.
> 
> Haojian Zhuang (2):
>   EmbeddedPkg: add platform boot manager protocol
>   ArmPkg/PlatformBootManagerLib: load platform boot options
> 
>  ArmPkg/Library/PlatformBootManagerLib/PlatformBm.c | 103 +++++++++++++++++++++
>  .../PlatformBootManagerLib.inf                     |   2 +
>  EmbeddedPkg/EmbeddedPkg.dec                        |   1 +
>  EmbeddedPkg/Include/Protocol/PlatformBootManager.h |  86 +++++++++++++++++
>  4 files changed, 192 insertions(+)
>  create mode 100644 EmbeddedPkg/Include/Protocol/PlatformBootManager.h
> 

(CC Leif, Ard)

For the series:
Reviewed-by: Laszlo Ersek <lersek@redhat.com>

Thanks
Laszlo


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v4 0/2] add platform boot manager protocol
  2018-04-23 20:15 ` [PATCH v4 0/2] add platform boot manager protocol Laszlo Ersek
@ 2018-06-05 14:55   ` Leif Lindholm
  0 siblings, 0 replies; 5+ messages in thread
From: Leif Lindholm @ 2018-06-05 14:55 UTC (permalink / raw)
  To: Laszlo Ersek; +Cc: Haojian Zhuang, edk2-devel, Ard Biesheuvel

On Mon, Apr 23, 2018 at 10:15:41PM +0200, Laszlo Ersek wrote:
> On 04/23/18 08:21, Haojian Zhuang wrote:
> > Changelog:
> > v4:
> >   * Add BootCount parameter in the interface.
> >   * Clean the logic on boot options according to Laszlo's comment.
> > v3:
> >   * Update the name of interface.
> >   * Move the initialization into platform driver.
> >   * Fix comment style.
> >   * Fix minor issues with comments.
> > v2:
> >   * Avoid to use hardcoding value. Create boot options by functions.
> > 
> > Haojian Zhuang (2):
> >   EmbeddedPkg: add platform boot manager protocol
> >   ArmPkg/PlatformBootManagerLib: load platform boot options
> > 
> >  ArmPkg/Library/PlatformBootManagerLib/PlatformBm.c | 103 +++++++++++++++++++++
> >  .../PlatformBootManagerLib.inf                     |   2 +
> >  EmbeddedPkg/EmbeddedPkg.dec                        |   1 +
> >  EmbeddedPkg/Include/Protocol/PlatformBootManager.h |  86 +++++++++++++++++
> >  4 files changed, 192 insertions(+)
> >  create mode 100644 EmbeddedPkg/Include/Protocol/PlatformBootManager.h
> > 
> 
> (CC Leif, Ard)
> 
> For the series:
> Reviewed-by: Laszlo Ersek <lersek@redhat.com>

Thanks for the review Lazslo.

Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

Series pushed as 76022b02e8..1b6e7633ca.

I will add that the bits that go into EmbeddedPkg here do so for no
other reason than "we don't have a better place for them, and they're
certainly not ARM-specific". The case for a generic UtilityPkg is growing.

/
    Leif


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-06-05 14:55 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-04-23  6:21 [PATCH v4 0/2] add platform boot manager protocol Haojian Zhuang
2018-04-23  6:21 ` [PATCH v4 1/2] EmbeddedPkg: " Haojian Zhuang
2018-04-23  6:21 ` [PATCH v4 2/2] ArmPkg/PlatformBootManagerLib: load platform boot options Haojian Zhuang
2018-04-23 20:15 ` [PATCH v4 0/2] add platform boot manager protocol Laszlo Ersek
2018-06-05 14:55   ` Leif Lindholm

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox