xref: /xnu-10002.81.5/iokit/IOKit/IOMapper.h (revision 5e3eaea39dcf651e66cb99ba7d70e32cc4a99587)
1 /*
2  * Copyright (c) 1998-2016 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
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.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
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.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 
29 #ifndef __IOKIT_IOMAPPER_H
30 #define __IOKIT_IOMAPPER_H
31 
32 #include <sys/cdefs.h>
33 #include <IOKit/IOTypes.h>
34 #include <mach/vm_types.h>
35 
36 __BEGIN_DECLS
37 
38 // These are C accessors to the system mapper for non-IOKit clients
39 ppnum_t IOMapperIOVMAlloc(unsigned pages);
40 void IOMapperIOVMFree(ppnum_t addr, unsigned pages);
41 ppnum_t IOMapperInsertPage(ppnum_t addr, unsigned offset, ppnum_t page);
42 
43 __END_DECLS
44 
45 #if __cplusplus
46 
47 #include <IOKit/IOService.h>
48 #include <IOKit/IOMemoryDescriptor.h>
49 #include <IOKit/IODMACommand.h>
50 #include <libkern/c++/OSPtr.h>
51 
52 class OSData;
53 
54 extern const OSSymbol * gIOMapperIDKey;
55 
56 class IOMapper : public IOService
57 {
58 	OSDeclareAbstractStructors(IOMapper);
59 
60 // Give the platform expert access to setMapperRequired();
61 	friend class IOPlatformExpert;
62 	friend class IOMemoryDescriptor;
63 	friend class IOGeneralMemoryDescriptor;
64 
65 private:
66 	enum SystemMapperState {
67 		kNoMapper  = 0,
68 		kUnknown   = 1,
69 		kHasMapper = 2, // Any other value is pointer to a live mapper
70 		kWaitMask  = 3,
71 	};
72 protected:
73 #ifdef XNU_KERNEL_PRIVATE
74 	uint64_t   __reservedA[6];
75 	kern_allocation_name_t fAllocName;
76 	uint32_t   __reservedB;
77 	uint32_t   fPageSize;
78 #else
79 	uint64_t __reserved[8];
80 #endif
81 	bool fIsSystem;
82 
83 	static void setMapperRequired(bool hasMapper);
84 	static void waitForSystemMapper();
85 
86 	virtual bool initHardware(IOService *provider) = 0;
87 
88 public:
89 	virtual bool start(IOService *provider) APPLE_KEXT_OVERRIDE;
90 	virtual void free() APPLE_KEXT_OVERRIDE;
91 
92 // To get access to the system mapper IOMapper::gSystem
93 	static IOMapper *gSystem;
94 
95 	static void
checkForSystemMapper()96 	checkForSystemMapper()
97 	{
98 		if ((uintptr_t) gSystem & kWaitMask) {
99 			waitForSystemMapper();
100 		}
101 	}
102 
103 	static OSPtr<IOMapper>  copyMapperForDevice(IOService * device);
104 	static OSPtr<IOMapper>  copyMapperForDeviceWithIndex(IOService * device, unsigned int index);
105 
106 // { subclasses
107 
108 	virtual uint64_t getPageSize(void) const = 0;
109 
110 	virtual IOReturn iovmMapMemory(IOMemoryDescriptor          * memory,
111 	    uint64_t                      descriptorOffset,
112 	    uint64_t                      length,
113 	    uint32_t                      mapOptions,
114 	    const IODMAMapSpecification * mapSpecification,
115 	    IODMACommand                * dmaCommand,
116 	    const IODMAMapPageList      * pageList,
117 	    uint64_t                    * mapAddress,
118 	    uint64_t                    * mapLength) = 0;
119 
120 	virtual IOReturn iovmUnmapMemory(IOMemoryDescriptor * memory,
121 	    IODMACommand       * dmaCommand,
122 	    uint64_t             mapAddress,
123 	    uint64_t             mapLength) = 0;
124 
125 	virtual IOReturn iovmInsert(uint32_t options,
126 	    uint64_t mapAddress,
127 	    uint64_t offset,
128 	    uint64_t physicalAddress,
129 	    uint64_t length) = 0;
130 
131 	virtual uint64_t mapToPhysicalAddress(uint64_t mappedAddress) = 0;
132 
133 // }
134 
135 private:
136 	OSMetaClassDeclareReservedUnused(IOMapper, 0);
137 	OSMetaClassDeclareReservedUnused(IOMapper, 1);
138 	OSMetaClassDeclareReservedUnused(IOMapper, 2);
139 	OSMetaClassDeclareReservedUnused(IOMapper, 3);
140 	OSMetaClassDeclareReservedUnused(IOMapper, 4);
141 	OSMetaClassDeclareReservedUnused(IOMapper, 5);
142 	OSMetaClassDeclareReservedUnused(IOMapper, 6);
143 	OSMetaClassDeclareReservedUnused(IOMapper, 7);
144 	OSMetaClassDeclareReservedUnused(IOMapper, 8);
145 	OSMetaClassDeclareReservedUnused(IOMapper, 9);
146 	OSMetaClassDeclareReservedUnused(IOMapper, 10);
147 	OSMetaClassDeclareReservedUnused(IOMapper, 11);
148 	OSMetaClassDeclareReservedUnused(IOMapper, 12);
149 	OSMetaClassDeclareReservedUnused(IOMapper, 13);
150 	OSMetaClassDeclareReservedUnused(IOMapper, 14);
151 	OSMetaClassDeclareReservedUnused(IOMapper, 15);
152 };
153 
154 #endif /* __cplusplus */
155 
156 #endif /* !__IOKIT_IOMAPPER_H */
157