Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenbsmaster.h
Go to the documentation of this file.
00001 /*++ 00002 00003 Copyright (c) 2002-2011 Alexandr A. Telyatnikov (Alter) 00004 00005 Module Name: 00006 bsmaster.h 00007 00008 Abstract: 00009 This file contains DMA/UltraDMA and IDE BusMastering related definitions, 00010 internal structures and useful macros 00011 00012 Author: 00013 Alexander A. Telyatnikov (Alter) 00014 00015 Environment: 00016 kernel mode only 00017 00018 Notes: 00019 00020 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 00021 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00022 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 00023 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 00024 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 00025 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 00026 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 00027 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00028 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 00029 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00030 00031 Revision History: 00032 00033 Code was created by 00034 Alter, Copyright (c) 2002-2008 00035 00036 Some definitions were taken from FreeBSD 4.3-4.6 ATA driver by 00037 Søren Schmidt, Copyright (c) 1998,1999,2000,2001 00038 00039 --*/ 00040 00041 #ifndef __IDE_BUSMASTER_H__ 00042 #define __IDE_BUSMASTER_H__ 00043 00044 #include "config.h" 00045 00046 #include "tools.h" 00047 00048 // 00049 // 00050 // 00051 #define ATA_IDLE 0x0 00052 #define ATA_IMMEDIATE 0x1 00053 #define ATA_WAIT_INTR 0x2 00054 #define ATA_WAIT_READY 0x3 00055 #define ATA_ACTIVE 0x4 00056 #define ATA_ACTIVE_ATA 0x5 00057 #define ATA_ACTIVE_ATAPI 0x6 00058 #define ATA_REINITING 0x7 00059 #define ATA_WAIT_BASE_READY 0x8 00060 #define ATA_WAIT_IDLE 0x9 00061 00062 00063 #include "bm_devs.h" 00064 00065 #include "uata_ctl.h" 00066 00067 #define MAX_RETRIES 6 00068 #define RETRY_UDMA2 1 00069 #define RETRY_WDMA 2 00070 #define RETRY_PIO 3 00071 00072 00073 #define IO_WD1 0x1F0 /* Primary Fixed Disk Controller */ 00074 #define IO_WD2 0x170 /* Secondary Fixed Disk Controller */ 00075 #define IP_PC98_BANK 0x432 00076 00077 #define PCI_ADDRESS_IOMASK 0xfffffff0 00078 00079 #define ATA_BM_OFFSET1 0x08 00080 #define ATA_IOSIZE 0x08 00081 #define ATA_ALTOFFSET 0x206 /* alternate registers offset */ 00082 #define ATA_PCCARD_ALTOFFSET 0x0e /* do for PCCARD devices */ 00083 #define ATA_ALTIOSIZE 0x01 /* alternate registers size */ 00084 #define ATA_BMIOSIZE 0x20 00085 #define ATA_PC98_BANKIOSIZE 0x01 00086 //#define ATA_MAX_LBA28 DEF_U64(0x0fffffff) 00087 // Hitachi 1 Tb HDD didn't allow LBA28 with BCount > 1 beyond this LBA 00088 #define ATA_MAX_IOLBA28 DEF_U64(0x0fffff80) 00089 #define ATA_MAX_LBA28 DEF_U64(0x0fffffff) 00090 00091 #define ATA_DMA_ENTRIES 256 /* PAGESIZE/2/sizeof(BM_DMA_ENTRY)*/ 00092 #define ATA_DMA_EOT 0x80000000 00093 00094 #define DEV_BSIZE 512 00095 00096 #define ATAPI_MAGIC_LSB 0x14 00097 #define ATAPI_MAGIC_MSB 0xeb 00098 00099 #define AHCI_MAX_PORT 32 00100 00101 #define SATA_MAX_PM_UNITS 16 00102 00103 typedef struct _BUSMASTER_CTX { 00104 PBUSMASTER_CONTROLLER_INFORMATION* BMListPtr; 00105 ULONG* BMListLen; 00106 } BUSMASTER_CTX, *PBUSMASTER_CTX; 00107 00108 #define PCI_DEV_CLASS_STORAGE 0x01 00109 00110 #define PCI_DEV_SUBCLASS_IDE 0x01 00111 #define PCI_DEV_SUBCLASS_RAID 0x04 00112 #define PCI_DEV_SUBCLASS_ATA 0x05 00113 #define PCI_DEV_SUBCLASS_SATA 0x06 00114 00115 #define PCI_DEV_PROGIF_AHCI_1_0 0x01 00116 00117 /* structure for holding DMA address data */ 00118 typedef struct BM_DMA_ENTRY { 00119 ULONG base; 00120 ULONG count; 00121 } BM_DMA_ENTRY, *PBM_DMA_ENTRY; 00122 00123 typedef struct _IDE_BUSMASTER_REGISTERS { 00124 UCHAR Command; 00125 UCHAR DeviceSpecific0; 00126 UCHAR Status; 00127 UCHAR DeviceSpecific1; 00128 ULONG PRD_Table; 00129 } IDE_BUSMASTER_REGISTERS, *PIDE_BUSMASTER_REGISTERS; 00130 00131 #define BM_STATUS_ACTIVE 0x01 00132 #define BM_STATUS_ERR 0x02 00133 #define BM_STATUS_INTR 0x04 00134 #define BM_STATUS_MASK 0x07 00135 #define BM_STATUS_DRIVE_0_DMA 0x20 00136 #define BM_STATUS_DRIVE_1_DMA 0x40 00137 #define BM_STATUS_SIMPLEX_ONLY 0x80 00138 00139 #define BM_COMMAND_START_STOP 0x01 00140 /*#define BM_COMMAND_WRITE 0x08 00141 #define BM_COMMAND_READ 0x00*/ 00142 #define BM_COMMAND_WRITE 0x00 00143 #define BM_COMMAND_READ 0x08 00144 00145 #define BM_DS0_SII_DMA_ENABLE (1 << 0) /* DMA run switch */ 00146 #define BM_DS0_SII_IRQ (1 << 3) /* ??? */ 00147 #define BM_DS0_SII_DMA_SATA_IRQ (1 << 4) /* OR of all SATA IRQs */ 00148 #define BM_DS0_SII_DMA_ERROR (1 << 17) /* PCI bus error */ 00149 #define BM_DS0_SII_DMA_COMPLETE (1 << 18) /* cmd complete / IRQ pending */ 00150 00151 00152 #define IDX_BM_IO (IDX_IO2_o+IDX_IO2_o_SZ) 00153 //#define IDX_BM_IO_SZ sizeof(IDE_BUSMASTER_REGISTERS) 00154 #define IDX_BM_IO_SZ 5 00155 00156 #define IDX_BM_Command (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, Command )+IDX_BM_IO) 00157 #define IDX_BM_DeviceSpecific0 (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, DeviceSpecific0)+IDX_BM_IO) 00158 #define IDX_BM_Status (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, Status )+IDX_BM_IO) 00159 #define IDX_BM_DeviceSpecific1 (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, DeviceSpecific1)+IDX_BM_IO) 00160 #define IDX_BM_PRD_Table (FIELD_OFFSET(IDE_BUSMASTER_REGISTERS, PRD_Table )+IDX_BM_IO) 00161 00162 typedef struct _IDE_AHCI_REGISTERS { 00163 // HBA Capabilities 00164 struct { 00165 ULONG NOP:5; // number of ports 00166 ULONG Reserved5_7:1; 00167 ULONG NCS:5; // number of command slots 00168 ULONG PSC:1; // partial state capable 00169 ULONG SSC:1; // slumber state capable 00170 ULONG PMD:1; // PIO multiple DRQ block 00171 ULONG Reserved16:1; 00172 00173 ULONG SPM:1; // port multiplier 00174 ULONG SAM:1; // AHCI mode only 00175 ULONG SNZO:1; // non-zero DMA offset 00176 ULONG ISS:4; // interface speed 00177 ULONG SCLO:1; // command list override 00178 ULONG SAL:1; // activity LED 00179 ULONG SALP:1; // aggressive link power management 00180 ULONG SSS:1; // staggered spin-up 00181 ULONG SIS:1; // interlock switch 00182 ULONG Reserved29:1; 00183 ULONG SNCQ:1; // native command queue 00184 ULONG S64A:1; // 64bit addr 00185 } CAP; 00186 00187 #define AHCI_CAP_NOP_MASK 0x0000001f 00188 #define AHCI_CAP_NCS_MASK 0x00001f00 00189 #define AHCI_CAP_PMD 0x00008000 00190 #define AHCI_CAP_SPM 0x00020000 00191 #define AHCI_CAP_SAM 0x00040000 00192 #define AHCI_CAP_SCLO 0x01000000 00193 #define AHCI_CAP_S64A 0x80000000 00194 00195 // Global HBA Control 00196 struct { 00197 ULONG HR:1; // HBA Reset 00198 ULONG IE:1; // interrupt enable 00199 ULONG Reserved2_30:1; 00200 ULONG AE:1; // AHCI enable 00201 } GHC; 00202 00203 #define AHCI_GHC 0x04 00204 #define AHCI_GHC_HR 0x00000001 00205 #define AHCI_GHC_IE 0x00000002 00206 #define AHCI_GHC_AE 0x80000000 00207 00208 // Interrupt status (bit mask) 00209 ULONG IS; 00210 // Ports implemented (bit mask) 00211 ULONG PI; 00212 // AHCI Version 00213 ULONG VS; 00214 ULONG Reserved[3]; 00215 00216 UCHAR Reserved2[0x80]; 00217 00218 UCHAR VendorSpec[0x60]; 00219 } IDE_AHCI_REGISTERS, *PIDE_AHCI_REGISTERS; 00220 00221 #define IDX_AHCI_CAP (FIELD_OFFSET(IDE_AHCI_REGISTERS, CAP)) 00222 #define IDX_AHCI_GHC (FIELD_OFFSET(IDE_AHCI_REGISTERS, GHC)) 00223 #define IDX_AHCI_IS (FIELD_OFFSET(IDE_AHCI_REGISTERS, IS)) 00224 #define IDX_AHCI_VS (FIELD_OFFSET(IDE_AHCI_REGISTERS, VS)) 00225 #define IDX_AHCI_PI (FIELD_OFFSET(IDE_AHCI_REGISTERS, PI)) 00226 00227 00228 typedef union _SATA_SSTATUS_REG { 00229 00230 struct { 00231 ULONG DET:4; // Device Detection 00232 00233 #define SStatus_DET_NoDev 0x00 00234 #define SStatus_DET_Dev_NoPhy 0x01 00235 #define SStatus_DET_Dev_Ok 0x03 00236 #define SStatus_DET_Offline 0x04 00237 00238 ULONG SPD:4; // Current Interface Speed 00239 00240 #define SStatus_SPD_NoDev 0x00 00241 #define SStatus_SPD_Gen1 0x01 00242 #define SStatus_SPD_Gen2 0x02 00243 #define SStatus_SPD_Gen3 0x03 00244 00245 ULONG IPM:4; // Interface Power Management 00246 00247 #define SStatus_IPM_NoDev 0x00 00248 #define SStatus_IPM_Active 0x01 00249 #define SStatus_IPM_Partial 0x02 00250 #define SStatus_IPM_Slumber 0x06 00251 00252 ULONG Reserved:20; 00253 }; 00254 ULONG Reg; 00255 00256 } SATA_SSTATUS_REG, *PSATA_SSTATUS_REG; 00257 00258 00259 typedef union _SATA_SCONTROL_REG { 00260 00261 struct { 00262 ULONG DET:4; // Device Detection Init 00263 00264 #define SControl_DET_DoNothing 0x00 00265 #define SControl_DET_Idle 0x00 00266 #define SControl_DET_Init 0x01 00267 #define SControl_DET_Disable 0x04 00268 00269 ULONG SPD:4; // Speed Allowed 00270 00271 #define SControl_SPD_NoRestrict 0x00 00272 #define SControl_SPD_LimGen1 0x01 00273 #define SControl_SPD_LimGen2 0x02 00274 #define SControl_SPD_LimGen3 0x03 00275 00276 ULONG IPM:4; // Interface Power Management Transitions Allowed 00277 00278 #define SControl_IPM_NoRestrict 0x00 00279 #define SControl_IPM_NoPartial 0x01 00280 #define SControl_IPM_NoSlumber 0x02 00281 #define SControl_IPM_NoPartialSlumber 0x03 00282 00283 ULONG SPM:4; // Select Power Management, unused by AHCI 00284 ULONG PMP:4; // Port Multiplier Port, unused by AHCI 00285 ULONG Reserved:12; 00286 }; 00287 ULONG Reg; 00288 00289 } SATA_SCONTROL_REG, *PSATA_SCONTROL_REG; 00290 00291 00292 typedef union _SATA_SERROR_REG { 00293 00294 struct { 00295 struct { 00296 UCHAR I:1; // Recovered Data Integrity Error 00297 UCHAR M:1; // Recovered Communications Error 00298 UCHAR Reserved_2_7:6; 00299 00300 UCHAR T:1; // Transient Data Integrity Error 00301 UCHAR C:1; // Persistent Communication or Data Integrity Error 00302 UCHAR P:1; // Protocol Error 00303 UCHAR E:1; // Internal Error 00304 UCHAR Reserved_12_15:4; 00305 } ERR; 00306 00307 struct { 00308 UCHAR N:1; // PhyRdy Change, PIS.PRCS 00309 UCHAR I:1; // Phy Internal Error 00310 UCHAR W:1; // Comm Wake 00311 UCHAR B:1; // 10B to 8B Decode Error 00312 UCHAR D:1; // Disparity Error, not used by AHCI 00313 UCHAR C:1; // CRC Error 00314 UCHAR H:1; // Handshake Error 00315 UCHAR S:1; // Link Sequence Error 00316 00317 UCHAR T:1; // Transport state transition error 00318 UCHAR F:1; // Unknown FIS Type 00319 UCHAR X:1; // Exchanged 00320 UCHAR Reserved_27_31:5; 00321 } DIAG; 00322 }; 00323 ULONG Reg; 00324 00325 } SATA_SERROR_REG, *PSATA_SERROR_REG; 00326 00327 00328 typedef struct _IDE_SATA_REGISTERS { 00329 union { 00330 SATA_SSTATUS_REG SStatus; 00331 ULONG SStatus_Reg; 00332 }; 00333 union { 00334 SATA_SERROR_REG SError; 00335 ULONG SError_Reg; 00336 }; 00337 union { 00338 SATA_SCONTROL_REG SControl; 00339 ULONG SControl_Reg; 00340 }; 00341 00342 // SATA 1.2 00343 00344 ULONG SActive; 00345 union { 00346 ULONG Reg; 00347 struct { 00348 USHORT PMN; // PM Notify, bitmask 00349 USHORT Reserved; 00350 }; 00351 } SNTF; 00352 ULONG SReserved[11]; 00353 } IDE_SATA_REGISTERS, *PIDE_SATA_REGISTERS; 00354 00355 #define IDX_SATA_IO (IDX_BM_IO+IDX_BM_IO_SZ) 00356 //#define IDX_SATA_IO_SZ sizeof(IDE_SATA_REGISTERS) 00357 #define IDX_SATA_IO_SZ 5 00358 00359 #define IDX_SATA_SStatus (0+IDX_SATA_IO) 00360 #define IDX_SATA_SError (1+IDX_SATA_IO) 00361 #define IDX_SATA_SControl (2+IDX_SATA_IO) 00362 #define IDX_SATA_SActive (3+IDX_SATA_IO) 00363 #define IDX_SATA_SNTF_PMN (4+IDX_SATA_IO) 00364 00365 #define IDX_INDEXED_IO (IDX_SATA_IO+IDX_SATA_IO_SZ) 00366 #define IDX_INDEXED_IO_SZ 2 00367 00368 #define IDX_INDEXED_ADDR (0+IDX_INDEXED_IO) 00369 #define IDX_INDEXED_DATA (1+IDX_INDEXED_IO) 00370 00371 #define IDX_MAX_REG (IDX_INDEXED_IO+IDX_INDEXED_IO_SZ) 00372 00373 00374 typedef union _AHCI_IS_REG { 00375 struct { 00376 ULONG DHRS:1;// Device to Host Register FIS Interrupt 00377 ULONG PSS:1; // PIO Setup FIS Interrupt 00378 ULONG DSS:1; // DMA Setup FIS Interrupt 00379 ULONG SDBS:1;// Set Device Bits Interrupt 00380 ULONG UFS:1; // Unknown FIS Interrupt 00381 ULONG DPS:1; // Descriptor Processed 00382 ULONG PCS:1; // Port Connect Change Status 00383 ULONG DMPS:1;// Device Mechanical Presence Status 00384 00385 ULONG Reserved_8_21:14; 00386 ULONG PRCS:1;// PhyRdy Change Status 00387 ULONG IPMS:1;// Incorrect Port Multiplier Status 00388 00389 ULONG OFS:1; // Overflow Status 00390 ULONG Reserved_25:1; 00391 ULONG INFS:1;// Interface Non-fatal Error Status 00392 ULONG IFS:1; // Interface Fatal Error Status 00393 ULONG HBDS:1;// Host Bus Data Error Status 00394 ULONG HBFS:1;// Host Bus Fatal Error Status 00395 ULONG TFES:1;// Task File Error Status 00396 ULONG CPDS:1;// Cold Port Detect Status 00397 }; 00398 ULONG Reg; 00399 } AHCI_IS_REG, *PAHCI_IS_REG; 00400 00401 #define ATA_AHCI_P_IX_DHR 0x00000001 00402 #define ATA_AHCI_P_IX_PS 0x00000002 00403 #define ATA_AHCI_P_IX_DS 0x00000004 00404 #define ATA_AHCI_P_IX_SDB 0x00000008 00405 #define ATA_AHCI_P_IX_UF 0x00000010 00406 #define ATA_AHCI_P_IX_DP 0x00000020 00407 #define ATA_AHCI_P_IX_PC 0x00000040 00408 #define ATA_AHCI_P_IX_DI 0x00000080 00409 00410 #define ATA_AHCI_P_IX_PRC 0x00400000 00411 #define ATA_AHCI_P_IX_IPM 0x00800000 00412 #define ATA_AHCI_P_IX_OF 0x01000000 00413 #define ATA_AHCI_P_IX_INF 0x04000000 00414 #define ATA_AHCI_P_IX_IF 0x08000000 00415 #define ATA_AHCI_P_IX_HBD 0x10000000 00416 #define ATA_AHCI_P_IX_HBF 0x20000000 00417 #define ATA_AHCI_P_IX_TFE 0x40000000 00418 #define ATA_AHCI_P_IX_CPD 0x80000000 00419 00420 #define AHCI_CLB_ALIGNEMENT_MASK ((ULONGLONG)(1024-1)) 00421 #define AHCI_FIS_ALIGNEMENT_MASK ((ULONGLONG)(256-1)) 00422 #define AHCI_CMD_ALIGNEMENT_MASK ((ULONGLONG)(128-1)) 00423 00424 typedef struct _IDE_AHCI_PORT_REGISTERS { 00425 union { 00426 struct { 00427 ULONG CLB; // command list base address, 1K-aligned 00428 ULONG CLBU; // command list base address (upper 32bits) 00429 }; 00430 ULONGLONG CLB64; 00431 }; // 0x100 + 0x80*c + 0x0000 00432 00433 union { 00434 struct { 00435 ULONG FB; // FIS base address 00436 ULONG FBU; // FIS base address (upper 32bits) 00437 }; 00438 ULONGLONG FB64; 00439 }; // 0x100 + 0x80*c + 0x0008 00440 00441 union { 00442 ULONG IS_Reg; // interrupt status 00443 AHCI_IS_REG IS; 00444 }; // 0x100 + 0x80*c + 0x0010 00445 00446 union { 00447 ULONG Reg; // interrupt enable 00448 struct { 00449 ULONG DHRE:1;// Device to Host Register FIS Interrupt Enable 00450 ULONG PSE:1; // PIO Setup FIS Interrupt Enable 00451 ULONG DSE:1; // DMA Setup FIS Interrupt Enable 00452 ULONG SDBE:1;// Set Device Bits FIS Interrupt Enable 00453 ULONG UFE:1; // Unknown FIS Interrupt Enable 00454 ULONG DPE:1; // Descriptor Processed Interrupt Enable 00455 ULONG PCE:1; // Port Change Interrupt Enable 00456 ULONG DPME:1;// Device Mechanical Presence Enable 00457 00458 ULONG Reserved_8_21:14; 00459 ULONG PRCE:1;// PhyRdy Change Interrupt Enable 00460 ULONG IPME:1;// Incorrect Port Multiplier Enable 00461 ULONG OFE:1; // Overflow Enable 00462 ULONG Reserved_25:1; 00463 ULONG INFE:1;// Interface Non-fatal Error Enable 00464 ULONG IFE:1; // Interface Fatal Error Enable 00465 ULONG HBDE:1;// Host Bus Data Error Enable 00466 ULONG HBFE:1;// Host Bus Fatal Error Enable 00467 ULONG TFEE:1;// Task File Error Enable 00468 ULONG CPDE:1;// Cold Port Detect Enable 00469 }; 00470 } IE; // 0x100 + 0x80*c + 0x0014 00471 00472 union { 00473 ULONG Reg; // command register 00474 struct { 00475 00476 ULONG ST:1; // Start 00477 ULONG SUD:1; // Spin-Up Device 00478 ULONG POD:1; // Power On Device 00479 ULONG CLO:1; // Command List Override 00480 ULONG FRE:1; // FIS Receive Enable 00481 ULONG Reserved_5_7:3; 00482 00483 ULONG CCS:5; // Current Command Slot 00484 ULONG MPSS:1;// Mechanical Presence Switch State 00485 ULONG FR:1; // FIS Receive Running 00486 ULONG CR:1; // Command List Running 00487 00488 ULONG CPS:1; // Cold Presence State 00489 ULONG PMA:1; // Port Multiplier Attached 00490 ULONG HPCP:1;// Hot Plug Capable Port 00491 ULONG MPSP:1;// Mechanical Presence Switch Attached to Port 00492 ULONG CPD:1; // Cold Presence Detection 00493 ULONG ESP:1; // External SATA Port 00494 ULONG Reserved_22_23:2; 00495 00496 ULONG ATAPI:1; // Device is ATAPI 00497 ULONG DLAE:1;// Drive LED on ATAPI Enable 00498 ULONG ALPE:1;// Aggressive Link Power Management Enable 00499 ULONG ASP:1; // Aggressive Slumber / Partial 00500 ULONG ICC:4; // Interface Communication Control 00501 00502 #define SATA_CMD_ICC_Idle 0x00 00503 #define SATA_CMD_ICC_NoOp 0x00 00504 #define SATA_CMD_ICC_Active 0x01 00505 #define SATA_CMD_ICC_Partial 0x02 00506 #define SATA_CMD_ICC_Slumber 0x06 00507 }; 00508 } CMD; // 0x100 + 0x80*c + 0x0018 00509 00510 ULONG Reserved; 00511 00512 union { 00513 ULONG Reg; // Task File Data 00514 struct { 00515 struct { 00516 UCHAR ERR:1; 00517 UCHAR cs1:2;// command-specific 00518 UCHAR DRQ:1; 00519 UCHAR cs2:3;// command-specific 00520 UCHAR BSY:1; 00521 } STS; 00522 UCHAR ERR; // Contains the latest copy of the task file error register. 00523 UCHAR Reserved[2]; 00524 }; 00525 } TFD; // 0x100 + 0x80*c + 0x0020 00526 00527 union { 00528 ULONG Reg; // signature 00529 struct { 00530 UCHAR SectorCount; 00531 UCHAR LbaLow; 00532 UCHAR LbaMid; 00533 UCHAR LbaHigh; 00534 }; 00535 } SIG; // 0x100 + 0x80*c + 0x0024 00536 union { 00537 ULONG SStatus; // SCR0 00538 SATA_SSTATUS_REG SSTS; 00539 }; // 0x100 + 0x80*c + 0x0028 00540 union { 00541 ULONG SControl; // SCR2 00542 SATA_SCONTROL_REG SCTL; 00543 }; // 0x100 + 0x80*c + 0x002c 00544 union { 00545 ULONG SError; // SCR1 00546 SATA_SERROR_REG SERR; 00547 }; // 0x100 + 0x80*c + 0x0030 00548 union { 00549 ULONG SACT; // SCR3 00550 ULONG SActive; // bitmask 00551 }; // 0x100 + 0x80*c + 0x0034 00552 00553 ULONG CI; // Command issue, bitmask, 0x100 + 0x80*c + 0x0038 00554 00555 // AHCI 1.1 00556 union { 00557 ULONG Reg; 00558 struct { 00559 USHORT PMN; // PM Notify, bitmask 00560 USHORT Reserved; 00561 }; 00562 } SNTF; // 0x100 + 0x80*c + 0x003c 00563 00564 ULONG FIS_Switching_Reserved[12]; 00565 UCHAR VendorSpec[16]; 00566 00567 } IDE_AHCI_PORT_REGISTERS, *PIDE_AHCI_PORT_REGISTERS; 00568 00569 #define IDX_AHCI_P_CLB (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, CLB)) 00570 #define IDX_AHCI_P_FB (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, FB)) 00571 #define IDX_AHCI_P_IS (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, IS)) 00572 #define IDX_AHCI_P_IE (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, IE)) 00573 #define IDX_AHCI_P_CI (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, CI)) 00574 #define IDX_AHCI_P_TFD (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, TFD)) 00575 #define IDX_AHCI_P_SIG (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SIG)) 00576 #define IDX_AHCI_P_CMD (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, CMD)) 00577 00578 #define IDX_AHCI_P_SNTF (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SNTF)) 00579 00580 // AHCI commands ( -> IDX_AHCI_P_CMD) 00581 #define ATA_AHCI_P_CMD_ST 0x00000001 00582 #define ATA_AHCI_P_CMD_SUD 0x00000002 00583 #define ATA_AHCI_P_CMD_POD 0x00000004 00584 #define ATA_AHCI_P_CMD_CLO 0x00000008 00585 #define ATA_AHCI_P_CMD_FRE 0x00000010 00586 #define ATA_AHCI_P_CMD_CCS_MASK 0x00001f00 00587 #define ATA_AHCI_P_CMD_ISS 0x00002000 00588 #define ATA_AHCI_P_CMD_FR 0x00004000 00589 #define ATA_AHCI_P_CMD_CR 0x00008000 00590 #define ATA_AHCI_P_CMD_CPS 0x00010000 00591 #define ATA_AHCI_P_CMD_PMA 0x00020000 00592 #define ATA_AHCI_P_CMD_HPCP 0x00040000 00593 #define ATA_AHCI_P_CMD_ISP 0x00080000 00594 #define ATA_AHCI_P_CMD_CPD 0x00100000 00595 #define ATA_AHCI_P_CMD_ATAPI 0x01000000 00596 #define ATA_AHCI_P_CMD_DLAE 0x02000000 00597 #define ATA_AHCI_P_CMD_ALPE 0x04000000 00598 #define ATA_AHCI_P_CMD_ASP 0x08000000 00599 #define ATA_AHCI_P_CMD_ICC_MASK 0xf0000000 00600 #define ATA_AHCI_P_CMD_NOOP 0x00000000 00601 #define ATA_AHCI_P_CMD_ACTIVE 0x10000000 00602 #define ATA_AHCI_P_CMD_PARTIAL 0x20000000 00603 #define ATA_AHCI_P_CMD_SLUMBER 0x60000000 00604 00605 00606 typedef struct _IDE_AHCI_PRD_ENTRY { 00607 union { 00608 ULONG base; 00609 ULONGLONG base64; 00610 struct { 00611 ULONG DBA; 00612 union { 00613 ULONG DBAU; 00614 ULONG baseu; 00615 }; 00616 }; 00617 }; 00618 ULONG Reserved1; 00619 00620 ULONG DBC:22; 00621 ULONG Reserved2:9; 00622 ULONG I:1; 00623 00624 } IDE_AHCI_PRD_ENTRY, *PIDE_AHCI_PRD_ENTRY; 00625 00626 #define ATA_AHCI_DMA_ENTRIES (PAGE_SIZE/2/sizeof(IDE_AHCI_PRD_ENTRY)) /* 128 */ 00627 #define ATA_AHCI_MAX_TAGS 32 00628 00629 #define AHCI_FIS_TYPE_ATA_H2D 0x27 00630 #define AHCI_FIS_TYPE_ATA_D2H 0x34 00631 00632 #define AHCI_FIS_COMM_PM (0x80 | AHCI_DEV_SEL_PM) 00633 00634 #define AHCI_DEV_SEL_1 0x00 00635 #define AHCI_DEV_SEL_2 0x01 00636 #define AHCI_DEV_SEL_PM 0x0f 00637 00638 /* 128-byte aligned */ 00639 typedef struct _IDE_AHCI_CMD { 00640 UCHAR cfis[64]; 00641 UCHAR acmd[32]; 00642 UCHAR Reserved[32]; 00643 IDE_AHCI_PRD_ENTRY prd_tab[ATA_AHCI_DMA_ENTRIES]; // also 128-byte aligned 00644 } IDE_AHCI_CMD, *PIDE_AHCI_CMD; 00645 00646 00647 /* cmd_flags */ 00648 #define ATA_AHCI_CMD_ATAPI 0x0020 00649 #define ATA_AHCI_CMD_WRITE 0x0040 00650 #define ATA_AHCI_CMD_PREFETCH 0x0080 00651 #define ATA_AHCI_CMD_RESET 0x0100 00652 #define ATA_AHCI_CMD_BIST 0x0200 00653 #define ATA_AHCI_CMD_CLR_BUSY 0x0400 00654 00655 /* 128-byte aligned */ 00656 typedef struct _IDE_AHCI_CMD_LIST { 00657 USHORT cmd_flags; 00658 USHORT prd_length; /* PRD entries */ 00659 ULONG bytecount; 00660 ULONGLONG cmd_table_phys; /* points to IDE_AHCI_CMD */ 00661 ULONG Reserved[4]; 00662 } IDE_AHCI_CMD_LIST, *PIDE_AHCI_CMD_LIST; 00663 00664 /* 256-byte aligned */ 00665 typedef struct _IDE_AHCI_RCV_FIS { 00666 UCHAR dsfis[28]; 00667 UCHAR Reserved1[4]; 00668 UCHAR psfis[24]; 00669 UCHAR Reserved2[8]; 00670 UCHAR rfis[24]; 00671 UCHAR Reserved3[4]; 00672 ULONG SDBFIS; 00673 UCHAR ufis[64]; 00674 UCHAR Reserved4[96]; 00675 } IDE_AHCI_RCV_FIS, *PIDE_AHCI_RCV_FIS; 00676 00677 /* 1K-byte aligned */ 00678 typedef struct _IDE_AHCI_CHANNEL_CTL_BLOCK { 00679 IDE_AHCI_CMD_LIST cmd_list[ATA_AHCI_MAX_TAGS]; // 1K-size (32*32) 00680 IDE_AHCI_RCV_FIS rcv_fis; 00681 IDE_AHCI_CMD cmd; // for single internal comamnds w/o associated AtaReq 00682 } IDE_AHCI_CHANNEL_CTL_BLOCK, *PIDE_AHCI_CHANNEL_CTL_BLOCK; 00683 00684 00685 #define IsBusMaster(pciData) \ 00686 ( ((pciData)->Command & (PCI_ENABLE_BUS_MASTER/* | PCI_ENABLE_IO_SPACE*/)) == \ 00687 (PCI_ENABLE_BUS_MASTER/* | PCI_ENABLE_IO_SPACE*/)) 00688 00689 #define PCI_IDE_PROGIF_NATIVE_1 0x01 00690 #define PCI_IDE_PROGIF_NATIVE_2 0x04 00691 #define PCI_IDE_PROGIF_NATIVE_ALL 0x05 00692 00693 #define IsMasterDev(pciData) \ 00694 ( ((pciData)->ProgIf & 0x80) && \ 00695 ((pciData)->ProgIf & PCI_IDE_PROGIF_NATIVE_ALL) != PCI_IDE_PROGIF_NATIVE_ALL ) 00696 00697 //#define INT_Q_SIZE 32 00698 #define MIN_REQ_TTL 4 00699 00700 union _ATA_REQ; 00701 00702 typedef union _ATA_REQ { 00703 // ULONG reqId; // serial 00704 struct { 00705 00706 //union { 00707 00708 struct { 00709 union _ATA_REQ* next_req; 00710 union _ATA_REQ* prev_req; 00711 00712 PSCSI_REQUEST_BLOCK Srb; // Current request on controller. 00713 00714 PUSHORT DataBuffer; // Data buffer pointer. 00715 ULONG WordsLeft; // Data words left. 00716 ULONG TransferLength; // Originally requested transfer length 00717 LONGLONG lba; 00718 ULONG WordsTransfered;// Data words already transfered. 00719 ULONG bcount; 00720 00721 UCHAR retry; 00722 UCHAR ttl; 00723 // UCHAR tag; 00724 UCHAR Flags; 00725 UCHAR ReqState; 00726 00727 PSCSI_REQUEST_BLOCK OriginalSrb; // Mechanism Status Srb Data 00728 00729 ULONG dma_entries; 00730 union { 00731 // for ATA 00732 struct { 00733 ULONG dma_base; 00734 ULONG dma_baseu; 00735 } ata; 00736 // for AHCI 00737 struct { 00738 ULONGLONG ahci_base64; 00739 ULONGLONG in_lba; 00740 PIDE_AHCI_CMD ahci_cmd_ptr; 00741 ULONG in_bcount; 00742 ULONG in_status; 00743 USHORT io_cmd_flags; // out 00744 00745 } ahci; 00746 }; 00747 }; 00748 //UCHAR padding_128b[128]; // Note: we assume, NT allocates block > 4k as PAGE-aligned 00749 //}; 00750 struct { 00751 union { 00752 BM_DMA_ENTRY dma_tab[ATA_DMA_ENTRIES]; 00753 IDE_AHCI_CMD ahci_cmd0; // for AHCI, 128-byte aligned 00754 }; 00755 }; 00756 }; 00757 00758 UCHAR padding_4kb[PAGE_SIZE]; 00759 00760 } ATA_REQ, *PATA_REQ; 00761 00762 #define REQ_FLAG_FORCE_DOWNRATE 0x01 00763 #define REQ_FLAG_DMA_OPERATION 0x02 00764 #define REQ_FLAG_REORDERABLE_CMD 0x04 00765 #define REQ_FLAG_RW_MASK 0x08 00766 #define REQ_FLAG_READ 0x08 00767 #define REQ_FLAG_WRITE 0x00 00768 #define REQ_FLAG_FORCE_DOWNRATE_LBA48 0x10 00769 #define REQ_FLAG_DMA_DBUF 0x20 00770 #define REQ_FLAG_DMA_DBUF_PRD 0x40 00771 #define REQ_FLAG_LBA48 0x80 00772 00773 // Request states 00774 #define REQ_STATE_NONE 0x00 00775 #define REQ_STATE_QUEUED 0x10 00776 00777 #define REQ_STATE_PREPARE_TO_TRANSFER 0x20 00778 #define REQ_STATE_PREPARE_TO_NEXT 0x21 00779 #define REQ_STATE_READY_TO_TRANSFER 0x30 00780 00781 #define REQ_STATE_EXPECTING_INTR 0x40 00782 #define REQ_STATE_ATAPI_EXPECTING_CMD_INTR 0x41 00783 #define REQ_STATE_ATAPI_EXPECTING_DATA_INTR 0x42 00784 #define REQ_STATE_ATAPI_DO_NOTHING_INTR 0x43 00785 00786 #define REQ_STATE_EARLY_INTR 0x48 00787 00788 #define REQ_STATE_PROCESSING_INTR 0x50 00789 00790 #define REQ_STATE_DPC_INTR_REQ 0x51 00791 #define REQ_STATE_DPC_RESET_REQ 0x52 00792 #define REQ_STATE_DPC_COMPLETE_REQ 0x53 00793 00794 #define REQ_STATE_DPC_WAIT_BUSY0 0x57 00795 #define REQ_STATE_DPC_WAIT_BUSY1 0x58 00796 #define REQ_STATE_DPC_WAIT_BUSY 0x59 00797 #define REQ_STATE_DPC_WAIT_DRQ 0x5a 00798 #define REQ_STATE_DPC_WAIT_DRQ0 0x5b 00799 #define REQ_STATE_DPC_WAIT_DRQ_ERR 0x5c 00800 00801 #define REQ_STATE_TRANSFER_COMPLETE 0x7f 00802 00803 // Command actions: 00804 #define CMD_ACTION_PREPARE 0x01 00805 #define CMD_ACTION_EXEC 0x02 00806 #define CMD_ACTION_ALL (CMD_ACTION_PREPARE | CMD_ACTION_EXEC) 00807 00808 // predefined Reorder costs 00809 #define REORDER_COST_MAX ((DEF_I64(0x1) << 60) - 1) 00810 #define REORDER_COST_TTL (REORDER_COST_MAX - 1) 00811 #define REORDER_COST_INTERSECT (REORDER_COST_MAX - 2) 00812 #define REORDER_COST_DENIED (REORDER_COST_MAX - 3) 00813 #define REORDER_COST_RESELECT (REORDER_COST_MAX/4) 00814 00815 #define REORDER_COST_SWITCH_RW_CD (REORDER_COST_MAX/8) 00816 #define REORDER_MCOST_SWITCH_RW_CD (0) 00817 #define REORDER_MCOST_SEEK_BACK_CD (16) 00818 00819 #define REORDER_COST_SWITCH_RW_HDD (0) 00820 #define REORDER_MCOST_SWITCH_RW_HDD (4) 00821 #define REORDER_MCOST_SEEK_BACK_HDD (2) 00822 00823 /*typedef struct _ATA_QUEUE { 00824 struct _ATA_REQ* head_req; // index 00825 struct _ATA_REQ* tail_req; // index 00826 ULONG req_count; 00827 ULONG dma_base; 00828 BM_DMA_ENTRY dma_tab[ATA_DMA_ENTRIES]; 00829 } ATA_QUEUE, *PATA_QUEUE;*/ 00830 00831 struct _HW_DEVICE_EXTENSION; 00832 struct _HW_LU_EXTENSION; 00833 00834 typedef struct _IORES { 00835 ULONG Addr; /* Base address*/ 00836 ULONG MemIo:1; /* Memory mapping (1) vs IO ports (0) */ 00837 ULONG Proc:1; /* Need special process via IO_Proc */ 00838 ULONG Reserved:30; 00839 } IORES, *PIORES; 00840 00841 // Channel extension 00842 typedef struct _HW_CHANNEL { 00843 00844 PATA_REQ cur_req; 00845 ULONG cur_cdev; 00846 /* PATA_REQ first_req; 00847 PATA_REQ last_req;*/ 00848 ULONG queue_depth; 00849 ULONG ChannelSelectWaitCount; 00850 00851 UCHAR DpcState; 00852 00853 BOOLEAN ExpectingInterrupt; // Indicates expecting an interrupt 00854 BOOLEAN RDP; // Indicate last tape command was DSC Restrictive. 00855 // Indicates whether '0x1f0' is the base address. Used 00856 // in SMART Ioctl calls. 00857 BOOLEAN PrimaryAddress; 00858 // Placeholder for the sub-command value of the last 00859 // SMART command. 00860 UCHAR SmartCommand; 00861 // Reorder anabled 00862 BOOLEAN UseReorder; 00863 // Placeholder for status register after a GET_MEDIA_STATUS command 00864 UCHAR ReturningMediaStatus; 00865 00866 BOOLEAN CopyDmaBuffer; 00867 //BOOLEAN MemIo; 00868 BOOLEAN AltRegMap; 00869 00870 //UCHAR Reserved[3]; 00871 00872 MECHANICAL_STATUS_INFORMATION_HEADER MechStatusData; 00873 SENSE_DATA MechStatusSense; 00874 ULONG MechStatusRetryCount; 00875 SCSI_REQUEST_BLOCK InternalSrb; 00876 00877 ULONG MaxTransferMode; // may differ from Controller's value due to 40-pin cable 00878 00879 ULONG ChannelCtrlFlags; 00880 ULONG ResetInProgress; // flag 00881 LONG DisableIntr; 00882 LONG CheckIntr; 00883 00884 ULONG lChannel; 00885 00886 #define CHECK_INTR_ACTIVE 0x03 00887 #define CHECK_INTR_DETECTED 0x02 00888 #define CHECK_INTR_CHECK 0x01 00889 #define CHECK_INTR_IDLE 0x00 00890 00891 ULONG NextDpcChan; 00892 PHW_TIMER HwScsiTimer; 00893 LONGLONG DpcTime; 00894 #if 0 00895 PHW_TIMER HwScsiTimer1; 00896 PHW_TIMER HwScsiTimer2; 00897 LONGLONG DpcTime1; 00898 // PHW_TIMER CurDpc; 00899 // LARGE_INTEGER ActivationTime; 00900 00901 // KDPC Dpc; 00902 // KTIMER Timer; 00903 // PHW_TIMER HwScsiTimer; 00904 // KSPIN_LOCK QueueSpinLock; 00905 // KIRQL QueueOldIrql; 00906 #endif 00907 struct _HW_DEVICE_EXTENSION* DeviceExtension; 00908 struct _HW_LU_EXTENSION* lun[IDE_MAX_LUN_PER_CHAN]; 00909 00910 ULONG NumberLuns; 00911 ULONG PmLunMap; 00912 00913 // Double-buffering support 00914 PVOID DB_PRD; 00915 ULONG DB_PRD_PhAddr; 00916 PVOID DB_IO; 00917 ULONG DB_IO_PhAddr; 00918 00919 PUCHAR DmaBuffer; 00920 00921 // 00922 PIDE_AHCI_CHANNEL_CTL_BLOCK AhciCtlBlock0; // unaligned 00923 PIDE_AHCI_CHANNEL_CTL_BLOCK AhciCtlBlock; // 128-byte aligned 00924 ULONGLONG AHCI_CTL_PhAddr; 00925 IORES BaseIoAHCI_Port; 00926 //PVOID AHCI_FIS; // is not actually used by UniATA now, but is required by AHCI controller 00927 //ULONGLONG AHCI_FIS_PhAddr; 00928 // Note: in contrast to FBSD, we keep PRD and CMD item in AtaReq structure 00929 00930 #ifdef QUEUE_STATISTICS 00931 LONGLONG QueueStat[MAX_QUEUE_STAT]; 00932 LONGLONG ReorderCount; 00933 LONGLONG IntersectCount; 00934 LONGLONG TryReorderCount; 00935 LONGLONG TryReorderHeadCount; 00936 LONGLONG TryReorderTailCount; /* in-order requests */ 00937 #endif //QUEUE_STATISTICS 00938 00939 //ULONG BaseMemAddress; 00940 //ULONG BaseMemAddressOffset; 00941 IORES RegTranslation[IDX_MAX_REG]; 00942 00943 } HW_CHANNEL, *PHW_CHANNEL; 00944 00945 #define CTRFLAGS_DMA_ACTIVE 0x0001 00946 #define CTRFLAGS_DMA_RO 0x0002 00947 #define CTRFLAGS_DMA_OPERATION 0x0004 00948 #define CTRFLAGS_INTR_DISABLED 0x0008 00949 #define CTRFLAGS_DPC_REQ 0x0010 00950 #define CTRFLAGS_ENABLE_INTR_REQ 0x0020 00951 #define CTRFLAGS_LBA48 0x0040 00952 #define CTRFLAGS_DSC_BSY 0x0080 00953 #define CTRFLAGS_NO_SLAVE 0x0100 00954 //#define CTRFLAGS_PATA 0x0200 00955 #define CTRFLAGS_AHCI_PM 0x0400 00956 #define CTRFLAGS_AHCI_PM2 0x0800 00957 00958 #define CTRFLAGS_PERMANENT (CTRFLAGS_DMA_RO | CTRFLAGS_NO_SLAVE) 00959 00960 #define GEOM_AUTO 0xffffffff 00961 #define GEOM_STD 0x0000 00962 #define GEOM_UNIATA 0x0001 00963 #define GEOM_ORIG 0x0002 00964 #define GEOM_MANUAL 0x0003 00965 00966 #define DPC_STATE_NONE 0x00 00967 #define DPC_STATE_ISR 0x10 00968 #define DPC_STATE_DPC 0x20 00969 #define DPC_STATE_TIMER 0x30 00970 #define DPC_STATE_COMPLETE 0x40 00971 00972 // Logical unit extension 00973 typedef struct _HW_LU_EXTENSION { 00974 IDENTIFY_DATA2 IdentifyData; 00975 ULONGLONG NumOfSectors; 00976 ULONG DeviceFlags; // Flags word for each possible device. DFLAGS_XXX 00977 ULONG DiscsPresent; // Indicates number of platters on changer-ish devices. 00978 BOOLEAN DWordIO; // Indicates use of 32-bit PIO 00979 UCHAR ReturningMediaStatus; 00980 00981 UCHAR TransferMode; // current transfer mode 00982 UCHAR LimitedTransferMode; // user-defined or IDE cable limitation 00983 UCHAR OrigTransferMode; // transfer mode, returned by device IDENTIFY (can be changed via IOCTL) 00984 00985 UCHAR MaximumBlockXfer; 00986 UCHAR Padding0[2]; // padding 00987 ULONG ErrorCount; // Count of errors. Used to turn off features. 00988 // ATA_QUEUE cmd_queue; 00989 LONGLONG ReadCmdCost; 00990 LONGLONG WriteCmdCost; 00991 LONGLONG OtherCmdCost; 00992 LONGLONG RwSwitchCost; 00993 LONGLONG RwSwitchMCost; 00994 LONGLONG SeekBackMCost; 00995 // 00996 PATA_REQ first_req; 00997 PATA_REQ last_req; 00998 ULONG queue_depth; 00999 ULONG last_write; 01000 01001 ULONG LunSelectWaitCount; 01002 01003 // tuning options 01004 ULONG opt_GeomType; 01005 ULONG opt_MaxTransferMode; 01006 ULONG opt_PreferedTransferMode; 01007 BOOLEAN opt_ReadCacheEnable; 01008 BOOLEAN opt_WriteCacheEnable; 01009 UCHAR opt_ReadOnly; 01010 // padding 01011 BOOLEAN opt_reserved[1]; 01012 01013 struct _SBadBlockListItem* bbListDescr; 01014 struct _SBadBlockRange* arrBadBlocks; 01015 ULONG nBadBlocks; 01016 01017 // Controller-specific LUN options 01018 union { 01019 /* for tricky controllers, those can change Logical-to-Physical LUN mapping. 01020 mainly for mapping SATA ports to compatible PATA registers 01021 Treated as PHYSICAL port number, regardless of logical mapping. 01022 */ 01023 ULONG SATA_lun_map; 01024 }; 01025 01026 struct _HW_DEVICE_EXTENSION* DeviceExtension; 01027 struct _HW_CHANNEL* chan; 01028 ULONG Lun; 01029 01030 #ifdef IO_STATISTICS 01031 01032 LONGLONG ModeErrorCount[MAX_RETRIES]; 01033 LONGLONG RecoverCount[MAX_RETRIES]; 01034 LONGLONG IoCount; 01035 LONGLONG BlockIoCount; 01036 01037 #endif//IO_STATISTICS 01038 } HW_LU_EXTENSION, *PHW_LU_EXTENSION; 01039 01040 // Device extension 01041 typedef struct _HW_DEVICE_EXTENSION { 01042 CHAR Signature[32]; 01043 //PIDE_REGISTERS_1 BaseIoAddress1[IDE_MAX_CHAN]; // Base register locations 01044 //PIDE_REGISTERS_2 BaseIoAddress2[IDE_MAX_CHAN]; 01045 ULONG BusInterruptLevel; // Interrupt level 01046 ULONG InterruptMode; // Interrupt Mode (Level or Edge) 01047 ULONG BusInterruptVector; 01048 // Number of channels being supported by one instantiation 01049 // of the device extension. Normally (and correctly) one, but 01050 // with so many broken PCI IDE controllers being sold, we have 01051 // to support them. 01052 ULONG NumberChannels; 01053 ULONG NumberLuns; 01054 ULONG FirstChannelToCheck; 01055 #if 0 01056 HW_LU_EXTENSION lun[IDE_MAX_LUN]; 01057 HW_CHANNEL chan[AHCI_MAX_PORT/*IDE_MAX_CHAN*/]; 01058 #else 01059 PHW_LU_EXTENSION lun; 01060 PHW_CHANNEL chan; 01061 #endif 01062 UCHAR LastInterruptedChannel; 01063 // Indicates the number of blocks transferred per int. according to the 01064 // identify data. 01065 BOOLEAN DriverMustPoll; // Driver is being used by the crash dump utility or ntldr. 01066 BOOLEAN BusMaster; 01067 BOOLEAN UseDpc; // Indicates use of DPC on long waits 01068 IDENTIFY_DATA FullIdentifyData; // Identify data for device 01069 // BusMaster specific data 01070 // PBM_DMA_ENTRY dma_tab_0; 01071 //KSPIN_LOCK DpcSpinLock; 01072 01073 ULONG ActiveDpcChan; 01074 ULONG FirstDpcChan; 01075 /* 01076 PHW_TIMER HwScsiTimer1; 01077 PHW_TIMER HwScsiTimer2; 01078 LONGLONG DpcTime1; 01079 LONGLONG DpcTime2; 01080 */ 01081 ULONG queue_depth; 01082 01083 PDEVICE_OBJECT Isr2DevObj; 01084 01085 //PIDE_BUSMASTER_REGISTERS BaseIoAddressBM_0; 01086 IORES BaseIoAddressBM_0; 01087 //PIDE_BUSMASTER_REGISTERS BaseIoAddressBM[IDE_MAX_CHAN]; 01088 01089 // Device identification 01090 ULONG DevID; 01091 ULONG RevID; 01092 ULONG slotNumber; 01093 ULONG SystemIoBusNumber; 01094 ULONG DevIndex; 01095 01096 ULONG InitMethod; // vendor specific 01097 01098 ULONG Channel; 01099 01100 ULONG HbaCtrlFlags; 01101 BOOLEAN simplexOnly; 01102 //BOOLEAN MemIo; 01103 BOOLEAN AltRegMap; 01104 BOOLEAN UnknownDev; 01105 BOOLEAN MasterDev; 01106 BOOLEAN Host64; 01107 BOOLEAN DWordIO; // Indicates use of 32-bit PIO 01108 UCHAR Reserved1[2]; 01109 01110 LONG ReCheckIntr; 01111 01112 ULONG MaxTransferMode; // max transfer mode supported by controller 01113 ULONG HwFlags; 01114 INTERFACE_TYPE OrigAdapterInterfaceType; 01115 INTERFACE_TYPE AdapterInterfaceType; 01116 ULONG MaximumDmaTransferLength; 01117 ULONG AlignmentMask; 01118 01119 //ULONG BaseMemAddress; 01120 01121 //PIDE_SATA_REGISTERS BaseIoAddressSATA_0; 01122 IORES BaseIoAddressSATA_0; 01123 //PIDE_SATA_REGISTERS BaseIoAddressSATA[IDE_MAX_CHAN]; 01124 01125 IORES BaseIoAHCI_0; 01126 //PIDE_AHCI_PORT_REGISTERS BaseIoAHCIPort[AHCI_MAX_PORT]; 01127 ULONG AHCI_CAP; 01128 01129 BOOLEAN opt_AtapiDmaZeroTransfer; // default FALSE 01130 BOOLEAN opt_AtapiDmaControlCmd; // default FALSE 01131 BOOLEAN opt_AtapiDmaRawRead; // default TRUE 01132 BOOLEAN opt_AtapiDmaReadWrite; // default TRUE 01133 01134 PCCH FullDevName; 01135 01136 // Controller specific state/options 01137 union { 01138 ULONG HwCfg; 01139 }; 01140 01141 } HW_DEVICE_EXTENSION, *PHW_DEVICE_EXTENSION; 01142 01143 typedef struct _ISR2_DEVICE_EXTENSION { 01144 PHW_DEVICE_EXTENSION HwDeviceExtension; 01145 ULONG DevIndex; 01146 } ISR2_DEVICE_EXTENSION, *PISR2_DEVICE_EXTENSION; 01147 01148 #define HBAFLAGS_DMA_DISABLED 0x01 01149 #define HBAFLAGS_DMA_DISABLED_LBA48 0x02 01150 01151 extern UCHAR pciBuffer[256]; 01152 extern PBUSMASTER_CONTROLLER_INFORMATION BMList; 01153 extern ULONG BMListLen; 01154 extern ULONG IsaCount; 01155 extern ULONG MCACount; 01156 01157 //extern const CHAR retry_Wdma[MAX_RETRIES+1]; 01158 //extern const CHAR retry_Udma[MAX_RETRIES+1]; 01159 01160 extern VOID 01161 NTAPI 01162 UniataEnumBusMasterController( 01163 IN PVOID DriverObject, 01164 PVOID Argument2 01165 ); 01166 01167 extern ULONG NTAPI 01168 UniataFindCompatBusMasterController1( 01169 IN PVOID HwDeviceExtension, 01170 IN PVOID Context, 01171 IN PVOID BusInformation, 01172 IN PCHAR ArgumentString, 01173 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, 01174 OUT PBOOLEAN Again 01175 ); 01176 01177 extern ULONG NTAPI 01178 UniataFindCompatBusMasterController2( 01179 IN PVOID HwDeviceExtension, 01180 IN PVOID Context, 01181 IN PVOID BusInformation, 01182 IN PCHAR ArgumentString, 01183 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, 01184 OUT PBOOLEAN Again 01185 ); 01186 01187 #define UNIATA_ALLOCATE_NEW_LUNS 0x00 01188 01189 extern BOOLEAN 01190 NTAPI 01191 UniataAllocateLunExt( 01192 PHW_DEVICE_EXTENSION deviceExtension, 01193 ULONG NewNumberChannels 01194 ); 01195 01196 extern ULONG NTAPI 01197 UniataFindBusMasterController( 01198 IN PVOID HwDeviceExtension, 01199 IN PVOID Context, 01200 IN PVOID BusInformation, 01201 IN PCHAR ArgumentString, 01202 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, 01203 OUT PBOOLEAN Again 01204 ); 01205 01206 extern ULONG NTAPI 01207 UniataFindFakeBusMasterController( 01208 IN PVOID HwDeviceExtension, 01209 IN PVOID Context, 01210 IN PVOID BusInformation, 01211 IN PCHAR ArgumentString, 01212 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, 01213 OUT PBOOLEAN Again 01214 ); 01215 01216 extern NTSTATUS 01217 NTAPI 01218 UniataConnectIntr2( 01219 IN PVOID HwDeviceExtension 01220 ); 01221 01222 extern NTSTATUS 01223 NTAPI 01224 UniataDisconnectIntr2( 01225 IN PVOID HwDeviceExtension 01226 ); 01227 01228 extern ULONG 01229 NTAPI 01230 ScsiPortGetBusDataByOffset( 01231 IN PVOID HwDeviceExtension, 01232 IN BUS_DATA_TYPE BusDataType, 01233 IN ULONG BusNumber, 01234 IN ULONG SlotNumber, 01235 IN PVOID Buffer, 01236 IN ULONG Offset, 01237 IN ULONG Length 01238 ); 01239 01240 #define PCIBUSNUM_NOT_SPECIFIED (0xffffffffL) 01241 #define PCISLOTNUM_NOT_SPECIFIED (0xffffffffL) 01242 01243 extern ULONG 01244 NTAPI 01245 AtapiFindListedDev( 01246 PBUSMASTER_CONTROLLER_INFORMATION BusMasterAdapters, 01247 ULONG lim, 01248 IN PVOID HwDeviceExtension, 01249 IN ULONG BusNumber, 01250 IN ULONG SlotNumber, 01251 OUT PCI_SLOT_NUMBER* _slotData // optional 01252 ); 01253 01254 extern ULONG 01255 NTAPI 01256 AtapiFindDev( 01257 IN PVOID HwDeviceExtension, 01258 IN BUS_DATA_TYPE BusDataType, 01259 IN ULONG BusNumber, 01260 IN ULONG SlotNumber, 01261 IN ULONG dev_id, 01262 IN ULONG RevID 01263 ); 01264 01265 extern VOID 01266 NTAPI 01267 AtapiDmaAlloc( 01268 IN PVOID HwDeviceExtension, 01269 IN PPORT_CONFIGURATION_INFORMATION ConfigInfo, 01270 IN ULONG lChannel // logical channel, 01271 ); 01272 01273 extern BOOLEAN 01274 NTAPI 01275 AtapiDmaSetup( 01276 IN PVOID HwDeviceExtension, 01277 IN ULONG DeviceNumber, 01278 IN ULONG lChannel, // logical channel, 01279 IN PSCSI_REQUEST_BLOCK Srb, 01280 IN PUCHAR data, 01281 IN ULONG count 01282 ); 01283 01284 extern BOOLEAN 01285 NTAPI 01286 AtapiDmaPioSync( 01287 PVOID HwDeviceExtension, 01288 PSCSI_REQUEST_BLOCK Srb, 01289 PUCHAR data, 01290 ULONG count 01291 ); 01292 01293 extern BOOLEAN 01294 NTAPI 01295 AtapiDmaDBSync( 01296 PHW_CHANNEL chan, 01297 PSCSI_REQUEST_BLOCK Srb 01298 ); 01299 01300 extern VOID 01301 NTAPI 01302 AtapiDmaStart( 01303 IN PVOID HwDeviceExtension, 01304 IN ULONG DeviceNumber, 01305 IN ULONG lChannel, // logical channel, 01306 IN PSCSI_REQUEST_BLOCK Srb 01307 ); 01308 01309 extern UCHAR 01310 NTAPI 01311 AtapiDmaDone( 01312 IN PVOID HwDeviceExtension, 01313 IN ULONG DeviceNumber, 01314 IN ULONG lChannel, // logical channel, 01315 IN PSCSI_REQUEST_BLOCK Srb 01316 ); 01317 01318 extern VOID 01319 NTAPI 01320 AtapiDmaReinit( 01321 IN PHW_DEVICE_EXTENSION deviceExtension, 01322 IN PHW_LU_EXTENSION LunExt, 01323 IN PATA_REQ AtaReq 01324 ); 01325 01326 extern VOID 01327 NTAPI 01328 AtapiDmaInit__( 01329 IN PHW_DEVICE_EXTENSION deviceExtension, 01330 IN PHW_LU_EXTENSION LunExt 01331 ); 01332 01333 extern VOID 01334 NTAPI 01335 AtapiDmaInit( 01336 IN PVOID HwDeviceExtension, 01337 IN ULONG DeviceNumber, 01338 IN ULONG lChannel, // logical channel, 01339 // is always 0 except simplex-only and multi-channel controllers 01340 IN SCHAR apiomode, 01341 IN SCHAR wdmamode, 01342 IN SCHAR udmamode 01343 ); 01344 01345 extern BOOLEAN NTAPI 01346 AtapiInterrupt2( 01347 IN PKINTERRUPT Interrupt, 01348 IN PVOID HwDeviceExtension 01349 ); 01350 01351 extern PDRIVER_OBJECT SavedDriverObject; 01352 01353 extern BOOLEAN 01354 NTAPI 01355 UniataChipDetectChannels( 01356 IN PVOID HwDeviceExtension, 01357 IN PPCI_COMMON_CONFIG pciData, // optional 01358 IN ULONG DeviceNumber, 01359 IN PPORT_CONFIGURATION_INFORMATION ConfigInfo 01360 ); 01361 01362 extern NTSTATUS 01363 NTAPI 01364 UniataChipDetect( 01365 IN PVOID HwDeviceExtension, 01366 IN PPCI_COMMON_CONFIG pciData, // optional 01367 IN ULONG DeviceNumber, 01368 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, 01369 IN BOOLEAN* simplexOnly 01370 ); 01371 01372 extern BOOLEAN 01373 NTAPI 01374 AtapiChipInit( 01375 IN PVOID HwDeviceExtension, 01376 IN ULONG DeviceNumber, 01377 IN ULONG c 01378 ); 01379 01380 extern ULONG 01381 NTAPI 01382 AtapiGetIoRange( 01383 IN PVOID HwDeviceExtension, 01384 IN PPORT_CONFIGURATION_INFORMATION ConfigInfo, 01385 IN PPCI_COMMON_CONFIG pciData, 01386 IN ULONG SystemIoBusNumber, 01387 IN ULONG rid, 01388 IN ULONG offset, 01389 IN ULONG length //range id 01390 ); 01391 01392 /****************** 1 *****************/ 01393 #define GetPciConfig1(offs, op) { \ 01394 ScsiPortGetBusDataByOffset(HwDeviceExtension, \ 01395 PCIConfiguration, \ 01396 SystemIoBusNumber, \ 01397 slotNumber, \ 01398 &op, \ 01399 offs, \ 01400 1); \ 01401 } 01402 01403 #define SetPciConfig1(offs, op) { \ 01404 UCHAR _a = op; \ 01405 ScsiPortSetBusDataByOffset(HwDeviceExtension, \ 01406 PCIConfiguration, \ 01407 SystemIoBusNumber, \ 01408 slotNumber, \ 01409 &_a, \ 01410 offs, \ 01411 1); \ 01412 } 01413 01414 #define ChangePciConfig1(offs, _op) { \ 01415 UCHAR a = 0; \ 01416 GetPciConfig1(offs, a); \ 01417 a = (UCHAR)(_op); \ 01418 SetPciConfig1(offs, a); \ 01419 } 01420 01421 /****************** 2 *****************/ 01422 #define GetPciConfig2(offs, op) { \ 01423 ScsiPortGetBusDataByOffset(HwDeviceExtension, \ 01424 PCIConfiguration, \ 01425 SystemIoBusNumber, \ 01426 slotNumber, \ 01427 &op, \ 01428 offs, \ 01429 2); \ 01430 } 01431 01432 #define SetPciConfig2(offs, op) { \ 01433 USHORT _a = op; \ 01434 ScsiPortSetBusDataByOffset(HwDeviceExtension, \ 01435 PCIConfiguration, \ 01436 SystemIoBusNumber, \ 01437 slotNumber, \ 01438 &_a, \ 01439 offs, \ 01440 2); \ 01441 } 01442 01443 #define ChangePciConfig2(offs, _op) { \ 01444 USHORT a = 0; \ 01445 GetPciConfig2(offs, a); \ 01446 a = (USHORT)(_op); \ 01447 SetPciConfig2(offs, a); \ 01448 } 01449 01450 /****************** 4 *****************/ 01451 #define GetPciConfig4(offs, op) { \ 01452 ScsiPortGetBusDataByOffset(HwDeviceExtension, \ 01453 PCIConfiguration, \ 01454 SystemIoBusNumber, \ 01455 slotNumber, \ 01456 &op, \ 01457 offs, \ 01458 4); \ 01459 } 01460 01461 #define SetPciConfig4(offs, op) { \ 01462 ULONG _a = op; \ 01463 ScsiPortSetBusDataByOffset(HwDeviceExtension, \ 01464 PCIConfiguration, \ 01465 SystemIoBusNumber, \ 01466 slotNumber, \ 01467 &_a, \ 01468 offs, \ 01469 4); \ 01470 } 01471 01472 #define ChangePciConfig4(offs, _op) { \ 01473 ULONG a = 0; \ 01474 GetPciConfig4(offs, a); \ 01475 a = _op; \ 01476 SetPciConfig4(offs, a); \ 01477 } 01478 01479 #ifndef GetDmaStatus 01480 #define GetDmaStatus(de, c) \ 01481 (((de)->BusMaster) ? AtapiReadPort1(&((de)->chan[c]), IDX_BM_Status) : 0) 01482 #endif //GetDmaStatus 01483 01484 #ifdef USE_OWN_DMA 01485 #define AtapiVirtToPhysAddr(hwde, srb, phaddr, plen, phaddru) \ 01486 AtapiVirtToPhysAddr_(hwde, srb, phaddr, plen, phaddru); 01487 #else 01488 #define AtapiVirtToPhysAddr(hwde, srb, phaddr, plen, phaddru) \ 01489 (ScsiPortConvertPhysicalAddressToUlong/*(ULONG)ScsiPortGetVirtualAddress*/(/*hwde,*/ \ 01490 ScsiPortGetPhysicalAddress(hwde, srb, phaddr, plen))) 01491 #endif //USE_OWN_DMA 01492 01493 VOID 01494 DDKFASTAPI 01495 AtapiWritePort4( 01496 IN PHW_CHANNEL chan, 01497 IN ULONGIO_PTR port, 01498 IN ULONG data 01499 ); 01500 01501 VOID 01502 DDKFASTAPI 01503 AtapiWritePort2( 01504 IN PHW_CHANNEL chan, 01505 IN ULONGIO_PTR port, 01506 IN USHORT data 01507 ); 01508 01509 VOID 01510 DDKFASTAPI 01511 AtapiWritePort1( 01512 IN PHW_CHANNEL chan, 01513 IN ULONGIO_PTR port, 01514 IN UCHAR data 01515 ); 01516 01517 VOID 01518 DDKFASTAPI 01519 AtapiWritePortEx4( 01520 IN PHW_CHANNEL chan, 01521 IN ULONGIO_PTR port, 01522 IN ULONG offs, 01523 IN ULONG data 01524 ); 01525 01526 VOID 01527 DDKFASTAPI 01528 AtapiWritePortEx1( 01529 IN PHW_CHANNEL chan, 01530 IN ULONGIO_PTR port, 01531 IN ULONG offs, 01532 IN UCHAR data 01533 ); 01534 01535 ULONG 01536 DDKFASTAPI 01537 AtapiReadPort4( 01538 IN PHW_CHANNEL chan, 01539 IN ULONGIO_PTR port 01540 ); 01541 01542 USHORT 01543 DDKFASTAPI 01544 AtapiReadPort2( 01545 IN PHW_CHANNEL chan, 01546 IN ULONGIO_PTR port 01547 ); 01548 01549 UCHAR 01550 DDKFASTAPI 01551 AtapiReadPort1( 01552 IN PHW_CHANNEL chan, 01553 IN ULONGIO_PTR port 01554 ); 01555 01556 ULONG 01557 DDKFASTAPI 01558 AtapiReadPortEx4( 01559 IN PHW_CHANNEL chan, 01560 IN ULONGIO_PTR port, 01561 IN ULONG offs 01562 ); 01563 01564 UCHAR 01565 DDKFASTAPI 01566 AtapiReadPortEx1( 01567 IN PHW_CHANNEL chan, 01568 IN ULONGIO_PTR port, 01569 IN ULONG offs 01570 ); 01571 01572 VOID 01573 DDKFASTAPI 01574 AtapiWriteBuffer4( 01575 IN PHW_CHANNEL chan, 01576 IN ULONGIO_PTR _port, 01577 IN PVOID Buffer, 01578 IN ULONG Count, 01579 IN ULONG Timing 01580 ); 01581 01582 VOID 01583 DDKFASTAPI 01584 AtapiWriteBuffer2( 01585 IN PHW_CHANNEL chan, 01586 IN ULONGIO_PTR _port, 01587 IN PVOID Buffer, 01588 IN ULONG Count, 01589 IN ULONG Timing 01590 ); 01591 01592 VOID 01593 DDKFASTAPI 01594 AtapiReadBuffer4( 01595 IN PHW_CHANNEL chan, 01596 IN ULONGIO_PTR _port, 01597 IN PVOID Buffer, 01598 IN ULONG Count, 01599 IN ULONG Timing 01600 ); 01601 01602 VOID 01603 DDKFASTAPI 01604 AtapiReadBuffer2( 01605 IN PHW_CHANNEL chan, 01606 IN ULONGIO_PTR _port, 01607 IN PVOID Buffer, 01608 IN ULONG Count, 01609 IN ULONG Timing 01610 ); 01611 01612 /*#define GET_CHANNEL(Srb) (Srb->TargetId >> 1) 01613 #define GET_LDEV(Srb) (Srb->TargetId) 01614 #define GET_LDEV2(P, T, L) (T)*/ 01615 01616 #define GET_CHANNEL(Srb) (Srb->PathId) 01617 //#define GET_LDEV(Srb) (Srb->TargetId | (Srb->PathId << 1)) 01618 //#define GET_LDEV2(P, T, L) (T | ((P)<<1)) 01619 #define GET_CDEV(Srb) (Srb->TargetId) 01620 01621 VOID 01622 NTAPI 01623 AtapiSetupLunPtrs( 01624 IN PHW_CHANNEL chan, 01625 IN PHW_DEVICE_EXTENSION deviceExtension, 01626 IN ULONG c 01627 ); 01628 /* 01629 #define AtapiSetupLunPtrs(chan, deviceExtension, c) \ 01630 { \ 01631 chan->DeviceExtension = deviceExtension; \ 01632 chan->lChannel = c; \ 01633 chan->lun[0] = &(deviceExtension->lun[c*2+0]); \ 01634 chan->lun[1] = &(deviceExtension->lun[c*2+1]); \ 01635 chan->AltRegMap = deviceExtension->AltRegMap; \ 01636 chan->NextDpcChan = -1; \ 01637 chan->lun[0]->DeviceExtension = deviceExtension; \ 01638 chan->lun[1]->DeviceExtension = deviceExtension; \ 01639 } 01640 */ 01641 BOOLEAN 01642 NTAPI 01643 AtapiReadChipConfig( 01644 IN PVOID HwDeviceExtension, 01645 IN ULONG DeviceNumber, 01646 IN ULONG channel // physical channel 01647 ); 01648 01649 VOID 01650 NTAPI 01651 UniataForgetDevice( 01652 PHW_LU_EXTENSION LunExt 01653 ); 01654 01655 extern ULONG SkipRaids; 01656 extern ULONG ForceSimplex; 01657 extern BOOLEAN g_opt_AtapiDmaRawRead; 01658 01659 extern BOOLEAN InDriverEntry; 01660 01661 extern BOOLEAN g_opt_Verbose; 01662 extern ULONG g_opt_VirtualMachine; 01663 01664 #define VM_AUTO 0x00 01665 #define VM_NONE 0x01 01666 #define VM_VBOX 0x02 01667 #define VM_VMWARE 0x03 01668 #define VM_QEMU 0x04 01669 01670 #define VM_MAX_KNOWN VM_QEMU 01671 01672 extern BOOLEAN WinVer_WDM_Model; 01673 01674 #endif //__IDE_BUSMASTER_H__ Generated on Sat May 26 2012 04:26:55 for ReactOS by
1.7.6.1
|