/*
 * Aic7xxx register and scratch ram definitions.
 *
 * Copyright (c) 1994-2001 Justin T. Gibbs.
 * Copyright (c) 2000-2001 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/aic7xxx.reg#40 $"

/*
 * This file is processed by the aic7xxx_asm utility for use in assembling
 * firmware for the aic7xxx family of SCSI host adapters as well as to generate
 * a C header file for use in the kernel portion of the Aic7xxx driver.
 *
 * All page numbers refer to the Adaptec AIC-7770 Data Book available from
 * Adaptec's Technical Documents Department 1-800-934-2766
 */

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

/*
 * SCSI Sequence Control (p. 3-11).
 * Each bit, when set starts a specific SCSI sequence on the bus
 */
register SCSISEQ {
	address			0x000
	access_mode RW
	field	TEMODE		0x80
	field	ENSELO		0x40
	field	ENSELI		0x20
	field	ENRSELI		0x10
	field	ENAUTOATNO	0x08
	field	ENAUTOATNI	0x04
	field	ENAUTOATNP	0x02
	field	SCSIRSTO	0x01
}

/*
 * SCSI Transfer Control 0 Register (pp. 3-13).
 * Controls the SCSI module data path.
 */
register SXFRCTL0 {
	address			0x001
	access_mode RW
	field	DFON		0x80
	field	DFPEXP		0x40
	field	FAST20		0x20
	field	CLRSTCNT	0x10
	field	SPIOEN		0x08
	field	SCAMEN		0x04
	field	CLRCHN		0x02
}

/*
 * SCSI Transfer Control 1 Register (pp. 3-14,15).
 * Controls the SCSI module data path.
 */
register SXFRCTL1 {
	address			0x002
	access_mode RW
	field	BITBUCKET	0x80
	field	SWRAPEN		0x40
	field	ENSPCHK		0x20
	mask	STIMESEL	0x18
	field	ENSTIMER	0x04
	field	ACTNEGEN	0x02
	field	STPWEN		0x01	/* Powered Termination */
	dont_generate_debug_code
}

/*
 * SCSI Control Signal Read Register (p. 3-15).
 * Reads the actual state of the SCSI bus pins
 */
register SCSISIGI {
	address			0x003
	access_mode RO
	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
 */
	mask	PHASE_MASK	CDI|IOI|MSGI
	mask	P_DATAOUT	0x00
	mask	P_DATAIN	IOI
	mask	P_DATAOUT_DT	P_DATAOUT|MSGI
	mask	P_DATAIN_DT	P_DATAIN|MSGI
	mask	P_COMMAND	CDI
	mask	P_MESGOUT	CDI|MSGI
	mask	P_STATUS	CDI|IOI
	mask	P_MESGIN	CDI|IOI|MSGI
}

/*
 * SCSI Control Signal Write Register (p. 3-16).
 * Writing to this register modifies the control signals on the bus.  Only
 * those signals that are allowed in the current mode (Initiator/Target) are
 * asserted.
 */
register SCSISIGO {
	address			0x003
	access_mode WO
	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
 */
	mask	PHASE_MASK	CDI|IOI|MSGI
	mask	P_DATAOUT	0x00
	mask	P_DATAIN	IOI
	mask	P_COMMAND	CDI
	mask	P_MESGOUT	CDI|MSGI
	mask	P_STATUS	CDI|IOI
	mask	P_MESGIN	CDI|IOI|MSGI
	dont_generate_debug_code
}

/* 
 * SCSI Rate Control (p. 3-17).
 * Contents of this register determine the Synchronous SCSI data transfer
 * rate and the maximum synchronous Req/Ack offset.  An offset of 0 in the
 * SOFS (3:0) bits disables synchronous data transfers.  Any offset value
 * greater than 0 enables synchronous transfers.
 */
register SCSIRATE {
	address			0x004
	access_mode RW
	field	WIDEXFER	0x80		/* Wide transfer control */
	field	ENABLE_CRC	0x40		/* CRC for D-Phases */
	field	SINGLE_EDGE	0x10		/* Disable DT Transfers */
	mask	SXFR		0x70		/* Sync transfer rate */
	mask	SXFR_ULTRA2	0x0f		/* Sync transfer rate */
	mask	SOFS		0x0f		/* Sync offset */
}

/*
 * SCSI ID (p. 3-18).
 * Contains the ID of the board and the current target on the
 * selected channel.
 */
register SCSIID	{
	address			0x005
	access_mode RW
	mask	TID		0xf0		/* Target ID mask */
	mask	TWIN_TID	0x70
	field	TWIN_CHNLB	0x80
	mask	OID		0x0f		/* Our ID mask */
	/*
	 * SCSI Maximum Offset (p. 4-61 aic7890/91 Data Book)
	 * The aic7890/91 allow an offset of up to 127 transfers in both wide
	 * and narrow mode.
	 */
	alias	SCSIOFFSET
	mask	SOFS_ULTRA2	0x7f		/* Sync offset U2 chips */
	dont_generate_debug_code
}

/*
 * SCSI Latched Data (p. 3-19).
 * Read/Write latches used to transfer data on the SCSI bus during
 * Automatic or Manual PIO mode.  SCSIDATH can be used for the
 * upper byte of a 16bit wide asynchronouse data phase transfer.
 */
register SCSIDATL {
	address			0x006
	access_mode RW
	dont_generate_debug_code
}

register SCSIDATH {
	address			0x007
	access_mode RW
}

