OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [scsi/] [aic7xxx/] [aic79xx.reg] - Rev 1765

Compare with Previous | Blame | View Log

/*
 * Aic79xx register and scratch ram definitions.
 *
 * Copyright (c) 1994-2001 Justin T. Gibbs.
 * Copyright (c) 2000-2002 Adaptec Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer,
 *    without modification.
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
 *    substantially similar to the "NO WARRANTY" disclaimer below
 *    ("Disclaimer") and any redistribution must be conditioned upon
 *    including a substantially similar Disclaimer requirement for further
 *    binary redistribution.
 * 3. Neither the names of the above-listed copyright holders nor the names
 *    of any contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * Alternatively, this software may be distributed under the terms of the
 * GNU General Public License ("GPL") version 2 as published by the Free
 * Software Foundation.
 *
 * NO WARRANTY
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 *
 * $FreeBSD$
 */
VERSION = "$Id: aic79xx.reg,v 1.1.1.1 2004-04-15 02:16:10 phoenix Exp $"

/*
 * This file is processed by the aic7xxx_asm utility for use in assembling
 * firmware for the aic79xx family of SCSI host adapters as well as to generate
 * a C header file for use in the kernel portion of the Aic79xx driver.
 */

/* Register window Modes */
#define M_DFF0          0
#define M_DFF1          1
#define M_CCHAN         2
#define M_SCSI          3
#define M_CFG           4
#define M_DST_SHIFT     4

#define MK_MODE(src, dst) ((src) | ((dst) << M_DST_SHIFT))
#define SET_MODE(src, dst)                                              \
        SET_SRC_MODE    src;                                            \
        SET_DST_MODE    dst;                                            \
        if ((ahd->bugs & AHD_SET_MODE_BUG) != 0) {                      \
                mvi     MK_MODE(src, dst) call set_mode_work_around;    \
        } else {                                                        \
                mvi     MODE_PTR, MK_MODE(src, dst);                    \
        }

#define TOGGLE_DFF_MODE                                                 \
        if ((ahd->bugs & AHD_SET_MODE_BUG) != 0) {                      \
                call    toggle_dff_mode_work_around;                    \
        } else {                                                        \
                xor     MODE_PTR, MK_MODE(M_DFF1, M_DFF1);              \
        }
        
#define RESTORE_MODE(mode)                                              \
        if ((ahd->bugs & AHD_SET_MODE_BUG) != 0) {                      \
                mov     mode call set_mode_work_around;                 \
        } else {                                                        \
                mov     MODE_PTR, mode;                                 \
        }

#define SET_SEQINTCODE(code)                                            \
        if ((ahd->bugs & AHD_INTCOLLISION_BUG) != 0) {                  \
                mvi     code call set_seqint_work_around;               \
        } else {                                                        \
                mvi     SEQINTCODE, code;                               \
        }

/*
 * Mode Pointer
 * Controls which of the 5, 512byte, address spaces should be used
 * as the source and destination of any register accesses in our
 * register window.
 */
register MODE_PTR {
        address                 0x000
        access_mode     RW
        field   DST_MODE        0x70
        field   SRC_MODE        0x07
        mode_pointer
}

const SRC_MODE_SHIFT    0
const DST_MODE_SHIFT    4

/*
 * Host Interrupt Status
 */
register INTSTAT {
        address                 0x001
        access_mode     RW
        field   HWERRINT        0x80
        field   BRKADRINT       0x40
        field   SWTMINT         0x20
        field   PCIINT          0x10
        field   SCSIINT         0x08
        field   SEQINT          0x04
        field   CMDCMPLT        0x02
        field   SPLTINT         0x01
        mask    INT_PEND 0xFF
}

/*
 * Sequencer Interrupt Code
 */
register SEQINTCODE {
        address                 0x002
        access_mode     RW
        field {
                NO_SEQINT,                      /* No seqint pending. */
                BAD_PHASE,                      /* unknown scsi bus phase */
                SEND_REJECT,                    /* sending a message reject */
                PROTO_VIOLATION,                /* Protocol Violation */
                NO_MATCH,                       /* no cmd match for reconnect */
                IGN_WIDE_RES,                   /* Complex IGN Wide Res Msg */
                PDATA_REINIT,                   /*
                                                 * Returned to data phase
                                                 * that requires data
                                                 * transfer pointers to be
                                                 * recalculated from the
                                                 * transfer residual.
                                                 */
                HOST_MSG_LOOP,                  /*
                                                 * The bus is ready for the
                                                 * host to perform another
                                                 * message transaction.  This
                                                 * mechanism is used for things
                                                 * like sync/wide negotiation
                                                 * that require a kernel based
                                                 * message state engine.
                                                 */
                BAD_STATUS,                     /* Bad status from target */
                DATA_OVERRUN,                   /*
                                                 * Target attempted to write
                                                 * beyond the bounds of its
                                                 * command.
                                                 */
                MKMSG_FAILED,                   /*
                                                 * Target completed command
                                                 * without honoring our ATN
                                                 * request to issue a message. 
                                                 */
                MISSED_BUSFREE,                 /*
                                                 * The sequencer never saw
                                                 * the bus go free after
                                                 * either a command complete
                                                 * or disconnect message.
                                                 */
                DUMP_CARD_STATE,
                ILLEGAL_PHASE,
                INVALID_SEQINT,
                CFG4ISTAT_INTR,
                STATUS_OVERRUN,
                CFG4OVERRUN,
                ENTERING_NONPACK,
                TASKMGMT_FUNC_COMPLETE,         /*
                                                 * Task management function
                                                 * request completed with
                                                 * an expected busfree.
                                                 */
                TASKMGMT_CMD_CMPLT_OKAY,        /*
                                                 * A command with a non-zero
                                                 * task management function
                                                 * has completed via the normal
                                                 * command completion method
                                                 * for commands with a zero
                                                 * task management function.
                                                 * This happens when an attempt
                                                 * to abort a command loses
                                                 * the race for the command to
                                                 * complete normally.
                                                 */
                TRACEPOINT0,
                TRACEPOINT1,
                TRACEPOINT2,
                TRACEPOINT3,
                SAW_HWERR,
                BAD_SCB_STATUS
        }
}

/*
 * Clear Host Interrupt
 */
register CLRINT {
        address                 0x003
        access_mode     WO
        field   CLRHWERRINT     0x80 /* Rev B or greater */
        field   CLRBRKADRINT    0x40
        field   CLRSWTMINT      0x20
        field   CLRPCIINT       0x10
        field   CLRSCSIINT      0x08
        field   CLRSEQINT       0x04
        field   CLRCMDINT       0x02
        field   CLRSPLTINT      0x01
}

/*
 * Error Register
 */
register ERROR {
        address                 0x004
        access_mode     RO
        field   CIOPARERR       0x80
        field   CIOACCESFAIL    0x40 /* Rev B or greater */
        field   MPARERR         0x20
        field   DPARERR         0x10
        field   SQPARERR        0x08
        field   ILLOPCODE       0x04
        field   DSCTMOUT        0x02
}

/*
 * Clear Error
 */
register CLRERR {
        address                 0x004
        access_mode     WO
        field   CLRCIOPARERR    0x80
        field   CLRCIOACCESFAIL 0x40 /* Rev B or greater */
        field   CLRMPARERR      0x20
        field   CLRDPARERR      0x10
        field   CLRSQPARERR     0x08
        field   CLRILLOPCODE    0x04
        field   CLRDSCTMOUT     0x02
}

/*
 * Host Control Register
 * Overall host control of the device.
 */
register HCNTRL {
        address                 0x005
        access_mode     RW
        field   SEQ_RESET       0x80 /* Rev B or greater */
        field   POWRDN          0x40
        field   SWINT           0x10
        field   SWTIMER_START_B 0x08 /* Rev B or greater */
        field   PAUSE           0x04
        field   INTEN           0x02
        field   CHIPRST         0x01
        field   CHIPRSTACK      0x01
}

/*
 * Host New SCB Queue Offset
 */
register HNSCB_QOFF {
        address                 0x006
        access_mode     RW
        size            2
}

/*
 * Host Empty SCB Queue Offset
 */
register HESCB_QOFF {
        address                 0x008
        access_mode     RW
}

/*
 * Host Mailbox
 */
register HS_MAILBOX {
        address                 0x00B
        access_mode     RW
        mask    HOST_TQINPOS    0x80    /* Boundary at either 0 or 128 */
        mask    ENINT_COALESCE  0x40    /* Perform interrupt coalescing */
}

/*
 * Sequencer Interupt Status
 */
register SEQINTSTAT {
        address                 0x00C
        access_mode     RO
        field   SEQ_SWTMRTO     0x10
        field   SEQ_SEQINT      0x08
        field   SEQ_SCSIINT     0x04
        field   SEQ_PCIINT      0x02
        field   SEQ_SPLTINT     0x01
}

/*
 * Clear SEQ Interrupt
 */
register CLRSEQINTSTAT {
        address                 0x00C
        access_mode     WO
        field   CLRSEQ_SWTMRTO  0x10
        field   CLRSEQ_SEQINT   0x08
        field   CLRSEQ_SCSIINT  0x04
        field   CLRSEQ_PCIINT   0x02
        field   CLRSEQ_SPLTINT  0x01
}

/*
 * Software Timer
 */
register SWTIMER {
        address                 0x00E
        access_mode     RW
        size            2
}

/*
 * SEQ New SCB Queue Offset
 */
register SNSCB_QOFF {
        address                 0x010
        access_mode     RW
        size            2
        modes           M_CCHAN
}

/*
 * SEQ Empty SCB Queue Offset
 */
register SESCB_QOFF {
        address                 0x012
        access_mode     RW
        modes           M_CCHAN
}

/*
 * SEQ Done SCB Queue Offset
 */
register SDSCB_QOFF {
        address                 0x014
        access_mode     RW
        modes           M_CCHAN
        size            2
}

/*
 * Queue Offset Control & Status
 */
register QOFF_CTLSTA {
        address                 0x016
        access_mode     RW
        modes           M_CCHAN
        field   EMPTY_SCB_AVAIL 0x80
        field   NEW_SCB_AVAIL   0x40
        field   SDSCB_ROLLOVR   0x20
        field   HS_MAILBOX_ACT  0x10
        field   SCB_QSIZE       0x0F {
                SCB_QSIZE_4,
                SCB_QSIZE_8,
                SCB_QSIZE_16,
                SCB_QSIZE_32,
                SCB_QSIZE_64,
                SCB_QSIZE_128,
                SCB_QSIZE_256,
                SCB_QSIZE_512,
                SCB_QSIZE_1024,
                SCB_QSIZE_2048,
                SCB_QSIZE_4096,
                SCB_QSIZE_8192,
                SCB_QSIZE_16384
        }
}

/*
 * Interrupt Control
 */
register INTCTL {
        address                 0x018
        access_mode     RW
        field   SWTMINTMASK     0x80
        field   SWTMINTEN       0x40
        field   SWTIMER_START   0x20
        field   AUTOCLRCMDINT   0x10
        field   PCIINTEN        0x08
        field   SCSIINTEN       0x04
        field   SEQINTEN        0x02
        field   SPLTINTEN       0x01
}

/*
 * Data FIFO Control
 */
register DFCNTRL {
        address                 0x019
        access_mode     RW
        modes           M_DFF0, M_DFF1
        field   PRELOADEN       0x80
        field   SCSIENWRDIS     0x40    /* Rev B only. */
        field   SCSIEN          0x20
        field   SCSIENACK       0x20
        field   HDMAEN          0x08
        field   HDMAENACK       0x08
        field   DIRECTION       0x04
        field   DIRECTIONACK    0x04
        field   FIFOFLUSH       0x02
        field   FIFOFLUSHACK    0x02
        field   DIRECTIONEN     0x01
}

/*
 * Device Space Command 0
 */
