/*++

Copyright (c) 1999 - 2002, 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.


Module Name:

  BlockIo.h

Abstract:

  BlockIo PPI as defined in EFI 2.0

  Used to access block-oriented storage devices

--*/

#ifndef _PEI_BLOCK_IO_H_
#define _PEI_BLOCK_IO_H_

#define PEI_BLOCK_IO_PPI_GUID \
  { \
    0x695d8aa1, 0x42ee, 0x4c46, {0x80, 0x5c, 0x6e, 0xa6, 0xbc, 0xe7, 0x99, 0xe3} \
  }

EFI_FORWARD_DECLARATION (PEI_RECOVERY_BLOCK_IO_INTERFACE);

typedef UINT64  PEI_LBA;

typedef enum {
  LegacyFloppy  = 0,
  IdeCDROM      = 1,
  IdeLS120      = 2,
  UsbMassStorage= 3,
  MaxDeviceType
} PEI_BLOCK_DEVICE_TYPE;

typedef struct {
  PEI_BLOCK_DEVICE_TYPE DeviceType;
  BOOLEAN               MediaPresent;
  UINTN                 LastBlock;
  UINTN                 BlockSize;
} PEI_BLOCK_IO_MEDIA;

typedef
EFI_STATUS
(EFIAPI *PEI_GET_NUMBER_BLOCK_DEVICES) (
  IN  EFI_PEI_SERVICES                         **PeiServices,
  IN PEI_RECOVERY_BLOCK_IO_INTERFACE           * This,
  OUT UINTN                                    *NumberBlockDevices
  );

typedef
EFI_STATUS
(EFIAPI *PEI_GET_DEVICE_MEDIA_INFORMATION) (
  IN  EFI_PEI_SERVICES                         **PeiServices,
  IN PEI_RECOVERY_BLOCK_IO_INTERFACE           * This,
  IN UINTN                                     DeviceIndex,
  OUT PEI_BLOCK_IO_MEDIA                       * MediaInfo
  );

typedef
EFI_STATUS
(EFIAPI *PEI_READ_BLOCKS) (
  IN  EFI_PEI_SERVICES                         **PeiServices,
  IN PEI_RECOVERY_BLOCK_IO_INTERFACE           * This,
  IN UINTN                                     DeviceIndex,
  IN PEI_LBA                                   StartLBA,
  IN UINTN                                     BufferSize,
  OUT VOID                                     *Buffer
  );

struct _PEI_RECOVERY_BLOCK_IO_INTERFACE {
  PEI_GET_NUMBER_BLOCK_DEVICES      GetNumberOfBlockDevices;
  PEI_GET_DEVICE_MEDIA_INFORMATION  GetBlockDeviceMediaInfo;
  PEI_READ_BLOCKS                   ReadBlocks;
};

extern EFI_GUID gPeiBlockIoPpiGuid;

#endif
