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