/*
 * SCSI Transfer Count (pp. 3-19,20)
 * These registers count down the number of bytes transferred
 * across the SCSI bus.  The counter is decremented only once
 * the data has been safely transferred.  SDONE in SSTAT0 is
 * set when STCNT goes to 0
 */ 
register STCNT {
	address			0x008
	size	3
	access_mode RW
	dont_generate_debug_code
}

/* ALT_MODE registers (Ultra2 and Ultra160 chips) */
register SXFRCTL2 {
	address			0x013
	access_mode RW
	field	AUTORSTDIS	0x10
	field	CMDDMAEN	0x08
	mask	ASYNC_SETUP	0x07
}

/* ALT_MODE register on Ultra160 chips */
register OPTIONMODE {
	address			0x008
	access_mode RW
	count		2
	field	AUTORATEEN		0x80
	field	AUTOACKEN		0x40
	field	ATNMGMNTEN		0x20
	field	BUSFREEREV		0x10
	field	EXPPHASEDIS		0x08
	field	SCSIDATL_IMGEN		0x04
	field	AUTO_MSGOUT_DE		0x02
	field	DIS_MSGIN_DUALEDGE	0x01
	mask	OPTIONMODE_DEFAULTS	AUTO_MSGOUT_DE|DIS_MSGIN_DUALEDGE
	dont_generate_debug_code
}

/* ALT_MODE register on Ultra160 chips */
register TARGCRCCNT {
	address			0x00a
	size	2
	access_mode RW
	count		2
	dont_generate_debug_code
}

/*
 * Clear SCSI Interrupt 0 (p. 3-20)
 * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT0.
 */
register CLRSINT0 {
	address			0x00b
	access_mode WO
	field	CLRSELDO	0x40
	field	CLRSELDI	0x20
	field	CLRSELINGO	0x10
	field	CLRSWRAP	0x08
	field	CLRIOERR	0x08	/* Ultra2 Only */
	field	CLRSPIORDY	0x02
	dont_generate_debug_code
}

/*
 * SCSI Status 0 (p. 3-21)
 * Contains one set of SCSI Interrupt codes
 * These are most likely of interest to the sequencer
 */
register SSTAT0	{
	address			0x00b
	access_mode RO
	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	SWRAP		0x08	/* 24bit counter wrap */
	field	IOERR		0x08	/* LVD Tranceiver mode changed */
	field	SDONE		0x04	/* STCNT = 0x000000 */
	field	SPIORDY		0x02	/* SCSI PIO Ready */
	field	DMADONE		0x01	/* DMA transfer completed */
}

/*
 * Clear SCSI Interrupt 1 (p. 3-23)
 * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT1.
 */
register CLRSINT1 {
	address			0x00c
	access_mode WO
	field	CLRSELTIMEO	0x80
	field	CLRATNO		0x40
	field	CLRSCSIRSTI	0x20
	field	CLRBUSFREE	0x08
	field	CLRSCSIPERR	0x04
	field	CLRPHASECHG	0x02
	field	CLRREQINIT	0x01
	dont_generate_debug_code
}

/*
 * SCSI Status 1 (p. 3-24)
 */
register SSTAT1	{
	address			0x00c
	access_mode RO
	field	SELTO		0x80
	field	ATNTARG 	0x40
	field	SCSIRSTI	0x20
	field	PHASEMIS	0x10
	field	BUSFREE		0x08
	field	SCSIPERR	0x04
	field	PHASECHG	0x02
	field	REQINIT		0x01
}

/*
 * SCSI Status 2 (pp. 3-25,26)
 */
register SSTAT2 {
	address			0x00d
	access_mode RO
	field	OVERRUN		0x80
	field	SHVALID		0x40	/* Shaddow Layer non-zero */
	field	EXP_ACTIVE	0x10	/* SCSI Expander Active */
	field	CRCVALERR	0x08	/* CRC doesn't match (U3 only) */
	field	CRCENDERR	0x04	/* No terminal CRC packet (U3 only) */
	field	CRCREQERR	0x02	/* Illegal CRC packet req (U3 only) */
	field	DUAL_EDGE_ERR	0x01	/* Incorrect data phase (U3 only) */
	mask	SFCNT		0x1f
}

/*
 * SCSI Status 3 (p. 3-26)
 */
register SSTAT3 {
	address			0x00e
	access_mode RO
	count		2
	mask	SCSICNT		0xf0
	mask	OFFCNT		0x0f
	mask	U2OFFCNT	0x7f
}

/*
 * SCSI ID for the aic7890/91 chips
 */
register SCSIID_ULTRA2 {
	address			0x00f
	access_mode RW
	mask	TID		0xf0		/* Target ID mask */
	mask	OID		0x0f		/* Our ID mask */
	dont_generate_debug_code
}

/*
 * SCSI Interrupt Mode 1 (p. 3-28)
 * Setting any bit will enable the corresponding function
 * in SIMODE0 to interrupt via the IRQ pin.
 */
register SIMODE0 {
	address			0x010
	access_mode RW
	count		2
	field	ENSELDO		0x40
	field	ENSELDI		0x20
	field	ENSELINGO	0x10
	field	ENSWRAP		0x08
	field	ENIOERR		0x08	/* LVD Tranceiver mode changes */
	field	ENSDONE		0x04
	field	ENSPIORDY	0x02
	field	ENDMADONE	0x01
}

/*
 * SCSI Interrupt Mode 1 (pp. 3-28,29)
 * Setting any bit will enable the corresponding function
 * in SIMODE1 to interrupt via the IRQ pin.
 */
