git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10414 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			836 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			836 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Header file for IDE Bus Driver, containing the helper functions'
 | |
|   prototype.
 | |
| 
 | |
|   Copyright (c) 2006 - 2007, 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:
 | |
|   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
 | |
| //
 | |
| /**
 | |
|   read a one-byte data from a IDE port.
 | |
| 
 | |
|   @param  PciIo  The PCI IO protocol instance
 | |
|   @param  Port   the IDE Port number 
 | |
| 
 | |
|   return  the one-byte data read from IDE port
 | |
| **/
 | |
| UINT8
 | |
| IDEReadPortB (
 | |
|   IN  EFI_PCI_IO_PROTOCOL   *PciIo,
 | |
|   IN  UINT16                Port
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Reads multiple words of data from the IDE data port.
 | |
|   Call the IO abstraction once to do the complete read,
 | |
|   not one word at a time.
 | |
| 
 | |
|   @param  PciIo Pointer to the EFI_PCI_IO instance
 | |
|   @param  Port IO port to read
 | |
|   @param  Count No. of UINT16's to read
 | |
|   @param  Buffer Pointer to the data buffer for read
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| IDEReadPortWMultiple (
 | |
|   IN  EFI_PCI_IO_PROTOCOL   *PciIo,
 | |
|   IN  UINT16                Port,
 | |
|   IN  UINTN                 Count,
 | |
|   OUT  VOID                 *Buffer
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   write a 1-byte data to a specific IDE port.
 | |
| 
 | |
|   @param  PciIo  PCI IO protocol instance
 | |
|   @param  Port   The IDE port to be writen
 | |
|   @param  Data   The data to write to the port
 | |
| **/
 | |
| VOID
 | |
| IDEWritePortB (
 | |
|   IN  EFI_PCI_IO_PROTOCOL   *PciIo,
 | |
|   IN  UINT16                Port,
 | |
|   IN  UINT8                 Data
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   write a 1-word data to a specific IDE port.
 | |
| 
 | |
|   @param  PciIo  PCI IO protocol instance
 | |
|   @param  Port   The IDE port to be writen
 | |
|   @param  Data   The data to write to the port
 | |
| **/
 | |
| VOID
 | |
| IDEWritePortW (
 | |
|   IN  EFI_PCI_IO_PROTOCOL   *PciIo,
 | |
|   IN  UINT16                Port,
 | |
|   IN  UINT16                Data
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Write multiple words of data to the IDE data port.
 | |
|   Call the IO abstraction once to do the complete read,
 | |
|   not one word at a time.
 | |
| 
 | |
|   @param  PciIo Pointer to the EFI_PCI_IO instance
 | |
|   @param  Port IO port to read
 | |
|   @param  Count No. of UINT16's to read
 | |
|   @param  Buffer Pointer to the data buffer for read
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| IDEWritePortWMultiple (
 | |
|   IN  EFI_PCI_IO_PROTOCOL   *PciIo,
 | |
|   IN  UINT16                Port,
 | |
|   IN  UINTN                 Count,
 | |
|   IN  VOID                  *Buffer
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Get IDE IO port registers' base addresses by mode. In 'Compatibility' mode,
 | |
|   use fixed addresses. In Native-PCI mode, get base addresses from BARs in
 | |
|   the PCI IDE controller's Configuration Space.
 | |
| 
 | |
|   The steps to get IDE IO port registers' base addresses for each channel
 | |
|   as follows:
 | |
| 
 | |
|   1. Examine the Programming Interface byte of the Class Code fields in PCI IDE
 | |
|   controller's Configuration Space to determine the operating mode.
 | |
| 
 | |
|   2. a) In 'Compatibility' mode, use fixed addresses shown in the Table 1 below.
 | |
|   <pre>
 | |
|   ___________________________________________
 | |
|   |           | Command Block | Control Block |
 | |
|   |  Channel  |   Registers   |   Registers   |
 | |
|   |___________|_______________|_______________|
 | |
|   |  Primary  |  1F0h - 1F7h  |  3F6h - 3F7h  |
 | |
|   |___________|_______________|_______________|
 | |
|   | Secondary |  170h - 177h  |  376h - 377h  |
 | |
|   |___________|_______________|_______________|
 | |
| 
 | |
|   Table 1. Compatibility resource mappings
 | |
|   </pre>
 | |
| 
 | |
|   b) In Native-PCI mode, IDE registers are mapped into IO space using the BARs
 | |
|   in IDE controller's PCI Configuration Space, shown in the Table 2 below.
 | |
|   <pre>
 | |
|   ___________________________________________________
 | |
|   |           |   Command Block   |   Control Block   |
 | |
|   |  Channel  |     Registers     |     Registers     |
 | |
|   |___________|___________________|___________________|
 | |
|   |  Primary  | BAR at offset 0x10| BAR at offset 0x14|
 | |
|   |___________|___________________|___________________|
 | |
|   | Secondary | BAR at offset 0x18| BAR at offset 0x1C|
 | |
|   |___________|___________________|___________________|
 | |
| 
 | |
|   Table 2. BARs for Register Mapping
 | |
|   </pre>
 | |
|   @note Refer to Intel ICH4 datasheet, Control Block Offset: 03F4h for
 | |
|   primary, 0374h for secondary. So 2 bytes extra offset should be
 | |
|   added to the base addresses read from BARs.
 | |
| 
 | |
|   For more details, please refer to PCI IDE Controller Specification and Intel
 | |
|   ICH4 Datasheet.
 | |
| 
 | |
|   @param  PciIo Pointer to the EFI_PCI_IO_PROTOCOL instance
 | |
|   @param  IdeRegsBaseAddr Pointer to IDE_REGISTERS_BASE_ADDR to
 | |
|           receive IDE IO port registers' base addresses
 | |
|   
 | |
|   @retval EFI_UNSUPPORTED return this value when the BARs is not IO type
 | |
|   @retval EFI_SUCCESS     Get the Base address successfully
 | |
|   @retval other           read the pci configureation data error
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| GetIdeRegistersBaseAddr (
 | |
|   IN  EFI_PCI_IO_PROTOCOL         *PciIo,
 | |
|   OUT IDE_REGISTERS_BASE_ADDR     *IdeRegsBaseAddr
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to requery IDE resources. The IDE controller will
 | |
|   probably switch between native and legacy modes during the EFI->CSM->OS
 | |
|   transfer. We do this everytime before an BlkIo operation to ensure its
 | |
|   succeess.
 | |
| 
 | |
|   @param  IdeDev The BLK_IO private data which specifies the IDE device
 | |
| 
 | |
|   @retval EFI_INVALID_PARAMETER return this value when the channel is invalid
 | |
|   @retval EFI_SUCCESS           reassign the IDE IO resource successfully
 | |
|   @retval other                 get the IDE current base address effor
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| ReassignIdeResources (
 | |
|   IN  IDE_BLK_IO_DEV  *IdeDev
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Detect if there is disk attached to this port.
 | |
| 
 | |
|   @param  IdeDev The BLK_IO private data which specifies the IDE device.
 | |
|   
 | |
|   @retval EFI_NOT_FOUND   The device or channel is not found
 | |
|   @retval EFI_SUCCESS     The device is found
 | |
| 
 | |
| **/
 | |
| 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.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| InitializeIDEChannelData (
 | |
|   VOID
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to poll for the DRQ bit clear in the Status
 | |
|   Register. DRQ is cleared when the device is finished transferring data.
 | |
|   So this function is called after data transfer is finished.
 | |
| 
 | |
|   @param IdeDev                 pointer pointing to IDE_BLK_IO_DEV data structure, used 
 | |
|                                 to record all the information of the IDE device.
 | |
|   @param TimeoutInMilliSeconds  used to designate the timeout for the DRQ clear.
 | |
| 
 | |
|   @retval EFI_SUCCESS           DRQ bit clear within the time out.
 | |
| 
 | |
|   @retval EFI_TIMEOUT           DRQ bit not clear within the time out.
 | |
| 
 | |
|   @note
 | |
|   Read Status Register will clear interrupt status.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| DRQClear (
 | |
|   IN  IDE_BLK_IO_DEV  *IdeDev,
 | |
|   IN  UINTN           TimeoutInMilliSeconds
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to poll for the DRQ bit clear in the Alternate
 | |
|   Status Register. DRQ is cleared when the device is finished
 | |
|   transferring data. So this function is called after data transfer
 | |
|   is finished.
 | |
| 
 | |
|   @param IdeDev                pointer pointing to IDE_BLK_IO_DEV data structure, used 
 | |
|                                to record all the information of the IDE device.
 | |
| 
 | |
|   @param TimeoutInMilliSeconds used to designate the timeout for the DRQ clear.
 | |
| 
 | |
|   @retval EFI_SUCCESS          DRQ bit clear within the time out.
 | |
| 
 | |
|   @retval EFI_TIMEOUT          DRQ bit not clear within the time out.
 | |
|   @note
 | |
|   Read Alternate Status Register will not clear interrupt status.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| DRQClear2 (
 | |
|   IN  IDE_BLK_IO_DEV  *IdeDev,
 | |
|   IN  UINTN           TimeoutInMilliSeconds
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to poll for the DRQ bit set in the
 | |
|   Status Register.
 | |
|   DRQ is set when the device is ready to transfer data. So this function
 | |
|   is called after the command is sent to the device and before required
 | |
|   data is transferred.
 | |
| 
 | |
|   @param IdeDev                pointer pointing to IDE_BLK_IO_DEV data structure,used to
 | |
|                                record all the information of the IDE device.
 | |
|   @param TimeoutInMilliSeconds used to designate the timeout for the DRQ ready.
 | |
| 
 | |
|   @retval EFI_SUCCESS          DRQ bit set within the time out.
 | |
|   @retval EFI_TIMEOUT          DRQ bit not set within the time out.
 | |
|   @retval EFI_ABORTED          DRQ bit not set caused by the command abort.
 | |
| 
 | |
|   @note  Read Status Register will clear interrupt status.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| DRQReady (
 | |
|   IN  IDE_BLK_IO_DEV  *IdeDev,
 | |
|   IN  UINTN           TimeoutInMilliSeconds
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to poll for the DRQ bit set in the Alternate Status Register.
 | |
|   DRQ is set when the device is ready to transfer data. So this function is called after 
 | |
|   the command is sent to the device and before required data is transferred.
 | |
| 
 | |
|   @param IdeDev                pointer pointing to IDE_BLK_IO_DEV data structure, used to 
 | |
|                                record all the information of the IDE device.
 | |
| 
 | |
|   @param TimeoutInMilliSeconds used to designate the timeout for the DRQ ready.
 | |
| 
 | |
|   @retval EFI_SUCCESS           DRQ bit set within the time out.
 | |
|   @retval EFI_TIMEOUT           DRQ bit not set within the time out.
 | |
|   @retval EFI_ABORTED           DRQ bit not set caused by the command abort.
 | |
|   @note  Read Alternate Status Register will not clear interrupt status.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| DRQReady2 (
 | |
|   IN  IDE_BLK_IO_DEV  *IdeDev,
 | |
|   IN  UINTN           TimeoutInMilliSeconds
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to poll for the BSY bit clear in the Status Register. BSY
 | |
|   is clear when the device is not busy. Every command must be sent after device is not busy.
 | |
| 
 | |
|   @param IdeDev                pointer pointing to IDE_BLK_IO_DEV data structure, used 
 | |
|                                to record all the information of the IDE device.
 | |
|   @param TimeoutInMilliSeconds used to designate the timeout for the DRQ ready.
 | |
| 
 | |
|   @retval EFI_SUCCESS          BSY bit clear within the time out.
 | |
|   @retval EFI_TIMEOUT          BSY bit not clear within the time out.
 | |
| 
 | |
|   @note Read Status Register will clear interrupt status.
 | |
| **/
 | |
| EFI_STATUS
 | |
| WaitForBSYClear (
 | |
|   IN  IDE_BLK_IO_DEV  *IdeDev,
 | |
|   IN  UINTN           TimeoutInMilliSeconds
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to poll for the BSY bit clear in the Alternate Status Register. 
 | |
|   BSY is clear when the device is not busy. Every command must be sent after device is 
 | |
|   not busy.
 | |
| 
 | |
|   @param IdeDev               pointer pointing to IDE_BLK_IO_DEV data structure, used to record 
 | |
|                               all the information of the IDE device.
 | |
|   @param TimeoutInMilliSeconds used to designate the timeout for the DRQ ready.
 | |
| 
 | |
|   @retval EFI_SUCCESS         BSY bit clear within the time out.
 | |
|   @retval EFI_TIMEOUT         BSY bit not clear within the time out.
 | |
|   @note   Read Alternate Status Register will not clear interrupt status.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| WaitForBSYClear2 (
 | |
|   IN  IDE_BLK_IO_DEV  *IdeDev,
 | |
|   IN  UINTN           TimeoutInMilliSeconds
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to poll for the DRDY bit set in the Status Register. DRDY
 | |
|   bit is set when the device is ready to accept command. Most ATA commands must be 
 | |
|   sent after DRDY set except the ATAPI Packet Command.
 | |
| 
 | |
|   @param IdeDev               pointer pointing to IDE_BLK_IO_DEV data structure, used
 | |
|                               to record all the information of the IDE device.
 | |
|   @param DelayInMilliSeconds  used to designate the timeout for the DRQ ready.
 | |
| 
 | |
|   @retval EFI_SUCCESS         DRDY bit set within the time out.
 | |
|   @retval EFI_TIMEOUT         DRDY bit not set within the time out.
 | |
| 
 | |
|   @note  Read Status Register will clear interrupt status.
 | |
| **/
 | |
| EFI_STATUS
 | |
| DRDYReady (
 | |
|   IN  IDE_BLK_IO_DEV  *IdeDev,
 | |
|   IN  UINTN           DelayInMilliSeconds
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to poll for the DRDY bit set in the Alternate Status Register. 
 | |
|   DRDY bit is set when the device is ready to accept command. Most ATA commands must 
 | |
|   be sent after DRDY set except the ATAPI Packet Command.
 | |
| 
 | |
|   @param IdeDev              pointer pointing to IDE_BLK_IO_DEV data structure, used
 | |
|                              to record all the information of the IDE device.
 | |
|   @param DelayInMilliSeconds used to designate the timeout for the DRQ ready.
 | |
| 
 | |
|   @retval EFI_SUCCESS      DRDY bit set within the time out.
 | |
|   @retval EFI_TIMEOUT      DRDY bit not set within the time out.
 | |
| 
 | |
|   @note  Read Alternate Status Register will clear interrupt status.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| DRDYReady2 (
 | |
|   IN  IDE_BLK_IO_DEV  *IdeDev,
 | |
|   IN  UINTN           DelayInMilliSeconds
 | |
|   );
 | |
| 
 | |
| //
 | |
| //  ATA device functions' prototype
 | |
| //
 | |
| /**
 | |
|   Sends out an ATA Identify Command to the specified device.
 | |
| 
 | |
|   This function is called by DiscoverIdeDevice() during its device
 | |
|   identification. It sends out the ATA Identify Command to the
 | |
|   specified device. Only ATA device responses to this command. If
 | |
|   the command succeeds, it returns the Identify data structure which
 | |
|   contains information about the device. This function extracts the
 | |
|   information it needs to fill the IDE_BLK_IO_DEV data structure,
 | |
|   including device type, media block size, media capacity, and etc.
 | |
| 
 | |
|   @param IdeDev  pointer pointing to IDE_BLK_IO_DEV data structure,used to record 
 | |
|                  all the information of the IDE device.
 | |
| 
 | |
|   @retval EFI_SUCCESS      Identify ATA device successfully.
 | |
|   @retval EFI_DEVICE_ERROR ATA Identify Device Command failed or device is not ATA device.
 | |
|   @note  parameter IdeDev will be updated in this function.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| ATAIdentify (
 | |
|   IN  IDE_BLK_IO_DEV  *IdeDev
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is called by ATAIdentify() or ATAPIIdentify() to print device's module name.
 | |
| 
 | |
|   @param  IdeDev   pointer pointing to IDE_BLK_IO_DEV data structure, used to record
 | |
|                    all the information of the IDE device.
 | |
| **/
 | |
| VOID
 | |
| PrintAtaModuleName (
 | |
|   IN  IDE_BLK_IO_DEV  *IdeDev
 | |
|   );
 | |
| /**
 | |
|   This function is used to send out ATA commands conforms to the PIO Data In Protocol.
 | |
| 
 | |
|   @param IdeDev       pointer pointing to IDE_BLK_IO_DEV data structure, used to record 
 | |
|                       all the information of the IDE device.
 | |
|   @param Buffer       buffer contained data transferred from device to host.
 | |
|   @param ByteCount    data size in byte unit of the buffer.
 | |
|   @param AtaCommand   value of the Command Register
 | |
|   @param Head         value of the Head/Device Register
 | |
|   @param SectorCount  value of the Sector Count Register
 | |
|   @param SectorNumber value of the Sector Number Register
 | |
|   @param CylinderLsb  value of the low byte of the Cylinder Register
 | |
|   @param CylinderMsb  value of the high byte of the Cylinder Register
 | |
|   
 | |
|   @retval EFI_SUCCESS      send out the ATA command and device send required data successfully.
 | |
|   @retval EFI_DEVICE_ERROR command sent failed.
 | |
| 
 | |
| **/
 | |
| 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
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to send out ATA commands conforms to the
 | |
|   PIO Data Out Protocol.
 | |
| 
 | |
|   @param IdeDev       pointer pointing to IDE_BLK_IO_DEV data structure, used
 | |
|                       to record all the information of the IDE device.
 | |
|   @param *Buffer      buffer contained data transferred from host to device.
 | |
|   @param ByteCount    data size in byte unit of the buffer.
 | |
|   @param AtaCommand   value of the Command Register
 | |
|   @param Head         value of the Head/Device Register
 | |
|   @param SectorCount  value of the Sector Count Register
 | |
|   @param SectorNumber value of the Sector Number Register
 | |
|   @param CylinderLsb  value of the low byte of the Cylinder Register
 | |
|   @param CylinderMsb  value of the high byte of the Cylinder Register
 | |
| 
 | |
|   @retval EFI_SUCCESS      send out the ATA command and device received required
 | |
|                            data successfully.
 | |
|   @retval EFI_DEVICE_ERROR command sent failed.
 | |
| 
 | |
| **/
 | |
| 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
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to analyze the Status Register and print out
 | |
|   some debug information and if there is ERR bit set in the Status
 | |
|   Register, the Error Register's value is also be parsed and print out.
 | |
| 
 | |
|   @param IdeDev  pointer pointing to IDE_BLK_IO_DEV data structure, used to 
 | |
|                  record all the information of the IDE device.
 | |
| 
 | |
|   @retval EFI_SUCCESS       No err information in the Status Register.
 | |
|   @retval EFI_DEVICE_ERROR  Any err information in the Status Register.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| CheckErrorStatus (
 | |
|   IN  IDE_BLK_IO_DEV  *IdeDev
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to implement the Soft Reset on the specified device. But,
 | |
|   the ATA Soft Reset mechanism is so strong a reset method that it will force 
 | |
|   resetting on both devices connected to the same cable.
 | |
| 
 | |
|   It is called by IdeBlkIoReset(), a interface function of Block
 | |
|   I/O protocol.
 | |
| 
 | |
|   This function can also be used by the ATAPI device to perform reset when
 | |
|   ATAPI Reset command is failed.
 | |
| 
 | |
|   @param IdeDev  pointer pointing to IDE_BLK_IO_DEV data structure, used to record
 | |
|                  all the information of the IDE device.
 | |
|   @retval EFI_SUCCESS       Soft reset completes successfully.
 | |
|   @retval EFI_DEVICE_ERROR  Any step during the reset process is failed.
 | |
| 
 | |
|   @note  The registers initial values after ATA soft reset are different
 | |
|          to the ATA device and ATAPI device.
 | |
| **/
 | |
| EFI_STATUS
 | |
| AtaSoftReset (
 | |
|   IN  IDE_BLK_IO_DEV  *IdeDev
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is the ATA implementation for ReadBlocks in the
 | |
|   Block I/O Protocol interface.
 | |
| 
 | |
|   @param IdeBlkIoDevice Indicates the calling context.
 | |
|   @param MediaId        The media id that the read request is for.
 | |
|   @param Lba            The starting logical block address to read from on the device.
 | |
|   @param BufferSize     The size of the Buffer in bytes. This must be a  multiple
 | |
|                         of the intrinsic block size of the device.
 | |
| 
 | |
|   @param Buffer         A pointer to the destination buffer for the data. The caller
 | |
|                         is responsible for either having implicit or explicit ownership
 | |
|                         of the memory that data is read into.
 | |
| 
 | |
|   @retval EFI_SUCCESS          Read Blocks successfully.
 | |
|   @retval EFI_DEVICE_ERROR     Read Blocks failed.
 | |
|   @retval EFI_NO_MEDIA         There is no media in the device.
 | |
|   @retval EFI_MEDIA_CHANGE     The MediaId is not for the current media.
 | |
|   @retval EFI_BAD_BUFFER_SIZE  The BufferSize parameter is not a multiple of the
 | |
|                                intrinsic block size of the device.
 | |
|   @retval EFI_INVALID_PARAMETER  The read request contains LBAs that are not valid,
 | |
|                                  or the data buffer is not valid.
 | |
| 
 | |
|   @note If Read Block error because of device error, this function will call
 | |
|         AtaSoftReset() function to reset device.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| AtaBlkIoReadBlocks (
 | |
|   IN IDE_BLK_IO_DEV   *IdeBlkIoDevice,
 | |
|   IN UINT32           MediaId,
 | |
|   IN EFI_LBA          Lba,
 | |
|   IN UINTN            BufferSize,
 | |
|   OUT VOID            *Buffer
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is the ATA implementation for WriteBlocks in the
 | |
|   Block I/O Protocol interface.
 | |
| 
 | |
|   @param IdeBlkIoDevice  Indicates the calling context.
 | |
|   @param MediaId         The media id that the write request is for.
 | |
|   @param Lba             The starting logical block address to write onto the device.
 | |
|   @param BufferSize      The size of the Buffer in bytes. This must be a multiple
 | |
|                          of the intrinsic block size of the device.
 | |
|   @param Buffer          A pointer to the source buffer for the data.The caller
 | |
|                          is responsible for either having implicit or explicit 
 | |
|                          ownership of the memory that data is written from.
 | |
| 
 | |
|   @retval EFI_SUCCESS       Write Blocks successfully.
 | |
|   @retval EFI_DEVICE_ERROR  Write Blocks failed.
 | |
|   @retval EFI_NO_MEDIA      There is no media in the device.
 | |
|   @retval EFI_MEDIA_CHANGE  The MediaId is not for the current media.
 | |
| 
 | |
|   @retval EFI_BAD_BUFFER_SIZE   The BufferSize parameter is not a multiple of the
 | |
|                                 intrinsic block size of the device.
 | |
|   @retval EFI_INVALID_PARAMETER The write request contains LBAs that are not valid,
 | |
|                                 or the data buffer is not valid.
 | |
| 
 | |
|   @note If Write Block error because of device error, this function will call
 | |
|         AtaSoftReset() function to reset device.
 | |
| **/
 | |
| EFI_STATUS
 | |
| AtaBlkIoWriteBlocks (
 | |
|   IN IDE_BLK_IO_DEV   *IdeBlkIoDevice,
 | |
|   IN UINT32           MediaId,
 | |
|   IN EFI_LBA          Lba,
 | |
|   IN UINTN            BufferSize,
 | |
|   OUT VOID            *Buffer
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is called by DiscoverIdeDevice() during its device
 | |
|   identification.
 | |
|   Its main purpose is to get enough information for the device media
 | |
|   to fill in the Media data structure of the Block I/O Protocol interface.
 | |
| 
 | |
|   There are 5 steps to reach such objective:
 | |
|   1. Sends out the ATAPI Identify Command to the specified device. 
 | |
|   Only ATAPI device responses to this command. If the command succeeds,
 | |
|   it returns the Identify data structure which filled with information 
 | |
|   about the device. Since the ATAPI device contains removable media, 
 | |
|   the only meaningful information is the device module name.
 | |
|   2. Sends out ATAPI Inquiry Packet Command to the specified device.
 | |
|   This command will return inquiry data of the device, which contains
 | |
|   the device type information.
 | |
|   3. Allocate sense data space for future use. We don't detect the media
 | |
|   presence here to improvement boot performance, especially when CD 
 | |
|   media is present. The media detection will be performed just before
 | |
|   each BLK_IO read/write
 | |
|   
 | |
|   @param IdeDev pointer pointing to IDE_BLK_IO_DEV data structure, used
 | |
|                  to record all the information of the IDE device.
 | |
| 
 | |
|   @retval EFI_SUCCESS       Identify ATAPI device successfully.
 | |
|   @retval EFI_DEVICE_ERROR  ATAPI Identify Device Command failed or device type
 | |
|                             is not supported by this IDE driver.
 | |
|   @retval EFI_OUT_OF_RESOURCES Allocate memory for sense data failed 
 | |
| 
 | |
|   @note   Parameter "IdeDev" will be updated in this function.
 | |
| **/
 | |
| EFI_STATUS
 | |
| ATAPIIdentify (
 | |
|   IN  IDE_BLK_IO_DEV  *IdeDev
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is used to implement the Soft Reset on the specified
 | |
|   ATAPI device. Different from the AtaSoftReset(), here reset is a ATA
 | |
|   Soft Reset Command special for ATAPI device, and it only take effects
 | |
|   on the specified ATAPI device, not on the whole IDE bus.
 | |
|   Since the ATAPI soft reset is needed when device is in exceptional
 | |
|   condition (such as BSY bit is always set ), I think the Soft Reset
 | |
|   command should be sent without waiting for the BSY clear and DRDY
 | |
|   set.
 | |
|   This function is called by IdeBlkIoReset(), 
 | |
|   a interface function of Block I/O protocol.
 | |
| 
 | |
|   @param IdeDev    pointer pointing to IDE_BLK_IO_DEV data structure, used
 | |
|                    to record all the information of the IDE device.
 | |
| 
 | |
|   @retval EFI_SUCCESS      Soft reset completes successfully.
 | |
|   @retval EFI_DEVICE_ERROR Any step during the reset process is failed.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| AtapiSoftReset (
 | |
|   IN  IDE_BLK_IO_DEV  *IdeDev
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is the ATAPI implementation for ReadBlocks in the
 | |
|   Block I/O Protocol interface.
 | |
| 
 | |
|   @param IdeBlkIoDevice Indicates the calling context.
 | |
|   @param MediaId        The media id that the read request is for.
 | |
|   @param Lba            The starting logical block address to read from on the device.
 | |
|   @param BufferSize     The size of the Buffer in bytes. This must be a multiple
 | |
|                         of the intrinsic block size of the device.
 | |
|   @param Buffer         A pointer to the destination buffer for the data. The caller
 | |
|                         is responsible for either having implicit or explicit 
 | |
|                         ownership of the memory that data is read into.
 | |
|   
 | |
|   @retval EFI_SUCCESS           Read Blocks successfully.
 | |
|   @retval EFI_DEVICE_ERROR      Read Blocks failed.
 | |
|   @retval EFI_NO_MEDIA          There is no media in the device.
 | |
|   @retval EFI_MEDIA_CHANGED     The MediaId is not for the current media.
 | |
|   @retval EFI_BAD_BUFFER_SIZE   The BufferSize parameter is not a multiple of the
 | |
|                                 intrinsic block size of the device.
 | |
|   @retval EFI_INVALID_PARAMETER The read request contains LBAs that are not valid,
 | |
|                                 or the data buffer is not valid.
 | |
| **/
 | |
| EFI_STATUS
 | |
| AtapiBlkIoReadBlocks (
 | |
|   IN IDE_BLK_IO_DEV   *IdeBlkIoDevice,
 | |
|   IN UINT32           MediaId,
 | |
|   IN EFI_LBA          Lba,
 | |
|   IN UINTN            BufferSize,
 | |
|   OUT VOID            *Buffer
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function is the ATAPI implementation for WriteBlocks in the
 | |
|   Block I/O Protocol interface.
 | |
| 
 | |
|   @param IdeBlkIoDevice  Indicates the calling context.
 | |
|   @param MediaId         The media id that the write request is for.
 | |
|   @param Lba             The starting logical block address to write onto the device.
 | |
|   @param BufferSize      The size of the Buffer in bytes. This must be a multiple
 | |
|                          of the intrinsic block size of the device.
 | |
|   @param Buffer          A pointer to the source buffer for the data. The caller
 | |
|                          is responsible for either having implicit or explicit ownership
 | |
|                          of the memory that data is written from.
 | |
| 
 | |
|   @retval EFI_SUCCESS            Write Blocks successfully.
 | |
|   @retval EFI_DEVICE_ERROR       Write Blocks failed.
 | |
|   @retval EFI_NO_MEDIA           There is no media in the device.
 | |
|   @retval EFI_MEDIA_CHANGE       The MediaId is not for the current media.
 | |
|   @retval EFI_BAD_BUFFER_SIZE    The BufferSize parameter is not a multiple of the
 | |
|                                  intrinsic block size of the device.  
 | |
|   @retval EFI_INVALID_PARAMETER  The write request contains LBAs that are not valid, 
 | |
|                                  or the data buffer is not valid.
 | |
| 
 | |
|   @retval EFI_WRITE_PROTECTED    The write protected is enabled or the media does not support write
 | |
| **/
 | |
| EFI_STATUS
 | |
| AtapiBlkIoWriteBlocks (
 | |
|   IN IDE_BLK_IO_DEV   *IdeBlkIoDevice,
 | |
|   IN UINT32           MediaId,
 | |
|   IN EFI_LBA          Lba,
 | |
|   IN UINTN            BufferSize,
 | |
|   OUT VOID            *Buffer
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Release resources of an IDE device before stopping it.
 | |
| 
 | |
|   @param IdeBlkIoDevice  Standard IDE device private data structure
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| ReleaseIdeResources (
 | |
|   IN  IDE_BLK_IO_DEV  *IdeBlkIoDevice
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Set the calculated Best transfer mode to a detected device
 | |
| 
 | |
|   @param IdeDev       Standard IDE device private data structure
 | |
|   @param TransferMode The device transfer mode to be set
 | |
|   @return Set transfer mode Command execute status.
 | |
| **/
 | |
| EFI_STATUS
 | |
| SetDeviceTransferMode (
 | |
|   IN IDE_BLK_IO_DEV       *IdeDev,
 | |
|   IN ATA_TRANSFER_MODE    *TransferMode
 | |
|   );
 | |
| /**
 | |
|   Send ATA command into device with NON_DATA protocol.
 | |
| 
 | |
|   @param  IdeDev Standard IDE device private data structure
 | |
|   @param  AtaCommand The ATA command to be sent
 | |
|   @param  Device The value in Device register
 | |
|   @param  Feature The value in Feature register
 | |
|   @param  SectorCount The value in SectorCount register
 | |
|   @param  LbaLow The value in LBA_LOW register
 | |
|   @param  LbaMiddle The value in LBA_MIDDLE register
 | |
|   @param  LbaHigh The value in LBA_HIGH register
 | |
| 
 | |
|   @retval  EFI_SUCCESS Reading succeed
 | |
|   @retval  EFI_ABORTED Command failed
 | |
|   @retval  EFI_DEVICE_ERROR Device status error.
 | |
| 
 | |
| **/
 | |
| 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
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Send ATA Ext command into device with NON_DATA protocol.
 | |
| 
 | |
|   @param  IdeDev Standard IDE device private data structure
 | |
|   @param  AtaCommand The ATA command to be sent
 | |
|   @param  Device The value in Device register
 | |
|   @param  Feature The value in Feature register
 | |
|   @param  SectorCount The value in SectorCount register
 | |
|   @param  LbaAddress The Lba address in 48-bit mode
 | |
| 
 | |
|   @retval  EFI_SUCCESS Reading succeed
 | |
|   @retval  EFI_ABORTED Command failed
 | |
|   @retval  EFI_DEVICE_ERROR Device status error.
 | |
| 
 | |
| **/
 | |
| 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
 | |
|   );
 | |
| /**
 | |
|   Enable Long Physical Sector Feature for ATA device.
 | |
| 
 | |
|   @param   IdeDev  The IDE device data
 | |
| 
 | |
|   @retval  EFI_SUCCESS      The ATA device supports Long Physical Sector feature
 | |
|                             and corresponding fields in BlockIo structure is updated.
 | |
|   @retval  EFI_UNSUPPORTED  The device is not ATA device or Long Physical Sector
 | |
|                             feature is not supported.
 | |
| **/
 | |
| EFI_STATUS
 | |
| AtaEnableLongPhysicalSector (
 | |
|   IN  IDE_BLK_IO_DEV  *IdeDev
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Set drive parameters for devices not support PACKETS command.
 | |
| 
 | |
|   @param IdeDev          Standard IDE device private data structure
 | |
|   @param DriveParameters The device parameters to be set into the disk
 | |
|   @return SetParameters Command execute status.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| SetDriveParameters (
 | |
|   IN IDE_BLK_IO_DEV       *IdeDev,
 | |
|   IN ATA_DRIVE_PARMS      *DriveParameters
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Enable Interrupt on IDE controller.
 | |
| 
 | |
|   @param  IdeDev   Standard IDE device private data structure
 | |
| 
 | |
|   @retval  EFI_SUCCESS Enable Interrupt successfully
 | |
| **/
 | |
| EFI_STATUS
 | |
| EnableInterrupt (
 | |
|   IN IDE_BLK_IO_DEV       *IdeDev
 | |
|   );
 | |
| #endif
 |