register DSCOMMAND0 {
        address                 0x019
        access_mode     RW
        modes           M_CFG
        field   CACHETHEN       0x80    /* Cache Threshold enable */
        field   DPARCKEN        0x40    /* Data Parity Check Enable */
        field   MPARCKEN        0x20    /* Memory Parity Check Enable */
        field   EXTREQLCK       0x10    /* External Request Lock */
        field   DISABLE_TWATE   0x02    /* Rev B or greater */
        field   CIOPARCKEN      0x01    /* Internal bus parity error enable */
}

/*
 * Data FIFO Status
 */
register DFSTATUS {
        address                 0x01A
        access_mode     RO
        modes           M_DFF0, M_DFF1
        field   PRELOAD_AVAIL           0x80
        field   PKT_PRELOAD_AVAIL       0x40
        field   MREQPEND                0x10
        field   HDONE                   0x08
        field   DFTHRESH                0x04
        field   FIFOFULL                0x02
        field   FIFOEMP                 0x01
}

/*
 * S/G Cache Pointer
 */
register SG_CACHE_PRE {
        address                 0x01B
        access_mode     WO
        modes           M_DFF0, M_DFF1
        field   SG_ADDR_MASK    0xf8
        field   ODD_SEG         0x04
        field   LAST_SEG        0x02
}

register SG_CACHE_SHADOW {
        address                 0x01B
        access_mode     RO
        modes           M_DFF0, M_DFF1
        field   SG_ADDR_MASK    0xf8
        field   ODD_SEG         0x04
        field   LAST_SEG        0x02
        field   LAST_SEG_DONE   0x01
}

/*
 * Arbiter Control
 */
register ARBCTL {
        address                 0x01B
        access_mode     RW
        modes           M_CFG
        field   RESET_HARB      0x80
        field   RETRY_SWEN      0x08
        field   USE_TIME        0x07
}

/*
 * Data Channel Host Address
 */
register HADDR {
        address                 0x070
        access_mode     RW
        size            8
        modes           M_DFF0, M_DFF1
}

/*
 * Host Overlay DMA Address
 */
register HODMAADR {
        address                 0x070
        access_mode     RW
        size            8
        modes           M_SCSI
}

/*
 * PCI PLL Delay.
 */
register PLLDELAY {
        address                 0x070
        access_mode     RW
        size            1
        modes           M_CFG
        field   SPLIT_DROP_REQ  0x80
}

/*
 * Data Channel Host Count
 */
register HCNT {
        address                 0x078
        access_mode     RW
        size            3
        modes           M_DFF0, M_DFF1
}

/*
 * Host Overlay DMA Count
 */
register HODMACNT {
        address                 0x078
        access_mode     RW
        size            2
        modes           M_SCSI
}

/*
 * Host Overlay DMA Enable
 */
register HODMAEN {
        address                 0x07A
        access_mode     RW
        modes           M_SCSI
}

/*
 * Scatter/Gather Host Address
 */
register SGHADDR {
        address                 0x07C
        access_mode     RW
        size            8
        modes           M_DFF0, M_DFF1
}

/*
 * SCB Host Address
 */
register SCBHADDR {
        address                 0x07C
        access_mode     RW
        size            8
        modes           M_CCHAN
}

/*
 * Scatter/Gather Host Count
 */
register SGHCNT {
        address                 0x084
        access_mode     RW
        modes           M_DFF0, M_DFF1
}

/*
 * SCB Host Count
 */
register SCBHCNT {
        address                 0x084
        access_mode     RW
        modes           M_CCHAN
}

/*
 * Data FIFO Threshold
 */
register DFF_THRSH {
        address                 0x088
        access_mode     RW
        modes           M_CFG
        field   WR_DFTHRSH      0x70 {
                WR_DFTHRSH_MIN,
                WR_DFTHRSH_25,
                WR_DFTHRSH_50,
                WR_DFTHRSH_63,
                WR_DFTHRSH_75,
                WR_DFTHRSH_85,
                WR_DFTHRSH_90,
                WR_DFTHRSH_MAX
        }
        field   RD_DFTHRSH      0x07 {
                RD_DFTHRSH_MIN,
                RD_DFTHRSH_25,
                RD_DFTHRSH_50,
                RD_DFTHRSH_63,
                RD_DFTHRSH_75,
                RD_DFTHRSH_85,
                RD_DFTHRSH_90,
                RD_DFTHRSH_MAX
        }
}

/*
 * ROM Address
 */
register ROMADDR {
        address                 0x08A
        access_mode     RW
        size            3
}

/*
 * ROM Control
 */
register ROMCNTRL {
        address                 0x08D
        access_mode     RW
        field   ROMOP           0xE0
        field   ROMSPD          0x18
        field   REPEAT          0x02
        field   RDY             0x01
}

/*
 * ROM Data
 */
register ROMDATA {
        address                 0x08E
        access_mode     RW
}

/*
 * Data Channel Receive Message 0
 */
register DCHRXMSG0 {
        address                 0x090
        access_mode     RO
        modes           M_DFF0, M_DFF1
        field           CDNUM   0xF8
        field           CFNUM   0x07
}

/*
 * CMC Recieve Message 0
 */
register CMCRXMSG0 {
        address                 0x090
        access_mode     RO
        modes           M_CCHAN
        field           CDNUM   0xF8
        field           CFNUM   0x07
}

/*
 * Overlay Recieve Message 0
 */
register OVLYRXMSG0 {
        address                 0x090
        access_mode     RO
        modes           M_SCSI
        field           CDNUM   0xF8
        field           CFNUM   0x07
}

/*
 * Relaxed Order Enable
 */
register ROENABLE {
        address                 0x090
        access_mode     RW
        modes           M_CFG
        field   MSIROEN         0x20
        field   OVLYROEN        0x10
        field   CMCROEN         0x08
        field   SGROEN          0x04
        field   DCH1ROEN        0x02
        field   DCH0ROEN        0x01
}

/*
 * Data Channel Receive Message 1
 */
register DCHRXMSG1 {
        address                 0x091
        access_mode     RO
        modes           M_DFF0, M_DFF1
        field   CBNUM           0xFF
}

/*
 * CMC Recieve Message 1
 */
register CMCRXMSG1 {
        address                 0x091
        access_mode     RO
        modes           M_CCHAN
        field   CBNUM           0xFF
}

/*
 * Overlay Recieve Message 1
 */
register OVLYRXMSG1 {
        address                 0x091
        access_mode     RO
        modes           M_SCSI
        field   CBNUM           0xFF
}

/*
 * No Snoop Enable
 */
register NSENABLE {
        address                 0x091
        access_mode     RW
        modes           M_CFG
        field   MSINSEN         0x20
        field   OVLYNSEN        0x10
        field   CMCNSEN         0x08
        field   SGNSEN          0x04
        field   DCH1NSEN        0x02
        field   DCH0NSEN        0x01
}

/*
 * Data Channel Receive Message 2
 */
register DCHRXMSG2 {
        address                 0x092
        access_mode     RO
        modes           M_DFF0, M_DFF1
        field   MINDEX          0xFF
}

/*
 * CMC Recieve Message 2
 */
register CMCRXMSG2 {
        address                 0x092
        access_mode     RO
        modes           M_CCHAN
        field   MINDEX          0xFF
}

/*
 * Overlay Recieve Message 2
 */
register OVLYRXMSG2 {
        address                 0x092
        access_mode     RO
        modes           M_SCSI
        field   MINDEX          0xFF
}

/*
 * Outstanding Split Transactions
 */
register OST {
        address                 0x092
        access_mode     RW
        modes           M_CFG
}

/*
 * Data Channel Receive Message 3
 */
register DCHRXMSG3 {
        address                 0x093
        access_mode     RO
        modes           M_DFF0, M_DFF1
        field   MCLASS          0x0F
}

/*
 * CMC Recieve Message 3
 */
register CMCRXMSG3 {
        address                 0x093
        access_mode     RO
        modes           M_CCHAN
        field   MCLASS          0x0F
}

/*
 * Overlay Recieve Message 3
 */
register OVLYRXMSG3 {
        address                 0x093
        access_mode     RO
        modes           M_SCSI
        field   MCLASS          0x0F
}

/*
 * PCI-X Control
 */
register PCIXCTL {
        address                 0x093
        access_mode     RW
        modes           M_CFG
        field   SERRPULSE       0x80
        field   UNEXPSCIEN      0x20
        field   SPLTSMADIS      0x10
        field   SPLTSTADIS      0x08
        field   SRSPDPEEN       0x04
        field   TSCSERREN       0x02
        field   CMPABCDIS       0x01
}

/*
 * CMC Sequencer Byte Count
 */
register CMCSEQBCNT {
        address                 0x094
        access_mode     RO
        modes           M_CCHAN
}

/*
 * Overlay Sequencer Byte Count
 */
register OVLYSEQBCNT {
        address                 0x094
        access_mode     RO
        modes           M_SCSI
}

/*
 * Data Channel Sequencer Byte Count
 */
register DCHSEQBCNT {
        address                 0x094
        access_mode     RO
        size            2
        modes           M_DFF0, M_DFF1
}

/*
 * Data Channel Split Status 0
 */
register DCHSPLTSTAT0 {
        address                 0x096
        access_mode     RW
        modes           M_DFF0, M_DFF1
        field   STAETERM        0x80
        field   SCBCERR         0x40
        field   SCADERR         0x20
        field   SCDATBUCKET     0x10
        field   CNTNOTCMPLT     0x08
        field   RXOVRUN         0x04
        field   RXSCEMSG        0x02
        field   RXSPLTRSP       0x01
}

/*
 * CMC Split Status 0
 */
register CMCSPLTSTAT0 {
        address                 0x096
        access_mode     RW
        modes           M_CCHAN
        field   STAETERM        0x80
        field   SCBCERR         0x40
        field   SCADERR         0x20
        field   SCDATBUCKET     0x10
        field   CNTNOTCMPLT     0x08
        field   RXOVRUN         0x04
        field   RXSCEMSG        0x02
        field   RXSPLTRSP       0x01
}

/*
 * Overlay Split Status 0
 */
register OVLYSPLTSTAT0 {
        address                 0x096
        access_mode     RW
        modes           M_SCSI
        field   STAETERM        0x80
        field   SCBCERR         0x40
        field   SCADERR         0x20
        field   SCDATBUCKET     0x10
        field   CNTNOTCMPLT     0x08
        field   RXOVRUN         0x04
        field   RXSCEMSG        0x02
        field   RXSPLTRSP       0x01
}

/*
 * Data Channel Split Status 1
 */
register DCHSPLTSTAT1 {
        address                 0x097
        access_mode     RW
        modes           M_DFF0, M_DFF1
        field   RXDATABUCKET    0x01
}

/*
 * CMC Split Status 1
 */
register CMCSPLTSTAT1 {
        address                 0x097
        access_mode     RW
        modes           M_CCHAN
        field   RXDATABUCKET    0x01
}

/*
 * Overlay Split Status 1
 */
register OVLYSPLTSTAT1 {
        address                 0x097
        access_mode     RW
        modes           M_SCSI
        field   RXDATABUCKET    0x01
}

/*
 * S/G Receive Message 0
 */
register SGRXMSG0 {
        address                 0x098
        access_mode     RO
        modes           M_DFF0, M_DFF1
        field           CDNUM   0xF8
        field           CFNUM   0x07
}

/*
 * S/G Receive Message 1
 */
register SGRXMSG1 {
        address                 0x099
        access_mode     RO
        modes           M_DFF0, M_DFF1
        field   CBNUM           0xFF
}

/*
 * S/G Receive Message 2
 */
register SGRXMSG2 {
        address                 0x09A
        access_mode     RO
        modes           M_DFF0, M_DFF1
        field   MINDEX          0xFF
}

/*
 * S/G Receive Message 3
 */
register SGRXMSG3 {
        address                 0x09B
        access_mode     RO
        modes           M_DFF0, M_DFF1
        field   MCLASS          0x0F
}

/*
 * Slave Split Out Address 0
 */
register SLVSPLTOUTADR0 {
        address                 0x098
        access_mode     RO
        modes           M_SCSI
        field   LOWER_ADDR      0x7F
}

/*
 * Slave Split Out Address 1
 */
