#ifndef _PIFLASH64_H
#define _PIFLASH64_H

/*++

Copyright (c) 1999  Intel Corporation

Module Name:

    PIflash64.h
    
Abstract:

    Iflash64.efi protocol to abstract iflash from
    the system.

Revision History

--*/

/* 
 *  Guid that identifies the IFLASH protocol
 */
#define IFLASH64_PROTOCOL_PROTOCOL \
    { 0x65cba110, 0x74ab, 0x11d3, 0xbb, 0x89, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 };

/* 
 *  Unlock FLASH from StartAddress to EndAddress and return a LockKey
 */
typedef
EFI_STATUS
(EFIAPI *UNLOCK_FLASH_API)(
    IN struct _IFLASH64_PROTOCOL_INTERFACE  *This
    );

/* 
 *  Lock the flash represented by the LockKey
 */
typedef
EFI_STATUS
(EFIAPI *LOCK_FLASH_API)(
    IN struct _IFLASH64_PROTOCOL_INTERFACE  *This
    );

/* 
 *  Status callback for a utility like IFLASH64
 * 
 *   Token would map to a list like Ted proposed. The utility has no idea what 
 *       happens on the other side.
 *   ErrorStatus - Level of Error or success. Independent of Token. If you 
 *       don't know the token you will at least know pass or fail.
 *   String - Optional extra information about the error. Could be used for 
 *       debug or future expansion
 * 
 *   Attributes - Options screen attributes for String. Could allow the string to be different colors.
 */
typedef
EFI_STATUS
(EFIAPI *UTILITY_PROGRESS_API)(
    IN struct _IFLASH64_PROTOCOL_INTERFACE  *This,
    IN  UINTN                               Token,
    IN  EFI_STATUS                          ErrorStatus, 
    IN  CHAR16                              *String,    OPTIONAL
    IN  UINTN                               *Attributes OPTIONAL
    );

/* 
 *  Token Values
 * 
 *  IFlash64 Token Codes */
#define IFLASH_TOKEN_IFLASHSTART    0xB0                /*  IFlash64 has started */
#define IFLASH_TOKEN_READINGFILE    0xB1                /*  Reading File */
#define IFLASH_TOKEN_INITVPP        0xB2                /*  Initializing Vpp */
#define IFLASH_TOKEN_DISABLEVPP     0x10                /*  Disable Vpp */
#define IFLASH_TOKEN_FLASHUNLOCK    0xB3                /*  Unlocking FLASH Devices */
#define IFLASH_TOKEN_FLASHERASE     0xB4                /*  Erasing FLASH Devices */
#define IFLASH_TOKEN_FLASHPROGRAM   0xB5                /*  Programming FLASH */
#define IFLASH_TOKEN_FLASHVERIFY    0xB6                /*  Verifying FLASH */
#define IFLASH_TOKEN_UPDATESUCCES   0xB7                /*  FLASH Updage Success! */

#define IFLASH_TOKEN_PROGRESS_READINGFILE   0x11        /*  % Reading File */
#define IFLASH_TOKEN_PROGRESS_FLASHUNLOCK   0x13        /*  % Unlocking FLASH Devices */
#define IFLASH_TOKEN_PROGRESS_FLASHERASE    0x14        /*  % Erasing FLASH Devices */
#define IFLASH_TOKEN_PROGRESS_FLASHPROGRAM  0x15        /*  % Programming FLASH */
#define IFLASH_TOKEN_PROGRESS_FLASHVERIFY   0x16        /*  % Verifying FLASH */

#define IFLASH_TOKEN_READINGFILE_ER 0xB8                /*  File Read Error */
#define IFLASH_TOKEN_INITVPP_ER     0xB9                /*  Initialization of IFB Error */
#define IFLASH_TOKEN_FLASHUNLOCK_ER 0xBA                /*  FLASH Unlock Error */
#define IFLASH_TOKEN_FLASHERASE_ER  0xBB                /*  FLASH Erase Error */
#define IFLASH_TOKEN_FLASHVERIFY_ER 0xBC                /*  FLASH Verify Error */
#define IFLASH_TOKEN_FLASHPROG_ER   0xBD                /*  FLASH Program Error */

#define IFLASH_TABLE_END            0x00

/* 
 *  If this number changes one of the existing API's has changes
 */
#define IFLASH_PI_MAJOR_VERSION 0x01

/* 
 *  This number changes when new APIs or data variables get added to the end
 *   of the data structure
 */
#define IFLASH_PI_MINOR_VERSION 0x01

typedef struct _IFLASH64_PROTOCOL_INTERFACE {
    UINT32                  MajorVersion;       
    UINT32                  MinorVersion;   
    UNLOCK_FLASH_API        UnlockFlash;
    LOCK_FLASH_API          LockFlash;
    UTILITY_PROGRESS_API    Progress;
    
    /* 
     *  Future expansion goes here
     */

} IFLASH64_PROTOCOL_INTERFACE;


#endif
