/** @file
  S3 Save State Protocol as defined in PI 1.6(Errata A) Specification VOLUME 5 Standard.

  This protocol is used by DXE PI module to store or record various IO operations
  to be replayed during an S3 resume.
  This protocol is not required for all platforms.

  Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This PPI is defined in UEFI Platform Initialization Specification 1.2 Volume 5:
  Standards

**/

#ifndef __S3_SAVE_STATE_H__
#define __S3_SAVE_STATE_H__

#define EFI_S3_SAVE_STATE_PROTOCOL_GUID \
    { 0xe857caf6, 0xc046, 0x45dc, { 0xbe, 0x3f, 0xee, 0x7, 0x65, 0xfb, 0xa8, 0x87 }}

typedef VOID *EFI_S3_BOOT_SCRIPT_POSITION;

typedef struct _EFI_S3_SAVE_STATE_PROTOCOL EFI_S3_SAVE_STATE_PROTOCOL;

/**
  Record operations that need to be replayed during an S3 resume.

  This function is used to store an OpCode to be replayed as part of the S3 resume boot path. It is
  assumed this protocol has platform specific mechanism to store the OpCode set and replay them
  during the S3 resume.

  @param[in]    This    A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance.
  @param[in]    OpCode  The operation code (opcode) number.
  @param[in]    ...     Argument list that is specific to each opcode. See the following subsections for the
                        definition of each opcode.

  @retval EFI_SUCCESS           The operation succeeded. A record was added into the specified
                                script table.
  @retval EFI_INVALID_PARAMETER The parameter is illegal or the given boot script is not supported.
  @retval EFI_OUT_OF_RESOURCES  There is insufficient memory to store the boot script.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_S3_SAVE_STATE_WRITE)(
  IN CONST EFI_S3_SAVE_STATE_PROTOCOL  *This,
  IN       UINTN                       OpCode,
  ...
  );

/**
  Record operations that need to be replayed during an S3 resume.

  This function is used to store an OpCode to be replayed as part of the S3 resume boot path. It is
  assumed this protocol has platform specific mechanism to store the OpCode set and replay them
  during the S3 resume.
  The opcode is inserted before or after the specified position in the boot script table. If Position is
  NULL then that position is after the last opcode in the table (BeforeOrAfter is TRUE) or before
  the first opcode in the table (BeforeOrAfter is FALSE). The position which is pointed to by
  Position upon return can be used for subsequent insertions.

  This function has a variable parameter list. The exact parameter list depends on the OpCode that is
  passed into the function. If an unsupported OpCode or illegal parameter list is passed in, this
  function returns EFI_INVALID_PARAMETER.
  If there are not enough resources available for storing more scripts, this function returns
  EFI_OUT_OF_RESOURCES.
  OpCode values of 0x80 - 0xFE are reserved for implementation specific functions.

  @param[in]        This            A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance.
  @param[in]        BeforeOrAfter   Specifies whether the opcode is stored before (TRUE) or after (FALSE) the position
                                    in the boot script table specified by Position. If Position is NULL or points to
                                    NULL then the new opcode is inserted at the beginning of the table (if TRUE) or end
                                    of the table (if FALSE).
  @param[in, out]   Position        On entry, specifies the position in the boot script table where the opcode will be
                                    inserted, either before or after, depending on BeforeOrAfter. On exit, specifies
                                    the position of the inserted opcode in the boot script table.
  @param[in]        OpCode          The operation code (opcode) number. See "Related Definitions" in Write() for the
                                    defined opcode types.
  @param[in]        ...             Argument list that is specific to each opcode. See the following subsections for the
                                    definition of each opcode.

  @retval EFI_SUCCESS               The operation succeeded. An opcode was added into the script.
  @retval EFI_INVALID_PARAMETER     The Opcode is an invalid opcode value.
  @retval EFI_INVALID_PARAMETER     The Position is not a valid position in the boot script table.
  @retval EFI_OUT_OF_RESOURCES      There is insufficient memory to store the boot script table.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_S3_SAVE_STATE_INSERT)(
  IN CONST EFI_S3_SAVE_STATE_PROTOCOL  *This,
  IN       BOOLEAN                     BeforeOrAfter,
  IN OUT   EFI_S3_BOOT_SCRIPT_POSITION *Position       OPTIONAL,
  IN       UINTN                       OpCode,
  ...
  );

/**
  Find a label within the boot script table and, if not present, optionally create it.

  If the label Label is already exists in the boot script table, then no new label is created, the
  position of the Label is returned in *Position and EFI_SUCCESS is returned.
  If the label Label does not already exist and CreateIfNotFound is TRUE, then it will be
  created before or after the specified position and EFI_SUCCESS is returned.
  If the label Label does not already exist and CreateIfNotFound is FALSE, then
  EFI_NOT_FOUND is returned.

  @param[in]      This                A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance.
  @param[in]      BeforeOrAfter       Specifies whether the label is stored before (TRUE) or after (FALSE) the position in
                                      the boot script table specified by Position. If Position is NULL or points to
                                      NULL then the new label is inserted at the beginning of the table (if TRUE) or end of
                                      the table (if FALSE).
  @param[in]      CreateIfNotFound    Specifies whether the label will be created if the label does not exists (TRUE) or not (FALSE).
  @param[in, out] Position            On entry, specifies the position in the boot script table where the label will be inserted,
                                      either before or after, depending on BeforeOrAfter. On exit, specifies the position
                                      of the inserted label in the boot script table.
  @param[in]      Label               Points to the label which will be inserted in the boot script table.

  @retval    EFI_SUCCESS              The label already exists or was inserted.
  @retval    EFI_NOT_FOUND            The label did not already exist and CreateifNotFound was FALSE.
  @retval    EFI_INVALID_PARAMETER    The Label is NULL or points to an empty string.
  @retval    EFI_INVALID_PARAMETER    The Position is not a valid position in the boot script table.
  @retval    EFI_OUT_OF_RESOURCES     There is insufficient memory to store the boot script.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_S3_SAVE_STATE_LABEL)(
  IN CONST  EFI_S3_SAVE_STATE_PROTOCOL      *This,
  IN        BOOLEAN                         BeforeOrAfter,
  IN        BOOLEAN                         CreateIfNotFound,
  IN OUT    EFI_S3_BOOT_SCRIPT_POSITION     *Position OPTIONAL,
  IN CONST  CHAR8                           *Label
  );

/**
  Compare two positions in the boot script table and return their relative position.

  This function compares two positions in the boot script table and returns their relative positions. If
  Position1 is before Position2, then -1 is returned. If Position1 is equal to Position2,
  then 0 is returned. If Position1 is after Position2, then 1 is returned.

  @param[in]    This                A pointer to the EFI_S3_SAVE_STATE_PROTOCOL instance.
  @param[in]    Position1           The positions in the boot script table to compare.
  @param[in]    Position2           The positions in the boot script table to compare.
  @param[out]   RelativePosition    On return, points to the result of the comparison.

  @retval   EFI_SUCCESS             The operation succeeded.
  @retval   EFI_INVALID_PARAMETER   The Position1 or Position2 is not a valid position in the boot script table.
  @retval   EFI_INVALID_PARAMETER   The RelativePosition is NULL.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_S3_SAVE_STATE_COMPARE)(
  IN CONST EFI_S3_SAVE_STATE_PROTOCOL          *This,
  IN       EFI_S3_BOOT_SCRIPT_POSITION         Position1,
  IN       EFI_S3_BOOT_SCRIPT_POSITION         Position2,
  OUT      UINTN                               *RelativePosition
  );

struct _EFI_S3_SAVE_STATE_PROTOCOL {
  EFI_S3_SAVE_STATE_WRITE      Write;
  EFI_S3_SAVE_STATE_INSERT     Insert;
  EFI_S3_SAVE_STATE_LABEL      Label;
  EFI_S3_SAVE_STATE_COMPARE    Compare;
};

extern EFI_GUID  gEfiS3SaveStateProtocolGuid;

#endif // __S3_SAVE_STATE_H__
