/** @file
  Header file for IDE Bus Driver, containing the helper functions'
  entire prototype.

  Copyright (c) 2006 - 2007 Intel Corporation. <BR>
  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.

  @par Revision Reference:
  2002-6: Add Atapi6 enhancement, support >120GB hard disk, including
  Add - IDEBlkIoReadBlocksExt() func definition
  Add - IDEBlkIoWriteBlocksExt() func definition

**/

#ifndef _IDE_H_
#define _IDE_H_

//
// Helper functions Prototype
//
/**
  TODO: Add function description

  @param  This TODO: add argument description
  @param  Controller TODO: add argument description
  @param  Handle TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
DeRegisterIdeDevice (
  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,
  IN  EFI_HANDLE                     Controller,
  IN  EFI_HANDLE                     Handle
  );

/**
  TODO: Add function description

  @param  Controller TODO: add argument description
  @param  PciIo TODO: add argument description
  @param  ParentDevicePath TODO: add argument description
  @param  RemainingDevicePath TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
EnableIdeDevice (
  IN EFI_HANDLE                          Controller,
  IN EFI_PCI_IO_PROTOCOL                 *PciIo,
  IN EFI_DEVICE_PATH_PROTOCOL            *ParentDevicePath,
  IN EFI_DEVICE_PATH_PROTOCOL            *RemainingDevicePath
  );

/**
  TODO: Add function description

  @param  PciIo TODO: add argument description
  @param  Port TODO: add argument description

  TODO: add return values.

**/
UINT8
IDEReadPortB (
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT16                Port
  );

/**
  TODO: Add function description

  @param  PciIo TODO: add argument description
  @param  Port TODO: add argument description
  @param  Count TODO: add argument description
  @param  Buffer TODO: add argument description

  TODO: add return values.

**/
VOID
IDEReadPortWMultiple (
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT16                Port,
  IN  UINTN                 Count,
  OUT  VOID                 *Buffer
  );

/**
  TODO: Add function description

  @param  PciIo TODO: add argument description
  @param  Port TODO: add argument description
  @param  Data TODO: add argument description

  TODO: add return values.

**/
VOID
IDEWritePortB (
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT16                Port,
  IN  UINT8                 Data
  );

/**
  TODO: Add function description

  @param  PciIo TODO: add argument description
  @param  Port TODO: add argument description
  @param  Data TODO: add argument description

  TODO: add return values.

**/
VOID
IDEWritePortW (
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT16                Port,
  IN  UINT16                Data
  );

/**
  TODO: Add function description

  @param  PciIo TODO: add argument description
  @param  Port TODO: add argument description
  @param  Count TODO: add argument description
  @param  Buffer TODO: add argument description

  TODO: add return values.

**/
VOID
IDEWritePortWMultiple (
  IN  EFI_PCI_IO_PROTOCOL   *PciIo,
  IN  UINT16                Port,
  IN  UINTN                 Count,
  IN  VOID                  *Buffer
  );

