/** @file

  FlashMap PPI abstracts access to FlashMap information. 

Copyright (c) 2006 - 2008, Intel Corporation                                                         
All rights reserved. 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.             

**/

#ifndef _PEI_FLASH_MAP_PPI_H_
#define _PEI_FLASH_MAP_PPI_H_

#include <Guid/FlashMapHob.h>

#define PEI_FLASH_MAP_PPI_GUID \
  { 0xf34c2fa0, 0xde88, 0x4270, {0x84, 0x14, 0x96, 0x12, 0x22, 0xf4, 0x52, 0x1c } }

typedef struct _PEI_FLASH_MAP_PPI PEI_FLASH_MAP_PPI;

//
// Functions
//
/**
  Get flash region information.
  
  @param  PeiServices      An indirect pointer to the PEI Services Table published by the PEI Foundation.
  @param  This             Pointer to the FlashMap PPI instance
  @param  AreaType         Flash Area Type
  @param  AreaTypeGuid     Pointer to Guid for Flash Area Type 
  @param  NumEntries       Pointer to the number of entries for the total flash area.
  @param  Entries          Pointer to the entry list. 
   
  @retval EFI_SUCESS       Get flash area information successfully.
  @retval EFI_NOT_FOUND    No flash area information is found.
**/
typedef
EFI_STATUS
(EFIAPI *PEI_GET_FLASH_AREA_INFO)(
  IN  EFI_PEI_SERVICES            **PeiServices,
  IN  PEI_FLASH_MAP_PPI           *This,
  IN  EFI_FLASH_AREA_TYPE         AreaType,
  IN  EFI_GUID                    *AreaTypeGuid,
  OUT UINT32                      *NumEntries,
  OUT EFI_FLASH_SUBAREA_ENTRY     **Entries
  );


struct _PEI_FLASH_MAP_PPI {
  PEI_GET_FLASH_AREA_INFO GetAreaInfo;
};

extern EFI_GUID gPeiFlashMapPpiGuid;

#endif 