register SIMODE1 {
	address			0x011
	access_mode RW
	field	ENSELTIMO	0x80
	field	ENATNTARG	0x40
	field	ENSCSIRST	0x20
	field	ENPHASEMIS	0x10
	field	ENBUSFREE	0x08
	field	ENSCSIPERR	0x04
	field	ENPHASECHG	0x02
	field	ENREQINIT	0x01
}

/*
 * SCSI Data Bus (High) (p. 3-29)
 * This register reads data on the SCSI Data bus directly.
 */
register SCSIBUSL {
	address			0x012
	access_mode RW
}

register SCSIBUSH {
	address			0x013
	access_mode RW
}

/*
 * SCSI/Host Address (p. 3-30)
 * These registers hold the host address for the byte about to be
 * transferred on the SCSI bus.  They are counted up in the same
 * manner as STCNT is counted down.  SHADDR should always be used
 * to determine the address of the last byte transferred since HADDR
 * can be skewed by write ahead.
 */
register SHADDR {
	address			0x014
	size	4
	access_mode RO
	dont_generate_debug_code
}

/*
 * Selection Timeout Timer (p. 3-30)
 */
register SELTIMER {
	address			0x018
	access_mode RW
	count		1
	field	STAGE6		0x20
	field	STAGE5		0x10
	field	STAGE4		0x08
	field	STAGE3		0x04
	field	STAGE2		0x02
	field	STAGE1		0x01
	alias	TARGIDIN
	dont_generate_debug_code
}

/*
 * Selection/Reselection ID (p. 3-31)
 * 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			0x019
	access_mode RW
	mask	SELID_MASK	0xf0
	field	ONEBIT		0x08
	dont_generate_debug_code
}

register SCAMCTL {
	address			0x01a
	access_mode RW
	field	ENSCAMSELO	0x80
	field	CLRSCAMSELID	0x40
	field	ALTSTIM		0x20
	field	DFLTTID		0x10
	mask	SCAMLVL		0x03
}

/*
 * Target Mode Selecting in ID bitmask (aic7890/91/96/97)
 */
register TARGID {
	address			0x01b
	size			2
	access_mode RW
	count		14
	dont_generate_debug_code
}

/*
 * Serial Port I/O Cabability register (p. 4-95 aic7860 Data Book)
 * Indicates if external logic has been attached to the chip to
 * perform the tasks of accessing a serial eeprom, testing termination
 * strength, and performing cable detection.  On the aic7860, most of
 * these features are handled on chip, but on the aic7855 an attached
 * aic3800 does the grunt work.
 */
register SPIOCAP {
	address			0x01b
	access_mode RW
	count		10
	field	SOFT1		0x80
	field	SOFT0		0x40
	field	SOFTCMDEN	0x20	
	field	EXT_BRDCTL	0x10	/* External Board control */
	field	SEEPROM		0x08	/* External serial eeprom logic */
	field	EEPROM		0x04	/* Writable external BIOS ROM */
	field	ROM		0x02	/* Logic for accessing external ROM */
	field	SSPIOCPS	0x01	/* Termination and cable detection */
	dont_generate_debug_code
}

register BRDCTL	{
	address			0x01d
	count		11
	field	BRDDAT7		0x80
	field	BRDDAT6		0x40
	field	BRDDAT5		0x20
	field	BRDSTB		0x10
	field	BRDCS		0x08
	field	BRDRW		0x04
	field	BRDCTL1		0x02
	field	BRDCTL0		0x01
	/* 7890 Definitions */
	field	BRDDAT4		0x10
	field	BRDDAT3		0x08
	field	BRDDAT2		0x04
	field	BRDRW_ULTRA2	0x02
	field	BRDSTB_ULTRA2	0x01
	dont_generate_debug_code
}

/*
 * Serial EEPROM Control (p. 4-92 in 7870 Databook)
 * Controls the reading and writing of an external serial 1-bit
 * EEPROM Device.  In order to access the serial EEPROM, you must
 * first set the SEEMS bit that generates a request to the memory
 * port for access to the serial EEPROM device.  When the memory
 * port is not busy servicing another request, it reconfigures
 * to allow access to the serial EEPROM.  When this happens, SEERDY
 * gets set high to verify that the memory port access has been
 * granted.  
 *
 * After successful arbitration for the memory port, the SEECS bit of 
 * the SEECTL register is connected to the chip select.  The SEECK, 
 * SEEDO, and SEEDI are connected to the clock, data out, and data in 
 * lines respectively.  The SEERDY bit of SEECTL is useful in that it 
 * gives us an 800 nsec timer.  After a write to the SEECTL register, 
 * the SEERDY goes high 800 nsec later.  The one exception to this is 
 * when we first request access to the memory port.  The SEERDY goes 
 * high to signify that access has been granted and, for this case, has 
 * no implied timing.
 *
 * See 93cx6.c for detailed information on the protocol necessary to 
 * read the serial EEPROM.
 */
register SEECTL {
	address			0x01e
	count		11
	field	EXTARBACK	0x80
	field	EXTARBREQ	0x40
	field	SEEMS		0x20
	field	SEERDY		0x10
	field	SEECS		0x08
	field	SEECK		0x04
	field	SEEDO		0x02
	field	SEEDI		0x01
	dont_generate_debug_code
}
/*
 * SCSI Block Control (p. 3-32)
 * Controls Bus type and channel selection.  In a twin channel configuration
 * addresses 0x00-0x1e are gated to the appropriate channel based on this
 * register.  SELWIDE allows for the coexistence of 8bit and 16bit devices
 * on a wide bus.
 */
