Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  aic79xx.reg   Sprache: unbekannt

 
/*
 * Aic79xx register and scratch ram definitions.
 *
 * Copyright (c) 1994-2001, 2004 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: //depot/aic7xxx/aic7xxx/aic79xx.reg#77 $"

/*
 * 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 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;    \
 }

/*
 * Registers marked "dont_generate_debug_code" are not (yet) referenced
 * from the driver code, and this keyword inhibit generation
 * of debug code for them.
 *
 * REG_PRETTY_PRINT config will complain if dont_generate_debug_code
 * is added to the register which is referenced in the driver.
 * Unreferenced register with no dont_generate_debug_code will result
 * in dead code. No warning is issued.
 */

/*
 * 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
 dont_generate_debug_code
}

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
 }
 dont_generate_debug_code
}

/*
 * Clear Host Interrupt
 */
register CLRINT {
 address   0x003
 access_mode WO
 count  19
 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
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
 count  12
 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
 dont_generate_debug_code
}

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

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

/*
 * 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 Interrupt Status
 */
register SEQINTSTAT {
 address   0x00C
 count  1
 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
 dont_generate_debug_code
}

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

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

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

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

/*
 * 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
 }
 dont_generate_debug_code
}

/*
 * 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
 count  11
 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
 count  1
 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 */
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

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
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

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

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

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

/*
 * Data FIFO Threshold
 */
register DFF_THRSH {
 address   0x088
 access_mode RW
 modes  M_CFG
 count  1
 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
 }
 dont_generate_debug_code
}

/*
 * 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 Receive Message 0
 */
register CMCRXMSG0 {
 address   0x090
 access_mode RO
 modes  M_CCHAN
 field  CDNUM 0xF8
 field  CFNUM 0x07
}

/*
 * Overlay Receive 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 Receive Message 1
 */
register CMCRXMSG1 {
 address   0x091
 access_mode RO
 modes  M_CCHAN
 field CBNUM  0xFF
}

/*
 * Overlay Receive 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 Receive Message 2
 */
register CMCRXMSG2 {
 address   0x092
 access_mode RO
 modes  M_CCHAN
 field MINDEX  0xFF
}

/*
 * Overlay Receive 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 Receive Message 3
 */
register CMCRXMSG3 {
 address   0x093
 access_mode RO
 modes  M_CCHAN
 field MCLASS  0x0F
}

/*
 * Overlay Receive 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
 count  1
 field SERRPULSE 0x80
 field UNEXPSCIEN 0x20
 field SPLTSMADIS 0x10
 field SPLTSTADIS 0x08
 field SRSPDPEEN 0x04
 field TSCSERREN 0x02
 field CMPABCDIS 0x01
 dont_generate_debug_code
}

/*
 * 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
 count  2
 field STAETERM 0x80
 field SCBCERR  0x40
 field SCADERR  0x20
 field SCDATBUCKET 0x10
 field CNTNOTCMPLT 0x08
 field RXOVRUN  0x04
 field RXSCEMSG 0x02
 field RXSPLTRSP 0x01
 dont_generate_debug_code
}

/*
 * 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
 count  2
 field RXDATABUCKET 0x01
 dont_generate_debug_code
}

/*
 * 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
 count  2
 field STAETERM 0x80
 field SCBCERR  0x40
 field SCADERR  0x20
 field SCDATBUCKET 0x10
 field CNTNOTCMPLT 0x08
 field RXOVRUN  0x04
 field RXSCEMSG 0x02
 field RXSPLTRSP 0x01
 dont_generate_debug_code
}

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

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

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

/*
 * 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
 count  5
 field DPE  0x80
 field SSE  0x40
 field STA  0x08
 field TWATERR  0x02
 dont_generate_debug_code
}

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

/*
 * 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
 count  2
 dont_generate_debug_code
}

/*
 * 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
 count  1
 dont_generate_debug_code
}

/*
 * 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
 count  1
 dont_generate_debug_code
}

/*
 * 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
 count  1
 dont_generate_debug_code
}

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

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

/*
 * 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
 count  1
 dont_generate_debug_code
}

/*
 * 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
 count  1
 dont_generate_debug_code
}

/*
 * 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
 count  2
 mask  ILUNLEN 0x0F
 mask  TLUNLEN 0xF0
 dont_generate_debug_code
}
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
 count  1
 dont_generate_debug_code
}

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

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

/*
 * 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
 count  2
 field PCI2PCI  0x04
 field SINGLECMD 0x02
 field ABORTPENDING 0x01
 dont_generate_debug_code
}

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

/*
 * 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
 count  8
 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
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
 }
 dont_generate_debug_code
}

/*
 * SCSI Control Signal In
 */
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
 count  2
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
 count  2
 field CLKOUT  0x80
 field TARGID  0x0F
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * Option Mode
 */
