|
|
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: /* IOMemoryCursor.cpp created by wgulland on 1999-3-02 */
23:
24: #include <IOKit/assert.h>
25: #include <IOKit/IOLib.h>
26: #include <IOKit/IOMemoryCursor.h>
27: #include <IOKit/IOMemoryDescriptor.h>
28: #include <libkern/OSByteOrder.h>
29:
30: /**************************** class IOMemoryCursor ***************************/
31:
32: #undef super
33: #define super OSObject
34: OSDefineMetaClassAndStructors(IOMemoryCursor, OSObject)
35:
36: IOMemoryCursor *
37: IOMemoryCursor::withSpecification(SegmentFunction inSegFunc,
38: IOPhysicalLength inMaxSegmentSize,
39: IOPhysicalLength inMaxTransferSize,
40: IOPhysicalLength inAlignment)
41: {
42: IOMemoryCursor * me = new IOMemoryCursor;
43:
44: if (me && !me->initWithSpecification(inSegFunc,
45: inMaxSegmentSize,
46: inMaxTransferSize,
47: inAlignment))
48: {
49: me->release();
50: return 0;
51: }
52:
53: return me;
54: }
55:
56: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
57:
58: bool
59: IOMemoryCursor::initWithSpecification(SegmentFunction inSegFunc,
60: IOPhysicalLength inMaxSegmentSize,
61: IOPhysicalLength inMaxTransferSize,
62: IOPhysicalLength inAlignment)
63: {
64: if (!super::init())
65: return false;
66:
67: if (!inSegFunc)
68: return false;
69:
70: outSeg = inSegFunc;
71: maxSegmentSize = inMaxSegmentSize;
72: if (inMaxTransferSize)
73: maxTransferSize = inMaxTransferSize;
74: else
75: maxTransferSize = (IOPhysicalLength) -1;
76: alignMask = inAlignment - 1;
77: assert(alignMask == 0); // No alignment code yet!
78:
79: return true;
80: }
81:
82: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
83:
84: UInt32
85: IOMemoryCursor::genPhysicalSegments(IOMemoryDescriptor *inDescriptor,
86: IOPhysicalLength fromPosition,
87: void * inSegments,
88: UInt32 inMaxSegments,
89: UInt32 inMaxTransferSize,
90: IOByteCount *outTransferSize)
91: {
92: if (!inDescriptor)
93: return 0;
94:
95: if (!inMaxSegments)
96: return 0;
97:
98: if (!inMaxTransferSize)
99: inMaxTransferSize = maxTransferSize;
100:
101: /*
102: * Iterate over the packet, translating segments where allowed
103: *
104: * If we finished cleanly return number of segments found
105: * and update the position in the descriptor.
106: */
107: UInt curSegIndex = 0;
108: UInt curTransferSize = 0;
109: PhysicalSegment seg;
110:
111: while ((curSegIndex < inMaxSegments)
112: && (curTransferSize < inMaxTransferSize)
113: && (seg.location = inDescriptor->getPhysicalSegment(
114: fromPosition + curTransferSize, &seg.length)))
115: {
116: assert(seg.length);
117: seg.length = min(inMaxTransferSize-curTransferSize,
118: (min(seg.length, maxSegmentSize)));
119: (*outSeg)(seg, inSegments, curSegIndex++);
120: curTransferSize += seg.length;
121: }
122:
123: if (outTransferSize)
124: *outTransferSize = curTransferSize;
125:
126: return curSegIndex;
127: }
128:
129: /************************ class IONaturalMemoryCursor ************************/
130:
131: #undef super
132: #define super IOMemoryCursor
133: OSDefineMetaClassAndStructors(IONaturalMemoryCursor, IOMemoryCursor)
134:
135: void IONaturalMemoryCursor::outputSegment(PhysicalSegment segment,
136: void * outSegments,
137: UInt32 outSegmentIndex)
138: {
139: ((PhysicalSegment *) outSegments)[outSegmentIndex] = segment;
140: }
141:
142: IONaturalMemoryCursor *
143: IONaturalMemoryCursor::withSpecification(IOPhysicalLength inMaxSegmentSize,
144: IOPhysicalLength inMaxTransferSize,
145: IOPhysicalLength inAlignment)
146: {
147: IONaturalMemoryCursor *me = new IONaturalMemoryCursor;
148:
149: if (me && !me->initWithSpecification(inMaxSegmentSize,
150: inMaxTransferSize,
151: inAlignment))
152: {
153: me->release();
154: return 0;
155: }
156:
157: return me;
158: }
159:
160: bool
161: IONaturalMemoryCursor::initWithSpecification(IOPhysicalLength inMaxSegmentSize,
162: IOPhysicalLength inMaxTransferSize,
163: IOPhysicalLength inAlignment)
164: {
165: return super::initWithSpecification(&IONaturalMemoryCursor::outputSegment,
166: inMaxSegmentSize,
167: inMaxTransferSize,
168: inAlignment);
169: }
170:
171: /************************** class IOBigMemoryCursor **************************/
172:
173: #undef super
174: #define super IOMemoryCursor
175: OSDefineMetaClassAndStructors(IOBigMemoryCursor, IOMemoryCursor)
176:
177: void
178: IOBigMemoryCursor::outputSegment(PhysicalSegment inSegment,
179: void * inSegments,
180: UInt32 inSegmentIndex)
181: {
182: IOPhysicalAddress * segment;
183:
184: segment = &((PhysicalSegment *) inSegments)[inSegmentIndex].location;
185: OSWriteBigInt(segment, 0, inSegment.location);
186: OSWriteBigInt(segment, sizeof(IOPhysicalAddress), inSegment.length);
187: }
188:
189: IOBigMemoryCursor *
190: IOBigMemoryCursor::withSpecification(IOPhysicalLength inMaxSegmentSize,
191: IOPhysicalLength inMaxTransferSize,
192: IOPhysicalLength inAlignment)
193: {
194: IOBigMemoryCursor * me = new IOBigMemoryCursor;
195:
196: if (me && !me->initWithSpecification(inMaxSegmentSize,
197: inMaxTransferSize,
198: inAlignment))
199: {
200: me->release();
201: return 0;
202: }
203:
204: return me;
205: }
206:
207: bool
208: IOBigMemoryCursor::initWithSpecification(IOPhysicalLength inMaxSegmentSize,
209: IOPhysicalLength inMaxTransferSize,
210: IOPhysicalLength inAlignment)
211: {
212: return super::initWithSpecification(&IOBigMemoryCursor::outputSegment,
213: inMaxSegmentSize,
214: inMaxTransferSize,
215: inAlignment);
216: }
217:
218: /************************* class IOLittleMemoryCursor ************************/
219:
220: #undef super
221: #define super IOMemoryCursor
222: OSDefineMetaClassAndStructors(IOLittleMemoryCursor, IOMemoryCursor)
223:
224: void
225: IOLittleMemoryCursor::outputSegment(PhysicalSegment inSegment,
226: void * inSegments,
227: UInt32 inSegmentIndex)
228: {
229: IOPhysicalAddress * segment;
230:
231: segment = &((PhysicalSegment *) inSegments)[inSegmentIndex].location;
232: OSWriteLittleInt(segment, 0, inSegment.location);
233: OSWriteLittleInt(segment, sizeof(IOPhysicalAddress), inSegment.length);
234: }
235:
236: IOLittleMemoryCursor *
237: IOLittleMemoryCursor::withSpecification(IOPhysicalLength inMaxSegmentSize,
238: IOPhysicalLength inMaxTransferSize,
239: IOPhysicalLength inAlignment)
240: {
241: IOLittleMemoryCursor * me = new IOLittleMemoryCursor;
242:
243: if (me && !me->initWithSpecification(inMaxSegmentSize,
244: inMaxTransferSize,
245: inAlignment))
246: {
247: me->release();
248: return 0;
249: }
250:
251: return me;
252: }
253:
254: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
255:
256: bool
257: IOLittleMemoryCursor::initWithSpecification(IOPhysicalLength inMaxSegmentSize,
258: IOPhysicalLength inMaxTransferSize,
259: IOPhysicalLength inAlignment)
260: {
261: return super::initWithSpecification(&IOLittleMemoryCursor::outputSegment,
262: inMaxSegmentSize,
263: inMaxTransferSize,
264: inAlignment);
265: }
266:
267: /************************* class IODBDMAMemoryCursor *************************/
268:
269: #if defined(__ppc__)
270:
271: #include <IOKit/ppc/IODBDMA.h>
272:
273: #undef super
274: #define super IOMemoryCursor
275: OSDefineMetaClassAndStructors(IODBDMAMemoryCursor, IOMemoryCursor)
276:
277: void
278: IODBDMAMemoryCursor::outputSegment(PhysicalSegment inSegment,
279: void * inSegments,
280: UInt32 inSegmentIndex)
281: {
282: IODBDMADescriptor *segment;
283:
284: segment = &((IODBDMADescriptor *) inSegments)[inSegmentIndex];
285:
286: // Write location into address field
287: OSWriteSwapInt32((UInt32 *) segment, 4, inSegment.location);
288:
289: // Write count into 1st two bytes of operation field.
290: // DO NOT touch rest of operation field as it should contain a STOP command.
291: OSWriteSwapInt16((UInt16 *) segment, 0, inSegment.length);
292: }
293:
294: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
295:
296: IODBDMAMemoryCursor *
297: IODBDMAMemoryCursor::withSpecification(IOPhysicalLength inMaxSegmentSize,
298: IOPhysicalLength inMaxTransferSize,
299: IOPhysicalLength inAlignment)
300: {
301: IODBDMAMemoryCursor *me = new IODBDMAMemoryCursor;
302:
303: if (me && !me->initWithSpecification(inMaxSegmentSize,
304: inMaxTransferSize,
305: inAlignment))
306: {
307: me->release();
308: return 0;
309: }
310:
311: return me;
312: }
313:
314: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
315:
316: bool
317: IODBDMAMemoryCursor::initWithSpecification(IOPhysicalLength inMaxSegmentSize,
318: IOPhysicalLength inMaxTransferSize,
319: IOPhysicalLength inAlignment)
320: {
321: return super::initWithSpecification(&IODBDMAMemoryCursor::outputSegment,
322: inMaxSegmentSize,
323: inMaxTransferSize,
324: inAlignment);
325: }
326:
327: #endif /* defined(__ppc__) */
328:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.