| /** @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 |