3 Copyright (c) 2008-2012 Alexandr A. Telyatnikov (Alter)
9 This module handles SATA-related staff
12 Alexander A. Telyatnikov (Alter)
19 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 #ifndef __UNIATA_SATA__H__
35 #define __UNIATA_SATA__H__
40 IN PVOID HwDeviceExtension
,
41 IN ULONG lChannel
, // logical channel
42 IN ULONG pm_port
= 0 /* for port multipliers */
45 #define UNIATA_SATA_RESET_ENABLE TRUE
46 #define UNIATA_SATA_FAST_ENABLE FALSE
51 IN PVOID HwDeviceExtension
,
52 IN ULONG lChannel
, // logical channel
53 IN ULONG pm_port
= 0, /* for port multipliers */
54 IN BOOLEAN doReset
= UNIATA_SATA_FAST_ENABLE
57 #define UNIATA_SATA_DO_CONNECT TRUE
58 #define UNIATA_SATA_IGNORE_CONNECT FALSE
63 IN PVOID HwDeviceExtension
,
64 IN ULONG lChannel
, // logical channel
65 IN BOOLEAN do_connect
,
66 IN ULONG pm_port
= 0 /* for port multipliers */
69 #define UNIATA_SATA_EVENT_ATTACH 0x01
70 #define UNIATA_SATA_EVENT_DETACH 0x02
75 IN PVOID HwDeviceExtension
,
76 IN ULONG lChannel
, // logical channel
78 IN ULONG pm_port
= 0 /* for port multipliers */
81 #define UniataIsSATARangeAvailable(deviceExtension, lChannel) \
82 ((deviceExtension->BaseIoAddressSATA_0.Addr || \
83 deviceExtension->BaseIoAHCI_0.Addr) && \
84 (deviceExtension->chan[lChannel].RegTranslation[IDX_SATA_SStatus].Addr))
88 UniataIsSATARangeAvailable(
89 IN PHW_DEVICE_EXTENSION deviceExtension
,
93 // seems, check for deviceExtension->BaseIoAddressSATA_0.Addr and
94 // deviceExtension->BaseIoAHCI_0.Addr is not necessary now
95 if(deviceExtension
->chan
[lChannel
].RegTranslation
[IDX_SATA_SStatus
].Addr
||
96 deviceExtension
->chan
[lChannel
].RegTranslation
[IDX_SATA_SStatus
].Proc
) {
100 } // end UniataIsSATARangeAvailable()
107 IN ULONG io_port_ndx
,
108 IN ULONG pm_port
=0 /* for port multipliers */
113 UniataSataWritePort4(
115 IN ULONG io_port_ndx
,
117 IN ULONG pm_port
=0 /* for port multipliers */
123 IN PVOID HwDeviceExtension
129 UniataDumpAhciPortRegs(
137 IN PVOID HwDeviceExtension
,
138 IN PPCI_COMMON_CONFIG pciData
, // optional
139 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo
145 IN PVOID HwDeviceExtension
,
147 IN ULONG DeviceNumber
152 UniataAhciSnapAtaRegs(
154 IN ULONG DeviceNumber
,
155 IN OUT PIDEREGS_EX regs
160 UniataAhciSetupFIS_H2D(
161 IN PHW_DEVICE_EXTENSION deviceExtension
,
162 IN ULONG DeviceNumber
,
173 UniataAhciWaitCommandReady(
180 UniataAhciSendCommand(
181 IN PVOID HwDeviceExtension
,
183 IN ULONG DeviceNumber
,
184 IN USHORT ahci_flags
,
190 UniataAhciSendPIOCommand(
191 IN PVOID HwDeviceExtension
,
193 IN ULONG DeviceNumber
,
194 IN PSCSI_REQUEST_BLOCK Srb
,
201 IN USHORT ahci_flags
,
208 UniataAhciSendPIOCommandDirect(
209 IN PVOID HwDeviceExtension
,
211 IN ULONG DeviceNumber
,
212 IN PSCSI_REQUEST_BLOCK Srb
,
220 UniataAhciAbortOperation(
227 IN PVOID HwDeviceExtension
,
229 IN ULONG DeviceNumber
242 IN PVOID HwDeviceExtension
,
250 IN PVOID HwDeviceExtension
,
287 UniataAhciReadChannelPort4(
292 ULONG v
= AtapiReadPortEx4(NULL
, (ULONGIO_PTR
)&((chan
)->BaseIoAHCI_Port
), io_port_ndx
);
293 KdPrint3((PRINT_PREFIX
"ReadChannelPort4 ch%d[%x] = %x\n", chan
->lChannel
, io_port_ndx
, v
));
295 } // end UniataAhciReadChannelPort4()
299 UniataAhciWriteChannelPort4(
301 IN ULONG io_port_ndx
,
305 KdPrint3((PRINT_PREFIX
"WriteChannelPort4 %x => ch%d[%x]\n", data
, chan
->lChannel
, io_port_ndx
));
306 AtapiWritePortEx4(NULL
, (ULONGIO_PTR
)&((chan
)->BaseIoAHCI_Port
), io_port_ndx
, data
);
307 } // end UniataAhciWriteChannelPort4()
310 #define UniataAhciReadHostPort4(deviceExtension, io_port_ndx) \
311 AtapiReadPortEx4(NULL, (ULONGIO_PTR)&((deviceExtension)->BaseIoAHCI_0), io_port_ndx)
313 #define UniataAhciWriteHostPort4(deviceExtension, io_port_ndx, data) \
314 AtapiWritePortEx4(NULL, (ULONGIO_PTR)&((deviceExtension)->BaseIoAHCI_0), io_port_ndx, data)
318 UniataAhciBeginTransaction(
319 IN PVOID HwDeviceExtension
,
321 IN ULONG DeviceNumber
,
322 IN PSCSI_REQUEST_BLOCK Srb
327 UniataAhciEndTransaction(
328 IN PVOID HwDeviceExtension
,
330 IN ULONG DeviceNumber
,
331 IN PSCSI_REQUEST_BLOCK Srb
342 UniataAhciUlongFromRFIS(
346 return ( (((ULONG
)(RCV_FIS
[6])) << 24) |
347 (((ULONG
)(RCV_FIS
[5])) << 16) |
348 (((ULONG
)(RCV_FIS
[4])) << 8) |
349 ((ULONG
)(RCV_FIS
[12])) );
350 } // end UniataAhciUlongFromRFIS()
354 UniAtaAhciAdjustIoFlags(
356 IN USHORT ahci_flags
,
358 IN ULONG DeviceNumber
361 ahci_flags
|= (fis_size
/ sizeof(ULONG
)) | (DeviceNumber
<< 12);
366 if(AtaCommandFlags
[command
] & ATA_CMD_FLAG_Out
) {
367 ahci_flags
|= ATA_AHCI_CMD_WRITE
;
370 if(AtaCommandFlags[command] & ATA_CMD_FLAG_In) {
371 ahci_flags |= ATA_AHCI_CMD_READ;
375 } // end UniAtaAhciAdjustIoFlags()
381 IN ULONG DeviceNumber
,
390 IN ULONG DeviceNumber
,
396 UniataAhciSetupCmdPtr(
397 IN OUT PATA_REQ AtaReq
402 BuildAhciInternalSrb (
403 IN PVOID HwDeviceExtension
,
404 IN ULONG DeviceNumber
,
406 IN PUCHAR Buffer
= NULL
,
410 #define UniataAhciChanImplemented(deviceExtension, c) \
411 (((deviceExtension)->AHCI_PI) & (1 << c))
414 #endif //__UNIATA_SATA__H__