/** @file
  EFI MM Control PPI definition.

  This PPI is used initiate synchronous MMI activations. This PPI could be published by a processor
  driver to abstract the MMI IPI or a driver which abstracts the ASIC that is supporting the APM port.
  Because of the possibility of performing MMI IPI transactions, the ability to generate this event
  from a platform chipset agent is an optional capability for both IA-32 and x64-based systems.

  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This PPI is introduced in PI Version 1.5.

**/


#ifndef _MM_CONTROL_PPI_H_
#define _MM_CONTROL_PPI_H_

#define EFI_PEI_MM_CONTROL_PPI_GUID \
  { 0x61c68702, 0x4d7e, 0x4f43, 0x8d, 0xef, 0xa7, 0x43, 0x5, 0xce, 0x74, 0xc5 }

typedef struct _EFI_PEI_MM_CONTROL_PPI  EFI_PEI_MM_CONTROL_PPI;

/**
  Invokes PPI activation from the PI PEI environment.

  @param  PeiServices           An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This                  The PEI_MM_CONTROL_PPI instance.
  @param  ArgumentBuffer        The value passed to the MMI handler. This value corresponds to the
                                SwMmiInputValue in the RegisterContext parameter for the Register()
                                function in the EFI_MM_SW_DISPATCH_PROTOCOL and in the Context parameter
                                in the call to the DispatchFunction
  @param  ArgumentBufferSize    The size of the data passed in ArgumentBuffer or NULL if ArgumentBuffer is NULL.
  @param  Periodic              An optional mechanism to periodically repeat activation.
  @param  ActivationInterval    An optional parameter to repeat at this period one
                                time or, if the Periodic Boolean is set, periodically.

  @retval EFI_SUCCESS           The MMI has been engendered.
  @retval EFI_DEVICE_ERROR      The timing is unsupported.
  @retval EFI_INVALID_PARAMETER The activation period is unsupported.
  @retval EFI_NOT_STARTED       The MM base service has not been initialized.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_MM_ACTIVATE) (
  IN EFI_PEI_SERVICES                                **PeiServices,
  IN EFI_PEI_MM_CONTROL_PPI                          * This,
  IN OUT INT8                                        *ArgumentBuffer OPTIONAL,
  IN OUT UINTN                                       *ArgumentBufferSize OPTIONAL,
  IN BOOLEAN                                         Periodic OPTIONAL,
  IN UINTN                                           ActivationInterval OPTIONAL
  );

/**
  Clears any system state that was created in response to the Trigger() call.

  @param  PeiServices           General purpose services available to every PEIM.
  @param  This                  The PEI_MM_CONTROL_PPI instance.
  @param  Periodic              Optional parameter to repeat at this period one
                                time or, if the Periodic Boolean is set, periodically.

  @retval EFI_SUCCESS           The MMI has been engendered.
  @retval EFI_DEVICE_ERROR      The source could not be cleared.
  @retval EFI_INVALID_PARAMETER The service did not support the Periodic input argument.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_MM_DEACTIVATE) (
  IN EFI_PEI_SERVICES                      **PeiServices,
  IN EFI_PEI_MM_CONTROL_PPI                * This,
  IN BOOLEAN                               Periodic OPTIONAL
  );

///
///  The EFI_PEI_MM_CONTROL_PPI is produced by a PEIM. It provides an abstraction of the
///  platform hardware that generates an MMI. There are often I/O ports that, when accessed, will
///  generate the MMI. Also, the hardware optionally supports the periodic generation of these signals.
///
struct _EFI_PEI_MM_CONTROL_PPI {
  EFI_PEI_MM_ACTIVATE    Trigger;
  EFI_PEI_MM_DEACTIVATE  Clear;
};

extern EFI_GUID gEfiPeiMmControlPpiGuid;

#endif