register OPTIONMODE {
 address   0x04A
 access_mode RW
 modes  M_CFG
 count  4
 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
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
 count  8
 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
 dont_generate_debug_code
}

/*
 * 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 */
 dont_generate_debug_code
}

/*
 * 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
 count  3
 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
 count  6
 dont_generate_debug_code
}

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

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

/*
 * LQI Manager Status
 */
register LQISTAT0 {
 address   0x050
 access_mode RO
 modes  M_DFF0, M_DFF1, M_SCSI
 count  2
 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
 count  1
 field CLRLQIATNQAS 0x20
 field CLRLQICRCT1 0x10
 field CLRLQICRCT2 0x08
 field CLRLQIBADLQT 0x04
 field CLRLQIATNLQ 0x02
 field CLRLQIATNCMD 0x01
 dont_generate_debug_code
}

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

/*
 * LQI Manager Status 1
 */
register LQISTAT1 {
 address   0x051
 access_mode RO
 modes  M_DFF0, M_DFF1, M_SCSI
 count  3
 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
 count  4
 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
 dont_generate_debug_code
}

/*
 * LQI Manager Interrupt Mode 1
 */
register LQIMODE1 {
 address   0x051
 access_mode RW
 modes  M_CFG
 count  4
 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 */
 dont_generate_debug_code
}

/*
 * 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
 count  3
 field NTRAMPERR 0x02
 field OSRAMPERR 0x01
}

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

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

/*
 * LQO Manager Status 0
 */
register LQOSTAT0 {
 address   0x054
 access_mode RO
 modes  M_DFF0, M_DFF1, M_SCSI
 count  2
 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
 count  3
 field CLRLQOTARGSCBPERR 0x10
 field CLRLQOSTOPT2  0x08
 field CLRLQOATNLQ  0x04
 field CLRLQOATNPKT  0x02
 field CLRLQOTCRC  0x01
 dont_generate_debug_code
}

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

/*
 * 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
 count  7
 field CLRLQOINITSCBPERR 0x10
 field CLRLQOSTOPI2  0x08
 field CLRLQOBADQAS  0x04
 field CLRLQOBUSFREE  0x02
 field CLRLQOPHACHGINPKT 0x01
 dont_generate_debug_code
}

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

/*
 * 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
 count  2
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * LQO SCSI Control
 * (Rev B only.)
 */
register LQOSCSCTL {
 address   0x05A
 access_mode RW
 size  1
 modes  M_CFG
 count  1
 field  LQOH2A_VERSION 0x80
 field  LQOBUSETDLY 0x40
 field  LQONOHOLDLACK 0x02
 field  LQONOCHKOVER 0x01
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
}

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

/*
 * 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
 dont_generate_debug_code
}

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

/*
 * 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
 count  1
 dont_generate_debug_code
}

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

/*
 * 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
 dont_generate_debug_code
}

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

/*
 * SCSI Check
 * (Rev. B only)
 */
