Annotation of XNU/iokit/Drivers/ata/drvAppleATA/AppleATAUltra646.cpp, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: /*
        !            23:  *
        !            24:  *    AppleATAUltra646.cpp
        !            25:  *
        !            26:  */
        !            27: #include "AppleATAUltra646.h"
        !            28: 
        !            29: #include <IOKit/IODeviceTreeSupport.h>
        !            30: 
        !            31: #undef super
        !            32: #define super AppleATA
        !            33: 
        !            34: extern pmap_t  kernel_pmap;
        !            35: 
        !            36: OSDefineMetaClassAndStructors( AppleATAUltra646, AppleATA )
        !            37: 
        !            38: 
        !            39: static struct
        !            40: {
        !            41:     UInt32     minDataAccess;
        !            42:     UInt32     minDataCycle;
        !            43: } pioModes[] =
        !            44: {
        !            45:     { 165,    600 },   /* Mode 0 */
        !            46:     { 125,    383 },   /*      1 */ 
        !            47:     { 100,    240 },   /*      2 */
        !            48:     {  80,    180 },   /*      3 */
        !            49:     {  70,    120 }    /*      4 */
        !            50: };
        !            51: 
        !            52: 
        !            53: /*
        !            54:  *
        !            55:  *
        !            56:  */
        !            57: bool AppleATAUltra646::configure( IOService *forProvider, UInt32 *controllerDataSize )
        !            58: {
        !            59:     *controllerDataSize = 0;
        !            60: 
        !            61:     provider = (IOPCIDevice *)forProvider;
        !            62: 
        !            63:     busNum = 0;
        !            64: 
        !            65:     ioMapATA[0] = provider->mapDeviceMemoryWithRegister( 0x10 + busNum * 8 + 0 );
        !            66:     if ( ioMapATA[0] == NULL ) return false;
        !            67:     ioBaseATA[0] = (volatile UInt32 *)ioMapATA[0]->getVirtualAddress();
        !            68: 
        !            69:     ioMapATA[1] = provider->mapDeviceMemoryWithRegister( 0x10 + busNum * 8 + 4 );
        !            70:     if ( ioMapATA[1] == NULL ) return false;
        !            71:     ioBaseATA[1] = (volatile UInt32 *)ioMapATA[1]->getVirtualAddress();
        !            72: 
        !            73:     pciWriteLong( 0x04, 0x05 );
        !            74: 
        !            75:     dmaDescriptors = (Ultra646Descriptor *)kalloc(page_size);
        !            76:     if ( dmaDescriptors == 0 )
        !            77:     {
        !            78:         return false;
        !            79:     }
        !            80:     
        !            81:     dmaDescriptorsPhys = (UInt32) pmap_extract(kernel_pmap, (vm_offset_t) dmaDescriptors);
        !            82: 
        !            83:     if ( (UInt32)dmaDescriptors & (page_size - 1) )
        !            84:     {
        !            85:         IOLog("AppleATAUltra646::%s() - DMA Descriptor memory not page aligned!!", __FUNCTION__);
        !            86:         return false;
        !            87:     }
        !            88:   
        !            89:     bzero( dmaDescriptors, page_size );
        !            90: 
        !            91:     numDescriptors = page_size/sizeof(Ultra646Descriptor);
        !            92: 
        !            93:     dmaMemoryCursor = IOBigMemoryCursor::withSpecification( 64*1024-2, 0xffffffff );
        !            94:     if ( dmaMemoryCursor == NULL )
        !            95:     {
        !            96:         return false;
        !            97:     }
        !            98: 
        !            99:     bitBucketAddr = IOMalloc(32);
        !           100:     if ( bitBucketAddr == 0 )
        !           101:     {
        !           102:         return false;
        !           103:     }
        !           104:     bitBucketAddrPhys = (UInt32) pmap_extract(kernel_pmap, (vm_offset_t) (((UInt32)bitBucketAddr + 0xf) & ~0x0f));
        !           105: 
        !           106: 
        !           107:     // assumes the first child determines the path OF uses to reference the controller
        !           108:     pathProvider = OSDynamicCast(IOService, provider->getChildEntry(gIODTPlane));
        !           109: 
        !           110:     return true;
        !           111: }
        !           112: 
        !           113: 
        !           114: /*
        !           115:  *
        !           116:  *
        !           117:  */
        !           118: bool AppleATAUltra646::createWorkLoop( IOWorkLoop **workLoop )
        !           119: {
        !           120:     if ( super::createWorkLoop( workLoop ) != true )
        !           121:     {
        !           122:         return false;
        !           123:     }
        !           124:     
        !           125:     interruptEventSource = IOInterruptEventSource::interruptEventSource( (OSObject *)             this,
        !           126:                                                                          (IOInterruptEventAction) &AppleATAUltra646::interruptOccurred,
        !           127:                                                                         (IOService *)            provider,
        !           128:                                                                         (int)                    0 );
        !           129: 
        !           130:     if ( interruptEventSource == NULL )
        !           131:     {
        !           132:         return false;
        !           133:     }
        !           134: 
        !           135:     disableControllerInterrupts();
        !           136: 
        !           137:     (*workLoop)->addEventSource( interruptEventSource ); 
        !           138: 
        !           139:     timerEventSource = IOTimerEventSource::timerEventSource( this, (IOTimerEventSource::Action) &AppleATAUltra646::ataTimer );
        !           140:     if ( timerEventSource == NULL )
        !           141:     {
        !           142:         return false;
        !           143:     }
        !           144:     (*workLoop)->addEventSource( timerEventSource ); 
        !           145:  
        !           146:     ataTimer( timerEventSource ); 
        !           147: 
        !           148:     return true;
        !           149: }
        !           150: 
        !           151: 
        !           152: /*
        !           153:  *
        !           154:  *
        !           155:  */
        !           156: bool AppleATAUltra646::provideProtocols( ATAProtocol *protocolsSupported )
        !           157: {
        !           158:     return false;
        !           159: }
        !           160: 
        !           161: 
        !           162: /*
        !           163:  *
        !           164:  *
        !           165:  */
        !           166: bool AppleATAUltra646::provideTimings( UInt32 *numTimings, ATATiming *timingsSupported )
        !           167: {
        !           168:     return false;
        !           169: }
        !           170: 
        !           171: 
        !           172: /*
        !           173:  *
        !           174:  *
        !           175:  */
        !           176: bool AppleATAUltra646::calculateTiming( UInt32 unit, ATATiming *pTiming )
        !           177: {
        !           178:     bool               rc = false;
        !           179: 
        !           180:     ideTimingRegs[unit].arttimReg  = 0x40;
        !           181:     ideTimingRegs[unit].cmdtimReg  = 0xA9;
        !           182: 
        !           183:     switch ( pTiming->timingProtocol )
        !           184:     {
        !           185:         case ataTimingPIO:
        !           186:             rc = calculatePIOTiming( unit, pTiming );
        !           187:             break;
        !           188: 
        !           189:         case ataTimingDMA:
        !           190:             rc = calculateDMATiming( unit, pTiming );
        !           191:             break;
        !           192:  
        !           193:         case ataTimingUltraDMA33:
        !           194:             rc = calculateUltraDMATiming( unit, pTiming );
        !           195:             break;
        !           196: 
        !           197: 
        !           198:         default:
        !           199:             ;
        !           200:     }
        !           201: 
        !           202:     return rc;
        !           203: }
        !           204: 
        !           205: /*
        !           206:  *
        !           207:  *
        !           208:  */
        !           209: bool AppleATAUltra646::calculatePIOTiming( UInt32 unit, ATATiming *pTiming )
        !           210: {
        !           211:     UInt32             accessTime;
        !           212:     UInt32             drwActClks, drwRecClks;
        !           213:     UInt32             drwActTime, drwRecTime;
        !           214:    
        !           215:     accessTime = pioModes[pTiming->mode].minDataAccess;
        !           216: 
        !           217:     drwActClks    =  accessTime / IDE_SYSCLK_NS;
        !           218:     drwActClks   += (accessTime % IDE_SYSCLK_NS) ? 1 : 0;
        !           219:     drwActTime    = drwActClks * IDE_SYSCLK_NS;
        !           220: 
        !           221:     drwRecTime    = pioModes[pTiming->mode].minDataCycle - drwActTime;
        !           222:     drwRecClks    = drwRecTime / IDE_SYSCLK_NS;
        !           223:     drwRecClks   += (drwRecTime % IDE_SYSCLK_NS) ? 1 : 0;
        !           224: 
        !           225:     if ( drwRecClks >= 16 ) 
        !           226:         drwRecClks = 1;
        !           227:     else if ( drwRecClks <= 1 )
        !           228:         drwRecClks = 16;
        !           229: 
        !           230:     ideTimingRegs[unit].drwtimRegPIO = ((drwActClks & 0x0f) << 4) | ((drwRecClks-1)  & 0x0f);
        !           231:  
        !           232:     return true;
        !           233: }
        !           234: 
        !           235: 
        !           236: /*
        !           237:  *
        !           238:  *
        !           239:  */
        !           240: bool  AppleATAUltra646::calculateDMATiming( UInt32 unit, ATATiming *pTiming )
        !           241: {   
        !           242:     UInt32             accessTime;
        !           243:     UInt32             drwActClks, drwRecClks;
        !           244:     UInt32             drwActTime, drwRecTime;
        !           245: 
        !           246:     ideTimingRegs[unit].udidetcrReg = 0;      
        !           247: 
        !           248:     accessTime    = pTiming->minDataAccess;
        !           249: 
        !           250:     drwActClks    =  accessTime / IDE_SYSCLK_NS;
        !           251:     drwActClks   += (accessTime % IDE_SYSCLK_NS) ? 1 : 0;
        !           252:     drwActTime    = drwActClks * IDE_SYSCLK_NS;
        !           253: 
        !           254:     drwRecTime    = pTiming->minDataCycle - drwActTime;
        !           255:     drwRecClks    = drwRecTime / IDE_SYSCLK_NS;
        !           256:     drwRecClks   += (drwRecTime % IDE_SYSCLK_NS) ? 1 : 0;
        !           257: 
        !           258:     if ( drwRecClks >= 16 ) 
        !           259:         drwRecClks = 1;
        !           260:     else if ( drwRecClks <= 1 )
        !           261:         drwRecClks = 16;
        !           262: 
        !           263:     ideTimingRegs[unit].drwtimRegDMA = ((drwActClks & 0x0f) << 4) | ((drwRecClks-1)  & 0x0f);    
        !           264: 
        !           265:     return true;    
        !           266: }
        !           267: 
        !           268: /*
        !           269:  *
        !           270:  *
        !           271:  */
        !           272: bool  AppleATAUltra646::calculateUltraDMATiming( UInt32 unit, ATATiming *pTiming )
        !           273: {
        !           274:     UInt32             cycleClks;
        !           275:     UInt32             cycleTime;
        !           276: 
        !           277:     cycleTime = pTiming->minDataCycle;
        !           278:         
        !           279:     cycleClks  = cycleTime / IDE_SYSCLK_NS;
        !           280:     cycleClks += (cycleTime % IDE_SYSCLK_NS) ? 1 : 0;
        !           281: 
        !           282:     ideTimingRegs[unit].udidetcrReg = (0x01 << unit) | ((cycleClks-1) << ((!unit) ? 4 : 6)) ;
        !           283:    
        !           284:     return true;  
        !           285: }
        !           286: 
        !           287: /*
        !           288:  *
        !           289:  *
        !           290:  */
        !           291: void AppleATAUltra646::newDeviceSelected( IOATADevice *newDevice )
        !           292: {    
        !           293: }
        !           294: 
        !           295: 
        !           296: /*
        !           297:  *
        !           298:  *
        !           299:  */
        !           300: bool AppleATAUltra646::selectTiming( UInt32 unit, ATATimingProtocol timingProtocol )
        !           301: {
        !           302:     Ultra646Regs               *cfgRegs;
        !           303:     UInt32                     cfgByte;
        !           304: 
        !           305:     cfgRegs = &ideTimingRegs[unit];
        !           306: 
        !           307:     if ( busNum == 0 )
        !           308:     {
        !           309:         pciWriteByte( Ultra646CMDTIM, cfgRegs->cmdtimReg );             
        !           310: 
        !           311:         if ( unit == 0 )
        !           312:         { 
        !           313:             pciWriteByte( Ultra646ARTTIM0, cfgRegs->arttimReg );
        !           314: 
        !           315:             if ( timingProtocol == ataTimingPIO )
        !           316:             {
        !           317:                 cfgByte = pciReadByte( Ultra646CNTRL );
        !           318:                 cfgByte &= ~Ultra646CNTRL_Drive0ReadAhead;
        !           319:                 cfgByte |= cfgRegs->cntrlReg;
        !           320:                 pciWriteByte( Ultra646CNTRL, cfgByte );
        !           321: 
        !           322:                 pciWriteByte( Ultra646DRWTIM0, cfgRegs->drwtimRegPIO );             
        !           323:             }
        !           324:             else if ( timingProtocol == ataTimingDMA )
        !           325:             {
        !           326:                 pciWriteByte( Ultra646DRWTIM0, cfgRegs->drwtimRegDMA );             
        !           327:             }
        !           328:             else if ( timingProtocol == ataTimingUltraDMA33 )
        !           329:             {
        !           330:                 cfgByte = pciReadByte( Ultra646UDIDETCR0 );
        !           331:                 cfgByte &= ~(Ultra646UDIDETCR0_Drive0UDMACycleTime | Ultra646UDIDETCR0_Drive0UDMAEnable);
        !           332:                 cfgByte |= cfgRegs->udidetcrReg;
        !           333:                 pciWriteByte( Ultra646UDIDETCR0, cfgByte );
        !           334:             }
        !           335:         }        
        !           336:         else
        !           337:         {
        !           338:             pciWriteByte( Ultra646ARTTIM1, cfgRegs->arttimReg );
        !           339: 
        !           340:             if ( timingProtocol == ataTimingPIO )
        !           341:             {
        !           342:                 cfgByte = pciReadByte( Ultra646CNTRL );
        !           343:                 cfgByte &= ~Ultra646CNTRL_Drive1ReadAhead;
        !           344:                 cfgByte |= cfgRegs->cntrlReg;
        !           345:                 pciWriteByte( Ultra646CNTRL, cfgByte );
        !           346: 
        !           347:                 pciWriteByte( Ultra646DRWTIM1, cfgRegs->drwtimRegPIO );
        !           348:             }
        !           349:             else if ( timingProtocol == ataTimingDMA )
        !           350:             {
        !           351:                 pciWriteByte( Ultra646DRWTIM1, cfgRegs->drwtimRegDMA );
        !           352:             }
        !           353:             else if ( timingProtocol == ataTimingUltraDMA33 )
        !           354:             {
        !           355:                 cfgByte = pciReadByte( Ultra646UDIDETCR0 );
        !           356:                 cfgByte &= ~(Ultra646UDIDETCR0_Drive1UDMACycleTime | Ultra646UDIDETCR0_Drive1UDMAEnable);
        !           357:                 cfgByte |= cfgRegs->udidetcrReg;
        !           358:                 pciWriteByte(  Ultra646UDIDETCR0, cfgByte );
        !           359:             }
        !           360:        }
        !           361:     }
        !           362:     else
        !           363:     {
        !           364:         pciWriteByte( Ultra646CMDTIM, cfgRegs->cmdtimReg );
        !           365: 
        !           366:         if ( unit == 0 )
        !           367:         {
        !           368:             cfgByte = pciReadByte( Ultra646ARTTIM23 ); 
        !           369:             cfgByte &= ~(Ultra646ARTTIM23_Drive2ReadAhead | Ultra646ARTTIM23_AddrSetup);
        !           370:             cfgByte |= (cfgRegs->cntrlReg >> 4) | cfgRegs->arttimReg;
        !           371:             pciWriteByte( Ultra646ARTTIM23, cfgByte );
        !           372: 
        !           373:             if ( timingProtocol == ataTimingPIO )
        !           374:             {
        !           375:                 pciWriteByte( Ultra646DRWTIM2, cfgRegs->drwtimRegPIO );
        !           376:             }
        !           377:             else if ( timingProtocol == ataTimingDMA )
        !           378:             {
        !           379:                 pciWriteByte( Ultra646DRWTIM1, cfgRegs->drwtimRegDMA );
        !           380:             }
        !           381:             else if ( timingProtocol == ataTimingUltraDMA33 )
        !           382:             {
        !           383:                 cfgByte = pciReadByte( Ultra646UDIDETCR1 );    
        !           384:                 cfgByte &= ~(Ultra646UDIDETCR1_Drive2UDMACycleTime | Ultra646UDIDETCR1_Drive2UDMAEnable);
        !           385:                 cfgByte |= cfgRegs->udidetcrReg;
        !           386:                 pciWriteByte(  Ultra646UDIDETCR1, cfgByte );
        !           387:             }
        !           388:         }        
        !           389:         else
        !           390:         {
        !           391:             cfgByte = pciReadByte( Ultra646ARTTIM23 );
        !           392:             cfgByte &= ~(Ultra646ARTTIM23_Drive3ReadAhead | Ultra646ARTTIM23_AddrSetup);
        !           393:             cfgByte |= (cfgRegs->cntrlReg >> 4) | cfgRegs->arttimReg;
        !           394:             pciWriteByte( Ultra646ARTTIM23, cfgByte ); 
        !           395: 
        !           396:             if ( timingProtocol == ataTimingPIO )
        !           397:             {
        !           398:                 pciWriteByte( Ultra646DRWTIM3, cfgRegs->drwtimRegPIO );
        !           399:             }
        !           400:             else if ( timingProtocol == ataTimingDMA )
        !           401:             {
        !           402:                 pciWriteByte( Ultra646DRWTIM3, cfgRegs->drwtimRegDMA );
        !           403:             }
        !           404:             else if ( timingProtocol == ataTimingUltraDMA33 )
        !           405:             {
        !           406:                 cfgByte = pciReadByte( Ultra646UDIDETCR1 );
        !           407:                 cfgByte &= ~(Ultra646UDIDETCR1_Drive3UDMACycleTime | Ultra646UDIDETCR1_Drive3UDMAEnable);
        !           408:                 cfgByte |= cfgRegs->udidetcrReg;
        !           409:                 pciWriteByte( Ultra646UDIDETCR1, cfgByte );
        !           410:             }
        !           411:         }
        !           412:     }
        !           413: 
        !           414:     return true;
        !           415: }
        !           416: 
        !           417: 
        !           418: /*
        !           419:  *
        !           420:  *
        !           421:  */
        !           422: void AppleATAUltra646::interruptOccurred()
        !           423: {
        !           424:     UInt32                     intReg;
        !           425:     UInt32                     cfgReg;
        !           426: 
        !           427:     super::interruptOccurred();
        !           428: 
        !           429:     intReg = (busNum == 0) ? Ultra646CFR : Ultra646ARTTIM23;
        !           430:     cfgReg = pciReadByte( intReg );
        !           431:     pciWriteByte( intReg, cfgReg );
        !           432: }
        !           433: 
        !           434: /*
        !           435:  *
        !           436:  *
        !           437:  */
        !           438: void AppleATAUltra646::ataTimer( IOTimerEventSource * /* sender */ )
        !           439: {
        !           440:     UInt32             transferCount;
        !           441: 
        !           442:     if ( xferCmdTimer != 0 )
        !           443:     {
        !           444:         if ( --xferCmdTimer == 0 )
        !           445:         {
        !           446:             IOLog("AppleATAUltra646::%s() - Timeout occurred\n\r", __FUNCTION__ );
        !           447:            
        !           448:             stopDma( xferCmd, &transferCount ); 
        !           449: 
        !           450:             resetBusRequest();
        !           451: 
        !           452:             if ( xferCmdSave != NULL )
        !           453:             {
        !           454:                 xferCmd     = xferCmdSave;
        !           455:                 xferCmdSave = NULL;
        !           456:             }
        !           457:             completeCmd( xferCmd, ataReturnErrorInterruptTimeout );
        !           458:         }
        !           459:     }
        !           460: 
        !           461:     timerEventSource->setTimeoutMS(ATATimerIntervalmS);
        !           462: }
        !           463: 
        !           464: /*
        !           465:  *
        !           466:  *
        !           467:  */
        !           468: bool AppleATAUltra646::programDma( IOATACommand *cmd )
        !           469: {
        !           470:     IOMemoryDescriptor                 *memoryDesc;
        !           471:     IOPhysicalSegment                  physSeg;
        !           472:     IOByteCount                                offset;
        !           473:     UInt32                             i;
        !           474:     UInt32                             bytesLeft;
        !           475:     UInt32                             len;
        !           476:     Ultra646Descriptor                 *dmaDesc;
        !           477:     UInt32                              startSeg, endSeg;
        !           478: 
        !           479:     cmd->getPointers( &memoryDesc, &dmaReqLength, &dmaIsWrite );
        !           480: 
        !           481:     if ( dmaReqLength == 0 )
        !           482:     {
        !           483:         return true;
        !           484:     }
        !           485: 
        !           486:     offset = 0;
        !           487: 
        !           488:     dmaDesc = dmaDescriptors;
        !           489: 
        !           490:     bytesLeft = dmaReqLength;
        !           491: 
        !           492:     for (i = 0; i < numDescriptors-1; i++, dmaDesc++ )
        !           493:     {
        !           494:         if ( dmaMemoryCursor->getPhysicalSegments( memoryDesc, offset, &physSeg, 1 ) != 1 )
        !           495:         {
        !           496:             break;
        !           497:         }
        !           498:         
        !           499:         startSeg = (physSeg.location & ~0xffff);
        !           500:         endSeg   = (physSeg.location + physSeg.length - 1) & ~0xffff;
        !           501: 
        !           502:         OSWriteSwapInt32( &dmaDesc->start, 0, physSeg.location);
        !           503: 
        !           504:         if ( startSeg == endSeg )
        !           505:         {
        !           506:             OSWriteSwapInt32( &dmaDesc->length, 0, physSeg.length );
        !           507:         }
        !           508:         else
        !           509:         {
        !           510:             len = (-physSeg.location & 0xffff);
        !           511:             OSWriteSwapInt32( &dmaDesc->length, 0, len );
        !           512:             dmaDesc++;
        !           513:             i++;
        !           514:             OSWriteSwapInt32( &dmaDesc->start,  0, physSeg.location + len );
        !           515:             OSWriteSwapInt32( &dmaDesc->length, 0, physSeg.length   - len ); 
        !           516:         }
        !           517: 
        !           518:         bytesLeft -= physSeg.length;
        !           519:         offset += physSeg.length;
        !           520:     }
        !           521: 
        !           522:     if ( bytesLeft != 0 )
        !           523:     {
        !           524:         return false;
        !           525:     }
        !           526: 
        !           527:     /*
        !           528:      * Note: ATAPI always transfers even byte-counts. Send the extra byte to/from the bit-bucket
        !           529:      *       if the requested transfer length is odd.
        !           530:      */
        !           531:     if ( dmaReqLength & 1 )
        !           532:     {
        !           533:         if ( i == numDescriptors ) return false;
        !           534: 
        !           535:         dmaDesc++;
        !           536:         OSWriteSwapInt32( &dmaDesc->start,  0, bitBucketAddrPhys );
        !           537:         OSWriteSwapInt32( &dmaDesc->length, 0, 1 );
        !           538:     }
        !           539: 
        !           540: 
        !           541:     dmaDesc--;
        !           542:     dmaDesc->length |= 0x80;
        !           543: 
        !           544:     pciWriteLong( ((busNum == 0) ? 0x74 : 0x7C), dmaDescriptorsPhys );
        !           545: 
        !           546:     return true;
        !           547: }                      
        !           548: 
        !           549:  
        !           550: /*
        !           551:  *
        !           552:  *
        !           553:  */
        !           554: bool AppleATAUltra646::startDma( IOATACommand * )
        !           555: {
        !           556:     UInt32               reg;
        !           557:     UInt32                cfgReg;
        !           558: 
        !           559:     if ( dmaReqLength != 0 )
        !           560:     {
        !           561:         reg = (busNum == 0) ? 0x70 : 0x78;
        !           562:         cfgReg = pciReadLong( reg );
        !           563:         cfgReg &= ~0x08;
        !           564:         cfgReg |= 0x01 | ((dmaIsWrite == false) ? 0x08 : 0x00);
        !           565:         pciWriteLong( reg, cfgReg );
        !           566:     }
        !           567:     return true;
        !           568: }
        !           569: 
        !           570: 
        !           571: /*
        !           572:  *
        !           573:  *
        !           574:  */
        !           575: bool AppleATAUltra646::stopDma( IOATACommand *, UInt32 *transferCount )
        !           576: {
        !           577:     UInt32                     reg;
        !           578:     UInt32                      cfgReg;
        !           579: 
        !           580:     *transferCount = 0;
        !           581: 
        !           582:     if ( dmaReqLength == 0 )
        !           583:     {
        !           584:         return true;
        !           585:     }
        !           586: 
        !           587:     reg = (busNum == 0) ? 0x70 : 0x78;
        !           588:     cfgReg = pciReadLong( reg );
        !           589:     cfgReg &= ~0x01;
        !           590:     pciWriteLong( reg, cfgReg );
        !           591: 
        !           592:     *transferCount = dmaReqLength;
        !           593: 
        !           594:     return true;
        !           595: }
        !           596:  
        !           597: 
        !           598: /*
        !           599:  *
        !           600:  *
        !           601:  */
        !           602: void AppleATAUltra646::disableControllerInterrupts()
        !           603: {
        !           604:     interruptEventSource->disable();
        !           605: }
        !           606: 
        !           607: /*
        !           608:  *
        !           609:  *
        !           610:  */
        !           611: void AppleATAUltra646::enableControllerInterrupts()
        !           612: {
        !           613:     interruptEventSource->enable();
        !           614: }
        !           615: 
        !           616: /*
        !           617:  *
        !           618:  *
        !           619:  */
        !           620: void AppleATAUltra646::free()
        !           621: {
        !           622:     UInt32             i;
        !           623: 
        !           624:     if ( interruptEventSource != 0 )
        !           625:     {
        !           626:         interruptEventSource->disable();
        !           627:         interruptEventSource->release();
        !           628:     }
        !           629:   
        !           630:     if ( timerEventSource != 0 )
        !           631:     {
        !           632:         timerEventSource->release();
        !           633:     }
        !           634: 
        !           635:     for (i = 0; i < 2; i++ )
        !           636:     {
        !           637:         if ( ioMapATA[i] != 0 ) ioMapATA[i]->release();
        !           638:     }
        !           639:  
        !           640:     if ( dmaDescriptors != 0 )
        !           641:     {
        !           642:         kfree( (void *)dmaDescriptors, page_size );
        !           643:     } 
        !           644: }
        !           645: 
        !           646: /*
        !           647:  *
        !           648:  *
        !           649:  */
        !           650: void AppleATAUltra646::writeATAReg( UInt32 regIndex, UInt32 regValue )
        !           651: {
        !           652:     if ( regIndex == 0 )
        !           653:     {
        !           654:         *(volatile UInt16 *)ioBaseATA[0] = regValue;
        !           655:     }
        !           656:     else if ( regIndex < ataRegDeviceControl )
        !           657:     {
        !           658:         *((volatile UInt8 *)ioBaseATA[0] + regIndex) = regValue;
        !           659:     }     
        !           660:     else
        !           661:     {
        !           662:         *((volatile UInt8 *)ioBaseATA[1] + regIndex - ataRegDeviceControl + 2) = regValue;
        !           663:     }
        !           664:     eieio();
        !           665: }
        !           666: 
        !           667: UInt32 AppleATAUltra646::readATAReg( UInt32 regIndex )
        !           668: {
        !           669:     if ( regIndex == 0 )
        !           670:     { 
        !           671:         return *(volatile UInt16 *)ioBaseATA[0];
        !           672:     }
        !           673:     else if ( regIndex < ataRegDeviceControl )
        !           674:     {
        !           675:         return *((volatile UInt8 *)ioBaseATA[0] + regIndex);
        !           676:     }
        !           677: 
        !           678:     return *((volatile UInt8 *)ioBaseATA[1] + regIndex - ataRegDeviceControl + 2);
        !           679: }
        !           680: 
        !           681: /*
        !           682:  *
        !           683:  *
        !           684:  */
        !           685: UInt32 AppleATAUltra646::pciReadByte( UInt32 reg )
        !           686: {
        !           687:     volatile union
        !           688:     {
        !           689:         unsigned long  word;
        !           690:         unsigned char   byte[4];
        !           691:     } data;
        !           692: 
        !           693:     data.word = provider->configRead32( reg );
        !           694:     return data.byte[3 - (reg & 0x03)];
        !           695: }
        !           696: 
        !           697: void AppleATAUltra646::pciWriteByte( UInt32 reg, UInt32 value )
        !           698: {
        !           699:     volatile union
        !           700:     {
        !           701:         unsigned long  word;
        !           702:         unsigned char   byte[4];
        !           703:     } data;
        !           704: 
        !           705:     UInt32             regWord;
        !           706:  
        !           707:     regWord = reg & ~0x03;
        !           708: 
        !           709:     data.word = provider->configRead32( regWord );
        !           710:     data.word = OSReadSwapInt32( &data.word, 0 );
        !           711: 
        !           712:     switch (regWord)
        !           713:     {
        !           714:         case Ultra646CFR:
        !           715:             data.byte[Ultra646CFR & 0x03] &= ~Ultra646CFR_IDEIntPRI;
        !           716:             break;
        !           717:         case Ultra646DRWTIM0:
        !           718:             data.byte[Ultra646ARTTIM23 & 0x03] &= ~Ultra646ARTTIM23_IDEIntSDY;
        !           719:             break;
        !           720:         case Ultra646BMIDECR0:
        !           721:             data.byte[Ultra646MRDMODE & 0x03 ] &= ~(Ultra646MRDMODE_IDEIntPRI  | Ultra646MRDMODE_IDEIntSDY);
        !           722:             data.byte[Ultra646BMIDESR0 & 0x03] &= ~(Ultra646BMIDESR0_DMAIntPRI | Ultra646BMIDESR0_DMAErrorPRI);
        !           723:             break;
        !           724:         case Ultra646BMIDECR1:
        !           725:             data.byte[Ultra646BMIDESR1 & 0x03] &= ~(Ultra646BMIDESR1_DMAIntSDY | Ultra646BMIDESR1_DMAErrorSDY);
        !           726:             break;
        !           727:     }        
        !           728:     data.byte[reg & 0x03] = value;
        !           729: 
        !           730:     data.word = OSReadSwapInt32(&data.word, 0); 
        !           731: 
        !           732:     provider->configWrite32( regWord, data.word );
        !           733: }
        !           734: 
        !           735: UInt32 AppleATAUltra646::pciReadLong( UInt32 reg )
        !           736: {
        !           737:     return provider->configRead32( reg );
        !           738: }
        !           739: 
        !           740: void AppleATAUltra646::pciWriteLong( UInt32 reg, UInt32 value )
        !           741: {
        !           742:     provider->configWrite32( reg, value );
        !           743: }
        !           744: 
        !           745: /* These overrides take care of OpenFirmware referring to the controller
        !           746:  * as a child of the PCI device, "ata-4" */
        !           747: 
        !           748: bool AppleATAUltra646::getPath(        char * path, int * length,
        !           749:                                const IORegistryPlane * plane ) const
        !           750: {
        !           751:     if (pathProvider && (plane == gIODTPlane))
        !           752:         return pathProvider->getPath(path, length, plane);
        !           753:     else
        !           754:        return super::getPath(path, length, plane);
        !           755: }
        !           756: 
        !           757: IOService * AppleATAUltra646::matchLocation( IOService * client )
        !           758: {
        !           759:     if (pathProvider)
        !           760:        return pathProvider;
        !           761:     else
        !           762:        return super::matchLocation(client);
        !           763: }

unix.superglobalmegacorp.com

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