1/*
2 * Copyright (c) 1998-2002 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
23#ifndef _IOKIT_IOFWPHYSICALADDRESSSPACE_H
24#define _IOKIT_IOFWPHYSICALADDRESSSPACE_H
25
26#include <IOKit/firewire/IOFWAddressSpace.h>
27#include <IOKit/IODMACommand.h>
28
29/*
30 * Direct physical memory <-> FireWire address.
31 * Accesses to these addresses may be handled automatically by the
32 * hardware without notification.
33 *
34 * The 64 bit FireWire address of (32 bit) physical addr xxxx:xxxx is hostNode:0000:xxxx:xxxx
35 */
36
37class IOFWPhysicalAddressSpace;
38
39struct FWSegment
40{
41	FWAddress	address;
42	UInt32		length;
43};
44
45#pragma mark -
46
47/*!
48	@class IOFWPhysicalAddressSpaceAux
49*/
50
51class IOFWPhysicalAddressSpaceAux : public IOFWAddressSpaceAux
52{
53    OSDeclareDefaultStructors(IOFWPhysicalAddressSpaceAux)
54
55	friend class IOFWAddressSpace;
56	friend class IOFWPhysicalAddressSpace;
57
58protected:
59
60	/*!
61		@struct ExpansionData
62		@discussion This structure will be used to expand the capablilties of the class in the future.
63    */
64
65    struct ExpansionData { };
66
67	/*!
68		@var reserved
69		Reserved for future use.  (Internal use only)
70	*/
71
72	ExpansionData *reserved;
73
74	IODMACommand *	fDMACommand;
75	bool			fDMACommandPrepared;
76
77public:
78    virtual bool init( IOFWAddressSpace * primary );
79	virtual	void free();
80
81	void setDMACommand( IODMACommand * dma_command );
82	IODMACommand * getDMACommand( void );
83	UInt64 getPhysicalSegment( UInt64 offset, UInt64 * length );
84
85	IOReturn prepare( void );
86	IOReturn synchronize( IOOptionBits options );
87	IOReturn complete( void );
88
89	bool isPrepared( void );
90
91	IOReturn getSegments( UInt64 * offset, FWSegment * fw_segments, UInt32 * num_segments );
92
93private:
94    OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 0);
95    OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 1);
96    OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 2);
97    OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 3);
98    OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 4);
99    OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 5);
100    OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 6);
101    OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 7);
102    OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 8);
103    OSMetaClassDeclareReservedUnused(IOFWPhysicalAddressSpaceAux, 9);
104
105};
106
107#pragma mark -
108
109/*!
110	@class IOFWPhysicalAddressSpace
111*/
112
113class IOFWPhysicalAddressSpace : public IOFWAddressSpace
114{
115    OSDeclareDefaultStructors(IOFWPhysicalAddressSpace)
116
117	friend class IOFWPhysicalAddressSpaceAux;
118
119protected:
120
121	IOMemoryDescriptor *	fMem;	// unused
122    vm_size_t				fLen;	// unused
123
124    virtual	void 					free();
125
126public:
127
128/*!	@function	init
129	@abstract	Initialize physical address space.
130	@param		bus	Points to IOFireWireBus object.
131	@result		returns true if success, else false */
132	virtual bool init( IOFireWireBus * bus );
133
134/*!	@function	initWithDesc
135	@abstract	Initialize physical address space with IOMemoryDescriptor.
136	@param		bus	Points to IOFireWireBus object.
137	@param		mem	Points to IOMemoryDescriptor.
138	@result		returns true if success, else false */
139    virtual bool initWithDesc(IOFireWireBus *bus,
140                                        IOMemoryDescriptor *mem);
141
142/*!	@function	doRead
143	@abstract	A method for processing an address space read request
144	@param		nodeID	FireWire Read from nodeID.
145	@param		speed	at this 'speed'.
146	@param		addr	with FireWire address 'addr'.
147	@param		len		read 'len' bytes from nodeID.
148	@param		buf		points to a memory descriptor containing the packet data.
149	@param		offset	start from this 'offset' in 'buf'.
150	@param		refcon  Can be queried for extra info about the request.
151	@result		UIn32	returns kFWResponseComplete on success */
152    virtual UInt32 doRead(UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, UInt32 len,
153							IOMemoryDescriptor **buf, IOByteCount * offset,
154							IOFWRequestRefCon refcon);
155
156/*!	@function	doWrite
157	@abstract	A method for processing an address space write request
158	@param		nodeID	FireWire Write to nodeID.
159	@param		speed	at this 'speed'.
160	@param		addr	with FireWire address 'addr'.
161	@param		len		write 'len' bytes to nodeID.
162	@param		buf		obtain bytes from location given by 'buf'.
163	@param		reqrefcon  Can be queried for extra info about the request.
164	@result		UIn32	returns kFWResponseComplete on success */
165    virtual UInt32 doWrite(UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, UInt32 len,
166                           const void *buf, IOFWRequestRefCon refcon);
167
168/*!	@function	getMemoryDescriptor
169	@abstract	Gets the memory descriptor, which is associated to this
170				PhysicalAddressSpace.
171	@param		none.
172	@result		returns the IOMemoryDescriptor */
173	IOMemoryDescriptor * getMemoryDescriptor( void );
174
175/*!	@function	setMemoryDescriptor
176	@abstract	Sets the memory descriptor, which will be associated to this
177				PhysicalAddressSpace.
178	@param		none.
179	@result		returns the IOMemoryDescriptor */
180	IOReturn setMemoryDescriptor( IOMemoryDescriptor * descriptor );
181
182/*!	@function	getLength
183	@abstract	Get the length of the memory backed by PhysicalAddressSpace.
184	@param		none.
185	@result		returns the length */
186	UInt64 getLength( void );
187
188/*!	@function	setDMACommand
189	@abstract	Set the DMACommand for this PhysicalAddressSpace.
190	@param		dma_command	Points to IODMACommand object.
191	@result		none */
192	inline void setDMACommand( IODMACommand * dma_command )
193		{ ((IOFWPhysicalAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->setDMACommand( dma_command ); };
194
195/*!	@function	getDMACommand
196	@abstract	Get the DMACommand from this PhysicalAddressSpace.
197	@param		none.
198	@result		return previously assigned IODMACommand, null if not initialized */
199	inline IODMACommand * getDMACommand( void )
200		{ return ((IOFWPhysicalAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->getDMACommand(); };
201
202/*!	@function	initWithDMACommand
203	@abstract	Initialize physical address space with IODMACommand.
204	@param		bus	Points to IOFireWireBus object.
205	@param		command	Points to IODMACommand.
206	@result		returns true if success, else false */
207	virtual bool initWithDMACommand( IOFireWireBus * control, IODMACommand * command );
208
209/*!	@function	prepare
210	@abstract	Prepare the IODMACommand used by this PhysicalAddressSpace.
211	@param		none.
212	@result		returns kIOReturnSuccess on success */
213	inline IOReturn prepare( void )
214		{ return ((IOFWPhysicalAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->prepare(); };
215
216/*!	@function	synchronize
217	@abstract	synchronize the IODMACommand used by this PhysicalAddressSpace.
218	@param		none.
219	@result		returns kIOReturnSuccess on success */
220	inline IOReturn synchronize( IOOptionBits options )
221		{ return ((IOFWPhysicalAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->synchronize( options ); };
222
223/*!	@function	complete
224	@abstract	complete the IODMACommand used by this PhysicalAddressSpace.
225	@param		none.
226	@result		returns kIOReturnSuccess on success */
227	inline IOReturn complete( void )
228		{ return ((IOFWPhysicalAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->complete(); };
229
230/*!	@function	isPrepared
231	@abstract	Inspects whether the IODMACommand was prepared in this PhysicalAddressSpace.
232	@param		none.
233	@result		returns true if prepared, else false */
234	inline bool isPrepared( void )
235		{ return ((IOFWPhysicalAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->isPrepared(); };
236
237/*!	@function	getSegments
238	@abstract	Returns the scatter gather list of memory segments from the IODMACommand
239				used in this PhysicalAddressSpace.
240	@param		offset		input/output parameter, defines the starting and ending offset in the memory
241							descriptor, relative to any offset passed to the prepare() method.
242				FWSegment 	Points to an array of memory segments.
243				num_segments Size of the FWSegment array.
244	@result		returns kIOReturnSuccess on success */
245	inline IOReturn getSegments( UInt64 * offset, FWSegment * fw_segments, UInt32 * num_segments )
246		{ return ((IOFWPhysicalAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->getSegments( offset, fw_segments, num_segments ); };
247
248/*!	@function	checkMemoryInRange
249	@abstract	Validates the IOMemoryDescriptor, which is used to initialize the PhysicalAddressSpace.
250	@param		memory	Points to a valid IOMemoryDescriptor.
251	@result		returns kIOReturnSuccess on success */
252	IOReturn checkMemoryInRange( IOMemoryDescriptor * memory );
253
254protected:
255
256	UInt64 getPhysicalSegment( UInt64 offset, UInt64 * length )
257		{ return ((IOFWPhysicalAddressSpaceAux*)fIOFWAddressSpaceExpansion->fAuxiliary)->getPhysicalSegment( offset, length); };
258
259	virtual IOFWAddressSpaceAux * createAuxiliary( void );
260
261};
262
263#endif
264