register SCSCHKN {
 address   0x066
 access_mode RW
 modes  M_CFG
 count  1
 field BIDICHKDIS 0x80
 field STSELSKIDDIS 0x40
 field CURRFIFODEF 0x20
 field WIDERESEN 0x10
 field SDONEMSKDIS 0x08
 field DFFACTCLR 0x04
 field SHVALIDSTDIS 0x02
 field LSTSGCLRDIS 0x01
 dont_generate_debug_code
}

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
 count  3
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
 count  2
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
 count  1
 field AUSCBPTR_EN 0x80
 field SCBPTR_ADDR 0x38
 field SCBPTR_OFF 0x07
 dont_generate_debug_code
}

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

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

/*
 * 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
 dont_generate_debug_code
}

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

/*
 * 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
 count  2
 dont_generate_debug_code
}

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

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

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

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

/*
 * Serial EEPROM Control
 */
register SEECTL {
 address   0x0BE
 access_mode RW
 modes  M_SCSI
 count  4
 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
 dont_generate_debug_code
}

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
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
 count  3
 field BYPASSENAB 0x80
 field DESQDIS  0x10
 field RCVROFFSTDIS 0x04
 field XMITOFFSTDIS 0x02
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

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

const NUMDSPS 0x14

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

/*
 * 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
 count  11
 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
 count  23
 field ZERO  0x02
 field CARRY  0x01
 dont_generate_debug_code
}

/*
 * 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
 count  2
 dont_generate_debug_code
}

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

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

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

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

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

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
 dont_generate_debug_code
}

/*
 * 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
 count  1
 dont_generate_debug_code
}

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

/*
 * 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
 count  1
 dont_generate_debug_code
}

/*
 * 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
  dont_generate_debug_code
 }
 REG1 {
  size  2
 }
 REG_ISR {
  size  2
  dont_generate_debug_code
 }
 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
  dont_generate_debug_code
 }
 ACCUM_SAVE {
  size  1
  dont_generate_debug_code
 }
}


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
  dont_generate_debug_code
 }
 WAITING_TID_HEAD {
  size  2
  dont_generate_debug_code
 }
 WAITING_TID_TAIL {
  size  2
  dont_generate_debug_code
 }
 /*
  * SCBID of the next SCB in the new SCB queue.
  */
 NEXT_QUEUED_SCB_ADDR {
  size  4
  dont_generate_debug_code
 }
 /*
  * head of list of SCBs that have
  * completed but have not been
  * put into the qoutfifo.
  */
 COMPLETE_SCB_HEAD {
  size  2
  dont_generate_debug_code
 }
 /*
  * The list of completed SCBs in
  * the active DMA.
  */
 COMPLETE_SCB_DMAINPROG_HEAD {
  size  2
  dont_generate_debug_code
 }
 /*
  * 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
  dont_generate_debug_code
 }
 /*
  * tail of list of SCBs that have
  * completed but need to be uploaded
  * to the host prior to being completed.
  */
 COMPLETE_DMA_SCB_TAIL {
  size  2
  dont_generate_debug_code
 }
 /*
  * head of list of SCBs that have
  * been uploaded to the host, but cannot
  * be completed until the QFREEZE is in
  * full effect (i.e. no selections pending).
  */
 COMPLETE_ON_QFREEZE_HEAD {
  size  2
  dont_generate_debug_code
 }
 /*
  * Counting semaphore to prevent new select-outs
  * The queue is frozen so long as the sequencer
  * and kernel freeze counts differ.
  */
 QFREEZE_COUNT {
  size  2
 }
 KERNEL_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
  dont_generate_debug_code
 }
 /* Parameters for DMA Logic */
 DMAPARAMS {
  size  1
  count  8
  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
  dont_generate_debug_code
 }
 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
  dont_generate_debug_code
 }
 SAVED_LUN {
  size  1
  dont_generate_debug_code
 }
 /*
  * 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
--> --------------------

--> maximum size reached

--> --------------------

[ Dauer der Verarbeitung: 0.20 Sekunden  (vorverarbeitet)  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge