[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

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