2 * Copyright (c) 1998-2008 Apple Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
29 * Copyright (c) 1998 Apple Computer, Inc. All rights reserved.
32 * 23 Nov 98 sdouglas created.
35 #include <IOKit/system.h>
37 #include <pexpert/pexpert.h>
40 #include <libkern/c++/OSContainers.h>
41 #include <IOKit/IOLib.h>
42 #include <IOKit/IODeviceTreeSupport.h>
43 #include <IOKit/IODeviceMemory.h>
44 #include <IOKit/IOPlatformExpert.h>
46 #include <IOKit/pci/IOPCIDevice.h>
48 #include <IOKit/IOBufferMemoryDescriptor.h>
50 #include <IOKit/platform/AppleMacIO.h>
52 #include <IOKit/ppc/IODBDMA.h>
54 #include <IOKit/assert.h>
56 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
58 #define super IOService
60 OSDefineMetaClassAndAbstractStructors(AppleMacIO
, IOService
);
61 OSMetaClassDefineReservedUnused(AppleMacIO
, 0);
62 OSMetaClassDefineReservedUnused(AppleMacIO
, 1);
63 OSMetaClassDefineReservedUnused(AppleMacIO
, 2);
64 OSMetaClassDefineReservedUnused(AppleMacIO
, 3);
66 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
68 bool AppleMacIO::start( IOService
* provider
)
70 IOPCIDevice
*pciNub
= (IOPCIDevice
*)provider
;
72 if( !super::start( provider
))
75 // Make sure memory space is on.
76 pciNub
->setMemoryEnable(true);
79 fMemory
= provider
->mapDeviceMemoryWithIndex( 0 );
81 IOLog("%s: unexpected ranges\n", getName());
83 IOLog("Warning: AppleMacIO self test fails\n");
84 PMinit(); // initialize for power management
85 temporaryPowerClampOn(); // hold power on till we get children
90 IOService
* AppleMacIO::createNub( IORegistryEntry
* from
)
94 nub
= new AppleMacIODevice
;
96 if( nub
&& !nub
->init( from
, gIODTPlane
)) {
104 void AppleMacIO::processNub(IOService
* /*nub*/)
108 const char * AppleMacIO::deleteList ( void )
110 return( "('sd', 'st', 'disk', 'tape', 'pram', 'rtc', 'mouse')" );
113 const char * AppleMacIO::excludeList( void )
118 void AppleMacIO::publishBelow( IORegistryEntry
* root
)
120 OSCollectionIterator
* kids
;
121 IORegistryEntry
* next
;
125 kids
= IODTFindMatchingEntries( root
, kIODTRecursive
, deleteList() );
127 while( (next
= (IORegistryEntry
*)kids
->getNextObject())) {
128 next
->detachAll( gIODTPlane
);
133 // publish everything below, minus excludeList
134 kids
= IODTFindMatchingEntries( root
, kIODTRecursive
| kIODTExclusive
,
137 while( (next
= (IORegistryEntry
*)kids
->getNextObject())) {
139 if( 0 == (nub
= createNub( next
)))
146 nub
->registerService();
152 bool AppleMacIO::compareNubName( const IOService
* nub
,
153 OSString
* name
, OSString
** matched
) const
155 return( IODTCompareNubName( nub
, name
, matched
)
156 || nub
->IORegistryEntry::compareName( name
, matched
) );
159 IOReturn
AppleMacIO::getNubResources( IOService
* nub
)
161 if( nub
->getDeviceMemory())
162 return( kIOReturnSuccess
);
164 IODTResolveAddressing( nub
, "reg", fNub
->getDeviceMemoryWithIndex(0) );
166 return( kIOReturnSuccess
);
169 bool AppleMacIO::selfTest( void )
171 IODBDMADescriptor
*dmaDescriptors
;
172 UInt32 dmaDescriptorsPhys
;
175 IODBDMADescriptor
*dmaDesc
;
176 IOBufferMemoryDescriptor
*buffer
;
177 volatile IODBDMAChannelRegisters
*ioBaseDMA
;
179 enum { kTestChannel
= 0x8000 };
181 ioBaseDMA
= (volatile IODBDMAChannelRegisters
*)
182 (((UInt32
)fMemory
->getVirtualAddress())
186 buffer
= IOBufferMemoryDescriptor::withCapacity(page_size
, kIODirectionOutIn
, true);
187 dmaDescriptors
= (IODBDMADescriptor
*)buffer
->getBytesNoCopy();
192 if ( (UInt32
)dmaDescriptors
& (page_size
- 1) ) {
193 IOLog("AppleMacIO::%s() - DMA Descriptor memory not page aligned!!", __FUNCTION__
);
197 bzero( dmaDescriptors
, page_size
);
199 IODBDMAReset( ioBaseDMA
);
201 dmaDesc
= dmaDescriptors
;
203 IOMakeDBDMADescriptor( dmaDesc
,
214 dmaDescriptorsPhys
= (UInt32
) (buffer
->getPhysicalSegment(0, NULL
, 0));
216 IOMakeDBDMADescriptorDep( dmaDesc
,
223 dmaDescriptorsPhys
+16*sizeof(IODBDMADescriptor
),
228 IOMakeDBDMADescriptor( dmaDesc
,
238 for ( i
= 0; (!ok
) && (i
< 3); i
++ )
240 dmaDescriptors
[16].operation
= 0;
242 IOSetDBDMACommandPtr( ioBaseDMA
, dmaDescriptorsPhys
);
243 IODBDMAContinue( ioBaseDMA
);
247 status
= IOGetDBDMAChannelStatus( ioBaseDMA
);
249 if ( ((status
& kdbdmaActive
) == 0)
250 && ((status
& kdbdmaDead
) == 0)
251 && (OSReadSwapInt32( &dmaDescriptors
[16].operation
, 0 ) == 0x12345678 ))
255 IODBDMAReset( ioBaseDMA
);
265 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
268 #define super IOService
270 OSDefineMetaClassAndStructors(AppleMacIODevice
, IOService
);
271 OSMetaClassDefineReservedUnused(AppleMacIODevice
, 0);
272 OSMetaClassDefineReservedUnused(AppleMacIODevice
, 1);
273 OSMetaClassDefineReservedUnused(AppleMacIODevice
, 2);
274 OSMetaClassDefineReservedUnused(AppleMacIODevice
, 3);
276 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
278 bool AppleMacIODevice::compareName( OSString
* name
,
279 OSString
** matched
) const
281 return (IODTCompareNubName(this, name
, matched
) ||
282 IORegistryEntry::compareName(name
, matched
));
285 IOService
* AppleMacIODevice::matchLocation( IOService
* /* client */ )
290 IOReturn
AppleMacIODevice::getResources( void )
292 IOService
*macIO
= this;
294 if (getDeviceMemory() != 0) return kIOReturnSuccess
;
296 while (macIO
&& ((macIO
= macIO
->getProvider()) != 0))
297 if (strcmp("mac-io", macIO
->getName()) == 0) break;
299 if (macIO
== 0) return kIOReturnError
;
301 IODTResolveAddressing(this, "reg", macIO
->getDeviceMemoryWithIndex(0));
303 return kIOReturnSuccess
;