[BACK]Return to midwayreg.h CVS log [TXT][DIR] Up to [local] / sys / dev / ic

Annotation of sys/dev/ic/midwayreg.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: midwayreg.h,v 1.9 2003/10/21 18:58:49 jmc Exp $       */
        !             2:
        !             3: /*
        !             4:  * m i d w a y r e g . h
        !             5:  *
        !             6:  * this file contains the description of the ENI ATM midway chip
        !             7:  * data structures.   see midway.c for more details.
        !             8:  *
        !             9:  */
        !            10:
        !            11: #if defined(__sparc__) || defined(__FreeBSD__)
        !            12: /* XXX: gross.   netbsd/sparc doesn't have machine/bus.h yet. */
        !            13: typedef void * bus_space_tag_t;
        !            14: typedef u_int32_t pci_chipset_tag_t;
        !            15: typedef caddr_t bus_space_handle_t;
        !            16: typedef u_int32_t bus_size_t;
        !            17: typedef caddr_t bus_addr_t;
        !            18:
        !            19: #define bus_space_read_4(t, h, o) ((void) t,                            \
        !            20:     (*(volatile u_int32_t *)((h) + (o))))
        !            21: #define bus_space_write_4(t, h, o, v)                                   \
        !            22:     ((void) t, ((void)(*(volatile u_int32_t *)((h) + (o)) = (v))))
        !            23:
        !            24: #if defined(__sparc__)
        !            25: #define vtophys(x) ((u_int32_t)(x))    /* sun4c dvma */
        !            26: #endif
        !            27:
        !            28: #endif
        !            29:
        !            30:
        !            31: #define MID_SZTOB(X)   ((X) * 256 * 4) /* size to bytes */
        !            32: #define MID_BTOSZ(X)   ((X) / 256 / 4) /* bytes to "size" */
        !            33:
        !            34: #define MID_N_VC       1024            /* # of VCs we can use */
        !            35: #define MID_NTX_CH     8               /* 8 transmit channels (shared) */
        !            36: #define MID_ATMDATASZ  48              /* need data in 48 byte blocks */
        !            37:
        !            38: /*
        !            39:  * card data structures, top down
        !            40:  *
        !            41:  * in order to have a portable driver, the netbsd guys will not let us
        !            42:  * use structs.   we have a bus_space_handle_t which is the en_base address.
        !            43:  * everything else is an offset from that base.   all card data must be
        !            44:  * accessed with bus_space_read_4()/bus_space_write_4():
        !            45:  *
        !            46:  * rv = bus_space_read_4(sc->en_memt, sc->en_base, BYTE_OFFSET);
        !            47:  * bus_space_write_4(sc->en_memt, sc->en_base, BYTE_OFFSET, VALUE);
        !            48:  *
        !            49:  * en_card: the whole card (prom + phy + midway + obmem)
        !            50:  *     obmem contains: vci tab + dma queues (rx & tx) + service list + bufs
        !            51:  */
        !            52:
        !            53: /* byte offsets from en_base of various items */
        !            54: #define MID_PHYOFF     0x030000        /* PHY offset */
        !            55: #define MID_MIDOFF     0x040000        /* midway regs offset */
        !            56: #define MID_RAMOFF     0x200000        /* RAM offset */
        !            57: #define MID_DRQOFF     0x204000        /* DRQ offset */
        !            58: #define MID_DRQEND     MID_DTQOFF      /* DRQ end */
        !            59: #define MID_DTQOFF     0x205000        /* DTQ offset */
        !            60: #define MID_DTQEND     MID_SLOFF       /* DTQ end */
        !            61: #define MID_SLOFF      0x206000        /* service list */
        !            62: #define MID_SLEND      MID_BUFOFF      /* service list end */
        !            63: #define MID_BUFOFF     0x207000        /* buffer area */
        !            64: #define MID_PROBEOFF   0x21fffc        /* start probe here */
        !            65: #define MID_PROBSIZE   0x020000        /* 128 KB */
        !            66: #define MID_MAXOFF     0x3ffffc        /* max offset */
        !            67:
        !            68: /*
        !            69:  * prom & phy: not defined here
        !            70:  */
        !            71:
        !            72: /*
        !            73:  * midway regs  (byte offsets from en_base)
        !            74:  */
        !            75:
        !            76: #define MID_RESID      0x40000         /* write=reset reg, read=ID reg */
        !            77:
        !            78: #define MID_VER(X)     (((X) & 0xf0000000) >> 28) /* midway version # */
        !            79: #define MID_MID(X)     (((X) & 0x700) >> 8)    /* motherboard ID */
        !            80: #define MID_IS_SABRE(X) ((X) & 0x80)           /* sabre controller? */
        !            81: #define MID_IS_SUNI(X) ((X) & 0x40)            /* SUNI? vs utopia */
        !            82: #define MID_IS_UPIPE(X)        ((X) & 0x20)            /* utopia pipeline? */
        !            83: #define MID_DID(X)     ((X) & 0x1f)            /* daughterboard ID */
        !            84:
        !            85: #define MID_INTACK     0x40004         /* interrupt ACK */
        !            86: #define MID_INTSTAT    0x40008         /* interrupt status */
        !            87: #define MID_INTENA     0x4000c         /* interrupt enable */
        !            88:
        !            89: #define MID_TXCHAN(N) (1 << ((N) + 9)) /* ack/status/enable xmit channel bit*/
        !            90: #define MID_INT_TX     0x1fe00         /* mask for any xmit interrupt */
        !            91: #define MID_INT_DMA_OVR 0x00100                /* DMA overflow interrupt */
        !            92: #define MID_INT_IDENT   0x00080                /* ident match error interrupt */
        !            93: #define MID_INT_LERR    0x00040                /* LERR interrupt (sbus?) */
        !            94: #define MID_INT_DMA_ERR 0x00020                /* DMA error interrupt */
        !            95: #define MID_INT_DMA_RX  0x00010                /* DMA recv interrupt */
        !            96: #define MID_INT_DMA_TX 0x00008         /* DMA xmit interrupt */
        !            97: #define MID_INT_SERVICE 0x00004                /* service list interrupt */
        !            98: #define MID_INT_SUNI   0x00002         /* SUNI interrupt */
        !            99: #define MID_INT_STATS  0x00001         /* stats overflow interrupt */
        !           100:
        !           101: #define MID_INT_ANY    0x1ffff         /* any interrupt? */
        !           102:
        !           103: #define MID_INTBITS "\20\21T7\20T6\17T5\16T4\15T3\14T2\13T1\12T0\11DMAOVR\10ID\7LERR\6DMAERR\5RXDMA\4TXDMA\3SERV\2SUNI\1STAT"
        !           104:
        !           105: #define MID_MAST_CSR   0x40010         /* master CSR */
        !           106:
        !           107: #define MID_IPL(X)     (((X) & 0x1c0) >> 6) /* IPL */
        !           108: #define MID_SETIPL(I)  ((I) << 6)
        !           109: #define MID_MCSR_TXLOCK        0x20            /* lock on xmit overflow mode */
        !           110: /* NOTE: next 5 bits: write 1 means enable, write 0 means no change */
        !           111: #define MID_MCSR_ENDMA 0x10            /* DMA enable */
        !           112: #define MID_MCSR_ENTX  0x08            /* TX enable */
        !           113: #define MID_MCSR_ENRX  0x04            /* RX enable */
        !           114: #define MID_MCSR_W1MS  0x02            /* wait 1 msec */
        !           115: #define MID_MCSR_W500US        0x01            /* wait 500 usec */
        !           116:
        !           117: #define MID_MCSRBITS "\20\6LCK\5DMAON\4TXON\3RXON\2W1MS\1W500US"
        !           118:
        !           119: #define MID_STAT       0x40014         /* stat register, clear on read */
        !           120:
        !           121: #define MID_VTRASH(X) (((X) >> 16) & 0xffff)
        !           122:                                        /* # cells trashed due to VCI's mode */
        !           123: #define MID_OTRASH(X) ((X) & 0xffff)   /* # cells trashed due to overflow */
        !           124:
        !           125: #define MID_SERV_WRITE 0x40018         /* 10 bit service write pointer (r/o) */
        !           126: #define MID_DMA_ADDR   0x4001c         /* VA of DMA (r/o) */
        !           127:
        !           128:   /* DMA queue pointers (bits 0 to 8) */
        !           129: #define MID_DMA_WRRX   0x40020         /* write ptr. for DMA recv queue */
        !           130:                                        /* (for adaptor -> host xfers) */
        !           131: #define MID_DMA_RDRX   0x40024         /* read ptr for DMA recv queue (r/o) */
        !           132:                                        /* (i.e. current adaptor->host xfer) */
        !           133: #define MID_DMA_WRTX   0x40028         /* write ptr for DMA xmit queue */
        !           134:                                        /* (for host -> adaptor xfers) */
        !           135: #define MID_DMA_RDTX   0x4002c         /* read ptr for DMA xmit queue (r/o) */
        !           136:                                        /* (i.e. current host->adaptor xfer) */
        !           137:
        !           138:        /* xmit channel regs (1 per channel, MID_NTX_CH max channels) */
        !           139:
        !           140: #define MIDX_PLACE(N)  (0x40040+((N)*0x10))    /* xmit place */
        !           141:
        !           142: #define MIDX_MKPLACE(SZ,LOC) ( ((SZ) << 11) | (LOC) )
        !           143: #define MIDX_LOC(X)    ((X) & 0x7ff)   /* location in obmem */
        !           144: #define MIDX_SZ(X)     ((X) >> 11)     /* (size of block / 256) in int32_t's*/
        !           145: #define MIDX_BASE(X)   \
        !           146:        (((MIDX_LOC(X) << MIDV_LOCTOPSHFT) * sizeof(u_int32_t)) + MID_RAMOFF)
        !           147:
        !           148:   /* the following two regs are word offsets in the block */
        !           149: #define MIDX_READPTR(N)        (0x40044+((N)*0x10))    /* xmit read pointer (r/o) */
        !           150: #define MIDX_DESCSTART(N) (0x40048+((N)*0x10)) /* seg currently in DMA (r/o) */
        !           151:
        !           152:
        !           153: /*
        !           154:  * obmem items
        !           155:  */
        !           156:
        !           157: /*
        !           158:  * vci table in obmem (offset from MID_VCTOFF)
        !           159:  */
        !           160:
        !           161: #define MID_VC(N)      (MID_RAMOFF+((N)*0x10))
        !           162:
        !           163: #define MIDV_TRASH     0x00000000      /* ignore VC */
        !           164: #define MIDV_AAL5      0x80000000      /* do AAL5 on it */
        !           165: #define MIDV_NOAAL     0x40000000      /* do per-cell stuff on it */
        !           166: #define MIDV_MASK      0xc0000000      /* mode mask */
        !           167: #define MIDV_SETMODE(VC,M) (((VC) & ~(MIDV_MASK)) | (M))  /* new mode */
        !           168: #define MIDV_PTI       0x20000000      /* save PTI cells? */
        !           169: #define MIDV_LOCTOPSHFT        8               /* shift to get top 11 bits of 19 */
        !           170: #define MIDV_LOCSHIFT  18
        !           171: #define MIDV_LOCMASK   0x7ff
        !           172: #define MIDV_LOC(X)    (((X) >> MIDV_LOCSHIFT) & MIDV_LOCMASK)
        !           173:                                        /* 11 most sig bits of addr */
        !           174: #define MIDV_SZSHIFT   15
        !           175: #define MIDV_SZ(X)     (((X) >> MIDV_SZSHIFT) & 7)
        !           176:                                        /* size encoded the usual way */
        !           177: #define MIDV_INSERVICE 0x1             /* in service list */
        !           178:
        !           179: #define MID_DST_RP(N)  (MID_VC(N)|0x4)
        !           180:
        !           181: #define MIDV_DSTART_SHIFT      16              /* shift */
        !           182: #define MIDV_DSTART(X) (((X) >> MIDV_DSTART_SHIFT) & 0x7fff)
        !           183: #define MIDV_READP_MASK                0x7fff          /* valid bits, (shift = 0) */
        !           184:
        !           185: #define MID_WP_ST_CNT(N) (MID_VC(N)|0x8)      /* write pointer/state/count */
        !           186:
        !           187: #define MIDV_WRITEP_MASK       0x7fff0000      /* mask for write ptr. */
        !           188: #define MIDV_WRITEP_SHIFT      16
        !           189: #define MIDV_ST_IDLE           0x0000
        !           190: #define MIDV_ST_TRASH          0xc000
        !           191: #define MIDV_ST_REASS          0x4000
        !           192: #define MIDV_CCOUNT            0x7ff           /* cell count */
        !           193:
        !           194: #define MID_CRC(N)     (MID_VC(N)|0xc)         /* CRC */
        !           195:
        !           196: /*
        !           197:  * dma recv q.
        !           198:  */
        !           199:
        !           200: #define MID_DMA_END    (1 << 5)        /* for both tx and rx */
        !           201: #define MID_DMA_CNT(X) (((X) >> 16) & 0xffff)
        !           202: #define MID_DMA_TXCHAN(X) (((X) >> 6) & 0x7)
        !           203: #define MID_DMA_RXVCI(X)  (((X) >> 6) & 0x3ff)
        !           204: #define MID_DMA_TYPE(X)        ((X) & 0xf)
        !           205:
        !           206: #define MID_DRQ_N      512                     /* # of descriptors */
        !           207: #define MID_DRQ_A2REG(N)       (((N) - MID_DRQOFF) >> 3)
        !           208:                                /* convert byte offset to reg value */
        !           209: #define MID_DRQ_REG2A(N)       (((N) << 3) + MID_DRQOFF) /* and back */
        !           210:
        !           211: /* note: format of word 1 of RXQ is different between ENI and ADP cards */
        !           212: #define MID_MK_RXQ_ENI(CNT,VC,END,TYPE) \
        !           213:        ( ((CNT) << 16)|((VC) << 6)|(END)|(TYPE) )
        !           214:
        !           215: #define MID_MK_RXQ_ADP(CNT,VC,END,JK) \
        !           216:        ( ((CNT) << 12)|((VC) << 2)|((END) >> 4)|(((JK) != 0) ? 1 : 0))
        !           217: /*
        !           218:  * dma xmit q.
        !           219:  */
        !           220:
        !           221: #define MID_DTQ_N      512                     /* # of descriptors */
        !           222: #define MID_DTQ_A2REG(N)       (((N) - MID_DTQOFF) >> 3)
        !           223:                                /* convert byte offset to reg value */
        !           224: #define MID_DTQ_REG2A(N)       (((N) << 3) + MID_DTQOFF) /* and back */
        !           225:
        !           226:
        !           227: /* note: format of word 1 of TXQ is different between ENI and ADP cards */
        !           228: #define MID_MK_TXQ_ENI(CNT,CHN,END,TYPE) \
        !           229:        ( ((CNT) << 16)|((CHN) << 6)|(END)|(TYPE) )
        !           230:
        !           231: #define MID_MK_TXQ_ADP(CNT,CHN,END,JK) \
        !           232:        ( ((CNT) << 12)|((CHN) << 2)|((END) >> 4)|(((JK) != 0) ? 1 : 0) )
        !           233:
        !           234: /*
        !           235:  * dma types
        !           236:  */
        !           237:
        !           238: #define MIDDMA_JK      0x3     /* just kidding */
        !           239: #define MIDDMA_BYTE    0x1     /* byte */
        !           240: #define MIDDMA_2BYTE   0x2     /* 2 bytes */
        !           241: #define MIDDMA_WORD    0x0     /* word */
        !           242: #define MIDDMA_2WORD   0x7     /* 2 words */
        !           243: #define MIDDMA_4WORD   0x4     /* 4 words */
        !           244: #define MIDDMA_8WORD   0x5     /* 8 words */
        !           245: #define MIDDMA_16WORD  0x6     /* 16 words!!! */
        !           246: #define MIDDMA_2WMAYBE 0xf     /* 2 words, maybe */
        !           247: #define MIDDMA_4WMAYBE 0xc     /* 4 words, maybe */
        !           248: #define MIDDMA_8WMAYBE 0xd     /* 8 words, maybe */
        !           249: #define MIDDMA_16WMAYBE        0xe     /* 16 words, maybe */
        !           250:
        !           251: #define MIDDMA_MAYBE   0xc     /* mask to detect WMAYBE dma code */
        !           252: #define MIDDMA_MAXBURST        (16 * sizeof(u_int32_t))        /* largest burst */
        !           253:
        !           254: /*
        !           255:  * service list
        !           256:  */
        !           257:
        !           258: #define MID_SL_N       1024    /* max # entries on slist */
        !           259: #define MID_SL_A2REG(N)        (((N) - MID_SLOFF) >> 2)
        !           260:                                /* convert byte offset to reg value */
        !           261: #define MID_SL_REG2A(N)        (((N) << 2) + MID_SLOFF) /* and back */
        !           262:
        !           263: /*
        !           264:  * data in the buffer area of obmem
        !           265:  */
        !           266:
        !           267: /*
        !           268:  * recv buffer desc. (1 u_int32_t at start of buffer)
        !           269:  */
        !           270:
        !           271: #define MID_RBD_SIZE   4                       /* RBD size */
        !           272: #define MID_CHDR_SIZE  4                       /* on aal0, cell header size */
        !           273: #define MID_RBD_ID(X)  ((X) & 0xfe000000)      /* get ID */
        !           274: #define MID_RBD_STDID  0x36000000              /* standard ID */
        !           275: #define MID_RBD_CLP    0x01000000              /* CLP: cell loss priority */
        !           276: #define MID_RBD_CE     0x00010000              /* CE: congestion experienced */
        !           277: #define MID_RBD_T      0x00001000              /* T: trashed due to overflow */
        !           278: #define MID_RBD_CRCERR 0x00000800              /* CRC error */
        !           279: #define MID_RBD_CNT(X) ((X) & 0x7ff)           /* cell count */
        !           280:
        !           281: /*
        !           282:  * xmit buffer desc. (2 u_int32_t's at start of buffer)
        !           283:  * (note we treat the PR & RATE as a single u_int8_t)
        !           284:  */
        !           285:
        !           286: #define MID_TBD_SIZE   8
        !           287: #define MID_TBD_MK1(AAL,PR_RATE,CNT) \
        !           288:        (MID_TBD_STDID|(AAL)|((PR_RATE) << 19)|(CNT))
        !           289: #define MID_TBD_STDID  0xb0000000      /* standard ID */
        !           290: #define MID_TBD_AAL5   0x08000000      /* AAL 5 */
        !           291: #define MID_TBD_NOAAL5 0x00000000      /* not AAL 5 */
        !           292:
        !           293: #define MID_TBD_MK2(VCI,PTI,CLP) \
        !           294:        (((VCI) << 4)|((PTI) << 1)|(CLP))
        !           295:
        !           296: /*
        !           297:  * aal5 pdu tail, last 2 words of last cell of AAL5 frame
        !           298:  * (word 2 is CRC .. handled by hw)
        !           299:  */
        !           300:
        !           301: #define MID_PDU_SIZE   8
        !           302: #define MID_PDU_MK1(UU,CPI,LEN) \
        !           303:        (((UU) << 24)|((CPI) << 16)|(LEN))
        !           304: #define MID_PDU_LEN(X) ((X) & 0xffff)

CVSweb