xref: /netbsd-src/sys/sys/bus_proto.h (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1 /*	$NetBSD: bus_proto.h,v 1.7 2013/02/04 13:18:35 macallan Exp $	*/
2 
3 /*-
4  * Copyright (c) 1996, 1997, 1998, 2001, 2007 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9  * NASA Ames Research Center, and by Andrew Doran.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  * POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 /*
34  * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
35  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
36  *
37  * Redistribution and use in source and binary forms, with or without
38  * modification, are permitted provided that the following conditions
39  * are met:
40  * 1. Redistributions of source code must retain the above copyright
41  *    notice, this list of conditions and the following disclaimer.
42  * 2. Redistributions in binary form must reproduce the above copyright
43  *    notice, this list of conditions and the following disclaimer in the
44  *    documentation and/or other materials provided with the distribution.
45  * 3. All advertising materials mentioning features or use of this software
46  *    must display the following acknowledgement:
47  *      This product includes software developed by Christopher G. Demetriou
48  *	for the NetBSD Project.
49  * 4. The name of the author may not be used to endorse or promote products
50  *    derived from this software without specific prior written permission
51  *
52  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
53  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
54  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
55  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
56  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
57  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
58  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
59  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
60  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
61  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
62  */
63 
64 #ifndef _SYS_BUS_PROTO_H_
65 #define _SYS_BUS_PROTO_H_
66 
67 /*
68  * Forwards needed by prototypes below.
69  */
70 struct mbuf;
71 struct uio;
72 
73 /*
74  * bus_space(9)
75  */
76 
77 /* Map types. */
78 #define	BUS_SPACE_MAP_CACHEABLE		0x01
79 #define	BUS_SPACE_MAP_LINEAR		0x02
80 #define	BUS_SPACE_MAP_PREFETCHABLE	0x04
81 
82 /* Bus read/write barrier methods. */
83 #define	BUS_SPACE_BARRIER_READ	0x01		/* force read barrier */
84 #define	BUS_SPACE_BARRIER_WRITE	0x02		/* force write barrier */
85 
86 int	bus_space_map(bus_space_tag_t, bus_addr_t, bus_size_t, int,
87 		      bus_space_handle_t *);
88 
89 void	bus_space_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t);
90 
91 int	bus_space_subregion(bus_space_tag_t, bus_space_handle_t,
92 			    bus_size_t, bus_size_t, bus_space_handle_t *);
93 
94 int	bus_space_alloc(bus_space_tag_t, bus_addr_t, bus_addr_t,
95 			bus_size_t, bus_size_t, bus_size_t,
96 			int, bus_addr_t *, bus_space_handle_t *);
97 
98 void	bus_space_free(bus_space_tag_t, bus_space_handle_t, bus_size_t);
99 
100 paddr_t	bus_space_mmap(bus_space_tag_t, bus_addr_t, off_t, int, int);
101 
102 void	*bus_space_vaddr(bus_space_tag_t, bus_space_handle_t);
103 
104 void	bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t bsh,
105 			  bus_size_t offset, bus_size_t len, int flags);
106 
107 /*
108  * bus_space(9) accessors
109  */
110 
111 uint8_t	bus_space_read_1(bus_space_tag_t, bus_space_handle_t,
112 			 bus_size_t);
113 uint8_t	bus_space_read_stream_1(bus_space_tag_t, bus_space_handle_t,
114 				bus_size_t);
115 
116 uint16_t bus_space_read_2(bus_space_tag_t, bus_space_handle_t,
117 			  bus_size_t);
118 uint16_t bus_space_read_stream_2(bus_space_tag_t, bus_space_handle_t,
119 				 bus_size_t);
120 
121 uint32_t bus_space_read_4(bus_space_tag_t, bus_space_handle_t,
122 			  bus_size_t);
123 uint32_t bus_space_read_stream_4(bus_space_tag_t, bus_space_handle_t,
124 				 bus_size_t);
125 
126 uint64_t bus_space_read_8(bus_space_tag_t, bus_space_handle_t,
127 			  bus_size_t);
128 uint64_t bus_space_read_stream_8(bus_space_tag_t, bus_space_handle_t,
129 				 bus_size_t);
130 
131 void	bus_space_read_multi_1(bus_space_tag_t, bus_space_handle_t,
132 			       bus_size_t, uint8_t *, bus_size_t);
133 void	bus_space_read_multi_stream_1(bus_space_tag_t, bus_space_handle_t,
134 				      bus_size_t, uint8_t *, bus_size_t);
135 void	bus_space_read_region_1(bus_space_tag_t, bus_space_handle_t,
136 			        bus_size_t, uint8_t *, bus_size_t);
137 void	bus_space_read_region_stream_1(bus_space_tag_t, bus_space_handle_t,
138 				       bus_size_t, uint8_t *, bus_size_t);
139 
140 void	bus_space_read_multi_2(bus_space_tag_t, bus_space_handle_t,
141 			       bus_size_t, uint16_t *, bus_size_t);
142 void	bus_space_read_multi_stream_2(bus_space_tag_t, bus_space_handle_t,
143 				      bus_size_t, uint16_t *, bus_size_t);
144 void	bus_space_read_region_2(bus_space_tag_t, bus_space_handle_t,
145 			        bus_size_t, uint16_t *, bus_size_t);
146 void	bus_space_read_region_stream_2(bus_space_tag_t, bus_space_handle_t,
147 				       bus_size_t, uint16_t *, bus_size_t);
148 
149 void	bus_space_read_multi_4(bus_space_tag_t, bus_space_handle_t,
150 			       bus_size_t, uint32_t *, bus_size_t);
151 void	bus_space_read_multi_stream_4(bus_space_tag_t, bus_space_handle_t,
152 				      bus_size_t, uint32_t *, bus_size_t);
153 void	bus_space_read_region_4(bus_space_tag_t, bus_space_handle_t,
154 			        bus_size_t, uint32_t *, bus_size_t);
155 void	bus_space_read_region_stream_4(bus_space_tag_t, bus_space_handle_t,
156 				       bus_size_t, uint32_t *, bus_size_t);
157 
158 void	bus_space_read_multi_8(bus_space_tag_t, bus_space_handle_t,
159 			       bus_size_t, uint64_t *, bus_size_t);
160 void	bus_space_read_multi_stream_8(bus_space_tag_t, bus_space_handle_t,
161 				      bus_size_t, uint64_t *, bus_size_t);
162 void	bus_space_read_region_8(bus_space_tag_t, bus_space_handle_t,
163 			        bus_size_t, uint64_t *, bus_size_t);
164 void	bus_space_read_region_stream_8(bus_space_tag_t, bus_space_handle_t,
165 				       bus_size_t, uint64_t *, bus_size_t);
166 
167 void	bus_space_write_1(bus_space_tag_t, bus_space_handle_t,
168 			  bus_size_t, uint8_t);
169 void	bus_space_write_stream_1(bus_space_tag_t, bus_space_handle_t,
170 				 bus_size_t, uint8_t);
171 
172 void	bus_space_write_2(bus_space_tag_t, bus_space_handle_t,
173 			  bus_size_t, uint16_t);
174 void	bus_space_write_stream_2(bus_space_tag_t, bus_space_handle_t,
175 		  		 bus_size_t, uint16_t);
176 
177 void	bus_space_write_4(bus_space_tag_t, bus_space_handle_t,
178 			  bus_size_t, uint32_t);
179 void	bus_space_write_stream_4(bus_space_tag_t, bus_space_handle_t,
180 		  		 bus_size_t, uint32_t);
181 
182 void	bus_space_write_8(bus_space_tag_t, bus_space_handle_t,
183 			  bus_size_t, uint64_t);
184 void	bus_space_write_stream_8(bus_space_tag_t, bus_space_handle_t,
185 		  		 bus_size_t, uint64_t);
186 
187 void	bus_space_write_multi_1(bus_space_tag_t, bus_space_handle_t,
188 			        bus_size_t, const uint8_t *,
189 			        bus_size_t);
190 void	bus_space_write_multi_stream_1(bus_space_tag_t, bus_space_handle_t,
191 				       bus_size_t, const uint8_t *,
192 				       bus_size_t);
193 void	bus_space_write_region_1(bus_space_tag_t, bus_space_handle_t,
194 			         bus_size_t, const uint8_t *,
195 			         bus_size_t);
196 void	bus_space_write_region_stream_1(bus_space_tag_t, bus_space_handle_t,
197 				        bus_size_t, const uint8_t *,
198 					bus_size_t);
199 
200 void	bus_space_write_multi_2(bus_space_tag_t, bus_space_handle_t,
201 			        bus_size_t, const uint16_t *,
202 			        bus_size_t);
203 void	bus_space_write_multi_stream_2(bus_space_tag_t, bus_space_handle_t,
204 				       bus_size_t, const uint16_t *,
205 				       bus_size_t);
206 void	bus_space_write_region_2(bus_space_tag_t, bus_space_handle_t,
207 			         bus_size_t, const uint16_t *,
208 			         bus_size_t);
209 void	bus_space_write_region_stream_2(bus_space_tag_t, bus_space_handle_t,
210 				        bus_size_t, const uint16_t *,
211 				        bus_size_t);
212 
213 void	bus_space_write_multi_4(bus_space_tag_t, bus_space_handle_t,
214 			        bus_size_t, const uint32_t *,
215 			        bus_size_t);
216 void	bus_space_write_multi_stream_4(bus_space_tag_t, bus_space_handle_t,
217 				       bus_size_t, const uint32_t *,
218 				       bus_size_t);
219 void	bus_space_write_region_4(bus_space_tag_t, bus_space_handle_t,
220 			         bus_size_t, const uint32_t *,
221 			         bus_size_t);
222 void	bus_space_write_region_stream_4(bus_space_tag_t, bus_space_handle_t,
223 				        bus_size_t, const uint32_t *,
224 				        bus_size_t);
225 
226 void	bus_space_write_multi_8(bus_space_tag_t, bus_space_handle_t,
227 			        bus_size_t, const uint64_t *,
228 			        bus_size_t);
229 void	bus_space_write_multi_stream_8(bus_space_tag_t, bus_space_handle_t,
230 				       bus_size_t, const uint64_t *,
231 				       bus_size_t);
232 void	bus_space_write_region_8(bus_space_tag_t, bus_space_handle_t,
233 			         bus_size_t, const uint64_t *,
234 			         bus_size_t);
235 void	bus_space_write_region_stream_8(bus_space_tag_t, bus_space_handle_t,
236 				        bus_size_t, const uint64_t *,
237 				        bus_size_t);
238 
239 void	bus_space_set_multi_1(bus_space_tag_t, bus_space_handle_t,
240 			      bus_size_t, u_int8_t, bus_size_t);
241 void	bus_space_set_multi_2(bus_space_tag_t, bus_space_handle_t,
242 			      bus_size_t, u_int16_t, bus_size_t);
243 void	bus_space_set_multi_4(bus_space_tag_t, bus_space_handle_t,
244 			      bus_size_t, u_int32_t, bus_size_t);
245 void	bus_space_set_multi_8(bus_space_tag_t, bus_space_handle_t,
246 			      bus_size_t, u_int64_t, bus_size_t);
247 
248 void	bus_space_set_multi_stream_1(bus_space_tag_t, bus_space_handle_t,
249 			      bus_size_t, u_int8_t, bus_size_t);
250 void	bus_space_set_multi_stream_2(bus_space_tag_t, bus_space_handle_t,
251 			      bus_size_t, u_int16_t, bus_size_t);
252 void	bus_space_set_multi_stream_4(bus_space_tag_t, bus_space_handle_t,
253 			      bus_size_t, u_int32_t, bus_size_t);
254 void	bus_space_set_multi_stream_8(bus_space_tag_t, bus_space_handle_t,
255 			      bus_size_t, u_int64_t, bus_size_t);
256 
257 void	bus_space_set_region_1(bus_space_tag_t, bus_space_handle_t,
258 			       bus_size_t, u_int8_t, bus_size_t);
259 void	bus_space_set_region_2(bus_space_tag_t, bus_space_handle_t,
260 			       bus_size_t, u_int16_t, bus_size_t);
261 void	bus_space_set_region_4(bus_space_tag_t, bus_space_handle_t,
262 			       bus_size_t, u_int32_t, bus_size_t);
263 void	bus_space_set_region_8(bus_space_tag_t, bus_space_handle_t,
264 			       bus_size_t, u_int64_t, bus_size_t);
265 
266 void	bus_space_set_region_stream_1(bus_space_tag_t, bus_space_handle_t,
267 			       bus_size_t, u_int8_t, bus_size_t);
268 void	bus_space_set_region_stream_2(bus_space_tag_t, bus_space_handle_t,
269 			       bus_size_t, u_int16_t, bus_size_t);
270 void	bus_space_set_region_stream_4(bus_space_tag_t, bus_space_handle_t,
271 			       bus_size_t, u_int32_t, bus_size_t);
272 void	bus_space_set_region_stream_8(bus_space_tag_t, bus_space_handle_t,
273 			       bus_size_t, u_int64_t, bus_size_t);
274 
275 void	bus_space_copy_region_1(bus_space_tag_t, bus_space_handle_t,
276 				bus_size_t, bus_space_handle_t,
277 				bus_size_t, bus_size_t);
278 void	bus_space_copy_region_2(bus_space_tag_t, bus_space_handle_t,
279 				bus_size_t, bus_space_handle_t,
280 				bus_size_t, bus_size_t);
281 void	bus_space_copy_region_4(bus_space_tag_t, bus_space_handle_t,
282 				bus_size_t, bus_space_handle_t,
283 				bus_size_t, bus_size_t);
284 void	bus_space_copy_region_8(bus_space_tag_t, bus_space_handle_t,
285 				bus_size_t, bus_space_handle_t,
286 				bus_size_t, bus_size_t);
287 
288 void	bus_space_copy_region_stream_1(bus_space_tag_t, bus_space_handle_t,
289 				bus_size_t, bus_space_handle_t,
290 				bus_size_t, bus_size_t);
291 void	bus_space_copy_region_stream_2(bus_space_tag_t, bus_space_handle_t,
292 				bus_size_t, bus_space_handle_t,
293 				bus_size_t, bus_size_t);
294 void	bus_space_copy_region_stream_4(bus_space_tag_t, bus_space_handle_t,
295 				bus_size_t, bus_space_handle_t,
296 				bus_size_t, bus_size_t);
297 void	bus_space_copy_region_stream_8(bus_space_tag_t, bus_space_handle_t,
298 				bus_size_t, bus_space_handle_t,
299 				bus_size_t, bus_size_t);
300 
301 bool	bus_space_is_equal(bus_space_tag_t, bus_space_tag_t);
302 bool	bus_space_handle_is_equal(bus_space_tag_t, bus_space_handle_t,
303     bus_space_handle_t);
304 
305 /*
306  * bus_dma(9)
307  */
308 
309 /* Flags used in various bus DMA methods. */
310 #define	BUS_DMA_WAITOK		0x000	/* safe to sleep (pseudo-flag) */
311 #define	BUS_DMA_NOWAIT		0x001	/* not safe to sleep */
312 #define	BUS_DMA_ALLOCNOW	0x002	/* perform resource allocation now */
313 #define	BUS_DMA_COHERENT	0x004	/* hint: map memory DMA coherent */
314 #define	BUS_DMA_STREAMING	0x008	/* hint: sequential, unidirectional */
315 #define	BUS_DMA_BUS1		0x010	/* placeholders for bus functions... */
316 #define	BUS_DMA_BUS2		0x020
317 #define	BUS_DMA_BUS3		0x040
318 #define	BUS_DMA_BUS4		0x080
319 #define	BUS_DMA_READ		0x100	/* mapping is device -> memory only */
320 #define	BUS_DMA_WRITE		0x200	/* mapping is memory -> device only */
321 #define	BUS_DMA_NOCACHE		0x400	/* hint: map non-cached memory */
322 #define	BUS_DMA_PREFETCHABLE	0x800	/* hint: map non-cached but allow
323 					 * things like write combining */
324 
325 /* Operations performed by bus_dmamap_sync(). */
326 #define	BUS_DMASYNC_PREREAD	0x01	/* pre-read synchronization */
327 #define	BUS_DMASYNC_POSTREAD	0x02	/* post-read synchronization */
328 #define	BUS_DMASYNC_PREWRITE	0x04	/* pre-write synchronization */
329 #define	BUS_DMASYNC_POSTWRITE	0x08	/* post-write synchronization */
330 
331 int	bus_dmamap_create(bus_dma_tag_t, bus_size_t, int, bus_size_t,
332 			  bus_size_t, int, bus_dmamap_t *);
333 void	bus_dmamap_destroy(bus_dma_tag_t, bus_dmamap_t);
334 int	bus_dmamap_load(bus_dma_tag_t, bus_dmamap_t, void *, bus_size_t,
335 			struct proc *, int);
336 int	bus_dmamap_load_mbuf(bus_dma_tag_t, bus_dmamap_t,
337 			     struct mbuf *, int);
338 int	bus_dmamap_load_uio(bus_dma_tag_t, bus_dmamap_t,
339 			    struct uio *, int);
340 int	bus_dmamap_load_raw(bus_dma_tag_t, bus_dmamap_t,
341 			    bus_dma_segment_t *, int, bus_size_t, int);
342 void	bus_dmamap_unload(bus_dma_tag_t, bus_dmamap_t);
343 void	bus_dmamap_sync(bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
344 			bus_size_t, int);
345 
346 int	bus_dmamem_alloc(bus_dma_tag_t, bus_size_t, bus_size_t,
347 			 bus_size_t, bus_dma_segment_t *,
348 			 int, int *, int);
349 void	bus_dmamem_free(bus_dma_tag_t, bus_dma_segment_t *, int);
350 int	bus_dmamem_map(bus_dma_tag_t, bus_dma_segment_t *, int,
351 		       size_t, void **, int);
352 void	bus_dmamem_unmap(bus_dma_tag_t, void *, size_t);
353 paddr_t	bus_dmamem_mmap(bus_dma_tag_t, bus_dma_segment_t *, int,
354 			off_t, int, int);
355 
356 int	bus_dmatag_subregion(bus_dma_tag_t, bus_addr_t, bus_addr_t,
357 			     bus_dma_tag_t *, int);
358 void	bus_dmatag_destroy(bus_dma_tag_t);
359 
360 #endif	/* _SYS_BUS_PROTO_H_ */
361