register SBLKCTL {
	address			0x01f
	access_mode RW
	field	DIAGLEDEN	0x80	/* Aic78X0 only */
	field	DIAGLEDON	0x40	/* Aic78X0 only */
	field	AUTOFLUSHDIS	0x20
	field	SELBUSB		0x08
	field	ENAB40		0x08	/* LVD transceiver active */
	field	ENAB20		0x04	/* SE/HVD transceiver active */
	field	SELWIDE		0x02
	field	XCVR		0x01	/* External transceiver active */
}

/*
 * Sequencer Control (p. 3-33)
 * Error detection mode and speed configuration
 */
register SEQCTL {
	address			0x060
	access_mode RW
	count		15
	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 RAM Data (p. 3-34)
 * Single byte window into the Scratch Ram area starting at the address
 * specified by SEQADDR0 and SEQADDR1.  To write a full word, simply write
 * four bytes in succession.  The SEQADDRs will increment after the most
 * significant byte is written
 */
register SEQRAM {
	address			0x061
	access_mode RW
	count		2
	dont_generate_debug_code
}

/*
 * Sequencer Address Registers (p. 3-35)
 * Only the first bit of SEQADDR1 holds addressing information
 */
register SEQADDR0 {
	address			0x062
	access_mode RW
	dont_generate_debug_code
}

register SEQADDR1 {
	address			0x063
	access_mode RW
	count		8
	mask	SEQADDR1_MASK	0x01
	dont_generate_debug_code
}

/*
 * Accumulator
 * We cheat by passing arguments in the Accumulator up to the kernel driver
 */
register ACCUM {
	address			0x064
	access_mode RW
	accumulator
	dont_generate_debug_code
}

register SINDEX	{
	address			0x065
	access_mode RW
	sindex
	dont_generate_debug_code
}

register DINDEX {
	address			0x066
	access_mode RW
	dont_generate_debug_code
}

register ALLONES {
	address			0x069
	access_mode RO
	allones
	dont_generate_debug_code
}

register ALLZEROS {
	address			0x06a
	access_mode RO
	allzeros
	dont_generate_debug_code
}

register NONE {
	address			0x06a
	access_mode WO
	none
	dont_generate_debug_code
}

register FLAGS {
	address			0x06b
	access_mode RO
	count		18
	field	ZERO		0x02
	field	CARRY		0x01
	dont_generate_debug_code
}

register SINDIR	{
	address			0x06c
	access_mode RO
	dont_generate_debug_code
}

register DINDIR	 {
	address			0x06d
	access_mode WO
	dont_generate_debug_code
}

register FUNCTION1 {
	address			0x06e
	access_mode RW
}

register STACK {
	address			0x06f
	access_mode RO
	count		5
	dont_generate_debug_code
}

const	STACK_SIZE	4

/*
 * Board Control (p. 3-43)
 */
register BCTL {
	address			0x084
	access_mode RW
	field	ACE		0x08
	field	ENABLE		0x01
}

/*
 * On the aic78X0 chips, Board Control is replaced by the DSCommand
 * register (p. 4-64)
 */
register DSCOMMAND0 {
	address			0x084
	access_mode RW
	count		7
	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 */
	/* aic7890/91/96/97 only */
	field	INTSCBRAMSEL	0x08	/* Internal SCB RAM Select */
	field	RAMPS		0x04	/* External SCB RAM Present */
	field	USCBSIZE32	0x02	/* Use 32byte SCB Page Size */
	field	CIOPARCKEN	0x01	/* Internal bus parity error enable */
	dont_generate_debug_code
}

register DSCOMMAND1 {
	address			0x085
	access_mode RW
	mask	DSLATT		0xfc	/* PCI latency timer (non-ultra2) */
	field	HADDLDSEL1	0x02	/* Host Address Load Select Bits */
	field	HADDLDSEL0	0x01
	dont_generate_debug_code
}

/*
 * Bus On/Off Time (p. 3-44) aic7770 only
 */
register BUSTIME {
	address			0x085
	access_mode RW
	count		2
	mask	BOFF		0xf0
	mask	BON		0x0f
	dont_generate_debug_code
}

/*
 * Bus Speed (p. 3-45) aic7770 only
 */
register BUSSPD {
	address			0x086
	access_mode RW
	count		2
	mask	DFTHRSH		0xc0
	mask	STBOFF		0x38
	mask	STBON		0x07
	mask	DFTHRSH_100	0xc0
	mask	DFTHRSH_75	0x80
	dont_generate_debug_code
}

/* aic7850/55/60/70/80/95 only */
register DSPCISTATUS {
	address			0x086
	count		4
	mask	DFTHRSH_100	0xc0
	dont_generate_debug_code
}

/* aic7890/91/96/97 only */
register HS_MAILBOX {
	address			0x086
	mask	HOST_MAILBOX	0xF0
	mask	SEQ_MAILBOX	0x0F
	mask	HOST_TQINPOS	0x80	/* Boundary at either 0 or 128 */
	dont_generate_debug_code
}

const	HOST_MAILBOX_SHIFT	4
const	SEQ_MAILBOX_SHIFT	0

/*
 * Host Control (p. 3-47) R/W
 * Overall host control of the device.
 */
register HCNTRL {
	address			0x087
	access_mode RW
	count		14
	field	POWRDN		0x40
	field	SWINT		0x10
	field	IRQMS		0x08
	field	PAUSE		0x04
	field	INTEN		0x02
	field	CHIPRST		0x01
	field	CHIPRSTACK	0x01
	dont_generate_debug_code
}

/*
 * Host Address (p. 3-48)
 * This register contains the address of the byte about
 * to be transferred across the host bus.
 */
register HADDR {
	address			0x088
	size	4
	access_mode RW
	dont_generate_debug_code
}

register HCNT {
	address			0x08c
	size	3
	access_mode RW
	dont_generate_debug_code
}

/*
 * SCB Pointer (p. 3-49)
 * Gate one of the SCBs into the SCBARRAY window.
 */
register SCBPTR {
	address			0x090
	access_mode RW
	dont_generate_debug_code
}

/*
 * Interrupt Status (p. 3-50)
 * Status for system interrupts
 */
register INTSTAT {
	address			0x091
	access_mode RW
	field	BRKADRINT 0x08
	field	SCSIINT	  0x04
	field	CMDCMPLT  0x02
	field	SEQINT    0x01
	mask	BAD_PHASE	SEQINT		/* unknown scsi bus phase */
	mask	SEND_REJECT	0x10|SEQINT	/* sending a message reject */
	mask	PROTO_VIOLATION	0x20|SEQINT	/* SCSI protocol violation */ 
	mask	NO_MATCH	0x30|SEQINT	/* no cmd match for reconnect */
	mask	IGN_WIDE_RES	0x40|SEQINT	/* Complex IGN Wide Res Msg */
	mask	PDATA_REINIT	0x50|SEQINT	/*
						 * Returned to data phase
						 * that requires data
						 * transfer pointers to be
						 * recalculated from the
						 * transfer residual.
						 */
	mask	HOST_MSG_LOOP	0x60|SEQINT	/*
						 * 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.
						 */
	mask	BAD_STATUS	0x70|SEQINT	/* Bad status from target */
	mask	PERR_DETECTED	0x80|SEQINT	/*
						 * Either the phase_lock
						 * or inb_next routine has
						 * noticed a parity error.
						 */
	mask	DATA_OVERRUN	0x90|SEQINT	/*
						 * Target attempted to write
						 * beyond the bounds of its
						 * command.
						 */
	mask	MKMSG_FAILED	0xa0|SEQINT	/*
						 * Target completed command
						 * without honoring our ATN
						 * request to issue a message. 
						 */
	mask	MISSED_BUSFREE	0xb0|SEQINT	/*
						 * The sequencer never saw
						 * the bus go free after
						 * either a command complete
						 * or disconnect message.
						 */
	mask	SCB_MISMATCH	0xc0|SEQINT	/*
						 * Downloaded SCB's tag does
						 * not match the entry we
						 * intended to download.
						 */
	mask	NO_FREE_SCB	0xd0|SEQINT	/*
						 * get_free_or_disc_scb failed.
						 */
	mask	OUT_OF_RANGE	0xe0|SEQINT

	mask	SEQINT_MASK	0xf0|SEQINT	/* SEQINT Status Codes */
	mask	INT_PEND  (BRKADRINT|SEQINT|SCSIINT|CMDCMPLT)
	dont_generate_debug_code
}

/*
 * Hard Error (p. 3-53)
 * Reporting of catastrophic errors.  You usually cannot recover from
 * these without a full board reset.
 */
register ERROR {
	address			0x092
	access_mode RO
	count		26
	field	CIOPARERR	0x80	/* Ultra2 only */
	field	PCIERRSTAT	0x40	/* PCI only */
	field	MPARERR		0x20	/* PCI only */
	field	DPARERR		0x10	/* PCI only */
	field	SQPARERR	0x08
	field	ILLOPCODE	0x04
	field	ILLSADDR	0x02
	field	ILLHADDR	0x01
}

/*
 * Clear Interrupt Status (p. 3-52)
 */
register CLRINT {
	address			0x092
	access_mode WO
	count		24
	field	CLRPARERR	0x10	/* PCI only */
	field	CLRBRKADRINT	0x08
	field	CLRSCSIINT      0x04
	field	CLRCMDINT 	0x02
	field	CLRSEQINT 	0x01
	dont_generate_debug_code
}

register DFCNTRL {
	address			0x093
	access_mode RW
	field	PRELOADEN	0x80	/* aic7890 only */
	field	WIDEODD		0x40
	field	SCSIEN		0x20
	field	SDMAEN		0x10
	field	SDMAENACK	0x10
	field	HDMAEN		0x08
	field	HDMAENACK	0x08
	field	DIRECTION	0x04
	field	FIFOFLUSH	0x02
	field	FIFORESET	0x01
}

register DFSTATUS {
	address			0x094
	access_mode RO
	field	PRELOAD_AVAIL	0x80
	field	DFCACHETH	0x40
	field	FIFOQWDEMP	0x20
	field	MREQPEND	0x10
	field	HDONE		0x08
	field	DFTHRESH	0x04
	field	FIFOFULL	0x02
	field	FIFOEMP		0x01
}

register DFWADDR {
	address			0x95
	access_mode RW
	dont_generate_debug_code
}

register DFRADDR {
	address			0x97
	access_mode RW
}

register DFDAT {
	address			0x099
	access_mode RW
	dont_generate_debug_code
}

/*
 * SCB Auto Increment (p. 3-59)
 * Byte offset into the SCB Array and an optional bit to allow auto
 * incrementing of the address during download and upload operations
 */
register SCBCNT {
	address			0x09a
	access_mode RW
	count		1
	field	SCBAUTO		0x80
	mask	SCBCNT_MASK	0x1f
	dont_generate_debug_code
}

/*
 * Queue In FIFO (p. 3-60)
 * Input queue for queued SCBs (commands that the seqencer has yet to start)
 */
register QINFIFO {
	address			0x09b
	access_mode RW
	count		12
	dont_generate_debug_code
}

/*
 * Queue In Count (p. 3-60)
 * Number of queued SCBs
 */
register QINCNT	{
	address			0x09c
	access_mode RO
}

/*
 * Queue Out FIFO (p. 3-61)
 * Queue of SCBs that have completed and await the host
 */
register QOUTFIFO {
	address			0x09d
	access_mode WO
	count		7
	dont_generate_debug_code
}

register CRCCONTROL1 {
	address			0x09d
	access_mode RW
	count		3
	field	CRCONSEEN		0x80
	field	CRCVALCHKEN		0x40
	field	CRCENDCHKEN		0x20
	field	CRCREQCHKEN		0x10
	field	TARGCRCENDEN		0x08
	field	TARGCRCCNTEN		0x04
	dont_generate_debug_code
}


/*
 * Queue Out Count (p. 3-61)
 * Number of queued SCBs in the Out FIFO
 */
register QOUTCNT {
	address			0x09e
	access_mode RO
}

register SCSIPHASE {
	address			0x09e
	access_mode RO
	field	STATUS_PHASE	0x20
	field	COMMAND_PHASE	0x10
	field	MSG_IN_PHASE	0x08
	field	MSG_OUT_PHASE	0x04
	field	DATA_IN_PHASE	0x02
	field	DATA_OUT_PHASE	0x01
	mask	DATA_PHASE_MASK	0x03
}

/*
 * Special Function
 */
register SFUNCT {
	address			0x09f
	access_mode RW
	count	    4
	field	ALT_MODE	0x80
	dont_generate_debug_code
}

/*
 * SCB Definition (p. 5-4)
 */
scb {
	address		0x0a0
	size		64

	SCB_CDB_PTR {
		size	4
		alias	SCB_RESIDUAL_DATACNT
		alias	SCB_CDB_STORE
		dont_generate_debug_code
	}
	SCB_RESIDUAL_SGPTR {
		size	4
		dont_generate_debug_code
	}
	SCB_SCSI_STATUS {
		size	1
		dont_generate_debug_code
	}
	SCB_TARGET_PHASES {
		size	1
		dont_generate_debug_code
	}
	SCB_TARGET_DATA_DIR {
		size	1
		dont_generate_debug_code
	}
	SCB_TARGET_ITAG {
		size	1
		dont_generate_debug_code
	}
	SCB_DATAPTR {
		size	4
		dont_generate_debug_code
	}
	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 */
		mask	SG_HIGH_ADDR_BITS	0x7F	/* In the fourth byte */
		dont_generate_debug_code
	}
	SCB_SGPTR {
		size	4
		field	SG_RESID_VALID	0x04	/* In the first byte */
		field	SG_FULL_RESID	0x02	/* In the first byte */
		field	SG_LIST_NULL	0x01	/* In the first byte */
		dont_generate_debug_code
	}
	SCB_CONTROL {
		size	1
		field	TARGET_SCB			0x80
		field	STATUS_RCVD			0x80
		field	DISCENB				0x40
		field	TAG_ENB				0x20
		field	MK_MESSAGE			0x10
		field	ULTRAENB			0x08
		field	DISCONNECTED			0x04
		mask	SCB_TAG_TYPE			0x03
	}
	SCB_SCSIID {
		size	1
		field	TWIN_CHNLB			0x80
		mask	TWIN_TID			0x70
		mask	TID				0xf0
		mask	OID				0x0f
	}
	SCB_LUN {
		field	SCB_XFERLEN_ODD			0x80
		mask	LID				0x3f
		size	1
	}
	SCB_TAG {
		size	1
	}
	SCB_CDB_LEN {
		size	1
		dont_generate_debug_code
	}
	SCB_SCSIRATE {
		size	1
		dont_generate_debug_code
	}
	SCB_SCSIOFFSET {
		size	1
		count	1
		dont_generate_debug_code
	}
	SCB_NEXT {
		size	1
		dont_generate_debug_code
	}
	SCB_64_SPARE {
		size	16
	}
	SCB_64_BTT {
		size	16
		dont_generate_debug_code
	}
}

