Annotation of kernel/bsd/dev/ppc/drvApple96_SCSI/Apple96CurioPrivate.h, revision 1.1

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:  * 1997.07.18  MM      Added USE_CURIO_METHODS and wrote macros for the
        !            41:  *                     one-liner methods.
        !            42:  */
        !            43: 
        !            44: #import "Apple96Curio.h"
        !            45: 
        !            46: /* ** ** **
        !            47:  * ** ** ** Warning: all macros that take arguments must safely handle
        !            48:  * ** ** ** side-effects. For example CURIOputByteIntoFifo(*ptr++)
        !            49:  * ** ** ** must increment the pointer once only.
        !            50:  * ** ** **
        !            51:  */
        !            52: 
        !            53: /*
        !            54:  * CurioReadRegister and CurioWriteRegister actually touch the hardware
        !            55:  */
        !            56: #if USE_CURIO_METHODS || WRITE_CHIP_OPERATION_INTO_TIMESTAMP_LOG
        !            57: extern volatile UInt8 __CurioReadRegister__(
        !            58:                volatile UInt8          *scsiLogicalAddress,
        !            59:                UInt32                          index
        !            60:     );
        !            61: extern void __CurioWriteRegister__(
        !            62:                volatile UInt8          *scsiLogicalAddress,
        !            63:                UInt32                          index,
        !            64:                UInt8                           value
        !            65:     );
        !            66: 
        !            67: #else
        !            68: #define __CurioReadRegister__(scsiLogicalAddress, index)           \
        !            69:        (((volatile UInt8 *) scsiLogicalAddress)[index])
        !            70: #define __CurioWriteRegister__(scsiLogicalAddress, index, value)    \
        !            71:        ((((volatile UInt8 *) scsiLogicalAddress)[index]) = value)  
        !            72: #endif /* USE_CURIO_METHODS */
        !            73: /*
        !            74:  * These macros implement the one-line methods. They are included inline
        !            75:  * if USE_CURIO_METHODS is FALSE, or provided by the method implementation
        !            76:  * if USE_CURIO_METHODS is TRUE.
        !            77:  */
        !            78: #define CurioReadRegister(index)                               \
        !            79:            __CurioReadRegister__(gSCSILogicalAddress, (index))
        !            80: #define CurioWriteRegister(index, value)                       \
        !            81:            __CurioWriteRegister__(gSCSILogicalAddress, (index), (value))
        !            82: #define __CURIOreadStatusRegister()    (CurioReadRegister(rSTA))
        !            83: #define __CURIOreadSequenceStateRegister() (CurioReadRegister(rSQS))
        !            84: #define __CURIOreadInterruptRegister() (CurioReadRegister(rINT))
        !            85: #define __CURIOstartMSGIAction()       do {                    \
        !            86:            __CURIOnop();                                           \
        !            87:            __CURIOstartNonDMATransfer();                           \
        !            88:        } while (0)
        !            89: #define __CURIOnop()                   __CURIOsetCommandRegister(cNOP)
        !            90: #define __CURIOstartNonDMATransfer()   __CURIOsetCommandRegister(cIOXfer)
        !            91: #define __CURIOstartDMATransfer(count) do {                    \
        !            92:            UInt32          __count = (count);                  \
        !            93:            __CURIOwriteRegister(rXCM, (__count >> 8) & 0xFF);  \
        !            94:            SynchronizeIO();                                    \
        !            95:            __CURIOwriteRegister(rXCL, __count & 0xFF);         \
        !            96:            SynchronizeIO();                                    \
        !            97:            __CURIOsetCommandRegister(cDMAXfer);                    \
        !            98:        } while (0)
        !            99: #define __CURIOtransferPad(forOutput)  do {                    \
        !           100:            __CURIOwriteRegister(rXCM, 0xFF);                       \
        !           101:            SynchronizeIO();                                    \
        !           102:            __CURIOwriteRegister(rXCL, 0xFF);                       \
        !           103:            SynchronizeIO();                                    \
        !           104:            __CURIOsetCommandRegister((forOutput) ? cDMAXferPad : cXferPad);    \
        !           105:        } while (0)
        !           106: #define __CURIOclearTransferCountZeroBit() __CURIOsetCommandRegister(cNOP | bDMDEnBit)
        !           107: #define __CURIOgetTransferCount() (                            \
        !           108:            (                               \
        !           109:            (  ((__CURIOreadRegister(rTCH) & 0xFF) << 16)           \
        !           110:             | ((__CURIOreadRegister(rXCM) & 0xFF) <<  8)           \
        !           111:             | ((__CURIOreadRegister(rXCL) & 0xFF) <<  0)           \
        !           112:            )))
        !           113: #define __CURIOsetDestinationID(target) do {                   \
        !           114:            __CURIOwriteRegister(rSTA, target);                 \
        !           115:            SynchronizeIO();                                    \
        !           116:        } while (0)
        !           117: #define __CURIOinitiatorCommandComplete()   __CURIOsetCommandRegister(cCmdComp)
        !           118: #define __CURIOenableSelectionOrReselection() __CURIOsetCommandRegister(cEnSelResel)
        !           119: #define __CURIOdisconnect()        __CURIOsetCommandRegister(cDisconnect)
        !           120: /*
        !           121:  * Execute __CURIOgetFifoByte using the following sequence:
        !           122:  *     SynchronizeIO();
        !           123:  *     result = __CURIOgetFifoByte();
        !           124:  */
        !           125: #define __CURIOgetFifoByte() ( (UInt8) (                       \
        !           126:            __CURIOreadRegister(rFFO)                               \
        !           127:        ))
        !           128: #define __CURIOputByteIntoFifo(theByte) do {                   \
        !           129:            __CURIOwriteRegister(rFFO, (theByte));              \
        !           130:            SynchronizeIO();                                    \
        !           131:        } while (0)
        !           132: #define __CURIOflushFifo()             do {                    \
        !           133:            __CURIOsetCommandRegister(cFlshFFO);                    \
        !           134:            __CURIOnop(); /* Mandatory 360 nsec delay */            \
        !           135:            __CURIOnop();                                           \
        !           136:        } while (0)
        !           137: /*
        !           138:  * Execute __CURIOgetFifoCount using the following sequence:
        !           139:  *     SynchronizeIO();
        !           140:  *     result = __CURIOgetFifoCount();
        !           141:  */
        !           142: #define __CURIOgetFifoCount() ( (UInt8) (                      \
        !           143:            (__CURIOreadRegister(rFOS) & kFIFOCountMask)            \
        !           144:        ))
        !           145: #define __CURIOsetSelectionTimeout(tmo) do {                   \
        !           146:            UInt8   __selectionTimeout = (tmo);                 \
        !           147:            gLastSelectionTimeout = __selectionTimeout;         \
        !           148:            __CURIOwriteRegister(rINT, __selectionTimeout);     \
        !           149:            SynchronizeIO();                                    \
        !           150:        } while (0)
        !           151: #define __CURIOconfigForNonDMA()       do {                    \
        !           152:            __CURIOwriteRegister(rCF3, CONFIG_FOR_NON_DMA);     \
        !           153:            SynchronizeIO();                                    \
        !           154:        } while (0)
        !           155: #define __CURIOconfigForDMA()          do {                    \
        !           156:            __CURIOwriteRegister(rCF3, CONFIG_FOR_DMA);         \
        !           157:            SynchronizeIO();                                    \
        !           158:        } while (0)
        !           159: #define __CURIOmessageAccept()         do {                    \
        !           160:            __CURIOsetCommandRegister(cMsgAcep);                    \
        !           161:            SynchronizeIO();                                    \
        !           162:        } while (0)
        !           163: #define __CURIOmessageReject()         do {                    \
        !           164:            __CURIOputByteIntoFifo(kScsiMsgRejectMsg);          \
        !           165:            __CURIOsetATN();                                        \
        !           166:        } while (0)
        !           167: #define __CURIOsetATN()                        do {                    \
        !           168:            __CURIOsetCommandRegister(cSetAtn);                 \
        !           169:            SynchronizeIO();                                    \
        !           170:        } while (0)
        !           171: #define __CURIOclearATN()              do {                    \
        !           172:            __CURIOsetCommandRegister(cRstAtn);                 \
        !           173:            SynchronizeIO();                                    \
        !           174:        } while (0)
        !           175: #define __CURIOsetSynchronousOffset(off) do {                  \
        !           176:            UInt8 __off = (off);                                \
        !           177:            gLastSynchronousOffset = __off;                     \
        !           178:            __CURIOwriteRegister(rFOS, __off);                  \
        !           179:            SynchronizeIO();                                    \
        !           180:        } while (0)
        !           181: #define __CURIOsetSynchronousPeriod(per) do {                  \
        !           182:            UInt8 __per = (per);                                \
        !           183:            gLastSynchronousPeriod = __per;                     \
        !           184:            __CURIOwriteRegister(rSQS, __per);                  \
        !           185:            SynchronizeIO();                                    \
        !           186:        } while (0)
        !           187: #define __CURIOwriteRegister(reg, val) do {                    \
        !           188:            UInt8 __reg = (reg);                                \
        !           189:            UInt8 __val = (val);                                \
        !           190:            TAG("wri", (__reg << 8) | __val);                   \
        !           191:            CurioWriteRegister(__reg, __val);                   \
        !           192:            SynchronizeIO();                                    \
        !           193:        } while (0)
        !           194: #define __CURIOreadRegister(reg)       CurioReadRegister(reg)
        !           195: #define __CURIOsetCommandRegister(cmdByte) do {                        \
        !           196:            UInt8 __cmdByte = (cmdByte);                        \
        !           197:            ddmChip("curioSetCommandRegister byte = %x\n", __cmdByte, 2, 3, 4, 5); \
        !           198:            SynchronizeIO();    /* paranoia */                  \
        !           199:            CurioWriteRegister(rCMD, __cmdByte);                \
        !           200:            SynchronizeIO();                                    \
        !           201:        } while (0)
        !           202: #define __CURIOreadCommandRegister()   __CURIOreadRegister(rCMD)
        !           203: #define __CURIOsetSelectTimeout(tmo, rate, factor) (( (UInt32) (    \
        !           204:            (((UInt32) rate) * ((UInt32) tmo))  / (7682 * ((UInt32) factor)) \
        !           205:        )))
        !           206: 
        !           207: 
        !           208: #if USE_CURIO_METHODS
        !           209: /*
        !           210:  * Expand the one-liner macros as methods. This is useful for
        !           211:  * debugging as methods can be logged.
        !           212:  */
        !           213: #define CURIOreadStatusRegister()      [self curioReadStatusRegister]
        !           214: #define CURIOreadSequenceStateRegister() [self curioReadSequenceStateRegister]
        !           215: #define CURIOreadInterruptRegister()   [self curioReadInterruptRegister]
        !           216: #define CURIOstartMSGIAction()         [self curioStartMSGIAction]
        !           217: #define CURIOnop()                     [self curioNop]
        !           218: #define CURIOstartNonDMATransfer()     [self curioStartNonDMATransfer]
        !           219: #define CURIOstartDMATransfer(count)   [self curioStartDMATransfer : (count)]
        !           220: #define CURIOtransferPad(forOutput)    [self curioTransferPad : (forOutput)]
        !           221: #define CURIOclearTransferCountZeroBit() [self curioClearTransferCountZeroBit]
        !           222: #define CURIOgetTransferCount()                [self curioGetTransferCount]
        !           223: #define CURIOsetDestinationID(target)  [self curioSetDestinationID : (target)]
        !           224: #define CURIOinitiatorCommandComplete() [self curioInitiatorCommandComplete]
        !           225: #define CURIOenableSelectionOrReselection() [self curioEnableSelectionOrReselection]
        !           226: #define CURIOdisconnect()              [self curioDisconnect]
        !           227: #define CURIOgetFifoByte()             [self curioGetFifoByte]
        !           228: #define CURIOputByteIntoFifo(theByte)  [self curioPutByteIntoFifo : (theByte)]
        !           229: #define CURIOflushFifo()               [self curioFlushFifo]
        !           230: #define CURIOgetFifoCount()            [self curioGetFifoCount]
        !           231: #define CURIOsetSelectionTimeout(tmo)  [self curioSetSelectionTimeout : (tmo)]
        !           232: #define CURIOconfigForNonDMA()         [self curioConfigForNonDMA]
        !           233: #define CURIOconfigForDMA()            [self curioConfigForDMA]
        !           234: #define CURIOmessageAccept()           [self curioMessageAccept]
        !           235: #define CURIOmessageReject()           [self curioMessageReject]
        !           236: #define CURIOsetATN()                  [self curioSetATN]
        !           237: #define CURIOclearATN()                        [self curioClearATN]
        !           238: #define CURIOsetSynchronousOffset(off) [self curioSetSynchronousOffset : (off)]
        !           239: #define CURIOsetSynchronousPeriod(per) [self curioSetSynchronousPeriod : (per)]
        !           240: #define CURIOwriteRegister(reg, val)   [self curioWriteRegister : (reg) value : (val)]
        !           241: #define CURIOreadRegister(reg)         [self curioReadRegister : (reg)]
        !           242: #define CURIOsetCommandRegister(cmdByte) [self curioSetCommandRegister : (cmdByte)]
        !           243: #define CURIOreadCommandRegister()     [self curioReadCommandRegister]
        !           244: #define CURIOsetSelectTimeout(tmo, rate, factor)       \
        !           245:            [self curioSetSelectTimeout : (tmo)     \
        !           246:                    curioClockMHz       : (rate)    \
        !           247:                    curioClockFactor    : (factor)  \
        !           248:                ]
        !           249: #else
        !           250: /*
        !           251:  * Define the public CURIOxxx macros as private macros
        !           252:  */
        !           253: #define CURIOreadStatusRegister()      __CURIOreadStatusRegister()
        !           254: #define CURIOreadSequenceStateRegister() __CURIOreadSequenceStateRegister()
        !           255: #define CURIOreadInterruptRegister()   __CURIOreadInterruptRegister()
        !           256: #define CURIOstartMSGIAction()         __CURIOstartMSGIAction()
        !           257: #define CURIOnop()                     __CURIOnop()
        !           258: #define CURIOstartNonDMATransfer()     __CURIOstartNonDMATransfer()
        !           259: #define CURIOstartDMATransfer(count)   __CURIOstartDMATransfer(count)
        !           260: #define CURIOtransferPad(forOutput)    __CURIOtransferPad(forOutput)
        !           261: #define CURIOclearTransferCountZeroBit() __CURIOclearTransferCountZeroBit()
        !           262: #define CURIOgetTransferCount()                __CURIOgetTransferCount()
        !           263: #define CURIOsetDestinationID(target)  __CURIOsetDestinationID(target)
        !           264: #define CURIOinitiatorCommandComplete() __CURIOinitiatorCommandComplete()
        !           265: #define CURIOenableSelectionOrReselection() __CURIOenableSelectionOrReselection()
        !           266: #define CURIOdisconnect()              __CURIOdisconnect()
        !           267: #define CURIOgetFifoByte()             __CURIOgetFifoByte()
        !           268: #define CURIOputByteIntoFifo(theByte)  __CURIOputByteIntoFifo(theByte)
        !           269: #define CURIOflushFifo()               __CURIOflushFifo()
        !           270: #define CURIOgetFifoCount()            __CURIOgetFifoCount()
        !           271: #define CURIOsetSelectionTimeout(tmo)  __CURIOsetSelectionTimeout(tmo)
        !           272: #define CURIOconfigForNonDMA()         __CURIOconfigForNonDMA()
        !           273: #define CURIOconfigForDMA()            __CURIOconfigForDMA()
        !           274: #define CURIOmessageAccept()           __CURIOmessageAccept()
        !           275: #define CURIOmessageReject()           __CURIOmessageReject()
        !           276: #define CURIOsetATN()                  __CURIOsetATN()
        !           277: #define CURIOclearATN()                        __CURIOclearATN()
        !           278: #define CURIOsetSynchronousOffset(off) __CURIOsetSynchronousOffset(off)
        !           279: #define CURIOsetSynchronousPeriod(per) __CURIOsetSynchronousPeriod(per)
        !           280: #define CURIOwriteRegister(reg, val)   __CURIOwriteRegister(reg, val)
        !           281: #define CURIOreadRegister(reg)         __CURIOreadRegister(reg)
        !           282: #define CURIOsetCommandRegister(cmdByte) __CURIOsetCommandRegister(cmdByte)
        !           283: #define CURIOreadCommandRegister()     __CURIOreadCommandRegister()
        !           284: #define CURIOsetSelectTimeout(tmo, rate, factor) __CURIOsetSelectTimeout(tmo, rate, factor)
        !           285: #endif /* USE_CURIO_METHODS */
        !           286: /*
        !           287:  * These "macros" always expand to method calls. This keeps the mainline
        !           288:  * source code looking consistent. Methods were chosen either because
        !           289:  * the code is messy or because it is seldom used (or both).
        !           290:  */
        !           291: #define CURIOquickCheckForChipInterrupt() [self curioQuickCheckForChipInterrupt]
        !           292: #define CURIOinterruptPending()                [self curioInterruptPending]
        !           293: #define CURIOputCommandIntoFifo()      [self curioPutCommandIntoFifo]
        !           294: #define CURIOresetChip()               [self curioResetChip]
        !           295: #define CURIOresetSCSIBus()            [self curioResetSCSIBus]
        !           296: 
        !           297: @interface Apple96_SCSI(CurioPrivate)
        !           298: 
        !           299: /*
        !           300:  * Private methods
        !           301:  */
        !           302: - (Boolean)            curioQuickCheckForChipInterrupt;
        !           303: - (Boolean)            curioInterruptPending;
        !           304: - (void)               curioPutCommandIntoFifo;
        !           305: - (void)               curioResetChip;
        !           306: - (void)       curioResetSCSIBus;
        !           307: 
        !           308: #if USE_CURIO_METHODS
        !           309: - (UInt8)              curioReadStatusRegister;
        !           310: - (UInt8)              curioReadSequenceStateRegister;
        !           311: - (UInt8)              curioReadInterruptRegister;
        !           312: - (void)               curioStartMSGIAction;
        !           313: - (void)               curioNop;
        !           314: - (void)               curioStartNonDMATransfer;
        !           315: - (void)               curioStartDMATransfer
        !           316:                                                : (UInt32) transferCount;
        !           317: - (void)               curioTransferPad
        !           318:                                                : (Boolean) forOutput;
        !           319: - (void)               curioClearTransferCountZeroBit;
        !           320: - (UInt32)             curioGetTransferCount;
        !           321: - (void)               curioSetDestinationID
        !           322:                                                : (UInt8) targetID;
        !           323: - (void)               curioInitiatorCommandComplete;
        !           324: - (void)               curioEnableSelectionOrReselection;
        !           325: - (void)               curioDisconnect;
        !           326: - (UInt8)              curioGetFifoByte;
        !           327: - (void)               curioPutByteIntoFifo
        !           328:                                                : (UInt8)       value;
        !           329: - (void)               curioFlushFifo;
        !           330: - (UInt32)             curioGetFifoCount;
        !           331: - (void)               curioSetSelectionTimeout
        !           332:                                                : (UInt8)       selectionTimeout;
        !           333: - (void)               curioConfigForNonDMA;
        !           334: - (void)               curioConfigForDMA;
        !           335: - (void)               curioMessageAccept;
        !           336: - (void)               curioMessageReject;
        !           337: - (void)               curioSetATN;
        !           338: - (void)               curioClearATN;
        !           339: - (void)               curioSetSynchronousOffset
        !           340:                                                : (UInt8) synchronousOffset;
        !           341: - (void)               curioSetSynchronousPeriod
        !           342:                                                : (UInt8) synchronousPeriod;
        !           343: - (void)               curioWriteRegister
        !           344:                                                : (UInt8)       curioRegister
        !           345:                value                   : (UInt8)       value;
        !           346: - (UInt8)              curioReadRegister
        !           347:                                                : (UInt8)       curioRegister;
        !           348: - (void)               curioSetCommandRegister
        !           349:                                                : (UInt8) commandByte;
        !           350: - (UInt8)              curioReadCommandRegister;
        !           351: - (UInt32)  curioNanosecondToSyncPeriod
        !           352:                        : (UInt8)   nsecPeriod  /* Desired period           */
        !           353:        fastSCSI        : (UInt32)  fastSCSI    /* Control3.CR3_FAST_SCSI   */
        !           354:        clockRate       : (UInt32)  clockRate;  /* in MHz                   */
        !           355: - (UInt32)  curioSelectTimeout
        !           356:                        : (UInt32)  selectTimeoutMSec
        !           357:     curioClockMHz      : (UInt32)  chipClockRateMHz
        !           358:     curioClockFactor   : (UInt32)  chipClockFactor;
        !           359: #endif /* USE_CURIO_METHODS */
        !           360: @end /* Apple96_SCSI(CurioPrivate) */
        !           361: 
        !           362: 
        !           363: 
        !           364: 
        !           365:                

unix.superglobalmegacorp.com

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