|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * AppleATAPIIXTiming.h - Timing tables.
5: *
6: * HISTORY
7: *
8: */
9:
10: #ifndef _APPLEATAPIIXTIMING_H
11: #define _APPLEATAPIIXTIMING_H
12:
13: /*
14: * Supported transfer protocols. Entries in this table must map to the
15: * entries in ATATimingProtocol table.
16: */
17: typedef enum {
18: kPIIXProtocolPIO = 0,
19: kPIIXProtocolDMA,
20: kPIIXProtocolUDMA33,
21: kPIIXProtocolUDMA66,
22: kPIIXProtocolLast
23: } PIIXProtocol;
24:
25: /*
26: * PIIX PIO/DMA timing table.
27: */
28: typedef struct {
29: UInt8 pioMode; // PIO mode
30: UInt8 swDMAMode; // single-word DMA mode (obsolete)
31: UInt8 mwDMAMode; // multiword DMA mode
32: UInt8 isp; // IORDY sample point in PCI clocks
33: UInt8 rtc; // Recovery time in PCI clocks
34: UInt16 cycle; // cycle time in ns
35: } PIIXTiming;
36:
37: #define _NVM_ 0xff // not a valid mode
38:
39: static const
40: PIIXTiming PIIXPIOTimingTable[] = {
41: /* PIO SW MW ISP RTC CYCLE (ns) */
42: {0, 0, 0, 5, 4, 600},
43: {1, 1, _NVM_, 5, 4, 600},
44: {2, 2, _NVM_, 4, 4, 240},
45: {3, _NVM_, 1, 3, 3, 180},
46: {4, _NVM_, 2, 3, 1, 120},
47: {5, _NVM_, 2, 3, 1, 120},
48: };
49:
50: static const UInt8 PIIXPIOTimingTableSize = sizeof(PIIXPIOTimingTable) /
51: sizeof(PIIXPIOTimingTable[0]);
52:
53: /*
54: * PIIX Ultra-DMA/33 timing table.
55: */
56: typedef struct {
57: UInt8 mode; // mode number
58: UInt8 ct; // cycle time in PCI clocks
59: UInt8 rp; // Ready to Pause time in PCI clocks
60: UInt8 bits; // register bit setting
61: UInt16 strobe; // strobe period (cycle) in ns
62: } PIIXUDMATiming;
63:
64: static const
65: PIIXUDMATiming PIIXUDMATimingTable[] = {
66: /* MODE CT RP BITS STROBE/CYCLE (ns) */
67: {0, 4, 6, 0, 120},
68: {1, 3, 5, 1, 90},
69: {2, 2, 4, 2, 60},
70: };
71:
72: static const UInt8
73: PIIXUDMATimingTableSize = sizeof(PIIXUDMATimingTable) /
74: sizeof(PIIXUDMATimingTable[0]);
75:
76: /*
77: * For each drive, the following table will store the chosen timings
78: * for each supported protocol.
79: */
80: typedef struct {
81: UInt8 activeTimings[kPIIXProtocolLast]; // selected timings
82: UInt8 validTimings[kPIIXProtocolLast]; // calculated timings
83: UInt32 validFlag;
84: UInt32 activeFlag;
85: } PIIXSelectedTimings;
86:
87: /*
88: * Convert from ATATimingProtocol to PIIXProtocol.
89: */
90: inline PIIXProtocol ataToPIIXProtocol(ATATimingProtocol timingProtocol)
91: {
92: int piixProtocol = kPIIXProtocolPIO;
93: int ataProtocol = timingProtocol;
94:
95: while (ataProtocol != 1) {
96: ataProtocol >>= 1; piixProtocol++;
97: }
98: return ((PIIXProtocol) piixProtocol);
99: }
100:
101: /*
102: * Misc macros to get information from the PIIXSelectedTimings table.
103: */
104: #define PIIX_ACTIVATE_PROTOCOL(p) { \
105: timings[unit].activeTimings[p] = timings[unit].validTimings[p]; \
106: timings[unit].activeFlag |= (1 << (p)); \
107: }
108:
109: #define PIIX_DEACTIVATE_PROTOCOL(p) { \
110: timings[unit].activeFlag &= ~(1 << (p)); \
111: }
112:
113: #define PIIX_GET_ACTIVE_TIMING(p) (timings[unit].activeTimings[p])
114:
115: #define PIIX_PROTOCOL_IS_ACTIVE(p) ((bool) \
116: (timings[unit].activeFlag & (1 << (p))))
117:
118: #define PIIX_PROTOCOL_IS_VALID(p) ((bool) \
119: (timings[unit].validFlag & (1 << (p))))
120:
121: #endif /* !_APPLEATAPIIXTIMING_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.