Annotation of coherent/d/PS2_KERNEL/i286/dmac.c, revision 1.1

1.1     ! root        1: /* $Header: /kernel/kersrc/i286/RCS/dmac.c,v 1.1 92/07/17 15:21:25 bin Exp Locker: bin $ */
        !             2: /* (lgl-
        !             3:  *     The information contained herein is a trade secret of Mark Williams
        !             4:  *     Company, and  is confidential information.  It is provided  under a
        !             5:  *     license agreement,  and may be  copied or disclosed  only under the
        !             6:  *     terms of  that agreement.  Any  reproduction or disclosure  of this
        !             7:  *     material without the express written authorization of Mark Williams
        !             8:  *     Company or persuant to the license agreement is unlawful.
        !             9:  *
        !            10:  *     COHERENT Version 2.3.37
        !            11:  *     Copyright (c) 1982, 1983, 1984.
        !            12:  *     An unpublished work by Mark Williams Company, Chicago.
        !            13:  *     All rights reserved.
        !            14:  -lgl) */
        !            15: /*
        !            16:  * The routines in this file
        !            17:  * deal with the 8237 programmable
        !            18:  * DMA controller on the system board.
        !            19:  *
        !            20:  * $Log:       dmac.c,v $
        !            21:  * Revision 1.1  92/07/17  15:21:25  bin
        !            22:  * Initial revision
        !            23:  * 
        !            24:  * Revision 1.1        88/03/24  09:33:31      src
        !            25:  * Initial revision
        !            26:  * 
        !            27:  * 86/12/18    Allan Cornish           /usr/src/sys/i8086/ibm_at/dmac.c
        !            28:  * Full support for DMA channels 5..7 added.
        !            29:  */
        !            30: #include       <sys/types.h>
        !            31: #include       <sys/dmac.h>
        !            32: 
        !            33: /*
        !            34:  * This table maps channel
        !            35:  * numbers into DMA page address
        !            36:  * register ports. The wiring of the
        !            37:  * RA lines on the 74LS670 is a bit
        !            38:  * strange.
        !            39:  */
        !            40: static int     dmaport[8] = {
        !            41:        DMAPAGE+7,                      /* 0 (Free) */
        !            42:        DMAPAGE+3,                      /* 1 (Free) */
        !            43:        DMAPAGE+1,                      /* 2 (Floppy) */
        !            44:        DMAPAGE+2,                      /* 3 (Free) */
        !            45:        DMAPAGE+15,                     /* 4 (Cascade) */
        !            46:        DMAPAGE+11,                     /* 5 */
        !            47:        DMAPAGE+9,                      /* 6 */
        !            48:        DMAPAGE+10                      /* 7 */
        !            49: };
        !            50: 
        !            51: /*
        !            52:  * Program the channel of the
        !            53:  * 8237 DMA controller specified by
        !            54:  * "chan". The "paddr" is a 20 bit
        !            55:  * physical address. The "count" is
        !            56:  * the byte count. The "wflag" is
        !            57:  * true if this is a write, from the
        !            58:  * point of view of the device.
        !            59:  * True return if the mapping can be
        !            60:  * set up, given the 64K limits.
        !            61:  * The "count" is predecremented, so
        !            62:  * that backplane "+T/C" is issued at
        !            63:  * the expected point in time.
        !            64:  */
        !            65: dmaon(chan, paddr, count, wflag)
        !            66: register int   chan;
        !            67: paddr_t                paddr;
        !            68: unsigned       count;
        !            69: {
        !            70:        register int    port;
        !            71:        register int    s;
        !            72: 
        !            73:        /*
        !            74:         * Change from 0 based transfer count to -1 based.
        !            75:         */
        !            76:        count--;
        !            77: 
        !            78:        /*
        !            79:         * Select byte/word transfer.
        !            80:         * Channels 0-4 use byte transfer.
        !            81:         * Channels 5-7 use word transfers, with low 17 addr bits right shifted.
        !            82:         */
        !            83:        if ( chan >= 5 ) {
        !            84:                count >>= 1;
        !            85:                paddr >>= 1;
        !            86:                paddr  += (paddr & 0xFF0000L);
        !            87:        }
        !            88: 
        !            89:        /*
        !            90:         * Check for DMA straddle.
        !            91:         */
        !            92:        if ( dmaseg(paddr) != dmaseg(paddr+count) )
        !            93:                return (0);
        !            94: 
        !            95:        s = sphi();
        !            96: 
        !            97:        /*
        !            98:         * Select DMA controller.
        !            99:         */
        !           100:        if ( chan < 4 ) {
        !           101:                port = DMA;
        !           102: 
        !           103:                /*
        !           104:                 * Program for dma read/write operation.
        !           105:                 */
        !           106:                if ( wflag != 0 )
        !           107:                        outb( port + (SETMODE * 1), (chan & 3) | RDMEM );
        !           108:                else
        !           109:                        outb( port + (SETMODE * 1), (chan & 3) | WRMEM );
        !           110:                outb( port + (CLEARFL * 1), 0 );
        !           111:        }
        !           112:        else {
        !           113:                port = SDMA;
        !           114: 
        !           115:                /*
        !           116:                 * Program for dma read/write operation.
        !           117:                 */
        !           118:                if ( wflag != 0 )
        !           119:                        outb( SDMA + (SETMODE * 2), (chan & 3) | RDMEM );
        !           120:                else
        !           121:                        outb( SDMA + (SETMODE * 2), (chan & 3) | WRMEM );
        !           122:                outb( SDMA + (CLEARFL * 2), 0 );
        !           123:        }
        !           124: 
        !           125:        /*
        !           126:         * Select memory bank.
        !           127:         */
        !           128:        outb( dmaport[chan], (int)(paddr >> 16) );
        !           129: 
        !           130:        if ( chan < 4 )
        !           131:                port += ((chan & 3) << 1);
        !           132:        else
        !           133:                port += ((chan & 3) << 2);
        !           134: 
        !           135:        /*
        !           136:         * Program memory offset in bank.
        !           137:         */
        !           138:        outb( port, ((int) paddr) >> 0 );
        !           139:        outb( port, ((int) paddr) >> 8 );
        !           140: 
        !           141:        port++;
        !           142:        if ( chan >= 4 )
        !           143:                port++;
        !           144: 
        !           145:        /*
        !           146:         * Program transfer count.
        !           147:         */
        !           148:        outb( port, count >> 0 );
        !           149:        outb( port, count >> 8 );
        !           150: 
        !           151:        spl(s);
        !           152:        return (1);
        !           153: }
        !           154: 
        !           155: /*
        !           156:  * dmago( chan ) - initiate dma transfer
        !           157:  */
        !           158: dmago( chan )
        !           159: register int chan;
        !           160: {
        !           161:        /*
        !           162:         * Enable dma transfers.
        !           163:         */
        !           164:        if ( chan < 4 )
        !           165:                outb( DMA  + (SETMASK * 1), (chan & 3) | MASKOFF );
        !           166:        else
        !           167:                outb( SDMA + (SETMASK * 2), (chan & 3) | MASKOFF );
        !           168: }
        !           169: 
        !           170: /*
        !           171:  * dmaoff( chan ) - turn dma channel off, return residual count
        !           172:  */
        !           173: dmaoff( chan )
        !           174: register int chan;
        !           175: {
        !           176:        register int port;
        !           177:        register int count;
        !           178:        int s;
        !           179: 
        !           180:        /*
        !           181:         * Disable DMA transfers.
        !           182:         * Obtain the -1 based residual count.
        !           183:         */
        !           184:        s = sphi();
        !           185:        if ( chan < 4 ) {
        !           186:                outb(  DMA + (SETMASK * 1), (chan & 3) | MASKON );
        !           187:                port = DMA + ((chan & 3) << 1) + 1;
        !           188:        }
        !           189:        else {
        !           190:                outb(  SDMA + (SETMASK * 2), (chan & 3) | MASKON );
        !           191:                port = SDMA + ((chan & 3) << 2) + 2;
        !           192:        }
        !           193:        count  = inb(port);
        !           194:        count += inb(port) << 8;
        !           195:        spl( s );
        !           196: 
        !           197:        /*
        !           198:         * Convert residual from -1 based to 0 based.
        !           199:         */
        !           200:        count++;
        !           201: 
        !           202:        /*
        !           203:         * Convert residual from word based to byte based.
        !           204:         */
        !           205:        if ( chan >= 5 )
        !           206:                count <<= 1;
        !           207: 
        !           208:        /*
        !           209:         * Return residual count in bytes.
        !           210:         */
        !           211:        return count;
        !           212: }

unix.superglobalmegacorp.com

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