register SLVSPLTOUTADR1 {
        address                 0x099
        access_mode     RO
        modes           M_SCSI
        field   REQ_DNUM        0xF8
        field   REQ_FNUM        0x07
}

/*
 * Slave Split Out Address 2
 */
register SLVSPLTOUTADR2 {
        address                 0x09A
        access_mode     RO
        modes           M_SCSI
        field   REQ_BNUM        0xFF
}

/*
 * Slave Split Out Address 3
 */
register SLVSPLTOUTADR3 {
        address                 0x09B
        access_mode     RO
        modes           M_SCSI
        field   RLXORD          020
        field   TAG_NUM         0x1F
}

/*
 * SG Sequencer Byte Count
 */
register SGSEQBCNT {
        address                 0x09C
        access_mode     RO
        modes           M_DFF0, M_DFF1
}

/*
 * Slave Split Out Attribute 0
 */
register SLVSPLTOUTATTR0 {
        address                 0x09C
        access_mode     RO
        modes           M_SCSI
        field   LOWER_BCNT      0xFF
}

/*
 * Slave Split Out Attribute 1
 */
register SLVSPLTOUTATTR1 {
        address                 0x09D
        access_mode     RO
        modes           M_SCSI
        field   CMPLT_DNUM      0xF8
        field   CMPLT_FNUM      0x07
}

/*
 * Slave Split Out Attribute 2
 */
register SLVSPLTOUTATTR2 {
        address                 0x09E
        access_mode     RO
        size            2
        modes           M_SCSI
        field   CMPLT_BNUM      0xFF
}
/*
 * S/G Split Status 0
 */
register SGSPLTSTAT0 {
        address                 0x09E
        access_mode     RW
        modes           M_DFF0, M_DFF1
        field   STAETERM        0x80
        field   SCBCERR         0x40
        field   SCADERR         0x20
        field   SCDATBUCKET     0x10
        field   CNTNOTCMPLT     0x08
        field   RXOVRUN         0x04
        field   RXSCEMSG        0x02
        field   RXSPLTRSP       0x01
}

/*
 * S/G Split Status 1
 */
register SGSPLTSTAT1 {
        address                 0x09F
        access_mode     RW
        modes           M_DFF0, M_DFF1
        field   RXDATABUCKET    0x01
}

/*
 * Special Function
 */
register SFUNCT {
        address                 0x09f
        access_mode     RW
        modes           M_CFG
        field   TEST_GROUP      0xF0
        field   TEST_NUM        0x0F
}

/*
 * Data FIFO 0 PCI Status 
 */
register DF0PCISTAT {
        address                 0x0A0
        access_mode     RW
        modes           M_CFG
        field   DPE             0x80
        field   SSE             0x40
        field   RMA             0x20
        field   RTA             0x10
        field   SCAAPERR        0x08
        field   RDPERR          0x04
        field   TWATERR         0x02
        field   DPR             0x01
}

/*
 * Data FIFO 1 PCI Status 
 */
register DF1PCISTAT {
        address                 0x0A1
        access_mode     RW
        modes           M_CFG
        field   DPE             0x80
        field   SSE             0x40
        field   RMA             0x20
        field   RTA             0x10
        field   SCAAPERR        0x08
        field   RDPERR          0x04
        field   TWATERR         0x02
        field   DPR             0x01
}

/*
 * S/G PCI Status 
 */
register SGPCISTAT {
        address                 0x0A2
        access_mode     RW
        modes           M_CFG
        field   DPE             0x80
        field   SSE             0x40
        field   RMA             0x20
        field   RTA             0x10
        field   SCAAPERR        0x08
        field   RDPERR          0x04
        field   DPR             0x01
}

/*
 * CMC PCI Status 
 */
register CMCPCISTAT {
        address                 0x0A3
        access_mode     RW
        modes           M_CFG
        field   DPE             0x80
        field   SSE             0x40
        field   RMA             0x20
        field   RTA             0x10
        field   SCAAPERR        0x08
        field   RDPERR          0x04
        field   TWATERR         0x02
        field   DPR             0x01
}

/*
 * Overlay PCI Status 
 */
register OVLYPCISTAT {
        address                 0x0A4
        access_mode     RW
        modes           M_CFG
        field   DPE             0x80
        field   SSE             0x40
        field   RMA             0x20
        field   RTA             0x10
        field   SCAAPERR        0x08
        field   RDPERR          0x04
        field   DPR             0x01
}

/*
 * PCI Status for MSI Master DMA Transfer
 */
register MSIPCISTAT {
        address                 0x0A6
        access_mode     RW
        modes           M_CFG
        field   SSE             0x40
        field   RMA             0x20
        field   RTA             0x10
        field   CLRPENDMSI      0x08
        field   TWATERR         0x02
        field   DPR             0x01
}

/*
 * PCI Status for Target
 */
register TARGPCISTAT {
        address                 0x0A7
        access_mode     RW
        modes           M_CFG
        field   DPE             0x80
        field   SSE             0x40
        field   STA             0x08
        field   TWATERR         0x02
}

/*
 * LQ Packet In
 * The last LQ Packet recieved
 */
register LQIN {
        address                 0x020
        access_mode     RW
        size            20
        modes           M_DFF0, M_DFF1, M_SCSI
}

/*
 * SCB Type Pointer
 * SCB offset for Target Mode SCB type information
 */
register TYPEPTR {
        address                 0x020
        access_mode     RW
        modes           M_CFG
}

/*
 * Queue Tag Pointer
 * SCB offset to the Two Byte tag identifier used for target mode.
 */
register TAGPTR {
        address                 0x021
        access_mode     RW
        modes           M_CFG
}

/*
 * Logical Unit Number Pointer
 * SCB offset to the LSB (little endian) of the lun field.
 */
register LUNPTR {
        address                 0x022
        access_mode     RW
        modes           M_CFG
}

/*
 * Data Length Pointer
 * SCB offset for the 4 byte data length field in target mode.
 */
register DATALENPTR {
        address                 0x023
        access_mode     RW
        modes           M_CFG
}

/*
 * Status Length Pointer
 * SCB offset to the two byte status field in target SCBs.
 */
register STATLENPTR {
        address                 0x024
        access_mode     RW
        modes           M_CFG
}

/*
 * Command Length Pointer
 * Scb offset for the CDB length field in initiator SCBs.
 */
register CMDLENPTR {
        address                 0x025
        access_mode     RW
        modes           M_CFG
}

/*
 * Task Attribute Pointer
 * Scb offset for the byte field specifying the attribute byte
 * to be used in command packets.
 */ 
register ATTRPTR {
        address                 0x026
        access_mode     RW
        modes           M_CFG
}

/*
 * Task Management Flags Pointer
 * Scb offset for the byte field specifying the attribute flags
 * byte to be used in command packets.
 */ 
register FLAGPTR {
        address                 0x027
        access_mode     RW
        modes           M_CFG
}

/*
 * Command Pointer
 * Scb offset for the first byte in the CDB for initiator SCBs.
 */
register CMDPTR {
        address                 0x028
        access_mode     RW
        modes           M_CFG
}

/*
 * Queue Next Pointer
 * Scb offset for the 2 byte "next scb link".
 */
register QNEXTPTR {
        address                 0x029
        access_mode     RW
        modes           M_CFG
}

/*
 * SCSI ID Pointer
 * Scb offset to the value to place in the SCSIID register
 * during target mode connections.
 */
register IDPTR {
        address                 0x02A
        access_mode     RW
        modes           M_CFG
}

/*
 * Command Aborted Byte Pointer
 * Offset to the SCB flags field that includes the
 * "SCB aborted" status bit.
 */
register ABRTBYTEPTR {
        address                 0x02B
        access_mode     RW
        modes           M_CFG
}

/*
 * Command Aborted Bit Pointer
 * Bit offset in the SCB flags field for "SCB aborted" status.
 */
register ABRTBITPTR {
        address                 0x02C
        access_mode     RW
        modes           M_CFG
}

/*
 * Rev B or greater.
 */
register MAXCMDBYTES {
        address                 0x02D
        access_mode     RW
        modes           M_CFG
}

/*
 * Rev B or greater.
 */
register MAXCMD2RCV {
        address                 0x02E
        access_mode     RW
        modes           M_CFG
}

/*
 * Rev B or greater.
 */
register SHORTTHRESH {
        address                 0x02F
        access_mode     RW
        modes           M_CFG
}

/*
 * Logical Unit Number Length
 * The length, in bytes, of the SCB lun field.
 */
register LUNLEN {
        address                 0x030
        access_mode     RW
        modes           M_CFG
        mask            ILUNLEN 0x0F
        mask            TLUNLEN 0xF0
}
const LUNLEN_SINGLE_LEVEL_LUN 0xF

/*
 * CDB Limit
 * The size, in bytes, of the embedded CDB field in initator SCBs.
 */
register CDBLIMIT {
        address                 0x031
        access_mode     RW
        modes           M_CFG
}

/*
 * Maximum Commands
 * The maximum number of commands to issue during a
 * single packetized connection.
 */
register MAXCMD {
        address                 0x032
        access_mode     RW
        modes           M_CFG
}

/*
 * Maximum Command Counter
 * The number of commands already sent during this connection
 */
register MAXCMDCNT {
        address                 0x033
        access_mode     RW
        modes           M_CFG
}

/*
 * LQ Packet Reserved Bytes
 * The bytes to be sent in the currently reserved fileds
 * of all LQ packets.
 */
register LQRSVD01 {
        address                 0x034
        access_mode     RW
        modes           M_SCSI
}
register LQRSVD16 {
        address                 0x035
        access_mode     RW
        modes           M_SCSI
}
register LQRSVD17 {
        address                 0x036
        access_mode     RW
        modes           M_SCSI
}

/*
 * Command Reserved 0
 * The byte to be sent for the reserved byte 0 of
 * outgoing command packets.
 */
register CMDRSVD0 {
        address                 0x037
        access_mode     RW
        modes           M_CFG
}

/*
 * LQ Manager Control 0
 */
register LQCTL0 {
        address                 0x038
        access_mode     RW
        modes           M_CFG
        field   LQITARGCLT      0xC0
        field   LQIINITGCLT     0x30
        field   LQ0TARGCLT      0x0C
        field   LQ0INITGCLT     0x03
}

/*
 * LQ Manager Control 1
 */
register LQCTL1 {
        address                 0x038
        access_mode     RW
        modes           M_DFF0, M_DFF1, M_SCSI
        field   PCI2PCI         0x04
        field   SINGLECMD       0x02
        field   ABORTPENDING    0x01
}

/*
 * LQ Manager Control 2
 */
register LQCTL2 {
        address                 0x039
        access_mode     RW
        modes           M_DFF0, M_DFF1, M_SCSI
        field   LQIRETRY        0x80
        field   LQICONTINUE     0x40
        field   LQITOIDLE       0x20
        field   LQIPAUSE        0x10
        field   LQORETRY        0x08
        field   LQOCONTINUE     0x04
        field   LQOTOIDLE       0x02
        field   LQOPAUSE        0x01
}

/*
 * SCSI RAM BIST0
 */
register SCSBIST0 {
        address                 0x039
        access_mode     RW
        modes           M_CFG
        field   GSBISTERR       0x40
        field   GSBISTDONE      0x20
        field   GSBISTRUN       0x10
        field   OSBISTERR       0x04
        field   OSBISTDONE      0x02
        field   OSBISTRUN       0x01
}

/*
 * SCSI Sequence Control0
 */
register SCSISEQ0 {
        address                 0x03A
        access_mode     RW
        modes           M_DFF0, M_DFF1, M_SCSI
        field   TEMODEO         0x80
        field   ENSELO          0x40
        field   ENARBO          0x20
        field   FORCEBUSFREE    0x10
        field   SCSIRSTO        0x01
}

/*
 * SCSI RAM BIST 1
 */
register SCSBIST1 {
        address                 0x03A
        access_mode     RW
        modes           M_CFG
        field   NTBISTERR       0x04
        field   NTBISTDONE      0x02
        field   NTBISTRUN       0x01
}