/**
  TODO: Add function description

  @param  PciIo TODO: add argument description
  @param  IdeRegsBaseAddr TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
GetIdeRegistersBaseAddr (
  IN  EFI_PCI_IO_PROTOCOL         *PciIo,
  OUT IDE_REGISTERS_BASE_ADDR     *IdeRegsBaseAddr
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
ReassignIdeResources (
  IN  IDE_BLK_IO_DEV  *IdeDev
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
DiscoverIdeDevice (
  IN IDE_BLK_IO_DEV *IdeDev
  );

/**
  This interface is used to initialize all state data related to the
  detection of one channel.

  @retval EFI_SUCCESS Completed successfully.

**/
EFI_STATUS
InitializeIDEChannelData (
  VOID
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
DetectIDEController (
  IN  IDE_BLK_IO_DEV  *IdeDev
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  TimeoutInMilliSeconds TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
DRQClear (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  UINTN           TimeoutInMilliSeconds
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  TimeoutInMilliSeconds TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
DRQClear2 (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  UINTN           TimeoutInMilliSeconds
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  TimeoutInMilliSeconds TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
DRQReady (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  UINTN           TimeoutInMilliSeconds
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  TimeoutInMilliSeconds TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
DRQReady2 (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  UINTN           TimeoutInMilliSeconds
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  TimeoutInMilliSeconds TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
WaitForBSYClear (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  UINTN           TimeoutInMilliSeconds
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  TimeoutInMilliSeconds TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
WaitForBSYClear2 (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  UINTN           TimeoutInMilliSeconds
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  DelayInMilliSeconds TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
DRDYReady (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  UINTN           DelayInMilliSeconds
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  DelayInMilliSeconds TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
DRDYReady2 (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  UINTN           DelayInMilliSeconds
  );

/**
  TODO: Add function description

  @param  Destination TODO: add argument description
  @param  Source TODO: add argument description
  @param  Size TODO: add argument description

  TODO: add return values.

**/
VOID
SwapStringChars (
  IN CHAR8  *Destination,
  IN CHAR8  *Source,
  IN UINT32 Size
  );

//
//  ATA device functions' prototype
//
/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
ATAIdentify (
  IN  IDE_BLK_IO_DEV  *IdeDev
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description

  TODO: add return values.

**/
VOID
PrintAtaModuleName (
  IN  IDE_BLK_IO_DEV  *IdeDev
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  Buffer TODO: add argument description
  @param  ByteCount TODO: add argument description
  @param  AtaCommand TODO: add argument description
  @param  Head TODO: add argument description
  @param  SectorCount TODO: add argument description
  @param  SectorNumber TODO: add argument description
  @param  CylinderLsb TODO: add argument description
  @param  CylinderMsb TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaPioDataIn (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  VOID            *Buffer,
  IN  UINT32          ByteCount,
  IN  UINT8           AtaCommand,
  IN  UINT8           Head,
  IN  UINT8           SectorCount,
  IN  UINT8           SectorNumber,
  IN  UINT8           CylinderLsb,
  IN  UINT8           CylinderMsb
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  Buffer TODO: add argument description
  @param  ByteCount TODO: add argument description
  @param  AtaCommand TODO: add argument description
  @param  Head TODO: add argument description
  @param  SectorCount TODO: add argument description
  @param  SectorNumber TODO: add argument description
  @param  CylinderLsb TODO: add argument description
  @param  CylinderMsb TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaPioDataOut (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  VOID            *Buffer,
  IN  UINT32          ByteCount,
  IN  UINT8           AtaCommand,
  IN  UINT8           Head,
  IN  UINT8           SectorCount,
  IN  UINT8           SectorNumber,
  IN  UINT8           CylinderLsb,
  IN  UINT8           CylinderMsb
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
CheckErrorStatus (
  IN  IDE_BLK_IO_DEV  *IdeDev
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  DataBuffer TODO: add argument description
  @param  Lba TODO: add argument description
  @param  NumberOfBlocks TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaReadSectors (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  VOID            *DataBuffer,
  IN  EFI_LBA         Lba,
  IN  UINTN           NumberOfBlocks
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  BufferData TODO: add argument description
  @param  Lba TODO: add argument description
  @param  NumberOfBlocks TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaWriteSectors (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  VOID            *BufferData,
  IN  EFI_LBA         Lba,
  IN  UINTN           NumberOfBlocks
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaSoftReset (
  IN  IDE_BLK_IO_DEV  *IdeDev
  );

/**
  TODO: Add function description

  @param  IdeBlkIoDevice TODO: add argument description
  @param  MediaId TODO: add argument description
  @param  LBA TODO: add argument description
  @param  BufferSize TODO: add argument description
  @param  Buffer TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaBlkIoReadBlocks (
  IN IDE_BLK_IO_DEV   *IdeBlkIoDevice,
  IN UINT32           MediaId,
  IN EFI_LBA          LBA,
  IN UINTN            BufferSize,
  OUT VOID            *Buffer
  );

/**
  TODO: Add function description

  @param  IdeBlkIoDevice TODO: add argument description
  @param  MediaId TODO: add argument description
  @param  LBA TODO: add argument description
  @param  BufferSize TODO: add argument description
  @param  Buffer TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaBlkIoWriteBlocks (
  IN IDE_BLK_IO_DEV   *IdeBlkIoDevice,
  IN UINT32           MediaId,
  IN EFI_LBA          LBA,
  IN UINTN            BufferSize,
  OUT VOID            *Buffer
  );

//
// ATAPI device functions' prototype
//
/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
ATAPIIdentify (
  IN  IDE_BLK_IO_DEV  *IdeDev
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtapiInquiry (
  IN  IDE_BLK_IO_DEV  *IdeDev
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  Packet TODO: add argument description
  @param  Buffer TODO: add argument description
  @param  ByteCount TODO: add argument description
  @param  TimeOut TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtapiPacketCommandIn (
  IN  IDE_BLK_IO_DEV        *IdeDev,
  IN  ATAPI_PACKET_COMMAND  *Packet,
  IN  UINT16                *Buffer,
  IN  UINT32                ByteCount,
  IN  UINTN                 TimeOut
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  Packet TODO: add argument description
  @param  Buffer TODO: add argument description
  @param  ByteCount TODO: add argument description
  @param  TimeOut TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtapiPacketCommandOut (
  IN  IDE_BLK_IO_DEV        *IdeDev,
  IN  ATAPI_PACKET_COMMAND  *Packet,
  IN  UINT16                *Buffer,
  IN  UINT32                ByteCount,
  IN  UINTN                 TimeOut
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  Buffer TODO: add argument description
  @param  ByteCount TODO: add argument description
  @param  Read TODO: add argument description
  @param  TimeOut TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
PioReadWriteData (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  UINT16          *Buffer,
  IN  UINT32          ByteCount,
  IN  BOOLEAN         Read,
  IN  UINTN           TimeOut
  );

/**
  TODO: Add function description

  @param  IdeDev  TODO: add argument description
  @param  SResult TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtapiTestUnitReady (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  OUT SENSE_RESULT	  *SResult  
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  SenseCounts TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtapiRequestSense (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  OUT UINTN           *SenseCounts
  );

/**
  TODO: Add function description

  @param  IdeDev  TODO: add argument description
  @param  SResult TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtapiReadCapacity (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  OUT SENSE_RESULT	  *SResult  
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  MediaChange TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtapiDetectMedia (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  OUT BOOLEAN         *MediaChange
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  Buffer TODO: add argument description
  @param  Lba TODO: add argument description
  @param  NumberOfBlocks TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtapiReadSectors (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  VOID            *Buffer,
  IN  EFI_LBA         Lba,
  IN  UINTN           NumberOfBlocks
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  Buffer TODO: add argument description
  @param  Lba TODO: add argument description
  @param  NumberOfBlocks TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtapiWriteSectors (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  VOID            *Buffer,
  IN  EFI_LBA         Lba,
  IN  UINTN           NumberOfBlocks
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtapiSoftReset (
  IN  IDE_BLK_IO_DEV  *IdeDev
  );

/**
  TODO: Add function description

  @param  IdeBlkIoDevice TODO: add argument description
  @param  MediaId TODO: add argument description
  @param  LBA TODO: add argument description
  @param  BufferSize TODO: add argument description
  @param  Buffer TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtapiBlkIoReadBlocks (
  IN IDE_BLK_IO_DEV   *IdeBlkIoDevice,
  IN UINT32           MediaId,
  IN EFI_LBA          LBA,
  IN UINTN            BufferSize,
  OUT VOID            *Buffer
  );

/**
  TODO: Add function description

  @param  IdeBlkIoDevice TODO: add argument description
  @param  MediaId TODO: add argument description
  @param  LBA TODO: add argument description
  @param  BufferSize TODO: add argument description
  @param  Buffer TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtapiBlkIoWriteBlocks (
  IN IDE_BLK_IO_DEV   *IdeBlkIoDevice,
  IN UINT32           MediaId,
  IN EFI_LBA          LBA,
  IN UINTN            BufferSize,
  OUT VOID            *Buffer
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  SenseCount TODO: add argument description
  @param  Result TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
ParseSenseData (
  IN IDE_BLK_IO_DEV     *IdeDev,
  IN UINTN              SenseCount,
  OUT SENSE_RESULT      *Result
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtapiReadPendingData (
  IN IDE_BLK_IO_DEV     *IdeDev
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  WriteProtected TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
IsLS120orZipWriteProtected (
  IN  IDE_BLK_IO_DEV    *IdeDev,
  OUT BOOLEAN           *WriteProtected
  );

/**
  TODO: Add function description

  @param  IdeBlkIoDevice TODO: add argument description

  TODO: add return values.

**/
VOID
ReleaseIdeResources (
  IN  IDE_BLK_IO_DEV  *IdeBlkIoDevice
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  TransferMode TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
SetDeviceTransferMode (
  IN IDE_BLK_IO_DEV       *IdeDev,
  IN ATA_TRANSFER_MODE    *TransferMode
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  NativeMaxAddress TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
ReadNativeMaxAddress (
  IN  IDE_BLK_IO_DEV                *IdeDev,
  OUT EFI_LBA                       *NativeMaxAddress
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  MaxAddress TODO: add argument description
  @param  bVolatile TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
SetMaxAddress (
  IN  IDE_BLK_IO_DEV                *IdeDev,
  IN  EFI_LBA                       MaxAddress,
  IN  BOOLEAN                       bVolatile
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  AtaCommand TODO: add argument description
  @param  Device TODO: add argument description
  @param  Feature TODO: add argument description
  @param  SectorCount TODO: add argument description
  @param  LbaLow TODO: add argument description
  @param  LbaMiddle TODO: add argument description
  @param  LbaHigh TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaNonDataCommandIn (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  UINT8           AtaCommand,
  IN  UINT8           Device,
  IN  UINT8           Feature,
  IN  UINT8           SectorCount,
  IN  UINT8           LbaLow,
  IN  UINT8           LbaMiddle,
  IN  UINT8           LbaHigh
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  AtaCommand TODO: add argument description
  @param  Device TODO: add argument description
  @param  Feature TODO: add argument description
  @param  SectorCount TODO: add argument description
  @param  LbaAddress TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaNonDataCommandInExt (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  UINT8           AtaCommand,
  IN  UINT8           Device,
  IN  UINT16          Feature,
  IN  UINT16          SectorCount,
  IN  EFI_LBA         LbaAddress
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  DataBuffer TODO: add argument description
  @param  StartLba TODO: add argument description
  @param  NumberOfBlocks TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaReadSectorsExt (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  VOID            *DataBuffer,
  IN  EFI_LBA         StartLba,
  IN  UINTN           NumberOfBlocks
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  DataBuffer TODO: add argument description
  @param  StartLba TODO: add argument description
  @param  NumberOfBlocks TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaWriteSectorsExt (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  VOID            *DataBuffer,
  IN  EFI_LBA         StartLba,
  IN  UINTN           NumberOfBlocks
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  DataBuffer TODO: add argument description
  @param  StartLba TODO: add argument description
  @param  NumberOfBlocks TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaUdmaReadExt (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  VOID            *DataBuffer,
  IN  EFI_LBA         StartLba,
  IN  UINTN           NumberOfBlocks
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  DataBuffer TODO: add argument description
  @param  StartLba TODO: add argument description
  @param  NumberOfBlocks TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaUdmaRead (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  VOID            *DataBuffer,
  IN  EFI_LBA         StartLba,
  IN  UINTN           NumberOfBlocks
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  DataBuffer TODO: add argument description
  @param  StartLba TODO: add argument description
  @param  NumberOfBlocks TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaUdmaWriteExt (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  VOID            *DataBuffer,
  IN  EFI_LBA         StartLba,
  IN  UINTN           NumberOfBlocks
  );

/**
  Perform an ATA Udma operation (Read, ReadExt, Write, WriteExt).
  
  @param[in] *IdeDev
  pointer pointing to IDE_BLK_IO_DEV data structure, used
  to record all the information of the IDE device.

  @param[in] *DataBuffer
  A pointer to the source buffer for the data.

  @param[in] StartLba
  The starting logical block address to write to
  on the device media.

  @param[in] NumberOfBlocks
  The number of transfer data blocks.
  
  @param[in] UdmaOp
  The perform operations could be AtaUdmaReadOp, AtaUdmaReadExOp,
  AtaUdmaWriteOp, AtaUdmaWriteExOp

  @return The device status of UDMA operation. If the operation is
  successful, return EFI_SUCCESS.

**/
EFI_STATUS
DoAtaUdma (
  IN  IDE_BLK_IO_DEV      *IdeDev,
  IN  VOID                *DataBuffer,
  IN  EFI_LBA             StartLba,
  IN  UINTN               NumberOfBlocks,
  IN  ATA_UDMA_OPERATION  UdmaOp
  );


/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  DataBuffer TODO: add argument description
  @param  StartLba TODO: add argument description
  @param  NumberOfBlocks TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaUdmaWrite (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  VOID            *DataBuffer,
  IN  EFI_LBA         StartLba,
  IN  UINTN           NumberOfBlocks
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  AtaCommand TODO: add argument description
  @param  Device TODO: add argument description
  @param  Feature TODO: add argument description
  @param  SectorCount TODO: add argument description
  @param  LbaAddress TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaCommandIssueExt (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  UINT8           AtaCommand,
  IN  UINT8           Device,
  IN  UINT16          Feature,
  IN  UINT16          SectorCount,
  IN  EFI_LBA         LbaAddress
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  AtaCommand TODO: add argument description
  @param  Device TODO: add argument description
  @param  Feature TODO: add argument description
  @param  SectorCount TODO: add argument description
  @param  LbaAddress TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaCommandIssue (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  UINT8           AtaCommand,
  IN  UINT8           Device,
  IN  UINT16          Feature,
  IN  UINT16          SectorCount,
  IN  EFI_LBA         LbaAddress
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaAtapi6Identify (
  IN  IDE_BLK_IO_DEV  *IdeDev
  );


/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description

  TODO: add return values.

**/
VOID
AtaSMARTSupport (
  IN  IDE_BLK_IO_DEV  *IdeDev
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  Buffer TODO: add argument description
  @param  ByteCount TODO: add argument description
  @param  AtaCommand TODO: add argument description
  @param  StartLba TODO: add argument description
  @param  SectorCount TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaPioDataInExt (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  OUT VOID        *Buffer,
  IN  UINT32          ByteCount,
  IN  UINT8           AtaCommand,
  IN  EFI_LBA         StartLba,
  IN  UINT16          SectorCount
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  Buffer TODO: add argument description
  @param  ByteCount TODO: add argument description
  @param  AtaCommand TODO: add argument description
  @param  StartLba TODO: add argument description
  @param  SectorCount TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
AtaPioDataOutExt (
  IN  IDE_BLK_IO_DEV  *IdeDev,
  IN  VOID            *Buffer,
  IN  UINT32          ByteCount,
  IN  UINT8           AtaCommand,
  IN  EFI_LBA         StartLba,
  IN  UINT16          SectorCount
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description
  @param  DriveParameters TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
SetDriveParameters (
  IN IDE_BLK_IO_DEV       *IdeDev,
  IN ATA_DRIVE_PARMS      *DriveParameters
  );

/**
  TODO: Add function description

  @param  IdeDev TODO: add argument description

  TODO: add return values.

**/
EFI_STATUS
EnableInterrupt (
  IN IDE_BLK_IO_DEV       *IdeDev
  );

/**
  Clear pending IDE interrupt before OS loader/kernel take control of the IDE device.

  @param[in]  Event   Pointer to this event.
  @param[in]  Context Event hanlder private data.

**/
VOID
EFIAPI
ClearInterrupt (
  IN EFI_EVENT  Event,
  IN VOID       *Context
  );

#endif
