1*4d495c6eSApple OSS Distributions /* 2*4d495c6eSApple OSS Distributions * Copyright (c) 1998-2016 Apple Inc. All rights reserved. 3*4d495c6eSApple OSS Distributions * 4*4d495c6eSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5*4d495c6eSApple OSS Distributions * 6*4d495c6eSApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code 7*4d495c6eSApple OSS Distributions * as defined in and that are subject to the Apple Public Source License 8*4d495c6eSApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in 9*4d495c6eSApple OSS Distributions * compliance with the License. The rights granted to you under the License 10*4d495c6eSApple OSS Distributions * may not be used to create, or enable the creation or redistribution of, 11*4d495c6eSApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to 12*4d495c6eSApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any 13*4d495c6eSApple OSS Distributions * terms of an Apple operating system software license agreement. 14*4d495c6eSApple OSS Distributions * 15*4d495c6eSApple OSS Distributions * Please obtain a copy of the License at 16*4d495c6eSApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file. 17*4d495c6eSApple OSS Distributions * 18*4d495c6eSApple OSS Distributions * The Original Code and all software distributed under the License are 19*4d495c6eSApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20*4d495c6eSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21*4d495c6eSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22*4d495c6eSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23*4d495c6eSApple OSS Distributions * Please see the License for the specific language governing rights and 24*4d495c6eSApple OSS Distributions * limitations under the License. 25*4d495c6eSApple OSS Distributions * 26*4d495c6eSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27*4d495c6eSApple OSS Distributions */ 28*4d495c6eSApple OSS Distributions 29*4d495c6eSApple OSS Distributions #ifndef __IOKIT_IOMAPPER_H 30*4d495c6eSApple OSS Distributions #define __IOKIT_IOMAPPER_H 31*4d495c6eSApple OSS Distributions 32*4d495c6eSApple OSS Distributions #include <sys/cdefs.h> 33*4d495c6eSApple OSS Distributions #include <IOKit/IOTypes.h> 34*4d495c6eSApple OSS Distributions #include <mach/vm_types.h> 35*4d495c6eSApple OSS Distributions 36*4d495c6eSApple OSS Distributions __BEGIN_DECLS 37*4d495c6eSApple OSS Distributions 38*4d495c6eSApple OSS Distributions // These are C accessors to the system mapper for non-IOKit clients 39*4d495c6eSApple OSS Distributions ppnum_t IOMapperIOVMAlloc(unsigned pages); 40*4d495c6eSApple OSS Distributions void IOMapperIOVMFree(ppnum_t addr, unsigned pages); 41*4d495c6eSApple OSS Distributions ppnum_t IOMapperInsertPage(ppnum_t addr, unsigned offset, ppnum_t page); 42*4d495c6eSApple OSS Distributions 43*4d495c6eSApple OSS Distributions __END_DECLS 44*4d495c6eSApple OSS Distributions 45*4d495c6eSApple OSS Distributions #if __cplusplus 46*4d495c6eSApple OSS Distributions 47*4d495c6eSApple OSS Distributions #include <IOKit/IOService.h> 48*4d495c6eSApple OSS Distributions #include <IOKit/IOMemoryDescriptor.h> 49*4d495c6eSApple OSS Distributions #include <IOKit/IODMACommand.h> 50*4d495c6eSApple OSS Distributions #include <libkern/c++/OSPtr.h> 51*4d495c6eSApple OSS Distributions 52*4d495c6eSApple OSS Distributions class OSData; 53*4d495c6eSApple OSS Distributions 54*4d495c6eSApple OSS Distributions extern const OSSymbol * gIOMapperIDKey; 55*4d495c6eSApple OSS Distributions 56*4d495c6eSApple OSS Distributions class IOMapper : public IOService 57*4d495c6eSApple OSS Distributions { 58*4d495c6eSApple OSS Distributions OSDeclareAbstractStructors(IOMapper); 59*4d495c6eSApple OSS Distributions 60*4d495c6eSApple OSS Distributions // Give the platform expert access to setMapperRequired(); 61*4d495c6eSApple OSS Distributions friend class IOPlatformExpert; 62*4d495c6eSApple OSS Distributions friend class IOMemoryDescriptor; 63*4d495c6eSApple OSS Distributions friend class IOGeneralMemoryDescriptor; 64*4d495c6eSApple OSS Distributions 65*4d495c6eSApple OSS Distributions private: 66*4d495c6eSApple OSS Distributions enum SystemMapperState { 67*4d495c6eSApple OSS Distributions kNoMapper = 0, 68*4d495c6eSApple OSS Distributions kUnknown = 1, 69*4d495c6eSApple OSS Distributions kHasMapper = 2, // Any other value is pointer to a live mapper 70*4d495c6eSApple OSS Distributions kWaitMask = 3, 71*4d495c6eSApple OSS Distributions }; 72*4d495c6eSApple OSS Distributions protected: 73*4d495c6eSApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE 74*4d495c6eSApple OSS Distributions uint64_t __reservedA[6]; 75*4d495c6eSApple OSS Distributions kern_allocation_name_t fAllocName; 76*4d495c6eSApple OSS Distributions uint32_t __reservedB; 77*4d495c6eSApple OSS Distributions uint32_t fPageSize; 78*4d495c6eSApple OSS Distributions #else 79*4d495c6eSApple OSS Distributions uint64_t __reserved[8]; 80*4d495c6eSApple OSS Distributions #endif 81*4d495c6eSApple OSS Distributions bool fIsSystem; 82*4d495c6eSApple OSS Distributions 83*4d495c6eSApple OSS Distributions static void setMapperRequired(bool hasMapper); 84*4d495c6eSApple OSS Distributions static void waitForSystemMapper(); 85*4d495c6eSApple OSS Distributions 86*4d495c6eSApple OSS Distributions virtual bool initHardware(IOService *provider) = 0; 87*4d495c6eSApple OSS Distributions 88*4d495c6eSApple OSS Distributions public: 89*4d495c6eSApple OSS Distributions virtual bool start(IOService *provider) APPLE_KEXT_OVERRIDE; 90*4d495c6eSApple OSS Distributions virtual void free() APPLE_KEXT_OVERRIDE; 91*4d495c6eSApple OSS Distributions 92*4d495c6eSApple OSS Distributions // To get access to the system mapper IOMapper::gSystem 93*4d495c6eSApple OSS Distributions static IOMapper *gSystem; 94*4d495c6eSApple OSS Distributions 95*4d495c6eSApple OSS Distributions static void checkForSystemMapper()96*4d495c6eSApple OSS Distributions checkForSystemMapper() 97*4d495c6eSApple OSS Distributions { 98*4d495c6eSApple OSS Distributions if ((uintptr_t) gSystem & kWaitMask) { 99*4d495c6eSApple OSS Distributions waitForSystemMapper(); 100*4d495c6eSApple OSS Distributions } 101*4d495c6eSApple OSS Distributions } 102*4d495c6eSApple OSS Distributions 103*4d495c6eSApple OSS Distributions static OSPtr<IOMapper> copyMapperForDevice(IOService * device); 104*4d495c6eSApple OSS Distributions static OSPtr<IOMapper> copyMapperForDeviceWithIndex(IOService * device, unsigned int index); 105*4d495c6eSApple OSS Distributions 106*4d495c6eSApple OSS Distributions // { subclasses 107*4d495c6eSApple OSS Distributions 108*4d495c6eSApple OSS Distributions virtual uint64_t getPageSize(void) const = 0; 109*4d495c6eSApple OSS Distributions 110*4d495c6eSApple OSS Distributions virtual IOReturn iovmMapMemory(IOMemoryDescriptor * memory, 111*4d495c6eSApple OSS Distributions uint64_t descriptorOffset, 112*4d495c6eSApple OSS Distributions uint64_t length, 113*4d495c6eSApple OSS Distributions uint32_t mapOptions, 114*4d495c6eSApple OSS Distributions const IODMAMapSpecification * mapSpecification, 115*4d495c6eSApple OSS Distributions IODMACommand * dmaCommand, 116*4d495c6eSApple OSS Distributions const IODMAMapPageList * pageList, 117*4d495c6eSApple OSS Distributions uint64_t * mapAddress, 118*4d495c6eSApple OSS Distributions uint64_t * mapLength) = 0; 119*4d495c6eSApple OSS Distributions 120*4d495c6eSApple OSS Distributions virtual IOReturn iovmUnmapMemory(IOMemoryDescriptor * memory, 121*4d495c6eSApple OSS Distributions IODMACommand * dmaCommand, 122*4d495c6eSApple OSS Distributions uint64_t mapAddress, 123*4d495c6eSApple OSS Distributions uint64_t mapLength) = 0; 124*4d495c6eSApple OSS Distributions 125*4d495c6eSApple OSS Distributions virtual IOReturn iovmInsert(uint32_t options, 126*4d495c6eSApple OSS Distributions uint64_t mapAddress, 127*4d495c6eSApple OSS Distributions uint64_t offset, 128*4d495c6eSApple OSS Distributions uint64_t physicalAddress, 129*4d495c6eSApple OSS Distributions uint64_t length) = 0; 130*4d495c6eSApple OSS Distributions 131*4d495c6eSApple OSS Distributions virtual uint64_t mapToPhysicalAddress(uint64_t mappedAddress) = 0; 132*4d495c6eSApple OSS Distributions 133*4d495c6eSApple OSS Distributions // } 134*4d495c6eSApple OSS Distributions 135*4d495c6eSApple OSS Distributions private: 136*4d495c6eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOMapper, 0); 137*4d495c6eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOMapper, 1); 138*4d495c6eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOMapper, 2); 139*4d495c6eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOMapper, 3); 140*4d495c6eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOMapper, 4); 141*4d495c6eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOMapper, 5); 142*4d495c6eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOMapper, 6); 143*4d495c6eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOMapper, 7); 144*4d495c6eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOMapper, 8); 145*4d495c6eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOMapper, 9); 146*4d495c6eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOMapper, 10); 147*4d495c6eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOMapper, 11); 148*4d495c6eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOMapper, 12); 149*4d495c6eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOMapper, 13); 150*4d495c6eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOMapper, 14); 151*4d495c6eSApple OSS Distributions OSMetaClassDeclareReservedUnused(IOMapper, 15); 152*4d495c6eSApple OSS Distributions }; 153*4d495c6eSApple OSS Distributions 154*4d495c6eSApple OSS Distributions #endif /* __cplusplus */ 155*4d495c6eSApple OSS Distributions 156*4d495c6eSApple OSS Distributions #endif /* !__IOKIT_IOMAPPER_H */ 157