Annotation of kernel/bsd/dev/ppc/drvApple96_SCSI/Apple96CurioDBDMA.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 1997 Apple Computer Inc. All Rights Reserved.
        !            28:  * @author     Martin Minow    mailto:[email protected]
        !            29:  * @revision   1997.02.13      Initial conversion from AMDPCSCSIDriver sources.
        !            30:  *
        !            31:  * Set tabs every 4 characters.
        !            32:  *
        !            33:  * Apple96PCIDBDMA.h - Minimal DBDMA Handler for the Apple 96 PCI driver. This is
        !            34:  * a temporary file until "real" DBDMA support appears.
        !            35:  *
        !            36:  * Edit History
        !            37:  * 1997.02.13  MM              Initial conversion from AMDPCSCSIDriver sources. 
        !            38:  * 1997.07.18  MM      Added USE_CURIO_METHODS and wrote macros for the
        !            39:  *                     one-liner methods.
        !            40:  */
        !            41: 
        !            42: #import "Apple96SCSI.h"
        !            43: 
        !            44: /**
        !            45:  * Copyright 1984-1997 Apple Computer Inc. All Rights Reserved.
        !            46:  * @author     Martin Minow    mailto:[email protected]
        !            47:  * @revision   1997.02.13      Initial conversion from Copland D12 DBDMA.Rev 9 sources.
        !            48:  *
        !            49:  * Set tabs every 4 characters.
        !            50:  *
        !            51:  * AppleDBDMADefinitions.h - registers and inline functions for the DBDMA memory controller.
        !            52:  *
        !            53:  * Edit History
        !            54:  * 1997.02.13  MM              Initial conversion from AMDPCSCSIDriver sources. 
        !            55:  */
        !            56: 
        !            57: #import "Apple96DBDMADefs.h"
        !            58: #import <machdep/ppc/proc_reg.h>
        !            59: 
        !            60: #if 1
        !            61: /**
        !            62:  * This is a temporary implementation of EndianSwap32Bit until
        !            63:  * the correct library/method is made available.
        !            64:  * @param      value           The value to change
        !            65:  * @result     The value endian-swapped.
        !            66:  */
        !            67: static inline unsigned EndianSwap32Bit(
        !            68:                unsigned                        value
        !            69:        )
        !            70: {
        !            71: 
        !            72:                register unsigned       temp;
        !            73:        
        !            74:                temp = ((value & 0xFF000000) >> 24);
        !            75:                temp |= ((value & 0x00FF0000) >> 8);
        !            76:                temp |= ((value & 0x0000FF00) << 8);
        !            77:                temp |= ((value & 0x000000FF) << 24);
        !            78:                return (temp);
        !            79: }
        !            80: #endif
        !            81: 
        !            82: /*
        !            83:  * Don't Endian-swap register read/write operations.
        !            84:  */
        !            85: #define __DBDMA_READ(reg)      EndianSwap32Bit(*((volatile UInt32 *) &gDBDMALogicalAddress->reg))
        !            86: #define __DBDMA_WRITE(reg, value) do {                                                                 \
        !            87:                *((volatile UInt32 *) &gDBDMALogicalAddress->reg) = EndianSwap32Bit(value);     \
        !            88:                SynchronizeIO();                                                                                                \
        !            89:        } while (0)
        !            90: 
        !            91: #define DBDMASetChannelControl(ctlValue) do {          \
        !            92:                SynchronizeIO();                                                        \
        !            93:                __DBDMA_WRITE(channelControl, ctlValue);        \
        !            94:                SynchronizeIO();                                                        \
        !            95:        } while (0)
        !            96: #define DBDMAGetChannelStatus()                                        __DBDMA_READ(channelStatus)
        !            97: #define DBDMAGetCommandPtr()                                   __DBDMA_READ(commandPtrLo)
        !            98: #define DBDMASetCommandPtr(cclPtr)                             __DBDMA_WRITE(commandPtrLo, cclPtr)
        !            99: #define DBDMAGetInterruptSelect()                              __DBDMA_READ(interruptSelect)
        !           100: #define DBDMASetInterruptSelect(intSelValue)   __DBDMA_WRITE(interruptSelect, intSelValue)
        !           101: #define DBDMAGetBranchSelect()                                 __DBDMA_READ(branchSelect)
        !           102: #define DBDMASetBranchSelect(braSelValue)              __DBDMA_WRITE(branchSelect, braSelValue)
        !           103: #define DBDMAGetWaitSelect()                                   __DBDMA_READ(waitSelect)
        !           104: #define DBDMASetWaitSelect(waitSelValue)               __DBDMA_WRITE(waitSelect, waitSelValue)
        !           105: 
        !           106: 
        !           107: /*
        !           108:  * Construct a DBDMA Channel Command descriptor with no command dependencies.
        !           109:  * Opcode and address may not have side-effects.
        !           110:  *  void MakeCCDescriptor(
        !           111:  *                     DBDMADescriptor         descriptorPtr,
        !           112:  *                     unsigned long           opcode,
        !           113:  *                     unsigned long           addr            -- physical address
        !           114:  *             );
        !           115:  */
        !           116: #define MakeCCDescriptor(descriptorPtr, opcode, addr) do {                     \
        !           117:                (descriptorPtr)->address = EndianSwap32Bit(addr);                       \
        !           118:                (descriptorPtr)->cmdDep = 0;                                                            \
        !           119:                (descriptorPtr)->result = EndianSwap32Bit(0xDEADBEEF);          \
        !           120:                sync();                                                                                                         \
        !           121:                (descriptorPtr)->operation = EndianSwap32Bit(opcode);           \
        !           122:                sync();                                                                                                         \
        !           123:        } while (0)
        !           124: /*
        !           125:  * Construct a DBDMA Channel Command descriptor with command dependencies.
        !           126:  * Opcode, address, and dependency may not have side-effects.
        !           127:  *  void MakeCmdDepCCDescriptor(
        !           128:  *                     DBDMADescriptor         descriptorPtr,
        !           129:  *                     unsigned long           opcode,
        !           130:  *                     unsigned long           addr,   -- physical address
        !           131:  *         unsigned long       dependency
        !           132:  *             );
        !           133:  */
        !           134: #define MakeCmdDepCCDescriptor(descriptorPtr, opcode, addr, dep) do {  \
        !           135:                (descriptorPtr)->address = EndianSwap32Bit(addr);                       \
        !           136:                (descriptorPtr)->cmdDep = EndianSwap32Bit(dep);                         \
        !           137:                (descriptorPtr)->result = EndianSwap32Bit(0xDEADBEEF);          \
        !           138:                sync();                                                                                                         \
        !           139:                (descriptorPtr)->operation = EndianSwap32Bit(opcode);           \
        !           140:                sync();                                                                                                         \
        !           141:        } while (0)
        !           142: #define GetCCOperation(descriptorPtr)                                                          \
        !           143:                (EndianSwap32Bit((descriptorPtr)->operation))
        !           144: #define SetCCOperation(descriptorPtr, opcode)                                          \
        !           145:                ((descriptorPtr)->operation = EndianSwap32Bit(opcode))
        !           146: #define GetCCAddress(descriptorPtr)                                                                    \
        !           147:                (EndianSwap32Bit((descriptorPtr)->address))
        !           148: #define SetCCAddress(descriptorPtr, addr)                                                      \
        !           149:                ((descriptorPtr)->address = EndianSwap32Bit(addr))
        !           150: #define GetCCCmdDep(descriptorPtr)                                                                     \
        !           151:                (EndianSwap32Bit((descriptorPtr)->cmdDep))
        !           152: #define SetCCCmdDep(descriptorPtr, cmdDepValue)                                                \
        !           153:                ((descriptorPtr)->cmdDep = EndianSwap32Bit(cmdDepValue))
        !           154: #define GetCCResult(descriptorPtr)                                                                     \
        !           155:                (EndianSwap32Bit((descriptorPtr)->result))
        !           156: #define SetCCResult(descriptorPtr, resultValue)                                                \
        !           157:                ((descriptorPtr)->result = EndianSwap32Bit(resultValue))
        !           158: 
        !           159: /*
        !           160:  * These macros implement the DBDMA interface. 
        !           161:  */
        !           162: #define __DBDMAreset() do {                    \
        !           163:                DBDMASetChannelControl(                 \
        !           164:                        kdbdmaClrRun                    \
        !           165:                        | kdbdmaClrPause                \
        !           166:                        | kdbdmaClrDead                 \
        !           167:                );                          \
        !           168:     } while (0)
        !           169: 
        !           170: #define __DBDMAspinUntilIdle() do {                \
        !           171:                SynchronizeIO();                    \
        !           172:        } while ((DBDMAGetChannelStatus() & kdbdmaActive) != 0);    \
        !           173: 
        !           174: #define __DBDMAstartTransfer() do {                \
        !           175:                DBDMASetChannelControl(kdbdmaSetRun | kdbdmaSetWake);   \
        !           176:     } while (0)
        !           177: 
        !           178: #define __DBDMAstopTransfer() __DBDMAreset()
        !           179: 
        !           180: #if USE_CURIO_METHODS
        !           181: #define DBDMAreset()       [self dbdmaReset]
        !           182: #define DBDMAstartTransfer()   [self dbdmaStartTransfer]
        !           183: #define DBDMAstopTransfer() [self dbdmaStopTransfer]
        !           184: #define DBDMAspinUntilIdle()   [self dbdmaSpinUntilIdle]
        !           185: #else
        !           186: #define DBDMAreset()       __DBDMAreset()
        !           187: #define DBDMAstartTransfer()   __DBDMAstartTransfer()
        !           188: #define DBDMAstopTransfer() __DBDMAstopTransfer()
        !           189: #define DBDMAspinUntilIdle()   __DBDMAspinUntilIdle()
        !           190: #endif /* USE_CURIO_METHODS */
        !           191: 
        !           192: @interface Apple96_SCSI(Curio_DBDMA)
        !           193: 
        !           194: /**
        !           195:  * Quit: stop the DBDMA controller and free all memory.
        !           196:  * This is always a method.
        !           197:  */
        !           198: - (void) dbdmaTerminate;
        !           199: 
        !           200: #if USE_CURIO_METHODS
        !           201: /**
        !           202:  * Stop the DBDMA controller
        !           203:  */
        !           204: - (void) dbdmaReset;
        !           205: 
        !           206: /**
        !           207:  * Start a DMA operation.
        !           208:  */
        !           209: - (void) dbdmaStartTransfer;
        !           210: 
        !           211: /**
        !           212:  * Stop a DMA operation.
        !           213:  */
        !           214: - (void) dbdmaStopTransfer;
        !           215: 
        !           216: /**
        !           217:  * Spin-wait until the DBDMA channel is inactive. This should be
        !           218:  * timed to prevent deadlock.
        !           219:  */
        !           220: - (void) dbdmaSpinUntilIdle;
        !           221: 
        !           222: #endif /* USE_CURIO_METHODS */
        !           223: @end
        !           224: 

unix.superglobalmegacorp.com

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