Annotation of researchv9/sys/sundev/sireg.h, revision 1.1

1.1     ! root        1: /*     @(#)sireg.h 1.1 86/02/03 SMI    */
        !             2: 
        !             3: /*
        !             4:  * Copyright (c) 1983 by Sun Microsystems, Inc.
        !             5:  */
        !             6: 
        !             7: /*
        !             8:  * Register definitions for the Sun3/50 onboard and Sun3 32-bit VME version 
        !             9:  * of the SCSI control logic interface. Both of these interfaces use the
        !            10:  * NCR 5380 SBC (SCSI Bus Controller). The main difference between these
        !            11:  * two interfaces is the dma interface. The Sun3/50 onboard version uses
        !            12:  * the AMD 9516 UDC (Universal DMA Controller).
        !            13:  * Since the NCR 5380 SBC chip is used, both interfaces support the SCSI
        !            14:  * disconnect/reconnect capability thus implying support for the scsi
        !            15:  * arbitration phase.
        !            16:  */
        !            17: 
        !            18: /*
        !            19:  * NCR 5380 SBC (SCSI Bus Controller) Registers.
        !            20:  */
        !            21: 
        !            22: /* read of sbc registers yields the following: */
        !            23: struct sbc_read_reg {
        !            24:        u_char          cdr;    /* current data register */
        !            25:        u_char          icr;    /* initiator command register */
        !            26:        u_char          mr;     /* mode register */
        !            27:        u_char          tcr;    /* target command register */
        !            28:        u_char          cbsr;   /* current bus status register */
        !            29:        u_char          bsr;    /* bus and status register */
        !            30:        u_char          idr;    /* input data register */
        !            31:        u_char          clr;    /* read to clear parity error, */
        !            32:                                /* interrupt request, and busy */
        !            33:                                /* failure bits in the bsr */
        !            34: };
        !            35: 
        !            36: /* write of sbc registers yields the following: */
        !            37: struct sbc_write_reg {
        !            38:        u_char          odr;    /* output data register */
        !            39:        u_char          icr;    /* initiator command register */
        !            40:        u_char          mr;     /* mode register */
        !            41:        u_char          tcr;    /* target command register */
        !            42:        u_char          ser;    /* select/reselect enable register */
        !            43:        u_char          send;   /* start dma for target/initiator send xfer */
        !            44:        u_char          trcv;   /* start dma for target receive transfer */
        !            45:        u_char          ircv;   /* start dma for initiator receive transfer */
        !            46: };
        !            47: 
        !            48: /* bits in the sbc initiator command register */
        !            49: #define        SBC_ICR_RST     0x80    /* (r/w) assert reset */
        !            50: #define SBC_ICR_AIP    0x40    /* (r)   arbitration in progress */
        !            51: #define SBC_ICR_TEST   0x40    /* (w)   test mode, disables output */
        !            52: #define SBC_ICR_LA     0x20    /* (r)   lost arbitration */
        !            53: #define SBC_ICR_DE     0x20    /* (w)   differential enable */
        !            54: #define SBC_ICR_ACK    0x10    /* (r/w) assert acknowledge */
        !            55: #define SBC_ICR_BUSY   0x08    /* (r/w) assert busy */
        !            56: #define SBC_ICR_SEL    0x04    /* (r/w) assert select */
        !            57: #define SBC_ICR_ATN    0x02    /* (r/w) assert attention */
        !            58: #define SBC_ICR_DATA   0x01    /* (r/w) assert data bus */
        !            59: 
        !            60: /* bits in the sbc mode register (same on read or write) */
        !            61: #define SBC_MR_BDMA    0x80    /* block mode dma */
        !            62: #define SBC_MR_TRG     0x40    /* target mode */
        !            63: #define SBC_MR_EPC     0x20    /* enable parity check */
        !            64: #define SBC_MR_EPI     0x10    /* enable parity interrupt */
        !            65: #define SBC_MR_EEI     0x08    /* enable eop interrupt */
        !            66: #define SBC_MR_MBSY    0x04    /* monitor busy */
        !            67: #define SBC_MR_DMA     0x02    /* dma mode */
        !            68: #define SBC_MR_ARB     0x01    /* arbitration mode */
        !            69: 
        !            70: /* bits in the sbc target command register */
        !            71: #define SBC_TCR_REQ    0x08    /* assert request */
        !            72: #define SBC_TCR_MSG    0x04    /* assert message */
        !            73: #define SBC_TCR_CD     0x02    /* assert command/data */
        !            74: #define SBC_TCR_IO     0x01    /* assert input/output */
        !            75: 
        !            76: /* settings of tcr to reflect different information transfer phases */
        !            77: #define TCR_COMMAND    (SBC_TCR_CD)
        !            78: #define TCR_MSG_OUT    (SBC_TCR_MSG | SBC_TCR_CD)
        !            79: #define TCR_DATA_OUT   0
        !            80: #define TCR_STATUS     (SBC_TCR_CD | SBC_TCR_IO)
        !            81: #define TCR_MSG_IN     (SBC_TCR_MSG | SBC_TCR_CD | SBC_TCR_IO)
        !            82: #define TCR_DATA_IN    (SBC_TCR_IO)
        !            83: #define TCR_UNSPECIFIED        (SBC_TCR_MSG)
        !            84: 
        !            85: /* bits in the sbc current bus status register */
        !            86: #define SBC_CBSR_RST   0x80    /* reset */
        !            87: #define SBC_CBSR_BSY   0x40    /* busy */
        !            88: #define SBC_CBSR_REQ   0x20    /* request */
        !            89: #define SBC_CBSR_MSG   0x10    /* message */
        !            90: #define SBC_CBSR_CD    0x08    /* command/data */
        !            91: #define SBC_CBSR_IO    0x04    /* input/output */
        !            92: #define SBC_CBSR_SEL   0x02    /* select */
        !            93: #define SBC_CBSR_DBP   0x01    /* data bus parity */
        !            94: 
        !            95: /* scsi bus signals reflecting different information transfer phases */
        !            96: #define CBSR_PHASE_BITS        (SBC_CBSR_CD | SBC_CBSR_MSG | SBC_CBSR_IO)
        !            97: #define PHASE_COMMAND  (SBC_CBSR_CD)
        !            98: #define PHASE_MSG_OUT  (SBC_CBSR_MSG | SBC_CBSR_CD)
        !            99: #define PHASE_DATA_OUT 0
        !           100: #define PHASE_STATUS   (SBC_CBSR_CD | SBC_CBSR_IO)
        !           101: #define PHASE_MSG_IN   (SBC_CBSR_MSG | SBC_CBSR_CD | SBC_CBSR_IO)
        !           102: #define PHASE_DATA_IN  (SBC_CBSR_IO)
        !           103: 
        !           104: /* bits in the sbc bus and status register */
        !           105: #define SBC_BSR_EDMA   0x80    /* end of dma */
        !           106: #define SBC_BSR_RDMA   0x40    /* dma request */
        !           107: #define SBC_BSR_PERR   0x20    /* parity error */
        !           108: #define SBC_BSR_INTR   0x10    /* interrupt request */
        !           109: #define SBC_BSR_PMTCH  0x08    /* phase match */
        !           110: #define SBC_BSR_BERR   0x04    /* busy error */
        !           111: #define SBC_BSR_ATN    0x02    /* attention */
        !           112: #define SBC_BSR_ACK    0x01    /* acknowledge */
        !           113: 
        !           114: /*
        !           115:  * AMD 9516 UDC (Universal DMA Controller) Registers.
        !           116:  * Sun3/50 only.
        !           117:  */
        !           118: 
        !           119: /* addresses of the udc registers accessed directly by driver */
        !           120: #define UDC_ADR_MODE           0x38    /* master mode register */
        !           121: #define UDC_ADR_COMMAND                0x2e    /* command register (write only) */
        !           122: #define UDC_ADR_STATUS         0x2e    /* status register (read only) */
        !           123: #define UDC_ADR_CAR_HIGH       0x26    /* chain addr reg, high word */
        !           124: #define UDC_ADR_CAR_LOW                0x22    /* chain addr reg, low word */
        !           125: #define UDC_ADR_CARA_HIGH      0x1a    /* cur addr reg A, high word */
        !           126: #define UDC_ADR_CARA_LOW       0x0a    /* cur addr reg A, low word */
        !           127: #define UDC_ADR_CARB_HIGH      0x12    /* cur addr reg B, high word */
        !           128: #define UDC_ADR_CARB_LOW       0x02    /* cur addr reg B, low word */
        !           129: #define UDC_ADR_CMR_HIGH       0x56    /* channel mode reg, high word */
        !           130: #define UDC_ADR_CMR_LOW                0x52    /* channel mode reg, low word */
        !           131: #define UDC_ADR_COUNT          0x32    /* number of words to transfer */
        !           132: 
        !           133: /* 
        !           134:  * For a dma transfer, the appropriate udc registers are loaded from a 
        !           135:  * table in memory pointed to by the chain address register.
        !           136:  */
        !           137: struct udc_table {
        !           138:        u_short                 rsel;   /* tells udc which regs to load */
        !           139:        u_short                 haddr;  /* high word of main mem dma address */
        !           140:        u_short                 laddr;  /* low word of main mem dma address */
        !           141:        u_short                 count;  /* num words to transfer */
        !           142:        u_short                 hcmr;   /* high word of channel mode reg */
        !           143:        u_short                 lcmr;   /* low word of channel mode reg */
        !           144: };
        !           145: 
        !           146: /* indicates which udc registers are to be set based on info in above table */
        !           147: #define UDC_RSEL_RECV          0x0182
        !           148: #define UDC_RSEL_SEND          0x0282
        !           149: 
        !           150: /* setting of chain mode reg: selects how the dma op is to be executed */
        !           151: #define UDC_CMR_HIGH           0x0040  /* high word of channel mode reg */
        !           152: #define UDC_CMR_LSEND          0x00c2  /* low word of cmr when send */
        !           153: #define UDC_CMR_LRECV          0x00d2  /* low word of cmr when receiving */
        !           154: 
        !           155: /* setting for the master mode register */
        !           156: #define UDC_MODE               0xd     /* enables udc chip */
        !           157: 
        !           158: /* setting for the low byte in the high word of an address */
        !           159: #define UDC_ADDR_INFO          0x40    /* inc addr after each word is dma'd */
        !           160: 
        !           161: /* udc commands */
        !           162: #define UDC_CMD_STRT_CHN       0xa0    /* start chaining */
        !           163: #define UDC_CMD_CIE            0x32    /* channel 1 interrupt enable */
        !           164: #define UDC_CMD_RESET          0x00    /* reset udc, same as hdw reset */
        !           165: 
        !           166: /* bits in the udc status register */
        !           167: #define UDC_SR_CIE             0x8000  /* channel interrupt enable */
        !           168: #define UDC_SR_IP              0x2000  /* interrupt pending */
        !           169: #define UDC_SR_CA              0x1000  /* channel abort */
        !           170: #define UDC_SR_NAC             0x0800  /* no auto reload or chaining*/
        !           171: #define UDC_SR_WFB             0x0400  /* waiting for bus */
        !           172: #define UDC_SR_SIP             0x0200  /* second interrupt pending */
        !           173: #define UDC_SR_HM              0x0040  /* hardware mask */
        !           174: #define UDC_SR_HRQ             0x0020  /* hardware request */
        !           175: #define UDC_SR_MCH             0x0010  /* match on upper comparator byte */
        !           176: #define UDC_SR_MCL             0x0008  /* match on lower comparator byte */
        !           177: #define UDC_SR_MC              0x0004  /* match condition ended dma */
        !           178: #define UDC_SR_EOP             0x0002  /* eop condition ended dma */
        !           179: #define UDC_SR_TC              0x0001  /* termination of count ended dma */
        !           180: 
        !           181: /*
        !           182:  * Misc defines 
        !           183:  */
        !           184: 
        !           185: /* arbitraty retry count */
        !           186: #define SI_NUM_RETRIES         2
        !           187: 
        !           188: /* scsi timer values, all in microseconds */
        !           189: #define SI_ARBITRATION_DELAY   3
        !           190: #define SI_BUS_CLEAR_DELAY     1
        !           191: #define SI_BUS_SETTLE_DELAY    1
        !           192: #define SI_UDC_WAIT            1
        !           193: #define        SI_WAIT_COUNT           250000
        !           194: 
        !           195: /* directions for dma transfers */
        !           196: #define SI_RECV_DATA           0
        !           197: #define SI_SEND_DATA           1
        !           198: #define SI_NO_DATA             2
        !           199: 
        !           200: /* initiator's scsi device id */
        !           201: #define        SI_HOST_ID              0x80
        !           202: 
        !           203: /* possible values for the address modifier, sun3 vme version only */
        !           204: #define VME_SUPV_DATA_24       0x3d00
        !           205: 
        !           206: /* must massage dvma addresses for Sun3/50 hardware */
        !           207: #define DVMA_OFFSET    (int)(DVMA - (char *)KERNELBASE)
        !           208: 
        !           209: /* 
        !           210:  * Register layout for the SCSI control logic interface.
        !           211:  * Some of these registers apply to only one interface and some
        !           212:  * apply to both. The registers which apply to the Sun3/50 onboard 
        !           213:  * version only are udc_rdata and udc_raddr. The registers which
        !           214:  * apply to the Sun3 vme version only are dma_addr, dma_count, bpr,
        !           215:  * iv_am, and bcrh. Thus, the sbc registers, fifo_data, bcr, and csr 
        !           216:  * apply to both interfaces.
        !           217:  * One other feature of the vme interface: a write to the dma count 
        !           218:  * register also causes a write to the fifo byte count register and
        !           219:  * vis versa.
        !           220:  */
        !           221: struct scsi_si_reg {
        !           222:        union {
        !           223:                struct sbc_read_reg     read;   /* scsi bus ctlr, read reg */
        !           224:                struct sbc_write_reg    write;  /* scsi bus ctlr, write reg */
        !           225:        } sbc;
        !           226: #define sbc_rreg sbc.read
        !           227: #define sbc_wreg sbc.write
        !           228:        u_int                   dma_addr;       /* dma address register */
        !           229:        u_int                   dma_count;      /* dma count register */
        !           230:        u_short                 udc_rdata;      /* univ dma ctlr, reg data */
        !           231:        u_short                 udc_raddr;      /* univ dma ctlr, reg addr */
        !           232:        u_short                 fifo_data;      /* fifo data register */
        !           233:                                                /* holds extra byte on odd */
        !           234:                                                /* byte dma read */
        !           235:        u_short                 bcr;            /* fifo byte count reg */
        !           236:        u_short                 csr;            /* control/status register */
        !           237:        u_int                   bpr;            /* byte pack register */
        !           238:        u_short                 iv_am;          /* bits 0-7: addr modifier */
        !           239:                                                /* bits 8-13: intr vector */
        !           240:                                                /* bits 14-15: unused */
        !           241:        u_short                 bcrh;           /* high portion of bcr */
        !           242: };
        !           243: 
        !           244: /*
        !           245:  * Status Register.
        !           246:  * Note:
        !           247:  *     (r)     indicates bit is read only.
        !           248:  *     (rw)    indicates bit is read or write.
        !           249:  *     (v)     vme host adaptor interface only.
        !           250:  *     (o)     sun3/50 onboard host adaptor interface only.
        !           251:  *     (b)     both vme and sun3/50 host adaptor interfaces.
        !           252:  */
        !           253: #define SI_CSR_DMA_ACTIVE      0x8000  /* (r,o) dma transfer active */
        !           254: #define SI_CSR_DMA_CONFLICT    0x4000  /* (r,b) reg accessed while dmaing */
        !           255: #define SI_CSR_DMA_BUS_ERR     0x2000  /* (r,b) bus error during dma */
        !           256: #define SI_CSR_UNUSED          0x1000  /* (r,b) always read as zero */
        !           257: #define SI_CSR_FIFO_FULL       0x0800  /* (r,b) fifo full */
        !           258: #define SI_CSR_FIFO_EMPTY      0x0400  /* (r,b) fifo empty */
        !           259: #define SI_CSR_SBC_IP          0x0200  /* (r,b) sbc interrupt pending */
        !           260: #define SI_CSR_DMA_IP          0x0100  /* (r,b) dma interrupt pending */
        !           261: #define SI_CSR_LOB             0x00c0  /* (r,v) number of leftover bytes */
        !           262: #define SI_CSR_LOB_THREE       0x00c0  /* (r,v) three leftover bytes */
        !           263: #define SI_CSR_LOB_TWO         0x0080  /* (r,v) two leftover bytes */
        !           264: #define SI_CSR_LOB_ONE         0x0040  /* (r,v) one leftover byte */
        !           265: #define SI_CSR_BPCON           0x0020  /* (rw,v) byte packing control */
        !           266:                                        /* dma is in 0=longwords, 1=words */
        !           267: #define SI_CSR_DMA_EN          0x0010  /* (rw,v) dma enable */
        !           268: #define SI_CSR_SEND            0x0008  /* (rw,b) dma dir, 1=to device */
        !           269: #define SI_CSR_INTR_EN         0x0004  /* (rw,b) interrupts enable */
        !           270: #define SI_CSR_FIFO_RES                0x0002  /* (rw,b) inits fifo, 0=reset */
        !           271: #define SI_CSR_SCSI_RES                0x0001  /* (rw,b) reset sbc and udc, 0=reset */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.