Source to iokit/Drivers/ata/drvAppleATA/AppleATAPIIXTiming.h


Enter a symbol's name here to quickly find it.

/*
 * Copyright (c) 2000 Apple Computer, Inc.  All rights reserved. 
 *
 * AppleATAPIIXTiming.h - Timing tables.
 *
 * HISTORY
 *
 */

#ifndef _APPLEATAPIIXTIMING_H
#define _APPLEATAPIIXTIMING_H

/*
 * Supported transfer protocols. Entries in this table must map to the
 * entries in ATATimingProtocol table.
 */
typedef enum {
    kPIIXProtocolPIO  = 0,
    kPIIXProtocolDMA,
    kPIIXProtocolUDMA33,
    kPIIXProtocolUDMA66,
    kPIIXProtocolLast
} PIIXProtocol;

/*
 * PIIX PIO/DMA timing table.
 */
typedef struct {
    UInt8    pioMode;        // PIO mode
    UInt8    swDMAMode;      // single-word DMA mode (obsolete)
    UInt8    mwDMAMode;      // multiword DMA mode
    UInt8    isp;            // IORDY sample point in PCI clocks
    UInt8    rtc;            // Recovery time in PCI clocks
    UInt16   cycle;          // cycle time in ns
} PIIXTiming;

#define _NVM_    0xff        // not a valid mode

static const
PIIXTiming PIIXPIOTimingTable[] = {
/*  PIO     SW     MW     ISP   RTC   CYCLE (ns)   */
    {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]);

/*
 * PIIX Ultra-DMA/33 timing table.
 */
typedef struct {
    UInt8    mode;           // mode number
    UInt8    ct;             // cycle time in PCI clocks
    UInt8    rp;             // Ready to Pause time in PCI clocks
    UInt8    bits;           // register bit setting
    UInt16   strobe;         // strobe period (cycle) in ns
} PIIXUDMATiming;

static const
PIIXUDMATiming PIIXUDMATimingTable[] = {
/*  MODE    CT     RP     BITS   STROBE/CYCLE (ns)   */
    {0,     4,     6,     0,     120},
    {1,     3,     5,     1,     90},
    {2,     2,     4,     2,     60},
};

static const UInt8
PIIXUDMATimingTableSize = sizeof(PIIXUDMATimingTable) / 
                          sizeof(PIIXUDMATimingTable[0]);

/*
 * For each drive, the following table will store the chosen timings
 * for each supported protocol.
 */
typedef struct {
    UInt8   activeTimings[kPIIXProtocolLast];   // selected timings
    UInt8   validTimings[kPIIXProtocolLast];    // calculated timings
    UInt32  validFlag;
    UInt32  activeFlag;
} PIIXSelectedTimings;

/*
 * Convert from ATATimingProtocol to PIIXProtocol.
 */
inline PIIXProtocol ataToPIIXProtocol(ATATimingProtocol timingProtocol)
{
    int piixProtocol = kPIIXProtocolPIO;
    int ataProtocol  = timingProtocol;
    
    while (ataProtocol != 1) {
        ataProtocol >>= 1; piixProtocol++;
    }
    return ((PIIXProtocol) piixProtocol);
}

/*
 * Misc macros to get information from the PIIXSelectedTimings table.
 */
#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 /* !_APPLEATAPIIXTIMING_H */