/*
 * SCSI Sequence Control 1
 */
register SCSISEQ1 {
        address                 0x03B
        access_mode     RW
        modes           M_DFF0, M_DFF1, M_SCSI
        field   MANUALCTL       0x40
        field   ENSELI          0x20
        field   ENRSELI         0x10
        field   MANUALP         0x0C
        field   ENAUTOATNP      0x02
        field   ALTSTIM         0x01
}

/*
 * SCSI Transfer Control 0
 */
register SXFRCTL0 {
        address                 0x03C
        access_mode     RW
        modes           M_SCSI
        field   DFON            0x80
        field   DFPEXP          0x40
        field   BIOSCANCELEN    0x10
        field   SPIOEN          0x08
}

/*
 * SCSI Transfer Control 1
 */
register SXFRCTL1 {
        address                 0x03D
        access_mode     RW
        modes           M_SCSI
        field   BITBUCKET       0x80
        field   ENSACHK         0x40
        field   ENSPCHK         0x20
        field   STIMESEL        0x18
        field   ENSTIMER        0x04
        field   ACTNEGEN        0x02
        field   STPWEN          0x01
}

/*
 * SCSI Transfer Control 2
 */
register SXFRCTL2 {
        address                 0x03E
        access_mode     RW
        modes           M_SCSI
        field   AUTORSTDIS      0x10
        field   CMDDMAEN        0x08
        field   ASU             0x07
}

/*
 * SCSI Bus Initiator IDs
 * Bitmask of observed initiators on the bus.
 */
register BUSINITID {
        address                 0x03C
        access_mode     RW
        modes           M_CFG
        size            2
}

/*
 * Data Length Counters
 * Packet byte counter.
 */
register DLCOUNT {
        address                 0x03C
        access_mode     RW
        modes           M_DFF0, M_DFF1
        size            3
}

/*
 * Data FIFO Status
 */
register DFFSTAT {
        address                 0x03F
        access_mode     RW
        modes           M_SCSI
        field   FIFO1FREE       0x20
        field   FIFO0FREE       0x10
        /*
         * On the B, this enum only works
         * in the read direction.  For writes,
         * you must use the B version of the
         * CURRFIFO_0 definition which is defined
         * as a constant outside of this register
         * definition to avoid confusing the
         * register pretty printing code.
         */
        enum    CURRFIFO        0x03 {
                CURRFIFO_0,
                CURRFIFO_1,
                CURRFIFO_NONE   0x3
        }
}

const B_CURRFIFO_0 0x2

/*
 * SCSI Bus Target IDs
 * Bitmask of observed targets on the bus.
 */
register BUSTARGID {
        address                 0x03E
        access_mode     RW
        modes           M_CFG
        size            2
}

/*
 * SCSI Control Signal Out
 */
register SCSISIGO {
        address                 0x040
        access_mode     RW
        modes           M_DFF0, M_DFF1, M_SCSI
        field   CDO             0x80
        field   IOO             0x40
        field   MSGO            0x20
        field   ATNO            0x10
        field   SELO            0x08
        field   BSYO            0x04
        field   REQO            0x02
        field   ACKO            0x01
/*
 * Possible phases to write into SCSISIG0
 */
        enum    PHASE_MASK  CDO|IOO|MSGO {
                P_DATAOUT       0x0,
                P_DATAIN        IOO,
                P_DATAOUT_DT    P_DATAOUT|MSGO,
                P_DATAIN_DT     P_DATAIN|MSGO,
                P_COMMAND       CDO,
                P_MESGOUT       CDO|MSGO,
                P_STATUS        CDO|IOO,
                P_MESGIN        CDO|IOO|MSGO
        }
}

register SCSISIGI {
        address                 0x041
        access_mode     RO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   CDI             0x80
        field   IOI             0x40
        field   MSGI            0x20
        field   ATNI            0x10
        field   SELI            0x08
        field   BSYI            0x04
        field   REQI            0x02
        field   ACKI            0x01
/*
 * Possible phases in SCSISIGI
 */
        enum    PHASE_MASK  CDO|IOO|MSGO {
                P_DATAOUT       0x0,
                P_DATAIN        IOO,
                P_DATAOUT_DT    P_DATAOUT|MSGO,
                P_DATAIN_DT     P_DATAIN|MSGO,
                P_COMMAND       CDO,
                P_MESGOUT       CDO|MSGO,
                P_STATUS        CDO|IOO,
                P_MESGIN        CDO|IOO|MSGO
        }
}

/*
 * Multiple Target IDs
 * Bitmask of ids to respond as a target.
 */
register MULTARGID {
        address                 0x040
        access_mode     RW
        modes           M_CFG
        size            2
}

/*
 * SCSI Phase
 */
register SCSIPHASE {
        address                 0x042
        access_mode     RO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   STATUS_PHASE    0x20
        field   COMMAND_PHASE   0x10
        field   MSG_IN_PHASE    0x08
        field   MSG_OUT_PHASE   0x04
        field   DATA_PHASE_MASK 0x03 {
                DATA_OUT_PHASE  0x01,
                DATA_IN_PHASE   0x02
        }
}

/*
 * SCSI Data 0 Image
 */
register SCSIDAT0_IMG {
        address                 0x043
        access_mode     RW
        modes           M_DFF0, M_DFF1, M_SCSI
}

/*
 * SCSI Latched Data
 */
register SCSIDAT {
        address                 0x044
        access_mode     RW
        modes           M_DFF0, M_DFF1, M_SCSI
        size            2
}

/*
 * SCSI Data Bus
 */
register SCSIBUS {
        address                 0x046
        access_mode     RW
        modes           M_DFF0, M_DFF1, M_SCSI
        size            2
}

/*
 * Target ID In
 */
register TARGIDIN {
        address                 0x048
        access_mode     RO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   CLKOUT          0x80
        field   TARGID          0x0F
}

/*
 * Selection/Reselection ID
 * Upper four bits are the device id.  The ONEBIT is set when the re/selecting
 * device did not set its own ID.
 */
register SELID {
        address                 0x049
        access_mode     RW
        modes           M_DFF0, M_DFF1, M_SCSI
        field   SELID_MASK      0xf0
        field   ONEBIT          0x08
}

/*
 * SCSI Block Control
 * Controls Bus type and channel selection.  SELWIDE allows for the
 * coexistence of 8bit and 16bit devices on a wide bus.
 */
register SBLKCTL {
        address                 0x04A
        access_mode     RW
        modes           M_DFF0, M_DFF1, M_SCSI
        field   DIAGLEDEN       0x80
        field   DIAGLEDON       0x40
        field   ENAB40          0x08    /* LVD transceiver active */
        field   ENAB20          0x04    /* SE/HVD transceiver active */
        field   SELWIDE         0x02
}

/*
 * Option Mode
 */
register OPTIONMODE {
        address                 0x04A
        access_mode     RW
        modes           M_CFG
        field   BIOSCANCTL              0x80
        field   AUTOACKEN               0x40
        field   BIASCANCTL              0x20
        field   BUSFREEREV              0x10
        field   ENDGFORMCHK             0x04
        field   AUTO_MSGOUT_DE          0x02
        mask    OPTIONMODE_DEFAULTS     AUTO_MSGOUT_DE
}

/*
 * SCSI Status 0
 */
register SSTAT0 {
        address                 0x04B
        access_mode     RO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   TARGET          0x80    /* Board acting as target */
        field   SELDO           0x40    /* Selection Done */
        field   SELDI           0x20    /* Board has been selected */
        field   SELINGO         0x10    /* Selection In Progress */
        field   IOERR           0x08    /* LVD Tranceiver mode changed */
        field   OVERRUN         0x04    /* SCSI Offset overrun detected */
        field   SPIORDY         0x02    /* SCSI PIO Ready */
        field   ARBDO           0x01    /* Arbitration Done Out */
}

/*
 * Clear SCSI Interrupt 0
 * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT0.
 */
register CLRSINT0 {
        address                 0x04B
        access_mode     WO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   CLRSELDO        0x40
        field   CLRSELDI        0x20
        field   CLRSELINGO      0x10
        field   CLRIOERR        0x08
        field   CLROVERRUN      0x04
        field   CLRSPIORDY      0x02
        field   CLRARBDO        0x01
}

/*
 * SCSI Interrupt Mode 0
 * Setting any bit will enable the corresponding function
 * in SIMODE0 to interrupt via the IRQ pin.
 */
register SIMODE0 {
        address                 0x04B
        access_mode     RW
        modes           M_CFG
        field   ENSELDO         0x40
        field   ENSELDI         0x20
        field   ENSELINGO       0x10
        field   ENIOERR         0x08
        field   ENOVERRUN       0x04
        field   ENSPIORDY       0x02
        field   ENARBDO         0x01
}

/*
 * SCSI Status 1
 */
register SSTAT1 {
        address                 0x04C
        access_mode     RO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   SELTO           0x80
        field   ATNTARG         0x40
        field   SCSIRSTI        0x20
        field   PHASEMIS        0x10
        field   BUSFREE         0x08
        field   SCSIPERR        0x04
        field   STRB2FAST       0x02
        field   REQINIT         0x01
}

/*
 * Clear SCSI Interrupt 1
 * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT1.
 */
register CLRSINT1 {
        address                 0x04C
        access_mode     WO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   CLRSELTIMEO     0x80
        field   CLRATNO         0x40
        field   CLRSCSIRSTI     0x20
        field   CLRBUSFREE      0x08
        field   CLRSCSIPERR     0x04
        field   CLRSTRB2FAST    0x02
        field   CLRREQINIT      0x01
}

/*
 * SCSI Status 2
 */
register SSTAT2 {
        address                 0x04d
        access_mode     RO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   BUSFREETIME     0xc0 {
                BUSFREE_LQO     0x40,
                BUSFREE_DFF0    0x80,
                BUSFREE_DFF1    0xC0
        }
        field   NONPACKREQ      0x20
        field   EXP_ACTIVE      0x10    /* SCSI Expander Active */
        field   BSYX            0x08    /* Busy Expander */
        field   WIDE_RES        0x04    /* Modes 0 and 1 only */
        field   SDONE           0x02    /* Modes 0 and 1 only */
        field   DMADONE         0x01    /* Modes 0 and 1 only */
}

/*
 * Clear SCSI Interrupt 2
 */
register CLRSINT2 {
        address                 0x04D
        access_mode     WO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   CLRNONPACKREQ   0x20
        field   CLRWIDE_RES     0x04    /* Modes 0 and 1 only */
        field   CLRSDONE        0x02    /* Modes 0 and 1 only */
        field   CLRDMADONE      0x01    /* Modes 0 and 1 only */
}

/*
 * SCSI Interrupt Mode 2
 */
register SIMODE2 {
        address                 0x04D
        access_mode     RW
        modes           M_CFG
        field   ENWIDE_RES      0x04
        field   ENSDONE         0x02
        field   ENDMADONE       0x01
}

/*
 * Physical Error Diagnosis
 */
register PERRDIAG {
        address                 0x04E
        access_mode     RO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   HIZERO          0x80
        field   HIPERR          0x40
        field   PREVPHASE       0x20
        field   PARITYERR       0x10
        field   AIPERR          0x08
        field   CRCERR          0x04
        field   DGFORMERR       0x02
        field   DTERR           0x01
}

/*
 * LQI Manager Current State
 */
register LQISTATE {
        address                 0x04E
        access_mode     RO
        modes           M_CFG
}

/*
 * SCSI Offset Count
 */
register SOFFCNT {
        address                 0x04F
        access_mode     RO
        modes           M_DFF0, M_DFF1, M_SCSI
}

/*
 * LQO Manager Current State
 */
register LQOSTATE {
        address                 0x04F
        access_mode     RO
        modes           M_CFG
}

/*
 * LQI Manager Status
 */
register LQISTAT0 {
        address                 0x050
        access_mode     RO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   LQIATNQAS       0x20
        field   LQICRCT1        0x10
        field   LQICRCT2        0x08
        field   LQIBADLQT       0x04
        field   LQIATNLQ        0x02
        field   LQIATNCMD       0x01
}

