bus.h revision 206404
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 * 3. All advertising materials mentioning features or use of this software
20178172Simp *    must display the following acknowledgement:
21178172Simp *	This product includes software developed by the NetBSD
22178172Simp *	Foundation, Inc. and its contributors.
23178172Simp * 4. Neither the name of The NetBSD Foundation nor the names of its
24178172Simp *    contributors may be used to endorse or promote products derived
25178172Simp *    from this software without specific prior written permission.
26178172Simp *
27178172Simp * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28178172Simp * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29178172Simp * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30178172Simp * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31178172Simp * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32178172Simp * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33178172Simp * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34178172Simp * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35178172Simp * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36178172Simp * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37178172Simp * POSSIBILITY OF SUCH DAMAGE.
38178172Simp */
39178172Simp
40202031Simp/*-
41178172Simp * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
42178172Simp * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
43178172Simp *
44178172Simp * Redistribution and use in source and binary forms, with or without
45178172Simp * modification, are permitted provided that the following conditions
46178172Simp * are met:
47178172Simp * 1. Redistributions of source code must retain the above copyright
48178172Simp *    notice, this list of conditions and the following disclaimer.
49178172Simp * 2. Redistributions in binary form must reproduce the above copyright
50178172Simp *    notice, this list of conditions and the following disclaimer in the
51178172Simp *    documentation and/or other materials provided with the distribution.
52178172Simp * 3. All advertising materials mentioning features or use of this software
53178172Simp *    must display the following acknowledgement:
54178172Simp *      This product includes software developed by Christopher G. Demetriou
55178172Simp *	for the NetBSD Project.
56178172Simp * 4. The name of the author may not be used to endorse or promote products
57178172Simp *    derived from this software without specific prior written permission
58178172Simp *
59178172Simp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
60178172Simp * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
61178172Simp * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
62178172Simp * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
63178172Simp * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
64178172Simp * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
65178172Simp * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
66178172Simp * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
67178172Simp * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
68178172Simp * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
69178172Simp *
70178172Simp * $FreeBSD: head/sys/mips/include/bus.h 206404 2010-04-08 19:34:55Z imp $
71202044Simp */
72178172Simp
73178172Simp#ifndef _MACHINE_BUS_H_
74202044Simp#define _MACHINE_BUS_H_
75178172Simp
76178172Simp#include <machine/_bus.h>
77178172Simp
78202044Simpstruct bus_space {
79202044Simp	/* cookie */
80202044Simp	void		*bs_cookie;
81178172Simp
82202044Simp	/* mapping/unmapping */
83202044Simp	int		(*bs_map) (void *, bus_addr_t, bus_size_t,
84202044Simp			    int, bus_space_handle_t *);
85202044Simp	void		(*bs_unmap) (void *, bus_space_handle_t, bus_size_t);
86202044Simp	int		(*bs_subregion) (void *, bus_space_handle_t,
87202044Simp			    bus_size_t, bus_size_t, bus_space_handle_t *);
88178172Simp
89202044Simp	/* allocation/deallocation */
90202044Simp	int		(*bs_alloc) (void *, bus_addr_t, bus_addr_t,
91202044Simp			    bus_size_t, bus_size_t, bus_size_t, int,
92202044Simp			    bus_addr_t *, bus_space_handle_t *);
93202044Simp	void		(*bs_free) (void *, bus_space_handle_t,
94202044Simp			    bus_size_t);
95178172Simp
96202044Simp	/* get kernel virtual address */
97202044Simp	/* barrier */
98202044Simp	void		(*bs_barrier) (void *, bus_space_handle_t,
99202044Simp			    bus_size_t, bus_size_t, int);
100178172Simp
101202044Simp	/* read (single) */
102202044Simp	u_int8_t	(*bs_r_1) (void *, bus_space_handle_t, bus_size_t);
103202044Simp	u_int16_t	(*bs_r_2) (void *, bus_space_handle_t, bus_size_t);
104202044Simp	u_int32_t	(*bs_r_4) (void *, bus_space_handle_t, bus_size_t);
105202044Simp	u_int64_t	(*bs_r_8) (void *, bus_space_handle_t, bus_size_t);
106178172Simp
107202044Simp	/* read multiple */
108202044Simp	void		(*bs_rm_1) (void *, bus_space_handle_t, bus_size_t,
109202044Simp	    u_int8_t *, bus_size_t);
110202044Simp	void		(*bs_rm_2) (void *, bus_space_handle_t, bus_size_t,
111202044Simp	    u_int16_t *, bus_size_t);
112202044Simp	void		(*bs_rm_4) (void *, bus_space_handle_t,
113202044Simp			    bus_size_t, u_int32_t *, bus_size_t);
114202044Simp	void		(*bs_rm_8) (void *, bus_space_handle_t,
115202044Simp			    bus_size_t, u_int64_t *, bus_size_t);
116202044Simp
117202044Simp	/* read region */
118202044Simp	void		(*bs_rr_1) (void *, bus_space_handle_t,
119202044Simp			    bus_size_t, u_int8_t *, bus_size_t);
120202044Simp	void		(*bs_rr_2) (void *, bus_space_handle_t,
121202044Simp			    bus_size_t, u_int16_t *, bus_size_t);
122202044Simp	void		(*bs_rr_4) (void *, bus_space_handle_t,
123202044Simp			    bus_size_t, u_int32_t *, bus_size_t);
124202044Simp	void		(*bs_rr_8) (void *, bus_space_handle_t,
125202044Simp			    bus_size_t, u_int64_t *, bus_size_t);
126202044Simp
127202044Simp	/* write (single) */
128202044Simp	void		(*bs_w_1) (void *, bus_space_handle_t,
129202044Simp			    bus_size_t, u_int8_t);
130202044Simp	void		(*bs_w_2) (void *, bus_space_handle_t,
131202044Simp			    bus_size_t, u_int16_t);
132202044Simp	void		(*bs_w_4) (void *, bus_space_handle_t,
133202044Simp			    bus_size_t, u_int32_t);
134202044Simp	void		(*bs_w_8) (void *, bus_space_handle_t,
135202044Simp			    bus_size_t, u_int64_t);
136178172Simp
137202044Simp	/* write multiple */
138202044Simp	void		(*bs_wm_1) (void *, bus_space_handle_t,
139202044Simp			    bus_size_t, const u_int8_t *, bus_size_t);
140202044Simp	void		(*bs_wm_2) (void *, bus_space_handle_t,
141202044Simp			    bus_size_t, const u_int16_t *, bus_size_t);
142202044Simp	void		(*bs_wm_4) (void *, bus_space_handle_t,
143202044Simp			    bus_size_t, const u_int32_t *, bus_size_t);
144202044Simp	void		(*bs_wm_8) (void *, bus_space_handle_t,
145202044Simp			    bus_size_t, const u_int64_t *, bus_size_t);
146202044Simp
147202044Simp	/* write region */
148202044Simp	void		(*bs_wr_1) (void *, bus_space_handle_t,
149202044Simp			    bus_size_t, const u_int8_t *, bus_size_t);
150202044Simp	void		(*bs_wr_2) (void *, bus_space_handle_t,
151202044Simp			    bus_size_t, const u_int16_t *, bus_size_t);
152202044Simp	void		(*bs_wr_4) (void *, bus_space_handle_t,
153202044Simp			    bus_size_t, const u_int32_t *, bus_size_t);
154202044Simp	void		(*bs_wr_8) (void *, bus_space_handle_t,
155202044Simp			    bus_size_t, const u_int64_t *, bus_size_t);
156178172Simp
157202044Simp	/* set multiple */
158202044Simp	void		(*bs_sm_1) (void *, bus_space_handle_t,
159202044Simp			    bus_size_t, u_int8_t, bus_size_t);
160202044Simp	void		(*bs_sm_2) (void *, bus_space_handle_t,
161202044Simp			    bus_size_t, u_int16_t, bus_size_t);
162202044Simp	void		(*bs_sm_4) (void *, bus_space_handle_t,
163202044Simp			    bus_size_t, u_int32_t, bus_size_t);
164202044Simp	void		(*bs_sm_8) (void *, bus_space_handle_t,
165202044Simp			    bus_size_t, u_int64_t, bus_size_t);
166178172Simp
167202044Simp	/* set region */
168202044Simp	void		(*bs_sr_1) (void *, bus_space_handle_t,
169202044Simp			    bus_size_t, u_int8_t, bus_size_t);
170202044Simp	void		(*bs_sr_2) (void *, bus_space_handle_t,
171202044Simp			    bus_size_t, u_int16_t, bus_size_t);
172202044Simp	void		(*bs_sr_4) (void *, bus_space_handle_t,
173202044Simp			    bus_size_t, u_int32_t, bus_size_t);
174202044Simp	void		(*bs_sr_8) (void *, bus_space_handle_t,
175202044Simp			    bus_size_t, u_int64_t, bus_size_t);
176178172Simp
177202044Simp	/* copy */
178202044Simp	void		(*bs_c_1) (void *, bus_space_handle_t, bus_size_t,
179202044Simp			    bus_space_handle_t, bus_size_t, bus_size_t);
180202044Simp	void		(*bs_c_2) (void *, bus_space_handle_t, bus_size_t,
181202044Simp			    bus_space_handle_t, bus_size_t, bus_size_t);
182202044Simp	void		(*bs_c_4) (void *, bus_space_handle_t, bus_size_t,
183202044Simp			    bus_space_handle_t, bus_size_t, bus_size_t);
184202044Simp	void		(*bs_c_8) (void *, bus_space_handle_t, bus_size_t,
185202044Simp			    bus_space_handle_t, bus_size_t, bus_size_t);
186178172Simp
187202044Simp	/* read stream (single) */
188202044Simp	u_int8_t	(*bs_r_1_s) (void *, bus_space_handle_t, bus_size_t);
189202044Simp	u_int16_t	(*bs_r_2_s) (void *, bus_space_handle_t, bus_size_t);
190202044Simp	u_int32_t	(*bs_r_4_s) (void *, bus_space_handle_t, bus_size_t);
191202044Simp	u_int64_t	(*bs_r_8_s) (void *, bus_space_handle_t, bus_size_t);
192178172Simp
193202044Simp	/* read multiple stream */
194202044Simp	void		(*bs_rm_1_s) (void *, bus_space_handle_t, bus_size_t,
195202044Simp	    u_int8_t *, bus_size_t);
196202044Simp	void		(*bs_rm_2_s) (void *, bus_space_handle_t, bus_size_t,
197202044Simp	    u_int16_t *, bus_size_t);
198202044Simp	void		(*bs_rm_4_s) (void *, bus_space_handle_t,
199202044Simp			    bus_size_t, u_int32_t *, bus_size_t);
200202044Simp	void		(*bs_rm_8_s) (void *, bus_space_handle_t,
201202044Simp			    bus_size_t, u_int64_t *, bus_size_t);
202202044Simp
203202044Simp	/* read region stream */
204202044Simp	void		(*bs_rr_1_s) (void *, bus_space_handle_t,
205202044Simp			    bus_size_t, u_int8_t *, bus_size_t);
206202044Simp	void		(*bs_rr_2_s) (void *, bus_space_handle_t,
207202044Simp			    bus_size_t, u_int16_t *, bus_size_t);
208202044Simp	void		(*bs_rr_4_s) (void *, bus_space_handle_t,
209202044Simp			    bus_size_t, u_int32_t *, bus_size_t);
210202044Simp	void		(*bs_rr_8_s) (void *, bus_space_handle_t,
211202044Simp			    bus_size_t, u_int64_t *, bus_size_t);
212202044Simp
213202044Simp	/* write stream (single) */
214202044Simp	void		(*bs_w_1_s) (void *, bus_space_handle_t,
215202044Simp			    bus_size_t, u_int8_t);
216202044Simp	void		(*bs_w_2_s) (void *, bus_space_handle_t,
217202044Simp			    bus_size_t, u_int16_t);
218202044Simp	void		(*bs_w_4_s) (void *, bus_space_handle_t,
219202044Simp			    bus_size_t, u_int32_t);
220202044Simp	void		(*bs_w_8_s) (void *, bus_space_handle_t,
221202044Simp			    bus_size_t, u_int64_t);
222178172Simp
223202044Simp	/* write multiple stream */
224202044Simp	void		(*bs_wm_1_s) (void *, bus_space_handle_t,
225202044Simp			    bus_size_t, const u_int8_t *, bus_size_t);
226202044Simp	void		(*bs_wm_2_s) (void *, bus_space_handle_t,
227202044Simp			    bus_size_t, const u_int16_t *, bus_size_t);
228202044Simp	void		(*bs_wm_4_s) (void *, bus_space_handle_t,
229202044Simp			    bus_size_t, const u_int32_t *, bus_size_t);
230202044Simp	void		(*bs_wm_8_s) (void *, bus_space_handle_t,
231202044Simp			    bus_size_t, const u_int64_t *, bus_size_t);
232202044Simp
233202044Simp	/* write region stream */
234202044Simp	void		(*bs_wr_1_s) (void *, bus_space_handle_t,
235202044Simp			    bus_size_t, const u_int8_t *, bus_size_t);
236202044Simp	void		(*bs_wr_2_s) (void *, bus_space_handle_t,
237202044Simp			    bus_size_t, const u_int16_t *, bus_size_t);
238202044Simp	void		(*bs_wr_4_s) (void *, bus_space_handle_t,
239202044Simp			    bus_size_t, const u_int32_t *, bus_size_t);
240202044Simp	void		(*bs_wr_8_s) (void *, bus_space_handle_t,
241202044Simp			    bus_size_t, const u_int64_t *, bus_size_t);
242202044Simp};
243178172Simp
244178172Simp
245178172Simp/*
246202044Simp * Utility macros; INTERNAL USE ONLY.
247178172Simp */
248202044Simp#define	__bs_c(a,b)		__CONCAT(a,b)
249202044Simp#define	__bs_opname(op,size)	__bs_c(__bs_c(__bs_c(bs_,op),_),size)
250178172Simp
251202044Simp#define	__bs_rs(sz, t, h, o)						\
252202044Simp	(*(t)->__bs_opname(r,sz))((t)->bs_cookie, h, o)
253202044Simp#define	__bs_ws(sz, t, h, o, v)						\
254202044Simp	(*(t)->__bs_opname(w,sz))((t)->bs_cookie, h, o, v)
255202044Simp#define	__bs_nonsingle(type, sz, t, h, o, a, c)				\
256202044Simp	(*(t)->__bs_opname(type,sz))((t)->bs_cookie, h, o, a, c)
257202044Simp#define	__bs_set(type, sz, t, h, o, v, c)				\
258202044Simp	(*(t)->__bs_opname(type,sz))((t)->bs_cookie, h, o, v, c)
259202044Simp#define	__bs_copy(sz, t, h1, o1, h2, o2, cnt)				\
260202044Simp	(*(t)->__bs_opname(c,sz))((t)->bs_cookie, h1, o1, h2, o2, cnt)
261178172Simp
262202044Simp#define	__bs_opname_s(op,size)	__bs_c(__bs_c(__bs_c(__bs_c(bs_,op),_),size),_s)
263202044Simp#define	__bs_rs_s(sz, t, h, o)						\
264202044Simp	(*(t)->__bs_opname_s(r,sz))((t)->bs_cookie, h, o)
265202044Simp#define	__bs_ws_s(sz, t, h, o, v)					\
266202044Simp	(*(t)->__bs_opname_s(w,sz))((t)->bs_cookie, h, o, v)
267202044Simp#define	__bs_nonsingle_s(type, sz, t, h, o, a, c)			\
268202044Simp	(*(t)->__bs_opname_s(type,sz))((t)->bs_cookie, h, o, a, c)
269178172Simp
270202044Simp
271178172Simp/*
272202044Simp * Mapping and unmapping operations.
273178172Simp */
274202044Simp#define	bus_space_map(t, a, s, c, hp)					\
275202044Simp	(*(t)->bs_map)((t)->bs_cookie, (a), (s), (c), (hp))
276202044Simp#define	bus_space_unmap(t, h, s)					\
277202044Simp	(*(t)->bs_unmap)((t)->bs_cookie, (h), (s))
278202044Simp#define	bus_space_subregion(t, h, o, s, hp)				\
279202044Simp	(*(t)->bs_subregion)((t)->bs_cookie, (h), (o), (s), (hp))
280178172Simp
281178172Simp
282202044Simp/*
283202044Simp * Allocation and deallocation operations.
284202044Simp */
285202044Simp#define	bus_space_alloc(t, rs, re, s, a, b, c, ap, hp)			\
286202044Simp	(*(t)->bs_alloc)((t)->bs_cookie, (rs), (re), (s), (a), (b),	\
287202044Simp	    (c), (ap), (hp))
288202044Simp#define	bus_space_free(t, h, s)						\
289202044Simp	(*(t)->bs_free)((t)->bs_cookie, (h), (s))
290178172Simp
291202044Simp/*
292202044Simp * Bus barrier operations.
293202044Simp */
294202044Simp#define	bus_space_barrier(t, h, o, l, f)				\
295202044Simp	(*(t)->bs_barrier)((t)->bs_cookie, (h), (o), (l), (f))
296178172Simp
297202044Simp#define	BUS_SPACE_BARRIER_READ	0x01
298202044Simp#define	BUS_SPACE_BARRIER_WRITE	0x02
299178172Simp
300202044Simp/*
301202044Simp * Bus read (single) operations.
302202044Simp */
303202044Simp#define	bus_space_read_1(t, h, o)	__bs_rs(1,(t),(h),(o))
304202044Simp#define	bus_space_read_2(t, h, o)	__bs_rs(2,(t),(h),(o))
305202044Simp#define	bus_space_read_4(t, h, o)	__bs_rs(4,(t),(h),(o))
306202044Simp#define	bus_space_read_8(t, h, o)	__bs_rs(8,(t),(h),(o))
307178172Simp
308202044Simp#define bus_space_read_stream_1(t, h, o)        __bs_rs_s(1,(t), (h), (o))
309202044Simp#define bus_space_read_stream_2(t, h, o)        __bs_rs_s(2,(t), (h), (o))
310202044Simp#define bus_space_read_stream_4(t, h, o)        __bs_rs_s(4,(t), (h), (o))
311202044Simp#define	bus_space_read_stream_8(t, h, o)	__bs_rs_s(8,8,(t),(h),(o))
312178172Simp
313202044Simp/*
314202044Simp * Bus read multiple operations.
315202044Simp */
316202044Simp#define	bus_space_read_multi_1(t, h, o, a, c)				\
317202044Simp	__bs_nonsingle(rm,1,(t),(h),(o),(a),(c))
318202044Simp#define	bus_space_read_multi_2(t, h, o, a, c)				\
319202044Simp	__bs_nonsingle(rm,2,(t),(h),(o),(a),(c))
320202044Simp#define	bus_space_read_multi_4(t, h, o, a, c)				\
321202044Simp	__bs_nonsingle(rm,4,(t),(h),(o),(a),(c))
322202044Simp#define	bus_space_read_multi_8(t, h, o, a, c)				\
323202044Simp	__bs_nonsingle(rm,8,(t),(h),(o),(a),(c))
324178172Simp
325202044Simp#define	bus_space_read_multi_stream_1(t, h, o, a, c)			\
326202044Simp	__bs_nonsingle_s(rm,1,(t),(h),(o),(a),(c))
327202044Simp#define	bus_space_read_multi_stream_2(t, h, o, a, c)			\
328202044Simp	__bs_nonsingle_s(rm,2,(t),(h),(o),(a),(c))
329202044Simp#define	bus_space_read_multi_stream_4(t, h, o, a, c)			\
330202044Simp	__bs_nonsingle_s(rm,4,(t),(h),(o),(a),(c))
331202044Simp#define	bus_space_read_multi_stream_8(t, h, o, a, c)			\
332202044Simp	__bs_nonsingle_s(rm,8,(t),(h),(o),(a),(c))
333178172Simp
334178172Simp
335178172Simp/*
336202044Simp * Bus read region operations.
337178172Simp */
338202044Simp#define	bus_space_read_region_1(t, h, o, a, c)				\
339202044Simp	__bs_nonsingle(rr,1,(t),(h),(o),(a),(c))
340202044Simp#define	bus_space_read_region_2(t, h, o, a, c)				\
341202044Simp	__bs_nonsingle(rr,2,(t),(h),(o),(a),(c))
342202044Simp#define	bus_space_read_region_4(t, h, o, a, c)				\
343202044Simp	__bs_nonsingle(rr,4,(t),(h),(o),(a),(c))
344202044Simp#define	bus_space_read_region_8(t, h, o, a, c)				\
345202044Simp	__bs_nonsingle(rr,8,(t),(h),(o),(a),(c))
346178172Simp
347202044Simp#define	bus_space_read_region_stream_1(t, h, o, a, c)			\
348202044Simp	__bs_nonsingle_s(rr,1,(t),(h),(o),(a),(c))
349202044Simp#define	bus_space_read_region_stream_2(t, h, o, a, c)			\
350202044Simp	__bs_nonsingle_s(rr,2,(t),(h),(o),(a),(c))
351202044Simp#define	bus_space_read_region_stream_4(t, h, o, a, c)			\
352202044Simp	__bs_nonsingle_s(rr,4,(t),(h),(o),(a),(c))
353202044Simp#define	bus_space_read_region_stream_8(t, h, o, a, c)			\
354202044Simp	__bs_nonsingle_s(rr,8,(t),(h),(o),(a),(c))
355178172Simp
356178172Simp
357202044Simp/*
358202044Simp * Bus write (single) operations.
359202044Simp */
360202044Simp#define	bus_space_write_1(t, h, o, v)	__bs_ws(1,(t),(h),(o),(v))
361202044Simp#define	bus_space_write_2(t, h, o, v)	__bs_ws(2,(t),(h),(o),(v))
362202044Simp#define	bus_space_write_4(t, h, o, v)	__bs_ws(4,(t),(h),(o),(v))
363202044Simp#define	bus_space_write_8(t, h, o, v)	__bs_ws(8,(t),(h),(o),(v))
364178172Simp
365202044Simp#define	bus_space_write_stream_1(t, h, o, v)	__bs_ws_s(1,(t),(h),(o),(v))
366202044Simp#define	bus_space_write_stream_2(t, h, o, v)	__bs_ws_s(2,(t),(h),(o),(v))
367202044Simp#define	bus_space_write_stream_4(t, h, o, v)	__bs_ws_s(4,(t),(h),(o),(v))
368202044Simp#define	bus_space_write_stream_8(t, h, o, v)	__bs_ws_s(8,(t),(h),(o),(v))
369178172Simp
370178172Simp
371202044Simp/*
372202044Simp * Bus write multiple operations.
373202044Simp */
374202044Simp#define	bus_space_write_multi_1(t, h, o, a, c)				\
375202044Simp	__bs_nonsingle(wm,1,(t),(h),(o),(a),(c))
376202044Simp#define	bus_space_write_multi_2(t, h, o, a, c)				\
377202044Simp	__bs_nonsingle(wm,2,(t),(h),(o),(a),(c))
378202044Simp#define	bus_space_write_multi_4(t, h, o, a, c)				\
379202044Simp	__bs_nonsingle(wm,4,(t),(h),(o),(a),(c))
380202044Simp#define	bus_space_write_multi_8(t, h, o, a, c)				\
381202044Simp	__bs_nonsingle(wm,8,(t),(h),(o),(a),(c))
382178172Simp
383202044Simp#define	bus_space_write_multi_stream_1(t, h, o, a, c)			\
384202044Simp	__bs_nonsingle_s(wm,1,(t),(h),(o),(a),(c))
385202044Simp#define	bus_space_write_multi_stream_2(t, h, o, a, c)			\
386202044Simp	__bs_nonsingle_s(wm,2,(t),(h),(o),(a),(c))
387202044Simp#define	bus_space_write_multi_stream_4(t, h, o, a, c)			\
388202044Simp	__bs_nonsingle_s(wm,4,(t),(h),(o),(a),(c))
389202044Simp#define	bus_space_write_multi_stream_8(t, h, o, a, c)			\
390202044Simp	__bs_nonsingle_s(wm,8,(t),(h),(o),(a),(c))
391178172Simp
392178172Simp
393178172Simp/*
394202044Simp * Bus write region operations.
395178172Simp */
396202044Simp#define	bus_space_write_region_1(t, h, o, a, c)				\
397202044Simp	__bs_nonsingle(wr,1,(t),(h),(o),(a),(c))
398202044Simp#define	bus_space_write_region_2(t, h, o, a, c)				\
399202044Simp	__bs_nonsingle(wr,2,(t),(h),(o),(a),(c))
400202044Simp#define	bus_space_write_region_4(t, h, o, a, c)				\
401202044Simp	__bs_nonsingle(wr,4,(t),(h),(o),(a),(c))
402202044Simp#define	bus_space_write_region_8(t, h, o, a, c)				\
403202044Simp	__bs_nonsingle(wr,8,(t),(h),(o),(a),(c))
404178172Simp
405202044Simp#define	bus_space_write_region_stream_1(t, h, o, a, c)			\
406202044Simp	__bs_nonsingle_s(wr,1,(t),(h),(o),(a),(c))
407202044Simp#define	bus_space_write_region_stream_2(t, h, o, a, c)			\
408202044Simp	__bs_nonsingle_s(wr,2,(t),(h),(o),(a),(c))
409202044Simp#define	bus_space_write_region_stream_4(t, h, o, a, c)			\
410202044Simp	__bs_nonsingle_s(wr,4,(t),(h),(o),(a),(c))
411202044Simp#define	bus_space_write_region_stream_8(t, h, o, a, c)			\
412202044Simp	__bs_nonsingle_s(wr,8,(t),(h),(o),(a),(c))
413178172Simp
414178172Simp
415202044Simp/*
416202044Simp * Set multiple operations.
417202044Simp */
418202044Simp#define	bus_space_set_multi_1(t, h, o, v, c)				\
419202044Simp	__bs_set(sm,1,(t),(h),(o),(v),(c))
420202044Simp#define	bus_space_set_multi_2(t, h, o, v, c)				\
421202044Simp	__bs_set(sm,2,(t),(h),(o),(v),(c))
422202044Simp#define	bus_space_set_multi_4(t, h, o, v, c)				\
423202044Simp	__bs_set(sm,4,(t),(h),(o),(v),(c))
424202044Simp#define	bus_space_set_multi_8(t, h, o, v, c)				\
425202044Simp	__bs_set(sm,8,(t),(h),(o),(v),(c))
426178172Simp
427178172Simp
428202044Simp/*
429202044Simp * Set region operations.
430202044Simp */
431202044Simp#define	bus_space_set_region_1(t, h, o, v, c)				\
432202044Simp	__bs_set(sr,1,(t),(h),(o),(v),(c))
433202044Simp#define	bus_space_set_region_2(t, h, o, v, c)				\
434202044Simp	__bs_set(sr,2,(t),(h),(o),(v),(c))
435202044Simp#define	bus_space_set_region_4(t, h, o, v, c)				\
436202044Simp	__bs_set(sr,4,(t),(h),(o),(v),(c))
437202044Simp#define	bus_space_set_region_8(t, h, o, v, c)				\
438202044Simp	__bs_set(sr,8,(t),(h),(o),(v),(c))
439178172Simp
440178172Simp
441178172Simp/*
442202044Simp * Copy operations.
443178172Simp */
444202044Simp#define	bus_space_copy_region_1(t, h1, o1, h2, o2, c)				\
445202044Simp	__bs_copy(1, t, h1, o1, h2, o2, c)
446202044Simp#define	bus_space_copy_region_2(t, h1, o1, h2, o2, c)				\
447202044Simp	__bs_copy(2, t, h1, o1, h2, o2, c)
448202044Simp#define	bus_space_copy_region_4(t, h1, o1, h2, o2, c)				\
449202044Simp	__bs_copy(4, t, h1, o1, h2, o2, c)
450202044Simp#define	bus_space_copy_region_8(t, h1, o1, h2, o2, c)				\
451202044Simp	__bs_copy(8, t, h1, o1, h2, o2, c)
452178172Simp
453178172Simp/*
454202044Simp * Macros to provide prototypes for all the functions used in the
455202044Simp * bus_space structure
456178172Simp */
457178172Simp
458202044Simp#define bs_map_proto(f)							\
459202044Simpint	__bs_c(f,_bs_map) (void *t, bus_addr_t addr,		\
460202044Simp	    bus_size_t size, int cacheable, bus_space_handle_t *bshp);
461178172Simp
462202044Simp#define bs_unmap_proto(f)						\
463202044Simpvoid	__bs_c(f,_bs_unmap) (void *t, bus_space_handle_t bsh,		\
464202044Simp	    bus_size_t size);
465178172Simp
466202044Simp#define bs_subregion_proto(f)						\
467202044Simpint	__bs_c(f,_bs_subregion) (void *t, bus_space_handle_t bsh,	\
468202044Simp	    bus_size_t offset, bus_size_t size, 			\
469202044Simp	    bus_space_handle_t *nbshp);
470178172Simp
471202044Simp#define bs_alloc_proto(f)						\
472202044Simpint	__bs_c(f,_bs_alloc) (void *t, bus_addr_t rstart,		\
473202044Simp	    bus_addr_t rend, bus_size_t size, bus_size_t align,		\
474202044Simp	    bus_size_t boundary, int cacheable, bus_addr_t *addrp,	\
475202044Simp	    bus_space_handle_t *bshp);
476178172Simp
477202044Simp#define bs_free_proto(f)						\
478202044Simpvoid	__bs_c(f,_bs_free) (void *t, bus_space_handle_t bsh,	\
479202044Simp	    bus_size_t size);
480178172Simp
481202044Simp#define bs_barrier_proto(f)						\
482202044Simpvoid	__bs_c(f,_bs_barrier) (void *t, bus_space_handle_t bsh,	\
483202044Simp	    bus_size_t offset, bus_size_t len, int flags);
484178172Simp
485202044Simp#define	bs_r_1_proto(f)							\
486202044Simpu_int8_t	__bs_c(f,_bs_r_1) (void *t, bus_space_handle_t bsh,	\
487202044Simp		    bus_size_t offset);
488178172Simp
489202044Simp#define	bs_r_2_proto(f)							\
490202044Simpu_int16_t	__bs_c(f,_bs_r_2) (void *t, bus_space_handle_t bsh,	\
491202044Simp		    bus_size_t offset);
492178172Simp
493202044Simp#define	bs_r_4_proto(f)							\
494202044Simpu_int32_t	__bs_c(f,_bs_r_4) (void *t, bus_space_handle_t bsh,	\
495202044Simp		    bus_size_t offset);
496178172Simp
497202044Simp#define	bs_r_8_proto(f)							\
498202044Simpu_int64_t	__bs_c(f,_bs_r_8) (void *t, bus_space_handle_t bsh,	\
499202044Simp		    bus_size_t offset);
500178172Simp
501202044Simp#define	bs_r_1_s_proto(f)						\
502202044Simpu_int8_t	__bs_c(f,_bs_r_1_s) (void *t, bus_space_handle_t bsh,	\
503202044Simp		    bus_size_t offset);
504178172Simp
505202044Simp#define	bs_r_2_s_proto(f)						\
506202044Simpu_int16_t	__bs_c(f,_bs_r_2_s) (void *t, bus_space_handle_t bsh,	\
507202044Simp		    bus_size_t offset);
508178172Simp
509202044Simp#define	bs_r_4_s_proto(f)						\
510202044Simpu_int32_t	__bs_c(f,_bs_r_4_s) (void *t, bus_space_handle_t bsh,	\
511202044Simp		    bus_size_t offset);
512178172Simp
513202044Simp#define	bs_w_1_proto(f)							\
514202044Simpvoid	__bs_c(f,_bs_w_1) (void *t, bus_space_handle_t bsh,		\
515202044Simp	    bus_size_t offset, u_int8_t value);
516178172Simp
517202044Simp#define	bs_w_2_proto(f)							\
518202044Simpvoid	__bs_c(f,_bs_w_2) (void *t, bus_space_handle_t bsh,		\
519202044Simp	    bus_size_t offset, u_int16_t value);
520178172Simp
521202044Simp#define	bs_w_4_proto(f)							\
522202044Simpvoid	__bs_c(f,_bs_w_4) (void *t, bus_space_handle_t bsh,		\
523202044Simp	    bus_size_t offset, u_int32_t value);
524178172Simp
525202044Simp#define	bs_w_8_proto(f)							\
526202044Simpvoid	__bs_c(f,_bs_w_8) (void *t, bus_space_handle_t bsh,		\
527202044Simp	    bus_size_t offset, u_int64_t value);
528178172Simp
529202044Simp#define	bs_w_1_s_proto(f)						\
530202044Simpvoid	__bs_c(f,_bs_w_1_s) (void *t, bus_space_handle_t bsh,		\
531202044Simp	    bus_size_t offset, u_int8_t value);
532178172Simp
533202044Simp#define	bs_w_2_s_proto(f)						\
534202044Simpvoid	__bs_c(f,_bs_w_2_s) (void *t, bus_space_handle_t bsh,		\
535202044Simp	    bus_size_t offset, u_int16_t value);
536178172Simp
537202044Simp#define	bs_w_4_s_proto(f)						\
538202044Simpvoid	__bs_c(f,_bs_w_4_s) (void *t, bus_space_handle_t bsh,		\
539202044Simp	    bus_size_t offset, u_int32_t value);
540178172Simp
541202044Simp#define	bs_rm_1_proto(f)						\
542202044Simpvoid	__bs_c(f,_bs_rm_1) (void *t, bus_space_handle_t bsh,	\
543202044Simp	    bus_size_t offset, u_int8_t *addr, bus_size_t count);
544178172Simp
545202044Simp#define	bs_rm_2_proto(f)						\
546202044Simpvoid	__bs_c(f,_bs_rm_2) (void *t, bus_space_handle_t bsh,	\
547202044Simp	    bus_size_t offset, u_int16_t *addr, bus_size_t count);
548178172Simp
549202044Simp#define	bs_rm_4_proto(f)						\
550202044Simpvoid	__bs_c(f,_bs_rm_4) (void *t, bus_space_handle_t bsh,	\
551202044Simp	    bus_size_t offset, u_int32_t *addr, bus_size_t count);
552178172Simp
553202044Simp#define	bs_rm_8_proto(f)						\
554202044Simpvoid	__bs_c(f,_bs_rm_8) (void *t, bus_space_handle_t bsh,	\
555202044Simp	    bus_size_t offset, u_int64_t *addr, bus_size_t count);
556178172Simp
557202044Simp#define	bs_wm_1_proto(f)						\
558202044Simpvoid	__bs_c(f,_bs_wm_1) (void *t, bus_space_handle_t bsh,	\
559202044Simp	    bus_size_t offset, const u_int8_t *addr, bus_size_t count);
560178172Simp
561202044Simp#define	bs_wm_2_proto(f)						\
562202044Simpvoid	__bs_c(f,_bs_wm_2) (void *t, bus_space_handle_t bsh,	\
563202044Simp	    bus_size_t offset, const u_int16_t *addr, bus_size_t count);
564178172Simp
565202044Simp#define	bs_wm_4_proto(f)						\
566202044Simpvoid	__bs_c(f,_bs_wm_4) (void *t, bus_space_handle_t bsh,	\
567202044Simp	    bus_size_t offset, const u_int32_t *addr, bus_size_t count);
568178172Simp
569202044Simp#define	bs_wm_8_proto(f)						\
570202044Simpvoid	__bs_c(f,_bs_wm_8) (void *t, bus_space_handle_t bsh,	\
571202044Simp	    bus_size_t offset, const u_int64_t *addr, bus_size_t count);
572178172Simp
573202044Simp#define	bs_rr_1_proto(f)						\
574202044Simpvoid	__bs_c(f, _bs_rr_1) (void *t, bus_space_handle_t bsh,	\
575202044Simp	    bus_size_t offset, u_int8_t *addr, bus_size_t count);
576178172Simp
577202044Simp#define	bs_rr_2_proto(f)						\
578202044Simpvoid	__bs_c(f, _bs_rr_2) (void *t, bus_space_handle_t bsh,	\
579202044Simp	    bus_size_t offset, u_int16_t *addr, bus_size_t count);
580178172Simp
581202044Simp#define	bs_rr_4_proto(f)						\
582202044Simpvoid	__bs_c(f, _bs_rr_4) (void *t, bus_space_handle_t bsh,	\
583202044Simp	    bus_size_t offset, u_int32_t *addr, bus_size_t count);
584178172Simp
585202044Simp#define	bs_rr_8_proto(f)						\
586202044Simpvoid	__bs_c(f, _bs_rr_8) (void *t, bus_space_handle_t bsh,	\
587202044Simp	    bus_size_t offset, u_int64_t *addr, bus_size_t count);
588178172Simp
589202044Simp#define	bs_wr_1_proto(f)						\
590202044Simpvoid	__bs_c(f, _bs_wr_1) (void *t, bus_space_handle_t bsh,	\
591202044Simp	    bus_size_t offset, const u_int8_t *addr, bus_size_t count);
592178172Simp
593202044Simp#define	bs_wr_2_proto(f)						\
594202044Simpvoid	__bs_c(f, _bs_wr_2) (void *t, bus_space_handle_t bsh,	\
595202044Simp	    bus_size_t offset, const u_int16_t *addr, bus_size_t count);
596178172Simp
597202044Simp#define	bs_wr_4_proto(f)						\
598202044Simpvoid	__bs_c(f, _bs_wr_4) (void *t, bus_space_handle_t bsh,	\
599202044Simp	    bus_size_t offset, const u_int32_t *addr, bus_size_t count);
600178172Simp
601202044Simp#define	bs_wr_8_proto(f)						\
602202044Simpvoid	__bs_c(f, _bs_wr_8) (void *t, bus_space_handle_t bsh,	\
603202044Simp	    bus_size_t offset, const u_int64_t *addr, bus_size_t count);
604178172Simp
605202044Simp#define	bs_sm_1_proto(f)						\
606202044Simpvoid	__bs_c(f,_bs_sm_1) (void *t, bus_space_handle_t bsh,	\
607202044Simp	    bus_size_t offset, u_int8_t value, bus_size_t count);
608178172Simp
609202044Simp#define	bs_sm_2_proto(f)						\
610202044Simpvoid	__bs_c(f,_bs_sm_2) (void *t, bus_space_handle_t bsh,	\
611202044Simp	    bus_size_t offset, u_int16_t value, bus_size_t count);
612178172Simp
613202044Simp#define	bs_sm_4_proto(f)						\
614202044Simpvoid	__bs_c(f,_bs_sm_4) (void *t, bus_space_handle_t bsh,	\
615202044Simp	    bus_size_t offset, u_int32_t value, bus_size_t count);
616178172Simp
617202044Simp#define	bs_sm_8_proto(f)						\
618202044Simpvoid	__bs_c(f,_bs_sm_8) (void *t, bus_space_handle_t bsh,	\
619202044Simp	    bus_size_t offset, u_int64_t value, bus_size_t count);
620178172Simp
621202044Simp#define	bs_sr_1_proto(f)						\
622202044Simpvoid	__bs_c(f,_bs_sr_1) (void *t, bus_space_handle_t bsh,	\
623202044Simp	    bus_size_t offset, u_int8_t value, bus_size_t count);
624178172Simp
625202044Simp#define	bs_sr_2_proto(f)						\
626202044Simpvoid	__bs_c(f,_bs_sr_2) (void *t, bus_space_handle_t bsh,	\
627202044Simp	    bus_size_t offset, u_int16_t value, bus_size_t count);
628178172Simp
629202044Simp#define	bs_sr_4_proto(f)						\
630202044Simpvoid	__bs_c(f,_bs_sr_4) (void *t, bus_space_handle_t bsh,	\
631202044Simp	    bus_size_t offset, u_int32_t value, bus_size_t count);
632178172Simp
633202044Simp#define	bs_sr_8_proto(f)						\
634202044Simpvoid	__bs_c(f,_bs_sr_8) (void *t, bus_space_handle_t bsh,	\
635202044Simp	    bus_size_t offset, u_int64_t value, bus_size_t count);
636178172Simp
637202044Simp#define	bs_c_1_proto(f)							\
638202044Simpvoid	__bs_c(f,_bs_c_1) (void *t, bus_space_handle_t bsh1,	\
639202044Simp	    bus_size_t offset1, bus_space_handle_t bsh2,		\
640202044Simp	    bus_size_t offset2, bus_size_t count);
641178172Simp
642202044Simp#define	bs_c_2_proto(f)							\
643202044Simpvoid	__bs_c(f,_bs_c_2) (void *t, bus_space_handle_t bsh1,	\
644202044Simp	    bus_size_t offset1, bus_space_handle_t bsh2,		\
645202044Simp	    bus_size_t offset2, bus_size_t count);
646178172Simp
647202044Simp#define	bs_c_4_proto(f)							\
648202044Simpvoid	__bs_c(f,_bs_c_4) (void *t, bus_space_handle_t bsh1,	\
649202044Simp	    bus_size_t offset1, bus_space_handle_t bsh2,		\
650202044Simp	    bus_size_t offset2, bus_size_t count);
651178172Simp
652202044Simp#define	bs_c_8_proto(f)							\
653202044Simpvoid	__bs_c(f,_bs_c_8) (void *t, bus_space_handle_t bsh1,	\
654202044Simp	    bus_size_t offset1, bus_space_handle_t bsh2,		\
655202044Simp	    bus_size_t offset2, bus_size_t count);
656178172Simp
657202044Simp#define DECLARE_BUS_SPACE_PROTOTYPES(f)		\
658202044Simp	bs_map_proto(f);			\
659202044Simp	bs_unmap_proto(f);			\
660202044Simp	bs_subregion_proto(f);			\
661202044Simp	bs_alloc_proto(f);			\
662202044Simp	bs_free_proto(f);			\
663202044Simp	bs_barrier_proto(f);			\
664202044Simp	bs_r_1_proto(f);			\
665202044Simp	bs_r_2_proto(f);			\
666202044Simp	bs_r_4_proto(f);			\
667202044Simp	bs_r_8_proto(f);			\
668202044Simp	bs_r_1_s_proto(f);			\
669202044Simp	bs_r_2_s_proto(f);			\
670202044Simp	bs_r_4_s_proto(f);			\
671202044Simp	bs_w_1_proto(f);			\
672202044Simp	bs_w_2_proto(f);			\
673202044Simp	bs_w_4_proto(f);			\
674202044Simp	bs_w_8_proto(f);			\
675202044Simp	bs_w_1_s_proto(f);			\
676202044Simp	bs_w_2_s_proto(f);			\
677202044Simp	bs_w_4_s_proto(f);			\
678202044Simp	bs_rm_1_proto(f);			\
679202044Simp	bs_rm_2_proto(f);			\
680202044Simp	bs_rm_4_proto(f);			\
681202044Simp	bs_rm_8_proto(f);			\
682202044Simp	bs_wm_1_proto(f);			\
683202044Simp	bs_wm_2_proto(f);			\
684202044Simp	bs_wm_4_proto(f);			\
685202044Simp	bs_wm_8_proto(f);			\
686202044Simp	bs_rr_1_proto(f);			\
687202044Simp	bs_rr_2_proto(f);			\
688202044Simp	bs_rr_4_proto(f);			\
689202044Simp	bs_rr_8_proto(f);			\
690202044Simp	bs_wr_1_proto(f);			\
691202044Simp	bs_wr_2_proto(f);			\
692202044Simp	bs_wr_4_proto(f);			\
693202044Simp	bs_wr_8_proto(f);			\
694202044Simp	bs_sm_1_proto(f);			\
695202044Simp	bs_sm_2_proto(f);			\
696202044Simp	bs_sm_4_proto(f);			\
697202044Simp	bs_sm_8_proto(f);			\
698202044Simp	bs_sr_1_proto(f);			\
699202044Simp	bs_sr_2_proto(f);			\
700202044Simp	bs_sr_4_proto(f);			\
701202044Simp	bs_sr_8_proto(f);			\
702202044Simp	bs_c_1_proto(f);			\
703202044Simp	bs_c_2_proto(f);			\
704202044Simp	bs_c_4_proto(f);			\
705202044Simp	bs_c_8_proto(f);
706178172Simp
707202044Simp#define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
708178172Simp
709202044Simp#define BUS_SPACE_MAXADDR_24BIT	0xFFFFFF
710202044Simp#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
711202044Simp#define BUS_SPACE_MAXADDR 	0xFFFFFFFF
712202044Simp#define BUS_SPACE_MAXSIZE_24BIT	0xFFFFFF
713202044Simp#define BUS_SPACE_MAXSIZE_32BIT	0xFFFFFFFF
714202044Simp#define BUS_SPACE_MAXSIZE 	0xFFFFFFFF
715178172Simp
716206404Simp#define BUS_SPACE_UNRESTRICTED	(~0)
717206404Simp
718202044Simp/*
719202044Simp * declare generic bus space, it suits all needs in
720202044Simp */
721202044SimpDECLARE_BUS_SPACE_PROTOTYPES(generic);
722202044Simpextern bus_space_tag_t mips_bus_space_generic;
723202044Simp/* Special bus space for RMI processors */
724202044Simp#ifdef TARGET_XLR_XLS
725202044Simpextern bus_space_tag_t rmi_bus_space;
726204577Srrsextern bus_space_tag_t rmi_pci_bus_space;
727178172Simp#endif
728178172Simp
729178172Simp#include <machine/bus_dma.h>
730178172Simp
731202044Simp#endif /* _MACHINE_BUS_H_ */
732