const	SCB_UPLOAD_SIZE		32
const	SCB_DOWNLOAD_SIZE	32
const	SCB_DOWNLOAD_SIZE_64	48

const	SG_SIZEOF	0x08		/* sizeof(struct ahc_dma) */

/* --------------------- AHA-2840-only definitions -------------------- */

register SEECTL_2840 {
	address			0x0c0
	access_mode RW
	count		2
	field	CS_2840		0x04
	field	CK_2840		0x02
	field	DO_2840		0x01
	dont_generate_debug_code
}

register STATUS_2840 {
	address			0x0c1
	access_mode RW
	count		4
	field	EEPROM_TF	0x80
	mask	BIOS_SEL	0x60
	mask	ADSEL		0x1e
	field	DI_2840		0x01
	dont_generate_debug_code
}

/* --------------------- AIC-7870-only definitions -------------------- */

register CCHADDR {
	address			0x0E0
	size 8
	dont_generate_debug_code
}

register CCHCNT {
	address			0x0E8
	dont_generate_debug_code
}

register CCSGRAM {
	address			0x0E9
	dont_generate_debug_code
}

register CCSGADDR {
	address			0x0EA
	dont_generate_debug_code
}

register CCSGCTL {
	address			0x0EB
	field	CCSGDONE	0x80
	field	CCSGEN		0x08
	field	SG_FETCH_NEEDED 0x02	/* Bit used for software state */
	field	CCSGRESET	0x01
	dont_generate_debug_code
}