/*
 * Clear LQI Interrupts 0
 */
register CLRLQIINT0 {
        address                 0x050
        access_mode     WO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   CLRLQIATNQAS    0x20
        field   CLRLQICRCT1     0x10
        field   CLRLQICRCT2     0x08
        field   CLRLQIBADLQT    0x04
        field   CLRLQIATNLQ     0x02
        field   CLRLQIATNCMD    0x01
}

/*
 * LQI Manager Interrupt Mode 0
 */
register LQIMODE0 {
        address                 0x050
        access_mode     RW
        modes           M_CFG
        field   ENLQIATNQASK    0x20
        field   ENLQICRCT1      0x10
        field   ENLQICRCT2      0x08
        field   ENLQIBADLQT     0x04
        field   ENLQIATNLQ      0x02
        field   ENLQIATNCMD     0x01
}

/*
 * LQI Manager Status 1
 */
register LQISTAT1 {
        address                 0x051
        access_mode     RO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   LQIPHASE_LQ     0x80
        field   LQIPHASE_NLQ    0x40
        field   LQIABORT        0x20
        field   LQICRCI_LQ      0x10
        field   LQICRCI_NLQ     0x08
        field   LQIBADLQI       0x04
        field   LQIOVERI_LQ     0x02
        field   LQIOVERI_NLQ    0x01
}

/*
 * Clear LQI Manager Interrupts1
 */
register CLRLQIINT1 {
        address                 0x051
        access_mode     WO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   CLRLQIPHASE_LQ  0x80
        field   CLRLQIPHASE_NLQ 0x40
        field   CLRLIQABORT     0x20
        field   CLRLQICRCI_LQ   0x10
        field   CLRLQICRCI_NLQ  0x08
        field   CLRLQIBADLQI    0x04
        field   CLRLQIOVERI_LQ  0x02
        field   CLRLQIOVERI_NLQ 0x01
}

/*
 * LQI Manager Interrupt Mode 1
 */
register LQIMODE1 {
        address                 0x051
        access_mode     RW
        modes           M_CFG
        field   ENLQIPHASE_LQ   0x80    /* LQIPHASE1 */
        field   ENLQIPHASE_NLQ  0x40    /* LQIPHASE2 */
        field   ENLIQABORT      0x20
        field   ENLQICRCI_LQ    0x10    /* LQICRCI1 */
        field   ENLQICRCI_NLQ   0x08    /* LQICRCI2 */
        field   ENLQIBADLQI     0x04
        field   ENLQIOVERI_LQ   0x02    /* LQIOVERI1 */
        field   ENLQIOVERI_NLQ  0x01    /* LQIOVERI2 */
}

/*
 * LQI Manager Status 2
 */
register LQISTAT2 {
        address                 0x052
        access_mode     RO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   PACKETIZED      0x80
        field   LQIPHASE_OUTPKT 0x40
        field   LQIWORKONLQ     0x20
        field   LQIWAITFIFO     0x10
        field   LQISTOPPKT      0x08
        field   LQISTOPLQ       0x04
        field   LQISTOPCMD      0x02
        field   LQIGSAVAIL      0x01
}

/*
 * SCSI Status 3
 */
register SSTAT3 {
        address                 0x053
        access_mode     RO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   NTRAMPERR       0x02
        field   OSRAMPERR       0x01
}

/*
 * Clear SCSI Status 3
 */
register CLRSINT3 {
        address                 0x053
        access_mode     WO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   CLRNTRAMPERR    0x02
        field   CLROSRAMPERR    0x01
}

/*
 * SCSI Interrupt Mode 3
 */
register SIMODE3 {
        address                 0x053
        access_mode     RW
        modes           M_CFG
        field   ENNTRAMPERR     0x02
        field   ENOSRAMPERR     0x01
}

/*
 * LQO Manager Status 0
 */
register LQOSTAT0 {
        address                 0x054
        access_mode     RO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   LQOTARGSCBPERR  0x10
        field   LQOSTOPT2       0x08
        field   LQOATNLQ        0x04
        field   LQOATNPKT       0x02
        field   LQOTCRC         0x01
}

/*
 * Clear LQO Manager interrupt 0
 */
register CLRLQOINT0 {
        address                 0x054
        access_mode     WO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   CLRLQOTARGSCBPERR       0x10
        field   CLRLQOSTOPT2            0x08
        field   CLRLQOATNLQ             0x04
        field   CLRLQOATNPKT            0x02
        field   CLRLQOTCRC              0x01
}

/*
 * LQO Manager Interrupt Mode 0
 */
register LQOMODE0 {
        address                 0x054
        access_mode     RW
        modes           M_CFG
        field   ENLQOTARGSCBPERR        0x10
        field   ENLQOSTOPT2             0x08
        field   ENLQOATNLQ              0x04
        field   ENLQOATNPKT             0x02
        field   ENLQOTCRC               0x01
}

/*
 * LQO Manager Status 1
 */
register LQOSTAT1 {
        address                 0x055
        access_mode     RO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   LQOINITSCBPERR  0x10
        field   LQOSTOPI2       0x08
        field   LQOBADQAS       0x04
        field   LQOBUSFREE      0x02
        field   LQOPHACHGINPKT  0x01
}

/*
 * Clear LOQ Interrupt 1
 */
register CLRLQOINT1 {
        address                 0x055
        access_mode     WO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   CLRLQOINITSCBPERR       0x10
        field   CLRLQOSTOPI2            0x08
        field   CLRLQOBADQAS            0x04
        field   CLRLQOBUSFREE           0x02
        field   CLRLQOPHACHGINPKT       0x01
}

/*
 * LQO Manager Interrupt Mode 1
 */
register LQOMODE1 {
        address                 0x055
        access_mode     RW
        modes           M_CFG
        field   ENLQOINITSCBPERR        0x10
        field   ENLQOSTOPI2             0x08
        field   ENLQOBADQAS             0x04
        field   ENLQOBUSFREE            0x02
        field   ENLQOPHACHGINPKT        0x01
}

/*
 * LQO Manager Status 2
 */
register LQOSTAT2 {
        address                 0x056
        access_mode     RO
        modes           M_DFF0, M_DFF1, M_SCSI
        field   LQOPKT          0xE0
        field   LQOWAITFIFO     0x10
        field   LQOPHACHGOUTPKT 0x02    /* outside of packet boundaries. */
        field   LQOSTOP0        0x01    /* Stopped after sending all packets */
}

/*
 * Output Synchronizer Space Count
 */
register OS_SPACE_CNT {
        address                 0x056
        access_mode     RO
        modes           M_CFG
}

/*
 * SCSI Interrupt Mode 1
 * Setting any bit will enable the corresponding function
 * in SIMODE1 to interrupt via the IRQ pin.
 */
register SIMODE1 {
        address                 0x057
        access_mode     RW
        modes           M_DFF0, M_DFF1, M_SCSI
        field   ENSELTIMO       0x80
        field   ENATNTARG       0x40
        field   ENSCSIRST       0x20
        field   ENPHASEMIS      0x10
        field   ENBUSFREE       0x08
        field   ENSCSIPERR      0x04
        field   ENSTRB2FAST     0x02
        field   ENREQINIT       0x01
}

/*
 * Good Status FIFO
 */
register GSFIFO {
        address                 0x058
        access_mode     RO
        size            2
        modes           M_DFF0, M_DFF1, M_SCSI
}

/*
 * Data FIFO SCSI Transfer Control
 */
register DFFSXFRCTL {
        address                 0x05A
        access_mode     RW
        modes           M_DFF0, M_DFF1
        field   DFFBITBUCKET    0x08
        field   CLRSHCNT        0x04
        field   CLRCHN          0x02
        field   RSTCHN          0x01
}

/*
 * Next SCSI Control Block
 */
register NEXTSCB {
        address                 0x05A
        access_mode     RW
        size            2
        modes           M_SCSI
}

/* Rev B only. */
register LQOSCSCTL {
        address                 0x05A
        access_mode     RW
        size            1
        modes           M_CFG
        field           LQOH2A_VERSION  0x80
        field           LQONOCHKOVER    0x01
}

/*
 * SEQ Interrupts
 */
register SEQINTSRC {
        address                 0x05B
        access_mode     RO
        modes           M_DFF0, M_DFF1
        field   CTXTDONE        0x40
        field   SAVEPTRS        0x20
        field   CFG4DATA        0x10
        field   CFG4ISTAT       0x08
        field   CFG4TSTAT       0x04
        field   CFG4ICMD        0x02
        field   CFG4TCMD        0x01
}

/*
 * Clear Arp Interrupts
 */
register CLRSEQINTSRC {
        address                 0x05B
        access_mode     WO
        modes           M_DFF0, M_DFF1
        field   CLRCTXTDONE     0x40
        field   CLRSAVEPTRS     0x20
        field   CLRCFG4DATA     0x10
        field   CLRCFG4ISTAT    0x08
        field   CLRCFG4TSTAT    0x04
        field   CLRCFG4ICMD     0x02
        field   CLRCFG4TCMD     0x01
}

/*
 * SEQ Interrupt Enabled (Shared)
 */
register SEQIMODE {
        address                 0x05C
        access_mode     RW
        modes           M_DFF0, M_DFF1
        field   ENCTXTDONE      0x40
        field   ENSAVEPTRS      0x20
        field   ENCFG4DATA      0x10
        field   ENCFG4ISTAT     0x08
        field   ENCFG4TSTAT     0x04
        field   ENCFG4ICMD      0x02
        field   ENCFG4TCMD      0x01
}

/*
 * Current SCSI Control Block
 */
register CURRSCB {
        address                 0x05C
        access_mode     RW
        size            2
        modes           M_SCSI
}

/*
 * Data FIFO Status
 */
register MDFFSTAT {
        address                 0x05D
        access_mode     RO
        modes           M_DFF0, M_DFF1
        field   SHCNTNEGATIVE   0x40 /* Rev B or higher */
        field   SHCNTMINUS1     0x20 /* Rev B or higher */
        field   LASTSDONE       0x10
        field   SHVALID         0x08
        field   DLZERO          0x04 /* FIFO data ends on packet boundary. */
        field   DATAINFIFO      0x02
        field   FIFOFREE        0x01
}

/*
 * CRC Control
 */
register CRCCONTROL {
        address                 0x05d
        access_mode     RW
        modes           M_CFG
        field   CRCVALCHKEN             0x40
}

/*
 * SCSI Test Control
 */
register SCSITEST {
        address                 0x05E
        access_mode     RW
        modes           M_CFG
        field   CNTRTEST        0x08
        field   SEL_TXPLL_DEBUG 0x04
}

/*
 * Data FIFO Queue Tag
 */
register DFFTAG {
        address                 0x05E
        access_mode     RW
        size            2
        modes           M_DFF0, M_DFF1
}

/*
 * Last SCSI Control Block
 */
register LASTSCB {
        address                 0x05E
        access_mode     RW
        size            2
        modes           M_SCSI
}

/*
 * SCSI I/O Cell Power-down Control
 */
register IOPDNCTL {
        address                 0x05F
        access_mode     RW
        modes           M_CFG
        field   DISABLE_OE      0x80
        field   PDN_IDIST       0x04
        field   PDN_DIFFSENSE   0x01
}

/*
 * Shaddow Host Address.
 */
register SHADDR {
        address                 0x060
        access_mode     RO
        size            8
        modes           M_DFF0, M_DFF1
}

/*
 * Data Group CRC Interval.
 */
register DGRPCRCI {
        address                 0x060
        access_mode     RW
        size            2
        modes           M_CFG
}

/*
 * Data Transfer Negotiation Address
 */
register NEGOADDR {
        address                 0x060
        access_mode     RW
        modes           M_SCSI
}

/*
 * Data Transfer Negotiation Data - Period Byte
 */
register NEGPERIOD {
        address                 0x061
        access_mode     RW
        modes           M_SCSI
}

/*
 * Packetized CRC Interval
 */
