OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rc203soc/] [sw/] [uClinux/] [drivers/] [scsi/] [aic7xxx/] [aic7xxx.reg] - Rev 1626

Go to most recent revision | Compare with Previous | Blame | View Log

/*
 * Aic7xxx register and scratch ram definitions.
 *
 * Copyright (c) 1994-1998 Justin Gibbs.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer,
 *    without modification, immediately at the beginning of the file.
 * 2. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * Where this Software is combined with software released under the terms of 
 * the GNU Public License ("GPL") and the terms of the GPL would require the 
 * combined work to also be released under the terms of the GPL, the terms
 * and conditions of this License will apply in addition to those of the
 * GPL with the exception of any terms or conditions of this License that
 * conflict with, or are expressly prohibited by, the GPL.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *      $Id: aic7xxx.reg,v 1.1 2005-12-20 10:18:04 jcastillo Exp $
 */

/*
 * This file is processed by the aic7xxx_asm utility for use in assembling
 * firmware for the aic7xxx family of SCSI host adapters as well as to generate
 * a C header file for use in the kernel portion of the Aic7xxx driver.
 *
 * All page numbers refer to the Adaptec AIC-7770 Data Book available from
 * Adaptec's Technical Documents Department 1-800-934-2766
 */

/*
 * SCSI Sequence Control (p. 3-11).
 * Each bit, when set starts a specific SCSI sequence on the bus
 */
register SCSISEQ {
        address                 0x000
        access_mode RW
        bit     TEMODE          0x80
        bit     ENSELO          0x40
        bit     ENSELI          0x20
        bit     ENRSELI         0x10
        bit     ENAUTOATNO      0x08
        bit     ENAUTOATNI      0x04
        bit     ENAUTOATNP      0x02
        bit     SCSIRSTO        0x01
}

/*
 * SCSI Transfer Control 0 Register (pp. 3-13).
 * Controls the SCSI module data path.
 */
register SXFRCTL0 {
        address                 0x001
        access_mode RW
        bit     DFON            0x80
        bit     DFPEXP          0x40
        bit     FAST20          0x20
        bit     CLRSTCNT        0x10
        bit     SPIOEN          0x08
        bit     SCAMEN          0x04
        bit     CLRCHN          0x02
}

/*
 * SCSI Transfer Control 1 Register (pp. 3-14,15).
 * Controls the SCSI module data path.
 */
register SXFRCTL1 {
        address                 0x002
        access_mode RW
        bit     BITBUCKET       0x80
        bit     SWRAPEN         0x40
        bit     ENSPCHK         0x20
        mask    STIMESEL        0x18
        bit     ENSTIMER        0x04
        bit     ACTNEGEN        0x02
        bit     STPWEN          0x01    /* Powered Termination */
}

/*
 * SCSI Control Signal Read Register (p. 3-15).
 * Reads the actual state of the SCSI bus pins
 */
register SCSISIGI {
        address                 0x003
        access_mode RO
        bit     CDI             0x80
        bit     IOI             0x40
        bit     MSGI            0x20
        bit     ATNI            0x10
        bit     SELI            0x08
        bit     BSYI            0x04
        bit     REQI            0x02
        bit     ACKI            0x01
/*
 * Possible phases in SCSISIGI
 */
        mask    PHASE_MASK      CDI|IOI|MSGI
        mask    P_DATAOUT       0x00
        mask    P_DATAIN        IOI
        mask    P_COMMAND       CDI
        mask    P_MESGOUT       CDI|MSGI
        mask    P_STATUS        CDI|IOI
        mask    P_MESGIN        CDI|IOI|MSGI
}

/*
 * SCSI Control Signal Write Register (p. 3-16).
 * Writing to this register modifies the control signals on the bus.  Only
 * those signals that are allowed in the current mode (Initiator/Target) are
 * asserted.
 */
register SCSISIGO {
        address                 0x003
        access_mode WO
        bit     CDO             0x80
        bit     IOO             0x40
        bit     MSGO            0x20
        bit     ATNO            0x10
        bit     SELO            0x08
        bit     BSYO            0x04
        bit     REQO            0x02
        bit     ACKO            0x01
/*
 * Possible phases to write into SCSISIG0
 */
        mask    PHASE_MASK      CDI|IOI|MSGI
        mask    P_DATAOUT       0x00
        mask    P_DATAIN        IOI
        mask    P_COMMAND       CDI
        mask    P_MESGOUT       CDI|MSGI
        mask    P_STATUS        CDI|IOI
        mask    P_MESGIN        CDI|IOI|MSGI
}

