/** @file
  MM Standby Button Dispatch Protocol as defined in PI 1.5 Specification
  Volume 4 Management Mode Core Interface.

  This protocol provides the parent dispatch service for the standby button MMI source generator.

  Copyright (c) 2017, Intel Corporation. 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.

  @par Revision Reference:
  This protocol is from PI Version 1.5.

**/

#ifndef _MM_STANDBY_BUTTON_DISPATCH_H_
#define _MM_STANDBY_BUTTON_DISPATCH_H_

#include <Pi/PiMmCis.h>

#define EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL_GUID \
  { \
    0x7300c4a1, 0x43f2, 0x4017, {0xa5, 0x1b, 0xc8, 0x1a, 0x7f, 0x40, 0x58, 0x5b } \
  }

///
/// Standby Button phases
///
typedef enum {
  EfiStandbyButtonEntry,
  EfiStandbyButtonExit,
  EfiStandbyButtonMax
} EFI_STANDBY_BUTTON_PHASE;

///
/// The dispatch function's context.
///
typedef struct {
  ///
  /// Describes whether the child handler should be invoked upon the entry to the button
  /// activation or upon exit.
  ///
  EFI_STANDBY_BUTTON_PHASE  Phase;
} EFI_MM_STANDBY_BUTTON_REGISTER_CONTEXT;

typedef struct _EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL;

/**
  Provides the parent dispatch service for a standby button event.

  This service registers a function (DispatchFunction) which will be called when an MMI is
  generated because the standby button was pressed or released, as specified by
  RegisterContext. On return, DispatchHandle contains a unique handle which may be used
  later to unregister the function using UnRegister().
  The DispatchFunction will be called with Context set to the same value as was passed into
  this function in RegisterContext and with CommBuffer and CommBufferSize set to NULL.

  @param[in]  This               Pointer to the EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL instance.
  @param[in]  DispatchFunction   Function to register for handler when the standby button is pressed or released.
  @param[in]  RegisterContext    Pointer to the dispatch function's context. The caller fills in this context
                                 before calling the register function to indicate to the register function the
                                 standby button MMI source for which the dispatch function should be invoked.
  @param[out] DispatchHandle     Handle generated by the dispatcher to track the function instance.

  @retval EFI_SUCCESS            The dispatch function has been successfully
                                 registered and the MMI source has been enabled.
  @retval EFI_DEVICE_ERROR       The driver was unable to enable the MMI source.
  @retval EFI_INVALID_PARAMETER  RegisterContext is invalid. The standby button input value
                                 is not within valid range.
  @retval EFI_OUT_OF_RESOURCES   There is not enough memory (system or MM) to manage this child.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_MM_STANDBY_BUTTON_REGISTER)(
  IN CONST EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL  *This,
  IN       EFI_MM_HANDLER_ENTRY_POINT               DispatchFunction,
  IN       EFI_MM_STANDBY_BUTTON_REGISTER_CONTEXT   *RegisterContext,
  OUT      EFI_HANDLE                               *DispatchHandle
  );

/**
  Unregisters a child MMI source dispatch function with a parent MM driver.

  This service removes the handler associated with DispatchHandle so that it will no longer be
  called when the standby button is pressed or released.

  @param[in] This                Pointer to the EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL instance.
  @param[in] DispatchHandle      Handle of the service to remove.

  @retval EFI_SUCCESS            The service has been successfully removed.
  @retval EFI_INVALID_PARAMETER  The DispatchHandle was not valid.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_MM_STANDBY_BUTTON_UNREGISTER)(
  IN CONST EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL  *This,
  IN       EFI_HANDLE                               DispatchHandle
  );

///
/// Interface structure for the MM Standby Button Dispatch Protocol.
///
/// This protocol provides the parent dispatch service for the standby
/// button MMI source generator.
///
struct _EFI_MM_STANDBY_BUTTON_DISPATCH_PROTOCOL {
  EFI_MM_STANDBY_BUTTON_REGISTER    Register;
  EFI_MM_STANDBY_BUTTON_UNREGISTER  UnRegister;
};

extern EFI_GUID gEfiMmStandbyButtonDispatchProtocolGuid;

#endif

