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

**/

#pragma once

#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;