register CCSCBCNT {
	address			0xEF
	count		1
	dont_generate_debug_code
}

register CCSCBCTL {
	address			0x0EE
	field	CCSCBDONE	0x80
	field	ARRDONE		0x40	/* SCB Array prefetch done */
	field	CCARREN		0x10
	field	CCSCBEN		0x08
	field	CCSCBDIR	0x04
	field	CCSCBRESET	0x01
	dont_generate_debug_code
}

register CCSCBADDR {
	address			0x0ED
	dont_generate_debug_code
}

register CCSCBRAM {
	address			0xEC
	dont_generate_debug_code
}

/*
 * SCB bank address (7895/7896/97 only)
 */
register SCBBADDR {
	address			0x0F0
	access_mode RW
	count		3
	dont_generate_debug_code
}

register CCSCBPTR {
	address			0x0F1
	dont_generate_debug_code
}

register HNSCB_QOFF {
	address			0x0F4
	count		4
	dont_generate_debug_code
}

register SNSCB_QOFF {
	address			0x0F6
	dont_generate_debug_code
}

register SDSCB_QOFF {
	address			0x0F8
	dont_generate_debug_code
}

register QOFF_CTLSTA {
	address			0x0FA
	field	SCB_AVAIL	0x40
	field	SNSCB_ROLLOVER	0x20
	field	SDSCB_ROLLOVER	0x10
	mask	SCB_QSIZE	0x07
	mask	SCB_QSIZE_256	0x06
	dont_generate_debug_code
}

