Annotation of XNU/iokit/Families/IOPCIBus/IOPCIDevice.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:  */
                     28:  
                     29: #include <IOKit/system.h>
                     30: 
                     31: #include <IOKit/pci/IOPCIBridge.h>
                     32: #include <IOKit/pci/IOPCIDevice.h>
                     33: #include <IOKit/pci/IOAGPDevice.h>
                     34: #include <IOKit/IOPlatformExpert.h>
                     35: 
                     36: #include <IOKit/IOLib.h>
                     37: #include <IOKit/assert.h>
                     38: 
                     39: #include <libkern/c++/OSContainers.h>
                     40: 
                     41: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     42: 
                     43: #define super IOService
                     44: 
                     45: OSDefineMetaClassAndStructors(IOPCIDevice, IOService)
                     46: 
                     47: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     48: 
                     49: // stub driver has two power states, off and on
                     50: #define number_of_power_states 2
                     51: 
                     52: static IOPMPowerState ourPowerStates[number_of_power_states] = {
                     53: {1,IOPMNotAttainable,0,0,0,0,0,0,0,0,0,0},
                     54: {1,IOPMNotAttainable,0,IOPMPowerOn,0,0,0,0,0,0,0,0}
                     55: };
                     56: 
                     57: 
                     58: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     59: // attach
                     60: //
                     61: // If the device is an expansion slot device,
                     62: // we volunteer to do power managment for the device,
                     63: // and all we do is request power stay on.  The effect is
                     64: // to prevent system sleep.  If a driver is loaded which can
                     65: // power manage the device, it will contact us and we
                     66: // will relinquish this control.  This prevents the system
                     67: // from sleeping when there are non-power-managed
                     68: // PCI cards installed.
                     69: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     70: bool IOPCIDevice::attach( IOService * provider )
                     71: {
                     72:     if ( getProperty("AAPL,slot-name") != NULL ) {
                     73:         PMinit();                                                              // initialize superclass variables
                     74:         pm_vars->thePlatform->PMRegisterDevice((IOService *)this,(IOService *)this);   // register as policy-maker
                     75:         registerControllingDriver(this,ourPowerStates,number_of_power_states); // register as controlling driver
                     76:         changeStateToPriv( number_of_power_states-1);                          // clamp power on
                     77:     }
                     78:     return super::attach(provider);
                     79: }
                     80: 
                     81: 
                     82: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     83: // maxCapabilityForDomainState
                     84: //
                     85: // If the power domain is supplying power, the device
                     86: // can be on.  If there is no power it can only be off.
                     87: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     88: unsigned long  IOPCIDevice::maxCapabilityForDomainState(
                     89:                                         IOPMPowerFlags domainState )
                     90: {
                     91:    if( domainState &  IOPMPowerOn )
                     92:        return number_of_power_states-1;
                     93:    else
                     94:        return 0;
                     95: }
                     96: 
                     97: 
                     98: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     99: // initialPowerStateForDomainState
                    100: //
                    101: // This is our first information about the power domain state.
                    102: // If power is on in the new state, the device is on.
                    103: // If domain power is off, the device is also off.
                    104: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    105: unsigned long IOPCIDevice::initialPowerStateForDomainState(
                    106:                                          IOPMPowerFlags domainState )
                    107: {
                    108:    if( domainState &  IOPMPowerOn )
                    109:        return number_of_power_states-1;
                    110:    else
                    111:        return 0;
                    112: }
                    113: 
                    114: 
                    115: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    116: // powerStateForDomainState
                    117: //
                    118: // The power domain may be changing state.
                    119: // If power is on in the new state, the device will be on.
                    120: // If domain power is off, the device will be off.
                    121: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    122: unsigned long  IOPCIDevice::powerStateForDomainState(
                    123:                                         IOPMPowerFlags domainState )
                    124: {
                    125:    if( domainState &  IOPMPowerOn )
                    126:        return pm_vars->myCurrentState;
                    127:    else
                    128:        return 0;
                    129: }
                    130: 
                    131: 
                    132: //*********************************************************************************
                    133: // joinPMtree
                    134: //
                    135: // A policy-maker for our PCI device calls here when initializing,
                    136: // to be attached into the power management hierarchy.
                    137: // We are currently the (stub) policy-maker for the device, so we
                    138: // attach this driver and then pull ourselves out of the picture.
                    139: //
                    140: // This overrides the default function of the IOService joinPMtree.
                    141: //*********************************************************************************
                    142: void IOPCIDevice::joinPMtree ( IOService * driver )
                    143: {
                    144:     if ( getProperty("AAPL,slot-name") != NULL ) {
                    145:         pm_vars->myParent->addChild(driver);   // attach new driver to our parent
                    146:         changeStateToPriv(0);                  // release our clamp
                    147:         pm_vars->myParent->removeChild(this);  // detach ourselves
                    148:         PMstop();                              // free structures, etc.
                    149:     }
                    150:     else {
                    151:         super::joinPMtree(driver);             // oops, they shouldn't have called here
                    152:     }
                    153: }
                    154: 
                    155: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    156: 
                    157: bool IOPCIDevice::matchPropertyTable( OSDictionary * table )
                    158: {
                    159:   return( parent->matchNubWithPropertyTable( this, table ));
                    160: }
                    161: 
                    162: bool IOPCIDevice::compareName( OSString * name, OSString ** matched = 0 ) const
                    163: {
                    164:     return( parent->compareNubName( this, name, matched ));
                    165: }
                    166: 
                    167: IOReturn IOPCIDevice::getResources( void )
                    168: {
                    169:     return( parent->getNubResources( this ));
                    170: }
                    171: 
                    172: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    173: 
                    174: UInt32 IOPCIDevice::configRead32( IOPCIAddressSpace _space,
                    175:                                        UInt8 offset )
                    176: {
                    177:     return( parent->configRead32( _space, offset & 0xfc ));
                    178: }
                    179: 
                    180: void IOPCIDevice::configWrite32( IOPCIAddressSpace _space, 
                    181:                                        UInt8 offset, UInt32 data )
                    182: {
                    183:     parent->configWrite32( _space, offset & 0xfc, data );
                    184: }
                    185: 
                    186: UInt32 IOPCIDevice::configRead32( UInt8 offset )
                    187: {
                    188:     return( parent->configRead32( space, offset & 0xfc ));
                    189: }
                    190: 
                    191: void IOPCIDevice::configWrite32( UInt8 offset, UInt32 data )
                    192: {
                    193:     parent->configWrite32( space, offset & 0xfc, data );
                    194: }
                    195: 
                    196: UInt32 IOPCIDevice::findPCICapability( UInt8 capabilityID )
                    197: {
                    198:     return( parent->configRead32( space, capabilityID ));
                    199: }
                    200: 
                    201: UInt32 IOPCIDevice::setConfigBits( UInt8 reg, UInt32 mask, UInt32 value )
                    202: {
                    203:     UInt32     was;
                    204:     UInt32     bits;
                    205: 
                    206:     bits = configRead32( reg );
                    207:     was = (bits & mask);
                    208:     bits &= ~mask;
                    209:     bits |= (value & mask);
                    210:     configWrite32( reg, bits );
                    211: 
                    212:     return( was );
                    213: }
                    214: 
                    215: bool IOPCIDevice::setBusMasterEnable( bool enable )
                    216: {
                    217:     return( 0 != setConfigBits( kIOPCIConfigCommand, kIOPCICommandBusMaster,
                    218:                                enable ? kIOPCICommandBusMaster : 0));
                    219: }
                    220: 
                    221: bool IOPCIDevice::setMemoryEnable( bool enable )
                    222: {
                    223:     return( 0 != setConfigBits( kIOPCIConfigCommand, kIOPCICommandMemorySpace,
                    224:                                enable ? kIOPCICommandMemorySpace : 0));
                    225: }
                    226: 
                    227: bool IOPCIDevice::setIOEnable( bool enable, bool /* exclusive = false */ )
                    228: {
                    229:     // exclusive is TODO.
                    230:     return( 0 != setConfigBits( kIOPCIConfigCommand, kIOPCICommandIOSpace,
                    231:                                enable ? kIOPCICommandIOSpace : 0));
                    232: }
                    233: 
                    234: UInt8 IOPCIDevice::getBusNumber( void )
                    235: {
                    236:     return( space.s.busNum );
                    237: }
                    238: 
                    239: UInt8 IOPCIDevice::getDeviceNumber( void )
                    240: {
                    241:     return( space.s.deviceNum );
                    242: }
                    243: 
                    244: UInt8 IOPCIDevice::getFunctionNumber( void )
                    245: {
                    246:     return( space.s.functionNum );
                    247: }
                    248: 
                    249: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    250: 
                    251: IODeviceMemory * IOPCIDevice::getDeviceMemoryWithRegister( UInt8 reg )
                    252: {
                    253:     OSArray *          array;
                    254:     IODeviceMemory *   range;
                    255:     unsigned int       i = 0;
                    256: 
                    257:     array = (OSArray *) getProperty( gIODeviceMemoryKey);
                    258:     if( 0 == array)
                    259:        return( 0);
                    260: 
                    261:     while( (range = (IODeviceMemory *) array->getObject( i++ ))) {
                    262:        if( reg == (range->getTag() & 0xff))
                    263:            break;
                    264:     }
                    265: 
                    266:     return( range);
                    267: }
                    268: 
                    269: IOMemoryMap * IOPCIDevice:: mapDeviceMemoryWithRegister( UInt8 reg,
                    270:                                                IOOptionBits options = 0 )
                    271: {
                    272:     IODeviceMemory *   range;
                    273:     IOMemoryMap *      map;
                    274: 
                    275:     range = getDeviceMemoryWithRegister( reg );
                    276:     if( range)
                    277:        map = range->map( options );
                    278:     else
                    279:        map = 0;
                    280: 
                    281:     return( map );
                    282: }
                    283: 
                    284: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    285: 
                    286: IODeviceMemory * IOPCIDevice::ioDeviceMemory( void )
                    287: {
                    288:     return( parent->ioDeviceMemory() );
                    289: }
                    290: 
                    291: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    292: 
                    293: IOService * IOPCIDevice::matchLocation( IOService * /* client */ )
                    294: {
                    295:       return( this );
                    296: }
                    297: 
                    298: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    299: 
                    300: #undef super
                    301: #define super IOPCIDevice
                    302: 
                    303: OSDefineMetaClassAndStructors(IOAGPDevice, IOPCIDevice)
                    304: 
                    305: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    306: 
                    307: IOReturn IOAGPDevice::createAGPSpace( IOOptionBits options,
                    308:                                IOPhysicalAddress * address, 
                    309:                                IOPhysicalLength * length )
                    310: {
                    311:     return( parent->createAGPSpace( space, options, address, length ));
                    312: }
                    313: 
                    314: IOReturn IOAGPDevice::destroyAGPSpace( void )
                    315: {
                    316:     return( parent->destroyAGPSpace( space ));
                    317: }
                    318: 
                    319: IORangeAllocator * IOAGPDevice::getAGPRangeAllocator( void )
                    320: {
                    321:     return( parent->getAGPRangeAllocator( space ));
                    322: }
                    323: 
                    324: IOOptionBits IOAGPDevice::getAGPStatus( IOOptionBits options = 0 )
                    325: {
                    326:     return( parent->getAGPStatus( space, options ));
                    327: }
                    328: 
                    329: IOReturn IOAGPDevice::commitAGPMemory(  IOMemoryDescriptor * memory,
                    330:                                        IOByteCount agpOffset,
                    331:                                        IOOptionBits options = 0 )
                    332: {
                    333:     return( parent->commitAGPMemory ( space, memory, agpOffset, options ));
                    334: }
                    335: 
                    336: IOReturn IOAGPDevice::releaseAGPMemory( IOMemoryDescriptor * memory,
                    337:                                        IOByteCount agpOffset )
                    338: {
                    339:     return( parent->releaseAGPMemory ( space, memory, agpOffset ));
                    340: }
                    341: 

unix.superglobalmegacorp.com

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