/* 
 * SCSI Rate Control (p. 3-17).
 * Contents of this register determine the Synchronous SCSI data transfer
 * rate and the maximum synchronous Req/Ack offset.  An offset of 0 in the
 * SOFS (3:0) bits disables synchronous data transfers.  Any offset value
 * greater than 0 enables synchronous transfers.
 */
register SCSIRATE {
        address                 0x004
        access_mode RW
        bit     WIDEXFER        0x80            /* Wide transfer control */
        mask    SXFR            0x70            /* Sync transfer rate */
        mask    SXFR_ULTRA2     0x7f            /* Sync transfer rate */
        mask    SOFS            0x0f            /* Sync offset */
}

/*
 * SCSI ID (p. 3-18).
 * Contains the ID of the board and the current target on the
 * selected channel.
 */
register SCSIID {
        address                 0x005
        access_mode RW
        mask    TID             0xf0            /* Target ID mask */
        mask    OID             0x0f            /* Our ID mask */
        /*
         * SCSI Maximum Offset (p. 4-61 aic7890/91 Data Book)
         * The aic7890/91 allow an offset of up to 127 transfers in both wide
         * and narrow mode.
         */
        alias   SCSIOFFSET
        mask    SOFS_ULTRA2     0x7f            /* Sync offset U2 chips */
}

/*
 * SCSI Latched Data (p. 3-19).
 * Read/Write latches used to transfer data on the SCSI bus during
 * Automatic or Manual PIO mode.  SCSIDATH can be used for the
 * upper byte of a 16bit wide asynchronouse data phase transfer.
 */
register SCSIDATL {
        address                 0x006
        access_mode RW
}

register SCSIDATH {
        address                 0x007
        access_mode RW
}

/*
 * SCSI Transfer Count (pp. 3-19,20)
 * These registers count down the number of bytes transferred
 * across the SCSI bus.  The counter is decremented only once
 * the data has been safely transferred.  SDONE in SSTAT0 is
 * set when STCNT goes to 0
 */ 
register STCNT {
        address                 0x008
        size    3
        access_mode RW
}

/*
 * Clear SCSI Interrupt 0 (p. 3-20)
 * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT0.
 */
register CLRSINT0 {
        address                 0x00b
        access_mode WO
        bit     CLRSELDO        0x40
        bit     CLRSELDI        0x20
        bit     CLRSELINGO      0x10
        bit     CLRSWRAP        0x08
        bit     CLRSPIORDY      0x02
}

/*
 * SCSI Status 0 (p. 3-21)
 * Contains one set of SCSI Interrupt codes
 * These are most likely of interest to the sequencer
 */
register SSTAT0 {
        address                 0x00b
        access_mode RO
        bit     TARGET          0x80    /* Board acting as target */
        bit     SELDO           0x40    /* Selection Done */
        bit     SELDI           0x20    /* Board has been selected */
        bit     SELINGO         0x10    /* Selection In Progress */
        bit     SWRAP           0x08    /* 24bit counter wrap */
        bit     IOERR           0x08    /* LVD Tranceiver mode changed */
        bit     SDONE           0x04    /* STCNT = 0x000000 */
        bit     SPIORDY         0x02    /* SCSI PIO Ready */
        bit     DMADONE         0x01    /* DMA transfer completed */
}

/*
 * Clear SCSI Interrupt 1 (p. 3-23)
 * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT1.
 */
register CLRSINT1 {
        address                 0x00c
        access_mode WO
        bit     CLRSELTIMEO     0x80
        bit     CLRATNO         0x40
        bit     CLRSCSIRSTI     0x20
        bit     CLRBUSFREE      0x08
        bit     CLRSCSIPERR     0x04
        bit     CLRPHASECHG     0x02
        bit     CLRREQINIT      0x01
}

/*
 * SCSI Status 1 (p. 3-24)
 */
register SSTAT1 {
        address                 0x00c
        access_mode RO
        bit     SELTO           0x80
        bit     ATNTARG         0x40
        bit     SCSIRSTI        0x20
        bit     PHASEMIS        0x10
        bit     BUSFREE         0x08
        bit     SCSIPERR        0x04
        bit     PHASECHG        0x02
        bit     REQINIT         0x01
}

/*
 * SCSI Status 2 (pp. 3-25,26)
 */
register SSTAT2 {
        address                 0x00d
        access_mode RO
        bit     OVERRUN         0x80
        bit     EXP_ACTIVE      0x10    /* SCSI Expander Active */
        mask    SFCNT           0x1f
}

/*
 * SCSI Status 3 (p. 3-26)
 */
register SSTAT3 {
        address                 0x00e
        access_mode RO
        mask    SCSICNT         0xf0
        mask    OFFCNT          0x0f
}

/*
 * SCSI ID for the aic7890/91 chips
 */
