|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * Intel PIIX/PIIX3/PIIX4 PCI IDE controller.
5: * PIIX = PCI-ISA-IDE-Xelerator. (also USB on newer controllers)
6: *
7: * Notes:
8: *
9: * PIIX introduced in the "Triton" chipset.
10: * PIIX3 supports different timings for Master/Slave devices on both channels.
11: * PIIX4 adds support for Ultra DMA/33.
12: *
13: * Be sure to download and read the PIIX errata from Intel's web site at
14: * developer.intel.com.
15: *
16: * HISTORY:
17: *
18: */
19:
20: #ifndef _APPLEATAPIIXREGS_H
21: #define _APPLEATAPIIXREGS_H
22:
23: /*
24: * PCI ID for supported PIIX variants.
25: */
26: #define PCI_ID_PIIX 0x12308086
27: #define PCI_ID_PIIX3 0x70108086
28: #define PCI_ID_PIIX4 0x71118086
29: #define PCI_ID_NONE 0xffffffff
30:
31: /*
32: * Decoded port addresses. Seems to be hardcoded and it does not
33: * show up in the PCI configuration space memory ranges.
34: */
35: #define PIIX_P_CMD_ADDR 0x1f0
36: #define PIIX_P_CTL_ADDR 0x3f4
37: #define PIIX_S_CMD_ADDR 0x170
38: #define PIIX_S_CTL_ADDR 0x374
39: #define PIIX_CMD_SIZE 8
40: #define PIIX_CTL_SIZE 4
41:
42: /*
43: * IRQ assignment.
44: */
45: #define PIIX_P_IRQ 14
46: #define PIIX_S_IRQ 15
47:
48: /*
49: * PIIX has two IDE channels.
50: */
51: #define PIIX_CHANNEL_PRIMARY 0
52: #define PIIX_CHANNEL_SECONDARY 1
53:
54: /*
55: * PIIX PCI config space registers.
56: * Register size (bits) in parenthesis.
57: */
58: #define PIIX_PCI_CFID 0x00
59:
60: #define PIIX_PCI_PCICMD 0x04 // (16) PCI command register
61: #define PIIX_PCI_PCICMD_IOSE 0x01 // I/O space enable
62: #define PIIX_PCI_PCICMD_BME 0x04 // bus-master enable
63:
64: #define PIIX_PCI_PCISTS 0x06 // (16) PCI device status register
65: #define PIIX_PCI_RID 0x08 // (8) Revision ID register
66: #define PIIX_PCI_CLASSC 0x09 // (24) Class code register
67: #define PIIX_PCI_MLT 0x0d // (8) Master latency timer register
68: #define PIIX_PCI_HEDT 0x0e // (8) Header type register
69:
70: #define PIIX_PCI_BMIBA 0x20 // (32) Bus-Master base address
71: #define PIIX_PCI_BMIBA_RTE 0x01 // resource type indicator (I/O)
72: #define PIIX_PCI_BMIBA_MASK 0xfff0 // base address mask
73:
74: #define PIIX_PCI_IDETIM 0x40 // (16) IDE timing registers (pri)
75: #define PIIX_PCI_IDETIM_S 0x42 // (16) IDE timing registers (sec)
76: #define PIIX_PCI_SIDETIM 0x44 // (8) Slave IDE timing register
77: #define PIIX_PCI_UDMACTL 0x48 // (8) Ultra DMA/33 control register
78: #define PIIX_PCI_UDMATIM 0x4a // (16) Ultra DMA/33 timing register
79:
80: /*
81: * PIIX PCI configuration space register definition.
82: *
83: * PIIX_IDETIM - IDE timing register.
84: *
85: * Address:
86: * 0x40:0x41 - Primary channel
87: * 0x42:0x43 - Secondary channel
88: */
89: #define PIIX_PCI_IDETIM_IDE 0x8000 // IDE decode enable
90: #define PIIX_PCI_IDETIM_SITRE 0x4000 // slave timing register enable
91:
92: #define PIIX_PCI_IDETIM_ISP_MASK 0x3000
93: #define PIIX_PCI_IDETIM_ISP_SHIFT 12
94: #define PIIX_PCI_IDETIM_ISP_5 0x0000 // IORDY sample point
95: #define PIIX_PCI_IDETIM_ISP_4 0x1000 // (PCI clocks)
96: #define PIIX_PCI_IDETIM_ISP_3 0x2000
97: #define PIIX_PCI_IDETIM_ISP_2 0x3000
98:
99: #define PIIX_PCI_IDETIM_RTC_MASK 0x0300
100: #define PIIX_PCI_IDETIM_RTC_SHIFT 8
101: #define PIIX_PCI_IDETIM_RTC_4 0x0000 // receovery time (PCI clocks)
102: #define PIIX_PCI_IDETIM_RTC_3 0x0100
103: #define PIIX_PCI_IDETIM_RTC_2 0x0200
104: #define PIIX_PCI_IDETIM_RTC_1 0x0300
105:
106: #define PIIX_PCI_IDETIM_DTE1 0x0080 // DMA timing enable only
107: #define PIIX_PCI_IDETIM_PPE1 0x0040 // prefetch and posting enabled
108: #define PIIX_PCI_IDETIM_IE1 0x0020 // IORDY sample point enable
109: #define PIIX_PCI_IDETIM_TIME1 0x0010 // fast timing enable
110: #define PIIX_PCI_IDETIM_DTE0 0x0008 // same as above for drive 0
111: #define PIIX_PCI_IDETIM_PPE0 0x0004
112: #define PIIX_PCI_IDETIM_IE0 0x0002
113: #define PIIX_PCI_IDETIM_TIME0 0x0001
114:
115: /*
116: * PIIX PCI configuration space register definition.
117: *
118: * PIIX_SIDETIM - Slave IDE timing register.
119: *
120: * Address: 0x44
121: */
122: #define PIIX_PCI_SIDETIM_SISP1_MASK 0xc0
123: #define PIIX_PCI_SIDETIM_SISP1_SHIFT 6
124: #define PIIX_PCI_SIDETIM_SRTC1_MASK 0x30
125: #define PIIX_PCI_SIDETIM_SRTC1_SHIFT 4
126: #define PIIX_PCI_SIDETIM_PISP1_MASK 0x0c
127: #define PIIX_PCI_SIDETIM_PISP1_SHIFT 2
128: #define PIIX_PCI_SIDETIM_PRTC1_MASK 0x03
129: #define PIIX_PCI_SIDETIM_PRTC1_SHIFT 0
130:
131: /*
132: * PIIX PCI configuration space register definition.
133: *
134: * PIIX_UDMACTL - Ultra DMA/33 control register
135: *
136: * Address: 0x48
137: */
138: #define PIIX_PCI_UDMACTL_SSDE1 0x08 // Enable UDMA/33 Sec/Drive1
139: #define PIIX_PCI_UDMACTL_SSDE0 0x04 // Enable UDMA/33 Sec/Drive0
140: #define PIIX_PCI_UDMACTL_PSDE1 0x02 // Enable UDMA/33 Pri/Drive1
141: #define PIIX_PCI_UDMACTL_PSDE0 0x01 // Enable UDMA/33 Pri/Drive0
142:
143: /*
144: * PIIX PCI configuration space register definition.
145: *
146: * PIIX_UDMATIM - Ultra DMA/33 timing register
147: *
148: * Address: 0x4a-0x4b
149: */
150: #define PIIX_PCI_UDMATIM_PCT0_MASK 0x0003
151: #define PIIX_PCI_UDMATIM_PCT0_SHIFT 0
152: #define PIIX_PCI_UDMATIM_PCT1_MASK 0x0030
153: #define PIIX_PCI_UDMATIM_PCT1_SHIFT 4
154: #define PIIX_PCI_UDMATIM_SCT0_MASK 0x0300
155: #define PIIX_PCI_UDMATIM_SCT0_SHIFT 8
156: #define PIIX_PCI_UDMATIM_SCT1_MASK 0x3000
157: #define PIIX_PCI_UDMATIM_SCT1_SHIFT 12
158:
159:
160: /*
161: * PIIX IO space register offsets. Base address is set in PIIX_PCI_BMIBA.
162: * Register size (bits) in parenthesis.
163: *
164: * Note:
165: * For the primary channel, the base address is stored in PIIX_PCI_BMIBA.
166: * For the secondary channel, an offset (PIIX_IO_BM_OFFSET) is added to
167: * the value stored in PIIX_PCI_BMIBA.
168: */
169: #define PIIX_IO_BMICX 0x00 // (8) Bus master command register
170: #define PIIX_IO_BMISX 0x02 // (8) Bus master status register
171: #define PIIX_IO_BMIDTPX 0x04 // (32) Descriptor table register
172:
173: #define PIIX_IO_BM_OFFSET 0x08 // offset to sec channel registers
174: #define PIIX_IO_BM_SIZE 0x08 // BM registers size for each channel
175: #define PIIX_IO_BM_MASK 0xfff0 // BMIBA mask to get I/O base address
176:
177: /*
178: * PIIX IO space register definition.
179: *
180: * BMICX - Bus master IDE command register
181: */
182: #define PIIX_IO_BMICX_SSBM 0x01 // 1=Start, 0=Stop
183: #define PIIX_IO_BMICX_RWCON 0x08 // 0=Read, 1=Write
184:
185: /*
186: * PIIX IO space register definition.
187: *
188: * PIIX_BMISX - Bus master IDE status register
189: */
190: #define PIIX_IO_BMISX_DMA1CAP 0x40 // drive 1 is capable of DMA transfers
191: #define PIIX_IO_BMISX_DMA0CAP 0x20 // drive 0 is capable of DMA transfers
192: #define PIIX_IO_BMISX_IDEINTS 0x04 // IDE device asserted its interrupt
193: #define PIIX_IO_BMISX_ERROR 0x02 // DMA error (cleared by writing a 1)
194: #define PIIX_IO_BMISX_BMIDEA 0x01 // bus master active bit
195:
196: #define PIIX_IO_BMISX_STATUS (PIIX_IO_BMISX_IDEINTS | \
197: PIIX_IO_BMISX_ERROR | \
198: PIIX_IO_BMISX_BMIDEA)
199:
200: /*
201: * PIIX Bus Master alignment/boundary requirements.
202: *
203: * Intel nomemclature:
204: * WORD - 16-bit
205: * DWord - 32-bit
206: */
207: #define PIIX_DT_ALIGN 4 // descriptor table must be DWord aligned.
208: #define PIIX_DT_BOUND (4 * 1024) // cannot cross 4K boundary. (or 64K ?)
209:
210: #define PIIX_BUF_ALIGN 2 // memory buffer must be word aligned.
211: #define PIIX_BUF_BOUND (64 * 1024) // cannot cross 64K boundary.
212: #define PIIX_BUF_LIMIT (64 * 1024) // limited to 64K in size
213:
214: /*
215: * PIIX Bus Master Physical Region Descriptor (PRD).
216: */
217: typedef struct {
218: UInt32 base; // base address
219: UInt16 count; // byte count
220: UInt16 flags; // flag bits
221: } prdEntry_t;
222:
223: #define PRD_FLAG_EOT 0x8000
224:
225: #define PRD_COUNT(x) (((x) == PIIX_BUF_LIMIT) ? 0 : (x))
226: #define PRD_TABLE_SIZE PAGE_SIZE
227: #define PRD_ENTRIES (PRD_TABLE_SIZE / sizeof(prdEntry_t))
228:
229: /*
230: * PIIX Register setting macro.
231: */
232: #define SET_REG_FIELD(reg, field, val) \
233: { \
234: reg &= ~(field ## _MASK); \
235: reg |= (((val) << field ## _SHIFT) & \
236: field ## _MASK); \
237: }
238:
239: /*
240: * Convert the "isp" and "rtc" fields in PIIX_IDETIM register from
241: * PCI clocks to their respective values, and vice-versa.
242: */
243: #define PIIX_CLK_TO_ISP(x) (5 - (x))
244: #define PIIX_ISP_TO_CLK(x) PIIX_CLK_TO_ISP(x)
245: #define PIIX_CLK_TO_RTC(x) (4 - (x))
246: #define PIIX_RTC_TO_CLK(x) PIIX_CLK_TO_RTC(x)
247:
248: #endif /* !_APPLEATAPIIXREGS_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.