|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: /** ! 26: * Copyright (c) 1994-1996 NeXT Software, Inc. All rights reserved. ! 27: * Copyright 1993-1995 by Apple Computer, Inc., all rights reserved. ! 28: * Copyright 1997 Apple Computer Inc. All Rights Reserved. ! 29: * @author Martin Minow mailto:[email protected] ! 30: * @revision 1997.02.13 Initial conversion from AMDPCSCSIDriver sources. ! 31: * ! 32: * Set tabs every 4 characters. ! 33: * ! 34: * Apple96Curio.h - Hardware (chip) definitions for Apple 53c96 SCSI interface. ! 35: * Apple96SCSI is closely based on Doug Mitchell's AMD 53C974/79C974 driver ! 36: * using design concepts from Copland DR2 Curio and MESH SCSI plugins. ! 37: * ! 38: * Edit History ! 39: * 1997.02.13 MM Initial conversion from AMDPCSCSIDriver sources. ! 40: */ ! 41: ! 42: #import "Apple96SCSI.h" ! 43: /* ! 44: * Define offsets into the SCSI 53c96 chip. Use the READ_REG and WRITE_REG ! 45: * macros to access the chip. ! 46: */ ! 47: typedef enum { ! 48: rXCL = 0x00, /* Transfer counter LSB (r/w) */ ! 49: rXCM = 0x10, /* Transfer counter MSB (r/w) */ ! 50: rFFO = 0x20, /* Fifo (r/w) */ ! 51: rCMD = 0x30, /* Command (r/w) */ ! 52: rSTA = 0x40, /* Status (r) or Destination bus ID (w) */ ! 53: rINT = 0x50, /* Interrupt (r) or Select/reselect timeout (w) */ ! 54: rSQS = 0x60, /* Sequence step (r) or Synch Period (w) */ ! 55: rFOS = 0x70, /* FIFO Flags/Sequence Step (r) or Sync Offset (w) */ ! 56: rCF1 = 0x80, /* Configuration 1 (r/w) */ ! 57: rCKF = 0x90, /* Clock Conversion Factor (w) */ ! 58: rTST = 0xA0, /* Test (w) */ ! 59: rCF2 = 0xB0, /* Configuration 2 (r/w) */ ! 60: rCF3 = 0xC0, /* Configuration 3 (r/w) */ ! 61: rCF4 = 0xD0, /* Configuration 4 (r/w) */ ! 62: rTCH = 0xE0, /* Transfer counter high/ID (r/w) */ ! 63: rDMA = 0xF0 /* Pseudo-DMA (r/w) */ ! 64: } CurioChipRegisters; ! 65: ! 66: /* ! 67: * SCSI 53C96 (ASC) Command Set ! 68: */ ! 69: enum { ! 70: cNOP = 0x00, /* NOP command */ ! 71: cFlshFFO = 0x01, /* flush FIFO command */ ! 72: cRstSChp = 0x02, /* reset SCSI chip */ ! 73: cRstSBus = 0x03, /* reset SCSI bus */ ! 74: ! 75: cIOXfer = 0x10, /* non-DMA Transfer command */ ! 76: cCmdComp = 0x11, /* Initiator Command Complete Seq */ ! 77: cMsgAcep = 0x12, /* Message Accepted */ ! 78: cXferPad = 0x18, /* Transfer pad */ ! 79: cDisconnect = 0x23, /* Disconnect from the SCSI bus */ ! 80: cSlctNoAtn = 0x41, /* Select Without ATN Sequence */ ! 81: cSlctAtn = 0x42, /* Select With ATN Sequence */ ! 82: cSlctAtnStp = 0x43, /* Select With ATN and Stop Seq */ ! 83: cEnSelResel = 0x44, /* Enable Selection/Reselection */ ! 84: cDsSelResel = 0x45, /* Disable Selection/Reselection */ ! 85: cSlctAtn3 = 0x46, /* Select with ATN, send 3 byte msg */ ! 86: ! 87: cSetAtn = 0x1A, /* Set ATN command */ ! 88: cRstAtn = 0x1B, /* Reset ATN command */ ! 89: ! 90: bDMDEnBit = 0x80, /* Enable bit for DMA commands */ ! 91: bDscCmdState = 0x40, /* Disconnected State Group Cmd's */ ! 92: ! 93: cDMAXfer = ( bDMDEnBit | cIOXfer ), /* DMA Transfer Cmd */ ! 94: cDMAXferPad = ( bDMDEnBit | cXferPad ), /* DMA Transfer Pad */ ! 95: cDMASelWOAtn = ( bDMDEnBit | cSlctNoAtn ), /* Sel w/o ATN + DMA */ ! 96: cDMASelWAtn = ( bDMDEnBit | cSlctAtn ) /* Sel With ATN use DMA */ ! 97: }; ! 98: ! 99: /* ! 100: * SCSI 53C95 (ASC) Bit Definitions. ! 101: * Note: these are duplicated so I don't have to retype the entire ! 102: * state machine. ! 103: */ ! 104: ! 105: /* ! 106: * Bits in the Interrupt (rINT) register. ! 107: */ ! 108: enum { ! 109: iSelected = 0x01, /* selected bit */ ! 110: iSelectWAtn = 0x02, /* selected w/ ATN bit */ ! 111: iReselected = 0x04, /* reselected bit */ ! 112: iFuncComp = 0x08, /* function complete bit */ ! 113: iBusService = 0x10, /* bus service bit */ ! 114: iDisconnect = 0x20, /* disconnected bit */ ! 115: iIlegalCmd = 0x40, /* illegal command bit */ ! 116: iResetDetect = 0x80 /* SCSI reset detected bit */ ! 117: }; ! 118: //enum { /* As used in AppleChip.m */ ! 119: // IS_SCSIRESET = iResetDetect, ! 120: // IS_ILLEGALCMD = iIlegalCmd, ! 121: // IS_DISCONNECT = iDisconnect, ! 122: // IS_SERVICE_REQ = iBusService, ! 123: // IS_SUCCESSFUL_OP = iFuncComp, ! 124: // IS_RESELECTED = iReselected, ! 125: // IS_SELECT_ATN = iSelectWAtn, ! 126: // IS_SELECTED = iSelected ! 127: //}; ! 128: ! 129: /* ! 130: * Bits in the Status (rSTA) register. ! 131: */ ! 132: enum { ! 133: sIO = 0x01, /* I/O bit */ ! 134: sCD = 0x02, /* C/D bit */ ! 135: sMsg = 0x04, /* MSG bit */ ! 136: sCmdComp = 0x08, /* function complete bit */ ! 137: sTermCount = 0x10, /* bus service bit */ ! 138: sParityErr = 0x20, /* disconnected bit */ ! 139: sGrossErr = 0x40, /* illegal command bit */ ! 140: sIntPend = 0x80, /* SCSI interrupt pending */ ! 141: mPhase = (sIO | sCD | sMsg), /* the phase bitmask */ ! 142: sTCIntPend = (sTermCount | sIntPend) /* TC int pending */ ! 143: }; ! 144: enum { /* As used in AppleChip.m */ ! 145: SS_INTERRUPT = sIntPend, ! 146: // SS_ILLEGALOP = sGrossErr, ! 147: SS_PARITYERROR = sParityErr, ! 148: SS_COUNTZERO = sTermCount, ! 149: // SS_PHASEMASK = mPhase ! 150: }; ! 151: ! 152: /* ! 153: * Bits in the FIFO Count/Sequence Step (rFOS) register. ! 154: */ ! 155: enum { ! 156: kFIFOCountMask = 0x1F, /* mask to get FIFO count */ ! 157: mSeqStep = 0xE0 /* mask to get sequence step */ ! 158: }; ! 159: /* ! 160: * internal state register (internState) ! 161: * Hmm: I'm not sure if these exist on the Curio. ! 162: */ ! 163: #define INS_SYNC_FULL 0x10 // sync offset buffer full ! 164: #define INS_STATE_MASK 0x07 ! 165: ! 166: /* ! 167: * Clock Conversion Values (based on SCSI chip clock - not CPU clock) ! 168: */ ! 169: enum { ! 170: ccf10MHz = 0x02, /* CLK conv factor 10.0Mhz */ ! 171: ccf11to15MHz = 0x03, /* CLK conv factor 10.01 to 15.0Mhz */ ! 172: ccf16to20MHz = 0x04, /* CLK conv factor 15.01 to 20.0Mhz */ ! 173: ccf21to25MHz = 0x05, /* CLK conv factor 20.01 to 25.0Mhz */ ! 174: ccf26to30MHz = 0x06, /* CLK conv factor 25.01 to 30.0Mhz */ ! 175: ccf31to35MHz = 0x07, /* CLK conv factor 30.01 to 35.0Mhz */ ! 176: ccf36to40MHz = 0x00 /* CLK conv factor 35.01 to 40.0Mhz (0 <- 8) */ ! 177: }; ! 178: ! 179: /* ! 180: * Select timeout values (these are the values stored in the chip register). ! 181: * The "Mhz" value is the SCSI bus speed, returned by the Registry. ! 182: */ ! 183: enum { ! 184: SelTO16Mhz = 126, /* (0x7e) using the formula: RV (regr value) */ ! 185: /* 126 = (16MHz * 250mS)/ (7682 * 4) */ ! 186: /* 250mS is ANSI standard. */ ! 187: SelTO25Mhz = 167, /* (0xa7) using the formula: RV (regr value) */ ! 188: /* 163 = (25MHz * 250mS)/ (7682 * 5) */ ! 189: /* 250mS is ANSI standard. */ ! 190: SelTO33Mhz = 167, /* (0xa7) using the formula: RV (regr value) */ ! 191: /* 153 = (33MHz * 250mS)/ (7682 * 7) */ ! 192: /* 250mS is ANSI standard. */ ! 193: SelTO40Mhz = 167 /* (0xa7) using the formula: RV (regr value) */ ! 194: /* 163 = (40MHz * 250mS)/ (7682 * 8) */ ! 195: /* 250mS is ANSI standard. */ ! 196: }; ! 197: ! 198: /* ! 199: * Configuration Register 1 bit definition ! 200: */ ! 201: enum { ! 202: CF1_SLOW = 0x80, /* Slow Cable Mode enabled bit */ ! 203: CF1_SRD = 0x40, /* SCSI Reset Reporting Intrp Disabled bit */ ! 204: CF1_PTEST = 0x20, /* Parity Test Mode bit */ ! 205: CF1_ENABPAR = 0x10, /* Enable Parity Checking bit */ ! 206: CF1_CHIPTEST = 0x08, /* Enable Chip Test Mode bit */ ! 207: CF1_DEFAULT_ID_MASK = 0x07 /* The default host SCSI ID mask. */ ! 208: }; ! 209: ! 210: /* ! 211: * Configuration Register 2 bit definition ! 212: */ ! 213: enum { ! 214: CF2_RFB = 0x80, /* Reserve FIFO Byte */ ! 215: CF2_ENFEATURES = 0x40, /* Enable features */ ! 216: CF2_EBC = 0x20, /* Enable Byte Control */ ! 217: CF2_DREQHIZ = 0x10, /* Force DREQ to HI-Z state */ ! 218: CF2_SCSI2 = 0x08, /* SCSI-2 features */ ! 219: CF2_BPA = 0x04, /* Target:bad parity abort */ ! 220: CF2_RPE = 0x02, /* Rregister parity enable */ ! 221: CF2_DPE = 0x01 /* DMA parity enable */ ! 222: }; ! 223: ! 224: /* ! 225: * Configuration Register 3 bit definition ! 226: */ ! 227: enum { ! 228: CF3_MSGID = 0x80, /* Check for valid ID message */ ! 229: CF3_QTAG = 0x40, /* Enable 3 byte QTAG messages */ ! 230: CF3_CDB10 = 0x20, /* Recognize 10 bytes CDBs */ ! 231: CF3_FASTCLOCK = 0x10, /* Enable fast clock for fast SCSI */ ! 232: CF3_FASTSCSI = 0x08, /* Enable fast SCSI */ ! 233: CF3_SRB = 0x04, /* Save residual byte */ ! 234: CF3_ALTDMA = 0x02, /* Alternate DMA (for threshold 8 only) */ ! 235: CF3_T8 = 0x01, /* Force 8-byte DMA caching */ ! 236: CONFIG_FOR_DMA = (CF3_SRB | CF3_ALTDMA | CF3_T8), ! 237: CONFIG_FOR_NON_DMA = (CF3_SRB) ! 238: }; ! 239: ! 240: /* ! 241: * Configuration Register 4 bit definitions. ! 242: */ ! 243: enum { ! 244: CF4_ACTIVENEGATION = 0x04, ! 245: CF4_TRANSFERCOUNTTEST = 0x02, ! 246: CF4_BACKTOBACK = 0x01 ! 247: }; ! 248: ! 249: /* ! 250: * Miscellaneous Defines. ! 251: */ ! 252: enum { ! 253: kDefaultInitiatorID = 7, /* SCSI Bus Initiator ID */ ! 254: /* ! 255: * The maximum transfer size is set *below* the absolute max of 65536 to avoid ! 256: * the problem of understanding the value zero, which means either 65536 bytes ! 257: * or zero bytes remaining to transfer. ! 258: */ ! 259: kMaxC96TransferSize = (65536 - 4096), ! 260: // ** ** ** NEED VALUE ! 261: kChipFastBusClockMHz = 00, /* Fast bus clock rate */ ! 262: kChipDefaultBusClockMHz = 25 /* Default 53c96 clock rate in MHz */ ! 263: }; ! 264: ! 265: enum { /* Values for SyncParms MESH register: */ ! 266: /* 1st nibble is offset, 2nd is period. */ ! 267: /* Zero offset means async. */ ! 268: /* Note: the external bus does not support */ ! 269: /* either fast or synchronous modes, so the */ ! 270: /* following definitions are irrelevant. */ ! 271: /* However, they will be necessary for the */ ! 272: /* internal bus on the PowerMac 8100 */ ! 273: kSyncParmsNone = 0x00, /* No synchronous negotiation needed */ ! 274: kSyncParmsAsync = 0x02, /* Async with min period = 2 */ ! 275: kSyncParmsFast = 0xF0 /* offset = 15, period = Fast (10 MB/s) */ ! 276: }; ! 277: ! 278: /* ! 279: * DMA alignment requirements. ! 280: */ ! 281: enum { ! 282: AMIC_ReadStartAlignment = 8, ! 283: AMIC_WriteStartAlighment = 8, ! 284: AMIC_ReadLengthAlignment = 0, ! 285: AMIC_WriteLengthAlignment = 0, ! 286: DBDMA_ReadStartAlignment = 0, ! 287: DBDMA_WriteStartAlignment = 0, ! 288: DBDMA_ReadLengthAlignment = 0, ! 289: DBDMA_WriteLengthAlignment = 0 ! 290: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.