register SCSIID_ULTRA2 {
        address                 0x00f
        access_mode RW
        mask    TID             0xf0            /* Target ID mask */
        mask    OID             0x0f            /* Our ID mask */
}

/*
 * SCSI Interrupt Mode 1 (p. 3-28)
 * Setting any bit will enable the corresponding function
 * in SIMODE0 to interrupt via the IRQ pin.
 */
register SIMODE0 {
        address                 0x010
        access_mode RW
        bit     ENSELDO         0x40
        bit     ENSELDI         0x20
        bit     ENSELINGO       0x10
        bit     ENSWRAP         0x08
        bit     ENIOERR         0x08    /* LVD Tranceiver mode changes */
        bit     ENSDONE         0x04
        bit     ENSPIORDY       0x02
        bit     ENDMADONE       0x01
}

/*
 * SCSI Interrupt Mode 1 (pp. 3-28,29)
 * Setting any bit will enable the corresponding function
 * in SIMODE1 to interrupt via the IRQ pin.
 */
register SIMODE1 {
        address                 0x011
        access_mode RW
        bit     ENSELTIMO       0x80
        bit     ENATNTARG       0x40
        bit     ENSCSIRST       0x20
        bit     ENPHASEMIS      0x10
        bit     ENBUSFREE       0x08
        bit     ENSCSIPERR      0x04
        bit     ENPHASECHG      0x02
        bit     ENREQINIT       0x01
}

/*
 * SCSI Data Bus (High) (p. 3-29)
 * This register reads data on the SCSI Data bus directly.
 */
register SCSIBUSL {
        address                 0x012
        access_mode RO
}

register SCSIBUSH {
        address                 0x013
        access_mode RO
}

/*
 * SCSI/Host Address (p. 3-30)
 * These registers hold the host address for the byte about to be
 * transferred on the SCSI bus.  They are counted up in the same
 * manner as STCNT is counted down.  SHADDR should always be used
 * to determine the address of the last byte transferred since HADDR
 * can be skewed by write ahead.
 */
register SHADDR {
        address                 0x014
        size    4
        access_mode RO
}

/*
 * Selection Timeout Timer (p. 3-30)
 */
register SELTIMER {
        address                 0x018
        access_mode RW
        bit     STAGE6          0x20
        bit     STAGE5          0x10
        bit     STAGE4          0x08
        bit     STAGE3          0x04
        bit     STAGE2          0x02
        bit     STAGE1          0x01
}

/*
 * Selection/Reselection ID (p. 3-31)
 * Upper four bits are the device id.  The ONEBIT is set when the re/selecting
 * device did not set its own ID.
 */
register SELID {
        address                 0x019
        access_mode RW
        mask    SELID_MASK      0xf0
        bit     ONEBIT          0x08
}

/*
 * Serial Port I/O Cabability register (p. 4-95 aic7860 Data Book)
 * Indicates if external logic has been attached to the chip to
 * perform the tasks of accessing a serial eeprom, testing termination
 * strength, and performing cable detection.  On the aic7860, most of
 * these features are handled on chip, but on the aic7855 an attached
 * aic3800 does the grunt work.
 */
register SPIOCAP {
        address                 0x01b
        access_mode RW
        bit     SOFT1           0x80
        bit     SOFT0           0x40
        bit     SOFTCMDEN       0x20    
        bit     HAS_BRDCTL      0x10    /* External Board control */
        bit     SEEPROM         0x08    /* External serial eeprom logic */
        bit     EEPROM          0x04    /* Writable external BIOS ROM */
        bit     ROM             0x02    /* Logic for accessing external ROM */
        bit     SSPIOCPS        0x01    /* Termination and cable detection */
}

/*
 * SCSI Block Control (p. 3-32)
 * Controls Bus type and channel selection.  In a twin channel configuration
 * addresses 0x00-0x1e are gated to the appropriate channel based on this
 * register.  SELWIDE allows for the coexistence of 8bit and 16bit devices
 * on a wide bus.
 */
register SBLKCTL {
        address                 0x01f
        access_mode RW
        bit     DIAGLEDEN       0x80    /* Aic78X0 only */
        bit     DIAGLEDON       0x40    /* Aic78X0 only */
        bit     AUTOFLUSHDIS    0x20
        bit     SELBUSB         0x08
        bit     ENAB40          0x08    /* LVD transceiver active */
        bit     ENAB20          0x04    /* SE/HVD transceiver active */
        bit     SELWIDE         0x02
        bit     XCVR            0x01    /* External transceiver active */
}

/*
 * Sequencer Control (p. 3-33)
 * Error detection mode and speed configuration
 */
