mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-26 16:47:40 +01:00
853 lines
30 KiB
C
853 lines
30 KiB
C
|
/* $Id: Ide.h 33540 2010-10-28 09:27:05Z vboxsync $ */
|
||
|
/** @file
|
||
|
* Ide.h
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* Copyright (C) 2009-2010 Oracle Corporation
|
||
|
*
|
||
|
* This file is part of VirtualBox Open Source Edition (OSE), as
|
||
|
* available from http://www.virtualbox.org. This file is free software;
|
||
|
* you can redistribute it and/or modify it under the terms of the GNU
|
||
|
* General Public License (GPL) as published by the Free Software
|
||
|
* Foundation, in version 2 as it comes in the "COPYING" file of the
|
||
|
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
|
||
|
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
|
||
|
*/
|
||
|
|
||
|
/** @file
|
||
|
Header file for IDE Bus Driver, containing the helper functions'
|
||
|
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
|
||
|
//
|
||
|
/**
|
||
|
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 configuration 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
|
||
|
success.
|
||
|
|
||
|
@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
|