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

Annotation of sys/dev/ic/siopvar_common.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: siopvar_common.h,v 1.25 2007/08/05 19:05:09 kettenis Exp $ */
                      2: /*     $NetBSD: siopvar_common.h,v 1.33 2005/11/18 23:10:32 bouyer Exp $ */
                      3:
                      4: /*
                      5:  * Copyright (c) 2000 Manuel Bouyer.
                      6:  *
                      7:  * Redistribution and use in source and binary forms, with or without
                      8:  * modification, are permitted provided that the following conditions
                      9:  * are met:
                     10:  * 1. Redistributions of source code must retain the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer.
                     12:  * 2. Redistributions in binary form must reproduce the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer in the
                     14:  *    documentation and/or other materials provided with the distribution.
                     15:  * 3. All advertising materials mentioning features or use of this software
                     16:  *    must display the following acknowledgement:
                     17:  *     This product includes software developed by Manuel Bouyer.
                     18:  * 4. The name of the author may not be used to endorse or promote products
                     19:  *    derived from this software without specific prior written permission.
                     20:  *
                     21:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     22:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     23:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     24:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     25:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     26:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     27:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     28:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     29:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     30:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     31:  *
                     32:  */
                     33:
                     34: /* common struct and routines used by siop and esiop */
                     35:
                     36: #ifndef SIOP_DEFAULT_TARGET
                     37: #define SIOP_DEFAULT_TARGET 7
                     38: #endif
                     39:
                     40: /* tables used by SCRIPT */
                     41: typedef struct scr_table {
                     42:        u_int32_t count;
                     43:        u_int32_t addr;
                     44: } scr_table_t __packed;
                     45:
                     46: /* Number of scatter/gather entries */
                     47: /* XXX Ensure alignment of siop_xfer's. */
                     48: #define SIOP_NSG       17      /* XXX (MAXPHYS/PAGE_SIZE + 1) */
                     49: #define SIOP_MAXFER    ((SIOP_NSG - 1) * PAGE_SIZE)
                     50:
                     51: /*
                     52:  * This structure interfaces the SCRIPT with the driver; it describes a full
                     53:  * transfer. If you change something here, don't forget to update offsets in
                     54:  * {s,es}iop.ss
                     55:  */
                     56: struct siop_common_xfer {
                     57:        u_int8_t msg_out[16];           /*   0 */
                     58:        u_int8_t msg_in[16];            /*  16 */
                     59:        u_int32_t status;               /*  32 */
                     60:        u_int32_t pad1;                 /*  36 */
                     61:        u_int32_t id;                   /*  40 */
                     62:        struct scsi_generic xscmd;      /*  44 */
                     63:        scr_table_t t_msgin;            /*  60 */
                     64:        scr_table_t t_extmsgin;         /*  68 */
                     65:        scr_table_t t_extmsgdata;       /*  76 */
                     66:        scr_table_t t_msgout;           /*  84 */
                     67:        scr_table_t cmd;                /*  92 */
                     68:        scr_table_t t_status;           /* 100 */
                     69:        scr_table_t data[SIOP_NSG];     /* 108 */
                     70: } __packed;
                     71:
                     72: /* status can hold the SCSI_* status values, and 2 additional values: */
                     73: #define SCSI_SIOP_NOCHECK      0xfe    /* don't check the scsi status */
                     74: #define SCSI_SIOP_NOSTATUS     0xff    /* device didn't report status */
                     75:
                     76: /* offset is initialised to SIOP_NOOFFSET, used to check if it was updated */
                     77: #define SIOP_NOOFFSET 0xffffffff
                     78:
                     79: /*
                     80:  * This describes a command handled by the SCSI controller
                     81:  */
                     82: struct siop_common_cmd {
                     83:        struct siop_common_softc *siop_sc; /* points back to our adapter */
                     84:        struct siop_common_target *siop_target; /* pointer to our target def */
                     85:        struct scsi_xfer *xs; /* xfer from the upper level */
                     86:        struct siop_common_xfer *siop_tables; /* tables for this cmd */
                     87:        bus_addr_t      dsa; /* DSA value to load */
                     88:        bus_dmamap_t    dmamap_data;
                     89:        int status;
                     90:        int flags;
                     91:        int tag;        /* tag used for tagged command queuing */
                     92:        int resid;      /* valid when CMDFL_RESID is set */
                     93: };
                     94:
                     95: /* status defs */
                     96: #define CMDST_FREE             0 /* cmd slot is free */
                     97: #define CMDST_READY            1 /* cmd slot is waiting for processing */
                     98: #define CMDST_ACTIVE           2 /* cmd slot is being processed */
                     99: #define CMDST_SENSE            3 /* cmd slot is requesting sense */
                    100: #define CMDST_SENSE_ACTIVE     4 /* request sense active */
                    101: #define CMDST_SENSE_DONE       5 /* request sense done */
                    102: #define CMDST_DONE             6 /* cmd slot has been processed */
                    103: /* flags defs */
                    104: #define CMDFL_TIMEOUT  0x0001 /* cmd timed out */
                    105: #define CMDFL_TAG      0x0002 /* tagged cmd */
                    106: #define CMDFL_RESID    0x0004 /* current offset in table is partial */
                    107:
                    108: /* per-target struct */
                    109: struct siop_common_target {
                    110:        int status;     /* target status, see below */
                    111:        int flags;      /* target flags, see below */
                    112:        u_int32_t id;   /* for SELECT FROM */
                    113:        int period;
                    114:        int offset;
                    115: };
                    116:
                    117: /* target status */
                    118: #define TARST_PROBING  0 /* target is being probed */
                    119: #define TARST_ASYNC    1 /* target needs sync/wide negotiation */
                    120: #define TARST_WIDE_NEG 2 /* target is doing wide negotiation */
                    121: #define TARST_SYNC_NEG 3 /* target is doing sync negotiation */
                    122: #define TARST_PPR_NEG  4 /* target is doing sync negotiation */
                    123: #define TARST_OK       5 /* sync/wide agreement is valid */
                    124:
                    125: /* target flags */
                    126: #define TARF_SYNC      0x01 /* target can do sync */
                    127: #define TARF_WIDE      0x02 /* target can do wide */
                    128: #define TARF_TAG       0x04 /* target can do tags */
                    129: #define TARF_DT                0x08 /* target can do DT clocking */
                    130: #define TARF_ISWIDE    0x10 /* target is wide */
                    131: #define TARF_ISDT      0x20 /* target is doing DT clocking */
                    132:
                    133: /* Driver internal state */
                    134: struct siop_common_softc {
                    135:        struct device sc_dev;
                    136:        struct scsi_link sc_link;       /* link to upper level */
                    137:        int features;                   /* chip's features */
                    138:        int ram_size;
                    139:        int maxburst;
                    140:        int maxoff;
                    141:        int clock_div;                  /* async. clock divider (scntl3) */
                    142:        int clock_period;               /* clock period (ns * 10) */
                    143:        int st_minsync;                 /* min and max sync period, */
                    144:        int dt_minsync;
                    145:        int st_maxsync;                 /* as sent in or PPR messages */
                    146:        int dt_maxsync;
                    147:        int mode;                       /* current SE/LVD/HVD mode */
                    148:        bus_space_tag_t sc_rt;          /* bus_space registers tag */
                    149:        bus_space_handle_t sc_rh;       /* bus_space registers handle */
                    150:        bus_addr_t sc_raddr;            /* register addresses */
                    151:        bus_space_tag_t sc_ramt;        /* bus_space ram tag */
                    152:        bus_space_handle_t sc_ramh;     /* bus_space ram handle */
                    153:        bus_dma_tag_t sc_dmat;          /* bus DMA tag */
                    154:        void (*sc_reset)(struct siop_common_softc*); /* reset callback */
                    155:        bus_dmamap_t  sc_scriptdma;     /* DMA map for script */
                    156:        bus_addr_t sc_scriptaddr;       /* on-board ram or physical address */
                    157:        u_int32_t *sc_script;           /* script location in memory */
                    158:        struct siop_common_target *targets[16]; /* per-target states */
                    159: };
                    160:
                    161: /* features */
                    162: #define SF_BUS_WIDE    0x00000001 /* wide bus */
                    163: #define SF_BUS_ULTRA   0x00000002 /* Ultra (20MHz) bus */
                    164: #define SF_BUS_ULTRA2  0x00000004 /* Ultra2 (40MHz) bus */
                    165: #define SF_BUS_ULTRA3  0x00000008 /* Ultra3 (80MHz) bus */
                    166: #define SF_BUS_DIFF    0x00000010 /* differential bus */
                    167:
                    168: #define SF_CHIP_LED0   0x00000100 /* led on GPIO0 */
                    169: #define SF_CHIP_LEDC   0x00000200 /* led on GPIO0 with hardware control */
                    170: #define SF_CHIP_DBLR   0x00000400 /* clock doubler or quadrupler */
                    171: #define SF_CHIP_QUAD   0x00000800 /* clock quadrupler, with PPL */
                    172: #define SF_CHIP_FIFO   0x00001000 /* large fifo */
                    173: #define SF_CHIP_PF     0x00002000 /* Instructions prefetch */
                    174: #define SF_CHIP_RAM    0x00004000 /* on-board RAM */
                    175: #define SF_CHIP_LS     0x00008000 /* load/store instruction */
                    176: #define SF_CHIP_10REGS 0x00010000 /* 10 scratch registers */
                    177: #define SF_CHIP_DFBC   0x00020000 /* Use DFBC register */
                    178: #define SF_CHIP_DT     0x00040000 /* DT clocking */
                    179: #define SF_CHIP_GEBUG  0x00080000 /* SCSI gross error bug */
                    180: #define SF_CHIP_AAIP   0x00100000 /* Always generate AIP regardless of SNCTL4*/
                    181: #define SF_CHIP_BE     0x00200000 /* big-endian */
                    182:
                    183: #define SF_PCI_RL      0x01000000 /* PCI read line */
                    184: #define SF_PCI_RM      0x02000000 /* PCI read multiple */
                    185: #define SF_PCI_BOF     0x04000000 /* PCI burst opcode fetch */
                    186: #define SF_PCI_CLS     0x08000000 /* PCI cache line size */
                    187: #define SF_PCI_WRI     0x10000000 /* PCI write and invalidate */
                    188:
                    189: int    siop_common_attach(struct siop_common_softc *);
                    190: void   siop_common_reset(struct siop_common_softc *);
                    191: void   siop_setuptables(struct siop_common_cmd *);
                    192: int    siop_modechange(struct siop_common_softc *);
                    193:
                    194: int    siop_wdtr_neg(struct siop_common_cmd *);
                    195: int    siop_sdtr_neg(struct siop_common_cmd *);
                    196: int     siop_ppr_neg(struct siop_common_cmd *);
                    197: void   siop_sdtr_msg(struct siop_common_cmd *, int, int, int);
                    198: void   siop_wdtr_msg(struct siop_common_cmd *, int, int);
                    199: void    siop_ppr_msg(struct siop_common_cmd *, int, int, int);
                    200: void   siop_update_xfer_mode(struct siop_common_softc *, int);
                    201: int    siop_iwr(struct siop_common_cmd *);
                    202: /* actions to take at return of siop_wdtr_neg() and siop_sdtr_neg() */
                    203: #define SIOP_NEG_NOP   0x0
                    204: #define SIOP_NEG_MSGOUT        0x1
                    205: #define SIOP_NEG_ACK   0x2
                    206:
                    207: void   siop_minphys(struct buf *);
                    208: void   siop_ma(struct siop_common_cmd *);
                    209: void   siop_sdp(struct siop_common_cmd *, int);
                    210: void   siop_update_resid(struct siop_common_cmd *, int);
                    211: void   siop_clearfifo(struct siop_common_softc *);
                    212: void   siop_resetbus(struct siop_common_softc *);
                    213:
                    214: #define siop_htoc32(sc, x) \
                    215:   (((sc)->features & SF_CHIP_BE) ? htobe32((x)) : htole32((x)))
                    216:
                    217: #define siop_ctoh32(sc, x) \
                    218:   (((sc)->features & SF_CHIP_BE) ? betoh32((x)) : letoh32((x)))

CVSweb