register SEQCTL {
        address                 0x060
        access_mode RW
        bit     PERRORDIS       0x80
        bit     PAUSEDIS        0x40
        bit     FAILDIS         0x20
        bit     FASTMODE        0x10
        bit     BRKADRINTEN     0x08
        bit     STEP            0x04
        bit     SEQRESET        0x02
        bit     LOADRAM         0x01
}

/*
 * Sequencer RAM Data (p. 3-34)
 * Single byte window into the Scratch Ram area starting at the address
 * specified by SEQADDR0 and SEQADDR1.  To write a full word, simply write
 * four bytes in sucessesion.  The SEQADDRs will increment after the most
 * significant byte is written
 */
register SEQRAM {
        address                 0x061
        access_mode RW
}

/*
 * Sequencer Address Registers (p. 3-35)
 * Only the first bit of SEQADDR1 holds addressing information
 */
register SEQADDR0 {
        address                 0x062
        access_mode RW
}

register SEQADDR1 {
        address                 0x063
        access_mode RW
        mask    SEQADDR1_MASK   0x01
}

/*
 * Accumulator
 * We cheat by passing arguments in the Accumulator up to the kernel driver
 */
register ACCUM {
        address                 0x064
        access_mode RW
        accumulator
}

register SINDEX {
        address                 0x065
        access_mode RW
        sindex
}

register DINDEX {
        address                 0x066
        access_mode RW
}

register ALLONES {
        address                 0x069
        access_mode RO
        allones
}

register ALLZEROS {
        address                 0x06a
        access_mode RO
        allzeros
}

register NONE {
        address                 0x06a
        access_mode WO
        none
}

register FLAGS {
        address                 0x06b
        access_mode RO
        bit     ZERO            0x02
        bit     CARRY           0x01
}

register SINDIR {
        address                 0x06c
        access_mode RO
}

register DINDIR  {
        address                 0x06d
        access_mode WO
}

register FUNCTION1 {
        address                 0x06e
        access_mode RW
}

register STACK {
        address                 0x06f
        access_mode RO
}

/*
 * Board Control (p. 3-43)
 */
register BCTL {
        address                 0x084
        access_mode RW
        bit     ACE             0x08
        bit     ENABLE          0x01
}

register DSCOMMAND0 {
        address                 0x084
        access_mode RW
        bit     CACHETHEN       0x80
        bit     DPARCKEN        0x40
        bit     MPARCKEN        0x20
        bit     EXTREQLCK       0x10
        bit     INTSCBRAMSEL    0x08
        bit     RAMPS           0x04
        bit     USCBSIZE32      0x02
        bit     CIOPARCKEN      0x01
}

/*
 * On the aic78X0 chips, Board Control is replaced by the DSCommand
 * register (p. 4-64)
 */
register DSCOMMAND {
        address                 0x084
        access_mode RW
        bit     CACHETHEN       0x80    /* Cache Threshold enable */
        bit     DPARCKEN        0x40    /* Data Parity Check Enable */
        bit     MPARCKEN        0x20    /* Memory Parity Check Enable */
        bit     EXTREQLCK       0x10    /* External Request Lock */
}

/*
 * Bus On/Off Time (p. 3-44)
 */
register BUSTIME {
        address                 0x085
        access_mode RW
        mask    BOFF            0xf0
        mask    BON             0x0f
}

/*
 * Bus Speed (p. 3-45)
 */
register BUSSPD {
        address                 0x086
        access_mode RW
        mask    DFTHRSH         0xc0
        mask    STBOFF          0x38
        mask    STBON           0x07
        mask    DFTHRSH_100     0xc0
}

/*
 * Host Control (p. 3-47) R/W
 * Overall host control of the device.
 */
register HCNTRL {
        address                 0x087
        access_mode RW
        bit     POWRDN          0x40
        bit     SWINT           0x10
        bit     IRQMS           0x08
        bit     PAUSE           0x04
        bit     INTEN           0x02
        bit     CHIPRST         0x01
        bit     CHIPRSTACK      0x01
}

/*
 * Host Address (p. 3-48)
 * This register contains the address of the byte about
 * to be transferred across the host bus.
 */
register HADDR {
        address                 0x088
        size    4
        access_mode RW
}

register HCNT {
        address                 0x08c
        size    3
        access_mode RW
}

/*
 * SCB Pointer (p. 3-49)
 * Gate one of the four SCBs into the SCBARRAY window.
 */
register SCBPTR {
        address                 0x090
        access_mode RW
}

/*
 * Interrupt Status (p. 3-50)
 * Status for system interrupts
 */
