/** @file
  The Decompress Protocol Interface as defined in UEFI spec

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

**/

#ifndef __DECOMPRESS_H__
#define __DECOMPRESS_H__

#define EFI_DECOMPRESS_PROTOCOL_GUID \
  { \
    0xd8117cfe, 0x94a6, 0x11d4, {0x9a, 0x3a, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
  }

typedef struct _EFI_DECOMPRESS_PROTOCOL EFI_DECOMPRESS_PROTOCOL;

/**
  The GetInfo() function retrieves the size of the uncompressed buffer
  and the temporary scratch buffer required to decompress the buffer
  specified by Source and SourceSize.  If the size of the uncompressed
  buffer or the size of the scratch buffer cannot be determined from
  the compressed data specified by Source and SourceData, then
  EFI_INVALID_PARAMETER is returned.  Otherwise, the size of the uncompressed
  buffer is returned in DestinationSize, the size of the scratch buffer is
  returned in ScratchSize, and EFI_SUCCESS is returned.

  The GetInfo() function does not have a scratch buffer available to perform
  a thorough checking of the validity of the source data. It just retrieves
  the 'Original Size' field from the beginning bytes of the source data and
  output it as DestinationSize.  And ScratchSize is specific to the decompression
  implementation.

  @param  This            A pointer to the EFI_DECOMPRESS_PROTOCOL instance.
  @param  Source          The source buffer containing the compressed data.
  @param  SourceSize      The size, in bytes, of source buffer.
  @param  DestinationSize A pointer to the size, in bytes, of the uncompressed buffer
                          that will be generated when the compressed buffer specified
                          by Source and SourceSize is decompressed.
  @param  ScratchSize     A pointer to the size, in bytes, of the scratch buffer that
                          is required to decompress the compressed buffer specified by
                          Source and SourceSize.

  @retval  EFI_SUCCESS           The size of the uncompressed data was returned in DestinationSize
                                 and the size of the scratch buffer was returned in ScratchSize.
  @retval  EFI_INVALID_PARAMETER The size of the uncompressed data or the size of the scratch
                                 buffer cannot be determined from the compressed data specified by
                                 Source and SourceData.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_DECOMPRESS_GET_INFO)(
  IN EFI_DECOMPRESS_PROTOCOL            *This,
  IN   VOID                             *Source,
  IN   UINT32                           SourceSize,
  OUT  UINT32                           *DestinationSize,
  OUT  UINT32                           *ScratchSize
  );

/**
  The Decompress() function extracts decompressed data to its original form.

  This protocol is designed so that the decompression algorithm can be
  implemented without using any memory services.  As a result, the
  Decompress() function is not allowed to call AllocatePool() or
  AllocatePages() in its implementation.  It is the caller's responsibility
  to allocate and free the Destination and Scratch buffers.

  If the compressed source data specified by Source and SourceSize is
  successfully decompressed into Destination, then EFI_SUCCESS is returned.
  If the compressed source data specified by Source and SourceSize is not in
  a valid compressed data format, then EFI_INVALID_PARAMETER is returned.

  @param  This            A pointer to the EFI_DECOMPRESS_PROTOCOL instance.
  @param  Source          The source buffer containing the compressed data.
  @param  SourceSize      The size of source data.
  @param  Destination     On output, the destination buffer that contains
                          the uncompressed data.
  @param  DestinationSize The size of destination buffer. The size of destination
                          buffer needed is obtained from GetInfo().
  @param  Scratch         A temporary scratch buffer that is used to perform the
                          decompression.
  @param  ScratchSize     The size of scratch buffer. The size of scratch buffer needed
                          is obtained from GetInfo().

  @retval  EFI_SUCCESS          Decompression completed successfully, and the uncompressed
                                buffer is returned in Destination.
  @retval EFI_INVALID_PARAMETER The source buffer specified by Source and SourceSize is
                                corrupted (not in a valid compressed format).

**/
typedef
EFI_STATUS
(EFIAPI *EFI_DECOMPRESS_DECOMPRESS)(
  IN EFI_DECOMPRESS_PROTOCOL              *This,
  IN     VOID                             *Source,
  IN     UINT32                           SourceSize,
  IN OUT VOID                             *Destination,
  IN     UINT32                           DestinationSize,
  IN OUT VOID                             *Scratch,
  IN     UINT32                           ScratchSize
  );

///
/// Provides a decompression service.
///
struct _EFI_DECOMPRESS_PROTOCOL {
  EFI_DECOMPRESS_GET_INFO      GetInfo;
  EFI_DECOMPRESS_DECOMPRESS    Decompress;
};

extern EFI_GUID  gEfiDecompressProtocolGuid;

#endif
