Annotation of drvEIDE/EIDE.drvproj/EIDE.lksproj/PIIX.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
        !             7:  * Reserved.  This file contains Original Code and/or Modifications of
        !             8:  * Original Code as defined in and that are subject to the Apple Public
        !             9:  * Source License Version 1.0 (the 'License').  You may not use this file
        !            10:  * except in compliance with the License.  Please obtain a copy of the
        !            11:  * License at http://www.apple.com/publicsource and read it before using
        !            12:  * this file.
        !            13:  * 
        !            14:  * The Original Code and all software distributed under the License are
        !            15:  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            19:  * License for the specific language governing rights and limitations
        !            20:  * under the License."
        !            21:  * 
        !            22:  * @APPLE_LICENSE_HEADER_END@
        !            23:  */
        !            24: /*
        !            25:  * Copyright 1998 by Apple Computer, Inc., All rights reserved.
        !            26:  *
        !            27:  * Intel PIIX/PIIX3/PIIX4 PCI IDE controller.
        !            28:  * PIIX = PCI-ISA-IDE-Xelerator. (USB also on newer controllers)
        !            29:  *
        !            30:  * Notes:
        !            31:  * 
        !            32:  * PIIX  introduced in the "Triton" chipset.
        !            33:  * PIIX3 supports different timings for Master/Slave devices on both channels.
        !            34:  * PIIX4 adds support for Ultra DMA/33.
        !            35:  *
        !            36:  * Be sure to download and read the PIIX errata from Intel's web site at
        !            37:  * developer.intel.com. Even then, don't trust everything you read.
        !            38:  *
        !            39:  * HISTORY:
        !            40:  * 1-Feb-1998  Joe Liu at Apple
        !            41:  *     Created.
        !            42:  */
        !            43: 
        !            44: /*
        !            45:  * PCI ID's.
        !            46:  */
        !            47: #define PCI_ID_PIIX            0x12308086
        !            48: #define PCI_ID_PIIX3   0x70108086
        !            49: #define PCI_ID_PIIX4   0x71118086
        !            50: #define PCI_ID_NONE            0xffffffff
        !            51: 
        !            52: /*
        !            53:  * Decoded port addresses. Seems to be hardcoded and it does not
        !            54:  * show up in the PCI configuration space memory ranges.
        !            55:  */
        !            56: #define PIIX_P_CMD_ADDR                0x1f0
        !            57: #define PIIX_P_CTL_ADDR                0x3f4
        !            58: #define PIIX_S_CMD_ADDR                0x170
        !            59: #define PIIX_S_CTL_ADDR                0x374
        !            60: #define PIIX_CMD_SIZE          8
        !            61: #define PIIX_CTL_SIZE          4
        !            62: 
        !            63: /*
        !            64:  * IRQ assignment.
        !            65:  */
        !            66: #define PIIX_P_IRQ                     14
        !            67: #define PIIX_S_IRQ                     15
        !            68: 
        !            69: /*
        !            70:  * PIIX PCI configuration space registers.
        !            71:  * Register size (bits) in parenthesis.
        !            72:  */
        !            73: #define PIIX_PCICMD            0x04    // (16) PCI command register
        !            74: #define PIIX_PCISTS            0x06    // (16) PCI device status register
        !            75: #define PIIX_RID               0x08    // (8)  Revision identification register
        !            76: #define PIIX_CLASSC            0x09    // (24) Class code register
        !            77: #define PIIX_MLT               0x0d    // (8)  Master latency timer register
        !            78: #define PIIX_HEDT              0x0e    // (8)  Header type register
        !            79: #define PIIX_BMIBA             0x20    // (32) Bus-Master interface base address
        !            80: #define PIIX_IDETIM            0x40    // (16) IDE timing registers (primary)
        !            81: #define PIIX_IDETIM_S  0x42    // (16) IDE timing registers (secondary)
        !            82: #define PIIX_SIDETIM   0x44    // (8)  Slave IDE timing register
        !            83: #define PIIX_UDMACTL   0x48    // (8)  Ultra DMA/33 control register
        !            84: #define PIIX_UDMATIM   0x4a    // (16) Ultra DMA/33 timing register
        !            85: 
        !            86: /*
        !            87:  * PIIX PCI configuration space register definition.
        !            88:  *
        !            89:  * PIIX_IDETIM - IDE timing register.
        !            90:  *
        !            91:  * Address:
        !            92:  * 0x40:0x41 - Primary channel
        !            93:  * 0x42:0x43 - Secondary channel
        !            94:  */
        !            95: typedef union {
        !            96:        struct {
        !            97:                u_short
        !            98:                        time0   :1,             // fast timing bank drive select 0
        !            99:                        ie0             :1,             // IORDY sample point enable driver select 0
        !           100:                        ppe0    :1,             // prefetch and posting enable
        !           101:                        dte0    :1,             // DMA timing enable only
        !           102:                        time1   :1,             // fast timing bank driver select 1
        !           103:                        ie1             :1,             // IORDY sample point enable driver select 1
        !           104:                        ppe1    :1,             // prefetch and posting enable
        !           105:                        dte1    :1,             // DMA timing enable only
        !           106:                        rct             :2,             // recovery time
        !           107:                        rsvd    :2,             // RESERVED
        !           108:                        isp             :2,             // IORDY sample point
        !           109:                        sitre   :1,             // slave IDE timing register enable
        !           110:                        ide             :1;             // IDE decode enable
        !           111:        } bits;
        !           112:        u_short word;
        !           113: } piix_idetim_u;
        !           114: 
        !           115: /*
        !           116:  * Convert the "isp" and "rct" fields in PIIX_IDETIM register from
        !           117:  * PCI clocks to their respective values, and vice-versa.
        !           118:  */
        !           119: #define PIIX_CLK_TO_ISP(x)             (5 - (x))
        !           120: #define PIIX_ISP_TO_CLK(x)             PIIX_CLK_TO_ISP(x)
        !           121: #define PIIX_CLK_TO_RCT(x)             (4 - (x))
        !           122: #define PIIX_RCT_TO_CLK(x)             PIIX_CLK_TO_RCT(x)
        !           123: 
        !           124: /*
        !           125:  * PIIX PCI configuration space register definition.
        !           126:  *
        !           127:  * PIIX_SIDETIM - Slave IDE timing register.
        !           128:  *
        !           129:  * Address: 0x44
        !           130:  */
        !           131: typedef union {
        !           132:        struct {
        !           133:                u_char
        !           134:                        prct1   :2,             // primary drive 1 recovery time
        !           135:                        pisp1   :2,             // primary drive 1 IORDY sample point
        !           136:                        srct1   :2,             // secondary drive 1 recovery time
        !           137:                        sisp1   :2;             // secondary drive 1 IORDY sample point
        !           138:        } bits;
        !           139:        u_char byte;
        !           140: } piix_sidetim_u;
        !           141: 
        !           142: /*
        !           143:  * PIIX PCI configuration space register definition.
        !           144:  *
        !           145:  * PIIX_UDMACTL - Ultra DMA/33 control register
        !           146:  *
        !           147:  * Address: 0x48
        !           148:  */
        !           149: typedef union {
        !           150:        struct {
        !           151:                u_char
        !           152:                        psde0   :1,             // enable Ultra DMA/33 for primary drive 0
        !           153:                        psde1   :1,             // enable Ultra DMA/33 for primary drive 1
        !           154:                        ssde0   :1,             // enable Ultra DMA/33 for secondary drive 0
        !           155:                        ssde1   :1,             // enable Ultra DMA/33 for secondary drive 1
        !           156:                        rsvd    :4;             // RESERVED
        !           157:        } bits;
        !           158:        u_char byte;
        !           159: } piix_udmactl_u;
        !           160: 
        !           161: /*
        !           162:  * PIIX PCI configuration space register definition.
        !           163:  *
        !           164:  * PIIX_UDMATIM - Ultra DMA/33 timing register
        !           165:  *
        !           166:  * Address: 0x4a-0x4b
        !           167:  */
        !           168: typedef union {
        !           169:        struct {
        !           170:                u_short
        !           171:                        pct0    :2,             // primary drive 0 cycle time
        !           172:                        rsvd1   :2,             // RESERVED
        !           173:                        pct1    :2,             // primary drive 1 cycle time
        !           174:                        rsvd2   :2,             // RESERVED
        !           175:                        sct0    :2,             // secondary drive 0 cycle time
        !           176:                        rsvd3   :2,             // RESERVED
        !           177:                        sct1    :2,             // secondary drive 1 cycle time
        !           178:                        rsvd4   :2;             // RESERVED
        !           179:        } bits;
        !           180:        u_short word;
        !           181: } piix_udmatim_u;
        !           182: 
        !           183: /*
        !           184:  * PIIX IO space register offsets. Base address is set in PIIX_BMIBA.
        !           185:  * Register size (bits) in parenthesis.
        !           186:  *
        !           187:  * Note:
        !           188:  * For the primary channel, the base address is stored in PIIX_BMIBA.
        !           189:  * For the secondary channel, the base address is equal to
        !           190:  * (PIIX_BMIBA + PIIX_BM_OFFSET).
        !           191:  */
        !           192: #define PIIX_BMICX             0x00    // (8) Bus master IDE command register
        !           193: #define PIIX_BMISX             0x02    // (8) Bus master IDE status register
        !           194: #define PIIX_BMIDTPX   0x04    // (32) Descriptor table pointer register
        !           195: #define PIIX_BM_OFFSET 0x08    // offset to secondary channel registers
        !           196: #define PIIX_BM_SIZE   0x08    // size of the BM registers for each channel
        !           197: #define PIIX_BM_MASK   0xfff0  // mask BMIBA to get register base address
        !           198: 
        !           199: /*
        !           200:  * PIIX IO space register definition.
        !           201:  *
        !           202:  * BMICX - Bus master IDE command register
        !           203:  */
        !           204: typedef union {
        !           205:        struct {
        !           206:                u_char
        !           207:                        ssbm    :1,             // start/stop bus master
        !           208:                        rsvd1   :2,             // RESERVED
        !           209:                        rwcon   :1,             // Bus master read/write control
        !           210:                        rsvd2   :4;             // RESERVED
        !           211:        } bits;
        !           212:        u_char byte;
        !           213: } piix_bmicx_u;
        !           214: 
        !           215: /*
        !           216:  * PIIX IO space register definition.
        !           217:  *
        !           218:  * PIIX_BMISX - Bus master IDE status register
        !           219:  */
        !           220: typedef union {
        !           221:        struct {
        !           222:                u_char
        !           223:                        bmidea  :1,             // Bus master IDE active
        !           224:                        err             :1,             // IDE DMA error
        !           225:                        ideints :1,             // IDE interrupt status
        !           226:                        rsvd1   :2,             // RESERVED
        !           227:                        dma0cap :1,             // drive 0 DMA capable
        !           228:                        dma1cap :1,             // drive 1 DMA capable
        !           229:                        rsvd2   :1;             // RESERVED (hardwired to 0)
        !           230:        } bits;
        !           231:        u_char byte;
        !           232: } piix_bmisx_u;
        !           233: 
        !           234: #define PIIX_STATUS_MASK       0x07
        !           235: #define PIIX_STATUS_OK         0x04
        !           236: #define PIIX_STATUS_ERROR      0x02
        !           237: #define PIIX_STATUS_ACTIVE     0x01
        !           238: 
        !           239: /*
        !           240:  * PIIX Bus Master alignment/boundary requirements.
        !           241:  *
        !           242:  * Intel nomemclature:
        !           243:  * WORD  - 16-bit
        !           244:  * DWord - 32-bit
        !           245:  *
        !           246:  * NOTE:
        !           247:  * Boundary limit implies that the entire region is physically
        !           248:  * contiguous.
        !           249:  *
        !           250:  * There is an error in the manual regarding DT alignment and boundary
        !           251:  * restrictions. The "Intel 82371AB (PIIX4) Specification Update" has a
        !           252:  * clarification to this issue.
        !           253:  */
        !           254: #define PIIX_DT_ALIGN  4                       // descriptor table must be DWord aligned.
        !           255: #define PIIX_DT_BOUND  (4 * 1024)      // cannot cross 4K boundary. (or 64K ?)
        !           256: 
        !           257: #define PIIX_BUF_ALIGN 4                       // memory buffer must be DWord aligned.
        !           258: #define PIIX_BUF_BOUND (64 * 1024)     // cannot cross 64K boundary.
        !           259: #define PIIX_BUF_LIMIT (64 * 1024) // limited to 64K in size
        !           260: 
        !           261: /*
        !           262:  * PIIX Bus Master Physical Region Descriptor (PRD) format.
        !           263:  *
        !           264:  */
        !           265: typedef struct {
        !           266:        u_int   base;                           // base address
        !           267:        u_int   count   :16,            // byte count
        !           268:                        rsvd    :15,
        !           269:                        eot             :1;                     // final PRD indication bit
        !           270: } piix_prd_t;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.