[LT2013]
[reactos.git] / drivers / storage / ide / uniata / id_sata.h
1 /*++
2
3 Copyright (c) 2008-2012 Alexandr A. Telyatnikov (Alter)
4
5 Module Name:
6 id_probe.cpp
7
8 Abstract:
9 This module handles SATA-related staff
10
11 Author:
12 Alexander A. Telyatnikov (Alter)
13
14 Environment:
15 kernel mode only
16
17 Notes:
18
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.
29
30 Revision History:
31
32 --*/
33
34 #ifndef __UNIATA_SATA__H__
35 #define __UNIATA_SATA__H__
36
37 UCHAR
38 NTAPI
39 UniataSataConnect(
40 IN PVOID HwDeviceExtension,
41 IN ULONG lChannel, // logical channel
42 IN ULONG pm_port = 0 /* for port multipliers */
43 );
44
45 #define UNIATA_SATA_RESET_ENABLE TRUE
46 #define UNIATA_SATA_FAST_ENABLE FALSE
47
48 UCHAR
49 NTAPI
50 UniataSataPhyEnable(
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
55 );
56
57 #define UNIATA_SATA_DO_CONNECT TRUE
58 #define UNIATA_SATA_IGNORE_CONNECT FALSE
59
60 BOOLEAN
61 NTAPI
62 UniataSataClearErr(
63 IN PVOID HwDeviceExtension,
64 IN ULONG lChannel, // logical channel
65 IN BOOLEAN do_connect,
66 IN ULONG pm_port = 0 /* for port multipliers */
67 );
68
69 #define UNIATA_SATA_EVENT_ATTACH 0x01
70 #define UNIATA_SATA_EVENT_DETACH 0x02
71
72 BOOLEAN
73 NTAPI
74 UniataSataEvent(
75 IN PVOID HwDeviceExtension,
76 IN ULONG lChannel, // logical channel
77 IN ULONG Action,
78 IN ULONG pm_port = 0 /* for port multipliers */
79 );
80 /*
81 #define UniataIsSATARangeAvailable(deviceExtension, lChannel) \
82 ((deviceExtension->BaseIoAddressSATA_0.Addr || \
83 deviceExtension->BaseIoAHCI_0.Addr) && \
84 (deviceExtension->chan[lChannel].RegTranslation[IDX_SATA_SStatus].Addr))
85 */
86 __inline
87 BOOLEAN
88 UniataIsSATARangeAvailable(
89 IN PHW_DEVICE_EXTENSION deviceExtension,
90 IN ULONG lChannel
91 )
92 {
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) {
97 return TRUE;
98 }
99 return FALSE;
100 } // end UniataIsSATARangeAvailable()
101
102
103 ULONG
104 NTAPI
105 UniataSataReadPort4(
106 IN PHW_CHANNEL chan,
107 IN ULONG io_port_ndx,
108 IN ULONG pm_port=0 /* for port multipliers */
109 );
110
111 VOID
112 NTAPI
113 UniataSataWritePort4(
114 IN PHW_CHANNEL chan,
115 IN ULONG io_port_ndx,
116 IN ULONG data,
117 IN ULONG pm_port=0 /* for port multipliers */
118 );
119
120 BOOLEAN
121 NTAPI
122 UniataAhciInit(
123 IN PVOID HwDeviceExtension
124 );
125
126 #if DBG
127 VOID
128 NTAPI
129 UniataDumpAhciPortRegs(
130 IN PHW_CHANNEL chan
131 );
132 #endif
133
134 BOOLEAN
135 NTAPI
136 UniataAhciDetect(
137 IN PVOID HwDeviceExtension,
138 IN PPCI_COMMON_CONFIG pciData, // optional
139 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo
140 );
141
142 UCHAR
143 NTAPI
144 UniataAhciStatus(
145 IN PVOID HwDeviceExtension,
146 IN ULONG lChannel,
147 IN ULONG DeviceNumber
148 );
149
150 VOID
151 NTAPI
152 UniataAhciSnapAtaRegs(
153 IN PHW_CHANNEL chan,
154 IN ULONG DeviceNumber,
155 IN OUT PIDEREGS_EX regs
156 );
157
158 ULONG
159 NTAPI
160 UniataAhciSetupFIS_H2D(
161 IN PHW_DEVICE_EXTENSION deviceExtension,
162 IN ULONG DeviceNumber,
163 IN ULONG lChannel,
164 OUT PUCHAR fis,
165 IN UCHAR command,
166 IN ULONGLONG lba,
167 IN USHORT count,
168 IN USHORT feature
169 );
170
171 UCHAR
172 NTAPI
173 UniataAhciWaitCommandReady(
174 IN PHW_CHANNEL chan,
175 IN ULONG timeout
176 );
177
178 UCHAR
179 NTAPI
180 UniataAhciSendCommand(
181 IN PVOID HwDeviceExtension,
182 IN ULONG lChannel,
183 IN ULONG DeviceNumber,
184 IN USHORT ahci_flags,
185 IN ULONG timeout
186 );
187
188 UCHAR
189 NTAPI
190 UniataAhciSendPIOCommand(
191 IN PVOID HwDeviceExtension,
192 IN ULONG lChannel,
193 IN ULONG DeviceNumber,
194 IN PSCSI_REQUEST_BLOCK Srb,
195 IN PUCHAR data,
196 IN ULONG length,
197 IN UCHAR command,
198 IN ULONGLONG lba,
199 IN USHORT count,
200 IN USHORT feature,
201 IN USHORT ahci_flags,
202 IN ULONG flags,
203 IN ULONG timeout
204 );
205
206 UCHAR
207 NTAPI
208 UniataAhciSendPIOCommandDirect(
209 IN PVOID HwDeviceExtension,
210 IN ULONG lChannel,
211 IN ULONG DeviceNumber,
212 IN PSCSI_REQUEST_BLOCK Srb,
213 IN PIDEREGS_EX regs,
214 IN ULONG wait_flags,
215 IN ULONG timeout
216 );
217
218 BOOLEAN
219 NTAPI
220 UniataAhciAbortOperation(
221 IN PHW_CHANNEL chan
222 );
223
224 ULONG
225 NTAPI
226 UniataAhciSoftReset(
227 IN PVOID HwDeviceExtension,
228 IN ULONG lChannel,
229 IN ULONG DeviceNumber
230 );
231
232 ULONG
233 NTAPI
234 UniataAhciWaitReady(
235 IN PHW_CHANNEL chan,
236 IN ULONG timeout
237 );
238
239 ULONG
240 NTAPI
241 UniataAhciHardReset(
242 IN PVOID HwDeviceExtension,
243 IN ULONG lChannel,
244 OUT PULONG signature
245 );
246
247 VOID
248 NTAPI
249 UniataAhciReset(
250 IN PVOID HwDeviceExtension,
251 IN ULONG lChannel
252 );
253
254 VOID
255 NTAPI
256 UniataAhciStartFR(
257 IN PHW_CHANNEL chan
258 );
259
260 BOOLEAN
261 NTAPI
262 UniataAhciStopFR(
263 IN PHW_CHANNEL chan
264 );
265
266 VOID
267 NTAPI
268 UniataAhciStart(
269 IN PHW_CHANNEL chan
270 );
271
272 BOOLEAN
273 NTAPI
274 UniataAhciCLO(
275 IN PHW_CHANNEL chan
276 );
277
278 BOOLEAN
279 NTAPI
280 UniataAhciStop(
281 IN PHW_CHANNEL chan
282 );
283
284
285 __inline
286 ULONG
287 UniataAhciReadChannelPort4(
288 IN PHW_CHANNEL chan,
289 IN ULONG io_port_ndx
290 )
291 {
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));
294 return v;
295 } // end UniataAhciReadChannelPort4()
296
297 __inline
298 VOID
299 UniataAhciWriteChannelPort4(
300 IN PHW_CHANNEL chan,
301 IN ULONG io_port_ndx,
302 IN ULONG data
303 )
304 {
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()
308
309
310 #define UniataAhciReadHostPort4(deviceExtension, io_port_ndx) \
311 AtapiReadPortEx4(NULL, (ULONGIO_PTR)&((deviceExtension)->BaseIoAHCI_0), io_port_ndx)
312
313 #define UniataAhciWriteHostPort4(deviceExtension, io_port_ndx, data) \
314 AtapiWritePortEx4(NULL, (ULONGIO_PTR)&((deviceExtension)->BaseIoAHCI_0), io_port_ndx, data)
315
316 UCHAR
317 NTAPI
318 UniataAhciBeginTransaction(
319 IN PVOID HwDeviceExtension,
320 IN ULONG lChannel,
321 IN ULONG DeviceNumber,
322 IN PSCSI_REQUEST_BLOCK Srb
323 );
324
325 UCHAR
326 NTAPI
327 UniataAhciEndTransaction(
328 IN PVOID HwDeviceExtension,
329 IN ULONG lChannel,
330 IN ULONG DeviceNumber,
331 IN PSCSI_REQUEST_BLOCK Srb
332 );
333
334 VOID
335 NTAPI
336 UniataAhciResume(
337 IN PHW_CHANNEL chan
338 );
339
340 __inline
341 ULONG
342 UniataAhciUlongFromRFIS(
343 PUCHAR RCV_FIS
344 )
345 {
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()
351
352 __inline
353 USHORT
354 UniAtaAhciAdjustIoFlags(
355 IN UCHAR command,
356 IN USHORT ahci_flags,
357 IN ULONG fis_size,
358 IN ULONG DeviceNumber
359 )
360 {
361 ahci_flags |= (fis_size / sizeof(ULONG)) | (DeviceNumber << 12);
362 if(!command) {
363 return ahci_flags;
364 }
365
366 if(AtaCommandFlags[command] & ATA_CMD_FLAG_Out) {
367 ahci_flags |= ATA_AHCI_CMD_WRITE;
368 }
369 /*
370 if(AtaCommandFlags[command] & ATA_CMD_FLAG_In) {
371 ahci_flags |= ATA_AHCI_CMD_READ;
372 }
373 */
374 return ahci_flags;
375 } // end UniAtaAhciAdjustIoFlags()
376
377 BOOLEAN
378 NTAPI
379 UniataAhciReadPM(
380 IN PHW_CHANNEL chan,
381 IN ULONG DeviceNumber,
382 IN ULONG Reg,
383 OUT PULONG result
384 );
385
386 UCHAR
387 NTAPI
388 UniataAhciWritePM(
389 IN PHW_CHANNEL chan,
390 IN ULONG DeviceNumber,
391 IN ULONG Reg,
392 IN ULONG value
393 );
394
395 VOID
396 UniataAhciSetupCmdPtr(
397 IN OUT PATA_REQ AtaReq
398 );
399
400 PSCSI_REQUEST_BLOCK
401 NTAPI
402 BuildAhciInternalSrb (
403 IN PVOID HwDeviceExtension,
404 IN ULONG DeviceNumber,
405 IN ULONG lChannel,
406 IN PUCHAR Buffer = NULL,
407 IN ULONG Length = 0
408 );
409
410 #define UniataAhciChanImplemented(deviceExtension, c) \
411 (((deviceExtension)->AHCI_PI) & (1 << c))
412
413
414 #endif //__UNIATA_SATA__H__