register DFF_THRSH {
	address			0x0FB
	mask	WR_DFTHRSH	0x70
	mask	RD_DFTHRSH	0x07
	mask	RD_DFTHRSH_MIN	0x00
	mask	RD_DFTHRSH_25	0x01
	mask	RD_DFTHRSH_50	0x02
	mask	RD_DFTHRSH_63	0x03
	mask	RD_DFTHRSH_75	0x04
	mask	RD_DFTHRSH_85	0x05
	mask	RD_DFTHRSH_90	0x06
	mask	RD_DFTHRSH_MAX	0x07
	mask	WR_DFTHRSH_MIN	0x00
	mask	WR_DFTHRSH_25	0x10
	mask	WR_DFTHRSH_50	0x20
	mask	WR_DFTHRSH_63	0x30
	mask	WR_DFTHRSH_75	0x40
	mask	WR_DFTHRSH_85	0x50
	mask	WR_DFTHRSH_90	0x60
	mask	WR_DFTHRSH_MAX	0x70
	count	4
	dont_generate_debug_code
}

register SG_CACHE_PRE {
	access_mode WO
	address			0x0fc
	mask	SG_ADDR_MASK	0xf8
	field	LAST_SEG	0x02
	field	LAST_SEG_DONE	0x01
	dont_generate_debug_code
}

register SG_CACHE_SHADOW {
	access_mode RO
	address			0x0fc
	mask	SG_ADDR_MASK	0xf8
	field	LAST_SEG	0x02
	field	LAST_SEG_DONE	0x01
	dont_generate_debug_code
}
/* ---------------------- Scratch RAM Offsets ------------------------- */
/* These offsets are either to values that are initialized by the board's
 * BIOS or are specified by the sequencer code.
 *
 * The host adapter card (at least the BIOS) uses 20-2f for SCSI
 * device information, 32-33 and 5a-5f as well. As it turns out, the
 * BIOS trashes 20-2f, writing the synchronous negotiation results
 * on top of the BIOS values, so we re-use those for our per-target
 * scratchspace (actually a value that can be copied directly into
 * SCSIRATE).  The kernel driver will enable synchronous negotiation
 * for all targets that have a value other than 0 in the lower four
 * bits of the target scratch space.  This should work regardless of
 * whether the bios has been installed.
 */

