Annotation of driverkit/libDriver/eisa/IOEISADMATransferBuffer.m, revision 1.1.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:  * Copyright 1994 NeXT Computer, Inc.
                     26:  * All rights reserved.
                     27:  *
                     28:  */
                     29: 
                     30: #if NOTYET
                     31: 
                     32: #import <driverkit/i386/IOEISADMATransferBuffer.h>
                     33: #import <driverkit/IODeviceDescriptionPrivate.h>
                     34: #import <machdep/i386/dma.h>
                     35: #import <machdep/i386/dma_inline.h>
                     36: #import <machdep/i386/dma_exported.h>
                     37: 
                     38: #define MIN(a,b) ((a) < (b) ? (a) : (b))
                     39: 
                     40: @implementation IOEISADMATransferBuffer
                     41: 
                     42: 
                     43: -setChannel:(unsigned int)newChannel
                     44:  forDevice:device
                     45: {
                     46:     unsigned int *list;
                     47: 
                     48:     localChannel = newChannel;
                     49:     directDevice = device;
                     50:     deviceDescription = [device deviceDescription];
                     51:     if (deviceDescription == nil) {
                     52:        return nil;
                     53:     }
                     54:     if ((list = [deviceDescription channelList])) {
                     55:        realChannel = list[newChannel];
                     56:     } else {
                     57:        return nil;
                     58:     }
                     59:     return self;
                     60: }
                     61: 
                     62: -(IODMADirection)transferDirection
                     63: {
                     64:     return transferDirection;
                     65: }
                     66: 
                     67: -(void)setTransferDirection:(IODMADirection)dir
                     68: {
                     69:     transferDirection = dir;
                     70: }
                     71: 
                     72: -(IOReturn)startTransfer
                     73: {
                     74:     IORange range;
                     75:     
                     76:     range.start = 0;
                     77:     range.size = [self size];
                     78:     return [self startTransferAt:range];
                     79: }
                     80: 
                     81: -(IOReturn)startTransferAt:(IORange)range
                     82: {
                     83:     int Size;
                     84:     IOPhysicalRange prange;
                     85:     
                     86:     Size = [self size];
                     87:     if (range.start > Size || (range.start + range.size) > Size)
                     88:        return IO_R_INVALID;
                     89: 
                     90:     if ([self getPhysicalAddress:&prange at:range.start]
                     91:            == NO) {
                     92:        return IO_R_INVALID;
                     93:     }
                     94:     prange.size = MIN(range.size, prange.size);
                     95:     
                     96:     (void) dma_mask_chan(realChannel);
                     97:     if (transferDirection == IO_DMARead) {
                     98:        /* DMA write to memory */
                     99:        dma_chan_xfer_dir(realChannel, DMA_XFER_WRITE);
                    100:     } else {
                    101:        /* DMA read from memory */
                    102:        dma_chan_xfer_dir(realChannel, DMA_XFER_READ);
                    103:     }
                    104: 
                    105:     dma_set_chan_addr(realChannel, prange.start);
                    106: 
                    107:     dma_set_chan_count(realChannel, prange.size);
                    108: 
                    109:     currentTransfer = prange;
                    110:     
                    111:     (void) dma_unmask_chan(realChannel);
                    112: 
                    113:     return (IO_R_SUCCESS);
                    114: }
                    115: 
                    116: -(IOReturn)abortTransfer
                    117: {
                    118:     // XXX
                    119:     return (IO_R_SUCCESS);
                    120: }
                    121: 
                    122: -(BOOL)transferIsComplete
                    123: {
                    124:     return is_dma_done(realChannel);
                    125: }
                    126: 
                    127: -(unsigned)currentTransferLocation
                    128: {
                    129:     return get_dma_addr(realChannel) - currentTransfer.start;
                    130: }
                    131: 
                    132: -(unsigned)currentTransferCount
                    133: {
                    134:     return get_dma_count(realChannel);
                    135: }
                    136: 
                    137: 
                    138: -(IOReturn)enableChannel
                    139: {
                    140:     dma_unmask_chan(realChannel);
                    141:     return IO_R_SUCCESS;
                    142: }
                    143: -(void)disableChannel
                    144: {
                    145:     dma_mask_chan(realChannel);
                    146: }
                    147: 
                    148: 
                    149: /*
                    150:  * Reserve and release exclusive DMA lock. Use is optional; provides
                    151:  * exclusion between mutually incompatible DMA devices.
                    152:  */
                    153: - (void)reserveDMALock
                    154: {
                    155:     [directDevice reserveDMALock];
                    156: }
                    157: - (void)releaseDMALock
                    158: {
                    159:     [directDevice releaseDMALock];
                    160: }
                    161: 
                    162: /*
                    163:  * FIXME -- the kernel dma code should provide a way
                    164:  * to get the current transfer mode.
                    165:  */
                    166: 
                    167: static IODMATransferMode currentMode;
                    168: 
                    169: -(IODMATransferMode)transferMode
                    170: {
                    171:     return currentMode;
                    172: }
                    173: 
                    174: -(IOReturn)setTransferMode:(IODMATransferMode)mode
                    175: {
                    176:     unsigned real_mode;
                    177:     
                    178:     switch(mode) {
                    179:     case IO_Demand:
                    180:        real_mode = DMA_MODE_DEMAND;
                    181:        break;
                    182:     case IO_Single:
                    183:     default:
                    184:        real_mode = DMA_MODE_SINGLE;
                    185:        break;
                    186:     case IO_Block:
                    187:        real_mode = DMA_MODE_BLOCK;
                    188:        break;
                    189:     case IO_Cascade:
                    190:        real_mode = DMA_MODE_CASCADE;
                    191:        break;
                    192:     }
                    193:     dma_chan_xfer_mode(realChannel, real_mode);
                    194:     currentMode = mode;
                    195:     return IO_R_SUCCESS;
                    196: }
                    197: 
                    198: -(IOEISADMATransferWidth)transferWidth
                    199: {
                    200:     int width;
                    201:     IOEISADMATransferWidth ret;
                    202:     
                    203:     width = get_dma_xfer_width(realChannel);
                    204:     switch(width) {
                    205:     case DMA_XFR_8_BIT:
                    206:     default:   /* should never be reached */
                    207:        ret = IO_8Bit;
                    208:        break;
                    209:     case DMA_XFR_16_BIT_WORD:
                    210:        ret = IO_16BitWordCount;
                    211:        break;
                    212:     case DMA_XFR_16_BIT_BYTE:
                    213:        ret = IO_16BitByteCount;
                    214:        break;
                    215:     case DMA_XFR_32_BIT:
                    216:        ret = IO_32Bit;
                    217:        break;
                    218:     }
                    219:     return ret;
                    220: }
                    221: 
                    222: -(IOReturn)setTransferWidth:(IOEISADMATransferWidth)width
                    223: {
                    224:     int dmaWidth;
                    225:     
                    226:     switch(width) {
                    227:     case IO_8Bit:
                    228:        dmaWidth = DMA_XFR_8_BIT;
                    229:        break;
                    230:     case IO_16BitWordCount:
                    231:        dmaWidth = DMA_XFR_16_BIT_WORD;
                    232:        break;
                    233:     case IO_16BitByteCount:
                    234:        dmaWidth = DMA_XFR_16_BIT_BYTE;
                    235:        break;
                    236:     case IO_32Bit:
                    237:        dmaWidth = DMA_XFR_32_BIT;
                    238:        break;
                    239:     default:
                    240:        return IO_R_INVALID_ARG;
                    241:     }
                    242:     dma_xfer_width(realChannel, dmaWidth);
                    243:     return IO_R_SUCCESS;
                    244: }
                    245: 
                    246: -(IOEISADMATiming)transferTiming
                    247: {
                    248:     return 0; //XXX
                    249: }
                    250: 
                    251: -(IOReturn)setTransferTiming:(IOEISADMATiming)timing
                    252: {
                    253:     int dmaTiming;
                    254:     
                    255:     switch(timing) {
                    256:     case IO_Compatible:
                    257:        dmaTiming = DMA_TIMING_COMPAT;
                    258:        break;
                    259:     case IO_TypeA:
                    260:        dmaTiming = DMA_TIMING_A;
                    261:        break;
                    262:     case IO_TypeB:
                    263:        dmaTiming = DMA_TIMING_B;
                    264:        break;
                    265:     case IO_Burst:
                    266:        dmaTiming = DMA_TIMING_BURST;
                    267:        break;
                    268:     }
                    269:     dma_timing(realChannel, dmaTiming);
                    270:     return IO_R_SUCCESS;
                    271: }
                    272: 
                    273: -(IOEISAStopRegisterMode)stopRegisterMode
                    274: {
                    275:     return 0; //XXX
                    276: }
                    277: 
                    278: -(IOReturn)setStopRegisterMode:(IOEISAStopRegisterMode)mode
                    279: {
                    280:     unsigned dmaFlag;
                    281:     
                    282:     if(mode == IO_StopRegisterEnable) {
                    283:            dmaFlag = DMA_STOP_ENABLE;
                    284:     }
                    285:     else {
                    286:            dmaFlag = DMA_STOP_DISABLE;
                    287:     }
                    288:     dma_stop_enable(realChannel, dmaFlag);
                    289:     return IO_R_SUCCESS;
                    290: }
                    291: 
                    292: -(IOIncrementMode)transferIncrementMode
                    293: {
                    294:     return 0; //XXX
                    295: }
                    296: -(IOReturn)setTransferIncrementMode:(IOIncrementMode)mode
                    297: {
                    298:     int dir = (mode == IO_Decrement ? DMA_ADRS_DECR : DMA_ADRS_INCR);
                    299: 
                    300:     dma_chan_adrs_dir(realChannel, dir);
                    301:     return IO_R_SUCCESS;
                    302: }
                    303: 
                    304: -(BOOL)autoinitializeMode
                    305: {
                    306:     return 0; //XXX
                    307: }
                    308: 
                    309: -(IOReturn)setAutoinitializeMode:(BOOL)mode
                    310: {
                    311:     dma_chan_autoinit(realChannel, (mode ? 1 : 0));
                    312:     return IO_R_SUCCESS;
                    313: }
                    314: 
                    315: -(BOOL)isValidForDMA
                    316: {
                    317:     int offset, total;
                    318:     IOPhysicalRange prange;
                    319:     
                    320:     if (eisa_present())
                    321:        return YES;
                    322: 
                    323:     for (total = [self size], offset = 0; total > 0; ) {
                    324:        if ([self getPhysicalAddress:&prange at:offset] == NO) {
                    325:            return NO;
                    326:        }
                    327:        if (prange.start >= 16 * 1024 * 1024)   // XXX use symbolic constant
                    328:            return NO;
                    329:        total -= prange.size;
                    330:        offset += prange.size;
                    331:     }
                    332:     return YES;
                    333: }
                    334: 
                    335: 
                    336: /*
                    337:  * Returns the maximum number of bytes that can be transferred in one
                    338:  * operation from the specified offset in the buffer.
                    339:  */
                    340: -(unsigned int)maximumTransferLengthAtOffset:(unsigned int)offset
                    341: {
                    342:     int len = 0;
                    343:     IOPhysicalRange prange;
                    344:     
                    345:     if ([self getPhysicalAddress:&prange at:offset] == NO)
                    346:        return 0;
                    347:     if (eisa_present())
                    348:        return prange.size;
                    349:     else
                    350:        return MIN(prange.size, 64 * 1024);
                    351: }
                    352: 
                    353: +(BOOL)allocMemoryWithSize:(int)memSize
                    354:        attributes:(IOBufferAttributes)attr
                    355:        alignment:(IOAlignment)align
                    356:        allocedAddress:(IOVirtualAddress *)allocPtr
                    357:        dataAddress:(IOVirtualAddress *)dataPtr
                    358:        allocedSize:(int *)sizePtr
                    359:        newAttributes:(IOBufferAttributes *)newAttrPtr
                    360:        newMap:(IOAddressMap *)mapPtr
                    361: {
                    362:     IOVirtualAddress vaddr;
                    363:     int alignSize, newSize;
                    364:     
                    365:     alignSize = IOAlignmentToSize(align);
                    366:     newSize = memSize + 2 * alignSize;
                    367:     
                    368:     /* an optimization that relies on IOMalloc returning aligned pages. */
                    369:     if (newSize > PAGE_SIZE && memSize <= PAGE_SIZE)
                    370:        newSize = PAGE_SIZE;
                    371:     
                    372:     if (eisa_present())
                    373:        vaddr = (IOVirtualAddress)IOMalloc(newSize);
                    374:     else
                    375:        vaddr = (IOVirtualAddress)IOMallocLow(newSize);
                    376:     if (vaddr == 0)
                    377:        return FALSE;
                    378: 
                    379:     *allocPtr = vaddr;
                    380:     if (newSize != memSize)
                    381:        *dataPtr = (vaddr + alignSize - 1) & ~(alignSize - 1);
                    382:     else
                    383:        *dataPtr = vaddr;
                    384:     *sizePtr = newSize;
                    385:     *newAttrPtr = IOBuf_Wired | IOBuf_WiredStatic | IOBuf_Contiguous;
                    386:     *mapPtr = (IOAddressMap)IOVmTaskSelf();
                    387:     return TRUE;
                    388: }
                    389: 
                    390: 
                    391: +(BOOL)freeMemory:(IOVirtualAddress)addr
                    392:        size:(int)memsize
                    393:        map:(IOAddressMap)memmap
                    394:        attributes:(IOBufferAttributes)attr
                    395: {
                    396:     if (eisa_present())
                    397:        IOFree((void *)addr, memsize);
                    398:     else
                    399:        IOFreeLow((void *)addr, memsize);
                    400:     return TRUE;
                    401: }
                    402: 
                    403: @end
                    404: 
                    405: #endif NOTYET
                    406: 

unix.superglobalmegacorp.com

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