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 */
70struct mbuf;
71struct 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
86int bus_space_map(bus_space_tag_t, bus_addr_t, bus_size_t, int,
87 bus_space_handle_t *);
88
89void bus_space_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t);
90
91int bus_space_subregion(bus_space_tag_t, bus_space_handle_t,
92 bus_size_t, bus_size_t, bus_space_handle_t *);
93
94int 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
98void bus_space_free(bus_space_tag_t, bus_space_handle_t, bus_size_t);
99
100paddr_t bus_space_mmap(bus_space_tag_t, bus_addr_t, off_t, int, int);
101
102void *bus_space_vaddr(bus_space_tag_t, bus_space_handle_t);
103
104void 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
111uint8_t bus_space_read_1(bus_space_tag_t, bus_space_handle_t,
112 bus_size_t);
113uint8_t bus_space_read_stream_1(bus_space_tag_t, bus_space_handle_t,
114 bus_size_t);
115
116uint16_t bus_space_read_2(bus_space_tag_t, bus_space_handle_t,
117 bus_size_t);
118uint16_t bus_space_read_stream_2(bus_space_tag_t, bus_space_handle_t,
119 bus_size_t);
120
121uint32_t bus_space_read_4(bus_space_tag_t, bus_space_handle_t,
122 bus_size_t);
123uint32_t bus_space_read_stream_4(bus_space_tag_t, bus_space_handle_t,
124 bus_size_t);
125
126uint64_t bus_space_read_8(bus_space_tag_t, bus_space_handle_t,
127 bus_size_t);
128uint64_t bus_space_read_stream_8(bus_space_tag_t, bus_space_handle_t,
129 bus_size_t);
130
131void bus_space_read_multi_1(bus_space_tag_t, bus_space_handle_t,
132 bus_size_t, uint8_t *, bus_size_t);
133void bus_space_read_multi_stream_1(bus_space_tag_t, bus_space_handle_t,
134 bus_size_t, uint8_t *, bus_size_t);
135void bus_space_read_region_1(bus_space_tag_t, bus_space_handle_t,
136 bus_size_t, uint8_t *, bus_size_t);
137void bus_space_read_region_stream_1(bus_space_tag_t, bus_space_handle_t,
138 bus_size_t, uint8_t *, bus_size_t);
139
140void bus_space_read_multi_2(bus_space_tag_t, bus_space_handle_t,
141 bus_size_t, uint16_t *, bus_size_t);
142void bus_space_read_multi_stream_2(bus_space_tag_t, bus_space_handle_t,
143 bus_size_t, uint16_t *, bus_size_t);
144void bus_space_read_region_2(bus_space_tag_t, bus_space_handle_t,
145 bus_size_t, uint16_t *, bus_size_t);
146void bus_space_read_region_stream_2(bus_space_tag_t, bus_space_handle_t,
147 bus_size_t, uint16_t *, bus_size_t);
148
149void bus_space_read_multi_4(bus_space_tag_t, bus_space_handle_t,
150 bus_size_t, uint32_t *, bus_size_t);
151void bus_space_read_multi_stream_4(bus_space_tag_t, bus_space_handle_t,
152 bus_size_t, uint32_t *, bus_size_t);
153void bus_space_read_region_4(bus_space_tag_t, bus_space_handle_t,
154 bus_size_t, uint32_t *, bus_size_t);
155void bus_space_read_region_stream_4(bus_space_tag_t, bus_space_handle_t,
156 bus_size_t, uint32_t *, bus_size_t);
157
158void bus_space_read_multi_8(bus_space_tag_t, bus_space_handle_t,
159 bus_size_t, uint64_t *, bus_size_t);
160void bus_space_read_multi_stream_8(bus_space_tag_t, bus_space_handle_t,
161 bus_size_t, uint64_t *, bus_size_t);
162void bus_space_read_region_8(bus_space_tag_t, bus_space_handle_t,
163 bus_size_t, uint64_t *, bus_size_t);
164void bus_space_read_region_stream_8(bus_space_tag_t, bus_space_handle_t,
165 bus_size_t, uint64_t *, bus_size_t);
166
167void bus_space_write_1(bus_space_tag_t, bus_space_handle_t,
168 bus_size_t, uint8_t);
169void bus_space_write_stream_1(bus_space_tag_t, bus_space_handle_t,
170 bus_size_t, uint8_t);
171
172void bus_space_write_2(bus_space_tag_t, bus_space_handle_t,
173 bus_size_t, uint16_t);
174void bus_space_write_stream_2(bus_space_tag_t, bus_space_handle_t,
175 bus_size_t, uint16_t);
176
177void bus_space_write_4(bus_space_tag_t, bus_space_handle_t,
178 bus_size_t, uint32_t);
179void bus_space_write_stream_4(bus_space_tag_t, bus_space_handle_t,
180 bus_size_t, uint32_t);
181
182void bus_space_write_8(bus_space_tag_t, bus_space_handle_t,
183 bus_size_t, uint64_t);
184void bus_space_write_stream_8(bus_space_tag_t, bus_space_handle_t,
185 bus_size_t, uint64_t);
186
187void bus_space_write_multi_1(bus_space_tag_t, bus_space_handle_t,
188 bus_size_t, const uint8_t *,
189 bus_size_t);
190void 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);
193void bus_space_write_region_1(bus_space_tag_t, bus_space_handle_t,
194 bus_size_t, const uint8_t *,
195 bus_size_t);
196void 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
200void bus_space_write_multi_2(bus_space_tag_t, bus_space_handle_t,
201 bus_size_t, const uint16_t *,
202 bus_size_t);
203void 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);
206void bus_space_write_region_2(bus_space_tag_t, bus_space_handle_t,
207 bus_size_t, const uint16_t *,
208 bus_size_t);
209void 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
213void bus_space_write_multi_4(bus_space_tag_t, bus_space_handle_t,
214 bus_size_t, const uint32_t *,
215 bus_size_t);
216void 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);
219void bus_space_write_region_4(bus_space_tag_t, bus_space_handle_t,
220 bus_size_t, const uint32_t *,
221 bus_size_t);
222void 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
226void bus_space_write_multi_8(bus_space_tag_t, bus_space_handle_t,
227 bus_size_t, const uint64_t *,
228 bus_size_t);
229void 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);
232void bus_space_write_region_8(bus_space_tag_t, bus_space_handle_t,
233 bus_size_t, const uint64_t *,
234 bus_size_t);
235void 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
239void bus_space_set_multi_1(bus_space_tag_t, bus_space_handle_t,
240 bus_size_t, u_int8_t, bus_size_t);
241void bus_space_set_multi_2(bus_space_tag_t, bus_space_handle_t,
242 bus_size_t, u_int16_t, bus_size_t);
243void bus_space_set_multi_4(bus_space_tag_t, bus_space_handle_t,
244 bus_size_t, u_int32_t, bus_size_t);
245void bus_space_set_multi_8(bus_space_tag_t, bus_space_handle_t,
246 bus_size_t, u_int64_t, bus_size_t);
247
248void bus_space_set_multi_stream_1(bus_space_tag_t, bus_space_handle_t,
249 bus_size_t, u_int8_t, bus_size_t);
250void bus_space_set_multi_stream_2(bus_space_tag_t, bus_space_handle_t,
251 bus_size_t, u_int16_t, bus_size_t);
252void bus_space_set_multi_stream_4(bus_space_tag_t, bus_space_handle_t,
253 bus_size_t, u_int32_t, bus_size_t);
254void 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
257void bus_space_set_region_1(bus_space_tag_t, bus_space_handle_t,
258 bus_size_t, u_int8_t, bus_size_t);
259void bus_space_set_region_2(bus_space_tag_t, bus_space_handle_t,
260 bus_size_t, u_int16_t, bus_size_t);
261void bus_space_set_region_4(bus_space_tag_t, bus_space_handle_t,
262 bus_size_t, u_int32_t, bus_size_t);
263void bus_space_set_region_8(bus_space_tag_t, bus_space_handle_t,
264 bus_size_t, u_int64_t, bus_size_t);
265
266void bus_space_set_region_stream_1(bus_space_tag_t, bus_space_handle_t,
267 bus_size_t, u_int8_t, bus_size_t);
268void bus_space_set_region_stream_2(bus_space_tag_t, bus_space_handle_t,
269 bus_size_t, u_int16_t, bus_size_t);
270void bus_space_set_region_stream_4(bus_space_tag_t, bus_space_handle_t,
271 bus_size_t, u_int32_t, bus_size_t);
272void 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
275void 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);
278void 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);
281void 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);
284void 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
288void 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);
291void 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);
294void 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);
297void 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
301bool bus_space_is_equal(bus_space_tag_t, bus_space_tag_t);
302bool 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
331int bus_dmamap_create(bus_dma_tag_t, bus_size_t, int, bus_size_t,
332 bus_size_t, int, bus_dmamap_t *);
333void bus_dmamap_destroy(bus_dma_tag_t, bus_dmamap_t);
334int bus_dmamap_load(bus_dma_tag_t, bus_dmamap_t, void *, bus_size_t,
335 struct proc *, int);
336int bus_dmamap_load_mbuf(bus_dma_tag_t, bus_dmamap_t,
337 struct mbuf *, int);
338int bus_dmamap_load_uio(bus_dma_tag_t, bus_dmamap_t,
339 struct uio *, int);
340int bus_dmamap_load_raw(bus_dma_tag_t, bus_dmamap_t,
341 bus_dma_segment_t *, int, bus_size_t, int);
342void bus_dmamap_unload(bus_dma_tag_t, bus_dmamap_t);
343void bus_dmamap_sync(bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
344 bus_size_t, int);
345
346int 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);
349void bus_dmamem_free(bus_dma_tag_t, bus_dma_segment_t *, int);
350int bus_dmamem_map(bus_dma_tag_t, bus_dma_segment_t *, int,
351 size_t, void **, int);
352void bus_dmamem_unmap(bus_dma_tag_t, void *, size_t);
353paddr_t bus_dmamem_mmap(bus_dma_tag_t, bus_dma_segment_t *, int,
354 off_t, int, int);
355
356int bus_dmatag_subregion(bus_dma_tag_t, bus_addr_t, bus_addr_t,
357 bus_dma_tag_t *, int);
358void bus_dmatag_destroy(bus_dma_tag_t);
359
360#endif /* _SYS_BUS_PROTO_H_ */
361