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