Annotation of XNU/iokit/Drivers/pci/drvApplePCI/AppleMacRiscPCI.cpp, revision 1.1.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:  * Copyright (c) 1998 Apple Computer, Inc.  All rights reserved. 
                     24:  *
                     25:  * HISTORY
                     26:  * 23 Nov 98 sdouglas created from objc version.
                     27:  * 05 Nov 99 sdouglas added UniNorth AGP based on UniNorthAGPDriver.c
 *                                       by Fernando Urbina, Kent Miller.
                     28:  *
                     29:  */
                     30:  
                     31: #include <IOKit/system.h>
                     32: #include <ppc/proc_reg.h>
                     33: 
                     34: #include <libkern/c++/OSContainers.h>
                     35: #include <libkern/OSByteOrder.h>
                     36: 
                     37: #include <IOKit/IODeviceMemory.h>
                     38: #include <IOKit/IORangeAllocator.h>
                     39: #include <IOKit/IODeviceTreeSupport.h>
                     40: #include <IOKit/IOPlatformExpert.h>
                     41: #include <IOKit/IOLib.h>
                     42: #include <IOKit/assert.h>
                     43: 
                     44: #include "AppleMacRiscPCI.h"
                     45: 
                     46: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     47: 
                     48: #define super IOPCIBridge
                     49: 
                     50: OSDefineMetaClassAndStructors(AppleMacRiscPCI, IOPCIBridge)
                     51: 
                     52: OSDefineMetaClassAndStructors(AppleMacRiscVCI, AppleMacRiscPCI)
                     53: 
                     54: OSDefineMetaClassAndStructors(AppleMacRiscAGP, AppleMacRiscPCI)
                     55: 
                     56: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     57: 
                     58: bool AppleMacRiscPCI::start( IOService * provider )
                     59: {
                     60:     IOPCIPhysicalAddress       ioAddrCell;
                     61:     IOPhysicalAddress          ioPhys;
                     62:     IOPhysicalAddress          ioPhysLen;
                     63:     OSArray *                  array;
                     64:     IODeviceMemory::InitElement        rangeList[ 3 ];
                     65:     IORegistryEntry *          bridge;
                     66:     OSData *                   busProp;
                     67:     
                     68:     if( !IODTMatchNubWithKeys(provider, "('pci', 'vci')"))
                     69:        return( false);
                     70: 
                     71:     if( IODTMatchNubWithKeys(provider, "'uni-north'"))
                     72:        configDataOffsetMask = 0x7;
                     73:     else
                     74:        configDataOffsetMask = 0x3;      
                     75: 
                     76:     if( 0 == (lock = IOSimpleLockAlloc()))
                     77:        return( false );
                     78:     
                     79:     ioAddrCell.physHi.bits     = 0;
                     80:     ioAddrCell.physHi.s.space  = kIOPCIIOSpace;
                     81:     ioAddrCell.physMid                 = 0;
                     82:     ioAddrCell.physLo          = 0;
                     83:     ioAddrCell.lengthHi        = 0;
                     84:     ioAddrCell.lengthLo        = 0x10000;
                     85: 
                     86:     bridge = provider;
                     87: 
                     88:     if( ! IODTResolveAddressCell( bridge, (UInt32 *) &ioAddrCell,
                     89:                &ioPhys, &ioPhysLen) ) {
                     90: 
                     91:        IOLog("%s: couldn't find my base\n", getName());
                     92:        return( false);
                     93:     }
                     94: 
                     95:     /* define more explicit ranges */
                     96: 
                     97:     rangeList[0].start = ioPhys;
                     98:     rangeList[0].length = ioPhysLen;
                     99:     rangeList[1].start = ioPhys + 0x00800000;
                    100:     rangeList[1].length = 4;
                    101:     rangeList[2].start = ioPhys + 0x00c00000;
                    102:     rangeList[2].length        = 4;
                    103: 
                    104:     IORangeAllocator * platformRanges;
                    105:     platformRanges = IOService::getPlatform()->getPhysicalRangeAllocator();
                    106:     assert( platformRanges );
                    107:     platformRanges->allocateRange( ioPhys, 0x01000000 );
                    108: 
                    109:     array = IODeviceMemory::arrayFromList( rangeList, 3 );
                    110:     if( !array)
                    111:        return( false);
                    112: 
                    113:     provider->setDeviceMemory( array );
                    114:     array->release();
                    115:     ioMemory = (IODeviceMemory *) array->getObject( 0 );
                    116: 
                    117:     /* map registers */
                    118: 
                    119:     if( (configAddrMap = provider->mapDeviceMemoryWithIndex( 1 )))
                    120:         configAddr = (volatile UInt32 *) configAddrMap->getVirtualAddress();
                    121:     if( (configDataMap = provider->mapDeviceMemoryWithIndex( 2 )))
                    122:         configData = (volatile UInt32 *) configDataMap->getVirtualAddress();
                    123: 
                    124:     if( !configAddr || !configData)
                    125:        return( false);
                    126: 
                    127:     busProp = (OSData *) bridge->getProperty("bus-range");
                    128:     if( busProp)
                    129:        primaryBus = *((UInt32 *) busProp->getBytesNoCopy());
                    130: 
                    131:     return( super::start( provider));
                    132: }
                    133: 
                    134: bool AppleMacRiscPCI::configure( IOService * provider )
                    135: {
                    136:     UInt32     addressSelects;
                    137:     UInt32     index;
                    138:     bool       ok;
                    139: 
                    140:     addressSelects = configRead32( getBridgeSpace(), kMacRISCAddressSelect );
                    141: 
                    142:     coarseAddressMask  = addressSelects >> 16;
                    143:     fineAddressMask    = addressSelects & 0xffff;
                    144: 
                    145:     for( index = 0; index < 15; index++ ) {
                    146:        if( coarseAddressMask & (1 << index)) {
                    147:            ok = addBridgeMemoryRange( index << 28, 0x10000000, true );
                    148:        }
                    149:     }
                    150: 
                    151: //    if( coarseAddressMask & (1 << 15))       // F segment
                    152:        for( index = 0; index < 15; index++ ) {
                    153:            if( fineAddressMask & (1 << index)) {
                    154:                ok = addBridgeMemoryRange( (0xf0 | index) << 24,
                    155:                                                0x01000000, true );
                    156:            }
                    157:        }
                    158: 
                    159:     ok = addBridgeIORange( 0, 0x10000 );
                    160: 
                    161:     return( super::configure( provider));
                    162: }
                    163: 
                    164: void AppleMacRiscPCI::free()
                    165: {
                    166:     if( configAddrMap)
                    167:        configAddrMap->release();
                    168:     if( configDataMap)
                    169:        configDataMap->release();
                    170:     if( lock)
                    171:        IOSimpleLockFree( lock);
                    172: 
                    173:     super::free();
                    174: }
                    175: 
                    176: IODeviceMemory * AppleMacRiscPCI::ioDeviceMemory( void )
                    177: {
                    178:     return( ioMemory);
                    179: }
                    180: 
                    181: IODeviceMemory * AppleMacRiscVCI::ioDeviceMemory( void )
                    182: {
                    183:     return( 0 );
                    184: }
                    185: 
                    186: bool AppleMacRiscVCI::configure( IOService * provider )
                    187: {
                    188:     addBridgeMemoryRange( 0x90000000, 0x10000000, true );
                    189: 
                    190:     return( AppleMacRiscPCI::configure( provider));
                    191: }
                    192: 
                    193: UInt8 AppleMacRiscPCI::firstBusNum( void )
                    194: {
                    195:     return( primaryBus );
                    196: }
                    197: 
                    198: UInt8 AppleMacRiscPCI::lastBusNum( void )
                    199: {
                    200:     return( firstBusNum() );
                    201: }
                    202: 
                    203: IOPCIAddressSpace AppleMacRiscPCI::getBridgeSpace( void )
                    204: {
                    205:     IOPCIAddressSpace  space;
                    206: 
                    207:     space.bits = 0;
                    208:     space.s.busNum = primaryBus;
                    209:     space.s.deviceNum = kBridgeSelfDevice;
                    210: 
                    211:     return( space );
                    212: }
                    213: 
                    214: inline bool AppleMacRiscPCI::setConfigSpace( IOPCIAddressSpace space,
                    215:                                        UInt8 offset )
                    216: {
                    217:     UInt32     addrCycle;
                    218: 
                    219:     if( space.s.busNum == primaryBus) {
                    220: 
                    221:        if( space.s.deviceNum < kBridgeSelfDevice)
                    222:            return( false);
                    223: 
                    224:         // primary config cycle
                    225:         addrCycle = (    (1 << space.s.deviceNum)
                    226:                        | (space.s.functionNum << 8)
                    227:                        | offset );
                    228: 
                    229:     } else {
                    230:         // pass thru config cycle
                    231:         addrCycle = (    (space.bits)
                    232:                        | offset
                    233:                        | 1 );
                    234:     }
                    235: 
                    236:     do {
                    237:         OSWriteSwapInt32( configAddr, 0, addrCycle);
                    238:         eieio();
                    239:     } while( addrCycle != OSReadSwapInt32( configAddr, 0 ));
                    240:     eieio();
                    241: 
                    242:     return( true );
                    243: }
                    244: 
                    245: 
                    246: UInt32 AppleMacRiscPCI::configRead32( IOPCIAddressSpace space,
                    247:                                        UInt8 offset )
                    248: {
                    249:     UInt32             data;
                    250:     IOInterruptState   ints;
                    251: 
                    252:     ints = IOSimpleLockLockDisableInterrupt( lock );
                    253: 
                    254:     if( setConfigSpace( space, offset )) {
                    255: 
                    256:         data = OSReadSwapInt32( configData, offset & configDataOffsetMask );
                    257:         eieio();
                    258: 
                    259:     } else
                    260:        data = 0xffffffff;
                    261: 
                    262:     IOSimpleLockUnlockEnableInterrupt( lock, ints );
                    263: 
                    264:     return( data );
                    265: }
                    266: 
                    267: void AppleMacRiscPCI::configWrite32( IOPCIAddressSpace space, 
                    268:                                        UInt8 offset, UInt32 data )
                    269: {
                    270:     IOInterruptState ints;
                    271: 
                    272:     ints = IOSimpleLockLockDisableInterrupt( lock );
                    273: 
                    274:     if( setConfigSpace( space, offset )) {
                    275: 
                    276:         OSWriteSwapInt32( configData, offset & configDataOffsetMask, data );
                    277:         eieio();
                    278:        /* read to sync (?) */
                    279:         (void) OSReadSwapInt32( configData, offset & configDataOffsetMask );
                    280:         eieio();
                    281:        sync();
                    282:        isync();
                    283:     }
                    284: 
                    285:     IOSimpleLockUnlockEnableInterrupt( lock, ints );
                    286: }
                    287: 
                    288: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    289: 
                    290: #undef super
                    291: #define super AppleMacRiscPCI
                    292: 
                    293: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    294: 
                    295: bool AppleMacRiscAGP::configure( IOService * provider )
                    296: {
                    297:     if( !findPCICapability( getBridgeSpace(), kIOPCIAGPCapability))
                    298:        return( false );
                    299: 
                    300:     return( super::configure( provider));
                    301: }
                    302: 
                    303: IOPCIDevice * AppleMacRiscAGP::createNub( OSDictionary * from )
                    304: {
                    305:     IOPCIDevice *      nub;
                    306:     IOPCIAddressSpace  space;
                    307:     bool               isAGP;
                    308: 
                    309:     spaceFromProperties( from, &space);
                    310: 
                    311:     isAGP = (  (space.s.deviceNum != getBridgeSpace().s.deviceNum)
                    312:            && findPCICapability( space, kIOPCIAGPCapability));
                    313: 
                    314:     if( isAGP)
                    315:        nub = new IOAGPDevice;
                    316:     else
                    317:         nub = super::createNub( from );
                    318: 
                    319:     return( nub );
                    320: }
                    321: 
                    322: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    323: 
                    324: IOReturn AppleMacRiscAGP::createAGPSpace( IOPCIAddressSpace master, 
                    325:                                      IOOptionBits options,
                    326:                                      IOPhysicalAddress * address, 
                    327:                                      IOPhysicalLength * length )
                    328: {
                    329:     IOReturn           err;
                    330:     IORangeAllocator * platformRanges;
                    331:     IOPCIAddressSpace  target = getBridgeSpace();
                    332:     IOPhysicalLength   agpLength;
                    333:     IOPhysicalAddress  gartPhys;
                    334: 
                    335:     enum { agpSpacePerPage = 4 * 1024 * 1024 };
                    336:     enum { agpBytesPerGartByte = 1024 };
                    337:     enum { alignLen = 4 * 1024 * 1024 - 1 };
                    338: 
                    339:     destroyAGPSpace( master );
                    340: 
                    341:     agpLength = *length;
                    342:     if( !agpLength)
                    343:        agpLength = 32 * 1024 * 1024;
                    344: 
                    345:     agpLength = (agpLength + alignLen) & ~alignLen;
                    346: 
                    347:     err = kIOReturnVMError;
                    348:     do {
                    349: 
                    350:        gartLength = agpLength / agpBytesPerGartByte;
                    351:        gartArray = (volatile UInt32 *) IOMallocContiguous( 
                    352:                                gartLength, 4096, &gartPhys );
                    353:        if( !gartArray)
                    354:            continue;
                    355: //IOMapPages( kernel_map, gartArray, gartPhys, gartLength, kIOMapInhibitCache );
                    356:         bzero( (void *) gartArray, gartLength);
                    357: 
                    358:        platformRanges = getPlatform()->getPhysicalRangeAllocator();
                    359: 
                    360:        for( agpBaseIndex = 0xf; agpBaseIndex > 0; agpBaseIndex--) {
                    361:            systemBase = agpBaseIndex * 0x10000000;
                    362:            if( platformRanges->allocateRange( systemBase, agpLength )) {
                    363:                systemLength = agpLength;
                    364:                break;
                    365:            }
                    366:        }
                    367:        if( !systemLength)
                    368:            continue;
                    369: 
                    370:        agpRange = IORangeAllocator::withRange( agpLength, 4096 );
                    371:        if( !agpRange)
                    372:            continue;
                    373: 
                    374:         *address = systemBase;
                    375:         *length = systemLength;
                    376: #if 0
                    377:         coarseAddressMask |= (1 << agpBaseIndex);
                    378:         configWrite32( target, kMacRISCAddressSelect,
                    379:                                (coarseAddressMask << 16) | fineAddressMask );
                    380: #endif
                    381:         configWrite32( target, kUniNAGP_BASE, agpBaseIndex << 28 );
                    382: 
                    383:         assert( 0 == (gartPhys & 0xfff));
                    384:         configWrite32( target, kUniNGART_BASE,
                    385:                        gartPhys | (agpLength / agpSpacePerPage));
                    386: 
                    387:         err = kIOReturnSuccess;
                    388: 
                    389:     } while( false );
                    390: 
                    391:     if( kIOReturnSuccess == err)
                    392:         setAGPEnable( master, true, 1 );
                    393:     else
                    394:        destroyAGPSpace( master );
                    395: 
                    396:     return( err );
                    397: }
                    398: 
                    399: IOReturn AppleMacRiscAGP::destroyAGPSpace( IOPCIAddressSpace master )
                    400: {
                    401:     IORangeAllocator * platformRanges;
                    402: 
                    403:     setAGPEnable( master, false, 0 );
                    404: 
                    405:     if( gartArray) {
                    406:        IOFreeContiguous( (void *) gartArray, gartLength);
                    407:        gartArray = 0;
                    408:     }
                    409:     if( agpRange) {
                    410:        agpRange->release();
                    411:        agpRange = 0;
                    412:     }
                    413:     if( systemLength) {
                    414:        platformRanges = getPlatform()->getPhysicalRangeAllocator();
                    415:        platformRanges->deallocate( systemBase, systemLength);
                    416:        systemLength = 0;
                    417:     }
                    418: 
                    419:     return( kIOReturnSuccess );
                    420: }
                    421: 
                    422: IORangeAllocator * AppleMacRiscAGP::getAGPRangeAllocator(
                    423:                                        IOPCIAddressSpace master )
                    424: {
                    425: //    if( agpRange)    agpRange->retain();
                    426:     return( agpRange );
                    427: }
                    428: 
                    429: IOOptionBits AppleMacRiscAGP::getAGPStatus( IOPCIAddressSpace master,
                    430:                                            IOOptionBits options = 0 )
                    431: {
                    432:     return( configRead32( getBridgeSpace(), kUniNINTERNAL_STATUS ) );
                    433: }
                    434: 
                    435: IOReturn AppleMacRiscAGP::commitAGPMemory( IOPCIAddressSpace master, 
                    436:                                      IOMemoryDescriptor * memory,
                    437:                                      IOByteCount agpOffset,
                    438:                                      IOOptionBits options = 0 )
                    439: {
                    440:     IOPCIAddressSpace  target = getBridgeSpace();
                    441:     IOReturn           err = kIOReturnSuccess;
                    442:     UInt32             offset = 0;
                    443:     IOPhysicalAddress  physAddr;
                    444:     IOByteCount                len;
                    445: 
                    446: //    ok = agpRange->allocate( memory->getLength(), &agpOffset );
                    447: 
                    448:     assert( agpOffset < systemLength );
                    449:     agpOffset /= (page_size / 4);
                    450:     while( (physAddr = memory->getPhysicalSegment( offset, &len ))) {
                    451: 
                    452:        offset += len;
                    453:        len = (len + 0xfff) & ~0xfff;
                    454:        while( len > 0) {
                    455:            OSWriteLittleInt32( gartArray, agpOffset,
                    456:                                ((physAddr & ~0xfff) | 1));
                    457:            agpOffset += 4;
                    458:            physAddr += page_size;
                    459:            len -= page_size;
                    460:        }
                    461:     }
                    462:     flush_dcache( (vm_offset_t) gartArray, gartLength, false);
                    463:     sync();
                    464:     isync();
                    465: #if 1
                    466:     configWrite32( target, kUniNGART_CTRL, kGART_EN | kGART_INV );
                    467:     configWrite32( target, kUniNGART_CTRL, kGART_EN );
                    468:     configWrite32( target, kUniNGART_CTRL, kGART_EN | kGART_2xRESET);
                    469:     configWrite32( target, kUniNGART_CTRL, kGART_EN );
                    470: #endif
                    471: 
                    472:     return( err );
                    473: }
                    474: 
                    475: IOReturn AppleMacRiscAGP::releaseAGPMemory( IOPCIAddressSpace master, 
                    476:                                                IOMemoryDescriptor * memory, 
                    477:                                                IOByteCount agpOffset )
                    478: {
                    479:     IOPCIAddressSpace  target = getBridgeSpace();
                    480:     IOReturn           err = kIOReturnSuccess;
                    481:     IOByteCount                length;
                    482: 
                    483:     if( !memory)
                    484:        return( kIOReturnBadArgument );
                    485: 
                    486:     length = memory->getLength();
                    487: 
                    488:     if( (agpOffset + length) >= systemLength)
                    489:        return( kIOReturnBadArgument );
                    490: 
                    491: //    agpRange->deallocate( agpOffset, length );
                    492: 
                    493:     length = (length + 0xfff) & ~0xfff;
                    494:     agpOffset /= page_size;
                    495:     while( length > 0) {
                    496:        gartArray[ agpOffset++ ] = 0;
                    497:        length -= page_size;
                    498:     }
                    499:     flush_dcache( (vm_offset_t) gartArray, gartLength, false);
                    500:     sync();
                    501:     isync();
                    502: 
                    503:     configWrite32( target, kUniNGART_CTRL, kGART_EN | kGART_INV );
                    504:     configWrite32( target, kUniNGART_CTRL, kGART_EN );
                    505:     configWrite32( target, kUniNGART_CTRL, kGART_EN | kGART_2xRESET);
                    506:     configWrite32( target, kUniNGART_CTRL, kGART_EN );
                    507: 
                    508:     return( err );
                    509: }
                    510: 
                    511: IOReturn AppleMacRiscAGP::setAGPEnable( IOPCIAddressSpace master,
                    512:                                        bool enable, IOOptionBits options )
                    513: {
                    514:     IOReturn           err = kIOReturnSuccess;
                    515:     IOPCIAddressSpace  target = getBridgeSpace();
                    516:     UInt32             command;
                    517:     UInt32             targetStatus, masterStatus;
                    518: 
                    519:     if( enable) {
                    520: 
                    521:        targetStatus = configRead32( target, kIOPCIConfigAGPTargetStatus );
                    522:        masterStatus = configRead32( master, kIOPCIConfigAGPMasterStatus );
                    523: 
                    524:        command = kIOAGPSideBandAddresssing
                    525:                | kIOAGP4xDataRate | kIOAGP2xDataRate | kIOAGP1xDataRate;
                    526:        command &= targetStatus;
                    527:        command &= masterStatus;
                    528: 
                    529:        if( command & kIOAGP4xDataRate)
                    530:            command &= ~(kIOAGP2xDataRate | kIOAGP1xDataRate);
                    531:        else if( command & kIOAGP2xDataRate)
                    532:            command &= ~(kIOAGP1xDataRate);
                    533: 
                    534:        command |= kIOAGPEnable;
                    535: 
                    536:        if( targetStatus > masterStatus)
                    537:            targetStatus = masterStatus;
                    538:        command |= (targetStatus & kIOAGPRequestQueueMask);
                    539: 
                    540: #if 1
                    541:         configWrite32( target, kUniNGART_CTRL, kGART_EN | kGART_INV );
                    542:         configWrite32( target, kUniNGART_CTRL, kGART_EN );
                    543:         configWrite32( target, kUniNGART_CTRL, kGART_EN | kGART_2xRESET);
                    544:         configWrite32( target, kUniNGART_CTRL, kGART_EN );
                    545: #endif
                    546:        do {
                    547:            configWrite32( target, kIOPCIConfigAGPTargetCommand, command );
                    548:        } while( (command & kIOAGPEnable) != 
                    549:        (kIOAGPEnable & configRead32( target, kIOPCIConfigAGPTargetCommand)));
                    550: 
                    551:        do {
                    552:            configWrite32( master, kIOPCIConfigAGPMasterCommand, command );
                    553:        } while( (command & kIOAGPEnable) != 
                    554:        (kIOAGPEnable & configRead32( master, kIOPCIConfigAGPMasterCommand)));
                    555: 
                    556:         configWrite32( target, kUniNGART_CTRL, kGART_EN | kGART_INV );
                    557:         configWrite32( target, kUniNGART_CTRL, kGART_EN );
                    558:         configWrite32( target, kUniNGART_CTRL, kGART_EN | kGART_2xRESET);
                    559:         configWrite32( target, kUniNGART_CTRL, kGART_EN );
                    560: 
                    561:     } else {
                    562: 
                    563:         configWrite32( master, kIOPCIConfigAGPMasterCommand, 0 );
                    564:         configWrite32( target, kIOPCIConfigAGPTargetCommand, 0 );
                    565:         configWrite32( target, kUniNGART_CTRL, kGART_EN | kGART_INV );
                    566:         configWrite32( target, kUniNGART_CTRL, 0 );
                    567:         configWrite32( target, kUniNGART_CTRL, kGART_2xRESET);
                    568:         configWrite32( target, kUniNGART_CTRL, 0 );
                    569:     }
                    570: 
                    571:     return( err );
                    572: }
                    573: 
                    574: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

unix.superglobalmegacorp.com

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