xref: /OK3568_Linux_fs/kernel/drivers/scsi/aic7xxx/aic7xxx.reg (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/*
2*4882a593Smuzhiyun * Aic7xxx register and scratch ram definitions.
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright (c) 1994-2001 Justin T. Gibbs.
5*4882a593Smuzhiyun * Copyright (c) 2000-2001 Adaptec Inc.
6*4882a593Smuzhiyun * All rights reserved.
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or without
9*4882a593Smuzhiyun * modification, are permitted provided that the following conditions
10*4882a593Smuzhiyun * are met:
11*4882a593Smuzhiyun * 1. Redistributions of source code must retain the above copyright
12*4882a593Smuzhiyun *    notice, this list of conditions, and the following disclaimer,
13*4882a593Smuzhiyun *    without modification.
14*4882a593Smuzhiyun * 2. Redistributions in binary form must reproduce at minimum a disclaimer
15*4882a593Smuzhiyun *    substantially similar to the "NO WARRANTY" disclaimer below
16*4882a593Smuzhiyun *    ("Disclaimer") and any redistribution must be conditioned upon
17*4882a593Smuzhiyun *    including a substantially similar Disclaimer requirement for further
18*4882a593Smuzhiyun *    binary redistribution.
19*4882a593Smuzhiyun * 3. Neither the names of the above-listed copyright holders nor the names
20*4882a593Smuzhiyun *    of any contributors may be used to endorse or promote products derived
21*4882a593Smuzhiyun *    from this software without specific prior written permission.
22*4882a593Smuzhiyun *
23*4882a593Smuzhiyun * Alternatively, this software may be distributed under the terms of the
24*4882a593Smuzhiyun * GNU General Public License ("GPL") version 2 as published by the Free
25*4882a593Smuzhiyun * Software Foundation.
26*4882a593Smuzhiyun *
27*4882a593Smuzhiyun * NO WARRANTY
28*4882a593Smuzhiyun * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29*4882a593Smuzhiyun * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30*4882a593Smuzhiyun * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
31*4882a593Smuzhiyun * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32*4882a593Smuzhiyun * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33*4882a593Smuzhiyun * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34*4882a593Smuzhiyun * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35*4882a593Smuzhiyun * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
36*4882a593Smuzhiyun * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
37*4882a593Smuzhiyun * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38*4882a593Smuzhiyun * POSSIBILITY OF SUCH DAMAGES.
39*4882a593Smuzhiyun *
40*4882a593Smuzhiyun * $FreeBSD$
41*4882a593Smuzhiyun */
42*4882a593SmuzhiyunVERSION = "$Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#40 $"
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun/*
45*4882a593Smuzhiyun * This file is processed by the aic7xxx_asm utility for use in assembling
46*4882a593Smuzhiyun * firmware for the aic7xxx family of SCSI host adapters as well as to generate
47*4882a593Smuzhiyun * a C header file for use in the kernel portion of the Aic7xxx driver.
48*4882a593Smuzhiyun *
49*4882a593Smuzhiyun * All page numbers refer to the Adaptec AIC-7770 Data Book available from
50*4882a593Smuzhiyun * Adaptec's Technical Documents Department 1-800-934-2766
51*4882a593Smuzhiyun */
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun/*
54*4882a593Smuzhiyun * Registers marked "dont_generate_debug_code" are not (yet) referenced
55*4882a593Smuzhiyun * from the driver code, and this keyword inhibit generation
56*4882a593Smuzhiyun * of debug code for them.
57*4882a593Smuzhiyun *
58*4882a593Smuzhiyun * REG_PRETTY_PRINT config will complain if dont_generate_debug_code
59*4882a593Smuzhiyun * is added to the register which is referenced in the driver.
60*4882a593Smuzhiyun * Unreferenced register with no dont_generate_debug_code will result
61*4882a593Smuzhiyun * in dead code. No warning is issued.
62*4882a593Smuzhiyun */
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun/*
65*4882a593Smuzhiyun * SCSI Sequence Control (p. 3-11).
66*4882a593Smuzhiyun * Each bit, when set starts a specific SCSI sequence on the bus
67*4882a593Smuzhiyun */
68*4882a593Smuzhiyunregister SCSISEQ {
69*4882a593Smuzhiyun	address			0x000
70*4882a593Smuzhiyun	access_mode RW
71*4882a593Smuzhiyun	field	TEMODE		0x80
72*4882a593Smuzhiyun	field	ENSELO		0x40
73*4882a593Smuzhiyun	field	ENSELI		0x20
74*4882a593Smuzhiyun	field	ENRSELI		0x10
75*4882a593Smuzhiyun	field	ENAUTOATNO	0x08
76*4882a593Smuzhiyun	field	ENAUTOATNI	0x04
77*4882a593Smuzhiyun	field	ENAUTOATNP	0x02
78*4882a593Smuzhiyun	field	SCSIRSTO	0x01
79*4882a593Smuzhiyun}
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun/*
82*4882a593Smuzhiyun * SCSI Transfer Control 0 Register (pp. 3-13).
83*4882a593Smuzhiyun * Controls the SCSI module data path.
84*4882a593Smuzhiyun */
85*4882a593Smuzhiyunregister SXFRCTL0 {
86*4882a593Smuzhiyun	address			0x001
87*4882a593Smuzhiyun	access_mode RW
88*4882a593Smuzhiyun	field	DFON		0x80
89*4882a593Smuzhiyun	field	DFPEXP		0x40
90*4882a593Smuzhiyun	field	FAST20		0x20
91*4882a593Smuzhiyun	field	CLRSTCNT	0x10
92*4882a593Smuzhiyun	field	SPIOEN		0x08
93*4882a593Smuzhiyun	field	SCAMEN		0x04
94*4882a593Smuzhiyun	field	CLRCHN		0x02
95*4882a593Smuzhiyun}
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun/*
98*4882a593Smuzhiyun * SCSI Transfer Control 1 Register (pp. 3-14,15).
99*4882a593Smuzhiyun * Controls the SCSI module data path.
100*4882a593Smuzhiyun */
101*4882a593Smuzhiyunregister SXFRCTL1 {
102*4882a593Smuzhiyun	address			0x002
103*4882a593Smuzhiyun	access_mode RW
104*4882a593Smuzhiyun	field	BITBUCKET	0x80
105*4882a593Smuzhiyun	field	SWRAPEN		0x40
106*4882a593Smuzhiyun	field	ENSPCHK		0x20
107*4882a593Smuzhiyun	mask	STIMESEL	0x18
108*4882a593Smuzhiyun	field	ENSTIMER	0x04
109*4882a593Smuzhiyun	field	ACTNEGEN	0x02
110*4882a593Smuzhiyun	field	STPWEN		0x01	/* Powered Termination */
111*4882a593Smuzhiyun	dont_generate_debug_code
112*4882a593Smuzhiyun}
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun/*
115*4882a593Smuzhiyun * SCSI Control Signal Read Register (p. 3-15).
116*4882a593Smuzhiyun * Reads the actual state of the SCSI bus pins
117*4882a593Smuzhiyun */
118*4882a593Smuzhiyunregister SCSISIGI {
119*4882a593Smuzhiyun	address			0x003
120*4882a593Smuzhiyun	access_mode RO
121*4882a593Smuzhiyun	field	CDI		0x80
122*4882a593Smuzhiyun	field	IOI		0x40
123*4882a593Smuzhiyun	field	MSGI		0x20
124*4882a593Smuzhiyun	field	ATNI		0x10
125*4882a593Smuzhiyun	field	SELI		0x08
126*4882a593Smuzhiyun	field	BSYI		0x04
127*4882a593Smuzhiyun	field	REQI		0x02
128*4882a593Smuzhiyun	field	ACKI		0x01
129*4882a593Smuzhiyun/*
130*4882a593Smuzhiyun * Possible phases in SCSISIGI
131*4882a593Smuzhiyun */
132*4882a593Smuzhiyun	mask	PHASE_MASK	CDI|IOI|MSGI
133*4882a593Smuzhiyun	mask	P_DATAOUT	0x00
134*4882a593Smuzhiyun	mask	P_DATAIN	IOI
135*4882a593Smuzhiyun	mask	P_DATAOUT_DT	P_DATAOUT|MSGI
136*4882a593Smuzhiyun	mask	P_DATAIN_DT	P_DATAIN|MSGI
137*4882a593Smuzhiyun	mask	P_COMMAND	CDI
138*4882a593Smuzhiyun	mask	P_MESGOUT	CDI|MSGI
139*4882a593Smuzhiyun	mask	P_STATUS	CDI|IOI
140*4882a593Smuzhiyun	mask	P_MESGIN	CDI|IOI|MSGI
141*4882a593Smuzhiyun}
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun/*
144*4882a593Smuzhiyun * SCSI Control Signal Write Register (p. 3-16).
145*4882a593Smuzhiyun * Writing to this register modifies the control signals on the bus.  Only
146*4882a593Smuzhiyun * those signals that are allowed in the current mode (Initiator/Target) are
147*4882a593Smuzhiyun * asserted.
148*4882a593Smuzhiyun */
149*4882a593Smuzhiyunregister SCSISIGO {
150*4882a593Smuzhiyun	address			0x003
151*4882a593Smuzhiyun	access_mode WO
152*4882a593Smuzhiyun	field	CDO		0x80
153*4882a593Smuzhiyun	field	IOO		0x40
154*4882a593Smuzhiyun	field	MSGO		0x20
155*4882a593Smuzhiyun	field	ATNO		0x10
156*4882a593Smuzhiyun	field	SELO		0x08
157*4882a593Smuzhiyun	field	BSYO		0x04
158*4882a593Smuzhiyun	field	REQO		0x02
159*4882a593Smuzhiyun	field	ACKO		0x01
160*4882a593Smuzhiyun/*
161*4882a593Smuzhiyun * Possible phases to write into SCSISIG0
162*4882a593Smuzhiyun */
163*4882a593Smuzhiyun	mask	PHASE_MASK	CDI|IOI|MSGI
164*4882a593Smuzhiyun	mask	P_DATAOUT	0x00
165*4882a593Smuzhiyun	mask	P_DATAIN	IOI
166*4882a593Smuzhiyun	mask	P_COMMAND	CDI
167*4882a593Smuzhiyun	mask	P_MESGOUT	CDI|MSGI
168*4882a593Smuzhiyun	mask	P_STATUS	CDI|IOI
169*4882a593Smuzhiyun	mask	P_MESGIN	CDI|IOI|MSGI
170*4882a593Smuzhiyun	dont_generate_debug_code
171*4882a593Smuzhiyun}
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun/*
174*4882a593Smuzhiyun * SCSI Rate Control (p. 3-17).
175*4882a593Smuzhiyun * Contents of this register determine the Synchronous SCSI data transfer
176*4882a593Smuzhiyun * rate and the maximum synchronous Req/Ack offset.  An offset of 0 in the
177*4882a593Smuzhiyun * SOFS (3:0) bits disables synchronous data transfers.  Any offset value
178*4882a593Smuzhiyun * greater than 0 enables synchronous transfers.
179*4882a593Smuzhiyun */
180*4882a593Smuzhiyunregister SCSIRATE {
181*4882a593Smuzhiyun	address			0x004
182*4882a593Smuzhiyun	access_mode RW
183*4882a593Smuzhiyun	field	WIDEXFER	0x80		/* Wide transfer control */
184*4882a593Smuzhiyun	field	ENABLE_CRC	0x40		/* CRC for D-Phases */
185*4882a593Smuzhiyun	field	SINGLE_EDGE	0x10		/* Disable DT Transfers */
186*4882a593Smuzhiyun	mask	SXFR		0x70		/* Sync transfer rate */
187*4882a593Smuzhiyun	mask	SXFR_ULTRA2	0x0f		/* Sync transfer rate */
188*4882a593Smuzhiyun	mask	SOFS		0x0f		/* Sync offset */
189*4882a593Smuzhiyun}
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun/*
192*4882a593Smuzhiyun * SCSI ID (p. 3-18).
193*4882a593Smuzhiyun * Contains the ID of the board and the current target on the
194*4882a593Smuzhiyun * selected channel.
195*4882a593Smuzhiyun */
196*4882a593Smuzhiyunregister SCSIID	{
197*4882a593Smuzhiyun	address			0x005
198*4882a593Smuzhiyun	access_mode RW
199*4882a593Smuzhiyun	mask	TID		0xf0		/* Target ID mask */
200*4882a593Smuzhiyun	mask	TWIN_TID	0x70
201*4882a593Smuzhiyun	field	TWIN_CHNLB	0x80
202*4882a593Smuzhiyun	mask	OID		0x0f		/* Our ID mask */
203*4882a593Smuzhiyun	/*
204*4882a593Smuzhiyun	 * SCSI Maximum Offset (p. 4-61 aic7890/91 Data Book)
205*4882a593Smuzhiyun	 * The aic7890/91 allow an offset of up to 127 transfers in both wide
206*4882a593Smuzhiyun	 * and narrow mode.
207*4882a593Smuzhiyun	 */
208*4882a593Smuzhiyun	alias	SCSIOFFSET
209*4882a593Smuzhiyun	mask	SOFS_ULTRA2	0x7f		/* Sync offset U2 chips */
210*4882a593Smuzhiyun	dont_generate_debug_code
211*4882a593Smuzhiyun}
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun/*
214*4882a593Smuzhiyun * SCSI Latched Data (p. 3-19).
215*4882a593Smuzhiyun * Read/Write latches used to transfer data on the SCSI bus during
216*4882a593Smuzhiyun * Automatic or Manual PIO mode.  SCSIDATH can be used for the
217*4882a593Smuzhiyun * upper byte of a 16bit wide asynchronouse data phase transfer.
218*4882a593Smuzhiyun */
219*4882a593Smuzhiyunregister SCSIDATL {
220*4882a593Smuzhiyun	address			0x006
221*4882a593Smuzhiyun	access_mode RW
222*4882a593Smuzhiyun	dont_generate_debug_code
223*4882a593Smuzhiyun}
224*4882a593Smuzhiyun
225*4882a593Smuzhiyunregister SCSIDATH {
226*4882a593Smuzhiyun	address			0x007
227*4882a593Smuzhiyun	access_mode RW
228*4882a593Smuzhiyun}
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun/*
231*4882a593Smuzhiyun * SCSI Transfer Count (pp. 3-19,20)
232*4882a593Smuzhiyun * These registers count down the number of bytes transferred
233*4882a593Smuzhiyun * across the SCSI bus.  The counter is decremented only once
234*4882a593Smuzhiyun * the data has been safely transferred.  SDONE in SSTAT0 is
235*4882a593Smuzhiyun * set when STCNT goes to 0
236*4882a593Smuzhiyun */
237*4882a593Smuzhiyunregister STCNT {
238*4882a593Smuzhiyun	address			0x008
239*4882a593Smuzhiyun	size	3
240*4882a593Smuzhiyun	access_mode RW
241*4882a593Smuzhiyun	dont_generate_debug_code
242*4882a593Smuzhiyun}
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun/* ALT_MODE registers (Ultra2 and Ultra160 chips) */
245*4882a593Smuzhiyunregister SXFRCTL2 {
246*4882a593Smuzhiyun	address			0x013
247*4882a593Smuzhiyun	access_mode RW
248*4882a593Smuzhiyun	field	AUTORSTDIS	0x10
249*4882a593Smuzhiyun	field	CMDDMAEN	0x08
250*4882a593Smuzhiyun	mask	ASYNC_SETUP	0x07
251*4882a593Smuzhiyun}
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun/* ALT_MODE register on Ultra160 chips */
254*4882a593Smuzhiyunregister OPTIONMODE {
255*4882a593Smuzhiyun	address			0x008
256*4882a593Smuzhiyun	access_mode RW
257*4882a593Smuzhiyun	count		2
258*4882a593Smuzhiyun	field	AUTORATEEN		0x80
259*4882a593Smuzhiyun	field	AUTOACKEN		0x40
260*4882a593Smuzhiyun	field	ATNMGMNTEN		0x20
261*4882a593Smuzhiyun	field	BUSFREEREV		0x10
262*4882a593Smuzhiyun	field	EXPPHASEDIS		0x08
263*4882a593Smuzhiyun	field	SCSIDATL_IMGEN		0x04
264*4882a593Smuzhiyun	field	AUTO_MSGOUT_DE		0x02
265*4882a593Smuzhiyun	field	DIS_MSGIN_DUALEDGE	0x01
266*4882a593Smuzhiyun	mask	OPTIONMODE_DEFAULTS	AUTO_MSGOUT_DE|DIS_MSGIN_DUALEDGE
267*4882a593Smuzhiyun	dont_generate_debug_code
268*4882a593Smuzhiyun}
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun/* ALT_MODE register on Ultra160 chips */
271*4882a593Smuzhiyunregister TARGCRCCNT {
272*4882a593Smuzhiyun	address			0x00a
273*4882a593Smuzhiyun	size	2
274*4882a593Smuzhiyun	access_mode RW
275*4882a593Smuzhiyun	count		2
276*4882a593Smuzhiyun	dont_generate_debug_code
277*4882a593Smuzhiyun}
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun/*
280*4882a593Smuzhiyun * Clear SCSI Interrupt 0 (p. 3-20)
281*4882a593Smuzhiyun * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT0.
282*4882a593Smuzhiyun */
283*4882a593Smuzhiyunregister CLRSINT0 {
284*4882a593Smuzhiyun	address			0x00b
285*4882a593Smuzhiyun	access_mode WO
286*4882a593Smuzhiyun	field	CLRSELDO	0x40
287*4882a593Smuzhiyun	field	CLRSELDI	0x20
288*4882a593Smuzhiyun	field	CLRSELINGO	0x10
289*4882a593Smuzhiyun	field	CLRSWRAP	0x08
290*4882a593Smuzhiyun	field	CLRIOERR	0x08	/* Ultra2 Only */
291*4882a593Smuzhiyun	field	CLRSPIORDY	0x02
292*4882a593Smuzhiyun	dont_generate_debug_code
293*4882a593Smuzhiyun}
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun/*
296*4882a593Smuzhiyun * SCSI Status 0 (p. 3-21)
297*4882a593Smuzhiyun * Contains one set of SCSI Interrupt codes
298*4882a593Smuzhiyun * These are most likely of interest to the sequencer
299*4882a593Smuzhiyun */
300*4882a593Smuzhiyunregister SSTAT0	{
301*4882a593Smuzhiyun	address			0x00b
302*4882a593Smuzhiyun	access_mode RO
303*4882a593Smuzhiyun	field	TARGET		0x80	/* Board acting as target */
304*4882a593Smuzhiyun	field	SELDO		0x40	/* Selection Done */
305*4882a593Smuzhiyun	field	SELDI		0x20	/* Board has been selected */
306*4882a593Smuzhiyun	field	SELINGO		0x10	/* Selection In Progress */
307*4882a593Smuzhiyun	field	SWRAP		0x08	/* 24bit counter wrap */
308*4882a593Smuzhiyun	field	IOERR		0x08	/* LVD Tranceiver mode changed */
309*4882a593Smuzhiyun	field	SDONE		0x04	/* STCNT = 0x000000 */
310*4882a593Smuzhiyun	field	SPIORDY		0x02	/* SCSI PIO Ready */
311*4882a593Smuzhiyun	field	DMADONE		0x01	/* DMA transfer completed */
312*4882a593Smuzhiyun}
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun/*
315*4882a593Smuzhiyun * Clear SCSI Interrupt 1 (p. 3-23)
316*4882a593Smuzhiyun * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT1.
317*4882a593Smuzhiyun */
318*4882a593Smuzhiyunregister CLRSINT1 {
319*4882a593Smuzhiyun	address			0x00c
320*4882a593Smuzhiyun	access_mode WO
321*4882a593Smuzhiyun	field	CLRSELTIMEO	0x80
322*4882a593Smuzhiyun	field	CLRATNO		0x40
323*4882a593Smuzhiyun	field	CLRSCSIRSTI	0x20
324*4882a593Smuzhiyun	field	CLRBUSFREE	0x08
325*4882a593Smuzhiyun	field	CLRSCSIPERR	0x04
326*4882a593Smuzhiyun	field	CLRPHASECHG	0x02
327*4882a593Smuzhiyun	field	CLRREQINIT	0x01
328*4882a593Smuzhiyun	dont_generate_debug_code
329*4882a593Smuzhiyun}
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun/*
332*4882a593Smuzhiyun * SCSI Status 1 (p. 3-24)
333*4882a593Smuzhiyun */
334*4882a593Smuzhiyunregister SSTAT1	{
335*4882a593Smuzhiyun	address			0x00c
336*4882a593Smuzhiyun	access_mode RO
337*4882a593Smuzhiyun	field	SELTO		0x80
338*4882a593Smuzhiyun	field	ATNTARG 	0x40
339*4882a593Smuzhiyun	field	SCSIRSTI	0x20
340*4882a593Smuzhiyun	field	PHASEMIS	0x10
341*4882a593Smuzhiyun	field	BUSFREE		0x08
342*4882a593Smuzhiyun	field	SCSIPERR	0x04
343*4882a593Smuzhiyun	field	PHASECHG	0x02
344*4882a593Smuzhiyun	field	REQINIT		0x01
345*4882a593Smuzhiyun}
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun/*
348*4882a593Smuzhiyun * SCSI Status 2 (pp. 3-25,26)
349*4882a593Smuzhiyun */
350*4882a593Smuzhiyunregister SSTAT2 {
351*4882a593Smuzhiyun	address			0x00d
352*4882a593Smuzhiyun	access_mode RO
353*4882a593Smuzhiyun	field	OVERRUN		0x80
354*4882a593Smuzhiyun	field	SHVALID		0x40	/* Shadow Layer non-zero */
355*4882a593Smuzhiyun	field	EXP_ACTIVE	0x10	/* SCSI Expander Active */
356*4882a593Smuzhiyun	field	CRCVALERR	0x08	/* CRC doesn't match (U3 only) */
357*4882a593Smuzhiyun	field	CRCENDERR	0x04	/* No terminal CRC packet (U3 only) */
358*4882a593Smuzhiyun	field	CRCREQERR	0x02	/* Illegal CRC packet req (U3 only) */
359*4882a593Smuzhiyun	field	DUAL_EDGE_ERR	0x01	/* Incorrect data phase (U3 only) */
360*4882a593Smuzhiyun	mask	SFCNT		0x1f
361*4882a593Smuzhiyun}
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun/*
364*4882a593Smuzhiyun * SCSI Status 3 (p. 3-26)
365*4882a593Smuzhiyun */
366*4882a593Smuzhiyunregister SSTAT3 {
367*4882a593Smuzhiyun	address			0x00e
368*4882a593Smuzhiyun	access_mode RO
369*4882a593Smuzhiyun	count		2
370*4882a593Smuzhiyun	mask	SCSICNT		0xf0
371*4882a593Smuzhiyun	mask	OFFCNT		0x0f
372*4882a593Smuzhiyun	mask	U2OFFCNT	0x7f
373*4882a593Smuzhiyun}
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun/*
376*4882a593Smuzhiyun * SCSI ID for the aic7890/91 chips
377*4882a593Smuzhiyun */
378*4882a593Smuzhiyunregister SCSIID_ULTRA2 {
379*4882a593Smuzhiyun	address			0x00f
380*4882a593Smuzhiyun	access_mode RW
381*4882a593Smuzhiyun	mask	TID		0xf0		/* Target ID mask */
382*4882a593Smuzhiyun	mask	OID		0x0f		/* Our ID mask */
383*4882a593Smuzhiyun	dont_generate_debug_code
384*4882a593Smuzhiyun}
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun/*
387*4882a593Smuzhiyun * SCSI Interrupt Mode 1 (p. 3-28)
388*4882a593Smuzhiyun * Setting any bit will enable the corresponding function
389*4882a593Smuzhiyun * in SIMODE0 to interrupt via the IRQ pin.
390*4882a593Smuzhiyun */
391*4882a593Smuzhiyunregister SIMODE0 {
392*4882a593Smuzhiyun	address			0x010
393*4882a593Smuzhiyun	access_mode RW
394*4882a593Smuzhiyun	count		2
395*4882a593Smuzhiyun	field	ENSELDO		0x40
396*4882a593Smuzhiyun	field	ENSELDI		0x20
397*4882a593Smuzhiyun	field	ENSELINGO	0x10
398*4882a593Smuzhiyun	field	ENSWRAP		0x08
399*4882a593Smuzhiyun	field	ENIOERR		0x08	/* LVD Tranceiver mode changes */
400*4882a593Smuzhiyun	field	ENSDONE		0x04
401*4882a593Smuzhiyun	field	ENSPIORDY	0x02
402*4882a593Smuzhiyun	field	ENDMADONE	0x01
403*4882a593Smuzhiyun}
404*4882a593Smuzhiyun
405*4882a593Smuzhiyun/*
406*4882a593Smuzhiyun * SCSI Interrupt Mode 1 (pp. 3-28,29)
407*4882a593Smuzhiyun * Setting any bit will enable the corresponding function
408*4882a593Smuzhiyun * in SIMODE1 to interrupt via the IRQ pin.
409*4882a593Smuzhiyun */
410*4882a593Smuzhiyunregister SIMODE1 {
411*4882a593Smuzhiyun	address			0x011
412*4882a593Smuzhiyun	access_mode RW
413*4882a593Smuzhiyun	field	ENSELTIMO	0x80
414*4882a593Smuzhiyun	field	ENATNTARG	0x40
415*4882a593Smuzhiyun	field	ENSCSIRST	0x20
416*4882a593Smuzhiyun	field	ENPHASEMIS	0x10
417*4882a593Smuzhiyun	field	ENBUSFREE	0x08
418*4882a593Smuzhiyun	field	ENSCSIPERR	0x04
419*4882a593Smuzhiyun	field	ENPHASECHG	0x02
420*4882a593Smuzhiyun	field	ENREQINIT	0x01
421*4882a593Smuzhiyun}
422*4882a593Smuzhiyun
423*4882a593Smuzhiyun/*
424*4882a593Smuzhiyun * SCSI Data Bus (High) (p. 3-29)
425*4882a593Smuzhiyun * This register reads data on the SCSI Data bus directly.
426*4882a593Smuzhiyun */
427*4882a593Smuzhiyunregister SCSIBUSL {
428*4882a593Smuzhiyun	address			0x012
429*4882a593Smuzhiyun	access_mode RW
430*4882a593Smuzhiyun}
431*4882a593Smuzhiyun
432*4882a593Smuzhiyunregister SCSIBUSH {
433*4882a593Smuzhiyun	address			0x013
434*4882a593Smuzhiyun	access_mode RW
435*4882a593Smuzhiyun}
436*4882a593Smuzhiyun
437*4882a593Smuzhiyun/*
438*4882a593Smuzhiyun * SCSI/Host Address (p. 3-30)
439*4882a593Smuzhiyun * These registers hold the host address for the byte about to be
440*4882a593Smuzhiyun * transferred on the SCSI bus.  They are counted up in the same
441*4882a593Smuzhiyun * manner as STCNT is counted down.  SHADDR should always be used
442*4882a593Smuzhiyun * to determine the address of the last byte transferred since HADDR
443*4882a593Smuzhiyun * can be skewed by write ahead.
444*4882a593Smuzhiyun */
445*4882a593Smuzhiyunregister SHADDR {
446*4882a593Smuzhiyun	address			0x014
447*4882a593Smuzhiyun	size	4
448*4882a593Smuzhiyun	access_mode RO
449*4882a593Smuzhiyun	dont_generate_debug_code
450*4882a593Smuzhiyun}
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun/*
453*4882a593Smuzhiyun * Selection Timeout Timer (p. 3-30)
454*4882a593Smuzhiyun */
455*4882a593Smuzhiyunregister SELTIMER {
456*4882a593Smuzhiyun	address			0x018
457*4882a593Smuzhiyun	access_mode RW
458*4882a593Smuzhiyun	count		1
459*4882a593Smuzhiyun	field	STAGE6		0x20
460*4882a593Smuzhiyun	field	STAGE5		0x10
461*4882a593Smuzhiyun	field	STAGE4		0x08
462*4882a593Smuzhiyun	field	STAGE3		0x04
463*4882a593Smuzhiyun	field	STAGE2		0x02
464*4882a593Smuzhiyun	field	STAGE1		0x01
465*4882a593Smuzhiyun	alias	TARGIDIN
466*4882a593Smuzhiyun	dont_generate_debug_code
467*4882a593Smuzhiyun}
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun/*
470*4882a593Smuzhiyun * Selection/Reselection ID (p. 3-31)
471*4882a593Smuzhiyun * Upper four bits are the device id.  The ONEBIT is set when the re/selecting
472*4882a593Smuzhiyun * device did not set its own ID.
473*4882a593Smuzhiyun */
474*4882a593Smuzhiyunregister SELID {
475*4882a593Smuzhiyun	address			0x019
476*4882a593Smuzhiyun	access_mode RW
477*4882a593Smuzhiyun	mask	SELID_MASK	0xf0
478*4882a593Smuzhiyun	field	ONEBIT		0x08
479*4882a593Smuzhiyun	dont_generate_debug_code
480*4882a593Smuzhiyun}
481*4882a593Smuzhiyun
482*4882a593Smuzhiyunregister SCAMCTL {
483*4882a593Smuzhiyun	address			0x01a
484*4882a593Smuzhiyun	access_mode RW
485*4882a593Smuzhiyun	field	ENSCAMSELO	0x80
486*4882a593Smuzhiyun	field	CLRSCAMSELID	0x40
487*4882a593Smuzhiyun	field	ALTSTIM		0x20
488*4882a593Smuzhiyun	field	DFLTTID		0x10
489*4882a593Smuzhiyun	mask	SCAMLVL		0x03
490*4882a593Smuzhiyun}
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun/*
493*4882a593Smuzhiyun * Target Mode Selecting in ID bitmask (aic7890/91/96/97)
494*4882a593Smuzhiyun */
495*4882a593Smuzhiyunregister TARGID {
496*4882a593Smuzhiyun	address			0x01b
497*4882a593Smuzhiyun	size			2
498*4882a593Smuzhiyun	access_mode RW
499*4882a593Smuzhiyun	count		14
500*4882a593Smuzhiyun	dont_generate_debug_code
501*4882a593Smuzhiyun}
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun/*
504*4882a593Smuzhiyun * Serial Port I/O Cabability register (p. 4-95 aic7860 Data Book)
505*4882a593Smuzhiyun * Indicates if external logic has been attached to the chip to
506*4882a593Smuzhiyun * perform the tasks of accessing a serial eeprom, testing termination
507*4882a593Smuzhiyun * strength, and performing cable detection.  On the aic7860, most of
508*4882a593Smuzhiyun * these features are handled on chip, but on the aic7855 an attached
509*4882a593Smuzhiyun * aic3800 does the grunt work.
510*4882a593Smuzhiyun */
511*4882a593Smuzhiyunregister SPIOCAP {
512*4882a593Smuzhiyun	address			0x01b
513*4882a593Smuzhiyun	access_mode RW
514*4882a593Smuzhiyun	count		10
515*4882a593Smuzhiyun	field	SOFT1		0x80
516*4882a593Smuzhiyun	field	SOFT0		0x40
517*4882a593Smuzhiyun	field	SOFTCMDEN	0x20
518*4882a593Smuzhiyun	field	EXT_BRDCTL	0x10	/* External Board control */
519*4882a593Smuzhiyun	field	SEEPROM		0x08	/* External serial eeprom logic */
520*4882a593Smuzhiyun	field	EEPROM		0x04	/* Writable external BIOS ROM */
521*4882a593Smuzhiyun	field	ROM		0x02	/* Logic for accessing external ROM */
522*4882a593Smuzhiyun	field	SSPIOCPS	0x01	/* Termination and cable detection */
523*4882a593Smuzhiyun	dont_generate_debug_code
524*4882a593Smuzhiyun}
525*4882a593Smuzhiyun
526*4882a593Smuzhiyunregister BRDCTL	{
527*4882a593Smuzhiyun	address			0x01d
528*4882a593Smuzhiyun	count		11
529*4882a593Smuzhiyun	field	BRDDAT7		0x80
530*4882a593Smuzhiyun	field	BRDDAT6		0x40
531*4882a593Smuzhiyun	field	BRDDAT5		0x20
532*4882a593Smuzhiyun	field	BRDSTB		0x10
533*4882a593Smuzhiyun	field	BRDCS		0x08
534*4882a593Smuzhiyun	field	BRDRW		0x04
535*4882a593Smuzhiyun	field	BRDCTL1		0x02
536*4882a593Smuzhiyun	field	BRDCTL0		0x01
537*4882a593Smuzhiyun	/* 7890 Definitions */
538*4882a593Smuzhiyun	field	BRDDAT4		0x10
539*4882a593Smuzhiyun	field	BRDDAT3		0x08
540*4882a593Smuzhiyun	field	BRDDAT2		0x04
541*4882a593Smuzhiyun	field	BRDRW_ULTRA2	0x02
542*4882a593Smuzhiyun	field	BRDSTB_ULTRA2	0x01
543*4882a593Smuzhiyun	dont_generate_debug_code
544*4882a593Smuzhiyun}
545*4882a593Smuzhiyun
546*4882a593Smuzhiyun/*
547*4882a593Smuzhiyun * Serial EEPROM Control (p. 4-92 in 7870 Databook)
548*4882a593Smuzhiyun * Controls the reading and writing of an external serial 1-bit
549*4882a593Smuzhiyun * EEPROM Device.  In order to access the serial EEPROM, you must
550*4882a593Smuzhiyun * first set the SEEMS bit that generates a request to the memory
551*4882a593Smuzhiyun * port for access to the serial EEPROM device.  When the memory
552*4882a593Smuzhiyun * port is not busy servicing another request, it reconfigures
553*4882a593Smuzhiyun * to allow access to the serial EEPROM.  When this happens, SEERDY
554*4882a593Smuzhiyun * gets set high to verify that the memory port access has been
555*4882a593Smuzhiyun * granted.
556*4882a593Smuzhiyun *
557*4882a593Smuzhiyun * After successful arbitration for the memory port, the SEECS bit of
558*4882a593Smuzhiyun * the SEECTL register is connected to the chip select.  The SEECK,
559*4882a593Smuzhiyun * SEEDO, and SEEDI are connected to the clock, data out, and data in
560*4882a593Smuzhiyun * lines respectively.  The SEERDY bit of SEECTL is useful in that it
561*4882a593Smuzhiyun * gives us an 800 nsec timer.  After a write to the SEECTL register,
562*4882a593Smuzhiyun * the SEERDY goes high 800 nsec later.  The one exception to this is
563*4882a593Smuzhiyun * when we first request access to the memory port.  The SEERDY goes
564*4882a593Smuzhiyun * high to signify that access has been granted and, for this case, has
565*4882a593Smuzhiyun * no implied timing.
566*4882a593Smuzhiyun *
567*4882a593Smuzhiyun * See 93cx6.c for detailed information on the protocol necessary to
568*4882a593Smuzhiyun * read the serial EEPROM.
569*4882a593Smuzhiyun */
570*4882a593Smuzhiyunregister SEECTL {
571*4882a593Smuzhiyun	address			0x01e
572*4882a593Smuzhiyun	count		11
573*4882a593Smuzhiyun	field	EXTARBACK	0x80
574*4882a593Smuzhiyun	field	EXTARBREQ	0x40
575*4882a593Smuzhiyun	field	SEEMS		0x20
576*4882a593Smuzhiyun	field	SEERDY		0x10
577*4882a593Smuzhiyun	field	SEECS		0x08
578*4882a593Smuzhiyun	field	SEECK		0x04
579*4882a593Smuzhiyun	field	SEEDO		0x02
580*4882a593Smuzhiyun	field	SEEDI		0x01
581*4882a593Smuzhiyun	dont_generate_debug_code
582*4882a593Smuzhiyun}
583*4882a593Smuzhiyun/*
584*4882a593Smuzhiyun * SCSI Block Control (p. 3-32)
585*4882a593Smuzhiyun * Controls Bus type and channel selection.  In a twin channel configuration
586*4882a593Smuzhiyun * addresses 0x00-0x1e are gated to the appropriate channel based on this
587*4882a593Smuzhiyun * register.  SELWIDE allows for the coexistence of 8bit and 16bit devices
588*4882a593Smuzhiyun * on a wide bus.
589*4882a593Smuzhiyun */
590*4882a593Smuzhiyunregister SBLKCTL {
591*4882a593Smuzhiyun	address			0x01f
592*4882a593Smuzhiyun	access_mode RW
593*4882a593Smuzhiyun	field	DIAGLEDEN	0x80	/* Aic78X0 only */
594*4882a593Smuzhiyun	field	DIAGLEDON	0x40	/* Aic78X0 only */
595*4882a593Smuzhiyun	field	AUTOFLUSHDIS	0x20
596*4882a593Smuzhiyun	field	SELBUSB		0x08
597*4882a593Smuzhiyun	field	ENAB40		0x08	/* LVD transceiver active */
598*4882a593Smuzhiyun	field	ENAB20		0x04	/* SE/HVD transceiver active */
599*4882a593Smuzhiyun	field	SELWIDE		0x02
600*4882a593Smuzhiyun	field	XCVR		0x01	/* External transceiver active */
601*4882a593Smuzhiyun}
602*4882a593Smuzhiyun
603*4882a593Smuzhiyun/*
604*4882a593Smuzhiyun * Sequencer Control (p. 3-33)
605*4882a593Smuzhiyun * Error detection mode and speed configuration
606*4882a593Smuzhiyun */
607*4882a593Smuzhiyunregister SEQCTL {
608*4882a593Smuzhiyun	address			0x060
609*4882a593Smuzhiyun	access_mode RW
610*4882a593Smuzhiyun	count		15
611*4882a593Smuzhiyun	field	PERRORDIS	0x80
612*4882a593Smuzhiyun	field	PAUSEDIS	0x40
613*4882a593Smuzhiyun	field	FAILDIS		0x20
614*4882a593Smuzhiyun	field	FASTMODE	0x10
615*4882a593Smuzhiyun	field	BRKADRINTEN	0x08
616*4882a593Smuzhiyun	field	STEP		0x04
617*4882a593Smuzhiyun	field	SEQRESET	0x02
618*4882a593Smuzhiyun	field	LOADRAM		0x01
619*4882a593Smuzhiyun}
620*4882a593Smuzhiyun
621*4882a593Smuzhiyun/*
622*4882a593Smuzhiyun * Sequencer RAM Data (p. 3-34)
623*4882a593Smuzhiyun * Single byte window into the Scratch Ram area starting at the address
624*4882a593Smuzhiyun * specified by SEQADDR0 and SEQADDR1.  To write a full word, simply write
625*4882a593Smuzhiyun * four bytes in succession.  The SEQADDRs will increment after the most
626*4882a593Smuzhiyun * significant byte is written
627*4882a593Smuzhiyun */
628*4882a593Smuzhiyunregister SEQRAM {
629*4882a593Smuzhiyun	address			0x061
630*4882a593Smuzhiyun	access_mode RW
631*4882a593Smuzhiyun	count		2
632*4882a593Smuzhiyun	dont_generate_debug_code
633*4882a593Smuzhiyun}
634*4882a593Smuzhiyun
635*4882a593Smuzhiyun/*
636*4882a593Smuzhiyun * Sequencer Address Registers (p. 3-35)
637*4882a593Smuzhiyun * Only the first bit of SEQADDR1 holds addressing information
638*4882a593Smuzhiyun */
639*4882a593Smuzhiyunregister SEQADDR0 {
640*4882a593Smuzhiyun	address			0x062
641*4882a593Smuzhiyun	access_mode RW
642*4882a593Smuzhiyun	dont_generate_debug_code
643*4882a593Smuzhiyun}
644*4882a593Smuzhiyun
645*4882a593Smuzhiyunregister SEQADDR1 {
646*4882a593Smuzhiyun	address			0x063
647*4882a593Smuzhiyun	access_mode RW
648*4882a593Smuzhiyun	count		8
649*4882a593Smuzhiyun	mask	SEQADDR1_MASK	0x01
650*4882a593Smuzhiyun	dont_generate_debug_code
651*4882a593Smuzhiyun}
652*4882a593Smuzhiyun
653*4882a593Smuzhiyun/*
654*4882a593Smuzhiyun * Accumulator
655*4882a593Smuzhiyun * We cheat by passing arguments in the Accumulator up to the kernel driver
656*4882a593Smuzhiyun */
657*4882a593Smuzhiyunregister ACCUM {
658*4882a593Smuzhiyun	address			0x064
659*4882a593Smuzhiyun	access_mode RW
660*4882a593Smuzhiyun	accumulator
661*4882a593Smuzhiyun	dont_generate_debug_code
662*4882a593Smuzhiyun}
663*4882a593Smuzhiyun
664*4882a593Smuzhiyunregister SINDEX	{
665*4882a593Smuzhiyun	address			0x065
666*4882a593Smuzhiyun	access_mode RW
667*4882a593Smuzhiyun	sindex
668*4882a593Smuzhiyun	dont_generate_debug_code
669*4882a593Smuzhiyun}
670*4882a593Smuzhiyun
671*4882a593Smuzhiyunregister DINDEX {
672*4882a593Smuzhiyun	address			0x066
673*4882a593Smuzhiyun	access_mode RW
674*4882a593Smuzhiyun	dont_generate_debug_code
675*4882a593Smuzhiyun}
676*4882a593Smuzhiyun
677*4882a593Smuzhiyunregister ALLONES {
678*4882a593Smuzhiyun	address			0x069
679*4882a593Smuzhiyun	access_mode RO
680*4882a593Smuzhiyun	allones
681*4882a593Smuzhiyun	dont_generate_debug_code
682*4882a593Smuzhiyun}
683*4882a593Smuzhiyun
684*4882a593Smuzhiyunregister ALLZEROS {
685*4882a593Smuzhiyun	address			0x06a
686*4882a593Smuzhiyun	access_mode RO
687*4882a593Smuzhiyun	allzeros
688*4882a593Smuzhiyun	dont_generate_debug_code
689*4882a593Smuzhiyun}
690*4882a593Smuzhiyun
691*4882a593Smuzhiyunregister NONE {
692*4882a593Smuzhiyun	address			0x06a
693*4882a593Smuzhiyun	access_mode WO
694*4882a593Smuzhiyun	none
695*4882a593Smuzhiyun	dont_generate_debug_code
696*4882a593Smuzhiyun}
697*4882a593Smuzhiyun
698*4882a593Smuzhiyunregister FLAGS {
699*4882a593Smuzhiyun	address			0x06b
700*4882a593Smuzhiyun	access_mode RO
701*4882a593Smuzhiyun	count		18
702*4882a593Smuzhiyun	field	ZERO		0x02
703*4882a593Smuzhiyun	field	CARRY		0x01
704*4882a593Smuzhiyun	dont_generate_debug_code
705*4882a593Smuzhiyun}
706*4882a593Smuzhiyun
707*4882a593Smuzhiyunregister SINDIR	{
708*4882a593Smuzhiyun	address			0x06c
709*4882a593Smuzhiyun	access_mode RO
710*4882a593Smuzhiyun	dont_generate_debug_code
711*4882a593Smuzhiyun}
712*4882a593Smuzhiyun
713*4882a593Smuzhiyunregister DINDIR	 {
714*4882a593Smuzhiyun	address			0x06d
715*4882a593Smuzhiyun	access_mode WO
716*4882a593Smuzhiyun	dont_generate_debug_code
717*4882a593Smuzhiyun}
718*4882a593Smuzhiyun
719*4882a593Smuzhiyunregister FUNCTION1 {
720*4882a593Smuzhiyun	address			0x06e
721*4882a593Smuzhiyun	access_mode RW
722*4882a593Smuzhiyun}
723*4882a593Smuzhiyun
724*4882a593Smuzhiyunregister STACK {
725*4882a593Smuzhiyun	address			0x06f
726*4882a593Smuzhiyun	access_mode RO
727*4882a593Smuzhiyun	count		5
728*4882a593Smuzhiyun	dont_generate_debug_code
729*4882a593Smuzhiyun}
730*4882a593Smuzhiyun
731*4882a593Smuzhiyunconst	STACK_SIZE	4
732*4882a593Smuzhiyun
733*4882a593Smuzhiyun/*
734*4882a593Smuzhiyun * Board Control (p. 3-43)
735*4882a593Smuzhiyun */
736*4882a593Smuzhiyunregister BCTL {
737*4882a593Smuzhiyun	address			0x084
738*4882a593Smuzhiyun	access_mode RW
739*4882a593Smuzhiyun	field	ACE		0x08
740*4882a593Smuzhiyun	field	ENABLE		0x01
741*4882a593Smuzhiyun}
742*4882a593Smuzhiyun
743*4882a593Smuzhiyun/*
744*4882a593Smuzhiyun * On the aic78X0 chips, Board Control is replaced by the DSCommand
745*4882a593Smuzhiyun * register (p. 4-64)
746*4882a593Smuzhiyun */
747*4882a593Smuzhiyunregister DSCOMMAND0 {
748*4882a593Smuzhiyun	address			0x084
749*4882a593Smuzhiyun	access_mode RW
750*4882a593Smuzhiyun	count		7
751*4882a593Smuzhiyun	field	CACHETHEN	0x80	/* Cache Threshold enable */
752*4882a593Smuzhiyun	field	DPARCKEN	0x40	/* Data Parity Check Enable */
753*4882a593Smuzhiyun	field	MPARCKEN	0x20	/* Memory Parity Check Enable */
754*4882a593Smuzhiyun	field	EXTREQLCK	0x10	/* External Request Lock */
755*4882a593Smuzhiyun	/* aic7890/91/96/97 only */
756*4882a593Smuzhiyun	field	INTSCBRAMSEL	0x08	/* Internal SCB RAM Select */
757*4882a593Smuzhiyun	field	RAMPS		0x04	/* External SCB RAM Present */
758*4882a593Smuzhiyun	field	USCBSIZE32	0x02	/* Use 32byte SCB Page Size */
759*4882a593Smuzhiyun	field	CIOPARCKEN	0x01	/* Internal bus parity error enable */
760*4882a593Smuzhiyun	dont_generate_debug_code
761*4882a593Smuzhiyun}
762*4882a593Smuzhiyun
763*4882a593Smuzhiyunregister DSCOMMAND1 {
764*4882a593Smuzhiyun	address			0x085
765*4882a593Smuzhiyun	access_mode RW
766*4882a593Smuzhiyun	mask	DSLATT		0xfc	/* PCI latency timer (non-ultra2) */
767*4882a593Smuzhiyun	field	HADDLDSEL1	0x02	/* Host Address Load Select Bits */
768*4882a593Smuzhiyun	field	HADDLDSEL0	0x01
769*4882a593Smuzhiyun	dont_generate_debug_code
770*4882a593Smuzhiyun}
771*4882a593Smuzhiyun
772*4882a593Smuzhiyun/*
773*4882a593Smuzhiyun * Bus On/Off Time (p. 3-44) aic7770 only
774*4882a593Smuzhiyun */
775*4882a593Smuzhiyunregister BUSTIME {
776*4882a593Smuzhiyun	address			0x085
777*4882a593Smuzhiyun	access_mode RW
778*4882a593Smuzhiyun	count		2
779*4882a593Smuzhiyun	mask	BOFF		0xf0
780*4882a593Smuzhiyun	mask	BON		0x0f
781*4882a593Smuzhiyun	dont_generate_debug_code
782*4882a593Smuzhiyun}
783*4882a593Smuzhiyun
784*4882a593Smuzhiyun/*
785*4882a593Smuzhiyun * Bus Speed (p. 3-45) aic7770 only
786*4882a593Smuzhiyun */
787*4882a593Smuzhiyunregister BUSSPD {
788*4882a593Smuzhiyun	address			0x086
789*4882a593Smuzhiyun	access_mode RW
790*4882a593Smuzhiyun	count		2
791*4882a593Smuzhiyun	mask	DFTHRSH		0xc0
792*4882a593Smuzhiyun	mask	STBOFF		0x38
793*4882a593Smuzhiyun	mask	STBON		0x07
794*4882a593Smuzhiyun	mask	DFTHRSH_100	0xc0
795*4882a593Smuzhiyun	mask	DFTHRSH_75	0x80
796*4882a593Smuzhiyun	dont_generate_debug_code
797*4882a593Smuzhiyun}
798*4882a593Smuzhiyun
799*4882a593Smuzhiyun/* aic7850/55/60/70/80/95 only */
800*4882a593Smuzhiyunregister DSPCISTATUS {
801*4882a593Smuzhiyun	address			0x086
802*4882a593Smuzhiyun	count		4
803*4882a593Smuzhiyun	mask	DFTHRSH_100	0xc0
804*4882a593Smuzhiyun	dont_generate_debug_code
805*4882a593Smuzhiyun}
806*4882a593Smuzhiyun
807*4882a593Smuzhiyun/* aic7890/91/96/97 only */
808*4882a593Smuzhiyunregister HS_MAILBOX {
809*4882a593Smuzhiyun	address			0x086
810*4882a593Smuzhiyun	mask	HOST_MAILBOX	0xF0
811*4882a593Smuzhiyun	mask	SEQ_MAILBOX	0x0F
812*4882a593Smuzhiyun	mask	HOST_TQINPOS	0x80	/* Boundary at either 0 or 128 */
813*4882a593Smuzhiyun	dont_generate_debug_code
814*4882a593Smuzhiyun}
815*4882a593Smuzhiyun
816*4882a593Smuzhiyunconst	HOST_MAILBOX_SHIFT	4
817*4882a593Smuzhiyunconst	SEQ_MAILBOX_SHIFT	0
818*4882a593Smuzhiyun
819*4882a593Smuzhiyun/*
820*4882a593Smuzhiyun * Host Control (p. 3-47) R/W
821*4882a593Smuzhiyun * Overall host control of the device.
822*4882a593Smuzhiyun */
823*4882a593Smuzhiyunregister HCNTRL {
824*4882a593Smuzhiyun	address			0x087
825*4882a593Smuzhiyun	access_mode RW
826*4882a593Smuzhiyun	count		14
827*4882a593Smuzhiyun	field	POWRDN		0x40
828*4882a593Smuzhiyun	field	SWINT		0x10
829*4882a593Smuzhiyun	field	IRQMS		0x08
830*4882a593Smuzhiyun	field	PAUSE		0x04
831*4882a593Smuzhiyun	field	INTEN		0x02
832*4882a593Smuzhiyun	field	CHIPRST		0x01
833*4882a593Smuzhiyun	field	CHIPRSTACK	0x01
834*4882a593Smuzhiyun	dont_generate_debug_code
835*4882a593Smuzhiyun}
836*4882a593Smuzhiyun
837*4882a593Smuzhiyun/*
838*4882a593Smuzhiyun * Host Address (p. 3-48)
839*4882a593Smuzhiyun * This register contains the address of the byte about
840*4882a593Smuzhiyun * to be transferred across the host bus.
841*4882a593Smuzhiyun */
842*4882a593Smuzhiyunregister HADDR {
843*4882a593Smuzhiyun	address			0x088
844*4882a593Smuzhiyun	size	4
845*4882a593Smuzhiyun	access_mode RW
846*4882a593Smuzhiyun	dont_generate_debug_code
847*4882a593Smuzhiyun}
848*4882a593Smuzhiyun
849*4882a593Smuzhiyunregister HCNT {
850*4882a593Smuzhiyun	address			0x08c
851*4882a593Smuzhiyun	size	3
852*4882a593Smuzhiyun	access_mode RW
853*4882a593Smuzhiyun	dont_generate_debug_code
854*4882a593Smuzhiyun}
855*4882a593Smuzhiyun
856*4882a593Smuzhiyun/*
857*4882a593Smuzhiyun * SCB Pointer (p. 3-49)
858*4882a593Smuzhiyun * Gate one of the SCBs into the SCBARRAY window.
859*4882a593Smuzhiyun */
860*4882a593Smuzhiyunregister SCBPTR {
861*4882a593Smuzhiyun	address			0x090
862*4882a593Smuzhiyun	access_mode RW
863*4882a593Smuzhiyun	dont_generate_debug_code
864*4882a593Smuzhiyun}
865*4882a593Smuzhiyun
866*4882a593Smuzhiyun/*
867*4882a593Smuzhiyun * Interrupt Status (p. 3-50)
868*4882a593Smuzhiyun * Status for system interrupts
869*4882a593Smuzhiyun */
870*4882a593Smuzhiyunregister INTSTAT {
871*4882a593Smuzhiyun	address			0x091
872*4882a593Smuzhiyun	access_mode RW
873*4882a593Smuzhiyun	field	BRKADRINT 0x08
874*4882a593Smuzhiyun	field	SCSIINT	  0x04
875*4882a593Smuzhiyun	field	CMDCMPLT  0x02
876*4882a593Smuzhiyun	field	SEQINT    0x01
877*4882a593Smuzhiyun	mask	BAD_PHASE	SEQINT		/* unknown scsi bus phase */
878*4882a593Smuzhiyun	mask	SEND_REJECT	0x10|SEQINT	/* sending a message reject */
879*4882a593Smuzhiyun	mask	PROTO_VIOLATION	0x20|SEQINT	/* SCSI protocol violation */
880*4882a593Smuzhiyun	mask	NO_MATCH	0x30|SEQINT	/* no cmd match for reconnect */
881*4882a593Smuzhiyun	mask	IGN_WIDE_RES	0x40|SEQINT	/* Complex IGN Wide Res Msg */
882*4882a593Smuzhiyun	mask	PDATA_REINIT	0x50|SEQINT	/*
883*4882a593Smuzhiyun						 * Returned to data phase
884*4882a593Smuzhiyun						 * that requires data
885*4882a593Smuzhiyun						 * transfer pointers to be
886*4882a593Smuzhiyun						 * recalculated from the
887*4882a593Smuzhiyun						 * transfer residual.
888*4882a593Smuzhiyun						 */
889*4882a593Smuzhiyun	mask	HOST_MSG_LOOP	0x60|SEQINT	/*
890*4882a593Smuzhiyun						 * The bus is ready for the
891*4882a593Smuzhiyun						 * host to perform another
892*4882a593Smuzhiyun						 * message transaction.  This
893*4882a593Smuzhiyun						 * mechanism is used for things
894*4882a593Smuzhiyun						 * like sync/wide negotiation
895*4882a593Smuzhiyun						 * that require a kernel based
896*4882a593Smuzhiyun						 * message state engine.
897*4882a593Smuzhiyun						 */
898*4882a593Smuzhiyun	mask	BAD_STATUS	0x70|SEQINT	/* Bad status from target */
899*4882a593Smuzhiyun	mask	PERR_DETECTED	0x80|SEQINT	/*
900*4882a593Smuzhiyun						 * Either the phase_lock
901*4882a593Smuzhiyun						 * or inb_next routine has
902*4882a593Smuzhiyun						 * noticed a parity error.
903*4882a593Smuzhiyun						 */
904*4882a593Smuzhiyun	mask	DATA_OVERRUN	0x90|SEQINT	/*
905*4882a593Smuzhiyun						 * Target attempted to write
906*4882a593Smuzhiyun						 * beyond the bounds of its
907*4882a593Smuzhiyun						 * command.
908*4882a593Smuzhiyun						 */
909*4882a593Smuzhiyun	mask	MKMSG_FAILED	0xa0|SEQINT	/*
910*4882a593Smuzhiyun						 * Target completed command
911*4882a593Smuzhiyun						 * without honoring our ATN
912*4882a593Smuzhiyun						 * request to issue a message.
913*4882a593Smuzhiyun						 */
914*4882a593Smuzhiyun	mask	MISSED_BUSFREE	0xb0|SEQINT	/*
915*4882a593Smuzhiyun						 * The sequencer never saw
916*4882a593Smuzhiyun						 * the bus go free after
917*4882a593Smuzhiyun						 * either a command complete
918*4882a593Smuzhiyun						 * or disconnect message.
919*4882a593Smuzhiyun						 */
920*4882a593Smuzhiyun	mask	SCB_MISMATCH	0xc0|SEQINT	/*
921*4882a593Smuzhiyun						 * Downloaded SCB's tag does
922*4882a593Smuzhiyun						 * not match the entry we
923*4882a593Smuzhiyun						 * intended to download.
924*4882a593Smuzhiyun						 */
925*4882a593Smuzhiyun	mask	NO_FREE_SCB	0xd0|SEQINT	/*
926*4882a593Smuzhiyun						 * get_free_or_disc_scb failed.
927*4882a593Smuzhiyun						 */
928*4882a593Smuzhiyun	mask	OUT_OF_RANGE	0xe0|SEQINT
929*4882a593Smuzhiyun
930*4882a593Smuzhiyun	mask	SEQINT_MASK	0xf0|SEQINT	/* SEQINT Status Codes */
931*4882a593Smuzhiyun	mask	INT_PEND  (BRKADRINT|SEQINT|SCSIINT|CMDCMPLT)
932*4882a593Smuzhiyun	dont_generate_debug_code
933*4882a593Smuzhiyun}
934*4882a593Smuzhiyun
935*4882a593Smuzhiyun/*
936*4882a593Smuzhiyun * Hard Error (p. 3-53)
937*4882a593Smuzhiyun * Reporting of catastrophic errors.  You usually cannot recover from
938*4882a593Smuzhiyun * these without a full board reset.
939*4882a593Smuzhiyun */
940*4882a593Smuzhiyunregister ERROR {
941*4882a593Smuzhiyun	address			0x092
942*4882a593Smuzhiyun	access_mode RO
943*4882a593Smuzhiyun	count		26
944*4882a593Smuzhiyun	field	CIOPARERR	0x80	/* Ultra2 only */
945*4882a593Smuzhiyun	field	PCIERRSTAT	0x40	/* PCI only */
946*4882a593Smuzhiyun	field	MPARERR		0x20	/* PCI only */
947*4882a593Smuzhiyun	field	DPARERR		0x10	/* PCI only */
948*4882a593Smuzhiyun	field	SQPARERR	0x08
949*4882a593Smuzhiyun	field	ILLOPCODE	0x04
950*4882a593Smuzhiyun	field	ILLSADDR	0x02
951*4882a593Smuzhiyun	field	ILLHADDR	0x01
952*4882a593Smuzhiyun}
953*4882a593Smuzhiyun
954*4882a593Smuzhiyun/*
955*4882a593Smuzhiyun * Clear Interrupt Status (p. 3-52)
956*4882a593Smuzhiyun */
957*4882a593Smuzhiyunregister CLRINT {
958*4882a593Smuzhiyun	address			0x092
959*4882a593Smuzhiyun	access_mode WO
960*4882a593Smuzhiyun	count		24
961*4882a593Smuzhiyun	field	CLRPARERR	0x10	/* PCI only */
962*4882a593Smuzhiyun	field	CLRBRKADRINT	0x08
963*4882a593Smuzhiyun	field	CLRSCSIINT      0x04
964*4882a593Smuzhiyun	field	CLRCMDINT 	0x02
965*4882a593Smuzhiyun	field	CLRSEQINT 	0x01
966*4882a593Smuzhiyun	dont_generate_debug_code
967*4882a593Smuzhiyun}
968*4882a593Smuzhiyun
969*4882a593Smuzhiyunregister DFCNTRL {
970*4882a593Smuzhiyun	address			0x093
971*4882a593Smuzhiyun	access_mode RW
972*4882a593Smuzhiyun	field	PRELOADEN	0x80	/* aic7890 only */
973*4882a593Smuzhiyun	field	WIDEODD		0x40
974*4882a593Smuzhiyun	field	SCSIEN		0x20
975*4882a593Smuzhiyun	field	SDMAEN		0x10
976*4882a593Smuzhiyun	field	SDMAENACK	0x10
977*4882a593Smuzhiyun	field	HDMAEN		0x08
978*4882a593Smuzhiyun	field	HDMAENACK	0x08
979*4882a593Smuzhiyun	field	DIRECTION	0x04
980*4882a593Smuzhiyun	field	FIFOFLUSH	0x02
981*4882a593Smuzhiyun	field	FIFORESET	0x01
982*4882a593Smuzhiyun}
983*4882a593Smuzhiyun
984*4882a593Smuzhiyunregister DFSTATUS {
985*4882a593Smuzhiyun	address			0x094
986*4882a593Smuzhiyun	access_mode RO
987*4882a593Smuzhiyun	field	PRELOAD_AVAIL	0x80
988*4882a593Smuzhiyun	field	DFCACHETH	0x40
989*4882a593Smuzhiyun	field	FIFOQWDEMP	0x20
990*4882a593Smuzhiyun	field	MREQPEND	0x10
991*4882a593Smuzhiyun	field	HDONE		0x08
992*4882a593Smuzhiyun	field	DFTHRESH	0x04
993*4882a593Smuzhiyun	field	FIFOFULL	0x02
994*4882a593Smuzhiyun	field	FIFOEMP		0x01
995*4882a593Smuzhiyun}
996*4882a593Smuzhiyun
997*4882a593Smuzhiyunregister DFWADDR {
998*4882a593Smuzhiyun	address			0x95
999*4882a593Smuzhiyun	access_mode RW
1000*4882a593Smuzhiyun	dont_generate_debug_code
1001*4882a593Smuzhiyun}
1002*4882a593Smuzhiyun
1003*4882a593Smuzhiyunregister DFRADDR {
1004*4882a593Smuzhiyun	address			0x97
1005*4882a593Smuzhiyun	access_mode RW
1006*4882a593Smuzhiyun}
1007*4882a593Smuzhiyun
1008*4882a593Smuzhiyunregister DFDAT {
1009*4882a593Smuzhiyun	address			0x099
1010*4882a593Smuzhiyun	access_mode RW
1011*4882a593Smuzhiyun	dont_generate_debug_code
1012*4882a593Smuzhiyun}
1013*4882a593Smuzhiyun
1014*4882a593Smuzhiyun/*
1015*4882a593Smuzhiyun * SCB Auto Increment (p. 3-59)
1016*4882a593Smuzhiyun * Byte offset into the SCB Array and an optional bit to allow auto
1017*4882a593Smuzhiyun * incrementing of the address during download and upload operations
1018*4882a593Smuzhiyun */
1019*4882a593Smuzhiyunregister SCBCNT {
1020*4882a593Smuzhiyun	address			0x09a
1021*4882a593Smuzhiyun	access_mode RW
1022*4882a593Smuzhiyun	count		1
1023*4882a593Smuzhiyun	field	SCBAUTO		0x80
1024*4882a593Smuzhiyun	mask	SCBCNT_MASK	0x1f
1025*4882a593Smuzhiyun	dont_generate_debug_code
1026*4882a593Smuzhiyun}
1027*4882a593Smuzhiyun
1028*4882a593Smuzhiyun/*
1029*4882a593Smuzhiyun * Queue In FIFO (p. 3-60)
1030*4882a593Smuzhiyun * Input queue for queued SCBs (commands that the seqencer has yet to start)
1031*4882a593Smuzhiyun */
1032*4882a593Smuzhiyunregister QINFIFO {
1033*4882a593Smuzhiyun	address			0x09b
1034*4882a593Smuzhiyun	access_mode RW
1035*4882a593Smuzhiyun	count		12
1036*4882a593Smuzhiyun	dont_generate_debug_code
1037*4882a593Smuzhiyun}
1038*4882a593Smuzhiyun
1039*4882a593Smuzhiyun/*
1040*4882a593Smuzhiyun * Queue In Count (p. 3-60)
1041*4882a593Smuzhiyun * Number of queued SCBs
1042*4882a593Smuzhiyun */
1043*4882a593Smuzhiyunregister QINCNT	{
1044*4882a593Smuzhiyun	address			0x09c
1045*4882a593Smuzhiyun	access_mode RO
1046*4882a593Smuzhiyun}
1047*4882a593Smuzhiyun
1048*4882a593Smuzhiyun/*
1049*4882a593Smuzhiyun * Queue Out FIFO (p. 3-61)
1050*4882a593Smuzhiyun * Queue of SCBs that have completed and await the host
1051*4882a593Smuzhiyun */
1052*4882a593Smuzhiyunregister QOUTFIFO {
1053*4882a593Smuzhiyun	address			0x09d
1054*4882a593Smuzhiyun	access_mode WO
1055*4882a593Smuzhiyun	count		7
1056*4882a593Smuzhiyun	dont_generate_debug_code
1057*4882a593Smuzhiyun}
1058*4882a593Smuzhiyun
1059*4882a593Smuzhiyunregister CRCCONTROL1 {
1060*4882a593Smuzhiyun	address			0x09d
1061*4882a593Smuzhiyun	access_mode RW
1062*4882a593Smuzhiyun	count		3
1063*4882a593Smuzhiyun	field	CRCONSEEN		0x80
1064*4882a593Smuzhiyun	field	CRCVALCHKEN		0x40
1065*4882a593Smuzhiyun	field	CRCENDCHKEN		0x20
1066*4882a593Smuzhiyun	field	CRCREQCHKEN		0x10
1067*4882a593Smuzhiyun	field	TARGCRCENDEN		0x08
1068*4882a593Smuzhiyun	field	TARGCRCCNTEN		0x04
1069*4882a593Smuzhiyun	dont_generate_debug_code
1070*4882a593Smuzhiyun}
1071*4882a593Smuzhiyun
1072*4882a593Smuzhiyun
1073*4882a593Smuzhiyun/*
1074*4882a593Smuzhiyun * Queue Out Count (p. 3-61)
1075*4882a593Smuzhiyun * Number of queued SCBs in the Out FIFO
1076*4882a593Smuzhiyun */
1077*4882a593Smuzhiyunregister QOUTCNT {
1078*4882a593Smuzhiyun	address			0x09e
1079*4882a593Smuzhiyun	access_mode RO
1080*4882a593Smuzhiyun}
1081*4882a593Smuzhiyun
1082*4882a593Smuzhiyunregister SCSIPHASE {
1083*4882a593Smuzhiyun	address			0x09e
1084*4882a593Smuzhiyun	access_mode RO
1085*4882a593Smuzhiyun	field	STATUS_PHASE	0x20
1086*4882a593Smuzhiyun	field	COMMAND_PHASE	0x10
1087*4882a593Smuzhiyun	field	MSG_IN_PHASE	0x08
1088*4882a593Smuzhiyun	field	MSG_OUT_PHASE	0x04
1089*4882a593Smuzhiyun	field	DATA_IN_PHASE	0x02
1090*4882a593Smuzhiyun	field	DATA_OUT_PHASE	0x01
1091*4882a593Smuzhiyun	mask	DATA_PHASE_MASK	0x03
1092*4882a593Smuzhiyun}
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun/*
1095*4882a593Smuzhiyun * Special Function
1096*4882a593Smuzhiyun */
1097*4882a593Smuzhiyunregister SFUNCT {
1098*4882a593Smuzhiyun	address			0x09f
1099*4882a593Smuzhiyun	access_mode RW
1100*4882a593Smuzhiyun	count	    4
1101*4882a593Smuzhiyun	field	ALT_MODE	0x80
1102*4882a593Smuzhiyun	dont_generate_debug_code
1103*4882a593Smuzhiyun}
1104*4882a593Smuzhiyun
1105*4882a593Smuzhiyun/*
1106*4882a593Smuzhiyun * SCB Definition (p. 5-4)
1107*4882a593Smuzhiyun */
1108*4882a593Smuzhiyunscb {
1109*4882a593Smuzhiyun	address		0x0a0
1110*4882a593Smuzhiyun	size		64
1111*4882a593Smuzhiyun
1112*4882a593Smuzhiyun	SCB_CDB_PTR {
1113*4882a593Smuzhiyun		size	4
1114*4882a593Smuzhiyun		alias	SCB_RESIDUAL_DATACNT
1115*4882a593Smuzhiyun		alias	SCB_CDB_STORE
1116*4882a593Smuzhiyun		dont_generate_debug_code
1117*4882a593Smuzhiyun	}
1118*4882a593Smuzhiyun	SCB_RESIDUAL_SGPTR {
1119*4882a593Smuzhiyun		size	4
1120*4882a593Smuzhiyun		dont_generate_debug_code
1121*4882a593Smuzhiyun	}
1122*4882a593Smuzhiyun	SCB_SCSI_STATUS {
1123*4882a593Smuzhiyun		size	1
1124*4882a593Smuzhiyun		dont_generate_debug_code
1125*4882a593Smuzhiyun	}
1126*4882a593Smuzhiyun	SCB_TARGET_PHASES {
1127*4882a593Smuzhiyun		size	1
1128*4882a593Smuzhiyun		dont_generate_debug_code
1129*4882a593Smuzhiyun	}
1130*4882a593Smuzhiyun	SCB_TARGET_DATA_DIR {
1131*4882a593Smuzhiyun		size	1
1132*4882a593Smuzhiyun		dont_generate_debug_code
1133*4882a593Smuzhiyun	}
1134*4882a593Smuzhiyun	SCB_TARGET_ITAG {
1135*4882a593Smuzhiyun		size	1
1136*4882a593Smuzhiyun		dont_generate_debug_code
1137*4882a593Smuzhiyun	}
1138*4882a593Smuzhiyun	SCB_DATAPTR {
1139*4882a593Smuzhiyun		size	4
1140*4882a593Smuzhiyun		dont_generate_debug_code
1141*4882a593Smuzhiyun	}
1142*4882a593Smuzhiyun	SCB_DATACNT {
1143*4882a593Smuzhiyun		/*
1144*4882a593Smuzhiyun		 * The last byte is really the high address bits for
1145*4882a593Smuzhiyun		 * the data address.
1146*4882a593Smuzhiyun		 */
1147*4882a593Smuzhiyun		size	4
1148*4882a593Smuzhiyun		field	SG_LAST_SEG		0x80	/* In the fourth byte */
1149*4882a593Smuzhiyun		mask	SG_HIGH_ADDR_BITS	0x7F	/* In the fourth byte */
1150*4882a593Smuzhiyun		dont_generate_debug_code
1151*4882a593Smuzhiyun	}
1152*4882a593Smuzhiyun	SCB_SGPTR {
1153*4882a593Smuzhiyun		size	4
1154*4882a593Smuzhiyun		field	SG_RESID_VALID	0x04	/* In the first byte */
1155*4882a593Smuzhiyun		field	SG_FULL_RESID	0x02	/* In the first byte */
1156*4882a593Smuzhiyun		field	SG_LIST_NULL	0x01	/* In the first byte */
1157*4882a593Smuzhiyun		dont_generate_debug_code
1158*4882a593Smuzhiyun	}
1159*4882a593Smuzhiyun	SCB_CONTROL {
1160*4882a593Smuzhiyun		size	1
1161*4882a593Smuzhiyun		field	TARGET_SCB			0x80
1162*4882a593Smuzhiyun		field	STATUS_RCVD			0x80
1163*4882a593Smuzhiyun		field	DISCENB				0x40
1164*4882a593Smuzhiyun		field	TAG_ENB				0x20
1165*4882a593Smuzhiyun		field	MK_MESSAGE			0x10
1166*4882a593Smuzhiyun		field	ULTRAENB			0x08
1167*4882a593Smuzhiyun		field	DISCONNECTED			0x04
1168*4882a593Smuzhiyun		mask	SCB_TAG_TYPE			0x03
1169*4882a593Smuzhiyun	}
1170*4882a593Smuzhiyun	SCB_SCSIID {
1171*4882a593Smuzhiyun		size	1
1172*4882a593Smuzhiyun		field	TWIN_CHNLB			0x80
1173*4882a593Smuzhiyun		mask	TWIN_TID			0x70
1174*4882a593Smuzhiyun		mask	TID				0xf0
1175*4882a593Smuzhiyun		mask	OID				0x0f
1176*4882a593Smuzhiyun	}
1177*4882a593Smuzhiyun	SCB_LUN {
1178*4882a593Smuzhiyun		field	SCB_XFERLEN_ODD			0x80
1179*4882a593Smuzhiyun		mask	LID				0x3f
1180*4882a593Smuzhiyun		size	1
1181*4882a593Smuzhiyun	}
1182*4882a593Smuzhiyun	SCB_TAG {
1183*4882a593Smuzhiyun		size	1
1184*4882a593Smuzhiyun	}
1185*4882a593Smuzhiyun	SCB_CDB_LEN {
1186*4882a593Smuzhiyun		size	1
1187*4882a593Smuzhiyun		dont_generate_debug_code
1188*4882a593Smuzhiyun	}
1189*4882a593Smuzhiyun	SCB_SCSIRATE {
1190*4882a593Smuzhiyun		size	1
1191*4882a593Smuzhiyun		dont_generate_debug_code
1192*4882a593Smuzhiyun	}
1193*4882a593Smuzhiyun	SCB_SCSIOFFSET {
1194*4882a593Smuzhiyun		size	1
1195*4882a593Smuzhiyun		count	1
1196*4882a593Smuzhiyun		dont_generate_debug_code
1197*4882a593Smuzhiyun	}
1198*4882a593Smuzhiyun	SCB_NEXT {
1199*4882a593Smuzhiyun		size	1
1200*4882a593Smuzhiyun		dont_generate_debug_code
1201*4882a593Smuzhiyun	}
1202*4882a593Smuzhiyun	SCB_64_SPARE {
1203*4882a593Smuzhiyun		size	16
1204*4882a593Smuzhiyun	}
1205*4882a593Smuzhiyun	SCB_64_BTT {
1206*4882a593Smuzhiyun		size	16
1207*4882a593Smuzhiyun		dont_generate_debug_code
1208*4882a593Smuzhiyun	}
1209*4882a593Smuzhiyun}
1210*4882a593Smuzhiyun
1211*4882a593Smuzhiyunconst	SCB_UPLOAD_SIZE		32
1212*4882a593Smuzhiyunconst	SCB_DOWNLOAD_SIZE	32
1213*4882a593Smuzhiyunconst	SCB_DOWNLOAD_SIZE_64	48
1214*4882a593Smuzhiyun
1215*4882a593Smuzhiyunconst	SG_SIZEOF	0x08		/* sizeof(struct ahc_dma) */
1216*4882a593Smuzhiyun
1217*4882a593Smuzhiyun/* --------------------- AHA-2840-only definitions -------------------- */
1218*4882a593Smuzhiyun
1219*4882a593Smuzhiyunregister SEECTL_2840 {
1220*4882a593Smuzhiyun	address			0x0c0
1221*4882a593Smuzhiyun	access_mode RW
1222*4882a593Smuzhiyun	count		2
1223*4882a593Smuzhiyun	field	CS_2840		0x04
1224*4882a593Smuzhiyun	field	CK_2840		0x02
1225*4882a593Smuzhiyun	field	DO_2840		0x01
1226*4882a593Smuzhiyun	dont_generate_debug_code
1227*4882a593Smuzhiyun}
1228*4882a593Smuzhiyun
1229*4882a593Smuzhiyunregister STATUS_2840 {
1230*4882a593Smuzhiyun	address			0x0c1
1231*4882a593Smuzhiyun	access_mode RW
1232*4882a593Smuzhiyun	count		4
1233*4882a593Smuzhiyun	field	EEPROM_TF	0x80
1234*4882a593Smuzhiyun	mask	BIOS_SEL	0x60
1235*4882a593Smuzhiyun	mask	ADSEL		0x1e
1236*4882a593Smuzhiyun	field	DI_2840		0x01
1237*4882a593Smuzhiyun	dont_generate_debug_code
1238*4882a593Smuzhiyun}
1239*4882a593Smuzhiyun
1240*4882a593Smuzhiyun/* --------------------- AIC-7870-only definitions -------------------- */
1241*4882a593Smuzhiyun
1242*4882a593Smuzhiyunregister CCHADDR {
1243*4882a593Smuzhiyun	address			0x0E0
1244*4882a593Smuzhiyun	size 8
1245*4882a593Smuzhiyun	dont_generate_debug_code
1246*4882a593Smuzhiyun}
1247*4882a593Smuzhiyun
1248*4882a593Smuzhiyunregister CCHCNT {
1249*4882a593Smuzhiyun	address			0x0E8
1250*4882a593Smuzhiyun	dont_generate_debug_code
1251*4882a593Smuzhiyun}
1252*4882a593Smuzhiyun
1253*4882a593Smuzhiyunregister CCSGRAM {
1254*4882a593Smuzhiyun	address			0x0E9
1255*4882a593Smuzhiyun	dont_generate_debug_code
1256*4882a593Smuzhiyun}
1257*4882a593Smuzhiyun
1258*4882a593Smuzhiyunregister CCSGADDR {
1259*4882a593Smuzhiyun	address			0x0EA
1260*4882a593Smuzhiyun	dont_generate_debug_code
1261*4882a593Smuzhiyun}
1262*4882a593Smuzhiyun
1263*4882a593Smuzhiyunregister CCSGCTL {
1264*4882a593Smuzhiyun	address			0x0EB
1265*4882a593Smuzhiyun	field	CCSGDONE	0x80
1266*4882a593Smuzhiyun	field	CCSGEN		0x08
1267*4882a593Smuzhiyun	field	SG_FETCH_NEEDED 0x02	/* Bit used for software state */
1268*4882a593Smuzhiyun	field	CCSGRESET	0x01
1269*4882a593Smuzhiyun	dont_generate_debug_code
1270*4882a593Smuzhiyun}
1271*4882a593Smuzhiyun
1272*4882a593Smuzhiyunregister CCSCBCNT {
1273*4882a593Smuzhiyun	address			0xEF
1274*4882a593Smuzhiyun	count		1
1275*4882a593Smuzhiyun	dont_generate_debug_code
1276*4882a593Smuzhiyun}
1277*4882a593Smuzhiyun
1278*4882a593Smuzhiyunregister CCSCBCTL {
1279*4882a593Smuzhiyun	address			0x0EE
1280*4882a593Smuzhiyun	field	CCSCBDONE	0x80
1281*4882a593Smuzhiyun	field	ARRDONE		0x40	/* SCB Array prefetch done */
1282*4882a593Smuzhiyun	field	CCARREN		0x10
1283*4882a593Smuzhiyun	field	CCSCBEN		0x08
1284*4882a593Smuzhiyun	field	CCSCBDIR	0x04
1285*4882a593Smuzhiyun	field	CCSCBRESET	0x01
1286*4882a593Smuzhiyun	dont_generate_debug_code
1287*4882a593Smuzhiyun}
1288*4882a593Smuzhiyun
1289*4882a593Smuzhiyunregister CCSCBADDR {
1290*4882a593Smuzhiyun	address			0x0ED
1291*4882a593Smuzhiyun	dont_generate_debug_code
1292*4882a593Smuzhiyun}
1293*4882a593Smuzhiyun
1294*4882a593Smuzhiyunregister CCSCBRAM {
1295*4882a593Smuzhiyun	address			0xEC
1296*4882a593Smuzhiyun	dont_generate_debug_code
1297*4882a593Smuzhiyun}
1298*4882a593Smuzhiyun
1299*4882a593Smuzhiyun/*
1300*4882a593Smuzhiyun * SCB bank address (7895/7896/97 only)
1301*4882a593Smuzhiyun */
1302*4882a593Smuzhiyunregister SCBBADDR {
1303*4882a593Smuzhiyun	address			0x0F0
1304*4882a593Smuzhiyun	access_mode RW
1305*4882a593Smuzhiyun	count		3
1306*4882a593Smuzhiyun	dont_generate_debug_code
1307*4882a593Smuzhiyun}
1308*4882a593Smuzhiyun
1309*4882a593Smuzhiyunregister CCSCBPTR {
1310*4882a593Smuzhiyun	address			0x0F1
1311*4882a593Smuzhiyun	dont_generate_debug_code
1312*4882a593Smuzhiyun}
1313*4882a593Smuzhiyun
1314*4882a593Smuzhiyunregister HNSCB_QOFF {
1315*4882a593Smuzhiyun	address			0x0F4
1316*4882a593Smuzhiyun	count		4
1317*4882a593Smuzhiyun	dont_generate_debug_code
1318*4882a593Smuzhiyun}
1319*4882a593Smuzhiyun
1320*4882a593Smuzhiyunregister SNSCB_QOFF {
1321*4882a593Smuzhiyun	address			0x0F6
1322*4882a593Smuzhiyun	dont_generate_debug_code
1323*4882a593Smuzhiyun}
1324*4882a593Smuzhiyun
1325*4882a593Smuzhiyunregister SDSCB_QOFF {
1326*4882a593Smuzhiyun	address			0x0F8
1327*4882a593Smuzhiyun	dont_generate_debug_code
1328*4882a593Smuzhiyun}
1329*4882a593Smuzhiyun
1330*4882a593Smuzhiyunregister QOFF_CTLSTA {
1331*4882a593Smuzhiyun	address			0x0FA
1332*4882a593Smuzhiyun	field	SCB_AVAIL	0x40
1333*4882a593Smuzhiyun	field	SNSCB_ROLLOVER	0x20
1334*4882a593Smuzhiyun	field	SDSCB_ROLLOVER	0x10
1335*4882a593Smuzhiyun	mask	SCB_QSIZE	0x07
1336*4882a593Smuzhiyun	mask	SCB_QSIZE_256	0x06
1337*4882a593Smuzhiyun	dont_generate_debug_code
1338*4882a593Smuzhiyun}
1339*4882a593Smuzhiyun
1340*4882a593Smuzhiyunregister DFF_THRSH {
1341*4882a593Smuzhiyun	address			0x0FB
1342*4882a593Smuzhiyun	mask	WR_DFTHRSH	0x70
1343*4882a593Smuzhiyun	mask	RD_DFTHRSH	0x07
1344*4882a593Smuzhiyun	mask	RD_DFTHRSH_MIN	0x00
1345*4882a593Smuzhiyun	mask	RD_DFTHRSH_25	0x01
1346*4882a593Smuzhiyun	mask	RD_DFTHRSH_50	0x02
1347*4882a593Smuzhiyun	mask	RD_DFTHRSH_63	0x03
1348*4882a593Smuzhiyun	mask	RD_DFTHRSH_75	0x04
1349*4882a593Smuzhiyun	mask	RD_DFTHRSH_85	0x05
1350*4882a593Smuzhiyun	mask	RD_DFTHRSH_90	0x06
1351*4882a593Smuzhiyun	mask	RD_DFTHRSH_MAX	0x07
1352*4882a593Smuzhiyun	mask	WR_DFTHRSH_MIN	0x00
1353*4882a593Smuzhiyun	mask	WR_DFTHRSH_25	0x10
1354*4882a593Smuzhiyun	mask	WR_DFTHRSH_50	0x20
1355*4882a593Smuzhiyun	mask	WR_DFTHRSH_63	0x30
1356*4882a593Smuzhiyun	mask	WR_DFTHRSH_75	0x40
1357*4882a593Smuzhiyun	mask	WR_DFTHRSH_85	0x50
1358*4882a593Smuzhiyun	mask	WR_DFTHRSH_90	0x60
1359*4882a593Smuzhiyun	mask	WR_DFTHRSH_MAX	0x70
1360*4882a593Smuzhiyun	count	4
1361*4882a593Smuzhiyun	dont_generate_debug_code
1362*4882a593Smuzhiyun}
1363*4882a593Smuzhiyun
1364*4882a593Smuzhiyunregister SG_CACHE_PRE {
1365*4882a593Smuzhiyun	access_mode WO
1366*4882a593Smuzhiyun	address			0x0fc
1367*4882a593Smuzhiyun	mask	SG_ADDR_MASK	0xf8
1368*4882a593Smuzhiyun	field	LAST_SEG	0x02
1369*4882a593Smuzhiyun	field	LAST_SEG_DONE	0x01
1370*4882a593Smuzhiyun	dont_generate_debug_code
1371*4882a593Smuzhiyun}
1372*4882a593Smuzhiyun
1373*4882a593Smuzhiyunregister SG_CACHE_SHADOW {
1374*4882a593Smuzhiyun	access_mode RO
1375*4882a593Smuzhiyun	address			0x0fc
1376*4882a593Smuzhiyun	mask	SG_ADDR_MASK	0xf8
1377*4882a593Smuzhiyun	field	LAST_SEG	0x02
1378*4882a593Smuzhiyun	field	LAST_SEG_DONE	0x01
1379*4882a593Smuzhiyun	dont_generate_debug_code
1380*4882a593Smuzhiyun}
1381*4882a593Smuzhiyun/* ---------------------- Scratch RAM Offsets ------------------------- */
1382*4882a593Smuzhiyun/* These offsets are either to values that are initialized by the board's
1383*4882a593Smuzhiyun * BIOS or are specified by the sequencer code.
1384*4882a593Smuzhiyun *
1385*4882a593Smuzhiyun * The host adapter card (at least the BIOS) uses 20-2f for SCSI
1386*4882a593Smuzhiyun * device information, 32-33 and 5a-5f as well. As it turns out, the
1387*4882a593Smuzhiyun * BIOS trashes 20-2f, writing the synchronous negotiation results
1388*4882a593Smuzhiyun * on top of the BIOS values, so we re-use those for our per-target
1389*4882a593Smuzhiyun * scratchspace (actually a value that can be copied directly into
1390*4882a593Smuzhiyun * SCSIRATE).  The kernel driver will enable synchronous negotiation
1391*4882a593Smuzhiyun * for all targets that have a value other than 0 in the lower four
1392*4882a593Smuzhiyun * bits of the target scratch space.  This should work regardless of
1393*4882a593Smuzhiyun * whether the bios has been installed.
1394*4882a593Smuzhiyun */
1395*4882a593Smuzhiyun
1396*4882a593Smuzhiyunscratch_ram {
1397*4882a593Smuzhiyun	address		0x020
1398*4882a593Smuzhiyun	size		58
1399*4882a593Smuzhiyun
1400*4882a593Smuzhiyun	/*
1401*4882a593Smuzhiyun	 * 1 byte per target starting at this address for configuration values
1402*4882a593Smuzhiyun	 */
1403*4882a593Smuzhiyun	BUSY_TARGETS {
1404*4882a593Smuzhiyun		alias		TARG_SCSIRATE
1405*4882a593Smuzhiyun		size		16
1406*4882a593Smuzhiyun		dont_generate_debug_code
1407*4882a593Smuzhiyun	}
1408*4882a593Smuzhiyun	/*
1409*4882a593Smuzhiyun	 * Bit vector of targets that have ULTRA enabled as set by
1410*4882a593Smuzhiyun	 * the BIOS.  The Sequencer relies on a per-SCB field to
1411*4882a593Smuzhiyun	 * control whether to enable Ultra transfers or not.  During
1412*4882a593Smuzhiyun	 * initialization, we read this field and reuse it for 2
1413*4882a593Smuzhiyun	 * entries in the busy target table.
1414*4882a593Smuzhiyun	 */
1415*4882a593Smuzhiyun	ULTRA_ENB {
1416*4882a593Smuzhiyun		alias		CMDSIZE_TABLE
1417*4882a593Smuzhiyun		size		2
1418*4882a593Smuzhiyun		count		2
1419*4882a593Smuzhiyun		dont_generate_debug_code
1420*4882a593Smuzhiyun	}
1421*4882a593Smuzhiyun	/*
1422*4882a593Smuzhiyun	 * Bit vector of targets that have disconnection disabled as set by
1423*4882a593Smuzhiyun	 * the BIOS.  The Sequencer relies in a per-SCB field to control the
1424*4882a593Smuzhiyun	 * disconnect priveldge.  During initialization, we read this field
1425*4882a593Smuzhiyun	 * and reuse it for 2 entries in the busy target table.
1426*4882a593Smuzhiyun	 */
1427*4882a593Smuzhiyun	DISC_DSB {
1428*4882a593Smuzhiyun		size		2
1429*4882a593Smuzhiyun		count		6
1430*4882a593Smuzhiyun		dont_generate_debug_code
1431*4882a593Smuzhiyun	}
1432*4882a593Smuzhiyun	CMDSIZE_TABLE_TAIL {
1433*4882a593Smuzhiyun		size		4
1434*4882a593Smuzhiyun	}
1435*4882a593Smuzhiyun	/*
1436*4882a593Smuzhiyun	 * Partial transfer past cacheline end to be
1437*4882a593Smuzhiyun	 * transferred using an extra S/G.
1438*4882a593Smuzhiyun	 */
1439*4882a593Smuzhiyun	MWI_RESIDUAL {
1440*4882a593Smuzhiyun		size		1
1441*4882a593Smuzhiyun		dont_generate_debug_code
1442*4882a593Smuzhiyun	}
1443*4882a593Smuzhiyun	/*
1444*4882a593Smuzhiyun	 * SCBID of the next SCB to be started by the controller.
1445*4882a593Smuzhiyun	 */
1446*4882a593Smuzhiyun	NEXT_QUEUED_SCB {
1447*4882a593Smuzhiyun		size		1
1448*4882a593Smuzhiyun		dont_generate_debug_code
1449*4882a593Smuzhiyun	}
1450*4882a593Smuzhiyun	/*
1451*4882a593Smuzhiyun	 * Single byte buffer used to designate the type or message
1452*4882a593Smuzhiyun	 * to send to a target.
1453*4882a593Smuzhiyun	 */
1454*4882a593Smuzhiyun	MSG_OUT {
1455*4882a593Smuzhiyun		size		1
1456*4882a593Smuzhiyun		dont_generate_debug_code
1457*4882a593Smuzhiyun	}
1458*4882a593Smuzhiyun	/* Parameters for DMA Logic */
1459*4882a593Smuzhiyun	DMAPARAMS {
1460*4882a593Smuzhiyun		size		1
1461*4882a593Smuzhiyun		count		12
1462*4882a593Smuzhiyun		field	PRELOADEN	0x80
1463*4882a593Smuzhiyun		field	WIDEODD		0x40
1464*4882a593Smuzhiyun		field	SCSIEN		0x20
1465*4882a593Smuzhiyun		field	SDMAEN		0x10
1466*4882a593Smuzhiyun		field	SDMAENACK	0x10
1467*4882a593Smuzhiyun		field	HDMAEN		0x08
1468*4882a593Smuzhiyun		field	HDMAENACK	0x08
1469*4882a593Smuzhiyun		field	DIRECTION	0x04	/* Set indicates PCI->SCSI */
1470*4882a593Smuzhiyun		field	FIFOFLUSH	0x02
1471*4882a593Smuzhiyun		field	FIFORESET	0x01
1472*4882a593Smuzhiyun		dont_generate_debug_code
1473*4882a593Smuzhiyun	}
1474*4882a593Smuzhiyun	SEQ_FLAGS {
1475*4882a593Smuzhiyun		size		1
1476*4882a593Smuzhiyun		field	NOT_IDENTIFIED		0x80
1477*4882a593Smuzhiyun		field	NO_CDB_SENT		0x40
1478*4882a593Smuzhiyun		field	TARGET_CMD_IS_TAGGED	0x40
1479*4882a593Smuzhiyun		field	DPHASE			0x20
1480*4882a593Smuzhiyun		/* Target flags */
1481*4882a593Smuzhiyun		field	TARG_CMD_PENDING	0x10
1482*4882a593Smuzhiyun		field	CMDPHASE_PENDING	0x08
1483*4882a593Smuzhiyun		field	DPHASE_PENDING		0x04
1484*4882a593Smuzhiyun		field	SPHASE_PENDING		0x02
1485*4882a593Smuzhiyun		field	NO_DISCONNECT		0x01
1486*4882a593Smuzhiyun	}
1487*4882a593Smuzhiyun	/*
1488*4882a593Smuzhiyun	 * Temporary storage for the
1489*4882a593Smuzhiyun	 * target/channel/lun of a
1490*4882a593Smuzhiyun	 * reconnecting target
1491*4882a593Smuzhiyun	 */
1492*4882a593Smuzhiyun	SAVED_SCSIID {
1493*4882a593Smuzhiyun		size		1
1494*4882a593Smuzhiyun		dont_generate_debug_code
1495*4882a593Smuzhiyun	}
1496*4882a593Smuzhiyun	SAVED_LUN {
1497*4882a593Smuzhiyun		size		1
1498*4882a593Smuzhiyun		dont_generate_debug_code
1499*4882a593Smuzhiyun	}
1500*4882a593Smuzhiyun	/*
1501*4882a593Smuzhiyun	 * The last bus phase as seen by the sequencer.
1502*4882a593Smuzhiyun	 */
1503*4882a593Smuzhiyun	LASTPHASE {
1504*4882a593Smuzhiyun		size		1
1505*4882a593Smuzhiyun		field	CDI		0x80
1506*4882a593Smuzhiyun		field	IOI		0x40
1507*4882a593Smuzhiyun		field	MSGI		0x20
1508*4882a593Smuzhiyun		mask	PHASE_MASK	CDI|IOI|MSGI
1509*4882a593Smuzhiyun		mask	P_DATAOUT	0x00
1510*4882a593Smuzhiyun		mask	P_DATAIN	IOI
1511*4882a593Smuzhiyun		mask	P_COMMAND	CDI
1512*4882a593Smuzhiyun		mask	P_MESGOUT	CDI|MSGI
1513*4882a593Smuzhiyun		mask	P_STATUS	CDI|IOI
1514*4882a593Smuzhiyun		mask	P_MESGIN	CDI|IOI|MSGI
1515*4882a593Smuzhiyun		mask	P_BUSFREE	0x01
1516*4882a593Smuzhiyun	}
1517*4882a593Smuzhiyun	/*
1518*4882a593Smuzhiyun	 * head of list of SCBs awaiting
1519*4882a593Smuzhiyun	 * selection
1520*4882a593Smuzhiyun	 */
1521*4882a593Smuzhiyun	WAITING_SCBH {
1522*4882a593Smuzhiyun		size		1
1523*4882a593Smuzhiyun		dont_generate_debug_code
1524*4882a593Smuzhiyun	}
1525*4882a593Smuzhiyun	/*
1526*4882a593Smuzhiyun	 * head of list of SCBs that are
1527*4882a593Smuzhiyun	 * disconnected.  Used for SCB
1528*4882a593Smuzhiyun	 * paging.
1529*4882a593Smuzhiyun	 */
1530*4882a593Smuzhiyun	DISCONNECTED_SCBH {
1531*4882a593Smuzhiyun		size		1
1532*4882a593Smuzhiyun		dont_generate_debug_code
1533*4882a593Smuzhiyun	}
1534*4882a593Smuzhiyun	/*
1535*4882a593Smuzhiyun	 * head of list of SCBs that are
1536*4882a593Smuzhiyun	 * not in use.  Used for SCB paging.
1537*4882a593Smuzhiyun	 */
1538*4882a593Smuzhiyun	FREE_SCBH {
1539*4882a593Smuzhiyun		size		1
1540*4882a593Smuzhiyun		dont_generate_debug_code
1541*4882a593Smuzhiyun	}
1542*4882a593Smuzhiyun	/*
1543*4882a593Smuzhiyun	 * head of list of SCBs that have
1544*4882a593Smuzhiyun	 * completed but have not been
1545*4882a593Smuzhiyun	 * put into the qoutfifo.
1546*4882a593Smuzhiyun	 */
1547*4882a593Smuzhiyun	COMPLETE_SCBH {
1548*4882a593Smuzhiyun		size		1
1549*4882a593Smuzhiyun	}
1550*4882a593Smuzhiyun	/*
1551*4882a593Smuzhiyun	 * Address of the hardware scb array in the host.
1552*4882a593Smuzhiyun	 */
1553*4882a593Smuzhiyun	HSCB_ADDR {
1554*4882a593Smuzhiyun		size		4
1555*4882a593Smuzhiyun		dont_generate_debug_code
1556*4882a593Smuzhiyun	}
1557*4882a593Smuzhiyun	/*
1558*4882a593Smuzhiyun	 * Base address of our shared data with the kernel driver in host
1559*4882a593Smuzhiyun	 * memory.  This includes the qoutfifo and target mode
1560*4882a593Smuzhiyun	 * incoming command queue.
1561*4882a593Smuzhiyun	 */
1562*4882a593Smuzhiyun	SHARED_DATA_ADDR {
1563*4882a593Smuzhiyun		size		4
1564*4882a593Smuzhiyun		dont_generate_debug_code
1565*4882a593Smuzhiyun	}
1566*4882a593Smuzhiyun	KERNEL_QINPOS {
1567*4882a593Smuzhiyun		size		1
1568*4882a593Smuzhiyun		dont_generate_debug_code
1569*4882a593Smuzhiyun	}
1570*4882a593Smuzhiyun	QINPOS {
1571*4882a593Smuzhiyun		size		1
1572*4882a593Smuzhiyun		dont_generate_debug_code
1573*4882a593Smuzhiyun	}
1574*4882a593Smuzhiyun	QOUTPOS {
1575*4882a593Smuzhiyun		size		1
1576*4882a593Smuzhiyun		dont_generate_debug_code
1577*4882a593Smuzhiyun	}
1578*4882a593Smuzhiyun	/*
1579*4882a593Smuzhiyun	 * Kernel and sequencer offsets into the queue of
1580*4882a593Smuzhiyun	 * incoming target mode command descriptors.  The
1581*4882a593Smuzhiyun	 * queue is full when the KERNEL_TQINPOS == TQINPOS.
1582*4882a593Smuzhiyun	 */
1583*4882a593Smuzhiyun	KERNEL_TQINPOS {
1584*4882a593Smuzhiyun		size		1
1585*4882a593Smuzhiyun		dont_generate_debug_code
1586*4882a593Smuzhiyun	}
1587*4882a593Smuzhiyun	TQINPOS {
1588*4882a593Smuzhiyun		size		1
1589*4882a593Smuzhiyun		dont_generate_debug_code
1590*4882a593Smuzhiyun	}
1591*4882a593Smuzhiyun	ARG_1 {
1592*4882a593Smuzhiyun		size		1
1593*4882a593Smuzhiyun		count		1
1594*4882a593Smuzhiyun		mask	SEND_MSG		0x80
1595*4882a593Smuzhiyun		mask	SEND_SENSE		0x40
1596*4882a593Smuzhiyun		mask	SEND_REJ		0x20
1597*4882a593Smuzhiyun		mask	MSGOUT_PHASEMIS		0x10
1598*4882a593Smuzhiyun		mask	EXIT_MSG_LOOP		0x08
1599*4882a593Smuzhiyun		mask	CONT_MSG_LOOP		0x04
1600*4882a593Smuzhiyun		mask	CONT_TARG_SESSION	0x02
1601*4882a593Smuzhiyun		alias	RETURN_1
1602*4882a593Smuzhiyun		dont_generate_debug_code
1603*4882a593Smuzhiyun	}
1604*4882a593Smuzhiyun	ARG_2 {
1605*4882a593Smuzhiyun		size		1
1606*4882a593Smuzhiyun		alias	RETURN_2
1607*4882a593Smuzhiyun		dont_generate_debug_code
1608*4882a593Smuzhiyun	}
1609*4882a593Smuzhiyun
1610*4882a593Smuzhiyun	/*
1611*4882a593Smuzhiyun	 * Snapshot of MSG_OUT taken after each message is sent.
1612*4882a593Smuzhiyun	 */
1613*4882a593Smuzhiyun	LAST_MSG {
1614*4882a593Smuzhiyun		size		1
1615*4882a593Smuzhiyun		alias	TARG_IMMEDIATE_SCB
1616*4882a593Smuzhiyun		dont_generate_debug_code
1617*4882a593Smuzhiyun	}
1618*4882a593Smuzhiyun
1619*4882a593Smuzhiyun	/*
1620*4882a593Smuzhiyun	 * Sequences the kernel driver has okayed for us.  This allows
1621*4882a593Smuzhiyun	 * the driver to do things like prevent initiator or target
1622*4882a593Smuzhiyun	 * operations.
1623*4882a593Smuzhiyun	 */
1624*4882a593Smuzhiyun	SCSISEQ_TEMPLATE {
1625*4882a593Smuzhiyun		size		1
1626*4882a593Smuzhiyun		field	ENSELO		0x40
1627*4882a593Smuzhiyun		field	ENSELI		0x20
1628*4882a593Smuzhiyun		field	ENRSELI		0x10
1629*4882a593Smuzhiyun		field	ENAUTOATNO	0x08
1630*4882a593Smuzhiyun		field	ENAUTOATNI	0x04
1631*4882a593Smuzhiyun		field	ENAUTOATNP	0x02
1632*4882a593Smuzhiyun		dont_generate_debug_code
1633*4882a593Smuzhiyun	}
1634*4882a593Smuzhiyun}
1635*4882a593Smuzhiyun
1636*4882a593Smuzhiyunscratch_ram {
1637*4882a593Smuzhiyun	address		0x056
1638*4882a593Smuzhiyun	size		4
1639*4882a593Smuzhiyun	/*
1640*4882a593Smuzhiyun	 * These scratch ram locations are initialized by the 274X BIOS.
1641*4882a593Smuzhiyun	 * We reuse them after capturing the BIOS settings during
1642*4882a593Smuzhiyun	 * initialization.
1643*4882a593Smuzhiyun	 */
1644*4882a593Smuzhiyun
1645*4882a593Smuzhiyun	/*
1646*4882a593Smuzhiyun	 * The initiator specified tag for this target mode transaction.
1647*4882a593Smuzhiyun	 */
1648*4882a593Smuzhiyun	HA_274_BIOSGLOBAL {
1649*4882a593Smuzhiyun		size	1
1650*4882a593Smuzhiyun		field	HA_274_EXTENDED_TRANS	0x01
1651*4882a593Smuzhiyun		alias	INITIATOR_TAG
1652*4882a593Smuzhiyun		count		1
1653*4882a593Smuzhiyun		dont_generate_debug_code
1654*4882a593Smuzhiyun	}
1655*4882a593Smuzhiyun
1656*4882a593Smuzhiyun	SEQ_FLAGS2 {
1657*4882a593Smuzhiyun		size	1
1658*4882a593Smuzhiyun		field	SCB_DMA			0x01
1659*4882a593Smuzhiyun		field	TARGET_MSG_PENDING	0x02
1660*4882a593Smuzhiyun		dont_generate_debug_code
1661*4882a593Smuzhiyun	}
1662*4882a593Smuzhiyun}
1663*4882a593Smuzhiyun
1664*4882a593Smuzhiyunscratch_ram {
1665*4882a593Smuzhiyun	address		0x05a
1666*4882a593Smuzhiyun	size		6
1667*4882a593Smuzhiyun	/*
1668*4882a593Smuzhiyun	 * These are reserved registers in the card's scratch ram on the 2742.
1669*4882a593Smuzhiyun	 * The EISA configuration chip is mapped here.  On Rev E. of the
1670*4882a593Smuzhiyun	 * aic7770, the sequencer can use this area for scratch, but the
1671*4882a593Smuzhiyun	 * host cannot directly access these registers.  On later chips, this
1672*4882a593Smuzhiyun	 * area can be read and written by both the host and the sequencer.
1673*4882a593Smuzhiyun	 * Even on later chips, many of these locations are initialized by
1674*4882a593Smuzhiyun	 * the BIOS.
1675*4882a593Smuzhiyun	 */
1676*4882a593Smuzhiyun	SCSICONF {
1677*4882a593Smuzhiyun		size		1
1678*4882a593Smuzhiyun		count		12
1679*4882a593Smuzhiyun		field	TERM_ENB	0x80
1680*4882a593Smuzhiyun		field	RESET_SCSI	0x40
1681*4882a593Smuzhiyun		field	ENSPCHK		0x20
1682*4882a593Smuzhiyun		mask	HSCSIID		0x07	/* our SCSI ID */
1683*4882a593Smuzhiyun		mask	HWSCSIID	0x0f	/* our SCSI ID if Wide Bus */
1684*4882a593Smuzhiyun		dont_generate_debug_code
1685*4882a593Smuzhiyun	}
1686*4882a593Smuzhiyun	INTDEF {
1687*4882a593Smuzhiyun		address		0x05c
1688*4882a593Smuzhiyun		size		1
1689*4882a593Smuzhiyun		count		1
1690*4882a593Smuzhiyun		field	EDGE_TRIG	0x80
1691*4882a593Smuzhiyun		mask	VECTOR		0x0f
1692*4882a593Smuzhiyun		dont_generate_debug_code
1693*4882a593Smuzhiyun	}
1694*4882a593Smuzhiyun	HOSTCONF {
1695*4882a593Smuzhiyun		address		0x05d
1696*4882a593Smuzhiyun		size		1
1697*4882a593Smuzhiyun		count		1
1698*4882a593Smuzhiyun		dont_generate_debug_code
1699*4882a593Smuzhiyun	}
1700*4882a593Smuzhiyun	HA_274_BIOSCTRL	{
1701*4882a593Smuzhiyun		address		0x05f
1702*4882a593Smuzhiyun		size		1
1703*4882a593Smuzhiyun		count		1
1704*4882a593Smuzhiyun		mask	BIOSMODE		0x30
1705*4882a593Smuzhiyun		mask	BIOSDISABLED		0x30
1706*4882a593Smuzhiyun		field	CHANNEL_B_PRIMARY	0x08
1707*4882a593Smuzhiyun		dont_generate_debug_code
1708*4882a593Smuzhiyun	}
1709*4882a593Smuzhiyun}
1710*4882a593Smuzhiyun
1711*4882a593Smuzhiyunscratch_ram {
1712*4882a593Smuzhiyun	address		0x070
1713*4882a593Smuzhiyun	size		16
1714*4882a593Smuzhiyun
1715*4882a593Smuzhiyun	/*
1716*4882a593Smuzhiyun	 * Per target SCSI offset values for Ultra2 controllers.
1717*4882a593Smuzhiyun	 */
1718*4882a593Smuzhiyun	TARG_OFFSET {
1719*4882a593Smuzhiyun		size		16
1720*4882a593Smuzhiyun		count		1
1721*4882a593Smuzhiyun		dont_generate_debug_code
1722*4882a593Smuzhiyun	}
1723*4882a593Smuzhiyun}
1724*4882a593Smuzhiyun
1725*4882a593Smuzhiyunconst TID_SHIFT		4
1726*4882a593Smuzhiyunconst SCB_LIST_NULL	0xff
1727*4882a593Smuzhiyunconst TARGET_CMD_CMPLT	0xfe
1728*4882a593Smuzhiyun
1729*4882a593Smuzhiyunconst CCSGADDR_MAX	0x80
1730*4882a593Smuzhiyunconst CCSGRAM_MAXSEGS	16
1731*4882a593Smuzhiyun
1732*4882a593Smuzhiyun/* WDTR Message values */
1733*4882a593Smuzhiyunconst BUS_8_BIT			0x00
1734*4882a593Smuzhiyunconst BUS_16_BIT		0x01
1735*4882a593Smuzhiyunconst BUS_32_BIT		0x02
1736*4882a593Smuzhiyun
1737*4882a593Smuzhiyun/* Offset maximums */
1738*4882a593Smuzhiyunconst MAX_OFFSET_8BIT		0x0f
1739*4882a593Smuzhiyunconst MAX_OFFSET_16BIT		0x08
1740*4882a593Smuzhiyunconst MAX_OFFSET_ULTRA2		0x7f
1741*4882a593Smuzhiyunconst MAX_OFFSET		0x7f
1742*4882a593Smuzhiyunconst HOST_MSG			0xff
1743*4882a593Smuzhiyun
1744*4882a593Smuzhiyun/* Target mode command processing constants */
1745*4882a593Smuzhiyunconst CMD_GROUP_CODE_SHIFT	0x05
1746*4882a593Smuzhiyun
1747*4882a593Smuzhiyunconst STATUS_BUSY		0x08
1748*4882a593Smuzhiyunconst STATUS_QUEUE_FULL	0x28
1749*4882a593Smuzhiyunconst TARGET_DATA_IN		1
1750*4882a593Smuzhiyun
1751*4882a593Smuzhiyun/*
1752*4882a593Smuzhiyun * Downloaded (kernel inserted) constants
1753*4882a593Smuzhiyun */
1754*4882a593Smuzhiyun/* Offsets into the SCBID array where different data is stored */
1755*4882a593Smuzhiyunconst QOUTFIFO_OFFSET download
1756*4882a593Smuzhiyunconst QINFIFO_OFFSET download
1757*4882a593Smuzhiyunconst CACHESIZE_MASK download
1758*4882a593Smuzhiyunconst INVERTED_CACHESIZE_MASK download
1759*4882a593Smuzhiyunconst SG_PREFETCH_CNT download
1760*4882a593Smuzhiyunconst SG_PREFETCH_ALIGN_MASK download
1761*4882a593Smuzhiyunconst SG_PREFETCH_ADDR_MASK download
1762