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