Home | History | Annotate | Download | only in IdeControllerInit
      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