register INTSTAT {
        address                 0x091
        access_mode RW
        bit     BRKADRINT 0x08
        bit     SCSIINT   0x04
        bit     CMDCMPLT  0x02
        bit     SEQINT    0x01
        mask    BAD_PHASE       SEQINT          /* unknown scsi bus phase */
        mask    SEND_REJECT     0x10|SEQINT     /* sending a message reject */
        mask    NO_IDENT        0x20|SEQINT     /* no IDENTIFY after reconnect*/
        mask    NO_MATCH        0x30|SEQINT     /* no cmd match for reconnect */
        mask    EXTENDED_MSG    0x40|SEQINT     /* Extended message received */
        mask    ABORT_REQUESTED 0x50|SEQINT     /* Reconect of aborted SCB */
        mask    REJECT_MSG      0x60|SEQINT     /* Reject message received */
        mask    BAD_STATUS      0x70|SEQINT     /* Bad status from target */
        mask    RESIDUAL        0x80|SEQINT     /* Residual byte count != 0 */
        mask    AWAITING_MSG    0xa0|SEQINT     /*
                                                 * Kernel requested to specify
                                                 * a message to this target
                                                 * (command was null), so tell
                                                 * it that it can fill the
                                                 * message buffer.
                                                 */
        mask    TRACEPOINT      0xb0|SEQINT
        mask    TRACEPOINT2     0xc0|SEQINT
        mask    MSGIN_PHASEMIS  0xd0|SEQINT     /*
                                                 * Target changed phase on us
                                                 * when we were expecting
                                                 * another msgin byte.
                                                 */
        mask    DATA_OVERRUN    0xe0|SEQINT     /*
                                                 * Target attempted to write
                                                 * beyond the bounds of its
                                                 * command.
                                                 */

        mask    SEQINT_MASK     0xf0|SEQINT     /* SEQINT Status Codes */
        mask    INT_PEND  (BRKADRINT|SEQINT|SCSIINT|CMDCMPLT)
}

/*
 * Hard Error (p. 3-53)
 * Reporting of catastrophic errors.  You usually cannot recover from
 * these without a full board reset.
 */
register ERROR {
        address                 0x092
        access_mode RO
        bit     CIOPARERR       0x80    /* Ultra2 only */
        bit     PCIERRSTAT      0x40    /* PCI only */
        bit     MPARERR         0x20    /* PCI only */
        bit     DPARERR         0x10    /* PCI only */
        bit     SQPARERR        0x08
        bit     ILLOPCODE       0x04
        bit     ILLSADDR        0x02
        bit     ILLHADDR        0x01
}

/*
 * Clear Interrupt Status (p. 3-52)
 */
register CLRINT {
        address                 0x092
        access_mode WO
        bit     CLRPARERR       0x10    /* PCI only */
        bit     CLRBRKADRINT    0x08
        bit     CLRSCSIINT      0x04
        bit     CLRCMDINT       0x02
        bit     CLRSEQINT       0x01
}

register DFCNTRL {
        address                 0x093
        access_mode RW
        bit     PRELOADEN       0x80    /* aic7890 only */
        bit     WIDEODD         0x40
        bit     SCSIEN          0x20
        bit     SDMAEN          0x10
        bit     SDMAENACK       0x10
        bit     HDMAEN          0x08
        bit     HDMAENACK       0x08
        bit     DIRECTION       0x04
        bit     FIFOFLUSH       0x02
        bit     FIFORESET       0x01
}

register DFSTATUS {
        address                 0x094
        access_mode RO
        bit     PRELOAD_AVAIL   0x80
        bit     DWORDEMP        0x20
        bit     MREQPEND        0x10
        bit     HDONE           0x08
        bit     DFTHRESH        0x04
        bit     FIFOFULL        0x02
        bit     FIFOEMP         0x01
}

register DFDAT {
        address                 0x099
        access_mode RW
}

/*
 * SCB Auto Increment (p. 3-59)
 * Byte offset into the SCB Array and an optional bit to allow auto
 * incrementing of the address during download and upload operations
 */
register SCBCNT {
        address                 0x09a
        access_mode RW
        bit     SCBAUTO         0x80
        mask    SCBCNT_MASK     0x1f
}

/*
 * Queue In FIFO (p. 3-60)
 * Input queue for queued SCBs (commands that the seqencer has yet to start)
 */
register QINFIFO {
        address                 0x09b
        access_mode RW
}

/*
 * Queue In Count (p. 3-60)
 * Number of queued SCBs
 */
register QINCNT {
        address                 0x09c
        access_mode RO
}

/*
 * Queue Out FIFO (p. 3-61)
 * Queue of SCBs that have completed and await the host
 */
register QOUTFIFO {
        address                 0x09d
        access_mode WO
}

