1202031Simp/*	$NetBSD: bus.h,v 1.11 2003/07/28 17:35:54 thorpej Exp $	*/
2202031Simp
3178172Simp/*-
4202031Simp * Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc.
5178172Simp * All rights reserved.
6178172Simp *
7178172Simp * This code is derived from software contributed to The NetBSD Foundation
8178172Simp * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9178172Simp * NASA Ames Research Center.
10178172Simp *
11178172Simp * Redistribution and use in source and binary forms, with or without
12178172Simp * modification, are permitted provided that the following conditions
13178172Simp * are met:
14178172Simp * 1. Redistributions of source code must retain the above copyright
15178172Simp *    notice, this list of conditions and the following disclaimer.
16178172Simp * 2. Redistributions in binary form must reproduce the above copyright
17178172Simp *    notice, this list of conditions and the following disclaimer in the
18178172Simp *    documentation and/or other materials provided with the distribution.
19178172Simp *
20178172Simp * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21178172Simp * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22178172Simp * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23178172Simp * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24178172Simp * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25178172Simp * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26178172Simp * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27178172Simp * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28178172Simp * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29178172Simp * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30178172Simp * POSSIBILITY OF SUCH DAMAGE.
31178172Simp */
32178172Simp
33202031Simp/*-
34178172Simp * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
35178172Simp * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
36178172Simp *
37178172Simp * Redistribution and use in source and binary forms, with or without
38178172Simp * modification, are permitted provided that the following conditions
39178172Simp * are met:
40178172Simp * 1. Redistributions of source code must retain the above copyright
41178172Simp *    notice, this list of conditions and the following disclaimer.
42178172Simp * 2. Redistributions in binary form must reproduce the above copyright
43178172Simp *    notice, this list of conditions and the following disclaimer in the
44178172Simp *    documentation and/or other materials provided with the distribution.
45178172Simp * 3. All advertising materials mentioning features or use of this software
46178172Simp *    must display the following acknowledgement:
47178172Simp *      This product includes software developed by Christopher G. Demetriou
48178172Simp *	for the NetBSD Project.
49178172Simp * 4. The name of the author may not be used to endorse or promote products
50178172Simp *    derived from this software without specific prior written permission
51178172Simp *
52178172Simp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
53178172Simp * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
54178172Simp * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
55178172Simp * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
56178172Simp * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
57178172Simp * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
58178172Simp * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
59178172Simp * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
60178172Simp * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
61178172Simp * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
62178172Simp *
63178172Simp * $FreeBSD$
64202044Simp */
65178172Simp
66178172Simp#ifndef _MACHINE_BUS_H_
67202044Simp#define _MACHINE_BUS_H_
68178172Simp
69178172Simp#include <machine/_bus.h>
70178172Simp
71202044Simpstruct bus_space {
72202044Simp	/* cookie */
73202044Simp	void		*bs_cookie;
74178172Simp
75202044Simp	/* mapping/unmapping */
76202044Simp	int		(*bs_map) (void *, bus_addr_t, bus_size_t,
77202044Simp			    int, bus_space_handle_t *);
78202044Simp	void		(*bs_unmap) (void *, bus_space_handle_t, bus_size_t);
79202044Simp	int		(*bs_subregion) (void *, bus_space_handle_t,
80202044Simp			    bus_size_t, bus_size_t, bus_space_handle_t *);
81178172Simp
82202044Simp	/* allocation/deallocation */
83202044Simp	int		(*bs_alloc) (void *, bus_addr_t, bus_addr_t,
84202044Simp			    bus_size_t, bus_size_t, bus_size_t, int,
85202044Simp			    bus_addr_t *, bus_space_handle_t *);
86202044Simp	void		(*bs_free) (void *, bus_space_handle_t,
87202044Simp			    bus_size_t);
88178172Simp
89202044Simp	/* get kernel virtual address */
90202044Simp	/* barrier */
91202044Simp	void		(*bs_barrier) (void *, bus_space_handle_t,
92202044Simp			    bus_size_t, bus_size_t, int);
93178172Simp
94202044Simp	/* read (single) */
95202044Simp	u_int8_t	(*bs_r_1) (void *, bus_space_handle_t, bus_size_t);
96202044Simp	u_int16_t	(*bs_r_2) (void *, bus_space_handle_t, bus_size_t);
97202044Simp	u_int32_t	(*bs_r_4) (void *, bus_space_handle_t, bus_size_t);
98202044Simp	u_int64_t	(*bs_r_8) (void *, bus_space_handle_t, bus_size_t);
99178172Simp
100202044Simp	/* read multiple */
101202044Simp	void		(*bs_rm_1) (void *, bus_space_handle_t, bus_size_t,
102202044Simp	    u_int8_t *, bus_size_t);
103202044Simp	void		(*bs_rm_2) (void *, bus_space_handle_t, bus_size_t,
104202044Simp	    u_int16_t *, bus_size_t);
105202044Simp	void		(*bs_rm_4) (void *, bus_space_handle_t,
106202044Simp			    bus_size_t, u_int32_t *, bus_size_t);
107202044Simp	void		(*bs_rm_8) (void *, bus_space_handle_t,
108202044Simp			    bus_size_t, u_int64_t *, bus_size_t);
109202044Simp
110202044Simp	/* read region */
111202044Simp	void		(*bs_rr_1) (void *, bus_space_handle_t,
112202044Simp			    bus_size_t, u_int8_t *, bus_size_t);
113202044Simp	void		(*bs_rr_2) (void *, bus_space_handle_t,
114202044Simp			    bus_size_t, u_int16_t *, bus_size_t);
115202044Simp	void		(*bs_rr_4) (void *, bus_space_handle_t,
116202044Simp			    bus_size_t, u_int32_t *, bus_size_t);
117202044Simp	void		(*bs_rr_8) (void *, bus_space_handle_t,
118202044Simp			    bus_size_t, u_int64_t *, bus_size_t);
119202044Simp
120202044Simp	/* write (single) */
121202044Simp	void		(*bs_w_1) (void *, bus_space_handle_t,
122202044Simp			    bus_size_t, u_int8_t);
123202044Simp	void		(*bs_w_2) (void *, bus_space_handle_t,
124202044Simp			    bus_size_t, u_int16_t);
125202044Simp	void		(*bs_w_4) (void *, bus_space_handle_t,
126202044Simp			    bus_size_t, u_int32_t);
127202044Simp	void		(*bs_w_8) (void *, bus_space_handle_t,
128202044Simp			    bus_size_t, u_int64_t);
129178172Simp
130202044Simp	/* write multiple */
131202044Simp	void		(*bs_wm_1) (void *, bus_space_handle_t,
132202044Simp			    bus_size_t, const u_int8_t *, bus_size_t);
133202044Simp	void		(*bs_wm_2) (void *, bus_space_handle_t,
134202044Simp			    bus_size_t, const u_int16_t *, bus_size_t);
135202044Simp	void		(*bs_wm_4) (void *, bus_space_handle_t,
136202044Simp			    bus_size_t, const u_int32_t *, bus_size_t);
137202044Simp	void		(*bs_wm_8) (void *, bus_space_handle_t,
138202044Simp			    bus_size_t, const u_int64_t *, bus_size_t);
139202044Simp
140202044Simp	/* write region */
141202044Simp	void		(*bs_wr_1) (void *, bus_space_handle_t,
142202044Simp			    bus_size_t, const u_int8_t *, bus_size_t);
143202044Simp	void		(*bs_wr_2) (void *, bus_space_handle_t,
144202044Simp			    bus_size_t, const u_int16_t *, bus_size_t);
145202044Simp	void		(*bs_wr_4) (void *, bus_space_handle_t,
146202044Simp			    bus_size_t, const u_int32_t *, bus_size_t);
147202044Simp	void		(*bs_wr_8) (void *, bus_space_handle_t,
148202044Simp			    bus_size_t, const u_int64_t *, bus_size_t);
149178172Simp
150202044Simp	/* set multiple */
151202044Simp	void		(*bs_sm_1) (void *, bus_space_handle_t,
152202044Simp			    bus_size_t, u_int8_t, bus_size_t);
153202044Simp	void		(*bs_sm_2) (void *, bus_space_handle_t,
154202044Simp			    bus_size_t, u_int16_t, bus_size_t);
155202044Simp	void		(*bs_sm_4) (void *, bus_space_handle_t,
156202044Simp			    bus_size_t, u_int32_t, bus_size_t);
157202044Simp	void		(*bs_sm_8) (void *, bus_space_handle_t,
158202044Simp			    bus_size_t, u_int64_t, bus_size_t);
159178172Simp
160202044Simp	/* set region */
161202044Simp	void		(*bs_sr_1) (void *, bus_space_handle_t,
162202044Simp			    bus_size_t, u_int8_t, bus_size_t);
163202044Simp	void		(*bs_sr_2) (void *, bus_space_handle_t,
164202044Simp			    bus_size_t, u_int16_t, bus_size_t);
165202044Simp	void		(*bs_sr_4) (void *, bus_space_handle_t,
166202044Simp			    bus_size_t, u_int32_t, bus_size_t);
167202044Simp	void		(*bs_sr_8) (void *, bus_space_handle_t,
168202044Simp			    bus_size_t, u_int64_t, bus_size_t);
169178172Simp
170202044Simp	/* copy */
171202044Simp	void		(*bs_c_1) (void *, bus_space_handle_t, bus_size_t,
172202044Simp			    bus_space_handle_t, bus_size_t, bus_size_t);
173202044Simp	void		(*bs_c_2) (void *, bus_space_handle_t, bus_size_t,
174202044Simp			    bus_space_handle_t, bus_size_t, bus_size_t);
175202044Simp	void		(*bs_c_4) (void *, bus_space_handle_t, bus_size_t,
176202044Simp			    bus_space_handle_t, bus_size_t, bus_size_t);
177202044Simp	void		(*bs_c_8) (void *, bus_space_handle_t, bus_size_t,
178202044Simp			    bus_space_handle_t, bus_size_t, bus_size_t);
179178172Simp
180202044Simp	/* read stream (single) */
181202044Simp	u_int8_t	(*bs_r_1_s) (void *, bus_space_handle_t, bus_size_t);
182202044Simp	u_int16_t	(*bs_r_2_s) (void *, bus_space_handle_t, bus_size_t);
183202044Simp	u_int32_t	(*bs_r_4_s) (void *, bus_space_handle_t, bus_size_t);
184202044Simp	u_int64_t	(*bs_r_8_s) (void *, bus_space_handle_t, bus_size_t);
185178172Simp
186202044Simp	/* read multiple stream */
187202044Simp	void		(*bs_rm_1_s) (void *, bus_space_handle_t, bus_size_t,
188202044Simp	    u_int8_t *, bus_size_t);
189202044Simp	void		(*bs_rm_2_s) (void *, bus_space_handle_t, bus_size_t,
190202044Simp	    u_int16_t *, bus_size_t);
191202044Simp	void		(*bs_rm_4_s) (void *, bus_space_handle_t,
192202044Simp			    bus_size_t, u_int32_t *, bus_size_t);
193202044Simp	void		(*bs_rm_8_s) (void *, bus_space_handle_t,
194202044Simp			    bus_size_t, u_int64_t *, bus_size_t);
195202044Simp
196202044Simp	/* read region stream */
197202044Simp	void		(*bs_rr_1_s) (void *, bus_space_handle_t,
198202044Simp			    bus_size_t, u_int8_t *, bus_size_t);
199202044Simp	void		(*bs_rr_2_s) (void *, bus_space_handle_t,
200202044Simp			    bus_size_t, u_int16_t *, bus_size_t);
201202044Simp	void		(*bs_rr_4_s) (void *, bus_space_handle_t,
202202044Simp			    bus_size_t, u_int32_t *, bus_size_t);
203202044Simp	void		(*bs_rr_8_s) (void *, bus_space_handle_t,
204202044Simp			    bus_size_t, u_int64_t *, bus_size_t);
205202044Simp
206202044Simp	/* write stream (single) */
207202044Simp	void		(*bs_w_1_s) (void *, bus_space_handle_t,
208202044Simp			    bus_size_t, u_int8_t);
209202044Simp	void		(*bs_w_2_s) (void *, bus_space_handle_t,
210202044Simp			    bus_size_t, u_int16_t);
211202044Simp	void		(*bs_w_4_s) (void *, bus_space_handle_t,
212202044Simp			    bus_size_t, u_int32_t);
213202044Simp	void		(*bs_w_8_s) (void *, bus_space_handle_t,
214202044Simp			    bus_size_t, u_int64_t);
215178172Simp
216202044Simp	/* write multiple stream */
217202044Simp	void		(*bs_wm_1_s) (void *, bus_space_handle_t,
218202044Simp			    bus_size_t, const u_int8_t *, bus_size_t);
219202044Simp	void		(*bs_wm_2_s) (void *, bus_space_handle_t,
220202044Simp			    bus_size_t, const u_int16_t *, bus_size_t);
221202044Simp	void		(*bs_wm_4_s) (void *, bus_space_handle_t,
222202044Simp			    bus_size_t, const u_int32_t *, bus_size_t);
223202044Simp	void		(*bs_wm_8_s) (void *, bus_space_handle_t,
224202044Simp			    bus_size_t, const u_int64_t *, bus_size_t);
225202044Simp
226202044Simp	/* write region stream */
227202044Simp	void		(*bs_wr_1_s) (void *, bus_space_handle_t,
228202044Simp			    bus_size_t, const u_int8_t *, bus_size_t);
229202044Simp	void		(*bs_wr_2_s) (void *, bus_space_handle_t,
230202044Simp			    bus_size_t, const u_int16_t *, bus_size_t);
231202044Simp	void		(*bs_wr_4_s) (void *, bus_space_handle_t,
232202044Simp			    bus_size_t, const u_int32_t *, bus_size_t);
233202044Simp	void		(*bs_wr_8_s) (void *, bus_space_handle_t,
234202044Simp			    bus_size_t, const u_int64_t *, bus_size_t);
235202044Simp};
236178172Simp
237178172Simp
238178172Simp/*
239202044Simp * Utility macros; INTERNAL USE ONLY.
240178172Simp */
241202044Simp#define	__bs_c(a,b)		__CONCAT(a,b)
242202044Simp#define	__bs_opname(op,size)	__bs_c(__bs_c(__bs_c(bs_,op),_),size)
243178172Simp
244202044Simp#define	__bs_rs(sz, t, h, o)						\
245202044Simp	(*(t)->__bs_opname(r,sz))((t)->bs_cookie, h, o)
246202044Simp#define	__bs_ws(sz, t, h, o, v)						\
247202044Simp	(*(t)->__bs_opname(w,sz))((t)->bs_cookie, h, o, v)
248202044Simp#define	__bs_nonsingle(type, sz, t, h, o, a, c)				\
249202044Simp	(*(t)->__bs_opname(type,sz))((t)->bs_cookie, h, o, a, c)
250202044Simp#define	__bs_set(type, sz, t, h, o, v, c)				\
251202044Simp	(*(t)->__bs_opname(type,sz))((t)->bs_cookie, h, o, v, c)
252202044Simp#define	__bs_copy(sz, t, h1, o1, h2, o2, cnt)				\
253202044Simp	(*(t)->__bs_opname(c,sz))((t)->bs_cookie, h1, o1, h2, o2, cnt)
254178172Simp
255202044Simp#define	__bs_opname_s(op,size)	__bs_c(__bs_c(__bs_c(__bs_c(bs_,op),_),size),_s)
256202044Simp#define	__bs_rs_s(sz, t, h, o)						\
257202044Simp	(*(t)->__bs_opname_s(r,sz))((t)->bs_cookie, h, o)
258202044Simp#define	__bs_ws_s(sz, t, h, o, v)					\
259202044Simp	(*(t)->__bs_opname_s(w,sz))((t)->bs_cookie, h, o, v)
260202044Simp#define	__bs_nonsingle_s(type, sz, t, h, o, a, c)			\
261202044Simp	(*(t)->__bs_opname_s(type,sz))((t)->bs_cookie, h, o, a, c)
262178172Simp
263202044Simp
264178172Simp/*
265202044Simp * Mapping and unmapping operations.
266178172Simp */
267202044Simp#define	bus_space_map(t, a, s, c, hp)					\
268202044Simp	(*(t)->bs_map)((t)->bs_cookie, (a), (s), (c), (hp))
269202044Simp#define	bus_space_unmap(t, h, s)					\
270202044Simp	(*(t)->bs_unmap)((t)->bs_cookie, (h), (s))
271202044Simp#define	bus_space_subregion(t, h, o, s, hp)				\
272202044Simp	(*(t)->bs_subregion)((t)->bs_cookie, (h), (o), (s), (hp))
273178172Simp
274178172Simp
275202044Simp/*
276202044Simp * Allocation and deallocation operations.
277202044Simp */
278202044Simp#define	bus_space_alloc(t, rs, re, s, a, b, c, ap, hp)			\
279202044Simp	(*(t)->bs_alloc)((t)->bs_cookie, (rs), (re), (s), (a), (b),	\
280202044Simp	    (c), (ap), (hp))
281202044Simp#define	bus_space_free(t, h, s)						\
282202044Simp	(*(t)->bs_free)((t)->bs_cookie, (h), (s))
283178172Simp
284202044Simp/*
285202044Simp * Bus barrier operations.
286202044Simp */
287202044Simp#define	bus_space_barrier(t, h, o, l, f)				\
288202044Simp	(*(t)->bs_barrier)((t)->bs_cookie, (h), (o), (l), (f))
289178172Simp
290202044Simp#define	BUS_SPACE_BARRIER_READ	0x01
291202044Simp#define	BUS_SPACE_BARRIER_WRITE	0x02
292178172Simp
293202044Simp/*
294202044Simp * Bus read (single) operations.
295202044Simp */
296202044Simp#define	bus_space_read_1(t, h, o)	__bs_rs(1,(t),(h),(o))
297202044Simp#define	bus_space_read_2(t, h, o)	__bs_rs(2,(t),(h),(o))
298202044Simp#define	bus_space_read_4(t, h, o)	__bs_rs(4,(t),(h),(o))
299202044Simp#define	bus_space_read_8(t, h, o)	__bs_rs(8,(t),(h),(o))
300178172Simp
301202044Simp#define bus_space_read_stream_1(t, h, o)        __bs_rs_s(1,(t), (h), (o))
302202044Simp#define bus_space_read_stream_2(t, h, o)        __bs_rs_s(2,(t), (h), (o))
303202044Simp#define bus_space_read_stream_4(t, h, o)        __bs_rs_s(4,(t), (h), (o))
304202044Simp#define	bus_space_read_stream_8(t, h, o)	__bs_rs_s(8,8,(t),(h),(o))
305178172Simp
306202044Simp/*
307202044Simp * Bus read multiple operations.
308202044Simp */
309202044Simp#define	bus_space_read_multi_1(t, h, o, a, c)				\
310202044Simp	__bs_nonsingle(rm,1,(t),(h),(o),(a),(c))
311202044Simp#define	bus_space_read_multi_2(t, h, o, a, c)				\
312202044Simp	__bs_nonsingle(rm,2,(t),(h),(o),(a),(c))
313202044Simp#define	bus_space_read_multi_4(t, h, o, a, c)				\
314202044Simp	__bs_nonsingle(rm,4,(t),(h),(o),(a),(c))
315202044Simp#define	bus_space_read_multi_8(t, h, o, a, c)				\
316202044Simp	__bs_nonsingle(rm,8,(t),(h),(o),(a),(c))
317178172Simp
318202044Simp#define	bus_space_read_multi_stream_1(t, h, o, a, c)			\
319202044Simp	__bs_nonsingle_s(rm,1,(t),(h),(o),(a),(c))
320202044Simp#define	bus_space_read_multi_stream_2(t, h, o, a, c)			\
321202044Simp	__bs_nonsingle_s(rm,2,(t),(h),(o),(a),(c))
322202044Simp#define	bus_space_read_multi_stream_4(t, h, o, a, c)			\
323202044Simp	__bs_nonsingle_s(rm,4,(t),(h),(o),(a),(c))
324202044Simp#define	bus_space_read_multi_stream_8(t, h, o, a, c)			\
325202044Simp	__bs_nonsingle_s(rm,8,(t),(h),(o),(a),(c))
326178172Simp
327178172Simp
328178172Simp/*
329202044Simp * Bus read region operations.
330178172Simp */
331202044Simp#define	bus_space_read_region_1(t, h, o, a, c)				\
332202044Simp	__bs_nonsingle(rr,1,(t),(h),(o),(a),(c))
333202044Simp#define	bus_space_read_region_2(t, h, o, a, c)				\
334202044Simp	__bs_nonsingle(rr,2,(t),(h),(o),(a),(c))
335202044Simp#define	bus_space_read_region_4(t, h, o, a, c)				\
336202044Simp	__bs_nonsingle(rr,4,(t),(h),(o),(a),(c))
337202044Simp#define	bus_space_read_region_8(t, h, o, a, c)				\
338202044Simp	__bs_nonsingle(rr,8,(t),(h),(o),(a),(c))
339178172Simp
340202044Simp#define	bus_space_read_region_stream_1(t, h, o, a, c)			\
341202044Simp	__bs_nonsingle_s(rr,1,(t),(h),(o),(a),(c))
342202044Simp#define	bus_space_read_region_stream_2(t, h, o, a, c)			\
343202044Simp	__bs_nonsingle_s(rr,2,(t),(h),(o),(a),(c))
344202044Simp#define	bus_space_read_region_stream_4(t, h, o, a, c)			\
345202044Simp	__bs_nonsingle_s(rr,4,(t),(h),(o),(a),(c))
346202044Simp#define	bus_space_read_region_stream_8(t, h, o, a, c)			\
347202044Simp	__bs_nonsingle_s(rr,8,(t),(h),(o),(a),(c))
348178172Simp
349178172Simp
350202044Simp/*
351202044Simp * Bus write (single) operations.
352202044Simp */
353202044Simp#define	bus_space_write_1(t, h, o, v)	__bs_ws(1,(t),(h),(o),(v))
354202044Simp#define	bus_space_write_2(t, h, o, v)	__bs_ws(2,(t),(h),(o),(v))
355202044Simp#define	bus_space_write_4(t, h, o, v)	__bs_ws(4,(t),(h),(o),(v))
356202044Simp#define	bus_space_write_8(t, h, o, v)	__bs_ws(8,(t),(h),(o),(v))
357178172Simp
358202044Simp#define	bus_space_write_stream_1(t, h, o, v)	__bs_ws_s(1,(t),(h),(o),(v))
359202044Simp#define	bus_space_write_stream_2(t, h, o, v)	__bs_ws_s(2,(t),(h),(o),(v))
360202044Simp#define	bus_space_write_stream_4(t, h, o, v)	__bs_ws_s(4,(t),(h),(o),(v))
361202044Simp#define	bus_space_write_stream_8(t, h, o, v)	__bs_ws_s(8,(t),(h),(o),(v))
362178172Simp
363178172Simp
364202044Simp/*
365202044Simp * Bus write multiple operations.
366202044Simp */
367202044Simp#define	bus_space_write_multi_1(t, h, o, a, c)				\
368202044Simp	__bs_nonsingle(wm,1,(t),(h),(o),(a),(c))
369202044Simp#define	bus_space_write_multi_2(t, h, o, a, c)				\
370202044Simp	__bs_nonsingle(wm,2,(t),(h),(o),(a),(c))
371202044Simp#define	bus_space_write_multi_4(t, h, o, a, c)				\
372202044Simp	__bs_nonsingle(wm,4,(t),(h),(o),(a),(c))
373202044Simp#define	bus_space_write_multi_8(t, h, o, a, c)				\
374202044Simp	__bs_nonsingle(wm,8,(t),(h),(o),(a),(c))
375178172Simp
376202044Simp#define	bus_space_write_multi_stream_1(t, h, o, a, c)			\
377202044Simp	__bs_nonsingle_s(wm,1,(t),(h),(o),(a),(c))
378202044Simp#define	bus_space_write_multi_stream_2(t, h, o, a, c)			\
379202044Simp	__bs_nonsingle_s(wm,2,(t),(h),(o),(a),(c))
380202044Simp#define	bus_space_write_multi_stream_4(t, h, o, a, c)			\
381202044Simp	__bs_nonsingle_s(wm,4,(t),(h),(o),(a),(c))
382202044Simp#define	bus_space_write_multi_stream_8(t, h, o, a, c)			\
383202044Simp	__bs_nonsingle_s(wm,8,(t),(h),(o),(a),(c))
384178172Simp
385178172Simp
386178172Simp/*
387202044Simp * Bus write region operations.
388178172Simp */
389202044Simp#define	bus_space_write_region_1(t, h, o, a, c)				\
390202044Simp	__bs_nonsingle(wr,1,(t),(h),(o),(a),(c))
391202044Simp#define	bus_space_write_region_2(t, h, o, a, c)				\
392202044Simp	__bs_nonsingle(wr,2,(t),(h),(o),(a),(c))
393202044Simp#define	bus_space_write_region_4(t, h, o, a, c)				\
394202044Simp	__bs_nonsingle(wr,4,(t),(h),(o),(a),(c))
395202044Simp#define	bus_space_write_region_8(t, h, o, a, c)				\
396202044Simp	__bs_nonsingle(wr,8,(t),(h),(o),(a),(c))
397178172Simp
398202044Simp#define	bus_space_write_region_stream_1(t, h, o, a, c)			\
399202044Simp	__bs_nonsingle_s(wr,1,(t),(h),(o),(a),(c))
400202044Simp#define	bus_space_write_region_stream_2(t, h, o, a, c)			\
401202044Simp	__bs_nonsingle_s(wr,2,(t),(h),(o),(a),(c))
402202044Simp#define	bus_space_write_region_stream_4(t, h, o, a, c)			\
403202044Simp	__bs_nonsingle_s(wr,4,(t),(h),(o),(a),(c))
404202044Simp#define	bus_space_write_region_stream_8(t, h, o, a, c)			\
405202044Simp	__bs_nonsingle_s(wr,8,(t),(h),(o),(a),(c))
406178172Simp
407178172Simp
408202044Simp/*
409202044Simp * Set multiple operations.
410202044Simp */
411216143Sbrucec#define	bus_space_set_multi_1(t, h, o, v, c)				\
412202044Simp	__bs_set(sm,1,(t),(h),(o),(v),(c))
413216143Sbrucec#define	bus_space_set_multi_2(t, h, o, v, c)				\
414202044Simp	__bs_set(sm,2,(t),(h),(o),(v),(c))
415216143Sbrucec#define	bus_space_set_multi_4(t, h, o, v, c)				\
416202044Simp	__bs_set(sm,4,(t),(h),(o),(v),(c))
417216143Sbrucec#define	bus_space_set_multi_8(t, h, o, v, c)				\
418202044Simp	__bs_set(sm,8,(t),(h),(o),(v),(c))
419178172Simp
420178172Simp
421202044Simp/*
422202044Simp * Set region operations.
423202044Simp */
424202044Simp#define	bus_space_set_region_1(t, h, o, v, c)				\
425202044Simp	__bs_set(sr,1,(t),(h),(o),(v),(c))
426202044Simp#define	bus_space_set_region_2(t, h, o, v, c)				\
427202044Simp	__bs_set(sr,2,(t),(h),(o),(v),(c))
428202044Simp#define	bus_space_set_region_4(t, h, o, v, c)				\
429202044Simp	__bs_set(sr,4,(t),(h),(o),(v),(c))
430202044Simp#define	bus_space_set_region_8(t, h, o, v, c)				\
431202044Simp	__bs_set(sr,8,(t),(h),(o),(v),(c))
432178172Simp
433178172Simp
434178172Simp/*
435202044Simp * Copy operations.
436178172Simp */
437216143Sbrucec#define	bus_space_copy_region_1(t, h1, o1, h2, o2, c)				\
438202044Simp	__bs_copy(1, t, h1, o1, h2, o2, c)
439216143Sbrucec#define	bus_space_copy_region_2(t, h1, o1, h2, o2, c)				\
440202044Simp	__bs_copy(2, t, h1, o1, h2, o2, c)
441216143Sbrucec#define	bus_space_copy_region_4(t, h1, o1, h2, o2, c)				\
442202044Simp	__bs_copy(4, t, h1, o1, h2, o2, c)
443216143Sbrucec#define	bus_space_copy_region_8(t, h1, o1, h2, o2, c)				\
444202044Simp	__bs_copy(8, t, h1, o1, h2, o2, c)
445178172Simp
446178172Simp/*
447202044Simp * Macros to provide prototypes for all the functions used in the
448202044Simp * bus_space structure
449178172Simp */
450178172Simp
451202044Simp#define bs_map_proto(f)							\
452202044Simpint	__bs_c(f,_bs_map) (void *t, bus_addr_t addr,		\
453202044Simp	    bus_size_t size, int cacheable, bus_space_handle_t *bshp);
454178172Simp
455202044Simp#define bs_unmap_proto(f)						\
456202044Simpvoid	__bs_c(f,_bs_unmap) (void *t, bus_space_handle_t bsh,		\
457202044Simp	    bus_size_t size);
458178172Simp
459202044Simp#define bs_subregion_proto(f)						\
460202044Simpint	__bs_c(f,_bs_subregion) (void *t, bus_space_handle_t bsh,	\
461202044Simp	    bus_size_t offset, bus_size_t size, 			\
462202044Simp	    bus_space_handle_t *nbshp);
463178172Simp
464202044Simp#define bs_alloc_proto(f)						\
465202044Simpint	__bs_c(f,_bs_alloc) (void *t, bus_addr_t rstart,		\
466202044Simp	    bus_addr_t rend, bus_size_t size, bus_size_t align,		\
467202044Simp	    bus_size_t boundary, int cacheable, bus_addr_t *addrp,	\
468202044Simp	    bus_space_handle_t *bshp);
469178172Simp
470202044Simp#define bs_free_proto(f)						\
471202044Simpvoid	__bs_c(f,_bs_free) (void *t, bus_space_handle_t bsh,	\
472202044Simp	    bus_size_t size);
473178172Simp
474202044Simp#define bs_barrier_proto(f)						\
475202044Simpvoid	__bs_c(f,_bs_barrier) (void *t, bus_space_handle_t bsh,	\
476202044Simp	    bus_size_t offset, bus_size_t len, int flags);
477178172Simp
478202044Simp#define	bs_r_1_proto(f)							\
479202044Simpu_int8_t	__bs_c(f,_bs_r_1) (void *t, bus_space_handle_t bsh,	\
480202044Simp		    bus_size_t offset);
481178172Simp
482202044Simp#define	bs_r_2_proto(f)							\
483202044Simpu_int16_t	__bs_c(f,_bs_r_2) (void *t, bus_space_handle_t bsh,	\
484202044Simp		    bus_size_t offset);
485178172Simp
486202044Simp#define	bs_r_4_proto(f)							\
487202044Simpu_int32_t	__bs_c(f,_bs_r_4) (void *t, bus_space_handle_t bsh,	\
488202044Simp		    bus_size_t offset);
489178172Simp
490202044Simp#define	bs_r_8_proto(f)							\
491202044Simpu_int64_t	__bs_c(f,_bs_r_8) (void *t, bus_space_handle_t bsh,	\
492202044Simp		    bus_size_t offset);
493178172Simp
494202044Simp#define	bs_r_1_s_proto(f)						\
495202044Simpu_int8_t	__bs_c(f,_bs_r_1_s) (void *t, bus_space_handle_t bsh,	\
496202044Simp		    bus_size_t offset);
497178172Simp
498202044Simp#define	bs_r_2_s_proto(f)						\
499202044Simpu_int16_t	__bs_c(f,_bs_r_2_s) (void *t, bus_space_handle_t bsh,	\
500202044Simp		    bus_size_t offset);
501178172Simp
502202044Simp#define	bs_r_4_s_proto(f)						\
503202044Simpu_int32_t	__bs_c(f,_bs_r_4_s) (void *t, bus_space_handle_t bsh,	\
504202044Simp		    bus_size_t offset);
505178172Simp
506202044Simp#define	bs_w_1_proto(f)							\
507202044Simpvoid	__bs_c(f,_bs_w_1) (void *t, bus_space_handle_t bsh,		\
508202044Simp	    bus_size_t offset, u_int8_t value);
509178172Simp
510202044Simp#define	bs_w_2_proto(f)							\
511202044Simpvoid	__bs_c(f,_bs_w_2) (void *t, bus_space_handle_t bsh,		\
512202044Simp	    bus_size_t offset, u_int16_t value);
513178172Simp
514202044Simp#define	bs_w_4_proto(f)							\
515202044Simpvoid	__bs_c(f,_bs_w_4) (void *t, bus_space_handle_t bsh,		\
516202044Simp	    bus_size_t offset, u_int32_t value);
517178172Simp
518202044Simp#define	bs_w_8_proto(f)							\
519202044Simpvoid	__bs_c(f,_bs_w_8) (void *t, bus_space_handle_t bsh,		\
520202044Simp	    bus_size_t offset, u_int64_t value);
521178172Simp
522202044Simp#define	bs_w_1_s_proto(f)						\
523202044Simpvoid	__bs_c(f,_bs_w_1_s) (void *t, bus_space_handle_t bsh,		\
524202044Simp	    bus_size_t offset, u_int8_t value);
525178172Simp
526202044Simp#define	bs_w_2_s_proto(f)						\
527202044Simpvoid	__bs_c(f,_bs_w_2_s) (void *t, bus_space_handle_t bsh,		\
528202044Simp	    bus_size_t offset, u_int16_t value);
529178172Simp
530202044Simp#define	bs_w_4_s_proto(f)						\
531202044Simpvoid	__bs_c(f,_bs_w_4_s) (void *t, bus_space_handle_t bsh,		\
532202044Simp	    bus_size_t offset, u_int32_t value);
533178172Simp
534202044Simp#define	bs_rm_1_proto(f)						\
535202044Simpvoid	__bs_c(f,_bs_rm_1) (void *t, bus_space_handle_t bsh,	\
536202044Simp	    bus_size_t offset, u_int8_t *addr, bus_size_t count);
537178172Simp
538202044Simp#define	bs_rm_2_proto(f)						\
539202044Simpvoid	__bs_c(f,_bs_rm_2) (void *t, bus_space_handle_t bsh,	\
540202044Simp	    bus_size_t offset, u_int16_t *addr, bus_size_t count);
541178172Simp
542202044Simp#define	bs_rm_4_proto(f)						\
543202044Simpvoid	__bs_c(f,_bs_rm_4) (void *t, bus_space_handle_t bsh,	\
544202044Simp	    bus_size_t offset, u_int32_t *addr, bus_size_t count);
545178172Simp
546202044Simp#define	bs_rm_8_proto(f)						\
547202044Simpvoid	__bs_c(f,_bs_rm_8) (void *t, bus_space_handle_t bsh,	\
548202044Simp	    bus_size_t offset, u_int64_t *addr, bus_size_t count);
549178172Simp
550202044Simp#define	bs_wm_1_proto(f)						\
551202044Simpvoid	__bs_c(f,_bs_wm_1) (void *t, bus_space_handle_t bsh,	\
552202044Simp	    bus_size_t offset, const u_int8_t *addr, bus_size_t count);
553178172Simp
554202044Simp#define	bs_wm_2_proto(f)						\
555202044Simpvoid	__bs_c(f,_bs_wm_2) (void *t, bus_space_handle_t bsh,	\
556202044Simp	    bus_size_t offset, const u_int16_t *addr, bus_size_t count);
557178172Simp
558202044Simp#define	bs_wm_4_proto(f)						\
559202044Simpvoid	__bs_c(f,_bs_wm_4) (void *t, bus_space_handle_t bsh,	\
560202044Simp	    bus_size_t offset, const u_int32_t *addr, bus_size_t count);
561178172Simp
562202044Simp#define	bs_wm_8_proto(f)						\
563202044Simpvoid	__bs_c(f,_bs_wm_8) (void *t, bus_space_handle_t bsh,	\
564202044Simp	    bus_size_t offset, const u_int64_t *addr, bus_size_t count);
565178172Simp
566202044Simp#define	bs_rr_1_proto(f)						\
567202044Simpvoid	__bs_c(f, _bs_rr_1) (void *t, bus_space_handle_t bsh,	\
568202044Simp	    bus_size_t offset, u_int8_t *addr, bus_size_t count);
569178172Simp
570202044Simp#define	bs_rr_2_proto(f)						\
571202044Simpvoid	__bs_c(f, _bs_rr_2) (void *t, bus_space_handle_t bsh,	\
572202044Simp	    bus_size_t offset, u_int16_t *addr, bus_size_t count);
573178172Simp
574202044Simp#define	bs_rr_4_proto(f)						\
575202044Simpvoid	__bs_c(f, _bs_rr_4) (void *t, bus_space_handle_t bsh,	\
576202044Simp	    bus_size_t offset, u_int32_t *addr, bus_size_t count);
577178172Simp
578202044Simp#define	bs_rr_8_proto(f)						\
579202044Simpvoid	__bs_c(f, _bs_rr_8) (void *t, bus_space_handle_t bsh,	\
580202044Simp	    bus_size_t offset, u_int64_t *addr, bus_size_t count);
581178172Simp
582202044Simp#define	bs_wr_1_proto(f)						\
583202044Simpvoid	__bs_c(f, _bs_wr_1) (void *t, bus_space_handle_t bsh,	\
584202044Simp	    bus_size_t offset, const u_int8_t *addr, bus_size_t count);
585178172Simp
586202044Simp#define	bs_wr_2_proto(f)						\
587202044Simpvoid	__bs_c(f, _bs_wr_2) (void *t, bus_space_handle_t bsh,	\
588202044Simp	    bus_size_t offset, const u_int16_t *addr, bus_size_t count);
589178172Simp
590202044Simp#define	bs_wr_4_proto(f)						\
591202044Simpvoid	__bs_c(f, _bs_wr_4) (void *t, bus_space_handle_t bsh,	\
592202044Simp	    bus_size_t offset, const u_int32_t *addr, bus_size_t count);
593178172Simp
594202044Simp#define	bs_wr_8_proto(f)						\
595202044Simpvoid	__bs_c(f, _bs_wr_8) (void *t, bus_space_handle_t bsh,	\
596202044Simp	    bus_size_t offset, const u_int64_t *addr, bus_size_t count);
597178172Simp
598202044Simp#define	bs_sm_1_proto(f)						\
599202044Simpvoid	__bs_c(f,_bs_sm_1) (void *t, bus_space_handle_t bsh,	\
600202044Simp	    bus_size_t offset, u_int8_t value, bus_size_t count);
601178172Simp
602202044Simp#define	bs_sm_2_proto(f)						\
603202044Simpvoid	__bs_c(f,_bs_sm_2) (void *t, bus_space_handle_t bsh,	\
604202044Simp	    bus_size_t offset, u_int16_t value, bus_size_t count);
605178172Simp
606202044Simp#define	bs_sm_4_proto(f)						\
607202044Simpvoid	__bs_c(f,_bs_sm_4) (void *t, bus_space_handle_t bsh,	\
608202044Simp	    bus_size_t offset, u_int32_t value, bus_size_t count);
609178172Simp
610202044Simp#define	bs_sm_8_proto(f)						\
611202044Simpvoid	__bs_c(f,_bs_sm_8) (void *t, bus_space_handle_t bsh,	\
612202044Simp	    bus_size_t offset, u_int64_t value, bus_size_t count);
613178172Simp
614202044Simp#define	bs_sr_1_proto(f)						\
615202044Simpvoid	__bs_c(f,_bs_sr_1) (void *t, bus_space_handle_t bsh,	\
616202044Simp	    bus_size_t offset, u_int8_t value, bus_size_t count);
617178172Simp
618202044Simp#define	bs_sr_2_proto(f)						\
619202044Simpvoid	__bs_c(f,_bs_sr_2) (void *t, bus_space_handle_t bsh,	\
620202044Simp	    bus_size_t offset, u_int16_t value, bus_size_t count);
621178172Simp
622202044Simp#define	bs_sr_4_proto(f)						\
623202044Simpvoid	__bs_c(f,_bs_sr_4) (void *t, bus_space_handle_t bsh,	\
624202044Simp	    bus_size_t offset, u_int32_t value, bus_size_t count);
625178172Simp
626202044Simp#define	bs_sr_8_proto(f)						\
627202044Simpvoid	__bs_c(f,_bs_sr_8) (void *t, bus_space_handle_t bsh,	\
628202044Simp	    bus_size_t offset, u_int64_t value, bus_size_t count);
629178172Simp
630202044Simp#define	bs_c_1_proto(f)							\
631202044Simpvoid	__bs_c(f,_bs_c_1) (void *t, bus_space_handle_t bsh1,	\
632202044Simp	    bus_size_t offset1, bus_space_handle_t bsh2,		\
633202044Simp	    bus_size_t offset2, bus_size_t count);
634178172Simp
635202044Simp#define	bs_c_2_proto(f)							\
636202044Simpvoid	__bs_c(f,_bs_c_2) (void *t, bus_space_handle_t bsh1,	\
637202044Simp	    bus_size_t offset1, bus_space_handle_t bsh2,		\
638202044Simp	    bus_size_t offset2, bus_size_t count);
639178172Simp
640202044Simp#define	bs_c_4_proto(f)							\
641202044Simpvoid	__bs_c(f,_bs_c_4) (void *t, bus_space_handle_t bsh1,	\
642202044Simp	    bus_size_t offset1, bus_space_handle_t bsh2,		\
643202044Simp	    bus_size_t offset2, bus_size_t count);
644178172Simp
645202044Simp#define	bs_c_8_proto(f)							\
646202044Simpvoid	__bs_c(f,_bs_c_8) (void *t, bus_space_handle_t bsh1,	\
647202044Simp	    bus_size_t offset1, bus_space_handle_t bsh2,		\
648202044Simp	    bus_size_t offset2, bus_size_t count);
649178172Simp
650202044Simp#define DECLARE_BUS_SPACE_PROTOTYPES(f)		\
651202044Simp	bs_map_proto(f);			\
652202044Simp	bs_unmap_proto(f);			\
653202044Simp	bs_subregion_proto(f);			\
654202044Simp	bs_alloc_proto(f);			\
655202044Simp	bs_free_proto(f);			\
656202044Simp	bs_barrier_proto(f);			\
657202044Simp	bs_r_1_proto(f);			\
658202044Simp	bs_r_2_proto(f);			\
659202044Simp	bs_r_4_proto(f);			\
660202044Simp	bs_r_8_proto(f);			\
661202044Simp	bs_r_1_s_proto(f);			\
662202044Simp	bs_r_2_s_proto(f);			\
663202044Simp	bs_r_4_s_proto(f);			\
664202044Simp	bs_w_1_proto(f);			\
665202044Simp	bs_w_2_proto(f);			\
666202044Simp	bs_w_4_proto(f);			\
667202044Simp	bs_w_8_proto(f);			\
668202044Simp	bs_w_1_s_proto(f);			\
669202044Simp	bs_w_2_s_proto(f);			\
670202044Simp	bs_w_4_s_proto(f);			\
671202044Simp	bs_rm_1_proto(f);			\
672202044Simp	bs_rm_2_proto(f);			\
673202044Simp	bs_rm_4_proto(f);			\
674202044Simp	bs_rm_8_proto(f);			\
675202044Simp	bs_wm_1_proto(f);			\
676202044Simp	bs_wm_2_proto(f);			\
677202044Simp	bs_wm_4_proto(f);			\
678202044Simp	bs_wm_8_proto(f);			\
679202044Simp	bs_rr_1_proto(f);			\
680202044Simp	bs_rr_2_proto(f);			\
681202044Simp	bs_rr_4_proto(f);			\
682202044Simp	bs_rr_8_proto(f);			\
683202044Simp	bs_wr_1_proto(f);			\
684202044Simp	bs_wr_2_proto(f);			\
685202044Simp	bs_wr_4_proto(f);			\
686202044Simp	bs_wr_8_proto(f);			\
687202044Simp	bs_sm_1_proto(f);			\
688202044Simp	bs_sm_2_proto(f);			\
689202044Simp	bs_sm_4_proto(f);			\
690202044Simp	bs_sm_8_proto(f);			\
691202044Simp	bs_sr_1_proto(f);			\
692202044Simp	bs_sr_2_proto(f);			\
693202044Simp	bs_sr_4_proto(f);			\
694202044Simp	bs_sr_8_proto(f);			\
695202044Simp	bs_c_1_proto(f);			\
696202044Simp	bs_c_2_proto(f);			\
697202044Simp	bs_c_4_proto(f);			\
698202044Simp	bs_c_8_proto(f);
699178172Simp
700202044Simp#define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
701178172Simp
702202044Simp#define BUS_SPACE_MAXADDR_24BIT	0xFFFFFF
703232881Sjmallett#define BUS_SPACE_MAXSIZE_24BIT	0xFFFFFF
704232881Sjmallett
705202044Simp#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
706202044Simp#define BUS_SPACE_MAXSIZE_32BIT	0xFFFFFFFF
707178172Simp
708232881Sjmallett#if defined(__mips_n64)
709232881Sjmallett#define BUS_SPACE_MAXADDR 	0xFFFFFFFFFFFFFFFFUL
710232881Sjmallett#define BUS_SPACE_MAXSIZE 	0xFFFFFFFFFFFFFFFFUL
711232881Sjmallett#else
712232881Sjmallett#define BUS_SPACE_MAXADDR 	0xFFFFFFFFUL
713232881Sjmallett#define BUS_SPACE_MAXSIZE 	0xFFFFFFFFUL
714232881Sjmallett#endif
715232881Sjmallett
716232881Sjmallett
717206404Simp#define BUS_SPACE_UNRESTRICTED	(~0)
718206404Simp
719202044Simp/*
720202044Simp * declare generic bus space, it suits all needs in
721202044Simp */
722202044SimpDECLARE_BUS_SPACE_PROTOTYPES(generic);
723202044Simpextern bus_space_tag_t mips_bus_space_generic;
724245332Srwatson
725202044Simp/* Special bus space for RMI processors */
726224115Sjchandra#if defined(CPU_RMI) || defined (CPU_NLM)
727202044Simpextern bus_space_tag_t rmi_bus_space;
728204577Srrsextern bus_space_tag_t rmi_pci_bus_space;
729226501Sjchandraextern bus_space_tag_t rmi_uart_bus_space;
730178172Simp#endif
731178172Simp
732178172Simp#include <machine/bus_dma.h>
733178172Simp
734202044Simp#endif /* _MACHINE_BUS_H_ */
735