register PACKCRCI {
        address                 0x062
        access_mode     RW
        size            2
        modes           M_CFG
}

/*
 * Data Transfer Negotiation Data - Offset Byte
 */
register NEGOFFSET {
        address                 0x062
        access_mode     RW
        modes           M_SCSI
}

/*
 * Data Transfer Negotiation Data - PPR Options
 */
register NEGPPROPTS {
        address                 0x063
        access_mode     RW
        modes           M_SCSI
        field   PPROPT_PACE     0x08
        field   PPROPT_QAS      0x04
        field   PPROPT_DT       0x02
        field   PPROPT_IUT      0x01
}

/*
 * Data Transfer Negotiation Data -  Connection Options
 */
register NEGCONOPTS {
        address                 0x064
        access_mode     RW
        modes           M_SCSI
        field   ENSNAPSHOT      0x40
        field   RTI_WRTDIS      0x20
        field   RTI_OVRDTRN     0x10
        field   ENSLOWCRC       0x08
        field   ENAUTOATNI      0x04
        field   ENAUTOATNO      0x02
        field   WIDEXFER        0x01
}

/*
 * Negotiation Table Annex Column Index.
 */
register ANNEXCOL {
        address                 0x065
        access_mode     RW
        modes           M_SCSI
}

register SCSCHKN {
        address                 0x066
        access_mode     RW
        modes           M_CFG
        field   STSELSKIDDIS    0x40
        field   CURRFIFODEF     0x20
        field   WIDERESEN       0x10
        field   SDONEMSKDIS     0x08
        field   DFFACTCLR       0x04
        field   SHVALIDSTDIS    0x02
        field   LSTSGCLRDIS     0x01
}

const AHD_ANNEXCOL_PER_DEV0     4
const AHD_NUM_PER_DEV_ANNEXCOLS 4
const AHD_ANNEXCOL_PRECOMP_SLEW 4
const   AHD_PRECOMP_MASK        0x07
const   AHD_PRECOMP_SHIFT       0
const   AHD_PRECOMP_CUTBACK_17  0x04
const   AHD_PRECOMP_CUTBACK_29  0x06
const   AHD_PRECOMP_CUTBACK_37  0x07
const   AHD_SLEWRATE_MASK       0x78
const   AHD_SLEWRATE_SHIFT      3
/*
 * Rev A has only a single bit (high bit of field) of slew adjustment.
 * Rev B has 4 bits.  The current default happens to be the same for both.
 */
const   AHD_SLEWRATE_DEF_REVA   0x08
const   AHD_SLEWRATE_DEF_REVB   0x08

/* Rev A does not have any amplitude setting. */
const AHD_ANNEXCOL_AMPLITUDE    6
const   AHD_AMPLITUDE_MASK      0x7
const   AHD_AMPLITUDE_SHIFT     0
const   AHD_AMPLITUDE_DEF       0x7

/*
 * Negotiation Table Annex Data Port.
 */
register ANNEXDAT {
        address                 0x066
        access_mode     RW
        modes           M_SCSI
}

/*
 * Initiator's Own Id.
 * The SCSI ID to use for Selection Out and seen during a reselection..
 */
register IOWNID {
        address                 0x067
        access_mode     RW
        modes           M_SCSI
}

/*
 * 960MHz Phase-Locked Loop Control 0
 */
register PLL960CTL0 {
        address                 0x068
        access_mode     RW
        modes           M_CFG
        field   PLL_VCOSEL      0x80
        field   PLL_PWDN        0x40
        field   PLL_NS          0x30
        field   PLL_ENLUD       0x08
        field   PLL_ENLPF       0x04
        field   PLL_DLPF        0x02
        field   PLL_ENFBM       0x01
}

/*
 * Target Own Id
 */
register TOWNID {
        address                 0x069
        access_mode     RW
        modes           M_SCSI
}

/*
 * 960MHz Phase-Locked Loop Control 1
 */
register PLL960CTL1 {
        address                 0x069
        access_mode     RW
        modes           M_CFG
        field   PLL_CNTEN       0x80
        field   PLL_CNTCLR      0x40
        field   PLL_RST         0x01
}

/*
 * Expander Signature
 */
register XSIG {
        address                 0x06A
        access_mode     RW
        modes           M_SCSI
}

/*
 * Shadow Byte Count
 */
register SHCNT {
        address                 0x068
        access_mode     RW
        size            3
        modes           M_DFF0, M_DFF1
}

/*
 * Selection Out ID
 */
register SELOID {
        address                 0x06B
        access_mode     RW
        modes           M_SCSI
}

/*
 * 960-MHz Phase-Locked Loop Test Count
 */
register PLL960CNT0 {
        address                 0x06A
        access_mode     RO
        size            2
        modes           M_CFG
}

/*
 * 400-MHz Phase-Locked Loop Control 0
 */
register PLL400CTL0 {
        address                 0x06C
        access_mode     RW
        modes           M_CFG
        field   PLL_VCOSEL      0x80
        field   PLL_PWDN        0x40
        field   PLL_NS          0x30
        field   PLL_ENLUD       0x08
        field   PLL_ENLPF       0x04
        field   PLL_DLPF        0x02
        field   PLL_ENFBM       0x01
}

/*
 * Arbitration Fairness
 */
register FAIRNESS {
        address                 0x06C
        access_mode     RW
        size            2
        modes           M_SCSI
}

/*
 * 400-MHz Phase-Locked Loop Control 1
 */
register PLL400CTL1 {
        address                 0x06D
        access_mode     RW
        modes           M_CFG
        field   PLL_CNTEN       0x80
        field   PLL_CNTCLR      0x40
        field   PLL_RST         0x01
}

/*
 * Arbitration Unfairness
 */
register UNFAIRNESS {
        address                 0x06E
        access_mode     RW
        size            2
        modes           M_SCSI
}

/*
 * 400-MHz Phase-Locked Loop Test Count
 */
register PLL400CNT0 {
        address                 0x06E
        access_mode     RO
        size            2
        modes           M_CFG
}

/*
 * SCB Page Pointer
 */
register SCBPTR {
        address                 0x0A8
        access_mode     RW
        size            2
        modes           M_DFF0, M_DFF1, M_CCHAN, M_SCSI
}

/*
 * CMC SCB Array Count
 * Number of bytes to transfer between CMC SCB memory and SCBRAM.
 * Transfers must be 8byte aligned and sized.
 */
register CCSCBACNT {
        address                 0x0AB
        access_mode     RW
        modes           M_CCHAN
}

/*
 * SCB Autopointer
 * SCB-Next Address Snooping logic.  When an SCB is transferred to
 * the card, the next SCB address to be used by the CMC array can
 * be autoloaded from that transfer.
 */
register SCBAUTOPTR {
        address                 0x0AB
        access_mode     RW
        modes           M_CFG
        field   AUSCBPTR_EN     0x80
        field   SCBPTR_ADDR     0x38
        field   SCBPTR_OFF      0x07
}

/*
 * CMC SG Ram Address Pointer
 */
register CCSGADDR {
        address                 0x0AC
        access_mode     RW
        modes           M_DFF0, M_DFF1
}

/*
 * CMC SCB RAM Address Pointer
 */
register CCSCBADDR {
        address                 0x0AC
        access_mode     RW
        modes           M_CCHAN
}

/*
 * CMC SCB Ram Back-up Address Pointer
 * Indicates the true stop location of transfers halted prior
 * to SCBHCNT going to 0.
 */
register CCSCBADR_BK {
        address                 0x0AC
        access_mode     RO
        modes           M_CFG
}

/*
 * CMC SG Control
 */
register CCSGCTL {
        address                 0x0AD
        access_mode     RW
        modes           M_DFF0, M_DFF1
        field   CCSGDONE        0x80
        field   SG_CACHE_AVAIL  0x10
        field   CCSGENACK       0x08
        mask    CCSGEN          0x0C
        field   SG_FETCH_REQ    0x02
        field   CCSGRESET       0x01
}

/*
 * CMD SCB Control
 */
register CCSCBCTL {
        address                 0x0AD
        access_mode     RW
        modes           M_CCHAN
        field   CCSCBDONE       0x80
        field   ARRDONE         0x40
        field   CCARREN         0x10
        field   CCSCBEN         0x08
        field   CCSCBDIR        0x04
        field   CCSCBRESET      0x01
}

/*
 * CMC Ram BIST
 */
register CMC_RAMBIST {
        address                 0x0AD
        access_mode     RW
        modes           M_CFG
        field   SG_ELEMENT_SIZE         0x80
        field   SCBRAMBIST_FAIL         0x40
        field   SG_BIST_FAIL            0x20
        field   SG_BIST_EN              0x10
        field   CMC_BUFFER_BIST_FAIL    0x02
        field   CMC_BUFFER_BIST_EN      0x01
}

/*
 * CMC SG RAM Data Port
 */
register CCSGRAM {
        address                 0x0B0
        access_mode     RW
        modes           M_DFF0, M_DFF1
}

/*
 * CMC SCB RAM Data Port
 */
register CCSCBRAM {
        address                 0x0B0
        access_mode     RW
        modes           M_CCHAN
}

/*
 * Flex DMA Address.
 */
register FLEXADR {
        address                 0x0B0
        access_mode     RW
        size            3
        modes           M_SCSI
}

/*
 * Flex DMA Byte Count
 */
register FLEXCNT {
        address                 0x0B3
        access_mode     RW
        size            2
        modes           M_SCSI
}

/*
 * Flex DMA Status
 */
register FLEXDMASTAT {
        address                 0x0B5
        access_mode     RW
        modes           M_SCSI
        field   FLEXDMAERR      0x02
        field   FLEXDMADONE     0x01
}

/*
 * Flex DMA Data Port
 */
register FLEXDATA {
        address                 0x0B6
        access_mode     RW
        modes           M_SCSI
}

/*
 * Board Data
 */
register BRDDAT {
        address                 0x0B8
        access_mode     RW
        modes           M_SCSI
}

/*
 * Board Control
 */
register BRDCTL {
        address                 0x0B9
        access_mode     RW
        modes           M_SCSI
        field   FLXARBACK       0x80
        field   FLXARBREQ       0x40
        field   BRDADDR         0x38
        field   BRDEN           0x04
        field   BRDRW           0x02
        field   BRDSTB          0x01
}

/*
 * Serial EEPROM Address
 */
register SEEADR {
        address                 0x0BA
        access_mode     RW
        modes           M_SCSI
}

/*
 * Serial EEPROM Data
 */
register SEEDAT {
        address                 0x0BC
        access_mode     RW
        size            2
        modes           M_SCSI
}

/*
 * Serial EEPROM Status
 */
register SEESTAT {
        address                 0x0BE
        access_mode     RO
        modes           M_SCSI
        field   INIT_DONE       0x80
        field   SEEOPCODE       0x70
        field   LDALTID_L       0x08
        field   SEEARBACK       0x04
        field   SEEBUSY         0x02
        field   SEESTART        0x01
}

/*
 * Serial EEPROM Control
 */
register SEECTL {
        address                 0x0BE
        access_mode     RW
        modes           M_SCSI
        field   SEEOPCODE       0x70 {
                SEEOP_ERASE     0x70,
                SEEOP_READ      0x60,
                SEEOP_WRITE     0x50,
        /*
         * The following four commands use special
         * addresses for differentiation.
         */
                SEEOP_ERAL      0x40
        }
        mask    SEEOP_EWEN      0x40
        mask    SEEOP_WALL      0x40
        mask    SEEOP_EWDS      0x40
        field   SEERST          0x02
        field   SEESTART        0x01
}

const SEEOP_ERAL_ADDR   0x80
const SEEOP_EWEN_ADDR   0xC0
const SEEOP_WRAL_ADDR   0x40
const SEEOP_EWDS_ADDR   0x00

/*
 * SCB Counter
 */
register SCBCNT {
        address                 0x0BF
        access_mode     RW
        modes           M_SCSI
}

/*
 * Data FIFO Write Address
 * Pointer to the next QWD location to be written to the data FIFO.
 */