/*
 * Queue Out Count (p. 3-61)
 * Number of queued SCBs in the Out FIFO
 */
register QOUTCNT {
        address                 0x09e
        access_mode RO
}

/*
 * Special Function
 */
register SFUNCT {
        address                 0x09f
        access_mode RW
}

/*
 * SCB Definition (p. 5-4)
 */
scb {
        address                 0x0a0
        SCB_CONTROL {
                size    1
                bit     MK_MESSAGE      0x80
                bit     DISCENB         0x40
                bit     TAG_ENB         0x20
                bit     DISCONNECTED    0x04
                mask    SCB_TAG_TYPE    0x03
        }
        SCB_TCL {
                size    1
                bit     SELBUSB         0x08
                mask    TID             0xf0
                mask    LID             0x07
        }
        SCB_TARGET_STATUS {
                size    1
        }
        SCB_SGCOUNT {
                size    1
        }
        SCB_SGPTR {
                size    4
        }
        SCB_RESID_SGCNT {
                size    1
        }
        SCB_RESID_DCNT  {
                size    3
        }
        SCB_DATAPTR {
                size    4
        }
        SCB_DATACNT {
                /*
                 * Really only 3 bytes, but padded to make
                 * the kernel's job easier.
                 */
                size    4
        }
        SCB_CMDPTR {
                size    4
        }
        SCB_CMDLEN {
                size    1
        }
        SCB_TAG {
                size    1
        }
        SCB_NEXT {
                size    1
        }
        SCB_PREV {
                size    1
        }
        SCB_BUSYTARGETS {
                size    4
        }
}

const   SG_SIZEOF       0x08            /* sizeof(struct ahc_dma) */

/* --------------------- AHA-2840-only definitions -------------------- */

register SEECTL_2840 {
        address                 0x0c0
        access_mode RW
        bit     CS_2840         0x04
        bit     CK_2840         0x02
        bit     DO_2840         0x01
}

register STATUS_2840 {
        address                 0x0c1
        access_mode RW
        bit     EEPROM_TF       0x80
        mask    BIOS_SEL        0x60
        mask    ADSEL           0x1e
        bit     DI_2840         0x01
}

/* --------------------- AIC-7870-only definitions -------------------- */

register DSPCISTATUS {
        address                 0x086
        mask    DFTHRSH_100     0xc0
}

register CCHADDR {
        address                 0x0E0
        size 8
}

register CCHCNT {
        address                 0x0E8
}

register CCSGRAM {
        address                 0x0E9
}

register CCSGADDR {
        address                 0x0EA
}

register CCSGCTL {
        address                 0x0EB
        bit     CCSGDONE        0x80
        bit     CCSGEN          0x08
        bit     FLAG            0x02
        bit     CCSGRESET       0x01
}

register CCSCBCNT {
        address                 0xEF
}

register CCSCBCTL {
        address                 0x0EE
        bit     CCSCBDONE       0x80
        bit     ARRDONE         0x40    /* SCB Array prefetch done */
        bit     CCARREN         0x10
        bit     CCSCBEN         0x08
        bit     CCSCBDIR        0x04
        bit     CCSCBRESET      0x01
}

register CCSCBADDR {
        address                 0x0ED
}

register CCSCBRAM {
        address                 0xEC
}

register CCSCBPTR {
        address                 0x0F1
}

register HNSCB_QOFF {
        address                 0x0F4
}

register SNSCB_QOFF {
        address                 0x0F6
}

register SDSCB_QOFF {
        address                 0x0F8
}

register QOFF_CTLSTA {
        address                 0x0FA
        bit     SCB_AVAIL       0x40
        bit     SNSCB_ROLLOVER  0x20
        bit     SDSCB_ROLLOVER  0x10
        mask    SCB_QSIZE       0x07
        mask    SCB_QSIZE_256   0x06
}

register DFF_THRSH {
        address                 0x0FB
        mask    WR_DFTHRSH      0x70
        mask    RD_DFTHRSH      0x07
        mask    RD_DFTHRSH_MIN  0x00
        mask    RD_DFTHRSH_25   0x01
        mask    RD_DFTHRSH_50   0x02
        mask    RD_DFTHRSH_63   0x03
        mask    RD_DFTHRSH_75   0x04
        mask    RD_DFTHRSH_85   0x05
        mask    RD_DFTHRSH_90   0x06
        mask    RD_DFTHRSH_MAX  0x07
        mask    WR_DFTHRSH_MIN  0x00
        mask    WR_DFTHRSH_25   0x10
        mask    WR_DFTHRSH_50   0x20
        mask    WR_DFTHRSH_63   0x30
        mask    WR_DFTHRSH_75   0x40
        mask    WR_DFTHRSH_85   0x50
        mask    WR_DFTHRSH_90   0x60
        mask    WR_DFTHRSH_MAX  0x70
}

