AppleATAPIIXTiming.h [plain text]
#ifndef _APPLEATAPIIXTIMING_H
#define _APPLEATAPIIXTIMING_H
typedef enum {
kPIIXProtocolPIO = 0,
kPIIXProtocolDMA,
kPIIXProtocolUDMA33,
kPIIXProtocolUDMA66,
kPIIXProtocolLast
} PIIXProtocol;
typedef struct {
UInt8 pioMode; UInt8 swDMAMode; UInt8 mwDMAMode; UInt8 isp; UInt8 rtc; UInt16 cycle; } PIIXTiming;
#define _NVM_ 0xff // not a valid mode
static const
PIIXTiming PIIXPIOTimingTable[] = {
{0, 0, 0, 5, 4, 600},
{1, 1, _NVM_, 5, 4, 600},
{2, 2, _NVM_, 4, 4, 240},
{3, _NVM_, 1, 3, 3, 180},
{4, _NVM_, 2, 3, 1, 120},
{5, _NVM_, 2, 3, 1, 120},
};
static const UInt8 PIIXPIOTimingTableSize = sizeof(PIIXPIOTimingTable) /
sizeof(PIIXPIOTimingTable[0]);
typedef struct {
UInt8 mode; UInt8 ct; UInt8 rp; UInt8 bits; UInt16 strobe; } PIIXUDMATiming;
static const
PIIXUDMATiming PIIXUDMATimingTable[] = {
{0, 4, 6, 0, 120},
{1, 3, 5, 1, 90},
{2, 2, 4, 2, 60},
};
static const UInt8
PIIXUDMATimingTableSize = sizeof(PIIXUDMATimingTable) /
sizeof(PIIXUDMATimingTable[0]);
typedef struct {
UInt8 activeTimings[kPIIXProtocolLast]; UInt8 validTimings[kPIIXProtocolLast]; UInt32 validFlag;
UInt32 activeFlag;
} PIIXSelectedTimings;
inline PIIXProtocol ataToPIIXProtocol(ATATimingProtocol timingProtocol)
{
int piixProtocol = kPIIXProtocolPIO;
int ataProtocol = timingProtocol;
while (ataProtocol != 1) {
ataProtocol >>= 1; piixProtocol++;
}
return ((PIIXProtocol) piixProtocol);
}
#define PIIX_ACTIVATE_PROTOCOL(p) { \
timings[unit].activeTimings[p] = timings[unit].validTimings[p]; \
timings[unit].activeFlag |= (1 << (p)); \
}
#define PIIX_DEACTIVATE_PROTOCOL(p) { \
timings[unit].activeFlag &= ~(1 << (p)); \
}
#define PIIX_GET_ACTIVE_TIMING(p) (timings[unit].activeTimings[p])
#define PIIX_PROTOCOL_IS_ACTIVE(p) ((bool) \
(timings[unit].activeFlag & (1 << (p))))
#define PIIX_PROTOCOL_IS_VALID(p) ((bool) \
(timings[unit].validFlag & (1 << (p))))
#endif