/** @file | |
This file declares EFI IDE Controller Init Protocol | |
Copyright (c) 2006, Intel Corporation | |
All rights reserved. This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
Module Name: IdeControllerInit.h | |
@par Revision Reference: | |
This Protocol is defined in IDE Controller Initialization Protocol Specification | |
Version 0.9 | |
**/ | |
#ifndef _EFI_IDE_CONTROLLER_INIT_PROTOCOL_H | |
#define _EFI_IDE_CONTROLLER_INIT_PROTOCOL_H | |
// | |
// Global ID for the EFI Platform IDE Protocol GUID | |
// | |
#define EFI_IDE_CONTROLLER_INIT_PROTOCOL_GUID \ | |
{ 0xa1e37052, 0x80d9, 0x4e65, {0xa3, 0x17, 0x3e, 0x9a, 0x55, 0xc4, 0x3e, 0xc9 } } | |
// | |
// Forward reference for pure ANSI compatability | |
// | |
typedef struct _EFI_IDE_CONTROLLER_INIT_PROTOCOL EFI_IDE_CONTROLLER_INIT_PROTOCOL; | |
// | |
////////////////////////////////////////////////////////////////////////////////////////// | |
// EFI_IDE_BUS_ENUMERATION_PHASE | |
// EFI_IDE_CONTROLLER_ENUM_PHASE | |
// | |
typedef enum{ | |
EfiIdeBeforeChannelEnumeration, | |
EfiIdeAfterChannelEnumeration, | |
EfiIdeBeforeChannelReset, | |
EfiIdeAfterChannelReset, | |
EfiIdeBusBeforeDevicePresenceDetection, | |
EfiIdeBusAfterDevicePresenceDetection, | |
EfiIdeResetMode, | |
EfiIdeBusPhaseMaximum | |
} EFI_IDE_CONTROLLER_ENUM_PHASE; | |
// | |
//****************************************************** | |
// EFI_ATA_EXT_TRANSFER_PROTOCOL | |
//****************************************************** | |
// | |
// This extended mode describes the SATA physical protocol. | |
// SATA physical layers can operate at different speeds. | |
// These speeds are defined below. Various PATA protocols | |
// and associated modes are not applicable to SATA devices. | |
// | |
typedef enum { | |
EfiAtaSataTransferProtocol | |
} EFI_ATA_EXT_TRANSFER_PROTOCOL; | |
#define EFI_SATA_AUTO_SPEED 0 | |
#define EFI_SATA_GEN1_SPEED 1 | |
#define EFI_SATA_GEN2_SPEED 2 | |
// | |
//******************************************************* | |
// EFI_IDE_CABLE_TYPE | |
//******************************************************* | |
// | |
typedef enum { | |
EfiIdeCableTypeUnknown, | |
EfiIdeCableType40pin, | |
EfiIdeCableType80Pin, | |
EfiIdeCableTypeSerial, | |
EfiIdeCableTypeMaximum | |
} EFI_IDE_CABLE_TYPE; | |
// | |
//****************************************************** | |
// EFI_ATA_MODE | |
//****************************************************** | |
// | |
typedef struct { | |
BOOLEAN Valid; | |
UINT32 Mode; | |
} EFI_ATA_MODE; | |
// | |
//****************************************************** | |
// EFI_ATA_EXTENDED_MODE | |
//****************************************************** | |
// | |
typedef struct { | |
EFI_ATA_EXT_TRANSFER_PROTOCOL TransferProtocol; | |
UINT32 Mode; | |
} EFI_ATA_EXTENDED_MODE; | |
// | |
//****************************************************** | |
// EFI_ATA_COLLECTIVE_MODE | |
//****************************************************** | |
// | |
typedef struct { | |
EFI_ATA_MODE PioMode; | |
EFI_ATA_MODE SingleWordDmaMode; | |
EFI_ATA_MODE MultiWordDmaMode; | |
EFI_ATA_MODE UdmaMode; | |
UINT32 ExtModeCount; | |
EFI_ATA_EXTENDED_MODE ExtMode[1]; | |
} EFI_ATA_COLLECTIVE_MODE; | |
// | |
//******************************************************* | |
// EFI_ATA_IDENTIFY_DATA | |
//******************************************************* | |
// | |
#pragma pack(1) | |
typedef struct { | |
UINT16 config; // General Configuration | |
UINT16 cylinders; // Number of Cylinders | |
UINT16 reserved_2; | |
UINT16 heads; //Number of logical heads | |
UINT16 vendor_data1; | |
UINT16 vendor_data2; | |
UINT16 sectors_per_track; | |
UINT16 vendor_specific_7_9[3]; | |
CHAR8 SerialNo[20]; // ASCII | |
UINT16 vendor_specific_20_21[2]; | |
UINT16 ecc_bytes_available; | |
CHAR8 FirmwareVer[8]; // ASCII | |
CHAR8 ModelName[40]; // ASCII | |
UINT16 multi_sector_cmd_max_sct_cnt; | |
UINT16 reserved_48; | |
UINT16 capabilities; | |
UINT16 reserved_50; | |
UINT16 pio_cycle_timing; | |
UINT16 reserved_52; | |
UINT16 field_validity; | |
UINT16 current_cylinders; | |
UINT16 current_heads; | |
UINT16 current_sectors; | |
UINT16 CurrentCapacityLsb; | |
UINT16 CurrentCapacityMsb; | |
UINT16 reserved_59; | |
UINT16 user_addressable_sectors_lo; | |
UINT16 user_addressable_sectors_hi; | |
UINT16 reserved_62; | |
UINT16 multi_word_dma_mode; | |
UINT16 advanced_pio_modes; | |
UINT16 min_multi_word_dma_cycle_time; | |
UINT16 rec_multi_word_dma_cycle_time; | |
UINT16 min_pio_cycle_time_without_flow_control; | |
UINT16 min_pio_cycle_time_with_flow_control; | |
UINT16 reserved_69_79[11]; | |
UINT16 major_version_no; | |
UINT16 minor_version_no; | |
UINT16 command_set_supported_82; // word 82 | |
UINT16 command_set_supported_83; // word 83 | |
UINT16 command_set_feature_extn; // word 84 | |
UINT16 command_set_feature_enb_85; // word 85 | |
UINT16 command_set_feature_enb_86; // word 86 | |
UINT16 command_set_feature_default; // word 87 | |
UINT16 ultra_dma_mode; // word 88 | |
UINT16 reserved_89_127[39]; | |
UINT16 security_status; | |
UINT16 vendor_data_129_159[31]; | |
UINT16 reserved_160_255[96]; | |
} EFI_ATA_IDENTIFY_DATA; | |
#pragma pack() | |
// | |
//******************************************************* | |
// EFI_ATAPI_IDENTIFY_DATA | |
//******************************************************* | |
// | |
#pragma pack(1) | |
typedef struct { | |
UINT16 config; // General Configuration | |
UINT16 obsolete_1; | |
UINT16 specific_config; | |
UINT16 obsolete_3; | |
UINT16 retired_4_5[2]; | |
UINT16 obsolete_6; | |
UINT16 cfa_reserved_7_8[2]; | |
UINT16 retired_9; | |
CHAR8 SerialNo[20]; // ASCII | |
UINT16 retired_20_21[2]; | |
UINT16 obsolete_22; | |
CHAR8 FirmwareVer[8]; // ASCII | |
CHAR8 ModelName[40]; // ASCII | |
UINT16 multi_sector_cmd_max_sct_cnt; | |
UINT16 reserved_48; | |
UINT16 capabilities_49; | |
UINT16 capabilities_50; | |
UINT16 obsolete_51_52[2]; | |
UINT16 field_validity; | |
UINT16 obsolete_54_58[5]; | |
UINT16 mutil_sector_setting; | |
UINT16 user_addressable_sectors_lo; | |
UINT16 user_addressable_sectors_hi; | |
UINT16 obsolete_62; | |
UINT16 multi_word_dma_mode; | |
UINT16 advanced_pio_modes; | |
UINT16 min_multi_word_dma_cycle_time; | |
UINT16 rec_multi_word_dma_cycle_time; | |
UINT16 min_pio_cycle_time_without_flow_control; | |
UINT16 min_pio_cycle_time_with_flow_control; | |
UINT16 reserved_69_74[6]; | |
UINT16 queue_depth; | |
UINT16 reserved_76_79[4]; | |
UINT16 major_version_no; | |
UINT16 minor_version_no; | |
UINT16 cmd_set_support_82; | |
UINT16 cmd_set_support_83; | |
UINT16 cmd_feature_support; | |
UINT16 cmd_feature_enable_85; | |
UINT16 cmd_feature_enable_86; | |
UINT16 cmd_feature_default; | |
UINT16 ultra_dma_select; | |
UINT16 time_required_for_sec_erase; | |
UINT16 time_required_for_enhanced_sec_erase; | |
UINT16 current_advanced_power_mgmt_value; | |
UINT16 master_pwd_revison_code; | |
UINT16 hardware_reset_result; | |
UINT16 current_auto_acoustic_mgmt_value; | |
UINT16 reserved_95_99[5]; | |
UINT16 max_user_lba_for_48bit_addr[4]; | |
UINT16 reserved_104_126[23]; | |
UINT16 removable_media_status_notification_support; | |
UINT16 security_status; | |
UINT16 vendor_data_129_159[31]; | |
UINT16 cfa_power_mode; | |
UINT16 cfa_reserved_161_175[15]; | |
UINT16 current_media_serial_no[30]; | |
UINT16 reserved_206_254[49]; | |
UINT16 integrity_word; | |
} EFI_ATAPI_IDENTIFY_DATA; | |
#pragma pack() | |
// | |
//******************************************************* | |
// EFI_IDENTIFY_DATA | |
//******************************************************* | |
// | |
typedef union { | |
EFI_ATA_IDENTIFY_DATA AtaData; | |
EFI_ATAPI_IDENTIFY_DATA AtapiData; | |
} EFI_IDENTIFY_DATA; | |
#define EFI_ATAPI_DEVICE_IDENTIFY_DATA 0x8000 | |
// | |
///////////////////////////////////////////////////////////////////////////////////////// | |
// Function prototype declaration, for ANSI compatability | |
// | |
/** | |
Returns the information about the specified IDE channel. | |
@param This Pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. | |
@param Channel Zero-based channel number. | |
@param Enabled TRUE if this channel is enabled. Disabled channels are not scanned | |
to see if any devices are present. | |
@param MaxDevices The maximum number of IDE devices that the bus driver | |
can expect on this channel. | |
@retval EFI_SUCCESS Information was returned without any errors. | |
@retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_IDE_CONTROLLER_GET_CHANNEL_INFO) ( | |
IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, | |
IN UINT8 Channel, | |
OUT BOOLEAN *Enabled, | |
OUT UINT8 *MaxDevices | |
); | |
/** | |
The notifications from the IDE bus driver that it is about to enter a certain | |
phase of the IDE channel enumeration process. | |
@param This Pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. | |
@param Phase The phase during enumeration. | |
@param Channel Zero-based channel number. | |
@retval EFI_SUCCESS The notification was accepted without any errors. | |
@retval EFI_NOT_SUPPORTED Phase is not supported. | |
@retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). | |
@retval EFI_NOT_READY This phase cannot be entered at this time. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_IDE_CONTROLLER_NOTIFY_PHASE) ( | |
IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, | |
IN EFI_IDE_CONTROLLER_ENUM_PHASE Phase, | |
IN UINT8 Channel | |
); | |
/** | |
Submits the device information to the IDE controller driver. | |
@param This Pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. | |
@param Channel Zero-based channel number. | |
@param Device Zero-based device number on the Channel. | |
@param IdentifyData The device¡¯s response to the ATA IDENTIFY_DEVICE command. | |
@retval EFI_SUCCESS The information was accepted without any errors. | |
@retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). | |
Or Device is invalid. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_IDE_CONTROLLER_SUBMIT_DATA) ( | |
IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, | |
IN UINT8 Channel, | |
IN UINT8 Device, | |
IN EFI_IDENTIFY_DATA *IdentifyData | |
); | |
/** | |
Disqualifies specific modes for an IDE device. | |
@param This Pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. | |
@param Channel Zero-based channel number. | |
@param Device Zero-based device number on the Channel. | |
@param BadModes The modes that the device does not support and that | |
should be disqualified. | |
@retval EFI_SUCCESS The modes were accepted without any errors. | |
@retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). | |
Or Device is invalid. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_IDE_CONTROLLER_DISQUALIFY_MODE) ( | |
IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, | |
IN UINT8 Channel, | |
IN UINT8 Device, | |
IN EFI_ATA_COLLECTIVE_MODE *BadModes | |
); | |
/** | |
Returns the information about the optimum modes for the specified IDE device. | |
@param This Pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. | |
@param Channel Zero-based channel number. | |
@param Device Zero-based device number on the Channel. | |
@param SupportedModes The optimum modes for the device. | |
@retval EFI_SUCCESS SupportedModes was returned. | |
@retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). | |
Or Device is invalid. Or SupportedModes is NULL. | |
@retval EFI_NOT_READY Modes cannot be calculated due to a lack of data. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_IDE_CONTROLLER_CALCULATE_MODE) ( | |
IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, | |
IN UINT8 Channel, | |
IN UINT8 Device, | |
OUT EFI_ATA_COLLECTIVE_MODE **SupportedModes | |
); | |
/** | |
Commands the IDE controller driver to program the IDE controller hardware | |
so that the specified device can operate at the specified mode. | |
@param This Pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. | |
@param Channel Zero-based channel number. | |
@param Device Zero-based device number on the Channel. | |
@param Modes The modes to set. | |
@retval EFI_SUCCESS The command was accepted without any errors. | |
@retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). | |
Or Device is invalid. | |
@retval EFI_NOT_READY Modes cannot be set at this time due to lack of data. | |
@retval EFI_DEVICE_ERROR Modes cannot be set due to hardware failure. | |
The IDE bus driver should not use this device. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_IDE_CONTROLLER_SET_TIMING) ( | |
IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, | |
IN UINT8 Channel, | |
IN UINT8 Device, | |
IN EFI_ATA_COLLECTIVE_MODE *Modes | |
); | |
// | |
//////////////////////////////////////////////////////////////////////////////////////////////////// | |
// Interface structure | |
// EFI_IDE_CONTROLLER_INIT_PROTOCOL protocol provides the chipset specific information to the IDE bus driver. | |
// An IDE Bus driver wants to manage an IDE bus and possible IDE devices will have to retrieve the | |
// EFI_IDE_CONTROLLER_INIT_PROTOCOL instances. | |
// | |
/** | |
@par Protocol Description: | |
Provides the basic interfaces to abstract an IDE controller. | |
@param GetChannelInfo | |
Returns the information about a specific channel. | |
@param NotifyPhase | |
The notification that the IDE bus driver is about to enter the | |
specified phase during the enumeration process. | |
@param SubmitData | |
Submits the Drive Identify data that was returned by the device. | |
@param DisqualifyMode | |
Submits information about modes that should be disqualified. | |
@param CalculateMode | |
Calculates and returns the optimum mode for a particular IDE device. | |
@param SetTiming | |
Programs the IDE controller hardware to the default timing or per the modes | |
that were returned by the last call to CalculateMode(). | |
@param EnumAll | |
Set to TRUE if the enumeration group includes all the channels that are | |
produced by this controller. FALSE if an enumeration group consists of | |
only one channel. | |
@param ChannelCount | |
The number of channels that are produced by this controller. | |
**/ | |
struct _EFI_IDE_CONTROLLER_INIT_PROTOCOL { | |
EFI_IDE_CONTROLLER_GET_CHANNEL_INFO GetChannelInfo; | |
EFI_IDE_CONTROLLER_NOTIFY_PHASE NotifyPhase; | |
EFI_IDE_CONTROLLER_SUBMIT_DATA SubmitData; | |
EFI_IDE_CONTROLLER_DISQUALIFY_MODE DisqualifyMode; | |
EFI_IDE_CONTROLLER_CALCULATE_MODE CalculateMode; | |
EFI_IDE_CONTROLLER_SET_TIMING SetTiming; | |
BOOLEAN EnumAll; | |
UINT8 ChannelCount; | |
}; | |
extern EFI_GUID gEfiIdeControllerInitProtocolGuid; | |
#endif | |