register SG_CACHEPTR {
        access_mode RW
        address                 0x0fc
        mask    SG_USER_DATA    0xfc
        bit     LAST_SEG        0x02
        bit     LAST_SEG_DONE   0x01
}

register BRDCTL {
        address                 0x01d
        bit     BRDDAT7         0x80
        bit     BRDDAT6         0x40
        bit     BRDDAT5         0x20
        bit     BRDSTB          0x10
        bit     BRDCS           0x08
        bit     BRDRW           0x04
        bit     BRDCTL1         0x02
        bit     BRDCTL0         0x01
        /* 7890 Definitions */
        bit     BRDDAT4         0x10
        bit     BRDDAT3         0x08
        bit     BRDDAT2         0x04
        bit     BRDRW_ULTRA2    0x02
        bit     BRDSTB_ULTRA2   0x01
}

/*
 * Serial EEPROM Control (p. 4-92 in 7870 Databook)
 * Controls the reading and writing of an external serial 1-bit
 * EEPROM Device.  In order to access the serial EEPROM, you must
 * first set the SEEMS bit that generates a request to the memory
 * port for access to the serial EEPROM device.  When the memory
 * port is not busy servicing another request, it reconfigures
 * to allow access to the serial EEPROM.  When this happens, SEERDY
 * gets set high to verify that the memory port access has been
 * granted.  
 *
 * After successful arbitration for the memory port, the SEECS bit of 
 * the SEECTL register is connected to the chip select.  The SEECK, 
 * SEEDO, and SEEDI are connected to the clock, data out, and data in 
 * lines respectively.  The SEERDY bit of SEECTL is useful in that it 
 * gives us an 800 nsec timer.  After a write to the SEECTL register, 
 * the SEERDY goes high 800 nsec later.  The one exception to this is 
 * when we first request access to the memory port.  The SEERDY goes 
 * high to signify that access has been granted and, for this case, has 
 * no implied timing.
 *
 * See 93cx6.c for detailed information on the protocol necessary to 
 * read the serial EEPROM.
 */
register SEECTL {
        address                 0x01e
        bit     EXTARBACK       0x80
        bit     EXTARBREQ       0x40
        bit     SEEMS           0x20
        bit     SEERDY          0x10
        bit     SEECS           0x08
        bit     SEECK           0x04
        bit     SEEDO           0x02
        bit     SEEDI           0x01
}
/* ---------------------- Scratch RAM Offsets ------------------------- */
/* These offsets are either to values that are initialized by the board's
 * BIOS or are specified by the sequencer code.
 *
 * The host adapter card (at least the BIOS) uses 20-2f for SCSI
 * device information, 32-33 and 5a-5f as well. As it turns out, the
 * BIOS trashes 20-2f, writing the synchronous negotiation results
 * on top of the BIOS values, so we re-use those for our per-target
 * scratchspace (actually a value that can be copied directly into
 * SCSIRATE).  The kernel driver will enable synchronous negotiation
 * for all targets that have a value other than 0 in the lower four
 * bits of the target scratch space.  This should work regardless of
 * whether the bios has been installed.
 */

