Annotation of sys/arch/sparc/dev/xyreg.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: xyreg.h,v 1.4 2004/04/12 22:12:32 jmc Exp $ */
! 2: /* $NetBSD: xyreg.h,v 1.3 1996/03/31 22:39:02 pk Exp $ */
! 3:
! 4: /*
! 5: *
! 6: * Copyright (c) 1995 Charles D. Cranor
! 7: * All rights reserved.
! 8: *
! 9: * Redistribution and use in source and binary forms, with or without
! 10: * modification, are permitted provided that the following conditions
! 11: * are met:
! 12: * 1. Redistributions of source code must retain the above copyright
! 13: * notice, this list of conditions and the following disclaimer.
! 14: * 2. Redistributions in binary form must reproduce the above copyright
! 15: * notice, this list of conditions and the following disclaimer in the
! 16: * documentation and/or other materials provided with the distribution.
! 17: * 3. All advertising materials mentioning features or use of this software
! 18: * must display the following acknowledgement:
! 19: * This product includes software developed by Charles D. Cranor.
! 20: * 4. The name of the author may not be used to endorse or promote products
! 21: * derived from this software without specific prior written permission.
! 22: *
! 23: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 24: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 25: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 26: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 27: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 28: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 29: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 30: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 31: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 32: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 33: */
! 34:
! 35: /*
! 36: * x y r e g . h
! 37: *
! 38: * this file contains the description of the Xylogics 450/451's hardware
! 39: * data structures.
! 40: *
! 41: * author: Chuck Cranor <chuck@ccrc.wustl.edu>
! 42: */
! 43:
! 44: #define XYC_MAXDEV 2 /* max devices per controller */
! 45: #define XYC_CTLIOPB XYC_MAXDEV /* controller's iopb */
! 46: #define XYC_RESETUSEC 1000000 /* max time for xyc reset (same as xdc?) */
! 47: #define XYC_MAXIOPB (XYC_MAXDEV+1)
! 48: /* max number of iopbs that can be active */
! 49: #define XYC_MAXTIME 4*1000000 /* four seconds before we give up and reset */
! 50: #define XYC_MAXTRIES 4 /* max number of times to retry an operation */
! 51: #define XYC_INTERLEAVE 1 /* interleave (from disk label?) */
! 52: #define XYFM_BPS 0x200 /* must be 512! */
! 53:
! 54: /*
! 55: * xyc device interface
! 56: * (lives in VME address space) [note: bytes are swapped!]
! 57: */
! 58:
! 59: struct xyc {
! 60: volatile u_char xyc_reloc_hi; /* iopb relocation (low byte) */
! 61: volatile u_char xyc_reloc_lo; /* iopb relocation (high byte) */
! 62: volatile u_char xyc_addr_hi; /* iopb address (low byte) */
! 63: volatile u_char xyc_addr_lo; /* iopb address (high byte) */
! 64: volatile u_char xyc_rsetup; /* reset/update reg */
! 65: volatile u_char xyc_csr; /* control and status register */
! 66: };
! 67:
! 68: /*
! 69: * xyc_csr
! 70: */
! 71:
! 72: #define XYC_GBSY 0x80 /* go/busy */
! 73: #define XYC_ERR 0x40 /* error */
! 74: #define XYC_DERR 0x20 /* double error! */
! 75: #define XYC_IPND 0x10 /* interrupt pending */
! 76: #define XYC_ADRM 0x08 /* 24-bit addressing */
! 77: #define XYC_AREQ 0x04 /* attention request */
! 78: #define XYC_AACK 0x02 /* attention ack. */
! 79: #define XYC_DRDY 0x01 /* drive ready */
! 80:
! 81: /*
! 82: * Input/Output Parameter Block (iopb)
! 83: *
! 84: * all controller commands are done via iopb's. to start a command you
! 85: * must do this:
! 86: * [1] allocate space in DVMA space for the iopb
! 87: * [2] fill out all the fields of the iopb
! 88: * [3] if the controller isn't busy, start the iopb by loading the address
! 89: * and reloc in the xyc's registers and setting the "go" bit [done]
! 90: * [4] controller busy: set AREQ bit, and wait for AACK bit.
! 91: * add iopb to the chain, and clear AREQ to resume I/O
! 92: *
! 93: * when the controller is done with a command it may interrupt (if you
! 94: * ask it to) and it will set the XYC_IPND bit in the csr. clear
! 95: * the interrupt by writing one to this bit.
! 96: *
! 97: * the format of the iopb is described in section 2.4 of the manual.
! 98: * note that it is byte-swapped on the sun.
! 99: */
! 100:
! 101: struct xy_iopb {
! 102: /* section 2.4.2: byte 1 */
! 103: volatile u_char resv1:1; /* reserved */
! 104: volatile u_char iei:1; /* interrupt on each IOPB done */
! 105: volatile u_char ierr:1; /* interrupt on error (no effect on 450) */
! 106: volatile u_char hdp:1; /* hold dual port drive */
! 107: volatile u_char asr:1; /* autoseek retry */
! 108: volatile u_char eef:1; /* enable extended fn. (overlap seek) */
! 109: volatile u_char ecm:2; /* ECC correction mode */
! 110: #define XY_ECM 2 /* use mode 2 (see section 2.4.2) */
! 111: /* section 2.4.1: byte 0 */
! 112: volatile u_char aud:1; /* auto-update iopb */
! 113: volatile u_char relo:1; /* enable multibus relocation (>16bit addrs)*/
! 114: volatile u_char chen:1; /* chain enable, "next iopb" is valid */
! 115: volatile u_char ien:1; /* interrupt enable */
! 116: volatile u_char com:4; /* command */
! 117: #define XYCMD_NOP 0x0 /* no-op */
! 118: #define XYCMD_WR 0x1 /* write */
! 119: #define XYCMD_RD 0x2 /* read */
! 120: #define XYCMD_WTH 0x3 /* write track headers */
! 121: #define XYCMD_RTH 0x4 /* read track headers */
! 122: #define XYCMD_SK 0x5 /* seek */
! 123: #define XYCMD_RST 0x6 /* drive reset */
! 124: #define XYCMD_WFM 0x7 /* write format */
! 125: #define XYCMD_RDH 0x8 /* read header, data, and ECC */
! 126: #define XYCMD_RDS 0x9 /* read drive status */
! 127: #define XYCMD_WRH 0xa /* write header, data, and ECC */
! 128: #define XYCMD_SDS 0xb /* set drive size */
! 129: #define XYCMD_ST 0xc /* self test */
! 130: #define XYCMD_R 0xd /* reserved */
! 131: #define XYCMD_MBL 0xe /* maint. buffer load */
! 132: #define XYCMD_MBD 0xf /* main. buffer dump */
! 133: /* section 2.4.4: byte 3 */
! 134: volatile u_char errno; /* error or completion code */
! 135: /* section 2.4.3: byte 2 */
! 136: volatile u_char errs:1; /* error summary bit */
! 137: volatile u_char resv2:2; /* reserved */
! 138: volatile u_char ctyp:3; /* controller type */
! 139: #define XYCT_450 1 /* the 450 controller */
! 140: volatile u_char resv3:1; /* reserved */
! 141: volatile u_char done:1; /* done! */
! 142: /* section 2.4.6: byte 5 */
! 143: volatile u_char dt:2; /* drive type */
! 144: #define XYC_MAXDT 3 /* largest drive type possible */
! 145: volatile u_char resv4:4; /* reserved */
! 146: volatile u_char unit:2; /* unit # */
! 147: /* section 2.4.5: byte 4 */
! 148: volatile u_char bw:1; /* byte(1)/word(0) xfer size */
! 149: volatile u_char intlv:4; /* interleave factor (0=1:1, 1=2:1, etc.) */
! 150: volatile u_char thro:3; /* dma throttle (0=2,1=4,2=8, etc...) */
! 151: #define XY_THRO 4 /* 4 == 32 dma cycles */
! 152: /* section 2.4.8: byte 7 */
! 153: volatile u_char sect; /* sector # */
! 154: /* section 2.4.7: byte 6 */
! 155: volatile u_char head; /* head # */
! 156: /* section 2.4.9: byte 8,9 */
! 157: volatile u_short cyl; /* cyl # */
! 158: /* section 2.4.10: byte a,b */
! 159: volatile u_short scnt; /* sector count, also drive status */
! 160: #define xy_dr_status scnt
! 161: #define XYS_ONCL 0x80 /* on-cylinder (active LOW) */
! 162: #define XYS_DRDY 0x40 /* drive ready (active LOW) */
! 163: #define XYS_WRPT 0x20 /* write protect */
! 164: #define XYS_DPB 0x10 /* dual-port busy */
! 165: #define XYS_SKER 0x08 /* hard seek error */
! 166: #define XYS_DFLT 0x04 /* disk fault */
! 167: /* section 2.4.11: byte c,d */
! 168: volatile u_short dataa; /* data address */
! 169: /* section 2.4.12: byte e,f */
! 170: volatile u_short datar; /* data relocation pointer */
! 171: /* section 2.4.14: byte 11 */
! 172: volatile u_char subfn; /* sub-function */
! 173: /* section 2.4.13: byte 10 */
! 174: volatile u_char hoff; /* head offset for fixed/removable drives */
! 175: /* section 2.4.15: byte 12,13 */
! 176: volatile u_short nxtiopb; /* next iopb address (same relocation) */
! 177: /* section 2.4.16: byte 14,15 */
! 178: volatile u_short eccpat; /* ecc pattern */
! 179: /* section 2.4.17: byte 16,17 */
! 180: volatile u_short eccaddr; /* ecc address */
! 181: };
! 182:
! 183:
! 184: /*
! 185: * errors (section 2.4.4.1)
! 186: */
! 187:
! 188: /* software error codes */
! 189: #define XY_ERR_FAIL 0xff /* general total failure */
! 190: #define XY_ERR_DERR 0xfe /* double error */
! 191: /* no error */
! 192: #define XY_ERR_AOK 0x00 /* success */
! 193:
! 194: #define XY_ERR_IPEN 0x01 /* interrupt pending */
! 195: #define XY_ERR_BCFL 0x03 /* busy conflict */
! 196: #define XY_ERR_TIMO 0x04 /* operation timeout */
! 197: #define XY_ERR_NHDR 0x05 /* header not found */
! 198: #define XY_ERR_HARD 0x06 /* hard ECC error */
! 199: #define XY_ERR_ICYL 0x07 /* illegal cylinder address */
! 200: #define XY_ERR_ISEC 0x0a /* illegal sector address */
! 201: #define XY_ERR_SMAL 0x0d /* last sector too small */
! 202: #define XY_ERR_SACK 0x0e /* slave ACK error (non-existent memory) */
! 203: #define XY_ERR_CHER 0x12 /* cylinder and head/header error */
! 204: #define XY_ERR_SRTR 0x13 /* auto-seek retry successful */
! 205: #define XY_ERR_WPRO 0x14 /* write-protect error */
! 206: #define XY_ERR_UIMP 0x15 /* unimplemented command */
! 207: #define XY_ERR_DNRY 0x16 /* drive not ready */
! 208: #define XY_ERR_SZER 0x17 /* sector count zero */
! 209: #define XY_ERR_DFLT 0x18 /* drive faulted */
! 210: #define XY_ERR_ISSZ 0x19 /* illegal sector size */
! 211: #define XY_ERR_SLTA 0x1a /* self test a */
! 212: #define XY_ERR_SLTB 0x1b /* self test b */
! 213: #define XY_ERR_SLTC 0x1c /* self test c */
! 214: #define XY_ERR_SOFT 0x1e /* soft ECC error */
! 215: #define XY_ERR_SFOK 0x1f /* soft ECC error recovered */
! 216: #define XY_ERR_IHED 0x20 /* illegal head */
! 217: #define XY_ERR_DSEQ 0x21 /* disk sequencer error */
! 218: #define XY_ERR_SEEK 0x25 /* seek error */
! 219:
! 220:
! 221: /* error actions */
! 222: #define XY_ERA_PROG 0x10 /* program error: quit */
! 223: #define XY_ERA_SOFT 0x30 /* soft error: we recovered */
! 224: #define XY_ERA_HARD 0x40 /* hard error: retry */
! 225: #define XY_ERA_RSET 0x60 /* hard error: reset, then retry */
! 226: #define XY_ERA_WPRO 0x90 /* write protected */
! 227:
! 228:
CVSweb