-bool IOMapper::start(IOService *provider)
-{
- OSObject * obj;
- if (!super::start(provider))
- return false;
-
- if (!initHardware(provider))
- return false;
-
- if (fIsSystem) {
- sMapperLock.lock();
- IOMapper::gSystem = this;
- sMapperLock.wakeup(&IOMapper::gSystem);
- sMapperLock.unlock();
- }
-
- if (provider)
- {
- obj = provider->getProperty("iommu-id");
- if (!obj)
- obj = provider->getProperty("AAPL,phandle");
- if (obj)
- setProperty(gIOMapperIDKey, obj);
- }
- return true;
-}
-
-bool IOMapper::allocTable(IOByteCount size)
-{
- assert(!fTable);
-
- fTableSize = size;
- fTableHandle = NewARTTable(size, &fTable, &fTablePhys);
- return fTableHandle != 0;
-}
-
-void IOMapper::free()
-{
- if (fTableHandle) {
- FreeARTTable(fTableHandle, fTableSize);
- fTableHandle = 0;
- }
-
- super::free();
-}
-
-void IOMapper::setMapperRequired(bool hasMapper)
-{
- if (hasMapper)
- IOMapper::gSystem = (IOMapper *) kHasMapper;
- else {
- sMapperLock.lock();
- IOMapper::gSystem = (IOMapper *) kNoMapper;
- sMapperLock.unlock();
- sMapperLock.wakeup(&IOMapper::gSystem);
- }
-}
-
-void IOMapper::waitForSystemMapper()
-{
- sMapperLock.lock();
- while ((uintptr_t) IOMapper::gSystem & kWaitMask)
- sMapperLock.sleep(&IOMapper::gSystem);
- sMapperLock.unlock();
-}
-
-IOMapper * IOMapper::copyMapperForDevice(IOService * device)
-{
- OSObject * obj;
- IOMapper * mapper;
- OSDictionary * matching;
-
- obj = device->copyProperty("iommu-parent");
- if (!obj)
- return (NULL);
-
- if ((mapper = OSDynamicCast(IOMapper, obj)))
- return (mapper);
-
- matching = IOService::propertyMatching(gIOMapperIDKey, obj);
- if (matching)
- {
- mapper = OSDynamicCast(IOMapper, IOService::waitForMatchingService(matching));
- matching->release();
- }
- if (mapper)
- device->setProperty("iommu-parent", mapper);
- else
- obj->release();
-
- return (mapper);
-}
-
-ppnum_t IOMapper::iovmAllocDMACommand(IODMACommand * command, IOItemCount pageCount)