1 /*++ 2 3 Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR> 4 This program and the accompanying materials 5 are licensed and made available under the terms and conditions of the BSD License 6 which accompanies this distribution. The full text of the license may be found at 7 http://opensource.org/licenses/bsd-license.php 8 9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11 12 Module Name: 13 14 IdeControllerInit.h 15 16 Abstract: 17 18 EFI Platform IDE Init Protocol 19 20 Revision History 21 22 0.01 - Draft, 5-01-2002 23 Add Atapi6 Identify structure definition, 8-14-2002 24 25 --*/ 26 27 #ifndef _EFI_IDE_CONTROLLER_INIT_PROTOCOL_H 28 #define _EFI_IDE_CONTROLLER_INIT_PROTOCOL_H 29 30 // 31 // Global ID for the EFI Platform IDE Protocol GUID 32 // 33 #define EFI_IDE_CONTROLLER_INIT_PROTOCOL_GUID \ 34 { 0xa1e37052, 0x80d9, 0x4e65, {0xa3, 0x17, 0x3e, 0x9a, 0x55, 0xc4, 0x3e, 0xc9} } 35 36 //////////////////////////////////////////////////////////////////////////////////////// 37 // Forward reference, ANSI compatability 38 // 39 EFI_FORWARD_DECLARATION (EFI_IDE_CONTROLLER_INIT_PROTOCOL); 40 41 // 42 ////////////////////////////////////////////////////////////////////////////////////////// 43 // EFI_IDE_BUS_ENUMERATION_PHASE 44 // EFI_IDE_CONTROLLER_ENUM_PHASE 45 // 46 typedef enum{ 47 EfiIdeBeforeChannelEnumeration, 48 EfiIdeAfterChannelEnumeration, 49 EfiIdeBeforeChannelReset, 50 EfiIdeAfterChannelReset, 51 EfiIdeBusBeforeDevicePresenceDetection, 52 EfiIdeBusAfterDevicePresenceDetection, 53 EfiIdeResetMode, 54 EfiIdeBusPhaseMaximum 55 } EFI_IDE_CONTROLLER_ENUM_PHASE; 56 57 // 58 //****************************************************** 59 // EFI_ATA_EXT_TRANSFER_PROTOCOL 60 //****************************************************** 61 // 62 // This extended mode describes the SATA physical protocol. 63 // SATA physical layers can operate at different speeds. 64 // These speeds are defined below. Various PATA protocols 65 // and associated modes are not applicable to SATA devices. 66 // 67 68 typedef enum { 69 EfiAtaSataTransferProtocol 70 } EFI_ATA_EXT_TRANSFER_PROTOCOL; 71 72 #define EFI_SATA_AUTO_SPEED 0 73 #define EFI_SATA_GEN1_SPEED 1 74 #define EFI_SATA_GEN2_SPEED 2 75 76 // 77 //******************************************************* 78 // EFI_IDE_CABLE_TYPE 79 //******************************************************* 80 // 81 typedef enum { 82 EfiIdeCableTypeUnknown, 83 EfiIdeCableType40pin, 84 EfiIdeCableType80Pin, 85 EfiIdeCableTypeSerial, 86 EfiIdeCableTypeMaximum 87 } EFI_IDE_CABLE_TYPE; 88 89 // 90 //****************************************************** 91 // EFI_ATA_MODE 92 //****************************************************** 93 // 94 typedef struct { 95 BOOLEAN Valid; 96 UINT32 Mode; 97 } EFI_ATA_MODE; 98 99 // 100 //****************************************************** 101 // EFI_ATA_EXTENDED_MODE 102 //****************************************************** 103 // 104 typedef struct { 105 EFI_ATA_EXT_TRANSFER_PROTOCOL TransferProtocol; 106 UINT32 Mode; 107 } EFI_ATA_EXTENDED_MODE; 108 109 // 110 //****************************************************** 111 // EFI_ATA_COLLECTIVE_MODE 112 //****************************************************** 113 // 114 typedef struct { 115 EFI_ATA_MODE PioMode; 116 EFI_ATA_MODE SingleWordDmaMode; 117 EFI_ATA_MODE MultiWordDmaMode; 118 EFI_ATA_MODE UdmaMode; 119 UINT32 ExtModeCount; 120 EFI_ATA_EXTENDED_MODE ExtMode[1]; 121 } EFI_ATA_COLLECTIVE_MODE; 122 123 // 124 //******************************************************* 125 // EFI_ATA_IDENTIFY_DATA 126 //******************************************************* 127 // 128 129 #pragma pack(1) 130 131 typedef struct { 132 UINT16 config; // General Configuration 133 UINT16 cylinders; // Number of Cylinders 134 UINT16 reserved_2; 135 UINT16 heads; //Number of logical heads 136 UINT16 vendor_data1; 137 UINT16 vendor_data2; 138 UINT16 sectors_per_track; 139 UINT16 vendor_specific_7_9[3]; 140 CHAR8 SerialNo[20]; // ASCII 141 UINT16 vendor_specific_20_21[2]; 142 UINT16 ecc_bytes_available; 143 CHAR8 FirmwareVer[8]; // ASCII 144 CHAR8 ModelName[40]; // ASCII 145 UINT16 multi_sector_cmd_max_sct_cnt; 146 UINT16 reserved_48; 147 UINT16 capabilities; 148 UINT16 reserved_50; 149 UINT16 pio_cycle_timing; 150 UINT16 reserved_52; 151 UINT16 field_validity; 152 UINT16 current_cylinders; 153 UINT16 current_heads; 154 UINT16 current_sectors; 155 UINT16 CurrentCapacityLsb; 156 UINT16 CurrentCapacityMsb; 157 UINT16 reserved_59; 158 UINT16 user_addressable_sectors_lo; 159 UINT16 user_addressable_sectors_hi; 160 UINT16 reserved_62; 161 UINT16 multi_word_dma_mode; 162 UINT16 advanced_pio_modes; 163 UINT16 min_multi_word_dma_cycle_time; 164 UINT16 rec_multi_word_dma_cycle_time; 165 UINT16 min_pio_cycle_time_without_flow_control; 166 UINT16 min_pio_cycle_time_with_flow_control; 167 UINT16 reserved_69_79[11]; 168 UINT16 major_version_no; 169 UINT16 minor_version_no; 170 UINT16 command_set_supported_82; // word 82 171 UINT16 command_set_supported_83; // word 83 172 UINT16 command_set_feature_extn; // word 84 173 UINT16 command_set_feature_enb_85; // word 85 174 UINT16 command_set_feature_enb_86; // word 86 175 UINT16 command_set_feature_default; // word 87 176 UINT16 ultra_dma_mode; // word 88 177 UINT16 reserved_89_105[17]; 178 UINT16 phy_logic_sector_support; // word 106 179 UINT16 reserved_107_116[10]; 180 UINT16 logic_sector_size_lo; // word 117 181 UINT16 logic_sector_size_hi; // word 118 182 UINT16 reserved_119_127[9]; 183 UINT16 security_status; 184 UINT16 vendor_data_129_159[31]; 185 UINT16 reserved_160_208[49]; 186 UINT16 alignment_logic_in_phy_blocks; // word 209 187 UINT16 reserved_210_255[46]; 188 } EFI_ATA_IDENTIFY_DATA; 189 190 #pragma pack() 191 // 192 //******************************************************* 193 // EFI_ATAPI_IDENTIFY_DATA 194 //******************************************************* 195 // 196 #pragma pack(1) 197 typedef struct { 198 UINT16 config; // General Configuration 199 UINT16 obsolete_1; 200 UINT16 specific_config; 201 UINT16 obsolete_3; 202 UINT16 retired_4_5[2]; 203 UINT16 obsolete_6; 204 UINT16 cfa_reserved_7_8[2]; 205 UINT16 retired_9; 206 CHAR8 SerialNo[20]; // ASCII 207 UINT16 retired_20_21[2]; 208 UINT16 obsolete_22; 209 CHAR8 FirmwareVer[8]; // ASCII 210 CHAR8 ModelName[40]; // ASCII 211 UINT16 multi_sector_cmd_max_sct_cnt; 212 UINT16 reserved_48; 213 UINT16 capabilities_49; 214 UINT16 capabilities_50; 215 UINT16 obsolete_51_52[2]; 216 UINT16 field_validity; 217 UINT16 obsolete_54_58[5]; 218 UINT16 mutil_sector_setting; 219 UINT16 user_addressable_sectors_lo; 220 UINT16 user_addressable_sectors_hi; 221 UINT16 obsolete_62; 222 UINT16 multi_word_dma_mode; 223 UINT16 advanced_pio_modes; 224 UINT16 min_multi_word_dma_cycle_time; 225 UINT16 rec_multi_word_dma_cycle_time; 226 UINT16 min_pio_cycle_time_without_flow_control; 227 UINT16 min_pio_cycle_time_with_flow_control; 228 UINT16 reserved_69_74[6]; 229 UINT16 queue_depth; 230 UINT16 reserved_76_79[4]; 231 UINT16 major_version_no; 232 UINT16 minor_version_no; 233 UINT16 cmd_set_support_82; 234 UINT16 cmd_set_support_83; 235 UINT16 cmd_feature_support; 236 UINT16 cmd_feature_enable_85; 237 UINT16 cmd_feature_enable_86; 238 UINT16 cmd_feature_default; 239 UINT16 ultra_dma_select; 240 UINT16 time_required_for_sec_erase; 241 UINT16 time_required_for_enhanced_sec_erase; 242 UINT16 current_advanced_power_mgmt_value; 243 UINT16 master_pwd_revison_code; 244 UINT16 hardware_reset_result; 245 UINT16 current_auto_acoustic_mgmt_value; 246 UINT16 reserved_95_99[5]; 247 UINT16 max_user_lba_for_48bit_addr[4]; 248 UINT16 reserved_104_126[23]; 249 UINT16 removable_media_status_notification_support; 250 UINT16 security_status; 251 UINT16 vendor_data_129_159[31]; 252 UINT16 cfa_power_mode; 253 UINT16 cfa_reserved_161_175[15]; 254 UINT16 current_media_serial_no[30]; 255 UINT16 reserved_206_254[49]; 256 UINT16 integrity_word; 257 } EFI_ATAPI_IDENTIFY_DATA; 258 259 #pragma pack() 260 // 261 //******************************************************* 262 // EFI_IDENTIFY_DATA 263 //******************************************************* 264 // 265 typedef union { 266 EFI_ATA_IDENTIFY_DATA AtaData; 267 EFI_ATAPI_IDENTIFY_DATA AtapiData; 268 } EFI_IDENTIFY_DATA; 269 270 #define EFI_ATAPI_DEVICE_IDENTIFY_DATA 0x8000 271 272 // 273 ///////////////////////////////////////////////////////////////////////////////////////// 274 // Function prototype declaration, for ANSI compatability 275 // 276 typedef 277 EFI_STATUS 278 (EFIAPI *EFI_IDE_CONTROLLER_GET_CHANNEL_INFO) ( 279 IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, 280 IN UINT8 Channel, 281 OUT BOOLEAN *Enabled, 282 OUT UINT8 *MaxDevices 283 284 ); 285 286 typedef 287 EFI_STATUS 288 (EFIAPI *EFI_IDE_CONTROLLER_NOTIFY_PHASE) ( 289 IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, 290 IN EFI_IDE_CONTROLLER_ENUM_PHASE Phase, 291 IN UINT8 Channel 292 ); 293 294 typedef 295 EFI_STATUS 296 (EFIAPI *EFI_IDE_CONTROLLER_SUBMIT_DATA) ( 297 IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, 298 IN UINT8 Channel, 299 IN UINT8 Device, 300 IN EFI_IDENTIFY_DATA *IdentifyData 301 ); 302 303 304 typedef 305 EFI_STATUS 306 (EFIAPI *EFI_IDE_CONTROLLER_DISQUALIFY_MODE) ( 307 IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, 308 IN UINT8 Channel, 309 IN UINT8 Device, 310 IN EFI_ATA_COLLECTIVE_MODE *BadModes 311 ); 312 313 typedef 314 EFI_STATUS 315 (EFIAPI *EFI_IDE_CONTROLLER_CALCULATE_MODE) ( 316 IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, 317 IN UINT8 Channel, 318 IN UINT8 Device, 319 OUT EFI_ATA_COLLECTIVE_MODE **SupportedModes 320 ); 321 322 // 323 // ?? What happen to EFI_IDE_CONTROLLER_SET_TIMING ??? 324 // 325 typedef 326 EFI_STATUS 327 (EFIAPI *EFI_IDE_CONTROLLER_SET_TIMING) ( 328 IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, 329 IN UINT8 Channel, 330 IN UINT8 Device, 331 IN EFI_ATA_COLLECTIVE_MODE *Modes 332 ); 333 334 // 335 //////////////////////////////////////////////////////////////////////////////////////////////////// 336 // Interface structure 337 // EFI_IDE_CONTROLLER_INIT_PROTOCOL protocol provides the chipset specific information to the IDE bus driver. 338 // An IDE Bus driver wants to manage an IDE bus and possible IDE devices will have to retrieve the 339 // EFI_IDE_CONTROLLER_INIT_PROTOCOL instances. 340 // 341 struct _EFI_IDE_CONTROLLER_INIT_PROTOCOL { 342 EFI_IDE_CONTROLLER_GET_CHANNEL_INFO GetChannelInfo; 343 EFI_IDE_CONTROLLER_NOTIFY_PHASE NotifyPhase; 344 EFI_IDE_CONTROLLER_SUBMIT_DATA SubmitData; 345 EFI_IDE_CONTROLLER_DISQUALIFY_MODE DisqualifyMode; 346 EFI_IDE_CONTROLLER_CALCULATE_MODE CalculateMode; 347 EFI_IDE_CONTROLLER_SET_TIMING SetTiming; 348 BOOLEAN EnumAll; 349 UINT8 ChannelCount; 350 }; 351 352 353 extern EFI_GUID gEfiIdeControllerInitProtocolGuid; 354 355 #endif 356