/** @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__ */