register DFWADDR {
        address                 0x0C0
        access_mode     RW
        size            2
        modes           M_DFF0, M_DFF1
}

/*
 * DSP Filter Control
 */
register DSPFLTRCTL {
        address                 0x0C0
        access_mode     RW
        modes           M_CFG
        field   FLTRDISABLE     0x20
        field   EDGESENSE       0x10
        field   DSPFCNTSEL      0x0F
}

/*
 * DSP Data Channel Control
 */
register DSPDATACTL {
        address                 0x0C1
        access_mode     RW
        modes           M_CFG
        field   BYPASSENAB      0x80
        field   DESQDIS         0x10
        field   RCVROFFSTDIS    0x04
        field   XMITOFFSTDIS    0x02
}

/*
 * Data FIFO Read Address
 * Pointer to the next QWD location to be read from the data FIFO.
 */
register DFRADDR {
        address                 0x0C2
        access_mode     RW
        size            2
        modes           M_DFF0, M_DFF1
}

/*
 * DSP REQ Control
 */
register DSPREQCTL {
        address                 0x0C2
        access_mode     RW
        modes           M_CFG
        field   MANREQCTL       0xC0
        field   MANREQDLY       0x3F
}

/*
 * DSP ACK Control
 */
register DSPACKCTL {
        address                 0x0C3
        access_mode     RW
        modes           M_CFG
        field   MANACKCTL       0xC0
        field   MANACKDLY       0x3F
}

/*
 * Data FIFO Data
 * Read/Write byte port into the data FIFO.  The read and write
 * FIFO pointers increment with each read and write respectively
 * to this port.
 */
register DFDAT {
        address                 0x0C4
        access_mode     RW
        modes           M_DFF0, M_DFF1
}

/*
 * DSP Channel Select
 */
register DSPSELECT {
        address                 0x0C4
        access_mode     RW
        modes           M_CFG
        field   AUTOINCEN       0x80
        field   DSPSEL          0x1F
}

const NUMDSPS 0x14

/*
 * Write Bias Control
 */
register WRTBIASCTL {
        address                 0x0C5
        access_mode     WO
        modes           M_CFG
        field   AUTOXBCDIS      0x80
        field   XMITMANVAL      0x3F
}

/*
 * Currently the WRTBIASCTL is the same as the default.
 */
const WRTBIASCTL_HP_DEFAULT 0x0

/*
 * Receiver Bias Control
 */
register RCVRBIOSCTL {
        address                 0x0C6
        access_mode     WO
        modes           M_CFG
        field   AUTORBCDIS      0x80
        field   RCVRMANVAL      0x3F
}

/*
 * Write Bias Calculator
 */
register WRTBIASCALC {
        address                 0x0C7
        access_mode     RO
        modes           M_CFG
}

/*
 * Data FIFO Pointers
 * Contains the byte offset from DFWADDR and DWRADDR to the current
 * FIFO write/read locations.
 */
register DFPTRS {
        address                 0x0C8
        access_mode     RW
        modes           M_DFF0, M_DFF1
}

/*
 * Receiver Bias Calculator
 */
register RCVRBIASCALC {
        address                 0x0C8
        access_mode     RO
        modes           M_CFG
}

/*
 * Data FIFO Backup Read Pointer
 * Contains the data FIFO address to be restored if the last
 * data accessed from the data FIFO was not transferred successfully.
 */
register DFBKPTR {
        address                 0x0C9
        access_mode     RW
        size            2
        modes           M_DFF0, M_DFF1
}

/*
 * Skew Calculator
 */
register SKEWCALC {
        address                 0x0C9
        access_mode     RO
        modes           M_CFG
}

/*
 * Data FIFO Debug Control
 */
register DFDBCTL {
        address                         0x0CB
        access_mode     RW
        modes           M_DFF0, M_DFF1
        field   DFF_CIO_WR_RDY          0x20
        field   DFF_CIO_RD_RDY          0x10
        field   DFF_DIR_ERR             0x08
        field   DFF_RAMBIST_FAIL        0x04
        field   DFF_RAMBIST_DONE        0x02
        field   DFF_RAMBIST_EN          0x01
}

/*
 * Data FIFO Space Count
 * Number of FIFO locations that are free.
 */
register DFSCNT {
        address                 0x0CC
        access_mode     RO
        size            2
        modes           M_DFF0, M_DFF1
}

/*
 * Data FIFO Byte Count
 * Number of filled FIFO locations.
 */
register DFBCNT {
        address                 0x0CE
        access_mode     RO
        size            2
        modes           M_DFF0, M_DFF1
}

/*
 * Sequencer Program Overlay Address.
 * Low address must be written prior to high address.
 */
register OVLYADDR {
        address                 0x0D4
        modes           M_SCSI
        size            2
        access_mode     RW
}

/*
 * Sequencer Control 0
 * Error detection mode, speed configuration,
 * single step, breakpoints and program load.
 */
register SEQCTL0 {
        address                 0x0D6
        access_mode RW
        field   PERRORDIS       0x80
        field   PAUSEDIS        0x40
        field   FAILDIS         0x20
        field   FASTMODE        0x10
        field   BRKADRINTEN     0x08
        field   STEP            0x04
        field   SEQRESET        0x02
        field   LOADRAM         0x01
}

/*
 * Sequencer Control 1
 * Instruction RAM Diagnostics
 */
register SEQCTL1 {
        address                 0x0D7
        access_mode RW
        field   OVRLAY_DATA_CHK 0x08
        field   RAMBIST_DONE    0x04
        field   RAMBIST_FAIL    0x02
        field   RAMBIST_EN      0x01
}

/*
 * Sequencer Flags
 * Zero and Carry state of the ALU.
 */
register FLAGS {
        address                 0x0D8
        access_mode RO
        field   ZERO            0x02
        field   CARRY           0x01
}

/*
 * Sequencer Interrupt Control
 */ 
register SEQINTCTL {
        address                 0x0D9
        access_mode RW
        field   INTVEC1DSL      0x80
        field   INT1_CONTEXT    0x20
        field   SCS_SEQ_INT1M1  0x10
        field   SCS_SEQ_INT1M0  0x08
        field   INTMASK2        0x04
        field   INTMASK1        0x02
        field   IRET            0x01
}

/*
 * Sequencer RAM Data Port
 * Single byte window into the Sequencer Instruction Ram area starting
 * at the address specified by OVLYADDR.  To write a full instruction word,
 * simply write four bytes in succession.  OVLYADDR will increment after the
 * most significant instrution byte (the byte with the parity bit) is written.
 */
register SEQRAM {
        address                 0x0DA
        access_mode RW
}

/*
 * Sequencer Program Counter
 * Low byte must be written prior to high byte.
 */
register PRGMCNT {
        address                 0x0DE
        access_mode     RW
        size            2
}

/*
 * Accumulator
 */
register ACCUM {
        address                 0x0E0
        access_mode RW
        accumulator
}

/*
 * Source Index Register
 * Incrementing index for reads of SINDIR and the destination (low byte only)
 * for any immediate operands passed in jmp, jc, jnc, call instructions.
 * Example:
 *              mvi     0xFF    call some_routine;
 *
 *  Will set SINDEX[0] to 0xFF and call the routine "some_routine.
 */
register SINDEX {
        address                 0x0E2
        access_mode     RW
        size            2
        sindex
}

/*
 * Destination Index Register
 * Incrementing index for writes to DINDIR.  Can be used as a scratch register.
 */
register DINDEX {
        address                 0x0E4
        access_mode     RW
        size            2
}

/*
 * Break Address
 * Sequencer instruction breakpoint address address.
 */
register BRKADDR0 {
        address                 0x0E6
        access_mode     RW
}

register BRKADDR1 {
        address                 0x0E6
        access_mode     RW
        field   BRKDIS          0x80    /* Disable Breakpoint */
}

/*
 * All Ones
 * All reads to this register return the value 0xFF.
 */
register ALLONES {
        address                 0x0E8
        access_mode RO
        allones
}

/*
 * All Zeros
 * All reads to this register return the value 0.
 */
register ALLZEROS {
        address                 0x0EA
        access_mode RO
        allzeros
}

/*
 * No Destination
 * Writes to this register have no effect.
 */
register NONE {
        address                 0x0EA
        access_mode WO
        none
}

/*
 * Source Index Indirect
 * Reading this register is equivalent to reading (register_base + SINDEX) and
 * incrementing SINDEX by 1.
 */
register SINDIR {
        address                 0x0EC
        access_mode RO
}

/*
 * Destination Index Indirect
 * Writing this register is equivalent to writing to (register_base + DINDEX)
 * and incrementing DINDEX by 1.
 */
register DINDIR  {
        address                 0x0ED
        access_mode WO
}

/*
 * Function One
 * 2's complement to bit value conversion.  Write the 2's complement value
 * (0-7 only) to the top nibble and retrieve the bit indexed by that value
 * on the next read of this register. 
 * Example:
 *      Write   0x60
 *      Read    0x40
 */
register FUNCTION1 {
        address                 0x0F0
        access_mode RW
}

/*
 * Stack
 * Window into the stack.  Each stack location is 10 bits wide reported
 * low byte followed by high byte.  There are 8 stack locations.
 */
register STACK {
        address                 0x0F2
        access_mode RW
}

/*
 * Interrupt Vector 1 Address
 * Interrupt branch address for SCS SEQ_INT1 mode 0 and 1 interrupts.
 */
register INTVEC1_ADDR {
        address                 0x0F4
        access_mode     RW
        size            2
        modes           M_CFG
}

/*
 * Current Address
 * Address of the SEQRAM instruction currently executing instruction.
 */
register CURADDR {
        address                 0x0F4
        access_mode     RW
        size            2
        modes           M_SCSI
}

/*
 * Interrupt Vector 2 Address
 * Interrupt branch address for HST_SEQ_INT2 interrupts.
 */
register INTVEC2_ADDR {
        address                 0x0F6
        access_mode     RW
        size            2
        modes           M_CFG
}

/*
 * Last Address
 * Address of the SEQRAM instruction executed prior to the current instruction.
 */
register LASTADDR {
        address                 0x0F6
        access_mode     RW
        size            2
        modes           M_SCSI
}

register AHD_PCI_CONFIG_BASE {
        address                 0x100
        access_mode     RW
        size            256
        modes           M_CFG
}

/* ---------------------- Scratch RAM Offsets ------------------------- */
scratch_ram {
        /* Mode Specific */
        address                 0x0A0
        size    8
        modes   0, 1, 2, 3
        REG0 {
                size            2
        }
        REG1 {
                size            2
        }
        REG_ISR {
                size            2
        }
        SG_STATE {
                size            1
                field   SEGS_AVAIL      0x01
                field   LOADING_NEEDED  0x02
                field   FETCH_INPROG    0x04
        }
        /*
         * Track whether the transfer byte count for
         * the current data phase is odd.
         */
        DATA_COUNT_ODD {
                size            1
        }
}

scratch_ram {
        /* Mode Specific */
        address                 0x0F8
        size    8
        modes   0, 1, 2, 3
        LONGJMP_ADDR {
                size            2
        }
        ACCUM_SAVE {
                size            1
        }
}