scratch_ram {
        address                 0x020

        /*
         * 1 byte per target starting at this address for configuration values
         */
        TARG_SCSIRATE {
                size            16
        }
        /*
         * Bit vector of targets that have ULTRA enabled.
         */
        ULTRA_ENB {
                size            2
        }
        /*
         * Bit vector of targets that have disconnection disabled.
         */
        DISC_DSB {
                size            2
        }
        /*
         * Single byte buffer used to designate the type or message
         * to send to a target.
         */
        MSG_OUT {
                size            1
        }
        /* Parameters for DMA Logic */
        DMAPARAMS {
                size            1
                bit     PRELOADEN       0x80
                bit     WIDEODD         0x40
                bit     SCSIEN          0x20
                bit     SDMAEN          0x10
                bit     SDMAENACK       0x10
                bit     HDMAEN          0x08
                bit     HDMAENACK       0x08
                bit     DIRECTION       0x04
                bit     FIFOFLUSH       0x02
                bit     FIFORESET       0x01
        }
        SEQ_FLAGS {
                size            1
                bit     IDENTIFY_SEEN   0x80
                bit     SCBPTR_VALID    0x20
                bit     DPHASE          0x10
                bit     AMTARGET        0x08
                bit     WIDE_BUS        0x02
                bit     TWIN_BUS        0x01
        }
        /*
         * Temporary storage for the
         * target/channel/lun of a
         * reconnecting target
         */
        SAVED_TCL {
                size            1
        }
        /* Working value of the number of SG segments left */
        SG_COUNT {
                size            1
        }
        /* Working value of SG pointer */
        SG_NEXT {
                size            4
        }
        /*
         * The last bus phase as seen by the sequencer. 
         */
        LASTPHASE {
                size            1
                bit     CDI             0x80
                bit     IOI             0x40
                bit     MSGI            0x20
                mask    PHASE_MASK      CDI|IOI|MSGI
                mask    P_DATAOUT       0x00
                mask    P_DATAIN        IOI
                mask    P_COMMAND       CDI
                mask    P_MESGOUT       CDI|MSGI
                mask    P_STATUS        CDI|IOI
                mask    P_MESGIN        CDI|IOI|MSGI
                mask    P_BUSFREE       0x01
        }
        /*
         * head of list of SCBs awaiting
         * selection
         */
        WAITING_SCBH {
                size            1
        }
        /*
         * head of list of SCBs that are
         * disconnected.  Used for SCB
         * paging.
         */
        DISCONNECTED_SCBH {
                size            1
        }
        /*
         * head of list of SCBs that are
         * not in use.  Used for SCB paging.
         */
        FREE_SCBH {
                size            1
        }
        /*
         * Address of the hardware scb array in the host.
         */
        HSCB_ADDR {
                size            4
        }
        /*
         * Address of the 256 byte array storing the SCBID of outstanding
         * untagged SCBs indexed by TCL.
         */
        SCBID_ADDR {
                size            4
        }
        /*
         * Address of the array of command descriptors used to store
         * information about incoming selections.
         */
        TMODE_CMDADDR {
                size            4
        }
        KERNEL_QINPOS {
                size            1
        }
        QINPOS {
                size            1
        }
        QOUTPOS {
                size            1
        }
        /*
         * Offset into the command descriptor array for the next
         * available desciptor to use.
         */
        TMODE_CMDADDR_NEXT {
                size            1
        }
        ARG_1 {
                size            1
                mask    SEND_MSG        0x80
                mask    SEND_SENSE      0x40
                mask    SEND_REJ        0x20
                mask    MSGOUT_PHASEMIS 0x10
                alias   RETURN_1
        }
        ARG_2 {
                size            1
                alias   RETURN_2
        }

        /*
         * Snapshot of MSG_OUT taken after each message is sent.
         */
        LAST_MSG {
                size            1
        }

        /*
         * Number of times we have filled the CCSGRAM with prefetched
         * SG elements.
         */
        PREFETCH_CNT {
                size            1
        }


        /*
         * These are reserved registers in the card's scratch ram.  Some of
         * the values are specified in the AHA2742 technical reference manual
         * and are initialized by the BIOS at boot time.
         */
        SCSICONF {
                address         0x05a
                size            1
                bit     TERM_ENB        0x80
                bit     RESET_SCSI      0x40
                mask    HSCSIID         0x07    /* our SCSI ID */
                mask    HWSCSIID        0x0f    /* our SCSI ID if Wide Bus */
        }
        HOSTCONF {
                address         0x05d
                size            1
        }
        HA_274_BIOSCTRL {
                address         0x05f
                size            1
                mask    BIOSMODE                0x30
                mask    BIOSDISABLED            0x30    
                bit     CHANNEL_B_PRIMARY       0x08
        }
        /*
         * Per target SCSI offset values for Ultra2 controllers.
         */
        TARG_OFFSET {
                address         0x070
                size            16
        }
}

const SCB_LIST_NULL     0xff

const CCSGADDR_MAX      0x80
const CCSGRAM_MAXSEGS   16

/* Offsets into the SCBID array where different data is stored */
const UNTAGGEDSCB_OFFSET        0
const QOUTFIFO_OFFSET           1
const QINFIFO_OFFSET            2

/* WDTR Message values */
const BUS_8_BIT                 0x00
const BUS_16_BIT                0x01
const BUS_32_BIT                0x02

/* Offset maximums */
const MAX_OFFSET_8BIT           0x0f
const MAX_OFFSET_16BIT          0x08
const MAX_OFFSET_ULTRA2         0x7f
const HOST_MSG                  0xff

/* Target mode command processing constants */
const CMD_GROUP_CODE_SHIFT      0x05
const CMD_GROUP0_BYTE_DELTA     -4
const CMD_GROUP2_BYTE_DELTA     -6
const CMD_GROUP4_BYTE_DELTA     4
const CMD_GROUP5_BYTE_DELTA     11

/*
 * Downloaded (kernel inserted) constants
 */

/*
 * Number of command descriptors in the command descriptor array.
 */
const TMODE_NUMCMDS     download

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.