Annotation of XNU/iokit/Drivers/platform/drvAppleMacIO/AppleMacIO.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.
                     27:  */
                     28:  
                     29: #include <IOKit/system.h>
                     30: extern "C" {
                     31: #include <pexpert/pexpert.h>
                     32: }
                     33: 
                     34: #include <libkern/c++/OSContainers.h>
                     35: #include <IOKit/IOLib.h>
                     36: #include <IOKit/IODeviceTreeSupport.h>
                     37: #include <IOKit/IODeviceMemory.h>
                     38: #include <IOKit/IOPlatformExpert.h>
                     39: 
                     40: #include <IOKit/pci/IOPCIDevice.h>
                     41: 
                     42: #include <IOKit/platform/AppleMacIO.h>
                     43: 
                     44: #include <IOKit/ppc/IODBDMA.h>
                     45: 
                     46: #include <assert.h>
                     47: 
                     48: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     49: 
                     50: #define super IOService
                     51: 
                     52: OSDefineMetaClass(AppleMacIO, IOService);
                     53: OSDefineAbstractStructors(AppleMacIO, IOService);
                     54: 
                     55: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     56: 
                     57: bool AppleMacIO::start( IOService * provider )
                     58: {
                     59:     IOPCIDevice *pciNub = (IOPCIDevice *)provider;
                     60: 
                     61:     if( !super::start( provider))
                     62:        return( false);
                     63: 
                     64:     // Make sure memory space is on.
                     65:     pciNub->setMemoryEnable(true);
                     66: 
                     67:     fNub = provider;
                     68:     fMemory = provider->mapDeviceMemoryWithIndex( 0 );
                     69:     if( 0 == fMemory)
                     70:        IOLog("%s: unexpected ranges\n", getName());
                     71:     else if( !selfTest())
                     72:        IOLog("Warning: AppleMacIO self test fails\n");
                     73: 
                     74:     return( true);
                     75: }
                     76: 
                     77: IOService * AppleMacIO::createNub( IORegistryEntry * from )
                     78: {
                     79:     IOService *        nub;
                     80: 
                     81:     nub = new AppleMacIODevice;
                     82: 
                     83:     if( nub && !nub->init( from, gIODTPlane )) {
                     84:        nub->free();
                     85:        nub = 0;
                     86:     }
                     87: 
                     88:     return( nub);
                     89: }
                     90: 
                     91: void AppleMacIO::processNub(IOService * /*nub*/)
                     92: {
                     93: }
                     94: 
                     95: const char * AppleMacIO::deleteList ( void )
                     96: {
                     97:     return( "('sd', 'st', 'disk', 'tape', 'adb', 'pram', 'rtc', 'power-mgt')" );
                     98: }
                     99: 
                    100: const char * AppleMacIO::excludeList( void )
                    101: {
                    102:     return( 0 );
                    103: }
                    104: 
                    105: void AppleMacIO::publishBelow( IORegistryEntry * root )
                    106: {
                    107:     OSCollectionIterator *     kids;
                    108:     IORegistryEntry *          next;
                    109:     IOService *                        nub;
                    110: 
                    111:     // infanticide
                    112:     kids = IODTFindMatchingEntries( root, kIODTRecursive, deleteList() );
                    113:     if( kids) {
                    114:        while( (next = (IORegistryEntry *)kids->getNextObject())) {
                    115:            next->detachAll( gIODTPlane);
                    116:        }
                    117:        kids->release();
                    118:     }
                    119: 
                    120:     // publish everything below, minus excludeList
                    121:     kids = IODTFindMatchingEntries( root, kIODTRecursive | kIODTExclusive,
                    122:                                        excludeList());
                    123:     if( kids) {
                    124:        while( (next = (IORegistryEntry *)kids->getNextObject())) {
                    125: 
                    126:             if( 0 == (nub = createNub( next )))
                    127:                 continue;
                    128: 
                    129:             nub->attach( this );
                    130:            
                    131:            processNub(nub);
                    132:            
                    133:             nub->registerService();
                    134:         }
                    135:        kids->release();
                    136:     }
                    137: }
                    138: 
                    139: bool AppleMacIO::compareNubName( const IOService * nub,
                    140:                                OSString * name, OSString ** matched ) const
                    141: {
                    142:     return( IODTCompareNubName( nub, name, matched )
                    143:          ||  nub->IORegistryEntry::compareName( name, matched ) );
                    144: }
                    145: 
                    146: IOReturn AppleMacIO::getNubResources( IOService * nub )
                    147: {
                    148:     if( nub->getDeviceMemory())
                    149:        return( kIOReturnSuccess );
                    150: 
                    151:     IODTResolveAddressing( nub, "reg", fNub->getDeviceMemoryWithIndex(0) );
                    152: 
                    153:     return( kIOReturnSuccess);
                    154: }
                    155: 
                    156: bool AppleMacIO::selfTest( void )
                    157: {
                    158:     IODBDMADescriptor                  *dmaDescriptors;
                    159:     UInt32                             dmaDescriptorsPhys;
                    160:     UInt32                             i;
                    161:     UInt32                             status;
                    162:     IODBDMADescriptor                  *dmaDesc;
                    163:     volatile IODBDMAChannelRegisters   *ioBaseDMA;
                    164:     bool                               ok = false;
                    165:     enum {                             kTestChannel = 0x8000 };
                    166: 
                    167:     ioBaseDMA = (volatile IODBDMAChannelRegisters *)
                    168:                (((UInt32)fMemory->getVirtualAddress())
                    169:                + kTestChannel );
                    170: 
                    171:     do {
                    172:         dmaDescriptors = (IODBDMADescriptor *)IOMallocContiguous(page_size, 1, & dmaDescriptorsPhys);
                    173:         if (!dmaDescriptors)
                    174:            continue;
                    175: 
                    176:         if ( (UInt32)dmaDescriptors & (page_size - 1) ) {
                    177:             IOLog("AppleMacIO::%s() - DMA Descriptor memory not page aligned!!", __FUNCTION__);
                    178:            continue;
                    179:         }
                    180: 
                    181:         bzero( dmaDescriptors, page_size );
                    182: 
                    183:         IODBDMAReset( ioBaseDMA );
                    184: 
                    185:         dmaDesc = dmaDescriptors;
                    186: 
                    187:         IOMakeDBDMADescriptor( dmaDesc,
                    188:                             kdbdmaNop,
                    189:                             kdbdmaKeyStream0,
                    190:                             kdbdmaIntNever,
                    191:                             kdbdmaBranchNever,
                    192:                             kdbdmaWaitNever,
                    193:                             0,
                    194:                             0 );
                    195: 
                    196:         dmaDesc++;
                    197: 
                    198:         IOMakeDBDMADescriptorDep( dmaDesc,
                    199:                                 kdbdmaStoreQuad,
                    200:                                 kdbdmaKeySystem,
                    201:                                 kdbdmaIntNever,
                    202:                                 kdbdmaBranchNever,
                    203:                                 kdbdmaWaitNever,
                    204:                                 4,
                    205:                                 dmaDescriptorsPhys+16*sizeof(IODBDMADescriptor),
                    206:                                 0x12345678 );
                    207: 
                    208:         dmaDesc++;
                    209: 
                    210:         IOMakeDBDMADescriptor( dmaDesc,
                    211:                             kdbdmaStop,
                    212:                             kdbdmaKeyStream0,
                    213:                             kdbdmaIntNever,
                    214:                             kdbdmaBranchNever,
                    215:                             kdbdmaWaitNever,
                    216:                             0,
                    217:                             0 );
                    218: 
                    219: 
                    220:         for ( i = 0; (!ok) && (i < 3); i++ )
                    221:         {
                    222:             dmaDescriptors[16].operation = 0;
                    223: 
                    224:             IOSetDBDMACommandPtr( ioBaseDMA, dmaDescriptorsPhys );
                    225:             IODBDMAContinue( ioBaseDMA );
                    226: 
                    227:             IODelay( 200 );
                    228: 
                    229:             status = IOGetDBDMAChannelStatus( ioBaseDMA );
                    230: 
                    231:             if ( ((status & kdbdmaActive) == 0)
                    232:                 &&  ((status & kdbdmaDead) == 0)
                    233:                     && (OSReadSwapInt32( &dmaDescriptors[16].operation, 0 ) == 0x12345678 ))
                    234:                 ok = true;
                    235:         }
                    236: 
                    237:         IODBDMAReset( ioBaseDMA );
                    238: 
                    239:     } while (false);
                    240: 
                    241:     if (dmaDescriptors)
                    242:        IOFreeContiguous(dmaDescriptors, page_size);
                    243: 
                    244: 
                    245:     return ok;
                    246: }
                    247: 
                    248: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    249: 
                    250: #undef super
                    251: #define super IOService
                    252: 
                    253: OSDefineMetaClassAndStructors(AppleMacIODevice, IOService);
                    254: 
                    255: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    256: 
                    257: bool AppleMacIODevice::compareName( OSString * name,
                    258:                                        OSString ** matched = 0 ) const
                    259: {
                    260:     return( ((AppleMacIO *)getProvider())->
                    261:                compareNubName( this, name, matched ));
                    262: }
                    263: 
                    264: IOService * AppleMacIODevice::matchLocation( IOService * /* client */ )
                    265: {
                    266:       return( this );
                    267: }
                    268: 
                    269: IOReturn AppleMacIODevice::getResources( void )
                    270: {
                    271:     return( ((AppleMacIO *)getProvider())->getNubResources( this ));
                    272: }
                    273: 

unix.superglobalmegacorp.com

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