scratch_ram {
        address                 0x100
        size    128
        modes   0, 1, 2, 3
        /*
         * Per "other-id" execution queues.  We use an array of
         * tail pointers into lists of SCBs sorted by "other-id".
         * The execution head pointer threads the head SCBs for
         * each list.
         */
        WAITING_SCB_TAILS {
                size            32
        }
        WAITING_TID_HEAD {
                size            2
        }
        WAITING_TID_TAIL {
                size            2
        }
        /*
         * SCBID of the next SCB in the new SCB queue.
         */
        NEXT_QUEUED_SCB_ADDR {
                size            4
        }
        /*
         * head of list of SCBs that have
         * completed but have not been
         * put into the qoutfifo.
         */
        COMPLETE_SCB_HEAD {
                size            2
        }
        /*
         * The list of completed SCBs in
         * the active DMA.
         */
        COMPLETE_SCB_DMAINPROG_HEAD {
                size            2
        }
        /*
         * head of list of SCBs that have
         * completed but need to be uploaded
         * to the host prior to being completed.
         */
        COMPLETE_DMA_SCB_HEAD {
                size            2
        }
        /* Counting semaphore to prevent new select-outs */
        QFREEZE_COUNT {
                size            2
        }
        /*
         * Mode to restore on legacy idle loop exit.
         */
        SAVED_MODE {
                size            1
        }
        /*
         * Single byte buffer used to designate the type or message
         * to send to a target.
         */
        MSG_OUT {
                size            1
        }
        /* Parameters for DMA Logic */
        DMAPARAMS {
                size            1
                field   PRELOADEN       0x80
                field   WIDEODD         0x40
                field   SCSIEN          0x20
                field   SDMAEN          0x10
                field   SDMAENACK       0x10
                field   HDMAEN          0x08
                field   HDMAENACK       0x08
                field   DIRECTION       0x04    /* Set indicates PCI->SCSI */
                field   FIFOFLUSH       0x02
                field   FIFORESET       0x01
        }
        SEQ_FLAGS {
                size            1
                field   NOT_IDENTIFIED          0x80
                field   NO_CDB_SENT             0x40
                field   TARGET_CMD_IS_TAGGED    0x40
                field   DPHASE                  0x20
                /* Target flags */
                field   TARG_CMD_PENDING        0x10
                field   CMDPHASE_PENDING        0x08
                field   DPHASE_PENDING          0x04
                field   SPHASE_PENDING          0x02
                field   NO_DISCONNECT           0x01
        }
        /*
         * Temporary storage for the
         * target/channel/lun of a
         * reconnecting target
         */
        SAVED_SCSIID {
                size            1
        }
        SAVED_LUN {
                size            1
        }
        /*
         * The last bus phase as seen by the sequencer. 
         */
        LASTPHASE {
                size            1
                field   CDI             0x80
                field   IOI             0x40
                field   MSGI            0x20
                field   P_BUSFREE       0x01
                enum    PHASE_MASK  CDO|IOO|MSGO {
                        P_DATAOUT       0x0,
                        P_DATAIN        IOO,
                        P_DATAOUT_DT    P_DATAOUT|MSGO,
                        P_DATAIN_DT     P_DATAIN|MSGO,
                        P_COMMAND       CDO,
                        P_MESGOUT       CDO|MSGO,
                        P_STATUS        CDO|IOO,
                        P_MESGIN        CDO|IOO|MSGO
                }
        }
        /*
         * Value to "or" into the SCBPTR[1] value to
         * indicate that an entry in the QINFIFO is valid.
         */
        QOUTFIFO_ENTRY_VALID_TAG {
                size            1
        }
        /*
         * Base address of our shared data with the kernel driver in host
         * memory.  This includes the qoutfifo and target mode
         * incoming command queue.
         */
        SHARED_DATA_ADDR {
                size            4
        }
        /*
         * Pointer to location in host memory for next
         * position in the qoutfifo.
         */
        QOUTFIFO_NEXT_ADDR {
                size            4
        }
        /*
         * Kernel and sequencer offsets into the queue of
         * incoming target mode command descriptors.  The
         * queue is full when the KERNEL_TQINPOS == TQINPOS.
         */
        KERNEL_TQINPOS {
                size            1
        }
        TQINPOS {                
                size            1
        }
        ARG_1 {
                size            1
                mask    SEND_MSG                0x80
                mask    SEND_SENSE              0x40
                mask    SEND_REJ                0x20
                mask    MSGOUT_PHASEMIS         0x10
                mask    EXIT_MSG_LOOP           0x08
                mask    CONT_MSG_LOOP_WRITE     0x04
                mask    CONT_MSG_LOOP_READ      0x03
                mask    CONT_MSG_LOOP_TARG      0x02
                alias   RETURN_1
        }
        ARG_2 {
                size            1
                alias   RETURN_2
        }

        /*
         * Snapshot of MSG_OUT taken after each message is sent.
         */
        LAST_MSG {
                size            1
        }

        /*
         * Sequences the kernel driver has okayed for us.  This allows
         * the driver to do things like prevent initiator or target
         * operations.
         */
        SCSISEQ_TEMPLATE {
                size            1
                field   MANUALCTL       0x40
                field   ENSELI          0x20
                field   ENRSELI         0x10
                field   MANUALP         0x0C
                field   ENAUTOATNP      0x02
                field   ALTSTIM         0x01
        }

        /*
         * The initiator specified tag for this target mode transaction.
         */
        INITIATOR_TAG {
                size            1
        }

        SEQ_FLAGS2 {
                size            1
                field   TARGET_MSG_PENDING        0x02
                field   SELECTOUT_QFROZEN         0x04
        }

        ALLOCFIFO_SCBPTR {
                size            2
        }

        /*
         * The maximum amount of time to wait, when interrupt coalescing
         * is enabled, before issueing a CMDCMPLT interrupt for a completed
         * command.
         */
        INT_COALESCING_TIMER {
                size            2
        }

        /*
         * The maximum number of commands to coalesce into a single interrupt.
         * Actually the 2's complement of that value to simplify sequencer
         * code.
         */
        INT_COALESCING_MAXCMDS {
                size            1
        }

        /*
         * The minimum number of commands still outstanding required
         * to continue coalescing (2's complement of value).
         */
        INT_COALESCING_MINCMDS {
                size            1
        }

        /*
         * Number of commands "in-flight".
         */
        CMDS_PENDING {
                size            2
        }

        /*
         * The count of commands that have been coalesced.
         */
        INT_COALESCING_CMDCOUNT {
                size            1
        }

        /*
         * Since the HS_MAIBOX is self clearing, copy its contents to
         * this position in scratch ram every time it changes.
         */
        LOCAL_HS_MAILBOX {
                size            1
        }
        /*
         * Target-mode CDB type to CDB length table used
         * in non-packetized operation.
         */
        CMDSIZE_TABLE {
                size            8
        }
}

/************************* Hardware SCB Definition ****************************/
scb {
        address                 0x180
        size    64
        modes   0, 1, 2, 3
        SCB_RESIDUAL_DATACNT {
                size    4
                alias   SCB_CDB_STORE
                alias   SCB_HOST_CDB_PTR
        }
        SCB_RESIDUAL_SGPTR {
                size    4
                field   SG_ADDR_MASK            0xf8    /* In the last byte */
                field   SG_OVERRUN_RESID        0x02    /* In the first byte */
                field   SG_LIST_NULL            0x01    /* In the first byte */
        }
        SCB_SCSI_STATUS {
                size    1
                alias   SCB_HOST_CDB_LEN
        }
        SCB_TARGET_PHASES {
                size    1
        }
        SCB_TARGET_DATA_DIR {
                size    1
        }
        SCB_TARGET_ITAG {
                size    1
        }
        SCB_SENSE_BUSADDR {
                /*
                 * Only valid if CDB length is less than 13 bytes or
                 * we are using a CDB pointer.  Otherwise contains
                 * the last 4 bytes of embedded cdb information.
                 */
                size    4
                alias   SCB_NEXT_COMPLETE
        }
        SCB_TAG {
                alias   SCB_FIFO_USE_COUNT
                size    2
        }
        SCB_CONTROL {
                size    1
                field   TARGET_SCB      0x80
                field   DISCENB         0x40
                field   TAG_ENB         0x20
                field   MK_MESSAGE      0x10
                field   STATUS_RCVD     0x08
                field   DISCONNECTED    0x04
                field   SCB_TAG_TYPE    0x03
        }
        SCB_SCSIID {
                size    1
                field   TID     0xF0
                field   OID     0x0F
        }
        SCB_LUN {
                size    1
                field   LID     0xff
        }
        SCB_TASK_ATTRIBUTE {
                size    1
                /*
                 * Overloaded field for non-packetized 
                 * ignore wide residue message handling.
                 */
                field   SCB_XFERLEN_ODD 0x01
        }
        SCB_CDB_LEN {
                size    1
                field   SCB_CDB_LEN_PTR 0x80    /* CDB in host memory */
        }
        SCB_TASK_MANAGEMENT {
                size    1
        }
        SCB_DATAPTR {
                size    8
        }
        SCB_DATACNT {
                /*
                 * The last byte is really the high address bits for
                 * the data address.
                 */
                size    4
                field   SG_LAST_SEG             0x80    /* In the fourth byte */
                field   SG_HIGH_ADDR_BITS       0x7F    /* In the fourth byte */
        }
        SCB_SGPTR {
                size    4
                field   SG_STATUS_VALID 0x04    /* In the first byte */
                field   SG_FULL_RESID   0x02    /* In the first byte */
                field   SG_LIST_NULL    0x01    /* In the first byte */
        }
        SCB_BUSADDR {
                size    4
        }
        SCB_NEXT {
                alias   SCB_NEXT_SCB_BUSADDR
                size    2
        }
        SCB_NEXT2 {
                size    2
        }
        SCB_SPARE {
                size    8
                alias   SCB_PKT_LUN
        }
        SCB_DISCONNECTED_LISTS {
                size    8
        }
}

/*********************************** Constants ********************************/
const MK_MESSAGE_BIT_OFFSET     4
const TID_SHIFT         4
const TARGET_CMD_CMPLT  0xfe
const INVALID_ADDR      0x80
#define SCB_LIST_NULL   0xff
#define QOUTFIFO_ENTRY_VALID_TOGGLE     0x80

const CCSGADDR_MAX      0x80
const CCSCBADDR_MAX     0x80
const CCSGRAM_MAXSEGS   16

/* Selection Timeout Timer Constants */
const STIMESEL_SHIFT    3
const STIMESEL_MIN      0x18
const STIMESEL_BUG_ADJ  0x8

/* WDTR Message values */
const BUS_8_BIT                 0x00
const BUS_16_BIT                0x01
const BUS_32_BIT                0x02

/* Offset maximums */
const MAX_OFFSET                0xfe
const MAX_OFFSET_PACED          0xfe
const MAX_OFFSET_PACED_BUG      0x7f
/*
 * Some 160 devices incorrectly accept 0xfe as a
 * sync offset, but will overrun this value.  Limit
 * to 0x7f for speed lower than U320 which will
 * avoid the persistent sync offset overruns.
 */
const MAX_OFFSET_NON_PACED      0x7f
const HOST_MSG                  0xff

/*
 * The size of our sense buffers.
 * Sense buffer mapping can be handled in either of two ways.
 * The first is to allocate a dmamap for each transaction.
 * Depending on the architecture, dmamaps can be costly. The
 * alternative is to statically map the buffers in much the same
 * way we handle our scatter gather lists.  The driver implements
 * the later.
 */
const AHD_SENSE_BUFSIZE         256

/* Target mode command processing constants */
const CMD_GROUP_CODE_SHIFT      0x05

const STATUS_BUSY               0x08
const STATUS_QUEUE_FULL         0x28
const STATUS_PKT_SENSE          0xFF
const TARGET_DATA_IN            1

const SCB_TRANSFER_SIZE_FULL_LUN        56
const SCB_TRANSFER_SIZE_1BYTE_LUN       48
/* PKT_OVERRUN_BUFSIZE must be a multiple of 256 less than 64K */
const PKT_OVERRUN_BUFSIZE       512

/*
 * Timer parameters.
 */
const AHD_TIMER_US_PER_TICK     25
const AHD_TIMER_MAX_TICKS       0xFFFF
const AHD_TIMER_MAX_US          (AHD_TIMER_MAX_TICKS * AHD_TIMER_US_PER_TICK)

/*
 * Downloaded (kernel inserted) constants
 */
const SG_PREFETCH_CNT download
const SG_PREFETCH_CNT_LIMIT download
const SG_PREFETCH_ALIGN_MASK download
const SG_PREFETCH_ADDR_MASK download
const SG_SIZEOF download
const PKT_OVERRUN_BUFOFFSET download
const SCB_TRANSFER_SIZE download

/*
 * BIOS SCB offsets
 */
const NVRAM_SCB_OFFSET  0x2C

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.