Annotation of sys/dev/microcode/aic7xxx/aic79xx.reg, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: aic79xx.reg,v 1.7 2007/05/26 00:36:03 krw Exp $ */
2: /*
3: * Aic79xx register and scratch ram definitions.
4: *
5: * Copyright (c) 1994-2001, 2004 Justin T. Gibbs.
6: * Copyright (c) 2000-2002 Adaptec Inc.
7: * All rights reserved.
8: *
9: * Redistribution and use in source and binary forms, with or without
10: * modification, are permitted provided that the following conditions
11: * are met:
12: * 1. Redistributions of source code must retain the above copyright
13: * notice, this list of conditions, and the following disclaimer,
14: * without modification.
15: * 2. Redistributions in binary form must reproduce at minimum a disclaimer
16: * substantially similar to the "NO WARRANTY" disclaimer below
17: * ("Disclaimer") and any redistribution must be conditioned upon
18: * including a substantially similar Disclaimer requirement for further
19: * binary redistribution.
20: * 3. Neither the names of the above-listed copyright holders nor the names
21: * of any contributors may be used to endorse or promote products derived
22: * from this software without specific prior written permission.
23: *
24: * Alternatively, this software may be distributed under the terms of the
25: * GNU General Public License ("GPL") version 2 as published by the Free
26: * Software Foundation.
27: *
28: * NO WARRANTY
29: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
30: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
31: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
32: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
33: * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
38: * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39: * POSSIBILITY OF SUCH DAMAGES.
40: *
41: * $FreeBSD: src/sys/dev/aic7xxx/aic79xx.reg,v 1.18 2004/08/04 17:55:34 gibbs Exp $
42: */
43: VERSION = "$Id: aic79xx.reg,v 1.7 2007/05/26 00:36:03 krw Exp $"
44:
45: /*
46: * This file is processed by the aic7xxx_asm utility for use in assembling
47: * firmware for the aic79xx family of SCSI host adapters as well as to generate
48: * a C header file for use in the kernel portion of the Aic79xx driver.
49: */
50:
51: /* Register window Modes */
52: #define M_DFF0 0
53: #define M_DFF1 1
54: #define M_CCHAN 2
55: #define M_SCSI 3
56: #define M_CFG 4
57: #define M_DST_SHIFT 4
58:
59: #define MK_MODE(src, dst) ((src) | ((dst) << M_DST_SHIFT))
60: #define SET_MODE(src, dst) \
61: SET_SRC_MODE src; \
62: SET_DST_MODE dst; \
63: if ((ahd->bugs & AHD_SET_MODE_BUG) != 0) { \
64: mvi MK_MODE(src, dst) call set_mode_work_around; \
65: } else { \
66: mvi MODE_PTR, MK_MODE(src, dst); \
67: }
68:
69: #define RESTORE_MODE(mode) \
70: if ((ahd->bugs & AHD_SET_MODE_BUG) != 0) { \
71: mov mode call set_mode_work_around; \
72: } else { \
73: mov MODE_PTR, mode; \
74: }
75:
76: #define SET_SEQINTCODE(code) \
77: if ((ahd->bugs & AHD_INTCOLLISION_BUG) != 0) { \
78: mvi code call set_seqint_work_around; \
79: } else { \
80: mvi SEQINTCODE, code; \
81: }
82:
83: /*
84: * Mode Pointer
85: * Controls which of the 5, 512byte, address spaces should be used
86: * as the source and destination of any register accesses in our
87: * register window.
88: */
89: register MODE_PTR {
90: address 0x000
91: access_mode RW
92: field DST_MODE 0x70
93: field SRC_MODE 0x07
94: mode_pointer
95: }
96:
97: const SRC_MODE_SHIFT 0
98: const DST_MODE_SHIFT 4
99:
100: /*
101: * Host Interrupt Status
102: */
103: register INTSTAT {
104: address 0x001
105: access_mode RW
106: field HWERRINT 0x80
107: field BRKADRINT 0x40
108: field SWTMINT 0x20
109: field PCIINT 0x10
110: field SCSIINT 0x08
111: field SEQINT 0x04
112: field CMDCMPLT 0x02
113: field SPLTINT 0x01
114: mask INT_PEND 0xFF
115: }
116:
117: /*
118: * Sequencer Interrupt Code
119: */
120: register SEQINTCODE {
121: address 0x002
122: access_mode RW
123: field {
124: NO_SEQINT, /* No seqint pending. */
125: BAD_PHASE, /* unknown scsi bus phase */
126: SEND_REJECT, /* sending a message reject */
127: PROTO_VIOLATION, /* Protocol Violation */
128: NO_MATCH, /* no cmd match for reconnect */
129: IGN_WIDE_RES, /* Complex IGN Wide Res Msg */
130: PDATA_REINIT, /*
131: * Returned to data phase
132: * that requires data
133: * transfer pointers to be
134: * recalculated from the
135: * transfer residual.
136: */
137: HOST_MSG_LOOP, /*
138: * The bus is ready for the
139: * host to perform another
140: * message transaction. This
141: * mechanism is used for things
142: * like sync/wide negotiation
143: * that require a kernel based
144: * message state engine.
145: */
146: BAD_STATUS, /* Bad status from target */
147: DATA_OVERRUN, /*
148: * Target attempted to write
149: * beyond the bounds of its
150: * command.
151: */
152: MKMSG_FAILED, /*
153: * Target completed command
154: * without honoring our ATN
155: * request to issue a message.
156: */
157: MISSED_BUSFREE, /*
158: * The sequencer never saw
159: * the bus go free after
160: * either a command complete
161: * or disconnect message.
162: */
163: DUMP_CARD_STATE,
164: ILLEGAL_PHASE,
165: INVALID_SEQINT,
166: CFG4ISTAT_INTR,
167: STATUS_OVERRUN,
168: CFG4OVERRUN,
169: ENTERING_NONPACK,
170: TASKMGMT_FUNC_COMPLETE, /*
171: * Task management function
172: * request completed with
173: * an expected busfree.
174: */
175: TASKMGMT_CMD_CMPLT_OKAY, /*
176: * A command with a non-zero
177: * task management function
178: * has completed via the normal
179: * command completion method
180: * for commands with a zero
181: * task management function.
182: * This happens when an attempt
183: * to abort a command loses
184: * the race for the command to
185: * complete normally.
186: */
187: TRACEPOINT0,
188: TRACEPOINT1,
189: TRACEPOINT2,
190: TRACEPOINT3,
191: SAW_HWERR,
192: BAD_SCB_STATUS
193: }
194: }
195:
196: /*
197: * Clear Host Interrupt
198: */
199: register CLRINT {
200: address 0x003
201: access_mode WO
202: field CLRHWERRINT 0x80 /* Rev B or greater */
203: field CLRBRKADRINT 0x40
204: field CLRSWTMINT 0x20
205: field CLRPCIINT 0x10
206: field CLRSCSIINT 0x08
207: field CLRSEQINT 0x04
208: field CLRCMDINT 0x02
209: field CLRSPLTINT 0x01
210: }
211:
212: /*
213: * Error Register
214: */
215: register ERROR {
216: address 0x004
217: access_mode RO
218: field CIOPARERR 0x80
219: field CIOACCESFAIL 0x40 /* Rev B or greater */
220: field MPARERR 0x20
221: field DPARERR 0x10
222: field SQPARERR 0x08
223: field ILLOPCODE 0x04
224: field DSCTMOUT 0x02
225: }
226:
227: /*
228: * Clear Error
229: */
230: register CLRERR {
231: address 0x004
232: access_mode WO
233: field CLRCIOPARERR 0x80
234: field CLRCIOACCESFAIL 0x40 /* Rev B or greater */
235: field CLRMPARERR 0x20
236: field CLRDPARERR 0x10
237: field CLRSQPARERR 0x08
238: field CLRILLOPCODE 0x04
239: field CLRDSCTMOUT 0x02
240: }
241:
242: /*
243: * Host Control Register
244: * Overall host control of the device.
245: */
246: register HCNTRL {
247: address 0x005
248: access_mode RW
249: field SEQ_RESET 0x80 /* Rev B or greater */
250: field POWRDN 0x40
251: field SWINT 0x10
252: field SWTIMER_START_B 0x08 /* Rev B or greater */
253: field PAUSE 0x04
254: field INTEN 0x02
255: field CHIPRST 0x01
256: field CHIPRSTACK 0x01
257: }
258:
259: /*
260: * Host New SCB Queue Offset
261: */
262: register HNSCB_QOFF {
263: address 0x006
264: access_mode RW
265: size 2
266: }
267:
268: /*
269: * Host Empty SCB Queue Offset
270: */
271: register HESCB_QOFF {
272: address 0x008
273: access_mode RW
274: }
275:
276: /*
277: * Host Mailbox
278: */
279: register HS_MAILBOX {
280: address 0x00B
281: access_mode RW
282: mask HOST_TQINPOS 0x80 /* Boundary at either 0 or 128 */
283: mask ENINT_COALESCE 0x40 /* Perform interrupt coalescing */
284: }
285:
286: /*
287: * Sequencer Interrupt Status
288: */
289: register SEQINTSTAT {
290: address 0x00C
291: access_mode RO
292: field SEQ_SWTMRTO 0x10
293: field SEQ_SEQINT 0x08
294: field SEQ_SCSIINT 0x04
295: field SEQ_PCIINT 0x02
296: field SEQ_SPLTINT 0x01
297: }
298:
299: /*
300: * Clear SEQ Interrupt
301: */
302: register CLRSEQINTSTAT {
303: address 0x00C
304: access_mode WO
305: field CLRSEQ_SWTMRTO 0x10
306: field CLRSEQ_SEQINT 0x08
307: field CLRSEQ_SCSIINT 0x04
308: field CLRSEQ_PCIINT 0x02
309: field CLRSEQ_SPLTINT 0x01
310: }
311:
312: /*
313: * Software Timer
314: */
315: register SWTIMER {
316: address 0x00E
317: access_mode RW
318: size 2
319: }
320:
321: /*
322: * SEQ New SCB Queue Offset
323: */
324: register SNSCB_QOFF {
325: address 0x010
326: access_mode RW
327: size 2
328: modes M_CCHAN
329: }
330:
331: /*
332: * SEQ Empty SCB Queue Offset
333: */
334: register SESCB_QOFF {
335: address 0x012
336: access_mode RW
337: modes M_CCHAN
338: }
339:
340: /*
341: * SEQ Done SCB Queue Offset
342: */
343: register SDSCB_QOFF {
344: address 0x014
345: access_mode RW
346: modes M_CCHAN
347: size 2
348: }
349:
350: /*
351: * Queue Offset Control & Status
352: */
353: register QOFF_CTLSTA {
354: address 0x016
355: access_mode RW
356: modes M_CCHAN
357: field EMPTY_SCB_AVAIL 0x80
358: field NEW_SCB_AVAIL 0x40
359: field SDSCB_ROLLOVR 0x20
360: field HS_MAILBOX_ACT 0x10
361: field SCB_QSIZE 0x0F {
362: SCB_QSIZE_4,
363: SCB_QSIZE_8,
364: SCB_QSIZE_16,
365: SCB_QSIZE_32,
366: SCB_QSIZE_64,
367: SCB_QSIZE_128,
368: SCB_QSIZE_256,
369: SCB_QSIZE_512,
370: SCB_QSIZE_1024,
371: SCB_QSIZE_2048,
372: SCB_QSIZE_4096,
373: SCB_QSIZE_8192,
374: SCB_QSIZE_16384
375: }
376: }
377:
378: /*
379: * Interrupt Control
380: */
381: register INTCTL {
382: address 0x018
383: access_mode RW
384: field SWTMINTMASK 0x80
385: field SWTMINTEN 0x40
386: field SWTIMER_START 0x20
387: field AUTOCLRCMDINT 0x10
388: field PCIINTEN 0x08
389: field SCSIINTEN 0x04
390: field SEQINTEN 0x02
391: field SPLTINTEN 0x01
392: }
393:
394: /*
395: * Data FIFO Control
396: */
397: register DFCNTRL {
398: address 0x019
399: access_mode RW
400: modes M_DFF0, M_DFF1
401: field PRELOADEN 0x80
402: field SCSIENWRDIS 0x40 /* Rev B only. */
403: field SCSIEN 0x20
404: field SCSIENACK 0x20
405: field HDMAEN 0x08
406: field HDMAENACK 0x08
407: field DIRECTION 0x04
408: field DIRECTIONACK 0x04
409: field FIFOFLUSH 0x02
410: field FIFOFLUSHACK 0x02
411: field DIRECTIONEN 0x01
412: }
413:
414: /*
415: * Device Space Command 0
416: */
417: register DSCOMMAND0 {
418: address 0x019
419: access_mode RW
420: modes M_CFG
421: field CACHETHEN 0x80 /* Cache Threshold enable */
422: field DPARCKEN 0x40 /* Data Parity Check Enable */
423: field MPARCKEN 0x20 /* Memory Parity Check Enable */
424: field EXTREQLCK 0x10 /* External Request Lock */
425: field DISABLE_TWATE 0x02 /* Rev B or greater */
426: field CIOPARCKEN 0x01 /* Internal bus parity error enable */
427: }
428:
429: /*
430: * Data FIFO Status
431: */
432: register DFSTATUS {
433: address 0x01A
434: access_mode RO
435: modes M_DFF0, M_DFF1
436: field PRELOAD_AVAIL 0x80
437: field PKT_PRELOAD_AVAIL 0x40
438: field MREQPEND 0x10
439: field HDONE 0x08
440: field DFTHRESH 0x04
441: field FIFOFULL 0x02
442: field FIFOEMP 0x01
443: }
444:
445: /*
446: * S/G Cache Pointer
447: */
448: register SG_CACHE_PRE {
449: address 0x01B
450: access_mode WO
451: modes M_DFF0, M_DFF1
452: field SG_ADDR_MASK 0xf8
453: field ODD_SEG 0x04
454: field LAST_SEG 0x02
455: }
456:
457: register SG_CACHE_SHADOW {
458: address 0x01B
459: access_mode RO
460: modes M_DFF0, M_DFF1
461: field SG_ADDR_MASK 0xf8
462: field ODD_SEG 0x04
463: field LAST_SEG 0x02
464: field LAST_SEG_DONE 0x01
465: }
466:
467: /*
468: * Arbiter Control
469: */
470: register ARBCTL {
471: address 0x01B
472: access_mode RW
473: modes M_CFG
474: field RESET_HARB 0x80
475: field RETRY_SWEN 0x08
476: field USE_TIME 0x07
477: }
478:
479: /*
480: * Data Channel Host Address
481: */
482: register HADDR {
483: address 0x070
484: access_mode RW
485: size 8
486: modes M_DFF0, M_DFF1
487: }
488:
489: /*
490: * Host Overlay DMA Address
491: */
492: register HODMAADR {
493: address 0x070
494: access_mode RW
495: size 8
496: modes M_SCSI
497: }
498:
499: /*
500: * PCI PLL Delay.
501: */
502: register PLLDELAY {
503: address 0x070
504: access_mode RW
505: size 1
506: modes M_CFG
507: field SPLIT_DROP_REQ 0x80
508: }
509:
510: /*
511: * Data Channel Host Count
512: */
513: register HCNT {
514: address 0x078
515: access_mode RW
516: size 3
517: modes M_DFF0, M_DFF1
518: }
519:
520: /*
521: * Host Overlay DMA Count
522: */
523: register HODMACNT {
524: address 0x078
525: access_mode RW
526: size 2
527: modes M_SCSI
528: }
529:
530: /*
531: * Host Overlay DMA Enable
532: */
533: register HODMAEN {
534: address 0x07A
535: access_mode RW
536: modes M_SCSI
537: }
538:
539: /*
540: * Scatter/Gather Host Address
541: */
542: register SGHADDR {
543: address 0x07C
544: access_mode RW
545: size 8
546: modes M_DFF0, M_DFF1
547: }
548:
549: /*
550: * SCB Host Address
551: */
552: register SCBHADDR {
553: address 0x07C
554: access_mode RW
555: size 8
556: modes M_CCHAN
557: }
558:
559: /*
560: * Scatter/Gather Host Count
561: */
562: register SGHCNT {
563: address 0x084
564: access_mode RW
565: modes M_DFF0, M_DFF1
566: }
567:
568: /*
569: * SCB Host Count
570: */
571: register SCBHCNT {
572: address 0x084
573: access_mode RW
574: modes M_CCHAN
575: }
576:
577: /*
578: * Data FIFO Threshold
579: */
580: register DFF_THRSH {
581: address 0x088
582: access_mode RW
583: modes M_CFG
584: field WR_DFTHRSH 0x70 {
585: WR_DFTHRSH_MIN,
586: WR_DFTHRSH_25,
587: WR_DFTHRSH_50,
588: WR_DFTHRSH_63,
589: WR_DFTHRSH_75,
590: WR_DFTHRSH_85,
591: WR_DFTHRSH_90,
592: WR_DFTHRSH_MAX
593: }
594: field RD_DFTHRSH 0x07 {
595: RD_DFTHRSH_MIN,
596: RD_DFTHRSH_25,
597: RD_DFTHRSH_50,
598: RD_DFTHRSH_63,
599: RD_DFTHRSH_75,
600: RD_DFTHRSH_85,
601: RD_DFTHRSH_90,
602: RD_DFTHRSH_MAX
603: }
604: }
605:
606: /*
607: * ROM Address
608: */
609: register ROMADDR {
610: address 0x08A
611: access_mode RW
612: size 3
613: }
614:
615: /*
616: * ROM Control
617: */
618: register ROMCNTRL {
619: address 0x08D
620: access_mode RW
621: field ROMOP 0xE0
622: field ROMSPD 0x18
623: field REPEAT 0x02
624: field RDY 0x01
625: }
626:
627: /*
628: * ROM Data
629: */
630: register ROMDATA {
631: address 0x08E
632: access_mode RW
633: }
634:
635: /*
636: * Data Channel Receive Message 0
637: */
638: register DCHRXMSG0 {
639: address 0x090
640: access_mode RO
641: modes M_DFF0, M_DFF1
642: field CDNUM 0xF8
643: field CFNUM 0x07
644: }
645:
646: /*
647: * CMC Recieve Message 0
648: */
649: register CMCRXMSG0 {
650: address 0x090
651: access_mode RO
652: modes M_CCHAN
653: field CDNUM 0xF8
654: field CFNUM 0x07
655: }
656:
657: /*
658: * Overlay Recieve Message 0
659: */
660: register OVLYRXMSG0 {
661: address 0x090
662: access_mode RO
663: modes M_SCSI
664: field CDNUM 0xF8
665: field CFNUM 0x07
666: }
667:
668: /*
669: * Relaxed Order Enable
670: */
671: register ROENABLE {
672: address 0x090
673: access_mode RW
674: modes M_CFG
675: field MSIROEN 0x20
676: field OVLYROEN 0x10
677: field CMCROEN 0x08
678: field SGROEN 0x04
679: field DCH1ROEN 0x02
680: field DCH0ROEN 0x01
681: }
682:
683: /*
684: * Data Channel Receive Message 1
685: */
686: register DCHRXMSG1 {
687: address 0x091
688: access_mode RO
689: modes M_DFF0, M_DFF1
690: field CBNUM 0xFF
691: }
692:
693: /*
694: * CMC Recieve Message 1
695: */
696: register CMCRXMSG1 {
697: address 0x091
698: access_mode RO
699: modes M_CCHAN
700: field CBNUM 0xFF
701: }
702:
703: /*
704: * Overlay Recieve Message 1
705: */
706: register OVLYRXMSG1 {
707: address 0x091
708: access_mode RO
709: modes M_SCSI
710: field CBNUM 0xFF
711: }
712:
713: /*
714: * No Snoop Enable
715: */
716: register NSENABLE {
717: address 0x091
718: access_mode RW
719: modes M_CFG
720: field MSINSEN 0x20
721: field OVLYNSEN 0x10
722: field CMCNSEN 0x08
723: field SGNSEN 0x04
724: field DCH1NSEN 0x02
725: field DCH0NSEN 0x01
726: }
727:
728: /*
729: * Data Channel Receive Message 2
730: */
731: register DCHRXMSG2 {
732: address 0x092
733: access_mode RO
734: modes M_DFF0, M_DFF1
735: field MINDEX 0xFF
736: }
737:
738: /*
739: * CMC Recieve Message 2
740: */
741: register CMCRXMSG2 {
742: address 0x092
743: access_mode RO
744: modes M_CCHAN
745: field MINDEX 0xFF
746: }
747:
748: /*
749: * Overlay Recieve Message 2
750: */
751: register OVLYRXMSG2 {
752: address 0x092
753: access_mode RO
754: modes M_SCSI
755: field MINDEX 0xFF
756: }
757:
758: /*
759: * Outstanding Split Transactions
760: */
761: register OST {
762: address 0x092
763: access_mode RW
764: modes M_CFG
765: }
766:
767: /*
768: * Data Channel Receive Message 3
769: */
770: register DCHRXMSG3 {
771: address 0x093
772: access_mode RO
773: modes M_DFF0, M_DFF1
774: field MCLASS 0x0F
775: }
776:
777: /*
778: * CMC Recieve Message 3
779: */
780: register CMCRXMSG3 {
781: address 0x093
782: access_mode RO
783: modes M_CCHAN
784: field MCLASS 0x0F
785: }
786:
787: /*
788: * Overlay Recieve Message 3
789: */
790: register OVLYRXMSG3 {
791: address 0x093
792: access_mode RO
793: modes M_SCSI
794: field MCLASS 0x0F
795: }
796:
797: /*
798: * PCI-X Control
799: */
800: register PCIXCTL {
801: address 0x093
802: access_mode RW
803: modes M_CFG
804: field SERRPULSE 0x80
805: field UNEXPSCIEN 0x20
806: field SPLTSMADIS 0x10
807: field SPLTSTADIS 0x08
808: field SRSPDPEEN 0x04
809: field TSCSERREN 0x02
810: field CMPABCDIS 0x01
811: }
812:
813: /*
814: * CMC Sequencer Byte Count
815: */
816: register CMCSEQBCNT {
817: address 0x094
818: access_mode RO
819: modes M_CCHAN
820: }
821:
822: /*
823: * Overlay Sequencer Byte Count
824: */
825: register OVLYSEQBCNT {
826: address 0x094
827: access_mode RO
828: modes M_SCSI
829: }
830:
831: /*
832: * Data Channel Sequencer Byte Count
833: */
834: register DCHSEQBCNT {
835: address 0x094
836: access_mode RO
837: size 2
838: modes M_DFF0, M_DFF1
839: }
840:
841: /*
842: * Data Channel Split Status 0
843: */
844: register DCHSPLTSTAT0 {
845: address 0x096
846: access_mode RW
847: modes M_DFF0, M_DFF1
848: field STAETERM 0x80
849: field SCBCERR 0x40
850: field SCADERR 0x20
851: field SCDATBUCKET 0x10
852: field CNTNOTCMPLT 0x08
853: field RXOVRUN 0x04
854: field RXSCEMSG 0x02
855: field RXSPLTRSP 0x01
856: }
857:
858: /*
859: * CMC Split Status 0
860: */
861: register CMCSPLTSTAT0 {
862: address 0x096
863: access_mode RW
864: modes M_CCHAN
865: field STAETERM 0x80
866: field SCBCERR 0x40
867: field SCADERR 0x20
868: field SCDATBUCKET 0x10
869: field CNTNOTCMPLT 0x08
870: field RXOVRUN 0x04
871: field RXSCEMSG 0x02
872: field RXSPLTRSP 0x01
873: }
874:
875: /*
876: * Overlay Split Status 0
877: */
878: register OVLYSPLTSTAT0 {
879: address 0x096
880: access_mode RW
881: modes M_SCSI
882: field STAETERM 0x80
883: field SCBCERR 0x40
884: field SCADERR 0x20
885: field SCDATBUCKET 0x10
886: field CNTNOTCMPLT 0x08
887: field RXOVRUN 0x04
888: field RXSCEMSG 0x02
889: field RXSPLTRSP 0x01
890: }
891:
892: /*
893: * Data Channel Split Status 1
894: */
895: register DCHSPLTSTAT1 {
896: address 0x097
897: access_mode RW
898: modes M_DFF0, M_DFF1
899: field RXDATABUCKET 0x01
900: }
901:
902: /*
903: * CMC Split Status 1
904: */
905: register CMCSPLTSTAT1 {
906: address 0x097
907: access_mode RW
908: modes M_CCHAN
909: field RXDATABUCKET 0x01
910: }
911:
912: /*
913: * Overlay Split Status 1
914: */
915: register OVLYSPLTSTAT1 {
916: address 0x097
917: access_mode RW
918: modes M_SCSI
919: field RXDATABUCKET 0x01
920: }
921:
922: /*
923: * S/G Receive Message 0
924: */
925: register SGRXMSG0 {
926: address 0x098
927: access_mode RO
928: modes M_DFF0, M_DFF1
929: field CDNUM 0xF8
930: field CFNUM 0x07
931: }
932:
933: /*
934: * S/G Receive Message 1
935: */
936: register SGRXMSG1 {
937: address 0x099
938: access_mode RO
939: modes M_DFF0, M_DFF1
940: field CBNUM 0xFF
941: }
942:
943: /*
944: * S/G Receive Message 2
945: */
946: register SGRXMSG2 {
947: address 0x09A
948: access_mode RO
949: modes M_DFF0, M_DFF1
950: field MINDEX 0xFF
951: }
952:
953: /*
954: * S/G Receive Message 3
955: */
956: register SGRXMSG3 {
957: address 0x09B
958: access_mode RO
959: modes M_DFF0, M_DFF1
960: field MCLASS 0x0F
961: }
962:
963: /*
964: * Slave Split Out Address 0
965: */
966: register SLVSPLTOUTADR0 {
967: address 0x098
968: access_mode RO
969: modes M_SCSI
970: field LOWER_ADDR 0x7F
971: }
972:
973: /*
974: * Slave Split Out Address 1
975: */
976: register SLVSPLTOUTADR1 {
977: address 0x099
978: access_mode RO
979: modes M_SCSI
980: field REQ_DNUM 0xF8
981: field REQ_FNUM 0x07
982: }
983:
984: /*
985: * Slave Split Out Address 2
986: */
987: register SLVSPLTOUTADR2 {
988: address 0x09A
989: access_mode RO
990: modes M_SCSI
991: field REQ_BNUM 0xFF
992: }
993:
994: /*
995: * Slave Split Out Address 3
996: */
997: register SLVSPLTOUTADR3 {
998: address 0x09B
999: access_mode RO
1000: modes M_SCSI
1001: field RLXORD 020
1002: field TAG_NUM 0x1F
1003: }
1004:
1005: /*
1006: * SG Sequencer Byte Count
1007: */
1008: register SGSEQBCNT {
1009: address 0x09C
1010: access_mode RO
1011: modes M_DFF0, M_DFF1
1012: }
1013:
1014: /*
1015: * Slave Split Out Attribute 0
1016: */
1017: register SLVSPLTOUTATTR0 {
1018: address 0x09C
1019: access_mode RO
1020: modes M_SCSI
1021: field LOWER_BCNT 0xFF
1022: }
1023:
1024: /*
1025: * Slave Split Out Attribute 1
1026: */
1027: register SLVSPLTOUTATTR1 {
1028: address 0x09D
1029: access_mode RO
1030: modes M_SCSI
1031: field CMPLT_DNUM 0xF8
1032: field CMPLT_FNUM 0x07
1033: }
1034:
1035: /*
1036: * Slave Split Out Attribute 2
1037: */
1038: register SLVSPLTOUTATTR2 {
1039: address 0x09E
1040: access_mode RO
1041: size 2
1042: modes M_SCSI
1043: field CMPLT_BNUM 0xFF
1044: }
1045: /*
1046: * S/G Split Status 0
1047: */
1048: register SGSPLTSTAT0 {
1049: address 0x09E
1050: access_mode RW
1051: modes M_DFF0, M_DFF1
1052: field STAETERM 0x80
1053: field SCBCERR 0x40
1054: field SCADERR 0x20
1055: field SCDATBUCKET 0x10
1056: field CNTNOTCMPLT 0x08
1057: field RXOVRUN 0x04
1058: field RXSCEMSG 0x02
1059: field RXSPLTRSP 0x01
1060: }
1061:
1062: /*
1063: * S/G Split Status 1
1064: */
1065: register SGSPLTSTAT1 {
1066: address 0x09F
1067: access_mode RW
1068: modes M_DFF0, M_DFF1
1069: field RXDATABUCKET 0x01
1070: }
1071:
1072: /*
1073: * Special Function
1074: */
1075: register SFUNCT {
1076: address 0x09f
1077: access_mode RW
1078: modes M_CFG
1079: field TEST_GROUP 0xF0
1080: field TEST_NUM 0x0F
1081: }
1082:
1083: /*
1084: * Data FIFO 0 PCI Status
1085: */
1086: register DF0PCISTAT {
1087: address 0x0A0
1088: access_mode RW
1089: modes M_CFG
1090: field DPE 0x80
1091: field SSE 0x40
1092: field RMA 0x20
1093: field RTA 0x10
1094: field SCAAPERR 0x08
1095: field RDPERR 0x04
1096: field TWATERR 0x02
1097: field DPR 0x01
1098: }
1099:
1100: /*
1101: * Data FIFO 1 PCI Status
1102: */
1103: register DF1PCISTAT {
1104: address 0x0A1
1105: access_mode RW
1106: modes M_CFG
1107: field DPE 0x80
1108: field SSE 0x40
1109: field RMA 0x20
1110: field RTA 0x10
1111: field SCAAPERR 0x08
1112: field RDPERR 0x04
1113: field TWATERR 0x02
1114: field DPR 0x01
1115: }
1116:
1117: /*
1118: * S/G PCI Status
1119: */
1120: register SGPCISTAT {
1121: address 0x0A2
1122: access_mode RW
1123: modes M_CFG
1124: field DPE 0x80
1125: field SSE 0x40
1126: field RMA 0x20
1127: field RTA 0x10
1128: field SCAAPERR 0x08
1129: field RDPERR 0x04
1130: field DPR 0x01
1131: }
1132:
1133: /*
1134: * CMC PCI Status
1135: */
1136: register CMCPCISTAT {
1137: address 0x0A3
1138: access_mode RW
1139: modes M_CFG
1140: field DPE 0x80
1141: field SSE 0x40
1142: field RMA 0x20
1143: field RTA 0x10
1144: field SCAAPERR 0x08
1145: field RDPERR 0x04
1146: field TWATERR 0x02
1147: field DPR 0x01
1148: }
1149:
1150: /*
1151: * Overlay PCI Status
1152: */
1153: register OVLYPCISTAT {
1154: address 0x0A4
1155: access_mode RW
1156: modes M_CFG
1157: field DPE 0x80
1158: field SSE 0x40
1159: field RMA 0x20
1160: field RTA 0x10
1161: field SCAAPERR 0x08
1162: field RDPERR 0x04
1163: field DPR 0x01
1164: }
1165:
1166: /*
1167: * PCI Status for MSI Master DMA Transfer
1168: */
1169: register MSIPCISTAT {
1170: address 0x0A6
1171: access_mode RW
1172: modes M_CFG
1173: field SSE 0x40
1174: field RMA 0x20
1175: field RTA 0x10
1176: field CLRPENDMSI 0x08
1177: field TWATERR 0x02
1178: field DPR 0x01
1179: }
1180:
1181: /*
1182: * PCI Status for Target
1183: */
1184: register TARGPCISTAT {
1185: address 0x0A7
1186: access_mode RW
1187: modes M_CFG
1188: field DPE 0x80
1189: field SSE 0x40
1190: field STA 0x08
1191: field TWATERR 0x02
1192: }
1193:
1194: /*
1195: * LQ Packet In
1196: * The last LQ Packet recieved
1197: */
1198: register LQIN {
1199: address 0x020
1200: access_mode RW
1201: size 20
1202: modes M_DFF0, M_DFF1, M_SCSI
1203: }
1204:
1205: /*
1206: * SCB Type Pointer
1207: * SCB offset for Target Mode SCB type information
1208: */
1209: register TYPEPTR {
1210: address 0x020
1211: access_mode RW
1212: modes M_CFG
1213: }
1214:
1215: /*
1216: * Queue Tag Pointer
1217: * SCB offset to the Two Byte tag identifier used for target mode.
1218: */
1219: register TAGPTR {
1220: address 0x021
1221: access_mode RW
1222: modes M_CFG
1223: }
1224:
1225: /*
1226: * Logical Unit Number Pointer
1227: * SCB offset to the LSB (little endian) of the lun field.
1228: */
1229: register LUNPTR {
1230: address 0x022
1231: access_mode RW
1232: modes M_CFG
1233: }
1234:
1235: /*
1236: * Data Length Pointer
1237: * SCB offset for the 4 byte data length field in target mode.
1238: */
1239: register DATALENPTR {
1240: address 0x023
1241: access_mode RW
1242: modes M_CFG
1243: }
1244:
1245: /*
1246: * Status Length Pointer
1247: * SCB offset to the two byte status field in target SCBs.
1248: */
1249: register STATLENPTR {
1250: address 0x024
1251: access_mode RW
1252: modes M_CFG
1253: }
1254:
1255: /*
1256: * Command Length Pointer
1257: * Scb offset for the CDB length field in initiator SCBs.
1258: */
1259: register CMDLENPTR {
1260: address 0x025
1261: access_mode RW
1262: modes M_CFG
1263: }
1264:
1265: /*
1266: * Task Attribute Pointer
1267: * Scb offset for the byte field specifying the attribute byte
1268: * to be used in command packets.
1269: */
1270: register ATTRPTR {
1271: address 0x026
1272: access_mode RW
1273: modes M_CFG
1274: }
1275:
1276: /*
1277: * Task Management Flags Pointer
1278: * Scb offset for the byte field specifying the attribute flags
1279: * byte to be used in command packets.
1280: */
1281: register FLAGPTR {
1282: address 0x027
1283: access_mode RW
1284: modes M_CFG
1285: }
1286:
1287: /*
1288: * Command Pointer
1289: * Scb offset for the first byte in the CDB for initiator SCBs.
1290: */
1291: register CMDPTR {
1292: address 0x028
1293: access_mode RW
1294: modes M_CFG
1295: }
1296:
1297: /*
1298: * Queue Next Pointer
1299: * Scb offset for the 2 byte "next scb link".
1300: */
1301: register QNEXTPTR {
1302: address 0x029
1303: access_mode RW
1304: modes M_CFG
1305: }
1306:
1307: /*
1308: * SCSI ID Pointer
1309: * Scb offset to the value to place in the SCSIID register
1310: * during target mode connections.
1311: */
1312: register IDPTR {
1313: address 0x02A
1314: access_mode RW
1315: modes M_CFG
1316: }
1317:
1318: /*
1319: * Command Aborted Byte Pointer
1320: * Offset to the SCB flags field that includes the
1321: * "SCB aborted" status bit.
1322: */
1323: register ABRTBYTEPTR {
1324: address 0x02B
1325: access_mode RW
1326: modes M_CFG
1327: }
1328:
1329: /*
1330: * Command Aborted Bit Pointer
1331: * Bit offset in the SCB flags field for "SCB aborted" status.
1332: */
1333: register ABRTBITPTR {
1334: address 0x02C
1335: access_mode RW
1336: modes M_CFG
1337: }
1338:
1339: /*
1340: * Rev B or greater.
1341: */
1342: register MAXCMDBYTES {
1343: address 0x02D
1344: access_mode RW
1345: modes M_CFG
1346: }
1347:
1348: /*
1349: * Rev B or greater.
1350: */
1351: register MAXCMD2RCV {
1352: address 0x02E
1353: access_mode RW
1354: modes M_CFG
1355: }
1356:
1357: /*
1358: * Rev B or greater.
1359: */
1360: register SHORTTHRESH {
1361: address 0x02F
1362: access_mode RW
1363: modes M_CFG
1364: }
1365:
1366: /*
1367: * Logical Unit Number Length
1368: * The length, in bytes, of the SCB lun field.
1369: */
1370: register LUNLEN {
1371: address 0x030
1372: access_mode RW
1373: modes M_CFG
1374: mask ILUNLEN 0x0F
1375: mask TLUNLEN 0xF0
1376: }
1377: const LUNLEN_SINGLE_LEVEL_LUN 0xF
1378:
1379: /*
1380: * CDB Limit
1381: * The size, in bytes, of the embedded CDB field in initator SCBs.
1382: */
1383: register CDBLIMIT {
1384: address 0x031
1385: access_mode RW
1386: modes M_CFG
1387: }
1388:
1389: /*
1390: * Maximum Commands
1391: * The maximum number of commands to issue during a
1392: * single packetized connection.
1393: */
1394: register MAXCMD {
1395: address 0x032
1396: access_mode RW
1397: modes M_CFG
1398: }
1399:
1400: /*
1401: * Maximum Command Counter
1402: * The number of commands already sent during this connection
1403: */
1404: register MAXCMDCNT {
1405: address 0x033
1406: access_mode RW
1407: modes M_CFG
1408: }
1409:
1410: /*
1411: * LQ Packet Reserved Bytes
1412: * The bytes to be sent in the currently reserved fileds
1413: * of all LQ packets.
1414: */
1415: register LQRSVD01 {
1416: address 0x034
1417: access_mode RW
1418: modes M_SCSI
1419: }
1420: register LQRSVD16 {
1421: address 0x035
1422: access_mode RW
1423: modes M_SCSI
1424: }
1425: register LQRSVD17 {
1426: address 0x036
1427: access_mode RW
1428: modes M_SCSI
1429: }
1430:
1431: /*
1432: * Command Reserved 0
1433: * The byte to be sent for the reserved byte 0 of
1434: * outgoing command packets.
1435: */
1436: register CMDRSVD0 {
1437: address 0x037
1438: access_mode RW
1439: modes M_CFG
1440: }
1441:
1442: /*
1443: * LQ Manager Control 0
1444: */
1445: register LQCTL0 {
1446: address 0x038
1447: access_mode RW
1448: modes M_CFG
1449: field LQITARGCLT 0xC0
1450: field LQIINITGCLT 0x30
1451: field LQ0TARGCLT 0x0C
1452: field LQ0INITGCLT 0x03
1453: }
1454:
1455: /*
1456: * LQ Manager Control 1
1457: */
1458: register LQCTL1 {
1459: address 0x038
1460: access_mode RW
1461: modes M_DFF0, M_DFF1, M_SCSI
1462: field PCI2PCI 0x04
1463: field SINGLECMD 0x02
1464: field ABORTPENDING 0x01
1465: }
1466:
1467: /*
1468: * LQ Manager Control 2
1469: */
1470: register LQCTL2 {
1471: address 0x039
1472: access_mode RW
1473: modes M_DFF0, M_DFF1, M_SCSI
1474: field LQIRETRY 0x80
1475: field LQICONTINUE 0x40
1476: field LQITOIDLE 0x20
1477: field LQIPAUSE 0x10
1478: field LQORETRY 0x08
1479: field LQOCONTINUE 0x04
1480: field LQOTOIDLE 0x02
1481: field LQOPAUSE 0x01
1482: }
1483:
1484: /*
1485: * SCSI RAM BIST0
1486: */
1487: register SCSBIST0 {
1488: address 0x039
1489: access_mode RW
1490: modes M_CFG
1491: field GSBISTERR 0x40
1492: field GSBISTDONE 0x20
1493: field GSBISTRUN 0x10
1494: field OSBISTERR 0x04
1495: field OSBISTDONE 0x02
1496: field OSBISTRUN 0x01
1497: }
1498:
1499: /*
1500: * SCSI Sequence Control0
1501: */
1502: register SCSISEQ0 {
1503: address 0x03A
1504: access_mode RW
1505: modes M_DFF0, M_DFF1, M_SCSI
1506: field TEMODEO 0x80
1507: field ENSELO 0x40
1508: field ENARBO 0x20
1509: field FORCEBUSFREE 0x10
1510: field SCSIRSTO 0x01
1511: }
1512:
1513: /*
1514: * SCSI RAM BIST 1
1515: */
1516: register SCSBIST1 {
1517: address 0x03A
1518: access_mode RW
1519: modes M_CFG
1520: field NTBISTERR 0x04
1521: field NTBISTDONE 0x02
1522: field NTBISTRUN 0x01
1523: }
1524:
1525: /*
1526: * SCSI Sequence Control 1
1527: */
1528: register SCSISEQ1 {
1529: address 0x03B
1530: access_mode RW
1531: modes M_DFF0, M_DFF1, M_SCSI
1532: field MANUALCTL 0x40
1533: field ENSELI 0x20
1534: field ENRSELI 0x10
1535: field MANUALP 0x0C
1536: field ENAUTOATNP 0x02
1537: field ALTSTIM 0x01
1538: }
1539:
1540: /*
1541: * SCSI Transfer Control 0
1542: */
1543: register SXFRCTL0 {
1544: address 0x03C
1545: access_mode RW
1546: modes M_SCSI
1547: field DFON 0x80
1548: field DFPEXP 0x40
1549: field BIOSCANCELEN 0x10
1550: field SPIOEN 0x08
1551: }
1552:
1553: /*
1554: * SCSI Transfer Control 1
1555: */
1556: register SXFRCTL1 {
1557: address 0x03D
1558: access_mode RW
1559: modes M_SCSI
1560: field BITBUCKET 0x80
1561: field ENSACHK 0x40
1562: field ENSPCHK 0x20
1563: field STIMESEL 0x18
1564: field ENSTIMER 0x04
1565: field ACTNEGEN 0x02
1566: field STPWEN 0x01
1567: }
1568:
1569: /*
1570: * SCSI Transfer Control 2
1571: */
1572: register SXFRCTL2 {
1573: address 0x03E
1574: access_mode RW
1575: modes M_SCSI
1576: field AUTORSTDIS 0x10
1577: field CMDDMAEN 0x08
1578: field ASU 0x07
1579: }
1580:
1581: /*
1582: * SCSI Bus Initiator IDs
1583: * Bitmask of observed initiators on the bus.
1584: */
1585: register BUSINITID {
1586: address 0x03C
1587: access_mode RW
1588: modes M_CFG
1589: size 2
1590: }
1591:
1592: /*
1593: * Data Length Counters
1594: * Packet byte counter.
1595: */
1596: register DLCOUNT {
1597: address 0x03C
1598: access_mode RW
1599: modes M_DFF0, M_DFF1
1600: size 3
1601: }
1602:
1603: /*
1604: * Data FIFO Status
1605: */
1606: register DFFSTAT {
1607: address 0x03F
1608: access_mode RW
1609: modes M_SCSI
1610: field FIFO1FREE 0x20
1611: field FIFO0FREE 0x10
1612: /*
1613: * On the B, this enum only works
1614: * in the read direction. For writes,
1615: * you must use the B version of the
1616: * CURRFIFO_0 definition which is defined
1617: * as a constant outside of this register
1618: * definition to avoid confusing the
1619: * register pretty printing code.
1620: */
1621: enum CURRFIFO 0x03 {
1622: CURRFIFO_0,
1623: CURRFIFO_1,
1624: CURRFIFO_NONE 0x3
1625: }
1626: }
1627:
1628: const B_CURRFIFO_0 0x2
1629:
1630: /*
1631: * SCSI Bus Target IDs
1632: * Bitmask of observed targets on the bus.
1633: */
1634: register BUSTARGID {
1635: address 0x03E
1636: access_mode RW
1637: modes M_CFG
1638: size 2
1639: }
1640:
1641: /*
1642: * SCSI Control Signal Out
1643: */
1644: register SCSISIGO {
1645: address 0x040
1646: access_mode RW
1647: modes M_DFF0, M_DFF1, M_SCSI
1648: field CDO 0x80
1649: field IOO 0x40
1650: field MSGO 0x20
1651: field ATNO 0x10
1652: field SELO 0x08
1653: field BSYO 0x04
1654: field REQO 0x02
1655: field ACKO 0x01
1656: /*
1657: * Possible phases to write into SCSISIG0
1658: */
1659: enum PHASE_MASK CDO|IOO|MSGO {
1660: P_DATAOUT 0x0,
1661: P_DATAIN IOO,
1662: P_DATAOUT_DT P_DATAOUT|MSGO,
1663: P_DATAIN_DT P_DATAIN|MSGO,
1664: P_COMMAND CDO,
1665: P_MESGOUT CDO|MSGO,
1666: P_STATUS CDO|IOO,
1667: P_MESGIN CDO|IOO|MSGO
1668: }
1669: }
1670:
1671: register SCSISIGI {
1672: address 0x041
1673: access_mode RO
1674: modes M_DFF0, M_DFF1, M_SCSI
1675: field CDI 0x80
1676: field IOI 0x40
1677: field MSGI 0x20
1678: field ATNI 0x10
1679: field SELI 0x08
1680: field BSYI 0x04
1681: field REQI 0x02
1682: field ACKI 0x01
1683: /*
1684: * Possible phases in SCSISIGI
1685: */
1686: enum PHASE_MASK CDO|IOO|MSGO {
1687: P_DATAOUT 0x0,
1688: P_DATAIN IOO,
1689: P_DATAOUT_DT P_DATAOUT|MSGO,
1690: P_DATAIN_DT P_DATAIN|MSGO,
1691: P_COMMAND CDO,
1692: P_MESGOUT CDO|MSGO,
1693: P_STATUS CDO|IOO,
1694: P_MESGIN CDO|IOO|MSGO
1695: }
1696: }
1697:
1698: /*
1699: * Multiple Target IDs
1700: * Bitmask of ids to respond as a target.
1701: */
1702: register MULTARGID {
1703: address 0x040
1704: access_mode RW
1705: modes M_CFG
1706: size 2
1707: }
1708:
1709: /*
1710: * SCSI Phase
1711: */
1712: register SCSIPHASE {
1713: address 0x042
1714: access_mode RO
1715: modes M_DFF0, M_DFF1, M_SCSI
1716: field STATUS_PHASE 0x20
1717: field COMMAND_PHASE 0x10
1718: field MSG_IN_PHASE 0x08
1719: field MSG_OUT_PHASE 0x04
1720: field DATA_PHASE_MASK 0x03 {
1721: DATA_OUT_PHASE 0x01,
1722: DATA_IN_PHASE 0x02
1723: }
1724: }
1725:
1726: /*
1727: * SCSI Data 0 Image
1728: */
1729: register SCSIDAT0_IMG {
1730: address 0x043
1731: access_mode RW
1732: modes M_DFF0, M_DFF1, M_SCSI
1733: }
1734:
1735: /*
1736: * SCSI Latched Data
1737: */
1738: register SCSIDAT {
1739: address 0x044
1740: access_mode RW
1741: modes M_DFF0, M_DFF1, M_SCSI
1742: size 2
1743: }
1744:
1745: /*
1746: * SCSI Data Bus
1747: */
1748: register SCSIBUS {
1749: address 0x046
1750: access_mode RW
1751: modes M_DFF0, M_DFF1, M_SCSI
1752: size 2
1753: }
1754:
1755: /*
1756: * Target ID In
1757: */
1758: register TARGIDIN {
1759: address 0x048
1760: access_mode RO
1761: modes M_DFF0, M_DFF1, M_SCSI
1762: field CLKOUT 0x80
1763: field TARGID 0x0F
1764: }
1765:
1766: /*
1767: * Selection/Reselection ID
1768: * Upper four bits are the device id. The ONEBIT is set when the re/selecting
1769: * device did not set its own ID.
1770: */
1771: register SELID {
1772: address 0x049
1773: access_mode RW
1774: modes M_DFF0, M_DFF1, M_SCSI
1775: field SELID_MASK 0xf0
1776: field ONEBIT 0x08
1777: }
1778:
1779: /*
1780: * SCSI Block Control
1781: * Controls Bus type and channel selection. SELWIDE allows for the
1782: * coexistence of 8bit and 16bit devices on a wide bus.
1783: */
1784: register SBLKCTL {
1785: address 0x04A
1786: access_mode RW
1787: modes M_DFF0, M_DFF1, M_SCSI
1788: field DIAGLEDEN 0x80
1789: field DIAGLEDON 0x40
1790: field ENAB40 0x08 /* LVD transceiver active */
1791: field ENAB20 0x04 /* SE/HVD transceiver active */
1792: field SELWIDE 0x02
1793: }
1794:
1795: /*
1796: * Option Mode
1797: */
1798: register OPTIONMODE {
1799: address 0x04A
1800: access_mode RW
1801: modes M_CFG
1802: field BIOSCANCTL 0x80
1803: field AUTOACKEN 0x40
1804: field BIASCANCTL 0x20
1805: field BUSFREEREV 0x10
1806: field ENDGFORMCHK 0x04
1807: field AUTO_MSGOUT_DE 0x02
1808: mask OPTIONMODE_DEFAULTS AUTO_MSGOUT_DE
1809: }
1810:
1811: /*
1812: * SCSI Status 0
1813: */
1814: register SSTAT0 {
1815: address 0x04B
1816: access_mode RO
1817: modes M_DFF0, M_DFF1, M_SCSI
1818: field TARGET 0x80 /* Board acting as target */
1819: field SELDO 0x40 /* Selection Done */
1820: field SELDI 0x20 /* Board has been selected */
1821: field SELINGO 0x10 /* Selection In Progress */
1822: field IOERR 0x08 /* LVD Tranceiver mode changed */
1823: field OVERRUN 0x04 /* SCSI Offset overrun detected */
1824: field SPIORDY 0x02 /* SCSI PIO Ready */
1825: field ARBDO 0x01 /* Arbitration Done Out */
1826: }
1827:
1828: /*
1829: * Clear SCSI Interrupt 0
1830: * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT0.
1831: */
1832: register CLRSINT0 {
1833: address 0x04B
1834: access_mode WO
1835: modes M_DFF0, M_DFF1, M_SCSI
1836: field CLRSELDO 0x40
1837: field CLRSELDI 0x20
1838: field CLRSELINGO 0x10
1839: field CLRIOERR 0x08
1840: field CLROVERRUN 0x04
1841: field CLRSPIORDY 0x02
1842: field CLRARBDO 0x01
1843: }
1844:
1845: /*
1846: * SCSI Interrupt Mode 0
1847: * Setting any bit will enable the corresponding function
1848: * in SIMODE0 to interrupt via the IRQ pin.
1849: */
1850: register SIMODE0 {
1851: address 0x04B
1852: access_mode RW
1853: modes M_CFG
1854: field ENSELDO 0x40
1855: field ENSELDI 0x20
1856: field ENSELINGO 0x10
1857: field ENIOERR 0x08
1858: field ENOVERRUN 0x04
1859: field ENSPIORDY 0x02
1860: field ENARBDO 0x01
1861: }
1862:
1863: /*
1864: * SCSI Status 1
1865: */
1866: register SSTAT1 {
1867: address 0x04C
1868: access_mode RO
1869: modes M_DFF0, M_DFF1, M_SCSI
1870: field SELTO 0x80
1871: field ATNTARG 0x40
1872: field SCSIRSTI 0x20
1873: field PHASEMIS 0x10
1874: field BUSFREE 0x08
1875: field SCSIPERR 0x04
1876: field STRB2FAST 0x02
1877: field REQINIT 0x01
1878: }
1879:
1880: /*
1881: * Clear SCSI Interrupt 1
1882: * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT1.
1883: */
1884: register CLRSINT1 {
1885: address 0x04C
1886: access_mode WO
1887: modes M_DFF0, M_DFF1, M_SCSI
1888: field CLRSELTIMEO 0x80
1889: field CLRATNO 0x40
1890: field CLRSCSIRSTI 0x20
1891: field CLRBUSFREE 0x08
1892: field CLRSCSIPERR 0x04
1893: field CLRSTRB2FAST 0x02
1894: field CLRREQINIT 0x01
1895: }
1896:
1897: /*
1898: * SCSI Status 2
1899: */
1900: register SSTAT2 {
1901: address 0x04d
1902: access_mode RO
1903: modes M_DFF0, M_DFF1, M_SCSI
1904: field BUSFREETIME 0xc0 {
1905: BUSFREE_LQO 0x40,
1906: BUSFREE_DFF0 0x80,
1907: BUSFREE_DFF1 0xC0
1908: }
1909: field NONPACKREQ 0x20
1910: field EXP_ACTIVE 0x10 /* SCSI Expander Active */
1911: field BSYX 0x08 /* Busy Expander */
1912: field WIDE_RES 0x04 /* Modes 0 and 1 only */
1913: field SDONE 0x02 /* Modes 0 and 1 only */
1914: field DMADONE 0x01 /* Modes 0 and 1 only */
1915: }
1916:
1917: /*
1918: * Clear SCSI Interrupt 2
1919: */
1920: register CLRSINT2 {
1921: address 0x04D
1922: access_mode WO
1923: modes M_DFF0, M_DFF1, M_SCSI
1924: field CLRNONPACKREQ 0x20
1925: field CLRWIDE_RES 0x04 /* Modes 0 and 1 only */
1926: field CLRSDONE 0x02 /* Modes 0 and 1 only */
1927: field CLRDMADONE 0x01 /* Modes 0 and 1 only */
1928: }
1929:
1930: /*
1931: * SCSI Interrupt Mode 2
1932: */
1933: register SIMODE2 {
1934: address 0x04D
1935: access_mode RW
1936: modes M_CFG
1937: field ENWIDE_RES 0x04
1938: field ENSDONE 0x02
1939: field ENDMADONE 0x01
1940: }
1941:
1942: /*
1943: * Physical Error Diagnosis
1944: */
1945: register PERRDIAG {
1946: address 0x04E
1947: access_mode RO
1948: modes M_DFF0, M_DFF1, M_SCSI
1949: field HIZERO 0x80
1950: field HIPERR 0x40
1951: field PREVPHASE 0x20
1952: field PARITYERR 0x10
1953: field AIPERR 0x08
1954: field CRCERR 0x04
1955: field DGFORMERR 0x02
1956: field DTERR 0x01
1957: }
1958:
1959: /*
1960: * LQI Manager Current State
1961: */
1962: register LQISTATE {
1963: address 0x04E
1964: access_mode RO
1965: modes M_CFG
1966: }
1967:
1968: /*
1969: * SCSI Offset Count
1970: */
1971: register SOFFCNT {
1972: address 0x04F
1973: access_mode RO
1974: modes M_DFF0, M_DFF1, M_SCSI
1975: }
1976:
1977: /*
1978: * LQO Manager Current State
1979: */
1980: register LQOSTATE {
1981: address 0x04F
1982: access_mode RO
1983: modes M_CFG
1984: }
1985:
1986: /*
1987: * LQI Manager Status
1988: */
1989: register LQISTAT0 {
1990: address 0x050
1991: access_mode RO
1992: modes M_DFF0, M_DFF1, M_SCSI
1993: field LQIATNQAS 0x20
1994: field LQICRCT1 0x10
1995: field LQICRCT2 0x08
1996: field LQIBADLQT 0x04
1997: field LQIATNLQ 0x02
1998: field LQIATNCMD 0x01
1999: }
2000:
2001: /*
2002: * Clear LQI Interrupts 0
2003: */
2004: register CLRLQIINT0 {
2005: address 0x050
2006: access_mode WO
2007: modes M_DFF0, M_DFF1, M_SCSI
2008: field CLRLQIATNQAS 0x20
2009: field CLRLQICRCT1 0x10
2010: field CLRLQICRCT2 0x08
2011: field CLRLQIBADLQT 0x04
2012: field CLRLQIATNLQ 0x02
2013: field CLRLQIATNCMD 0x01
2014: }
2015:
2016: /*
2017: * LQI Manager Interrupt Mode 0
2018: */
2019: register LQIMODE0 {
2020: address 0x050
2021: access_mode RW
2022: modes M_CFG
2023: field ENLQIATNQASK 0x20
2024: field ENLQICRCT1 0x10
2025: field ENLQICRCT2 0x08
2026: field ENLQIBADLQT 0x04
2027: field ENLQIATNLQ 0x02
2028: field ENLQIATNCMD 0x01
2029: }
2030:
2031: /*
2032: * LQI Manager Status 1
2033: */
2034: register LQISTAT1 {
2035: address 0x051
2036: access_mode RO
2037: modes M_DFF0, M_DFF1, M_SCSI
2038: field LQIPHASE_LQ 0x80
2039: field LQIPHASE_NLQ 0x40
2040: field LQIABORT 0x20
2041: field LQICRCI_LQ 0x10
2042: field LQICRCI_NLQ 0x08
2043: field LQIBADLQI 0x04
2044: field LQIOVERI_LQ 0x02
2045: field LQIOVERI_NLQ 0x01
2046: }
2047:
2048: /*
2049: * Clear LQI Manager Interrupts1
2050: */
2051: register CLRLQIINT1 {
2052: address 0x051
2053: access_mode WO
2054: modes M_DFF0, M_DFF1, M_SCSI
2055: field CLRLQIPHASE_LQ 0x80
2056: field CLRLQIPHASE_NLQ 0x40
2057: field CLRLIQABORT 0x20
2058: field CLRLQICRCI_LQ 0x10
2059: field CLRLQICRCI_NLQ 0x08
2060: field CLRLQIBADLQI 0x04
2061: field CLRLQIOVERI_LQ 0x02
2062: field CLRLQIOVERI_NLQ 0x01
2063: }
2064:
2065: /*
2066: * LQI Manager Interrupt Mode 1
2067: */
2068: register LQIMODE1 {
2069: address 0x051
2070: access_mode RW
2071: modes M_CFG
2072: field ENLQIPHASE_LQ 0x80 /* LQIPHASE1 */
2073: field ENLQIPHASE_NLQ 0x40 /* LQIPHASE2 */
2074: field ENLIQABORT 0x20
2075: field ENLQICRCI_LQ 0x10 /* LQICRCI1 */
2076: field ENLQICRCI_NLQ 0x08 /* LQICRCI2 */
2077: field ENLQIBADLQI 0x04
2078: field ENLQIOVERI_LQ 0x02 /* LQIOVERI1 */
2079: field ENLQIOVERI_NLQ 0x01 /* LQIOVERI2 */
2080: }
2081:
2082: /*
2083: * LQI Manager Status 2
2084: */
2085: register LQISTAT2 {
2086: address 0x052
2087: access_mode RO
2088: modes M_DFF0, M_DFF1, M_SCSI
2089: field PACKETIZED 0x80
2090: field LQIPHASE_OUTPKT 0x40
2091: field LQIWORKONLQ 0x20
2092: field LQIWAITFIFO 0x10
2093: field LQISTOPPKT 0x08
2094: field LQISTOPLQ 0x04
2095: field LQISTOPCMD 0x02
2096: field LQIGSAVAIL 0x01
2097: }
2098:
2099: /*
2100: * SCSI Status 3
2101: */
2102: register SSTAT3 {
2103: address 0x053
2104: access_mode RO
2105: modes M_DFF0, M_DFF1, M_SCSI
2106: field NTRAMPERR 0x02
2107: field OSRAMPERR 0x01
2108: }
2109:
2110: /*
2111: * Clear SCSI Status 3
2112: */
2113: register CLRSINT3 {
2114: address 0x053
2115: access_mode WO
2116: modes M_DFF0, M_DFF1, M_SCSI
2117: field CLRNTRAMPERR 0x02
2118: field CLROSRAMPERR 0x01
2119: }
2120:
2121: /*
2122: * SCSI Interrupt Mode 3
2123: */
2124: register SIMODE3 {
2125: address 0x053
2126: access_mode RW
2127: modes M_CFG
2128: field ENNTRAMPERR 0x02
2129: field ENOSRAMPERR 0x01
2130: }
2131:
2132: /*
2133: * LQO Manager Status 0
2134: */
2135: register LQOSTAT0 {
2136: address 0x054
2137: access_mode RO
2138: modes M_DFF0, M_DFF1, M_SCSI
2139: field LQOTARGSCBPERR 0x10
2140: field LQOSTOPT2 0x08
2141: field LQOATNLQ 0x04
2142: field LQOATNPKT 0x02
2143: field LQOTCRC 0x01
2144: }
2145:
2146: /*
2147: * Clear LQO Manager interrupt 0
2148: */
2149: register CLRLQOINT0 {
2150: address 0x054
2151: access_mode WO
2152: modes M_DFF0, M_DFF1, M_SCSI
2153: field CLRLQOTARGSCBPERR 0x10
2154: field CLRLQOSTOPT2 0x08
2155: field CLRLQOATNLQ 0x04
2156: field CLRLQOATNPKT 0x02
2157: field CLRLQOTCRC 0x01
2158: }
2159:
2160: /*
2161: * LQO Manager Interrupt Mode 0
2162: */
2163: register LQOMODE0 {
2164: address 0x054
2165: access_mode RW
2166: modes M_CFG
2167: field ENLQOTARGSCBPERR 0x10
2168: field ENLQOSTOPT2 0x08
2169: field ENLQOATNLQ 0x04
2170: field ENLQOATNPKT 0x02
2171: field ENLQOTCRC 0x01
2172: }
2173:
2174: /*
2175: * LQO Manager Status 1
2176: */
2177: register LQOSTAT1 {
2178: address 0x055
2179: access_mode RO
2180: modes M_DFF0, M_DFF1, M_SCSI
2181: field LQOINITSCBPERR 0x10
2182: field LQOSTOPI2 0x08
2183: field LQOBADQAS 0x04
2184: field LQOBUSFREE 0x02
2185: field LQOPHACHGINPKT 0x01
2186: }
2187:
2188: /*
2189: * Clear LOQ Interrupt 1
2190: */
2191: register CLRLQOINT1 {
2192: address 0x055
2193: access_mode WO
2194: modes M_DFF0, M_DFF1, M_SCSI
2195: field CLRLQOINITSCBPERR 0x10
2196: field CLRLQOSTOPI2 0x08
2197: field CLRLQOBADQAS 0x04
2198: field CLRLQOBUSFREE 0x02
2199: field CLRLQOPHACHGINPKT 0x01
2200: }
2201:
2202: /*
2203: * LQO Manager Interrupt Mode 1
2204: */
2205: register LQOMODE1 {
2206: address 0x055
2207: access_mode RW
2208: modes M_CFG
2209: field ENLQOINITSCBPERR 0x10
2210: field ENLQOSTOPI2 0x08
2211: field ENLQOBADQAS 0x04
2212: field ENLQOBUSFREE 0x02
2213: field ENLQOPHACHGINPKT 0x01
2214: }
2215:
2216: /*
2217: * LQO Manager Status 2
2218: */
2219: register LQOSTAT2 {
2220: address 0x056
2221: access_mode RO
2222: modes M_DFF0, M_DFF1, M_SCSI
2223: field LQOPKT 0xE0
2224: field LQOWAITFIFO 0x10
2225: field LQOPHACHGOUTPKT 0x02 /* outside of packet boundaries. */
2226: field LQOSTOP0 0x01 /* Stopped after sending all packets */
2227: }
2228:
2229: /*
2230: * Output Synchronizer Space Count
2231: */
2232: register OS_SPACE_CNT {
2233: address 0x056
2234: access_mode RO
2235: modes M_CFG
2236: }
2237:
2238: /*
2239: * SCSI Interrupt Mode 1
2240: * Setting any bit will enable the corresponding function
2241: * in SIMODE1 to interrupt via the IRQ pin.
2242: */
2243: register SIMODE1 {
2244: address 0x057
2245: access_mode RW
2246: modes M_DFF0, M_DFF1, M_SCSI
2247: field ENSELTIMO 0x80
2248: field ENATNTARG 0x40
2249: field ENSCSIRST 0x20
2250: field ENPHASEMIS 0x10
2251: field ENBUSFREE 0x08
2252: field ENSCSIPERR 0x04
2253: field ENSTRB2FAST 0x02
2254: field ENREQINIT 0x01
2255: }
2256:
2257: /*
2258: * Good Status FIFO
2259: */
2260: register GSFIFO {
2261: address 0x058
2262: access_mode RO
2263: size 2
2264: modes M_DFF0, M_DFF1, M_SCSI
2265: }
2266:
2267: /*
2268: * Data FIFO SCSI Transfer Control
2269: */
2270: register DFFSXFRCTL {
2271: address 0x05A
2272: access_mode RW
2273: modes M_DFF0, M_DFF1
2274: field DFFBITBUCKET 0x08
2275: field CLRSHCNT 0x04
2276: field CLRCHN 0x02
2277: field RSTCHN 0x01
2278: }
2279:
2280: /*
2281: * Next SCSI Control Block
2282: */
2283: register NEXTSCB {
2284: address 0x05A
2285: access_mode RW
2286: size 2
2287: modes M_SCSI
2288: }
2289:
2290: /* Rev B only. */
2291: register LQOSCSCTL {
2292: address 0x05A
2293: access_mode RW
2294: size 1
2295: modes M_CFG
2296: field LQOH2A_VERSION 0x80
2297: field LQONOCHKOVER 0x01
2298: }
2299:
2300: /*
2301: * SEQ Interrupts
2302: */
2303: register SEQINTSRC {
2304: address 0x05B
2305: access_mode RO
2306: modes M_DFF0, M_DFF1
2307: field CTXTDONE 0x40
2308: field SAVEPTRS 0x20
2309: field CFG4DATA 0x10
2310: field CFG4ISTAT 0x08
2311: field CFG4TSTAT 0x04
2312: field CFG4ICMD 0x02
2313: field CFG4TCMD 0x01
2314: }
2315:
2316: /*
2317: * Clear Arp Interrupts
2318: */
2319: register CLRSEQINTSRC {
2320: address 0x05B
2321: access_mode WO
2322: modes M_DFF0, M_DFF1
2323: field CLRCTXTDONE 0x40
2324: field CLRSAVEPTRS 0x20
2325: field CLRCFG4DATA 0x10
2326: field CLRCFG4ISTAT 0x08
2327: field CLRCFG4TSTAT 0x04
2328: field CLRCFG4ICMD 0x02
2329: field CLRCFG4TCMD 0x01
2330: }
2331:
2332: /*
2333: * SEQ Interrupt Enabled (Shared)
2334: */
2335: register SEQIMODE {
2336: address 0x05C
2337: access_mode RW
2338: modes M_DFF0, M_DFF1
2339: field ENCTXTDONE 0x40
2340: field ENSAVEPTRS 0x20
2341: field ENCFG4DATA 0x10
2342: field ENCFG4ISTAT 0x08
2343: field ENCFG4TSTAT 0x04
2344: field ENCFG4ICMD 0x02
2345: field ENCFG4TCMD 0x01
2346: }
2347:
2348: /*
2349: * Current SCSI Control Block
2350: */
2351: register CURRSCB {
2352: address 0x05C
2353: access_mode RW
2354: size 2
2355: modes M_SCSI
2356: }
2357:
2358: /*
2359: * Data FIFO Status
2360: */
2361: register MDFFSTAT {
2362: address 0x05D
2363: access_mode RO
2364: modes M_DFF0, M_DFF1
2365: field SHCNTNEGATIVE 0x40 /* Rev B or higher */
2366: field SHCNTMINUS1 0x20 /* Rev B or higher */
2367: field LASTSDONE 0x10
2368: field SHVALID 0x08
2369: field DLZERO 0x04 /* FIFO data ends on packet boundary. */
2370: field DATAINFIFO 0x02
2371: field FIFOFREE 0x01
2372: }
2373:
2374: /*
2375: * CRC Control
2376: */
2377: register CRCCONTROL {
2378: address 0x05d
2379: access_mode RW
2380: modes M_CFG
2381: field CRCVALCHKEN 0x40
2382: }
2383:
2384: /*
2385: * SCSI Test Control
2386: */
2387: register SCSITEST {
2388: address 0x05E
2389: access_mode RW
2390: modes M_CFG
2391: field CNTRTEST 0x08
2392: field SEL_TXPLL_DEBUG 0x04
2393: }
2394:
2395: /*
2396: * Data FIFO Queue Tag
2397: */
2398: register DFFTAG {
2399: address 0x05E
2400: access_mode RW
2401: size 2
2402: modes M_DFF0, M_DFF1
2403: }
2404:
2405: /*
2406: * Last SCSI Control Block
2407: */
2408: register LASTSCB {
2409: address 0x05E
2410: access_mode RW
2411: size 2
2412: modes M_SCSI
2413: }
2414:
2415: /*
2416: * SCSI I/O Cell Power-down Control
2417: */
2418: register IOPDNCTL {
2419: address 0x05F
2420: access_mode RW
2421: modes M_CFG
2422: field DISABLE_OE 0x80
2423: field PDN_IDIST 0x04
2424: field PDN_DIFFSENSE 0x01
2425: }
2426:
2427: /*
2428: * Shadow Host Address.
2429: */
2430: register SHADDR {
2431: address 0x060
2432: access_mode RO
2433: size 8
2434: modes M_DFF0, M_DFF1
2435: }
2436:
2437: /*
2438: * Data Group CRC Interval.
2439: */
2440: register DGRPCRCI {
2441: address 0x060
2442: access_mode RW
2443: size 2
2444: modes M_CFG
2445: }
2446:
2447: /*
2448: * Data Transfer Negotiation Address
2449: */
2450: register NEGOADDR {
2451: address 0x060
2452: access_mode RW
2453: modes M_SCSI
2454: }
2455:
2456: /*
2457: * Data Transfer Negotiation Data - Period Byte
2458: */
2459: register NEGPERIOD {
2460: address 0x061
2461: access_mode RW
2462: modes M_SCSI
2463: }
2464:
2465: /*
2466: * Packetized CRC Interval
2467: */
2468: register PACKCRCI {
2469: address 0x062
2470: access_mode RW
2471: size 2
2472: modes M_CFG
2473: }
2474:
2475: /*
2476: * Data Transfer Negotiation Data - Offset Byte
2477: */
2478: register NEGOFFSET {
2479: address 0x062
2480: access_mode RW
2481: modes M_SCSI
2482: }
2483:
2484: /*
2485: * Data Transfer Negotiation Data - PPR Options
2486: */
2487: register NEGPPROPTS {
2488: address 0x063
2489: access_mode RW
2490: modes M_SCSI
2491: field PPROPT_PACE 0x08
2492: field PPROPT_QAS 0x04
2493: field PPROPT_DT 0x02
2494: field PPROPT_IUT 0x01
2495: }
2496:
2497: /*
2498: * Data Transfer Negotiation Data - Connection Options
2499: */
2500: register NEGCONOPTS {
2501: address 0x064
2502: access_mode RW
2503: modes M_SCSI
2504: field ENSNAPSHOT 0x40
2505: field RTI_WRTDIS 0x20
2506: field RTI_OVRDTRN 0x10
2507: field ENSLOWCRC 0x08
2508: field ENAUTOATNI 0x04
2509: field ENAUTOATNO 0x02
2510: field WIDEXFER 0x01
2511: }
2512:
2513: /*
2514: * Negotiation Table Annex Column Index.
2515: */
2516: register ANNEXCOL {
2517: address 0x065
2518: access_mode RW
2519: modes M_SCSI
2520: }
2521:
2522: register SCSCHKN {
2523: address 0x066
2524: access_mode RW
2525: modes M_CFG
2526: field STSELSKIDDIS 0x40
2527: field CURRFIFODEF 0x20
2528: field WIDERESEN 0x10
2529: field SDONEMSKDIS 0x08
2530: field DFFACTCLR 0x04
2531: field SHVALIDSTDIS 0x02
2532: field LSTSGCLRDIS 0x01
2533: }
2534:
2535: const AHD_ANNEXCOL_PER_DEV0 4
2536: const AHD_NUM_PER_DEV_ANNEXCOLS 4
2537: const AHD_ANNEXCOL_PRECOMP_SLEW 4
2538: const AHD_PRECOMP_MASK 0x07
2539: const AHD_PRECOMP_SHIFT 0
2540: const AHD_PRECOMP_CUTBACK_17 0x04
2541: const AHD_PRECOMP_CUTBACK_29 0x06
2542: const AHD_PRECOMP_CUTBACK_37 0x07
2543: const AHD_SLEWRATE_MASK 0x78
2544: const AHD_SLEWRATE_SHIFT 3
2545: /*
2546: * Rev A has only a single bit (high bit of field) of slew adjustment.
2547: * Rev B has 4 bits. The current default happens to be the same for both.
2548: */
2549: const AHD_SLEWRATE_DEF_REVA 0x08
2550: const AHD_SLEWRATE_DEF_REVB 0x08
2551:
2552: /* Rev A does not have any amplitude setting. */
2553: const AHD_ANNEXCOL_AMPLITUDE 6
2554: const AHD_AMPLITUDE_MASK 0x7
2555: const AHD_AMPLITUDE_SHIFT 0
2556: const AHD_AMPLITUDE_DEF 0x7
2557:
2558: /*
2559: * Negotiation Table Annex Data Port.
2560: */
2561: register ANNEXDAT {
2562: address 0x066
2563: access_mode RW
2564: modes M_SCSI
2565: }
2566:
2567: /*
2568: * Initiator's Own Id.
2569: * The SCSI ID to use for Selection Out and seen during a reselection..
2570: */
2571: register IOWNID {
2572: address 0x067
2573: access_mode RW
2574: modes M_SCSI
2575: }
2576:
2577: /*
2578: * 960MHz Phase-Locked Loop Control 0
2579: */
2580: register PLL960CTL0 {
2581: address 0x068
2582: access_mode RW
2583: modes M_CFG
2584: field PLL_VCOSEL 0x80
2585: field PLL_PWDN 0x40
2586: field PLL_NS 0x30
2587: field PLL_ENLUD 0x08
2588: field PLL_ENLPF 0x04
2589: field PLL_DLPF 0x02
2590: field PLL_ENFBM 0x01
2591: }
2592:
2593: /*
2594: * Target Own Id
2595: */
2596: register TOWNID {
2597: address 0x069
2598: access_mode RW
2599: modes M_SCSI
2600: }
2601:
2602: /*
2603: * 960MHz Phase-Locked Loop Control 1
2604: */
2605: register PLL960CTL1 {
2606: address 0x069
2607: access_mode RW
2608: modes M_CFG
2609: field PLL_CNTEN 0x80
2610: field PLL_CNTCLR 0x40
2611: field PLL_RST 0x01
2612: }
2613:
2614: /*
2615: * Expander Signature
2616: */
2617: register XSIG {
2618: address 0x06A
2619: access_mode RW
2620: modes M_SCSI
2621: }
2622:
2623: /*
2624: * Shadow Byte Count
2625: */
2626: register SHCNT {
2627: address 0x068
2628: access_mode RW
2629: size 3
2630: modes M_DFF0, M_DFF1
2631: }
2632:
2633: /*
2634: * Selection Out ID
2635: */
2636: register SELOID {
2637: address 0x06B
2638: access_mode RW
2639: modes M_SCSI
2640: }
2641:
2642: /*
2643: * 960-MHz Phase-Locked Loop Test Count
2644: */
2645: register PLL960CNT0 {
2646: address 0x06A
2647: access_mode RO
2648: size 2
2649: modes M_CFG
2650: }
2651:
2652: /*
2653: * 400-MHz Phase-Locked Loop Control 0
2654: */
2655: register PLL400CTL0 {
2656: address 0x06C
2657: access_mode RW
2658: modes M_CFG
2659: field PLL_VCOSEL 0x80
2660: field PLL_PWDN 0x40
2661: field PLL_NS 0x30
2662: field PLL_ENLUD 0x08
2663: field PLL_ENLPF 0x04
2664: field PLL_DLPF 0x02
2665: field PLL_ENFBM 0x01
2666: }
2667:
2668: /*
2669: * Arbitration Fairness
2670: */
2671: register FAIRNESS {
2672: address 0x06C
2673: access_mode RW
2674: size 2
2675: modes M_SCSI
2676: }
2677:
2678: /*
2679: * 400-MHz Phase-Locked Loop Control 1
2680: */
2681: register PLL400CTL1 {
2682: address 0x06D
2683: access_mode RW
2684: modes M_CFG
2685: field PLL_CNTEN 0x80
2686: field PLL_CNTCLR 0x40
2687: field PLL_RST 0x01
2688: }
2689:
2690: /*
2691: * Arbitration Unfairness
2692: */
2693: register UNFAIRNESS {
2694: address 0x06E
2695: access_mode RW
2696: size 2
2697: modes M_SCSI
2698: }
2699:
2700: /*
2701: * 400-MHz Phase-Locked Loop Test Count
2702: */
2703: register PLL400CNT0 {
2704: address 0x06E
2705: access_mode RO
2706: size 2
2707: modes M_CFG
2708: }
2709:
2710: /*
2711: * SCB Page Pointer
2712: */
2713: register SCBPTR {
2714: address 0x0A8
2715: access_mode RW
2716: size 2
2717: modes M_DFF0, M_DFF1, M_CCHAN, M_SCSI
2718: }
2719:
2720: /*
2721: * CMC SCB Array Count
2722: * Number of bytes to transfer between CMC SCB memory and SCBRAM.
2723: * Transfers must be 8byte aligned and sized.
2724: */
2725: register CCSCBACNT {
2726: address 0x0AB
2727: access_mode RW
2728: modes M_CCHAN
2729: }
2730:
2731: /*
2732: * SCB Autopointer
2733: * SCB-Next Address Snooping logic. When an SCB is transferred to
2734: * the card, the next SCB address to be used by the CMC array can
2735: * be autoloaded from that transfer.
2736: */
2737: register SCBAUTOPTR {
2738: address 0x0AB
2739: access_mode RW
2740: modes M_CFG
2741: field AUSCBPTR_EN 0x80
2742: field SCBPTR_ADDR 0x38
2743: field SCBPTR_OFF 0x07
2744: }
2745:
2746: /*
2747: * CMC SG Ram Address Pointer
2748: */
2749: register CCSGADDR {
2750: address 0x0AC
2751: access_mode RW
2752: modes M_DFF0, M_DFF1
2753: }
2754:
2755: /*
2756: * CMC SCB RAM Address Pointer
2757: */
2758: register CCSCBADDR {
2759: address 0x0AC
2760: access_mode RW
2761: modes M_CCHAN
2762: }
2763:
2764: /*
2765: * CMC SCB Ram Back-up Address Pointer
2766: * Indicates the true stop location of transfers halted prior
2767: * to SCBHCNT going to 0.
2768: */
2769: register CCSCBADR_BK {
2770: address 0x0AC
2771: access_mode RO
2772: modes M_CFG
2773: }
2774:
2775: /*
2776: * CMC SG Control
2777: */
2778: register CCSGCTL {
2779: address 0x0AD
2780: access_mode RW
2781: modes M_DFF0, M_DFF1
2782: field CCSGDONE 0x80
2783: field SG_CACHE_AVAIL 0x10
2784: field CCSGENACK 0x08
2785: mask CCSGEN 0x0C
2786: field SG_FETCH_REQ 0x02
2787: field CCSGRESET 0x01
2788: }
2789:
2790: /*
2791: * CMD SCB Control
2792: */
2793: register CCSCBCTL {
2794: address 0x0AD
2795: access_mode RW
2796: modes M_CCHAN
2797: field CCSCBDONE 0x80
2798: field ARRDONE 0x40
2799: field CCARREN 0x10
2800: field CCSCBEN 0x08
2801: field CCSCBDIR 0x04
2802: field CCSCBRESET 0x01
2803: }
2804:
2805: /*
2806: * CMC Ram BIST
2807: */
2808: register CMC_RAMBIST {
2809: address 0x0AD
2810: access_mode RW
2811: modes M_CFG
2812: field SG_ELEMENT_SIZE 0x80
2813: field SCBRAMBIST_FAIL 0x40
2814: field SG_BIST_FAIL 0x20
2815: field SG_BIST_EN 0x10
2816: field CMC_BUFFER_BIST_FAIL 0x02
2817: field CMC_BUFFER_BIST_EN 0x01
2818: }
2819:
2820: /*
2821: * CMC SG RAM Data Port
2822: */
2823: register CCSGRAM {
2824: address 0x0B0
2825: access_mode RW
2826: modes M_DFF0, M_DFF1
2827: }
2828:
2829: /*
2830: * CMC SCB RAM Data Port
2831: */
2832: register CCSCBRAM {
2833: address 0x0B0
2834: access_mode RW
2835: modes M_CCHAN
2836: }
2837:
2838: /*
2839: * Flex DMA Address.
2840: */
2841: register FLEXADR {
2842: address 0x0B0
2843: access_mode RW
2844: size 3
2845: modes M_SCSI
2846: }
2847:
2848: /*
2849: * Flex DMA Byte Count
2850: */
2851: register FLEXCNT {
2852: address 0x0B3
2853: access_mode RW
2854: size 2
2855: modes M_SCSI
2856: }
2857:
2858: /*
2859: * Flex DMA Status
2860: */
2861: register FLEXDMASTAT {
2862: address 0x0B5
2863: access_mode RW
2864: modes M_SCSI
2865: field FLEXDMAERR 0x02
2866: field FLEXDMADONE 0x01
2867: }
2868:
2869: /*
2870: * Flex DMA Data Port
2871: */
2872: register FLEXDATA {
2873: address 0x0B6
2874: access_mode RW
2875: modes M_SCSI
2876: }
2877:
2878: /*
2879: * Board Data
2880: */
2881: register BRDDAT {
2882: address 0x0B8
2883: access_mode RW
2884: modes M_SCSI
2885: }
2886:
2887: /*
2888: * Board Control
2889: */
2890: register BRDCTL {
2891: address 0x0B9
2892: access_mode RW
2893: modes M_SCSI
2894: field FLXARBACK 0x80
2895: field FLXARBREQ 0x40
2896: field BRDADDR 0x38
2897: field BRDEN 0x04
2898: field BRDRW 0x02
2899: field BRDSTB 0x01
2900: }
2901:
2902: /*
2903: * Serial EEPROM Address
2904: */
2905: register SEEADR {
2906: address 0x0BA
2907: access_mode RW
2908: modes M_SCSI
2909: }
2910:
2911: /*
2912: * Serial EEPROM Data
2913: */
2914: register SEEDAT {
2915: address 0x0BC
2916: access_mode RW
2917: size 2
2918: modes M_SCSI
2919: }
2920:
2921: /*
2922: * Serial EEPROM Status
2923: */
2924: register SEESTAT {
2925: address 0x0BE
2926: access_mode RO
2927: modes M_SCSI
2928: field INIT_DONE 0x80
2929: field SEEOPCODE 0x70
2930: field LDALTID_L 0x08
2931: field SEEARBACK 0x04
2932: field SEEBUSY 0x02
2933: field SEESTART 0x01
2934: }
2935:
2936: /*
2937: * Serial EEPROM Control
2938: */
2939: register SEECTL {
2940: address 0x0BE
2941: access_mode RW
2942: modes M_SCSI
2943: field SEEOPCODE 0x70 {
2944: SEEOP_ERASE 0x70,
2945: SEEOP_READ 0x60,
2946: SEEOP_WRITE 0x50,
2947: /*
2948: * The following four commands use special
2949: * addresses for differentiation.
2950: */
2951: SEEOP_ERAL 0x40
2952: }
2953: mask SEEOP_EWEN 0x40
2954: mask SEEOP_WALL 0x40
2955: mask SEEOP_EWDS 0x40
2956: field SEERST 0x02
2957: field SEESTART 0x01
2958: }
2959:
2960: const SEEOP_ERAL_ADDR 0x80
2961: const SEEOP_EWEN_ADDR 0xC0
2962: const SEEOP_WRAL_ADDR 0x40
2963: const SEEOP_EWDS_ADDR 0x00
2964:
2965: /*
2966: * SCB Counter
2967: */
2968: register SCBCNT {
2969: address 0x0BF
2970: access_mode RW
2971: modes M_SCSI
2972: }
2973:
2974: /*
2975: * Data FIFO Write Address
2976: * Pointer to the next QWD location to be written to the data FIFO.
2977: */
2978: register DFWADDR {
2979: address 0x0C0
2980: access_mode RW
2981: size 2
2982: modes M_DFF0, M_DFF1
2983: }
2984:
2985: /*
2986: * DSP Filter Control
2987: */
2988: register DSPFLTRCTL {
2989: address 0x0C0
2990: access_mode RW
2991: modes M_CFG
2992: field FLTRDISABLE 0x20
2993: field EDGESENSE 0x10
2994: field DSPFCNTSEL 0x0F
2995: }
2996:
2997: /*
2998: * DSP Data Channel Control
2999: */
3000: register DSPDATACTL {
3001: address 0x0C1
3002: access_mode RW
3003: modes M_CFG
3004: field BYPASSENAB 0x80
3005: field DESQDIS 0x10
3006: field RCVROFFSTDIS 0x04
3007: field XMITOFFSTDIS 0x02
3008: }
3009:
3010: /*
3011: * Data FIFO Read Address
3012: * Pointer to the next QWD location to be read from the data FIFO.
3013: */
3014: register DFRADDR {
3015: address 0x0C2
3016: access_mode RW
3017: size 2
3018: modes M_DFF0, M_DFF1
3019: }
3020:
3021: /*
3022: * DSP REQ Control
3023: */
3024: register DSPREQCTL {
3025: address 0x0C2
3026: access_mode RW
3027: modes M_CFG
3028: field MANREQCTL 0xC0
3029: field MANREQDLY 0x3F
3030: }
3031:
3032: /*
3033: * DSP ACK Control
3034: */
3035: register DSPACKCTL {
3036: address 0x0C3
3037: access_mode RW
3038: modes M_CFG
3039: field MANACKCTL 0xC0
3040: field MANACKDLY 0x3F
3041: }
3042:
3043: /*
3044: * Data FIFO Data
3045: * Read/Write byte port into the data FIFO. The read and write
3046: * FIFO pointers increment with each read and write respectively
3047: * to this port.
3048: */
3049: register DFDAT {
3050: address 0x0C4
3051: access_mode RW
3052: modes M_DFF0, M_DFF1
3053: }
3054:
3055: /*
3056: * DSP Channel Select
3057: */
3058: register DSPSELECT {
3059: address 0x0C4
3060: access_mode RW
3061: modes M_CFG
3062: field AUTOINCEN 0x80
3063: field DSPSEL 0x1F
3064: }
3065:
3066: const NUMDSPS 0x14
3067:
3068: /*
3069: * Write Bias Control
3070: */
3071: register WRTBIASCTL {
3072: address 0x0C5
3073: access_mode WO
3074: modes M_CFG
3075: field AUTOXBCDIS 0x80
3076: field XMITMANVAL 0x3F
3077: }
3078:
3079: /*
3080: * Currently the WRTBIASCTL is the same as the default.
3081: */
3082: const WRTBIASCTL_HP_DEFAULT 0x0
3083:
3084: /*
3085: * Receiver Bias Control
3086: */
3087: register RCVRBIOSCTL {
3088: address 0x0C6
3089: access_mode WO
3090: modes M_CFG
3091: field AUTORBCDIS 0x80
3092: field RCVRMANVAL 0x3F
3093: }
3094:
3095: /*
3096: * Write Bias Calculator
3097: */
3098: register WRTBIASCALC {
3099: address 0x0C7
3100: access_mode RO
3101: modes M_CFG
3102: }
3103:
3104: /*
3105: * Data FIFO Pointers
3106: * Contains the byte offset from DFWADDR and DWRADDR to the current
3107: * FIFO write/read locations.
3108: */
3109: register DFPTRS {
3110: address 0x0C8
3111: access_mode RW
3112: modes M_DFF0, M_DFF1
3113: }
3114:
3115: /*
3116: * Receiver Bias Calculator
3117: */
3118: register RCVRBIASCALC {
3119: address 0x0C8
3120: access_mode RO
3121: modes M_CFG
3122: }
3123:
3124: /*
3125: * Data FIFO Backup Read Pointer
3126: * Contains the data FIFO address to be restored if the last
3127: * data accessed from the data FIFO was not transferred successfully.
3128: */
3129: register DFBKPTR {
3130: address 0x0C9
3131: access_mode RW
3132: size 2
3133: modes M_DFF0, M_DFF1
3134: }
3135:
3136: /*
3137: * Skew Calculator
3138: */
3139: register SKEWCALC {
3140: address 0x0C9
3141: access_mode RO
3142: modes M_CFG
3143: }
3144:
3145: /*
3146: * Data FIFO Debug Control
3147: */
3148: register DFDBCTL {
3149: address 0x0CB
3150: access_mode RW
3151: modes M_DFF0, M_DFF1
3152: field DFF_CIO_WR_RDY 0x20
3153: field DFF_CIO_RD_RDY 0x10
3154: field DFF_DIR_ERR 0x08
3155: field DFF_RAMBIST_FAIL 0x04
3156: field DFF_RAMBIST_DONE 0x02
3157: field DFF_RAMBIST_EN 0x01
3158: }
3159:
3160: /*
3161: * Data FIFO Space Count
3162: * Number of FIFO locations that are free.
3163: */
3164: register DFSCNT {
3165: address 0x0CC
3166: access_mode RO
3167: size 2
3168: modes M_DFF0, M_DFF1
3169: }
3170:
3171: /*
3172: * Data FIFO Byte Count
3173: * Number of filled FIFO locations.
3174: */
3175: register DFBCNT {
3176: address 0x0CE
3177: access_mode RO
3178: size 2
3179: modes M_DFF0, M_DFF1
3180: }
3181:
3182: /*
3183: * Sequencer Program Overlay Address.
3184: * Low address must be written prior to high address.
3185: */
3186: register OVLYADDR {
3187: address 0x0D4
3188: modes M_SCSI
3189: size 2
3190: access_mode RW
3191: }
3192:
3193: /*
3194: * Sequencer Control 0
3195: * Error detection mode, speed configuration,
3196: * single step, breakpoints and program load.
3197: */
3198: register SEQCTL0 {
3199: address 0x0D6
3200: access_mode RW
3201: field PERRORDIS 0x80
3202: field PAUSEDIS 0x40
3203: field FAILDIS 0x20
3204: field FASTMODE 0x10
3205: field BRKADRINTEN 0x08
3206: field STEP 0x04
3207: field SEQRESET 0x02
3208: field LOADRAM 0x01
3209: }
3210:
3211: /*
3212: * Sequencer Control 1
3213: * Instruction RAM Diagnostics
3214: */
3215: register SEQCTL1 {
3216: address 0x0D7
3217: access_mode RW
3218: field OVRLAY_DATA_CHK 0x08
3219: field RAMBIST_DONE 0x04
3220: field RAMBIST_FAIL 0x02
3221: field RAMBIST_EN 0x01
3222: }
3223:
3224: /*
3225: * Sequencer Flags
3226: * Zero and Carry state of the ALU.
3227: */
3228: register FLAGS {
3229: address 0x0D8
3230: access_mode RO
3231: field ZERO 0x02
3232: field CARRY 0x01
3233: }
3234:
3235: /*
3236: * Sequencer Interrupt Control
3237: */
3238: register SEQINTCTL {
3239: address 0x0D9
3240: access_mode RW
3241: field INTVEC1DSL 0x80
3242: field INT1_CONTEXT 0x20
3243: field SCS_SEQ_INT1M1 0x10
3244: field SCS_SEQ_INT1M0 0x08
3245: field INTMASK2 0x04
3246: field INTMASK1 0x02
3247: field IRET 0x01
3248: }
3249:
3250: /*
3251: * Sequencer RAM Data Port
3252: * Single byte window into the Sequencer Instruction Ram area starting
3253: * at the address specified by OVLYADDR. To write a full instruction word,
3254: * simply write four bytes in succession. OVLYADDR will increment after the
3255: * most significant instruction byte (the byte with the parity bit) is written.
3256: */
3257: register SEQRAM {
3258: address 0x0DA
3259: access_mode RW
3260: }
3261:
3262: /*
3263: * Sequencer Program Counter
3264: * Low byte must be written prior to high byte.
3265: */
3266: register PRGMCNT {
3267: address 0x0DE
3268: access_mode RW
3269: size 2
3270: }
3271:
3272: /*
3273: * Accumulator
3274: */
3275: register ACCUM {
3276: address 0x0E0
3277: access_mode RW
3278: accumulator
3279: }
3280:
3281: /*
3282: * Source Index Register
3283: * Incrementing index for reads of SINDIR and the destination (low byte only)
3284: * for any immediate operands passed in jmp, jc, jnc, call instructions.
3285: * Example:
3286: * mvi 0xFF call some_routine;
3287: *
3288: * Will set SINDEX[0] to 0xFF and call the routine "some_routine.
3289: */
3290: register SINDEX {
3291: address 0x0E2
3292: access_mode RW
3293: size 2
3294: sindex
3295: }
3296:
3297: /*
3298: * Destination Index Register
3299: * Incrementing index for writes to DINDIR. Can be used as a scratch register.
3300: */
3301: register DINDEX {
3302: address 0x0E4
3303: access_mode RW
3304: size 2
3305: }
3306:
3307: /*
3308: * Break Address
3309: * Sequencer instruction breakpoint address address.
3310: */
3311: register BRKADDR0 {
3312: address 0x0E6
3313: access_mode RW
3314: }
3315:
3316: register BRKADDR1 {
3317: address 0x0E6
3318: access_mode RW
3319: field BRKDIS 0x80 /* Disable Breakpoint */
3320: }
3321:
3322: /*
3323: * All Ones
3324: * All reads to this register return the value 0xFF.
3325: */
3326: register ALLONES {
3327: address 0x0E8
3328: access_mode RO
3329: allones
3330: }
3331:
3332: /*
3333: * All Zeros
3334: * All reads to this register return the value 0.
3335: */
3336: register ALLZEROS {
3337: address 0x0EA
3338: access_mode RO
3339: allzeros
3340: }
3341:
3342: /*
3343: * No Destination
3344: * Writes to this register have no effect.
3345: */
3346: register NONE {
3347: address 0x0EA
3348: access_mode WO
3349: none
3350: }
3351:
3352: /*
3353: * Source Index Indirect
3354: * Reading this register is equivalent to reading (register_base + SINDEX) and
3355: * incrementing SINDEX by 1.
3356: */
3357: register SINDIR {
3358: address 0x0EC
3359: access_mode RO
3360: }
3361:
3362: /*
3363: * Destination Index Indirect
3364: * Writing this register is equivalent to writing to (register_base + DINDEX)
3365: * and incrementing DINDEX by 1.
3366: */
3367: register DINDIR {
3368: address 0x0ED
3369: access_mode WO
3370: }
3371:
3372: /*
3373: * Function One
3374: * 2's complement to bit value conversion. Write the 2's complement value
3375: * (0-7 only) to the top nibble and retrieve the bit indexed by that value
3376: * on the next read of this register.
3377: * Example:
3378: * Write 0x60
3379: * Read 0x40
3380: */
3381: register FUNCTION1 {
3382: address 0x0F0
3383: access_mode RW
3384: }
3385:
3386: /*
3387: * Stack
3388: * Window into the stack. Each stack location is 10 bits wide reported
3389: * low byte followed by high byte. There are 8 stack locations.
3390: */
3391: register STACK {
3392: address 0x0F2
3393: access_mode RW
3394: }
3395:
3396: /*
3397: * Interrupt Vector 1 Address
3398: * Interrupt branch address for SCS SEQ_INT1 mode 0 and 1 interrupts.
3399: */
3400: register INTVEC1_ADDR {
3401: address 0x0F4
3402: access_mode RW
3403: size 2
3404: modes M_CFG
3405: }
3406:
3407: /*
3408: * Current Address
3409: * Address of the SEQRAM instruction currently executing instruction.
3410: */
3411: register CURADDR {
3412: address 0x0F4
3413: access_mode RW
3414: size 2
3415: modes M_SCSI
3416: }
3417:
3418: /*
3419: * Interrupt Vector 2 Address
3420: * Interrupt branch address for HST_SEQ_INT2 interrupts.
3421: */
3422: register INTVEC2_ADDR {
3423: address 0x0F6
3424: access_mode RW
3425: size 2
3426: modes M_CFG
3427: }
3428:
3429: /*
3430: * Last Address
3431: * Address of the SEQRAM instruction executed prior to the current instruction.
3432: */
3433: register LASTADDR {
3434: address 0x0F6
3435: access_mode RW
3436: size 2
3437: modes M_SCSI
3438: }
3439:
3440: register AHD_PCI_CONFIG_BASE {
3441: address 0x100
3442: access_mode RW
3443: size 256
3444: modes M_CFG
3445: }
3446:
3447: /* ---------------------- Scratch RAM Offsets ------------------------- */
3448: scratch_ram {
3449: /* Mode Specific */
3450: address 0x0A0
3451: size 8
3452: modes 0, 1, 2, 3
3453: REG0 {
3454: size 2
3455: }
3456: REG1 {
3457: size 2
3458: }
3459: REG_ISR {
3460: size 2
3461: }
3462: SG_STATE {
3463: size 1
3464: field SEGS_AVAIL 0x01
3465: field LOADING_NEEDED 0x02
3466: field FETCH_INPROG 0x04
3467: }
3468: /*
3469: * Track whether the transfer byte count for
3470: * the current data phase is odd.
3471: */
3472: DATA_COUNT_ODD {
3473: size 1
3474: }
3475: }
3476:
3477: scratch_ram {
3478: /* Mode Specific */
3479: address 0x0F8
3480: size 8
3481: modes 0, 1, 2, 3
3482: LONGJMP_ADDR {
3483: size 2
3484: }
3485: ACCUM_SAVE {
3486: size 1
3487: }
3488: }
3489:
3490:
3491: scratch_ram {
3492: address 0x100
3493: size 128
3494: modes 0, 1, 2, 3
3495: /*
3496: * Per "other-id" execution queues. We use an array of
3497: * tail pointers into lists of SCBs sorted by "other-id".
3498: * The execution head pointer threads the head SCBs for
3499: * each list.
3500: */
3501: WAITING_SCB_TAILS {
3502: size 32
3503: }
3504: WAITING_TID_HEAD {
3505: size 2
3506: }
3507: WAITING_TID_TAIL {
3508: size 2
3509: }
3510: /*
3511: * SCBID of the next SCB in the new SCB queue.
3512: */
3513: NEXT_QUEUED_SCB_ADDR {
3514: size 4
3515: }
3516: /*
3517: * head of list of SCBs that have
3518: * completed but have not been
3519: * put into the qoutfifo.
3520: */
3521: COMPLETE_SCB_HEAD {
3522: size 2
3523: }
3524: /*
3525: * The list of completed SCBs in
3526: * the active DMA.
3527: */
3528: COMPLETE_SCB_DMAINPROG_HEAD {
3529: size 2
3530: }
3531: /*
3532: * head of list of SCBs that have
3533: * completed but need to be uploaded
3534: * to the host prior to being completed.
3535: */
3536: COMPLETE_DMA_SCB_HEAD {
3537: size 2
3538: }
3539: /*
3540: * tail of list of SCBs that have
3541: * completed but need to be uploaded
3542: * to the host prior to being completed.
3543: */
3544: COMPLETE_DMA_SCB_TAIL {
3545: size 2
3546: }
3547: /*
3548: * head of list of SCBs that have
3549: * been uploaded to the host, but cannot
3550: * be completed until the QFREEZE is in
3551: * full effect (i.e. no selections pending).
3552: */
3553: COMPLETE_ON_QFREEZE_HEAD {
3554: size 2
3555: }
3556: /*
3557: * Counting semaphore to prevent new select-outs
3558: * The queue is frozen so long as the sequencer
3559: * and kernel freeze counts differ.
3560: */
3561: QFREEZE_COUNT {
3562: size 2
3563: }
3564: KERNEL_QFREEZE_COUNT {
3565: size 2
3566: }
3567: /*
3568: * Mode to restore on legacy idle loop exit.
3569: */
3570: SAVED_MODE {
3571: size 1
3572: }
3573: /*
3574: * Single byte buffer used to designate the type or message
3575: * to send to a target.
3576: */
3577: MSG_OUT {
3578: size 1
3579: }
3580: /* Parameters for DMA Logic */
3581: DMAPARAMS {
3582: size 1
3583: field PRELOADEN 0x80
3584: field WIDEODD 0x40
3585: field SCSIEN 0x20
3586: field SDMAEN 0x10
3587: field SDMAENACK 0x10
3588: field HDMAEN 0x08
3589: field HDMAENACK 0x08
3590: field DIRECTION 0x04 /* Set indicates PCI->SCSI */
3591: field FIFOFLUSH 0x02
3592: field FIFORESET 0x01
3593: }
3594: SEQ_FLAGS {
3595: size 1
3596: field NOT_IDENTIFIED 0x80
3597: field NO_CDB_SENT 0x40
3598: field TARGET_CMD_IS_TAGGED 0x40
3599: field DPHASE 0x20
3600: /* Target flags */
3601: field TARG_CMD_PENDING 0x10
3602: field CMDPHASE_PENDING 0x08
3603: field DPHASE_PENDING 0x04
3604: field SPHASE_PENDING 0x02
3605: field NO_DISCONNECT 0x01
3606: }
3607: /*
3608: * Temporary storage for the
3609: * target/channel/lun of a
3610: * reconnecting target
3611: */
3612: SAVED_SCSIID {
3613: size 1
3614: }
3615: SAVED_LUN {
3616: size 1
3617: }
3618: /*
3619: * The last bus phase as seen by the sequencer.
3620: */
3621: LASTPHASE {
3622: size 1
3623: field CDI 0x80
3624: field IOI 0x40
3625: field MSGI 0x20
3626: field P_BUSFREE 0x01
3627: enum PHASE_MASK CDO|IOO|MSGO {
3628: P_DATAOUT 0x0,
3629: P_DATAIN IOO,
3630: P_DATAOUT_DT P_DATAOUT|MSGO,
3631: P_DATAIN_DT P_DATAIN|MSGO,
3632: P_COMMAND CDO,
3633: P_MESGOUT CDO|MSGO,
3634: P_STATUS CDO|IOO,
3635: P_MESGIN CDO|IOO|MSGO
3636: }
3637: }
3638: /*
3639: * Value to "or" into the SCBPTR[1] value to
3640: * indicate that an entry in the QINFIFO is valid.
3641: */
3642: QOUTFIFO_ENTRY_VALID_TAG {
3643: size 1
3644: }
3645: /*
3646: * Kernel and sequencer offsets into the queue of
3647: * incoming target mode command descriptors. The
3648: * queue is full when the KERNEL_TQINPOS == TQINPOS.
3649: */
3650: KERNEL_TQINPOS {
3651: size 1
3652: }
3653: TQINPOS {
3654: size 1
3655: }
3656: /*
3657: * Base address of our shared data with the kernel driver in host
3658: * memory. This includes the qoutfifo and target mode
3659: * incoming command queue.
3660: */
3661: SHARED_DATA_ADDR {
3662: size 4
3663: }
3664: /*
3665: * Pointer to location in host memory for next
3666: * position in the qoutfifo.
3667: */
3668: QOUTFIFO_NEXT_ADDR {
3669: size 4
3670: }
3671: ARG_1 {
3672: size 1
3673: mask SEND_MSG 0x80
3674: mask SEND_SENSE 0x40
3675: mask SEND_REJ 0x20
3676: mask MSGOUT_PHASEMIS 0x10
3677: mask EXIT_MSG_LOOP 0x08
3678: mask CONT_MSG_LOOP_WRITE 0x04
3679: mask CONT_MSG_LOOP_READ 0x03
3680: mask CONT_MSG_LOOP_TARG 0x02
3681: alias RETURN_1
3682: }
3683: ARG_2 {
3684: size 1
3685: alias RETURN_2
3686: }
3687:
3688: /*
3689: * Snapshot of MSG_OUT taken after each message is sent.
3690: */
3691: LAST_MSG {
3692: size 1
3693: }
3694:
3695: /*
3696: * Sequences the kernel driver has okayed for us. This allows
3697: * the driver to do things like prevent initiator or target
3698: * operations.
3699: */
3700: SCSISEQ_TEMPLATE {
3701: size 1
3702: field MANUALCTL 0x40
3703: field ENSELI 0x20
3704: field ENRSELI 0x10
3705: field MANUALP 0x0C
3706: field ENAUTOATNP 0x02
3707: field ALTSTIM 0x01
3708: }
3709:
3710: /*
3711: * The initiator specified tag for this target mode transaction.
3712: */
3713: INITIATOR_TAG {
3714: size 1
3715: }
3716:
3717: SEQ_FLAGS2 {
3718: size 1
3719: field PENDING_MK_MESSAGE 0x01
3720: field TARGET_MSG_PENDING 0x02
3721: field SELECTOUT_QFROZEN 0x04
3722: }
3723:
3724: ALLOCFIFO_SCBPTR {
3725: size 2
3726: }
3727:
3728: /*
3729: * The maximum amount of time to wait, when interrupt coalescing
3730: * is enabled, before issueing a CMDCMPLT interrupt for a completed
3731: * command.
3732: */
3733: INT_COALESCING_TIMER {
3734: size 2
3735: }
3736:
3737: /*
3738: * The maximum number of commands to coalesce into a single interrupt.
3739: * Actually the 2's complement of that value to simplify sequencer
3740: * code.
3741: */
3742: INT_COALESCING_MAXCMDS {
3743: size 1
3744: }
3745:
3746: /*
3747: * The minimum number of commands still outstanding required
3748: * to continue coalescing (2's complement of value).
3749: */
3750: INT_COALESCING_MINCMDS {
3751: size 1
3752: }
3753:
3754: /*
3755: * Number of commands "in-flight".
3756: */
3757: CMDS_PENDING {
3758: size 2
3759: }
3760:
3761: /*
3762: * The count of commands that have been coalesced.
3763: */
3764: INT_COALESCING_CMDCOUNT {
3765: size 1
3766: }
3767:
3768: /*
3769: * Since the HS_MAIBOX is self clearing, copy its contents to
3770: * this position in scratch ram every time it changes.
3771: */
3772: LOCAL_HS_MAILBOX {
3773: size 1
3774: }
3775: /*
3776: * Target-mode CDB type to CDB length table used
3777: * in non-packetized operation.
3778: */
3779: CMDSIZE_TABLE {
3780: size 8
3781: }
3782: /*
3783: * When an SCB with the MK_MESSAGE flag is
3784: * queued to the controller, it cannot enter
3785: * the waiting for selection list until the
3786: * selections for any previously queued
3787: * commands to that target complete. During
3788: * the wait, the MK_MESSAGE SCB is queued
3789: * here.
3790: */
3791: MK_MESSAGE_SCB {
3792: size 2
3793: }
3794: /*
3795: * Saved SCSIID of MK_MESSAGE_SCB to avoid
3796: * an extra SCBPTR operation when deciding
3797: * if the MK_MESSAGE_SCB can be run.
3798: */
3799: MK_MESSAGE_SCSIID {
3800: size 1
3801: }
3802: }
3803:
3804: /************************* Hardware SCB Definition ****************************/
3805: scb {
3806: address 0x180
3807: size 64
3808: modes 0, 1, 2, 3
3809: SCB_RESIDUAL_DATACNT {
3810: size 4
3811: alias SCB_CDB_STORE
3812: alias SCB_HOST_CDB_PTR
3813: }
3814: SCB_RESIDUAL_SGPTR {
3815: size 4
3816: field SG_ADDR_MASK 0xf8 /* In the last byte */
3817: field SG_OVERRUN_RESID 0x02 /* In the first byte */
3818: field SG_LIST_NULL 0x01 /* In the first byte */
3819: }
3820: SCB_SCSI_STATUS {
3821: size 1
3822: alias SCB_HOST_CDB_LEN
3823: }
3824: SCB_TARGET_PHASES {
3825: size 1
3826: }
3827: SCB_TARGET_DATA_DIR {
3828: size 1
3829: }
3830: SCB_TARGET_ITAG {
3831: size 1
3832: }
3833: SCB_SENSE_BUSADDR {
3834: /*
3835: * Only valid if CDB length is less than 13 bytes or
3836: * we are using a CDB pointer. Otherwise contains
3837: * the last 4 bytes of embedded cdb information.
3838: */
3839: size 4
3840: alias SCB_NEXT_COMPLETE
3841: }
3842: SCB_TAG {
3843: alias SCB_FIFO_USE_COUNT
3844: size 2
3845: }
3846: SCB_CONTROL {
3847: size 1
3848: field TARGET_SCB 0x80
3849: field DISCENB 0x40
3850: field TAG_ENB 0x20
3851: field MK_MESSAGE 0x10
3852: field STATUS_RCVD 0x08
3853: field DISCONNECTED 0x04
3854: field SCB_TAG_TYPE 0x03
3855: }
3856: SCB_SCSIID {
3857: size 1
3858: field TID 0xF0
3859: field OID 0x0F
3860: }
3861: SCB_LUN {
3862: size 1
3863: field LID 0xff
3864: }
3865: SCB_TASK_ATTRIBUTE {
3866: size 1
3867: /*
3868: * Overloaded field for non-packetized
3869: * ignore wide residue message handling.
3870: */
3871: field SCB_XFERLEN_ODD 0x01
3872: }
3873: SCB_CDB_LEN {
3874: size 1
3875: field SCB_CDB_LEN_PTR 0x80 /* CDB in host memory */
3876: }
3877: SCB_TASK_MANAGEMENT {
3878: size 1
3879: }
3880: SCB_DATAPTR {
3881: size 8
3882: }
3883: SCB_DATACNT {
3884: /*
3885: * The last byte is really the high address bits for
3886: * the data address.
3887: */
3888: size 4
3889: field SG_LAST_SEG 0x80 /* In the fourth byte */
3890: field SG_HIGH_ADDR_BITS 0x7F /* In the fourth byte */
3891: }
3892: SCB_SGPTR {
3893: size 4
3894: field SG_STATUS_VALID 0x04 /* In the first byte */
3895: field SG_FULL_RESID 0x02 /* In the first byte */
3896: field SG_LIST_NULL 0x01 /* In the first byte */
3897: }
3898: SCB_BUSADDR {
3899: size 4
3900: }
3901: SCB_NEXT {
3902: alias SCB_NEXT_SCB_BUSADDR
3903: size 2
3904: }
3905: SCB_NEXT2 {
3906: size 2
3907: }
3908: SCB_SPARE {
3909: size 8
3910: alias SCB_PKT_LUN
3911: }
3912: SCB_DISCONNECTED_LISTS {
3913: size 8
3914: }
3915: }
3916:
3917: /*********************************** Constants ********************************/
3918: const MK_MESSAGE_BIT_OFFSET 4
3919: const TID_SHIFT 4
3920: const TARGET_CMD_CMPLT 0xfe
3921: const INVALID_ADDR 0x80
3922: #define SCB_LIST_NULL 0xff
3923: #define QOUTFIFO_ENTRY_VALID_TOGGLE 0x80
3924:
3925: const CCSGADDR_MAX 0x80
3926: const CCSCBADDR_MAX 0x80
3927: const CCSGRAM_MAXSEGS 16
3928:
3929: /* Selection Timeout Timer Constants */
3930: const STIMESEL_SHIFT 3
3931: const STIMESEL_MIN 0x18
3932: const STIMESEL_BUG_ADJ 0x8
3933:
3934: /* WDTR Message values */
3935: const BUS_8_BIT 0x00
3936: const BUS_16_BIT 0x01
3937: const BUS_32_BIT 0x02
3938:
3939: /* Offset maximums */
3940: const MAX_OFFSET 0xfe
3941: const MAX_OFFSET_PACED 0xfe
3942: const MAX_OFFSET_PACED_BUG 0x7f
3943: /*
3944: * Some 160 devices incorrectly accept 0xfe as a
3945: * sync offset, but will overrun this value. Limit
3946: * to 0x7f for speed lower than U320 which will
3947: * avoid the persistent sync offset overruns.
3948: */
3949: const MAX_OFFSET_NON_PACED 0x7f
3950: const HOST_MSG 0xff
3951:
3952: /*
3953: * The size of our sense buffers.
3954: * Sense buffer mapping can be handled in either of two ways.
3955: * The first is to allocate a dmamap for each transaction.
3956: * Depending on the architecture, dmamaps can be costly. The
3957: * alternative is to statically map the buffers in much the same
3958: * way we handle our scatter gather lists. The driver implements
3959: * the later.
3960: */
3961: const AHD_SENSE_BUFSIZE 256
3962:
3963: /* Target mode command processing constants */
3964: const CMD_GROUP_CODE_SHIFT 0x05
3965:
3966: const STATUS_BUSY 0x08
3967: const STATUS_QUEUE_FULL 0x28
3968: const STATUS_PKT_SENSE 0xFF
3969: const TARGET_DATA_IN 1
3970:
3971: const SCB_TRANSFER_SIZE_FULL_LUN 56
3972: const SCB_TRANSFER_SIZE_1BYTE_LUN 48
3973: /* PKT_OVERRUN_BUFSIZE must be a multiple of 256 less than 64K */
3974: const PKT_OVERRUN_BUFSIZE 512
3975:
3976: /*
3977: * Timer parameters.
3978: */
3979: const AHD_TIMER_US_PER_TICK 25
3980: const AHD_TIMER_MAX_TICKS 0xFFFF
3981: const AHD_TIMER_MAX_US (AHD_TIMER_MAX_TICKS * AHD_TIMER_US_PER_TICK)
3982:
3983: /*
3984: * Downloaded (kernel inserted) constants
3985: */
3986: const SG_PREFETCH_CNT download
3987: const SG_PREFETCH_CNT_LIMIT download
3988: const SG_PREFETCH_ALIGN_MASK download
3989: const SG_PREFETCH_ADDR_MASK download
3990: const SG_SIZEOF download
3991: const PKT_OVERRUN_BUFOFFSET download
3992: const SCB_TRANSFER_SIZE download
3993: const CACHELINE_MASK download
3994:
3995: /*
3996: * BIOS SCB offsets
3997: */
3998: const NVRAM_SCB_OFFSET 0x2C
CVSweb