/** @file
  Provides decompression services to the PEI Foundatoin.

  Copyright (c) 2006 - 2008, 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 PPI is introduced in PI Version 1.0.

**/

#ifndef __DECOMPRESS_PPI_H__
#define __DECOMPRESS_PPI_H__

#define EFI_PEI_DECOMPRESS_PPI_GUID \
  { 0x1a36e4e7, 0xfab6, 0x476a, { 0x8e, 0x75, 0x69, 0x5a, 0x5, 0x76, 0xfd, 0xd7 } }

typedef struct _EFI_PEI_DECOMPRESS_PPI  EFI_PEI_DECOMPRESS_PPI;

/** 
  Decompress a single compression section in a firmware file.
                                                               
  Decompresses the data in a compressed section and returns it
  as a series of standard PI Firmware File Sections. The
  required memory is allocated from permanent memory.

  @param This                   Points to this instance of the
                                EFI_PEI_DECOMPRESS_PEI PPI.
  @param InputSection           Points to the compressed section.
  @param OutputBuffer           Holds the returned pointer to the
                                decompressed sections.
  @param OutputSize             Holds the returned size of the decompress
                                section streams.

  @retval EFI_SUCCESS           The section was decompressed
                                successfully. OutputBuffer contains the
                                resulting data and OutputSize contains
                                the resulting size.
  @retval EFI_OUT_OF_RESOURCES  Unable to allocate sufficient
                                memory to hold the decompressed data.
  @retval EFI_UNSUPPORTED       The compression type specified
                                in the compression header is unsupported.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_DECOMPRESS_DECOMPRESS)(
  IN  CONST EFI_PEI_DECOMPRESS_PPI  *This,
  IN  CONST EFI_COMPRESSION_SECTION *InputSection,
  OUT VOID                           **OutputBuffer,
  OUT UINTN                          *OutputSize
);


///
/// This PPI's single member function decompresses a compression
/// encapsulated section. It is used by the PEI Foundation to
/// process sectioned files. Prior to the installation of this PPI,
/// compression sections will be ignored.
///
struct _EFI_PEI_DECOMPRESS_PPI {
  EFI_PEI_DECOMPRESS_DECOMPRESS Decompress;
};


extern EFI_GUID   gEfiPeiDecompressPpiGuid;

#endif
