1 /** @file 2 Header file for IDE Bus Driver's Data Structures 3 4 Copyright (c) 2006 - 2007, Intel Corporation. All rights reserved.<BR> 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #ifndef _IDE_DATA_H_ 16 #define _IDE_DATA_H_ 17 18 #include <IndustryStandard/Atapi.h> 19 20 // 21 // common constants 22 // 23 #define STALL_1_MILLI_SECOND 1000 // stall 1 ms 24 #define STALL_1_SECOND 1000000 // stall 1 second 25 typedef enum { 26 IdePrimary = 0, 27 IdeSecondary = 1, 28 IdeMaxChannel = 2 29 } EFI_IDE_CHANNEL; 30 31 typedef enum { 32 IdeMaster = 0, 33 IdeSlave = 1, 34 IdeMaxDevice = 2 35 } EFI_IDE_DEVICE; 36 37 typedef enum { 38 IdeMagnetic, /* ZIP Drive or LS120 Floppy Drive */ 39 IdeCdRom, /* ATAPI CDROM */ 40 IdeHardDisk, /* Hard Disk */ 41 Ide48bitAddressingHardDisk, /* Hard Disk larger than 120GB */ 42 IdeUnknown 43 } IDE_DEVICE_TYPE; 44 45 typedef enum { 46 SenseNoSenseKey, 47 SenseDeviceNotReadyNoRetry, 48 SenseDeviceNotReadyNeedRetry, 49 SenseNoMedia, 50 SenseMediaChange, 51 SenseMediaError, 52 SenseOtherSense 53 } SENSE_RESULT; 54 55 typedef enum { 56 AtaUdmaReadOp, 57 AtaUdmaReadExtOp, 58 AtaUdmaWriteOp, 59 AtaUdmaWriteExtOp 60 } ATA_UDMA_OPERATION; 61 62 // 63 // IDE Registers 64 // 65 typedef union { 66 UINT16 Command; /* when write */ 67 UINT16 Status; /* when read */ 68 } IDE_CMD_OR_STATUS; 69 70 typedef union { 71 UINT16 Error; /* when read */ 72 UINT16 Feature; /* when write */ 73 } IDE_ERROR_OR_FEATURE; 74 75 typedef union { 76 UINT16 AltStatus; /* when read */ 77 UINT16 DeviceControl; /* when write */ 78 } IDE_ALTSTATUS_OR_DEVICECONTROL; 79 80 // 81 // IDE registers set 82 // 83 typedef struct { 84 UINT16 Data; 85 IDE_ERROR_OR_FEATURE Reg1; 86 UINT16 SectorCount; 87 UINT16 SectorNumber; 88 UINT16 CylinderLsb; 89 UINT16 CylinderMsb; 90 UINT16 Head; 91 IDE_CMD_OR_STATUS Reg; 92 93 IDE_ALTSTATUS_OR_DEVICECONTROL Alt; 94 UINT16 DriveAddress; 95 96 UINT16 MasterSlave; 97 UINT16 BusMasterBaseAddr; 98 } IDE_BASE_REGISTERS; 99 100 // 101 // IDE registers' base addresses 102 // 103 typedef struct { 104 UINT16 CommandBlockBaseAddr; 105 UINT16 ControlBlockBaseAddr; 106 UINT16 BusMasterBaseAddr; 107 } IDE_REGISTERS_BASE_ADDR; 108 109 // 110 // Bit definitions in Programming Interface byte of the Class Code field 111 // in PCI IDE controller's Configuration Space 112 // 113 #define IDE_PRIMARY_OPERATING_MODE BIT0 114 #define IDE_PRIMARY_PROGRAMMABLE_INDICATOR BIT1 115 #define IDE_SECONDARY_OPERATING_MODE BIT2 116 #define IDE_SECONDARY_PROGRAMMABLE_INDICATOR BIT3 117 118 119 // 120 // Bus Master Reg 121 // 122 #define BMIC_NREAD BIT3 123 #define BMIC_START BIT0 124 #define BMIS_INTERRUPT BIT2 125 #define BMIS_ERROR BIT1 126 127 #define BMICP_OFFSET 0x00 128 #define BMISP_OFFSET 0x02 129 #define BMIDP_OFFSET 0x04 130 #define BMICS_OFFSET 0x08 131 #define BMISS_OFFSET 0x0A 132 #define BMIDS_OFFSET 0x0C 133 134 // 135 // Time Out Value For IDE Device Polling 136 // 137 138 // 139 // ATATIMEOUT is used for waiting time out for ATA device 140 // 141 142 // 143 // 1 second 144 // 145 #define ATATIMEOUT 1000 146 147 // 148 // ATAPITIMEOUT is used for waiting operation 149 // except read and write time out for ATAPI device 150 // 151 152 // 153 // 1 second 154 // 155 #define ATAPITIMEOUT 1000 156 157 // 158 // ATAPILONGTIMEOUT is used for waiting read and 159 // write operation timeout for ATAPI device 160 // 161 162 // 163 // 2 seconds 164 // 165 #define CDROMLONGTIMEOUT 2000 166 167 // 168 // 5 seconds 169 // 170 #define ATAPILONGTIMEOUT 5000 171 172 // 173 // 10 seconds 174 // 175 #define ATASMARTTIMEOUT 10000 176 177 178 // 179 // ATAPI6 related data structure definition 180 // 181 182 // 183 // The maximum sectors count in 28 bit addressing mode 184 // 185 #define MAX_28BIT_ADDRESSING_CAPACITY 0xfffffff 186 187 #pragma pack(1) 188 189 typedef struct { 190 UINT32 RegionBaseAddr; 191 UINT16 ByteCount; 192 UINT16 EndOfTable; 193 } IDE_DMA_PRD; 194 195 #pragma pack() 196 197 #define SETFEATURE TRUE 198 #define CLEARFEATURE FALSE 199 200 /// 201 /// PIO mode definition 202 /// 203 typedef enum _ATA_PIO_MODE_ { 204 AtaPioModeBelow2, 205 AtaPioMode2, 206 AtaPioMode3, 207 AtaPioMode4 208 } ATA_PIO_MODE; 209 210 // 211 // Multi word DMA definition 212 // 213 typedef enum _ATA_MDMA_MODE_ { 214 AtaMdmaMode0, 215 AtaMdmaMode1, 216 AtaMdmaMode2 217 } ATA_MDMA_MODE; 218 219 // 220 // UDMA mode definition 221 // 222 typedef enum _ATA_UDMA_MODE_ { 223 AtaUdmaMode0, 224 AtaUdmaMode1, 225 AtaUdmaMode2, 226 AtaUdmaMode3, 227 AtaUdmaMode4, 228 AtaUdmaMode5 229 } ATA_UDMA_MODE; 230 231 #define ATA_MODE_CATEGORY_DEFAULT_PIO 0x00 232 #define ATA_MODE_CATEGORY_FLOW_PIO 0x01 233 #define ATA_MODE_CATEGORY_MDMA 0x04 234 #define ATA_MODE_CATEGORY_UDMA 0x08 235 236 #pragma pack(1) 237 238 typedef struct { 239 UINT8 ModeNumber : 3; 240 UINT8 ModeCategory : 5; 241 } ATA_TRANSFER_MODE; 242 243 typedef struct { 244 UINT8 Sector; 245 UINT8 Heads; 246 UINT8 MultipleSector; 247 } ATA_DRIVE_PARMS; 248 249 #pragma pack() 250 // 251 // IORDY Sample Point field value 252 // 253 #define ISP_5_CLK 0 254 #define ISP_4_CLK 1 255 #define ISP_3_CLK 2 256 #define ISP_2_CLK 3 257 258 // 259 // Recovery Time field value 260 // 261 #define RECVY_4_CLK 0 262 #define RECVY_3_CLK 1 263 #define RECVY_2_CLK 2 264 #define RECVY_1_CLK 3 265 266 // 267 // Slave IDE Timing Register Enable 268 // 269 #define SITRE BIT14 270 271 // 272 // DMA Timing Enable Only Select 1 273 // 274 #define DTE1 BIT7 275 276 // 277 // Pre-fetch and Posting Enable Select 1 278 // 279 #define PPE1 BIT6 280 281 // 282 // IORDY Sample Point Enable Select 1 283 // 284 #define IE1 BIT5 285 286 // 287 // Fast Timing Bank Drive Select 1 288 // 289 #define TIME1 BIT4 290 291 // 292 // DMA Timing Enable Only Select 0 293 // 294 #define DTE0 BIT3 295 296 // 297 // Pre-fetch and Posting Enable Select 0 298 // 299 #define PPE0 BIT2 300 301 // 302 // IOREY Sample Point Enable Select 0 303 // 304 #define IE0 BIT1 305 306 // 307 // Fast Timing Bank Drive Select 0 308 // 309 #define TIME0 BIT0 310 311 #endif 312