scratch_ram {
	address		0x020
	size		58

	/*
	 * 1 byte per target starting at this address for configuration values
	 */
	BUSY_TARGETS {
		alias		TARG_SCSIRATE
		size		16
		dont_generate_debug_code
	}
	/*
	 * Bit vector of targets that have ULTRA enabled as set by
	 * the BIOS.  The Sequencer relies on a per-SCB field to
	 * control whether to enable Ultra transfers or not.  During
	 * initialization, we read this field and reuse it for 2
	 * entries in the busy target table.
	 */
	ULTRA_ENB {
		alias		CMDSIZE_TABLE
		size		2
		count		2
		dont_generate_debug_code
	}
	/*
	 * Bit vector of targets that have disconnection disabled as set by
	 * the BIOS.  The Sequencer relies in a per-SCB field to control the
	 * disconnect priveldge.  During initialization, we read this field
	 * and reuse it for 2 entries in the busy target table.
	 */
	DISC_DSB {
		size		2
		count		6
		dont_generate_debug_code
	}
	CMDSIZE_TABLE_TAIL {
		size		4
	}
	/*
	 * Partial transfer past cacheline end to be
	 * transferred using an extra S/G.
	 */
	MWI_RESIDUAL {
		size		1
		dont_generate_debug_code
	}
	/*
	 * SCBID of the next SCB to be started by the controller.
	 */
	NEXT_QUEUED_SCB {
		size		1
		dont_generate_debug_code
	}
	/*
	 * 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		12
		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
		mask	PHASE_MASK	CDI|IOI|MSGI
		mask	P_DATAOUT	0x00
		mask	P_DATAIN	IOI
		mask	P_COMMAND	CDI
		mask	P_MESGOUT	CDI|MSGI
		mask	P_STATUS	CDI|IOI
		mask	P_MESGIN	CDI|IOI|MSGI
		mask	P_BUSFREE	0x01
	}
	/*
	 * head of list of SCBs awaiting
	 * selection
	 */
	WAITING_SCBH {
		size		1
		dont_generate_debug_code
	}
	/*
	 * head of list of SCBs that are
	 * disconnected.  Used for SCB
	 * paging.
	 */
	DISCONNECTED_SCBH {
		size		1
		dont_generate_debug_code
	}
	/*
	 * head of list of SCBs that are
	 * not in use.  Used for SCB paging.
	 */
	FREE_SCBH {
		size		1
		dont_generate_debug_code
	}
	/*
	 * head of list of SCBs that have
	 * completed but have not been
	 * put into the qoutfifo.
	 */
	COMPLETE_SCBH {
		size		1
	}
	/*
	 * Address of the hardware scb array in the host.
	 */
	HSCB_ADDR {
		size		4
		dont_generate_debug_code
	}
	/*
	 * 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
		dont_generate_debug_code
	}
	KERNEL_QINPOS {
		size		1
		dont_generate_debug_code
	}
	QINPOS {
		size		1
		dont_generate_debug_code
	}
	QOUTPOS {
		size		1
		dont_generate_debug_code
	}
	/*
	 * 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
		dont_generate_debug_code
	}
	TQINPOS {
		size		1
		dont_generate_debug_code
	}
	ARG_1 {
		size		1
		count		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		0x04
		mask	CONT_TARG_SESSION	0x02
		alias	RETURN_1
		dont_generate_debug_code
	}
	ARG_2 {
		size		1
		alias	RETURN_2
		dont_generate_debug_code
	}

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

	/*
	 * 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	ENSELO		0x40
		field	ENSELI		0x20
		field	ENRSELI		0x10
		field	ENAUTOATNO	0x08
		field	ENAUTOATNI	0x04
		field	ENAUTOATNP	0x02
		dont_generate_debug_code
	}
}

scratch_ram {
	address		0x056
	size		4
	/*
	 * These scratch ram locations are initialized by the 274X BIOS.
	 * We reuse them after capturing the BIOS settings during
	 * initialization.
	 */

	/*
	 * The initiator specified tag for this target mode transaction.
	 */
	HA_274_BIOSGLOBAL {
		size	1
		field	HA_274_EXTENDED_TRANS	0x01
		alias	INITIATOR_TAG
		count		1
		dont_generate_debug_code
	}

	SEQ_FLAGS2 {
		size	1
		field	SCB_DMA			0x01
		field	TARGET_MSG_PENDING	0x02
		dont_generate_debug_code
	}
}

scratch_ram {
	address		0x05a
	size		6
	/*
	 * These are reserved registers in the card's scratch ram on the 2742.
	 * The EISA configuraiton chip is mapped here.  On Rev E. of the
	 * aic7770, the sequencer can use this area for scratch, but the
	 * host cannot directly access these registers.  On later chips, this
	 * area can be read and written by both the host and the sequencer.
	 * Even on later chips, many of these locations are initialized by
	 * the BIOS.
	 */
	SCSICONF {
		size		1
		count		12
		field	TERM_ENB	0x80
		field	RESET_SCSI	0x40
		field	ENSPCHK		0x20
		mask	HSCSIID		0x07	/* our SCSI ID */
		mask	HWSCSIID	0x0f	/* our SCSI ID if Wide Bus */
		dont_generate_debug_code
	}
	INTDEF {
		address		0x05c
		size		1
		count		1
		field	EDGE_TRIG	0x80
		mask	VECTOR		0x0f
		dont_generate_debug_code
	}
	HOSTCONF {
		address		0x05d
		size		1
		count		1
		dont_generate_debug_code
	}
	HA_274_BIOSCTRL	{
		address		0x05f
		size		1
		count		1
		mask	BIOSMODE		0x30
		mask	BIOSDISABLED		0x30	
		field	CHANNEL_B_PRIMARY	0x08
		dont_generate_debug_code
	}
}

scratch_ram {
	address		0x070
	size		16

	/*
	 * Per target SCSI offset values for Ultra2 controllers.
	 */
	TARG_OFFSET {
		size		16
		count		1
		dont_generate_debug_code
	}
}

const TID_SHIFT		4
const SCB_LIST_NULL	0xff
const TARGET_CMD_CMPLT	0xfe

const CCSGADDR_MAX	0x80
const CCSGRAM_MAXSEGS	16

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

/* Offset maximums */
const MAX_OFFSET_8BIT		0x0f
const MAX_OFFSET_16BIT		0x08
const MAX_OFFSET_ULTRA2		0x7f
const MAX_OFFSET		0x7f
const HOST_MSG			0xff

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

const STATUS_BUSY		0x08
const STATUS_QUEUE_FULL	0x28
const TARGET_DATA_IN		1

/*
 * Downloaded (kernel inserted) constants
 */
/* Offsets into the SCBID array where different data is stored */
const QOUTFIFO_OFFSET download
const QINFIFO_OFFSET download
const CACHESIZE_MASK download
const INVERTED_CACHESIZE_MASK download
const SG_PREFETCH_CNT download
const SG_PREFETCH_ALIGN_MASK download
const SG_PREFETCH_ADDR_MASK download
