ReactOS 0.4.16-dev-2633-g8dc9e50
intel.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS ATA Bus Driver
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Intel ATA controller minidriver
5 * COPYRIGHT: Copyright 2026 Dmitry Borisov <di.sean@protonmail.com>
6 *
7 * REFERENCES: For more details, see:
8 * "Intel ICH0~ICH5 Programmer's Reference Manual (PRM) 298600-004"
9 */
10
11/*
12 * 0x1230 PIIX - no separate timings
13 * 0x1234 MPIIX - no separate timings, no PCI I/O resources, bridge device, single-channel
14 * 0x811A SCH - single-channel, no enable bits
15 * 0x2652, 0x2653 ICH6 - share the same PCI ID between AHCI and PATA mode
16 */
17
18/* INCLUDES *******************************************************************/
19
20#include "pciidex.h"
21
22/* GLOBALS ********************************************************************/
23
24#define PCI_DEV_PIIX_82371FB 0x1230
25#define PCI_DEV_MPIIX_82371MX 0x1234
26
27#define PCI_DEV_PIIX3_82371SB 0x7010
28
29#define PCI_DEV_PIIX4_82371AB 0x7111
30#define PCI_DEV_PIIX4E_82372FB 0x7601
31#define PCI_DEV_PIIX4E_82443MX 0x7199
32#define PCI_DEV_PIIX4E_82451NX 0x84CA
33
34#define PCI_DEV_ICH_82801AA 0x2411
35
36#define PCI_DEV_ICH0_82801AB 0x2421
37
38#define PCI_DEV_ICH2_82801BAM 0x244A
39#define PCI_DEV_ICH2_82801BA 0x244B
40
41#define PCI_DEV_C_ICH_82801E 0x245B
42
43#define PCI_DEV_ICH3_M_82801CAM 0x248A
44#define PCI_DEV_ICH3_S_82801CA 0x248B
45
46#define PCI_DEV_ICH4_L_82801DBL 0x24C1
47#define PCI_DEV_ICH4_M_82801DBM 0x24CA
48#define PCI_DEV_ICH4_82801DB 0x24CB
49
50#define PCI_DEV_ICH5_82801EB_SATA 0x24D1
51#define PCI_DEV_ICH5_82801EB_IDE 0x24DB
52#define PCI_DEV_ICH5_R_82801ER 0x24DF
53#define PCI_DEV_ICH5_6300ESB_IDE 0x25A2
54#define PCI_DEV_ICH5_6300ESB_SATA 0x25A3
55#define PCI_DEV_ICH5_6300ESB_RAID 0x25B0
56
57#define PCI_DEV_ICH6_82801FB_SATA 0x2651
58#define PCI_DEV_ICH6_R_82801FB 0x2652
59#define PCI_DEV_ICH6_M_82801FBM 0x2653
60#define PCI_DEV_ICH6_82801FB_IDE 0x266F
61
62#define PCI_DEV_ESB2_63XXESB 0x2680
63
64#define PCI_DEV_ICH7_6321ESB 0x269E
65#define PCI_DEV_ICH7_82801GB 0x27C0
66#define PCI_DEV_ICH7_M_82801GBM 0x27C4
67#define PCI_DEV_ICH7_82801G 0x27DF
68
69#define PCI_DEV_ICH8_82801H 0x2820
70#define PCI_DEV_ICH8_R_82801HR 0x2825
71#define PCI_DEV_ICH8_M_82801HM 0x2828
72#define PCI_DEV_ICH8_M_82801HBM 0x2850
73
74#define PCI_DEV_ICH9_R_82801IR_1 0x2920
75#define PCI_DEV_ICH9_R_82801IR_2 0x2921
76#define PCI_DEV_ICH9_82801I 0x2926
77#define PCI_DEV_ICH9_M_82801IBM_1 0x2928
78#define PCI_DEV_ICH9_M_82801IBM_2 0x292D
79#define PCI_DEV_ICH9_M_82801IBM_3 0x292E
80
81#define PCI_DEV_ICH10_82801JD_1 0x3A00
82#define PCI_DEV_ICH10_82801JD_2 0x3A06
83#define PCI_DEV_ICH10_82801JI_1 0x3A20
84#define PCI_DEV_ICH10_82801JI_2 0x3A26
85
86#define PCI_DEV_SCH_ATOM_Z5XX 0x811A
87
88#define PCI_DEV_EP80579 0x5028
89
90#define PCI_DEV_PCH_5SERIES_1 0x3B20
91#define PCI_DEV_PCH_5SERIES_2 0x3B21
92#define PCI_DEV_PCH_5SERIES_3 0x3B26
93#define PCI_DEV_PCH_5SERIES_4 0x3B28
94#define PCI_DEV_PCH_5SERIES_5 0x3B2D
95#define PCI_DEV_PCH_5SERIES_6 0x3B2E
96
97#define PCI_DEV_PCH_6SERIES_1 0x1C00
98#define PCI_DEV_PCH_6SERIES_2 0x1C01
99#define PCI_DEV_PCH_6SERIES_3 0x1C08
100#define PCI_DEV_PCH_6SERIES_4 0x1C09
101
102#define PCI_DEV_PCH_7SERIES_1 0x1E00
103#define PCI_DEV_PCH_7SERIES_2 0x1E01
104#define PCI_DEV_PCH_7SERIES_3 0x1E08
105#define PCI_DEV_PCH_7SERIES_4 0x1E09
106
107#define PCI_DEV_PCH_X79_1 0x1D00
108#define PCI_DEV_PCH_X79_2 0x1D08
109
110#define PCI_DEV_PCH_8900_1 0x2326
111#define PCI_DEV_PCH_8900_2 0x23A6
112
113#define PCI_DEV_ATOM_C2000_1 0x1F20
114#define PCI_DEV_ATOM_C2000_2 0x1F21
115#define PCI_DEV_ATOM_C2000_3 0x1F30
116#define PCI_DEV_ATOM_C2000_4 0x1F31
117
118#define PCI_DEV_PCH_8SERIES_1 0x8C00
119#define PCI_DEV_PCH_8SERIES_2 0x8C01
120#define PCI_DEV_PCH_8SERIES_3 0x8C08
121#define PCI_DEV_PCH_8SERIES_4 0x8C09
122#define PCI_DEV_PCH_8SERIES_5 0x9C00
123#define PCI_DEV_PCH_8SERIES_6 0x9C01
124#define PCI_DEV_PCH_8SERIES_7 0x9C08
125#define PCI_DEV_PCH_8SERIES_8 0x9C09
126
127#define PCI_DEV_ATOM_E3800_1 0x0F20
128#define PCI_DEV_ATOM_E3800_2 0x0F21
129
130#define PCI_DEV_PCH_X99_1 0x8D00
131#define PCI_DEV_PCH_X99_2 0x8D08
132#define PCI_DEV_PCH_X99_3 0x8D60
133#define PCI_DEV_PCH_X99_4 0x8D68
134
135#define PCI_DEV_PCH_9SERIES_1 0x8C80
136#define PCI_DEV_PCH_9SERIES_2 0x8C81
137#define PCI_DEV_PCH_9SERIES_3 0x8C88
138#define PCI_DEV_PCH_9SERIES_4 0x8C89
139
140#define PCI_DEV_BRIDGE_450KX 0x84C4
141#define PCI_DEV_BRIDGE_450NX 0x84CB
142
143#define BRIDGE_450KX_REV_B0 0x04
144
145#define BRIDGE_450NX_REV_B0 0x00
146#define BRIDGE_450NX_REV_B1 0x02
147#define BRIDGE_450NX_REV_C0 0x04
148
149/*
150 * PXB configuration register (450NX)
151 */
152#define PXB_REG_CONFIG 0x40
153
154#define PXB_CONFIG_BUF_RESTREAM 0x0040 // Re-streaming Buffer Enable
155#define PXB_CONFIG_PCI_BUS_LOCK 0x4000 // PCI Bus Lock Enable
156
157/*
158 * IDE timing register (PIIX, MPIIX, PIIX3/4, ICH)
159 *
160 * 0x40-0x41 - primary, 0x42-0x43 - secondary.
161 * 0x6C-0x6D - primary and secondary (MPIIX).
162 */
163#define PIIX_REG_IDETIM(Channel) (0x40 + ((Channel) * 2))
164#define MPIIX_REG_IDETIM 0x6C
165
166#define PIIX_IDETIM_TIME(Drive) (0x0001 << (4 * (Drive))) // Fast Timing Bank Enable
167#define PIIX_IDETIM_IE(Drive) (0x0002 << (4 * (Drive))) // IORDY Sample Point Enable
168#define PIIX_IDETIM_PPE(Drive) (0x0004 << (4 * (Drive))) // Prefetch/Posting Enable
169#define PIIX_IDETIM_DTE(Drive) (0x0008 << (4 * (Drive))) // DMA Timing Only (except for MPIIX)
170
171#define PIIX_IDETIM_RCT_MASK 0x0300 // Recovery Time
172#define PIIX_IDETIM_RSV_MASK 0x0C00 // Reserved
173#define PIIX_IDETIM_ISP_MASK 0x3000 // IORDY Sample Point
174#define PIIX_IDETIM_SITRE 0x4000 // Slave IDE Timing Register Enable (PIIX3/4, ICH)
175#define PIIX_IDETIM_SECONDARY 0x4000 // IDE Decode Enable for secondary channel (MPIIX only)
176#define PIIX_IDETIM_IDE 0x8000 // IDE Decode Enable
177
178#define PIIX_IDETIM_RCT(Value) ((Value) << 8) // Recovery Time
179#define PIIX_IDETIM_ISP(Value) ((Value) << 12) // IORDY Sample Point
180#define PIIX_IDETIM_SETTINGS(Drive, Value) ((Value) << (4 * (Drive))) // TIME, IE, PPE, DTE
181
182/*
183 * Slave IDE timing register (PIIX3/4, ICH)
184 */
185#define PIIX_REG_SIDETIM 0x44
186
187#define PIIX_SIDETIM_ISPRCT_MASK(Channel) (0x0F << ((Channel) * 4))
188#define PIIX_SIDETIM_RCT(Channel, Value) ((Value) << ((Channel) * 4)) // Recovery Time
189#define PIIX_SIDETIM_ISP(Channel, Value) ((Value) << (((Channel) * 4) + 2)) // IORDY Sample Point
190
191/*
192 * Ultra DMA control register (PIIX4, ICH)
193 */
194#define PIIX_REG_UDMACTL 0x48
195
196#define PIIX_UDMACTL_EN_MASK(Channel) (0x03 << ((Channel) * 2)) // Ultra DMA Mode Enable
197
198/* Ultra DMA Mode Enable */
199#define PIIX_UDMACTL_EN(Channel, Drive) (0x01 << ((Channel) * 2 + (Drive)))
200
201/*
202 * Ultra DMA timing register (PIIX4, ICH)
203 *
204 * 0x4A - primary, 0x4B - secondary.
205 */
206#define PIIX_REG_UDMATIM(Channel) (0x4A + (Channel))
207
208#define PIIX_UDMATIM_CT_MASK 0x33 // Cycle Time and Ready to Pause time
209
210/* Cycle Time and Ready to Pause time */
211#define PIIX_UDMATIM_CT(Drive, Value) ((Value) << ((Drive) * 4))
212
213/*
214 * IDE config register (ICH)
215 */
216#define PIIX_REG_CONFIG 0x54
217
218#define PIIX_CONFIG_KEEP_MASK 0x0FF0 // Save the reserved, cable, and ping-pong bits
219
220/* Cable Reporting for drives 0-1 */
221#define PIIX_CONFIG_CR(Channel) (0x0030 << ((Channel) * 2))
222/* 66 MHz Clock */
223#define PIIX_CONFIG_CLOCK_UDMA66(Channel, Drive) (0x0001 << (((Channel) * 2) + Drive))
224/* 100 MHz Clock */
225#define PIIX_CONFIG_CLOCK_UDMA100(Channel, Drive) (0x1000 << (((Channel) * 2) + Drive))
226/* PIO Ping-Pong enable */
227#define PIIX_CONFIG_WR_PING_PONG 0x0400
228
229/*
230 * Device 0/1 Timing Register (SCH)
231 */
232#define SCH_REG_DTIM(Drive) (0x80 + (Drive) * 4)
233
234#define SCH_DTIM_PM_MASK 0x00000007 // PIO Mode
235#define SCH_DTIM_MDM_MASK 0x00000300 // Mutli-word DMA Mode
236#define SCH_DTIM_UDM_MASK 0x00070000 // Ultra DMA Mode
237#define SCH_DTIM_PPE 0x40000000 // Prefetch/Post Enable
238#define SCH_DTIM_USD 0x80000000 // Use Synchronous DMA
239
240#define SCH_DTIM_PM(Mode) (Mode)
241#define SCH_DTIM_MDM(Mode) ((Mode) << 8)
242#define SCH_DTIM_UDM(Mode) ((Mode) << 16)
243
244#define HW_FLAGS_TYPE_MASK 0x000F
245#define HW_FLAGS_DISABLE_DMA 0x0010
246#define HW_FLAGS_HAS_CFG_REG 0x0080
247#define HW_FLAGS_HAS_UDMA_REG 0x8000
248
250{
253#define TYPE_MPIIX 0
254#define TYPE_PIIX 1
255#define TYPE_PIIX3 2
256#define TYPE_PIIX4 (3 | HW_FLAGS_HAS_UDMA_REG)
257#define TYPE_ICH (4 | HW_FLAGS_HAS_UDMA_REG | HW_FLAGS_HAS_CFG_REG)
258#define TYPE_SATA 5
259#define TYPE_SCH 6
261
263{
266 struct
267 {
271
274{
363};
364
367{
368 { 0x41, 0x80, 0x80 },
369 { 0x43, 0x80, 0x80 },
370};
371
374{
375 { 0x6D, 0xC0, 0x80 },
376 { 0x6D, 0xC0, 0xC0 },
377};
378
379static const UCHAR IntelClockSettings[5][2] =
380{
381 // ISP, RCT
382 { 0, 0 }, // Mode 0 ISP = 5 RCT = 4 NOTE: Some old chips do ISP 6 and RCT 14 = 600 ns
383 { 0, 0 }, // Mode 1 Ditto
384 { 1, 0 }, // Mode 2 ISP = 4 RCT = 4
385 { 2, 1 }, // Mode 3 ISP = 3 RCT = 3
386 { 2, 3 }, // Mode 4 ISP = 3 RCT = 1
387};
388
391{
392 900, // Mode 0 NOTE: Some old chips do ISP 6 and RCT 14 = 600 ns
393 900, // Mode 1 Ditto
394 240, // Mode 2
395 180, // Mode 3
396 120, // Mode 4
397};
398
399static const UCHAR IntelModeSettings[] =
400{
401 0, // Mode 0
402 0, // Mode 1
403 PIIX_IDETIM_TIME(0), // Mode 2
404 PIIX_IDETIM_TIME(0) | PIIX_IDETIM_IE(0), // Mode 3
405 PIIX_IDETIM_TIME(0) | PIIX_IDETIM_IE(0), // Mode 4
406};
407
408static const UCHAR IntelUdmaSettings[] =
409{
410 0, // UDMA 0
411 1, // UDMA 1
412 2, // UDMA 2
413 1, // UDMA 3
414 2, // UDMA 4
415 1 // UDMA 5
416};
417
419 PIO_MODE(2), // SWDMA_MODE(2)
420 PIO_MODE(0), // Unused, MWDMA0 is not supported by the chip
421 PIO_MODE(3), // MWDMA_MODE(1)
422 PIO_MODE(4) // MWDMA_MODE(2)
423};
424
425/* FUNCTIONS ******************************************************************/
426
427/*
428 * Make sure that the selected PIO and DMA speeds
429 * match the cycle time of IntelClockSettings[].
430 */
431static
432VOID
436{
437 ULONG Mode;
438
439 /* PIO speed */
440 for (Mode = Device->PioMode; Mode > PIO_MODE(0); Mode--)
441 {
442 if (!(Device->SupportedModes & (1 << Mode)))
443 continue;
444
445 if (IntelTimingModeToCycleTime[Mode] >= Device->MinPioCycleTime)
446 break;
447 }
448 if (Mode != Device->PioMode)
449 INFO("CH %lu: Downgrade PIO speed from %lu to %lu\n", Channel, Device->PioMode, Mode);
450 Device->PioMode = Mode;
451
452 /* UDMA works independently of any PIO mode */
453 if (Device->DmaMode == PIO_MODE(0) || Device->DmaMode >= UDMA_MODE(0))
454 return;
455
456 /* DMA speed */
457 for (Mode = Device->DmaMode; Mode > PIO_MODE(0); Mode--)
458 {
459 ULONG MinimumCycleTime, TimingMode;
460
461 if (!(Device->SupportedModes & ~PIO_ALL & (1 << Mode)))
462 continue;
463
464 ASSERT((Mode == SWDMA_MODE(2)) || (Mode == MWDMA_MODE(1)) || (Mode == MWDMA_MODE(2)));
465
466 if (Device->DmaMode >= MWDMA_MODE(0))
467 MinimumCycleTime = Device->MinMwDmaCycleTime;
468 else
469 MinimumCycleTime = Device->MinSwDmaCycleTime;
470
471 TimingMode = IntelDmaModeToTimingMode[Mode - SWDMA_MODE(2)];
472
473 if (IntelTimingModeToCycleTime[TimingMode] >= MinimumCycleTime)
474 break;
475 }
476 if (Mode != Device->DmaMode)
477 {
478 if (Mode == PIO_MODE(0))
479 WARN("CH %lu: Too slow device '%s', disabling DMA\n", Channel, Device->FriendlyName);
480 else
481 INFO("CH %lu: Downgrade DMA speed from %lu to %lu\n", Channel, Device->DmaMode, Mode);
482 }
483 Device->DmaMode = Mode;
484}
485
486static
487VOID
489 _In_ PATA_CONTROLLER Controller,
492{
493 PCHANNEL_DATA_PATA ChanData = Controller->Channels[Channel];
494 USHORT IdeTimReg, IdeConfigReg;
495 UCHAR IdeSlaveTimReg, IdeUdmaCtrlReg, IdeUdmaTimReg;
496 ULONG i;
497
498 IdeUdmaCtrlReg = 0;
499 IdeUdmaTimReg = 0;
500 IdeConfigReg = 0;
501
502 IdeTimReg = PciRead16(Controller, PIIX_REG_IDETIM(Channel));
503 IdeSlaveTimReg = PciRead8(Controller, PIIX_REG_SIDETIM);
504 if (ChanData->HwFlags & HW_FLAGS_HAS_UDMA_REG)
505 {
506 IdeUdmaCtrlReg = PciRead8(Controller, PIIX_REG_UDMACTL);
507 IdeUdmaTimReg = PciRead8(Controller, PIIX_REG_UDMATIM(Channel));
508 if (ChanData->HwFlags & HW_FLAGS_HAS_CFG_REG)
509 {
510 IdeConfigReg = PciRead16(Controller, PIIX_REG_CONFIG);
511 }
512 }
513
514 INFO("CH %lu: Config (before)\n"
515 "IDETIM %04X\n"
516 "SIDETIM %02X\n"
517 "UDMACTL %02X\n"
518 "UDMATIM %02X\n"
519 "CONFIG %04X\n",
520 Channel, IdeTimReg, IdeSlaveTimReg, IdeUdmaCtrlReg, IdeUdmaTimReg, IdeConfigReg);
521
522 /* Clear the current mode configuration */
524 IdeSlaveTimReg &= ~PIIX_SIDETIM_ISPRCT_MASK(Channel);
525 IdeUdmaCtrlReg &= ~PIIX_UDMACTL_EN_MASK(Channel);
526 IdeUdmaTimReg &= ~PIIX_UDMATIM_CT_MASK;
527 IdeConfigReg &= PIIX_CONFIG_KEEP_MASK;
528
529 for (i = 0; i < MAX_IDE_DEVICE; ++i)
530 {
532 ULONG TimingMode;
533
534 if (!Device)
535 continue;
536
538
539 TimingMode = Device->PioMode;
540
541 /* UDMA timings */
542 if (Device->DmaMode >= UDMA_MODE(0))
543 {
544 /* UDMA works independently of any PIO mode */
545 IdeUdmaTimReg |= PIIX_UDMATIM_CT(i, IntelUdmaSettings[Device->DmaMode - UDMA_MODE(0)]);
546 IdeUdmaCtrlReg |= PIIX_UDMACTL_EN(Channel, i);
547
548 if (Device->DmaMode == UDMA_MODE(5))
549 IdeConfigReg |= PIIX_CONFIG_CLOCK_UDMA100(Channel, i);
550 else if (Device->DmaMode > UDMA_MODE(2))
551 IdeConfigReg |= PIIX_CONFIG_CLOCK_UDMA66(Channel, i);
552 }
553 /* DMA timings */
554 else if (Device->DmaMode != PIO_MODE(0))
555 {
556 ASSERT((Device->DmaMode == SWDMA_MODE(2)) ||
557 (Device->DmaMode == MWDMA_MODE(1)) ||
558 (Device->DmaMode == MWDMA_MODE(2)));
559
560 /* Find the fastest mode while satisfying PIO timings */
561 TimingMode = IntelDmaModeToTimingMode[Device->DmaMode - SWDMA_MODE(2)];
562 if (TimingMode < Device->PioMode)
563 {
564 /*
565 * No common mode, we have to slow down the device's PIO speed
566 * by forcing the compatible PIO timings for PIO transfers.
567 */
568 IdeTimReg |= PIIX_IDETIM_DTE(i);
569 }
570 }
571
572 /* DMA and PIO timings */
573 if (i == 0)
574 {
575 IdeTimReg |= PIIX_IDETIM_ISP(IntelClockSettings[TimingMode][0]);
576 IdeTimReg |= PIIX_IDETIM_RCT(IntelClockSettings[TimingMode][1]);
577 }
578 else
579 {
580 IdeSlaveTimReg |= PIIX_SIDETIM_ISP(Channel, IntelClockSettings[TimingMode][0]);
581 IdeSlaveTimReg |= PIIX_SIDETIM_RCT(Channel, IntelClockSettings[TimingMode][1]);
582
583 /* Enable effect of the PIIX_REG_SIDETIM register */
584 IdeTimReg |= PIIX_IDETIM_SITRE;
585 }
586
587 IdeTimReg |= PIIX_IDETIM_SETTINGS(i, IntelModeSettings[TimingMode]);
588
589 if (((TimingMode == PIO_MODE(2)) && Device->IoReadySupported))
590 IdeTimReg |= PIIX_IDETIM_IE(i);
591
592 if (Device->IsFixedDisk)
593 IdeTimReg |= PIIX_IDETIM_PPE(i);
594 }
595
596 PciWrite8(Controller, PIIX_REG_SIDETIM, IdeSlaveTimReg);
597 PciWrite16(Controller, PIIX_REG_IDETIM(Channel), IdeTimReg);
598 if (ChanData->HwFlags & HW_FLAGS_HAS_UDMA_REG)
599 {
600 PciWrite8(Controller, PIIX_REG_UDMACTL, IdeUdmaCtrlReg);
601 PciWrite8(Controller, PIIX_REG_UDMATIM(Channel), IdeUdmaTimReg);
602 if (ChanData->HwFlags & HW_FLAGS_HAS_CFG_REG)
603 {
604 /* Enable this feature for performance enhancement */
605 IdeConfigReg |= PIIX_CONFIG_WR_PING_PONG;
606
607 PciWrite16(Controller, PIIX_REG_CONFIG, IdeConfigReg);
608 }
609 }
610
611 INFO("CH %lu: Config (after)\n"
612 "IDETIM %04X\n"
613 "SIDETIM %02X\n"
614 "UDMACTL %02X\n"
615 "UDMATIM %02X\n"
616 "CONFIG %04X\n",
617 Channel, IdeTimReg, IdeSlaveTimReg, IdeUdmaCtrlReg, IdeUdmaTimReg, IdeConfigReg);
618}
619
620static
621VOID
623 _In_ PATA_CONTROLLER Controller,
626{
627 ULONG i;
628
629 for (i = 0; i < MAX_IDE_DEVICE; ++i)
630 {
632 ULONG DeviceTimingReg;
633
634 if (!Device)
635 continue;
636
637 DeviceTimingReg = PciRead32(Controller, SCH_REG_DTIM(i));
638 DeviceTimingReg &= ~(SCH_DTIM_PM_MASK |
643
644 if (Device->IsFixedDisk)
645 DeviceTimingReg |= SCH_DTIM_PPE;
646
647 /* DMA timings */
648 if (Device->DmaMode >= UDMA_MODE(0))
649 DeviceTimingReg |= SCH_DTIM_USD | SCH_DTIM_UDM(Device->DmaMode - UDMA_MODE(0));
650 else if (Device->DmaMode >= MWDMA_MODE(0))
651 DeviceTimingReg |= SCH_DTIM_MDM(Device->DmaMode - MWDMA_MODE(0));
652
653 /* PIO timings */
654 DeviceTimingReg |= SCH_DTIM_PM(Device->PioMode);
655
656 PciWrite32(Controller, SCH_REG_DTIM(i), DeviceTimingReg);
657 }
658}
659
660static
661VOID
663 _In_ PVOID ChannelContext,
665{
666 PCHANNEL_DATA_PATA ChanData = ChannelContext;
667 PINTEL_HW_EXTENSION HwExt = (PVOID)ChanData->HwExt;
668 ULONG Index = (Request->Flags & REQUEST_FLAG_PROGRAM_DMA) ? 1 : 0;
669 USHORT NewTimingReg = HwExt->Device[DEV_NUMBER(Request->Device)].Timing[Index];
670
671 /* Set the proper device timings */
672 if (HwExt->CurrentTiming != NewTimingReg)
673 {
674 HwExt->CurrentTiming = NewTimingReg;
675
676 PciWrite16(ChanData->Controller, HwExt->Register, NewTimingReg);
677 TRACE("CH %lu: IDETIM %04X\n", ChanData->Channel, NewTimingReg);
678 }
679
680 PataPrepareIo(ChanData, Request);
681}
682
683static
684USHORT
689{
690 USHORT IdeTimReg;
691 ULONG TimingMode;
692
693 if (Mode > PIO_MODE(4))
694 {
695 ASSERT((Mode == SWDMA_MODE(2)) || (Mode == MWDMA_MODE(1)) || (Mode == MWDMA_MODE(2)));
696
697 TimingMode = IntelDmaModeToTimingMode[Mode - SWDMA_MODE(2)];
698 }
699 else
700 {
701 TimingMode = Mode;
702 }
703
704 IdeTimReg = PIIX_IDETIM_ISP(IntelClockSettings[TimingMode][0]);
705 IdeTimReg |= PIIX_IDETIM_RCT(IntelClockSettings[TimingMode][1]);
706 IdeTimReg |= PIIX_IDETIM_SETTINGS(Number, IntelModeSettings[TimingMode]);
707
708 if (Device->IsFixedDisk)
709 IdeTimReg |= PIIX_IDETIM_PPE(Number);
710
711 if (((TimingMode == PIO_MODE(2)) && Device->IoReadySupported))
712 IdeTimReg |= PIIX_IDETIM_IE(Number);
713
714 return IdeTimReg;
715}
716
717/*
718 * Unfortunately, the first PIIX chip cannot specify separate device timings (>PIO1)
719 * for both of the drives. The PIIX_IDETIM_SITRE bit is reserved here.
720 * This problem can be solved in two ways:
721 *
722 * 1) If we have a common timing mode for all devices use it, otherwise take the lower mode.
723 * 2) Snoop an ATA command by software and run with the proper timings for that device.
724 *
725 * The code below deals with the second solution.
726 */
727static
728VOID
730 _In_ PATA_CONTROLLER Controller,
733{
734 PCHANNEL_DATA_PATA ChanData = Controller->Channels[Channel];
735 PINTEL_HW_EXTENSION HwExt = (PVOID)ChanData->HwExt;
736 USHORT IdeTimReg;
737 ULONG i;
738
739 /* Clear the current mode configuration */
740 IdeTimReg = PciRead16(Controller, HwExt->Register);
742 PciWrite16(Controller, HwExt->Register, IdeTimReg);
743
744 for (i = 0; i < MAX_IDE_DEVICE; ++i)
745 {
747
748 if (!Device)
749 continue;
750
752
753 /* Compute the timing bits for this device */
754 HwExt->Device[i].Timing[0] = IntelPiixLegacyComputeIdeTiming(Device, i, Device->PioMode);
755 HwExt->Device[i].Timing[1] = IntelPiixLegacyComputeIdeTiming(Device, i, Device->DmaMode);
756
757 INFO("CH %lu: Drive #%lu PIO:%04X DMA:04X\n",
758 Channel, i, HwExt->Device[i].Timing[0], HwExt->Device[i].Timing[1]);
759 }
760
761 /* Force reload of timings */
762 HwExt->CurrentTiming = 0;
763}
764
765/*
766 * Intel 450KX/GX PCIset Specification Update 243109-015
767 * Intel 450NX PCIset Specification Update 243848-009
768 */
769static
770CODE_SEG("PAGE")
777{
779
780 PAGED_CODE();
781
782 if (PciConfig->VendorID != PCI_VEN_INTEL)
783 return FALSE;
784
785 /* 450KX errata: 0-Byte Length Write failure */
786 if ((PciConfig->DeviceID == PCI_DEV_BRIDGE_450KX) &&
787 (PciConfig->RevisionID < BRIDGE_450KX_REV_B0))
788 {
789 WARN("Enabling workaround for the 450KX #2\n");
790 return TRUE;
791 }
792
793 /* 450NX errata */
794 if (PciConfig->DeviceID == PCI_DEV_BRIDGE_450NX)
795 {
796 USHORT ConfigReg;
797
798 /* PXB livelock */
799 if (PciConfig->RevisionID == BRIDGE_450NX_REV_B0)
800 {
801 WARN("Enabling workaround for the 450NX #19\n");
802 return TRUE;
803 }
804
806 BusNumber,
808 &ConfigReg,
810 sizeof(ConfigReg));
811 INFO("PXB CFG: %04X\n", ConfigReg);
812
813 /* PXB arbiter deadlock */
814 if ((PciConfig->RevisionID != BRIDGE_450NX_REV_B1) &&
815 (ConfigReg & PXB_CONFIG_PCI_BUS_LOCK))
816 {
817 WARN("Enabling workaround for the 450NX #20\n");
818 return TRUE;
819 }
820
821 /* PCI data corruption */
822 if ((PciConfig->RevisionID == BRIDGE_450NX_REV_C0) &&
823 (ConfigReg & PXB_CONFIG_BUF_RESTREAM))
824 {
825 WARN("Enabling workaround for the 450NX #25\n");
826 return TRUE;
827 }
828 }
829
830 return FALSE;
831}
832
833static
834CODE_SEG("PAGE")
835VOID
837 _In_ PATA_CONTROLLER Controller,
838 _In_ const INTEL_CONTROLLER_INFO* ControllerInfo,
839 _In_ PCHANNEL_DATA_PATA ChanData)
840{
841 ULONG SupportedMode;
842
843 PAGED_CODE();
844
845 switch (ControllerInfo->Type)
846 {
847 case TYPE_MPIIX:
848 case TYPE_PIIX:
849 {
850 PINTEL_HW_EXTENSION HwExt = (PVOID)ChanData->HwExt;
851
852 if (ControllerInfo->Type == TYPE_MPIIX)
853 HwExt->Register = MPIIX_REG_IDETIM;
854 else
855 HwExt->Register = PIIX_REG_IDETIM(ChanData->Channel);
856
857 ChanData->SetTransferMode = IntelPiixLegacySetTransferMode;
858 ChanData->PrepareIo = IntelPiixLegacyPrepareIo;
859 break;
860 }
861
862 case TYPE_PIIX3:
863 case TYPE_PIIX4:
864 case TYPE_ICH:
865 ChanData->SetTransferMode = IntelPiixSetTransferMode;
866 break;
867
868 case TYPE_SCH:
869 ChanData->SetTransferMode = IntelSchSetTransferMode;
870 break;
871
872 default:
873 ChanData->SetTransferMode = SataSetTransferMode;
874 break;
875 }
876
877 switch (ControllerInfo->Type)
878 {
879 case TYPE_MPIIX:
880 SupportedMode = PIO_ALL;
881 break;
882
883 case TYPE_PIIX:
884 case TYPE_PIIX3:
885 SupportedMode = PIO_ALL | SWDMA_MODE2 | MWDMA_MODES(1, 2);
886 break;
887
888 case TYPE_PIIX4:
889 SupportedMode = PIO_ALL | SWDMA_MODE2 | MWDMA_MODES(1, 2) | UDMA_MODES(0, 2);
890 break;
891
892 case TYPE_ICH:
893 {
894 /* Errata: MW DMA Mode-1 Tdh (unable to drive MWDMA1 and SWDMA2 timings) */
895 SupportedMode = PIO_ALL | MWDMA_MODE2 | UDMA_MODES(0, 5);
896
897 if (Controller->Pci.DeviceID == PCI_DEV_ICH_82801AA ||
898 Controller->Pci.DeviceID == PCI_DEV_ICH0_82801AB)
899 {
900 /* Errata: IDE Bus Master Concurrency */
901 if (Controller->Pci.RevisionID == 0)
902 {
903 SupportedMode = PIO_ALL;
904 }
905 else
906 {
907 /* ICH is UDMA4 */
908 SupportedMode &= ~UDMA_MODE5;
909
910 /* ICH0 is UDMA2 */
911 if (Controller->Pci.DeviceID == PCI_DEV_ICH0_82801AB)
912 SupportedMode &= ~(UDMA_MODE3 | UDMA_MODE4);
913 }
914 }
915
916 /* Check for 80-conductor cable */
917 if (SupportedMode & UDMA_80C_ALL)
918 {
919 USHORT IdeConfigReg = PciRead16(Controller, PIIX_REG_CONFIG);
920 if (!(IdeConfigReg & PIIX_CONFIG_CR(ChanData->Channel)))
921 {
922 INFO("CH %lu: BIOS detected 40-conductor cable\n", ChanData->Channel);
923 SupportedMode &= ~UDMA_80C_ALL;
924 }
925 }
926 break;
927 }
928
929 case TYPE_SCH:
930 {
931 ULONG DeviceTimingReg[2];
932
933 SupportedMode = PIO_ALL | MWDMA_ALL | UDMA_MODES(0, 5);
934
935 /* Check for 80-conductor cable */
936 PciRead(Controller, &DeviceTimingReg, SCH_REG_DTIM(0), sizeof(DeviceTimingReg));
937 if ((DeviceTimingReg[0] & SCH_DTIM_UDM_MASK) <= SCH_DTIM_UDM(2) &&
938 (DeviceTimingReg[1] & SCH_DTIM_UDM_MASK) <= SCH_DTIM_UDM(2))
939 {
940 INFO("CH %lu: BIOS hasn't selected mode faster than UDMA 2, "
941 "assume 40-conductor cable\n",
942 ChanData->Channel);
943 SupportedMode &= ~UDMA_80C_ALL;
944 }
945 break;
946 }
947
948 case TYPE_SATA:
949 {
950 SupportedMode = SATA_ALL;
951
952 // TODO: Read the port map register and set CHANNEL_FLAG_NO_SLAVE when appropriate
953 ERR("CH %lu: PMR %02X PCS %04X\n",
954 ChanData->Channel,
955 PciRead8(Controller, 0x90),
956 PciRead16(Controller, 0x92));
957 break;
958 }
959
960 default:
961 ASSERT(FALSE);
963 }
964 ChanData->TransferModeSupported = SupportedMode;
965}
966
967CODE_SEG("PAGE")
970 _Inout_ PATA_CONTROLLER Controller)
971{
972 const INTEL_CONTROLLER_INFO* ControllerInfo;
973 ULONG i, ExtensionSize, HwFlags;
975
976 PAGED_CODE();
977 ASSERT(Controller->Pci.VendorID == PCI_VEN_INTEL);
978
979 for (i = 0; i < RTL_NUMBER_OF(IntelControllerList); ++i)
980 {
981 ControllerInfo = &IntelControllerList[i];
982
983 if (Controller->Pci.DeviceID == ControllerInfo->DeviceID)
984 break;
985 }
987 return STATUS_NO_MATCH;
988
989 Controller->Flags |= CTRL_FLAG_DMA_INTERRUPT;
990
991 if (ControllerInfo->Type == TYPE_SCH)
992 Controller->MaxChannels = 1;
993
994 if (ControllerInfo->Type == TYPE_PIIX || ControllerInfo->Type == TYPE_MPIIX)
996 else
997 ExtensionSize = 0;
998
1000 if (!NT_SUCCESS(Status))
1001 return Status;
1002
1003 switch (ControllerInfo->Type)
1004 {
1005 case TYPE_MPIIX:
1006 /*
1007 * This is a bridge device and there are no PCI BAR resources allocated,
1008 * so mark the controller as a legacy device.
1009 */
1010 Controller->Flags &= ~CTRL_FLAG_NATIVE_PCI;
1011 Controller->ChannelEnableBits = IntelMpiixEnableBits;
1012 break;
1013
1014 case TYPE_PIIX:
1015 case TYPE_PIIX3:
1016 case TYPE_PIIX4:
1017 case TYPE_ICH:
1018 Controller->ChannelEnableBits = IntelPiixEnableBits;
1019 break;
1020
1021 case TYPE_SATA:
1022 // TODO: Implement the map support
1023 //Controller->ChannelEnabledTest = IntelCombinedEnabledTest;
1024 //HwFlags = TYPE_ICH;
1025 break;
1026
1027 default:
1028 break;
1029 }
1030 HwFlags = ControllerInfo->Type;
1031
1033 HwFlags |= HW_FLAGS_DISABLE_DMA;
1034
1035 for (i = 0; i < Controller->MaxChannels; ++i)
1036 {
1037 PCHANNEL_DATA_PATA ChanData = Controller->Channels[i];
1038
1039 ChanData->HwFlags = HwFlags;
1040
1041 IntelInitChannel(Controller, ControllerInfo, ChanData);
1042
1043 if (HwFlags & HW_FLAGS_DISABLE_DMA)
1044 ChanData->TransferModeSupported &= PIO_ALL;
1045 }
1046
1047 return STATUS_SUCCESS;
1048}
#define PAGED_CODE()
#define CODE_SEG(...)
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
unsigned char BOOLEAN
Definition: actypes.h:127
#define REQUEST_FLAG_PROGRAM_DMA
Definition: ata_shared.h:342
#define MWDMA_ALL
Definition: ata_user.h:27
#define PIO_MODE(n)
Definition: ata_user.h:36
#define MWDMA_MODE(n)
Definition: ata_user.h:38
#define SWDMA_MODE(n)
Definition: ata_user.h:37
#define PIO_ALL
Definition: ata_user.h:19
#define UDMA_MODE(n)
Definition: ata_user.h:39
LONG NTSTATUS
Definition: precomp.h:26
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
PDEVICE_LIST DeviceList
Definition: utils.c:27
#define INFO
Definition: debug.h:89
Status
Definition: gdiplustypes.h:25
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
ULONG NTAPI HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length)
Definition: bus.c:73
_In_ ULONG Mode
Definition: hubbusif.h:303
#define SWDMA_MODE2
Definition: ide.h:285
#define MAX_IDE_DEVICE
Definition: ide.h:32
#define UDMA_MODE4
Definition: ide.h:295
#define MWDMA_MODE2
Definition: ide.h:289
#define MAX_IDE_CHANNEL
Definition: ide.h:30
#define UDMA_MODE3
Definition: ide.h:294
#define PCI_DEV_ICH5_R_82801ER
Definition: intel.c:52
#define PCI_DEV_ICH2_82801BA
Definition: intel.c:39
#define PCI_DEV_PCH_5SERIES_1
Definition: intel.c:90
#define PIIX_CONFIG_WR_PING_PONG
Definition: intel.c:227
#define PCI_DEV_ICH5_6300ESB_SATA
Definition: intel.c:54
#define PIIX_CONFIG_KEEP_MASK
Definition: intel.c:218
#define PCI_DEV_ICH6_82801FB_IDE
Definition: intel.c:60
#define PCI_DEV_PCH_5SERIES_2
Definition: intel.c:91
#define PCI_DEV_PCH_X99_1
Definition: intel.c:130
#define PCI_DEV_ICH7_82801GB
Definition: intel.c:65
#define SCH_DTIM_PM_MASK
Definition: intel.c:234
#define PCI_DEV_ICH3_M_82801CAM
Definition: intel.c:43
#define PIIX_REG_UDMATIM(Channel)
Definition: intel.c:206
#define SCH_DTIM_UDM_MASK
Definition: intel.c:236
#define PCI_DEV_ICH4_L_82801DBL
Definition: intel.c:46
#define PIIX_SIDETIM_ISP(Channel, Value)
Definition: intel.c:189
static VOID IntelInitChannel(_In_ PATA_CONTROLLER Controller, _In_ const INTEL_CONTROLLER_INFO *ControllerInfo, _In_ PCHANNEL_DATA_PATA ChanData)
Definition: intel.c:836
#define PCI_DEV_ICH8_R_82801HR
Definition: intel.c:70
#define PCI_DEV_ICH9_R_82801IR_1
Definition: intel.c:74
#define SCH_DTIM_UDM(Mode)
Definition: intel.c:242
#define PCI_DEV_PCH_X79_1
Definition: intel.c:107
#define PIIX_IDETIM_SITRE
Definition: intel.c:174
#define PCI_DEV_PCH_5SERIES_6
Definition: intel.c:95
static const ULONG IntelTimingModeToCycleTime[5]
Definition: intel.c:390
#define PCI_DEV_ICH9_M_82801IBM_1
Definition: intel.c:77
#define BRIDGE_450NX_REV_B0
Definition: intel.c:145
#define PCI_DEV_BRIDGE_450NX
Definition: intel.c:141
static BOOLEAN IntelPciBridgeErrataMatch(_In_ PVOID Context, _In_ ULONG BusNumber, _In_ PCI_SLOT_NUMBER PciSlot, _In_ PPCI_COMMON_HEADER PciConfig)
Definition: intel.c:772
#define SCH_REG_DTIM(Drive)
Definition: intel.c:232
#define PCI_DEV_ICH9_M_82801IBM_2
Definition: intel.c:78
#define TYPE_PIIX4
Definition: intel.c:256
#define TYPE_SCH
Definition: intel.c:259
static PCIIDEX_PAGED_DATA const ATA_PCI_ENABLE_BITS IntelPiixEnableBits[MAX_IDE_CHANNEL]
Definition: intel.c:366
#define PXB_CONFIG_PCI_BUS_LOCK
Definition: intel.c:155
#define PCI_DEV_PIIX4E_82372FB
Definition: intel.c:30
#define PXB_REG_CONFIG
Definition: intel.c:152
#define PCI_DEV_ATOM_E3800_1
Definition: intel.c:127
#define PCI_DEV_PCH_X99_2
Definition: intel.c:131
static VOID IntelSchSetTransferMode(_In_ PATA_CONTROLLER Controller, _In_ ULONG Channel, _In_reads_(MAX_IDE_DEVICE) PCHANNEL_DEVICE_CONFIG *DeviceList)
Definition: intel.c:622
#define PCI_DEV_PIIX4E_82451NX
Definition: intel.c:32
#define PCI_DEV_ICH8_M_82801HBM
Definition: intel.c:72
#define PCI_DEV_PCH_6SERIES_4
Definition: intel.c:100
#define TYPE_PIIX
Definition: intel.c:254
#define PIIX_IDETIM_TIME(Drive)
Definition: intel.c:166
#define PCI_DEV_PCH_8SERIES_1
Definition: intel.c:118
#define HW_FLAGS_HAS_UDMA_REG
Definition: intel.c:247
#define PIIX_IDETIM_DTE(Drive)
Definition: intel.c:169
static const ULONG IntelDmaModeToTimingMode[]
Definition: intel.c:418
#define PIIX_IDETIM_RCT(Value)
Definition: intel.c:178
#define PIIX_IDETIM_SETTINGS(Drive, Value)
Definition: intel.c:180
#define PCI_DEV_PCH_5SERIES_3
Definition: intel.c:92
#define PIIX_IDETIM_ISP(Value)
Definition: intel.c:179
#define PCI_DEV_ICH10_82801JD_2
Definition: intel.c:82
static const UCHAR IntelModeSettings[]
Definition: intel.c:399
#define PCI_DEV_PCH_8SERIES_8
Definition: intel.c:125
#define PCI_DEV_PCH_7SERIES_1
Definition: intel.c:102
#define PCI_DEV_ICH6_M_82801FBM
Definition: intel.c:59
#define BRIDGE_450NX_REV_C0
Definition: intel.c:147
#define PCI_DEV_PCH_9SERIES_4
Definition: intel.c:138
#define HW_FLAGS_HAS_CFG_REG
Definition: intel.c:246
#define PCI_DEV_BRIDGE_450KX
Definition: intel.c:140
#define PCI_DEV_PCH_8900_1
Definition: intel.c:110
static const UCHAR IntelUdmaSettings[]
Definition: intel.c:408
#define PCI_DEV_ATOM_E3800_2
Definition: intel.c:128
#define PIIX_CONFIG_CLOCK_UDMA66(Channel, Drive)
Definition: intel.c:223
#define SCH_DTIM_USD
Definition: intel.c:238
#define PCI_DEV_ICH_82801AA
Definition: intel.c:34
static PCIIDEX_PAGED_DATA const ATA_PCI_ENABLE_BITS IntelMpiixEnableBits[MAX_IDE_CHANNEL]
Definition: intel.c:373
#define PCI_DEV_ICH5_6300ESB_RAID
Definition: intel.c:55
#define PIIX_REG_CONFIG
Definition: intel.c:216
#define PCI_DEV_PCH_9SERIES_1
Definition: intel.c:135
#define PCI_DEV_PCH_6SERIES_3
Definition: intel.c:99
#define PCI_DEV_ICH5_82801EB_IDE
Definition: intel.c:51
NTSTATUS IntelGetControllerProperties(_Inout_ PATA_CONTROLLER Controller)
Definition: intel.c:969
#define PCI_DEV_PCH_8SERIES_3
Definition: intel.c:120
#define PCI_DEV_EP80579
Definition: intel.c:88
#define PIIX_REG_UDMACTL
Definition: intel.c:194
#define PCI_DEV_PCH_5SERIES_5
Definition: intel.c:94
#define PCI_DEV_ICH7_M_82801GBM
Definition: intel.c:66
#define PCI_DEV_PCH_6SERIES_1
Definition: intel.c:97
#define PCI_DEV_ICH4_82801DB
Definition: intel.c:48
#define TYPE_ICH
Definition: intel.c:257
#define PCI_DEV_ICH5_82801EB_SATA
Definition: intel.c:50
static VOID IntelPiixLegacySetTransferMode(_In_ PATA_CONTROLLER Controller, _In_ ULONG Channel, _In_reads_(MAX_IDE_DEVICE) PCHANNEL_DEVICE_CONFIG *DeviceList)
Definition: intel.c:729
#define PCI_DEV_SCH_ATOM_Z5XX
Definition: intel.c:86
#define BRIDGE_450NX_REV_B1
Definition: intel.c:146
#define TYPE_MPIIX
Definition: intel.c:253
#define PCI_DEV_PCH_7SERIES_2
Definition: intel.c:103
#define PCI_DEV_ICH10_82801JD_1
Definition: intel.c:81
#define PCI_DEV_ICH10_82801JI_1
Definition: intel.c:83
struct _INTEL_CONTROLLER_INFO * PINTEL_CONTROLLER_INFO
#define PCI_DEV_ICH9_R_82801IR_2
Definition: intel.c:75
#define PIIX_IDETIM_IE(Drive)
Definition: intel.c:167
static VOID IntelPiixSetTransferMode(_In_ PATA_CONTROLLER Controller, _In_ ULONG Channel, _In_reads_(MAX_IDE_DEVICE) PCHANNEL_DEVICE_CONFIG *DeviceList)
Definition: intel.c:488
#define SCH_DTIM_PM(Mode)
Definition: intel.c:240
#define PXB_CONFIG_BUF_RESTREAM
Definition: intel.c:154
#define PIIX_IDETIM_RSV_MASK
Definition: intel.c:172
#define PCI_DEV_ICH0_82801AB
Definition: intel.c:36
#define HW_FLAGS_DISABLE_DMA
Definition: intel.c:245
struct _INTEL_HW_EXTENSION * PINTEL_HW_EXTENSION
#define PCI_DEV_ICH7_82801G
Definition: intel.c:67
#define PCI_DEV_PCH_X99_4
Definition: intel.c:133
#define SCH_DTIM_MDM_MASK
Definition: intel.c:235
#define PCI_DEV_PIIX4_82371AB
Definition: intel.c:29
static VOID IntelPiixChooseDeviceSpeed(_In_ ULONG Channel, _In_ PCHANNEL_DEVICE_CONFIG Device)
Definition: intel.c:433
#define PIIX_UDMATIM_CT(Drive, Value)
Definition: intel.c:211
#define PIIX_REG_SIDETIM
Definition: intel.c:185
#define PCI_DEV_ICH6_R_82801FB
Definition: intel.c:58
#define TYPE_PIIX3
Definition: intel.c:255
#define PCI_DEV_PCH_8SERIES_5
Definition: intel.c:122
#define PCI_DEV_PCH_8900_2
Definition: intel.c:111
#define SCH_DTIM_PPE
Definition: intel.c:237
#define PCI_DEV_PCH_6SERIES_2
Definition: intel.c:98
struct _INTEL_CONTROLLER_INFO INTEL_CONTROLLER_INFO
static USHORT IntelPiixLegacyComputeIdeTiming(_In_ PCHANNEL_DEVICE_CONFIG Device, _In_ ULONG Number, _In_ ULONG Mode)
Definition: intel.c:685
#define PCI_DEV_ICH8_82801H
Definition: intel.c:69
#define PIIX_REG_IDETIM(Channel)
Definition: intel.c:163
static const UCHAR IntelClockSettings[5][2]
Definition: intel.c:379
static PCIIDEX_PAGED_DATA const INTEL_CONTROLLER_INFO IntelControllerList[]
Definition: intel.c:273
#define PCI_DEV_PIIX4E_82443MX
Definition: intel.c:31
#define PCI_DEV_PCH_7SERIES_4
Definition: intel.c:105
#define PIIX_IDETIM_IDE
Definition: intel.c:176
#define PCI_DEV_PCH_X79_2
Definition: intel.c:108
#define PIIX_UDMACTL_EN(Channel, Drive)
Definition: intel.c:199
#define PIIX_IDETIM_PPE(Drive)
Definition: intel.c:168
#define PCI_DEV_PCH_8SERIES_7
Definition: intel.c:124
#define MPIIX_REG_IDETIM
Definition: intel.c:164
#define PCI_DEV_ICH10_82801JI_2
Definition: intel.c:84
#define PCI_DEV_ATOM_C2000_1
Definition: intel.c:113
#define PCI_DEV_ICH9_M_82801IBM_3
Definition: intel.c:79
#define PCI_DEV_ESB2_63XXESB
Definition: intel.c:62
#define PCI_DEV_ICH9_82801I
Definition: intel.c:76
#define PCI_DEV_PCH_8SERIES_6
Definition: intel.c:123
#define PCI_DEV_ATOM_C2000_2
Definition: intel.c:114
#define PIIX_CONFIG_CLOCK_UDMA100(Channel, Drive)
Definition: intel.c:225
static VOID IntelPiixLegacyPrepareIo(_In_ PVOID ChannelContext, _In_ PATA_DEVICE_REQUEST Request)
Definition: intel.c:662
#define PIIX_CONFIG_CR(Channel)
Definition: intel.c:221
#define PCI_DEV_PCH_5SERIES_4
Definition: intel.c:93
#define PCI_DEV_ATOM_C2000_4
Definition: intel.c:116
#define PCI_DEV_PCH_9SERIES_3
Definition: intel.c:137
#define PCI_DEV_PIIX3_82371SB
Definition: intel.c:27
#define BRIDGE_450KX_REV_B0
Definition: intel.c:143
#define PCI_DEV_ICH6_82801FB_SATA
Definition: intel.c:57
#define PCI_DEV_PCH_7SERIES_3
Definition: intel.c:104
#define PCI_DEV_MPIIX_82371MX
Definition: intel.c:25
#define PCI_DEV_ATOM_C2000_3
Definition: intel.c:115
#define PCI_DEV_PCH_X99_3
Definition: intel.c:132
#define PCI_DEV_ICH2_82801BAM
Definition: intel.c:38
#define PCI_DEV_PCH_9SERIES_2
Definition: intel.c:136
#define SCH_DTIM_MDM(Mode)
Definition: intel.c:241
#define PCI_DEV_PIIX_82371FB
Definition: intel.c:24
#define PCI_DEV_ICH3_S_82801CA
Definition: intel.c:44
#define PCI_DEV_ICH4_M_82801DBM
Definition: intel.c:47
#define PCI_DEV_C_ICH_82801E
Definition: intel.c:41
#define PCI_DEV_ICH5_6300ESB_IDE
Definition: intel.c:53
#define PCI_DEV_ICH7_6321ESB
Definition: intel.c:64
#define TYPE_SATA
Definition: intel.c:258
#define PIIX_SIDETIM_RCT(Channel, Value)
Definition: intel.c:188
#define PCI_DEV_ICH8_M_82801HM
Definition: intel.c:71
struct _INTEL_HW_EXTENSION INTEL_HW_EXTENSION
#define PCI_DEV_PCH_8SERIES_2
Definition: intel.c:119
#define PCI_DEV_PCH_8SERIES_4
Definition: intel.c:121
if(dx< 0)
Definition: linetemp.h:194
#define ASSERT(a)
Definition: mode.c:44
_In_ ULONG Number
Definition: haltypes.h:1872
#define _In_reads_(s)
Definition: no_sal2.h:168
#define _Inout_
Definition: no_sal2.h:162
#define _In_
Definition: no_sal2.h:158
#define UNREACHABLE
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define STATUS_NO_MATCH
Definition: ntstatus.h:873
#define PCI_VEN_INTEL
Definition: pata.h:19
#define SATA_ALL
Definition: pata.h:37
#define UDMA_MODES(MinMode, MaxMode)
Definition: pata.h:49
#define MWDMA_MODES(MinMode, MaxMode)
Definition: pata.h:45
#define UDMA_80C_ALL
Definition: pata.h:41
NTSTATUS PciIdeCreateChannelData(_In_ PATA_CONTROLLER Controller, _In_ ULONG HwExtensionSize)
VOID PciRead(_In_ PATA_CONTROLLER Controller, _Out_writes_bytes_all_(BufferLength) PVOID Buffer, _In_ ULONG ConfigDataOffset, _In_ ULONG BufferLength)
Definition: pciidex.c:72
BOOLEAN PciFindDevice(_In_ __callback PATA_PCI_MATCH_FN MatchFunction, _In_ PVOID Context)
Definition: pciidex.c:13
CHANNEL_PREPARE_IO PataPrepareIo
Definition: pciidex.h:700
FORCEINLINE UCHAR PciRead8(_In_ PATA_CONTROLLER Controller, _In_ ULONG ConfigDataOffset)
Definition: pciidex.h:847
_In_ ULONG _In_ PCI_SLOT_NUMBER PciSlot
Definition: pciidex.h:66
#define DEV_NUMBER(Device)
Definition: pciidex.h:56
_In_ ULONG Channel
Definition: pciidex.h:74
#define PCIIDEX_PAGED_DATA
Definition: pciidex.h:50
FORCEINLINE VOID PciWrite16(_In_ PATA_CONTROLLER Controller, _In_ ULONG ConfigDataOffset, _In_ USHORT Value)
Definition: pciidex.h:893
FORCEINLINE VOID PciWrite8(_In_ PATA_CONTROLLER Controller, _In_ ULONG ConfigDataOffset, _In_ UCHAR Value)
Definition: pciidex.h:883
_In_ ULONG BusNumber
Definition: pciidex.h:65
FORCEINLINE VOID PciWrite32(_In_ PATA_CONTROLLER Controller, _In_ ULONG ConfigDataOffset, _In_ ULONG Value)
Definition: pciidex.h:903
FORCEINLINE USHORT PciRead16(_In_ PATA_CONTROLLER Controller, _In_ ULONG ConfigDataOffset)
Definition: pciidex.h:859
#define CTRL_FLAG_DMA_INTERRUPT
Definition: pciidex.h:230
CHANNEL_SET_MODE_EX SataSetTransferMode
Definition: pciidex.h:633
_In_ ULONG _In_ PCI_SLOT_NUMBER _In_ PPCI_COMMON_HEADER PciConfig
Definition: pciidex.h:67
FORCEINLINE ULONG PciRead32(_In_ PATA_CONTROLLER Controller, _In_ ULONG ConfigDataOffset)
Definition: pciidex.h:871
unsigned short USHORT
Definition: pedump.c:61
@ PCIConfiguration
Definition: miniport.h:93
WORD ExtensionSize
Definition: apisets.c:17
#define STATUS_SUCCESS
Definition: shellext.h:65
#define TRACE(s)
Definition: solgame.cpp:4
_In_ PVOID Context
Definition: storport.h:2269
PUCHAR HwExt[ANYSIZE_ARRAY]
Definition: pciidex.h:317
USHORT Timing[2]
Definition: intel.c:268
USHORT CurrentTiming
Definition: intel.c:265
struct _INTEL_HW_EXTENSION::@1173 Device[MAX_IDE_DEVICE]
union _PCI_SLOT_NUMBER::@4410 u
unsigned char UCHAR
Definition: typedefs.h:53
void * PVOID
Definition: typedefs.h:50
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE Device
Definition: wdfchildlist.h:474
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
#define const
Definition: zconf.h:233