1 /* $NetBSD: bus.h,v 1.25 2006/09/09 06:01:48 tsutsui Exp $ */
4 * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
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.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
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.
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.
34 * Copyright (C) 1997 Scott Reynolds. All rights reserved.
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
39 * 1. Redistributions of source code must retain the above copyright
40 * notice, this list of conditions and the following disclaimer.
41 * 2. Redistributions in binary form must reproduce the above copyright
42 * notice, this list of conditions and the following disclaimer in the
43 * documentation and/or other materials provided with the distribution.
44 * 3. The name of the author may not be used to endorse or promote products
45 * derived from this software without specific prior written permission
47 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
48 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
49 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
50 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
51 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
52 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
53 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
54 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
55 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
56 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
59 #ifndef _MAC68K_BUS_H_
60 #define _MAC68K_BUS_H_
63 * Value for the mac68k bus space tag, not to be used directly by MI code.
65 #define MAC68K_BUS_SPACE_MEM 0 /* space is mem space */
67 #define __BUS_SPACE_HAS_STREAM_METHODS 1
70 * Bus address and size types
72 typedef u_long bus_addr_t
;
73 typedef u_long bus_size_t
;
76 * Access methods for bus resources and address space.
78 #define BSH_T struct bus_space_handle_s
79 typedef int bus_space_tag_t
;
80 typedef struct bus_space_handle_s
{
85 u_int8_t (*bsr1
)(bus_space_tag_t
, BSH_T
*, bus_size_t
);
86 u_int16_t (*bsr2
)(bus_space_tag_t
, BSH_T
*, bus_size_t
);
87 u_int32_t (*bsr4
)(bus_space_tag_t
, BSH_T
*, bus_size_t
);
88 u_int8_t (*bsrs1
)(bus_space_tag_t
, BSH_T
*, bus_size_t
);
89 u_int16_t (*bsrs2
)(bus_space_tag_t
, BSH_T
*, bus_size_t
);
90 u_int32_t (*bsrs4
)(bus_space_tag_t
, BSH_T
*, bus_size_t
);
91 void (*bsrm1
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
93 void (*bsrm2
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
95 void (*bsrm4
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
97 void (*bsrms1
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
99 void (*bsrms2
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
100 u_int16_t
*, size_t);
101 void (*bsrms4
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
102 u_int32_t
*, size_t);
103 void (*bsrr1
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
105 void (*bsrr2
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
106 u_int16_t
*, size_t);
107 void (*bsrr4
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
108 u_int32_t
*, size_t);
109 void (*bsrrs1
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
111 void (*bsrrs2
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
112 u_int16_t
*, size_t);
113 void (*bsrrs4
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
114 u_int32_t
*, size_t);
115 void (*bsw1
)(bus_space_tag_t
, BSH_T
*, bus_size_t
, u_int8_t
);
116 void (*bsw2
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
118 void (*bsw4
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
120 void (*bsws1
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
122 void (*bsws2
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
124 void (*bsws4
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
126 void (*bswm1
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
127 const u_int8_t
*, size_t);
128 void (*bswm2
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
129 const u_int16_t
*, size_t);
130 void (*bswm4
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
131 const u_int32_t
*, size_t);
132 void (*bswms1
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
133 const u_int8_t
*, size_t);
134 void (*bswms2
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
135 const u_int16_t
*, size_t);
136 void (*bswms4
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
137 const u_int32_t
*, size_t);
138 void (*bswr1
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
139 const u_int8_t
*, size_t);
140 void (*bswr2
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
141 const u_int16_t
*, size_t);
142 void (*bswr4
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
143 const u_int32_t
*, size_t);
144 void (*bswrs1
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
145 const u_int8_t
*, size_t);
146 void (*bswrs2
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
147 const u_int16_t
*, size_t);
148 void (*bswrs4
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
149 const u_int32_t
*, size_t);
150 void (*bssm1
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
152 void (*bssm2
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
153 u_int16_t v
, size_t);
154 void (*bssm4
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
155 u_int32_t v
, size_t);
156 void (*bssr1
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
158 void (*bssr2
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
159 u_int16_t v
, size_t);
160 void (*bssr4
)(bus_space_tag_t
, BSH_T
*, bus_size_t
,
161 u_int32_t v
, size_t);
162 } bus_space_handle_t
;
165 void mac68k_bus_space_handle_swapped(bus_space_tag_t
,
166 bus_space_handle_t
*);
167 void mac68k_bus_space_handle_set_stride(bus_space_tag_t
,
168 bus_space_handle_t
*, int);
171 * int bus_space_map(bus_space_tag_t t, bus_addr_t addr,
172 * bus_size_t size, int flags, bus_space_handle_t *bshp);
174 * Map a region of bus space.
177 #define BUS_SPACE_MAP_CACHEABLE 0x01
178 #define BUS_SPACE_MAP_LINEAR 0x02
179 #define BUS_SPACE_MAP_PREFETCHABLE 0x04
181 int bus_space_map(bus_space_tag_t
, bus_addr_t
, bus_size_t
,
182 int, bus_space_handle_t
*);
185 * void bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh,
188 * Unmap a region of bus space.
191 void bus_space_unmap(bus_space_tag_t
, bus_space_handle_t
, bus_size_t
);
194 * int bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh,
195 * bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp);
197 * Get a new handle for a subregion of an already-mapped area of bus space.
200 int bus_space_subregion(bus_space_tag_t
, bus_space_handle_t
,
201 bus_size_t
, bus_size_t size
, bus_space_handle_t
*);
204 * int bus_space_alloc(bus_space_tag_t t, bus_addr_t, rstart,
205 * bus_addr_t rend, bus_size_t size, bus_size_t align,
206 * bus_size_t boundary, int flags, bus_addr_t *addrp,
207 * bus_space_handle_t *bshp);
209 * Allocate a region of bus space.
212 int bus_space_alloc(bus_space_tag_t
, bus_addr_t rstart
,
213 bus_addr_t rend
, bus_size_t size
, bus_size_t align
,
214 bus_size_t boundary
, int cacheable
, bus_addr_t
*addrp
,
215 bus_space_handle_t
*bshp
);
218 * int bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh,
221 * Free a region of bus space.
224 void bus_space_free(bus_space_tag_t
, bus_space_handle_t bsh
,
228 * int mac68k_bus_space_probe(bus_space_tag_t t, bus_space_handle_t bsh,
229 * bus_size_t offset, int sz);
231 * Probe the bus at t/bsh/offset, using sz as the size of the load.
233 * This is a machine-dependent extension, and is not to be used by
234 * machine-independent code.
237 int mac68k_bus_space_probe(bus_space_tag_t
,
238 bus_space_handle_t bsh
, bus_size_t
, int sz
);
241 * u_intN_t bus_space_read_N(bus_space_tag_t tag,
242 * bus_space_handle_t bsh, bus_size_t offset);
244 * Read a 1, 2, 4, or 8 byte quantity from bus space
245 * described by tag/handle/offset.
248 u_int8_t
mac68k_bsr1(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
);
249 u_int8_t
mac68k_bsr1_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
);
250 u_int16_t
mac68k_bsr2(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
);
251 u_int16_t
mac68k_bsr2_swap(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
);
252 u_int16_t
mac68k_bsr2_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
);
253 u_int16_t
mac68k_bsrs2_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
);
254 u_int32_t
mac68k_bsr4(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
);
255 u_int32_t
mac68k_bsr4_swap(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
);
256 u_int32_t
mac68k_bsr4_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
);
257 u_int32_t
mac68k_bsrs4_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
);
259 #define bus_space_read_1(t,h,o) (h).bsr1((t), &(h), (o))
260 #define bus_space_read_2(t,h,o) (h).bsr2((t), &(h), (o))
261 #define bus_space_read_4(t,h,o) (h).bsr4((t), &(h), (o))
262 #define bus_space_read_stream_1(t,h,o) (h).bsrs1((t), &(h), (o))
263 #define bus_space_read_stream_2(t,h,o) (h).bsrs2((t), &(h), (o))
264 #define bus_space_read_stream_4(t,h,o) (h).bsrs4((t), &(h), (o))
266 #if 0 /* Cause a link error for bus_space_read_8 */
267 #define bus_space_read_8(t, h, o) !!! bus_space_read_8 unimplemented !!!
268 #define bus_space_read_stream_8(t, h, o) \
269 !!! bus_space_read_stream_8 unimplemented !!!
273 * void bus_space_read_multi_N(bus_space_tag_t tag,
274 * bus_space_handle_t bsh, bus_size_t offset, u_intN_t *addr,
277 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
278 * described by tag/handle/offset and copy into buffer provided.
281 void mac68k_bsrm1(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
283 void mac68k_bsrm1_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
285 void mac68k_bsrm2(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
286 u_int16_t
*, size_t);
287 void mac68k_bsrm2_swap(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
288 u_int16_t
*, size_t);
289 void mac68k_bsrm2_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
290 u_int16_t
*, size_t);
291 void mac68k_bsrms2_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
292 u_int16_t
*, size_t);
293 void mac68k_bsrm4(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
294 u_int32_t
*, size_t);
295 void mac68k_bsrms4(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
296 u_int32_t
*, size_t);
297 void mac68k_bsrm4_swap(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
298 u_int32_t
*, size_t);
299 void mac68k_bsrm4_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
300 u_int32_t
*, size_t);
301 void mac68k_bsrms4_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
302 u_int32_t
*, size_t);
304 #if defined(DIAGNOSTIC)
305 #define bus_space_read_multi_1(t, h, o, a, c) do { \
307 panic("bus_space_read_multi_1 called with zero count."); \
308 (h).bsrm1(t,&(h),o,a,c); } while (0)
309 #define bus_space_read_multi_2(t, h, o, a, c) do { \
311 panic("bus_space_read_multi_2 called with zero count."); \
312 (h).bsrm2(t,&(h),o,a,c); } while (0)
313 #define bus_space_read_multi_4(t, h, o, a, c) do { \
315 panic("bus_space_read_multi_4 called with zero count."); \
316 (h).bsrm4(t,&(h),o,a,c); } while (0)
317 #define bus_space_read_multi_stream_1(t, h, o, a, c) do { \
319 panic("bus_space_read_multi_stream_1 called with count=0."); \
320 (h).bsrms1(t,&(h),o,a,c); } while (0)
321 #define bus_space_read_multi_stream_2(t, h, o, a, c) do { \
323 panic("bus_space_read_multi_stream_2 called with count=0."); \
324 (h).bsrms2(t,&(h),o,a,c); } while (0)
325 #define bus_space_read_multi_stream_4(t, h, o, a, c) do { \
327 panic("bus_space_read_multi_stream_4 called with count=0."); \
328 (h).bsrms4(t,&(h),o,a,c); } while (0)
330 #define bus_space_read_multi_1(t, h, o, a, c) \
331 do { if (c) (h).bsrm1(t, &(h), o, a, c); } while (0)
332 #define bus_space_read_multi_2(t, h, o, a, c) \
333 do { if (c) (h).bsrm2(t, &(h), o, a, c); } while (0)
334 #define bus_space_read_multi_4(t, h, o, a, c) \
335 do { if (c) (h).bsrm4(t, &(h), o, a, c); } while (0)
336 #define bus_space_read_multi_stream_1(t, h, o, a, c) \
337 do { if (c) (h).bsrms1(t, &(h), o, a, c); } while (0)
338 #define bus_space_read_multi_stream_2(t, h, o, a, c) \
339 do { if (c) (h).bsrms2(t, &(h), o, a, c); } while (0)
340 #define bus_space_read_multi_stream_4(t, h, o, a, c) \
341 do { if (c) (h).bsrms4(t, &(h), o, a, c); } while (0)
344 #if 0 /* Cause a link error for bus_space_read_multi_8 */
345 #define bus_space_read_multi_8 !!! bus_space_read_multi_8 unimplemented !!!
346 #define bus_space_read_multi_stream_8 \
347 !!! bus_space_read_multi_stream_8 unimplemented !!!
351 * void bus_space_read_region_N(bus_space_tag_t tag,
352 * bus_space_handle_t bsh, bus_size_t offset,
353 * u_intN_t *addr, size_t count);
355 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
356 * described by tag/handle and starting at `offset' and copy into
360 void mac68k_bsrr1(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
362 void mac68k_bsrr1_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
364 void mac68k_bsrr2(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
365 u_int16_t
*, size_t);
366 void mac68k_bsrr2_swap(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
367 u_int16_t
*, size_t);
368 void mac68k_bsrr2_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
369 u_int16_t
*, size_t);
370 void mac68k_bsrrs2_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
371 u_int16_t
*, size_t);
372 void mac68k_bsrr4(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
373 u_int32_t
*, size_t);
374 void mac68k_bsrr4_swap(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
375 u_int32_t
*, size_t);
376 void mac68k_bsrr4_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
377 u_int32_t
*, size_t);
378 void mac68k_bsrrs4_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
379 u_int32_t
*, size_t);
381 #if defined(DIAGNOSTIC)
382 #define bus_space_read_region_1(t, h, o, a, c) do { \
384 panic("bus_space_read_region_1 called with zero count."); \
385 (h).bsrr1(t,&(h),o,a,c); } while (0)
386 #define bus_space_read_region_2(t, h, o, a, c) do { \
388 panic("bus_space_read_region_2 called with zero count."); \
389 (h).bsrr2(t,&(h),o,a,c); } while (0)
390 #define bus_space_read_region_4(t, h, o, a, c) do { \
392 panic("bus_space_read_region_4 called with zero count."); \
393 (h).bsrr4(t,&(h),o,a,c); } while (0)
394 #define bus_space_read_region_stream_1(t, h, o, a, c) do { \
396 panic("bus_space_read_region_stream_1 called with count=0."); \
397 (h).bsrrs1(t,&(h),o,a,c); } while (0)
398 #define bus_space_read_region_stream_2(t, h, o, a, c) do { \
400 panic("bus_space_read_region_stream_2 called with count=0."); \
401 (h).bsrrs2(t,&(h),o,a,c); } while (0)
402 #define bus_space_read_region_stream_4(t, h, o, a, c) do { \
404 panic("bus_space_read_region_stream_4 called with count=0."); \
405 (h).bsrrs4(t,&(h),o,a,c); } while (0)
407 #define bus_space_read_region_1(t, h, o, a, c) \
408 do { if (c) (h).bsrr1(t,&(h),o,a,c); } while (0)
409 #define bus_space_read_region_2(t, h, o, a, c) \
410 do { if (c) (h).bsrr2(t,&(h),o,a,c); } while (0)
411 #define bus_space_read_region_4(t, h, o, a, c) \
412 do { if (c) (h).bsrr4(t,&(h),o,a,c); } while (0)
413 #define bus_space_read_region_stream_1(t, h, o, a, c) \
414 do { if (c) (h).bsrrs1(t,&(h),o,a,c); } while (0)
415 #define bus_space_read_region_stream_2(t, h, o, a, c) \
416 do { if (c) (h).bsrrs2(t,&(h),o,a,c); } while (0)
417 #define bus_space_read_region_stream_4(t, h, o, a, c) \
418 do { if (c) (h).bsrrs4(t,&(h),o,a,c); } while (0)
421 #if 0 /* Cause a link error for bus_space_read_region_8 */
422 #define bus_space_read_region_8 !!! bus_space_read_region_8 unimplemented !!!
423 #define bus_space_read_region_stream_8 \
424 !!! bus_space_read_region_stream_8 unimplemented !!!
428 * void bus_space_write_N(bus_space_tag_t tag,
429 * bus_space_handle_t bsh, bus_size_t offset, u_intN_t value);
431 * Write the 1, 2, 4, or 8 byte value `value' to bus space
432 * described by tag/handle/offset.
435 void mac68k_bsw1(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
, u_int8_t
);
436 void mac68k_bsw1_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
438 void mac68k_bsw2(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
, u_int16_t
);
439 void mac68k_bsw2_swap(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
441 void mac68k_bsw2_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
443 void mac68k_bsws2_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
445 void mac68k_bsw4(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
, u_int32_t
);
446 void mac68k_bsw4_swap(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
448 void mac68k_bsw4_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
450 void mac68k_bsws4_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
453 #define bus_space_write_1(t, h, o, v) (h).bsw1(t, &(h), o, v)
454 #define bus_space_write_2(t, h, o, v) (h).bsw2(t, &(h), o, v)
455 #define bus_space_write_4(t, h, o, v) (h).bsw4(t, &(h), o, v)
456 #define bus_space_write_stream_1(t, h, o, v) (h).bsws1(t, &(h), o, v)
457 #define bus_space_write_stream_2(t, h, o, v) (h).bsws2(t, &(h), o, v)
458 #define bus_space_write_stream_4(t, h, o, v) (h).bsws4(t, &(h), o, v)
460 #if 0 /* Cause a link error for bus_space_write_8 */
461 #define bus_space_write_8 !!! bus_space_write_8 not implemented !!!
462 #define bus_space_write_stream_8 \
463 !!! bus_space_write_stream_8 not implemented !!!
467 * void bus_space_write_multi_N(bus_space_tag_t tag,
468 * bus_space_handle_t bsh, bus_size_t offset, const u_intN_t *addr,
471 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
472 * provided to bus space described by tag/handle/offset.
475 void mac68k_bswm1(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
476 const u_int8_t
*, size_t);
477 void mac68k_bswm1_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
478 const u_int8_t
*, size_t);
479 void mac68k_bswm2(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
480 const u_int16_t
*, size_t);
481 void mac68k_bswm2_swap(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
482 const u_int16_t
*, size_t);
483 void mac68k_bswm2_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
484 const u_int16_t
*, size_t);
485 void mac68k_bswms2_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
486 const u_int16_t
*, size_t);
487 void mac68k_bswm4(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
488 const u_int32_t
*, size_t);
489 void mac68k_bswm4_swap(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
490 const u_int32_t
*, size_t);
491 void mac68k_bswm4_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
492 const u_int32_t
*, size_t);
493 void mac68k_bswms4_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
494 const u_int32_t
*, size_t);
496 #if defined(DIAGNOSTIC)
497 #define bus_space_write_multi_1(t, h, o, a, c) do { \
499 panic("bus_space_write_multi_1 called with zero count."); \
500 (h).bswm1(t,&(h),o,a,c); } while (0)
501 #define bus_space_write_multi_2(t, h, o, a, c) do { \
503 panic("bus_space_write_multi_2 called with zero count."); \
504 (h).bswm2(t,&(h),o,a,c); } while (0)
505 #define bus_space_write_multi_4(t, h, o, a, c) do { \
507 panic("bus_space_write_multi_4 called with zero count."); \
508 (h).bswm4(t,&(h),o,a,c); } while (0)
509 #define bus_space_write_multi_stream_1(t, h, o, a, c) do { \
511 panic("bus_space_write_multi_stream_1 called with count=0."); \
512 (h).bswms1(t,&(h),o,a,c); } while (0)
513 #define bus_space_write_multi_stream_2(t, h, o, a, c) do { \
515 panic("bus_space_write_multi_stream_2 called with count=0."); \
516 (h).bswms2(t,&(h),o,a,c); } while (0)
517 #define bus_space_write_multi_stream_4(t, h, o, a, c) do { \
519 panic("bus_space_write_multi_stream_4 called with count=0."); \
520 (h).bswms4(t,&(h),o,a,c); } while (0)
522 #define bus_space_write_multi_1(t, h, o, a, c) \
523 do { if (c) (h).bswm1(t, &(h), o, a, c); } while (0)
524 #define bus_space_write_multi_2(t, h, o, a, c) \
525 do { if (c) (h).bswm2(t, &(h), o, a, c); } while (0)
526 #define bus_space_write_multi_4(t, h, o, a, c) \
527 do { if (c) (h).bswm4(t, &(h), o, a, c); } while (0)
528 #define bus_space_write_multi_stream_1(t, h, o, a, c) \
529 do { if (c) (h).bswms1(t, &(h), o, a, c); } while (0)
530 #define bus_space_write_multi_stream_2(t, h, o, a, c) \
531 do { if (c) (h).bswms2(t, &(h), o, a, c); } while (0)
532 #define bus_space_write_multi_stream_4(t, h, o, a, c) \
533 do { if (c) (h).bswms4(t, &(h), o, a, c); } while (0)
536 #if 0 /* Cause a link error for bus_space_write_8 */
537 #define bus_space_write_multi_8(t, h, o, a, c) \
538 !!! bus_space_write_multi_8 unimplimented !!!
539 #define bus_space_write_multi_stream_8(t, h, o, a, c) \
540 !!! bus_space_write_multi_stream_8 unimplimented !!!
544 * void bus_space_write_region_N(bus_space_tag_t tag,
545 * bus_space_handle_t bsh, bus_size_t offset, const u_intN_t *addr,
548 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided
549 * to bus space described by tag/handle starting at `offset'.
552 void mac68k_bswr1(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
553 const u_int8_t
*, size_t);
554 void mac68k_bswr1_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
555 const u_int8_t
*, size_t);
556 void mac68k_bswr2(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
557 const u_int16_t
*, size_t);
558 void mac68k_bswr2_swap(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
559 const u_int16_t
*, size_t);
560 void mac68k_bswr2_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
561 const u_int16_t
*, size_t);
562 void mac68k_bswrs2_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
563 const u_int16_t
*, size_t);
564 void mac68k_bswr4(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
565 const u_int32_t
*, size_t);
566 void mac68k_bswr4_swap(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
567 const u_int32_t
*, size_t);
568 void mac68k_bswr4_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
569 const u_int32_t
*, size_t);
570 void mac68k_bswrs4_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
571 const u_int32_t
*, size_t);
573 #if defined(DIAGNOSTIC)
574 #define bus_space_write_region_1(t, h, o, a, c) do { \
576 panic("bus_space_write_region_1 called with zero count."); \
577 (h).bswr1(t,&(h),o,a,c); } while (0)
578 #define bus_space_write_region_2(t, h, o, a, c) do { \
580 panic("bus_space_write_region_2 called with zero count."); \
581 (h).bswr2(t,&(h),o,a,c); } while (0)
582 #define bus_space_write_region_4(t, h, o, a, c) do { \
584 panic("bus_space_write_region_4 called with zero count."); \
585 (h).bswr4(t,&(h),o,a,c); } while (0)
586 #define bus_space_write_region_stream_1(t, h, o, a, c) do { \
588 panic("bus_space_write_region_stream_1 called with count=0."); \
589 (h).bswrs1(t,&(h),o,a,c); } while (0)
590 #define bus_space_write_region_stream_2(t, h, o, a, c) do { \
592 panic("bus_space_write_region_stream_2 called with count=0."); \
593 (h).bswrs2(t,&(h),o,a,c); } while (0)
594 #define bus_space_write_region_stream_4(t, h, o, a, c) do { \
596 panic("bus_space_write_region_stream_4 called with count=0."); \
597 (h).bswrs4(t,&(h),o,a,c); } while (0)
599 #define bus_space_write_region_1(t, h, o, a, c) \
600 do { if (c) (h).bswr1(t,&(h),o,a,c); } while (0)
601 #define bus_space_write_region_2(t, h, o, a, c) \
602 do { if (c) (h).bswr2(t,&(h),o,a,c); } while (0)
603 #define bus_space_write_region_4(t, h, o, a, c) \
604 do { if (c) (h).bswr4(t,&(h),o,a,c); } while (0)
605 #define bus_space_write_region_stream_1(t, h, o, a, c) \
606 do { if (c) (h).bswrs1(t,&(h),o,a,c); } while (0)
607 #define bus_space_write_region_stream_2(t, h, o, a, c) \
608 do { if (c) (h).bswrs2(t,&(h),o,a,c); } while (0)
609 #define bus_space_write_region_stream_4(t, h, o, a, c) \
610 do { if (c) (h).bswrs4(t,&(h),o,a,c); } while (0)
613 #if 0 /* Cause a link error for bus_space_write_region_8 */
614 #define bus_space_write_region_8 \
615 !!! bus_space_write_region_8 unimplemented !!!
616 #define bus_space_write_region_stream_8 \
617 !!! bus_space_write_region_stream_8 unimplemented !!!
621 * void bus_space_set_multi_N(bus_space_tag_t tag,
622 * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
625 * Write the 1, 2, 4, or 8 byte value `val' to bus space described
626 * by tag/handle/offset `count' times.
629 void mac68k_bssm1(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
631 void mac68k_bssm1_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
633 void mac68k_bssm2(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
635 void mac68k_bssm2_swap(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
637 void mac68k_bssm2_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
639 void mac68k_bssm4(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
641 void mac68k_bssm4_swap(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
643 void mac68k_bssm4_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
646 #if defined(DIAGNOSTIC)
647 #define bus_space_set_multi_1(t, h, o, val, c) do { \
649 panic("bus_space_set_multi_1 called with zero count."); \
650 (h).bssm1(t,&(h),o,val,c); } while (0)
651 #define bus_space_set_multi_2(t, h, o, val, c) do { \
653 panic("bus_space_set_multi_2 called with zero count."); \
654 (h).bssm2(t,&(h),o,val,c); } while (0)
655 #define bus_space_set_multi_4(t, h, o, val, c) do { \
657 panic("bus_space_set_multi_4 called with zero count."); \
658 (h).bssm4(t,&(h),o,val,c); } while (0)
660 #define bus_space_set_multi_1(t, h, o, val, c) \
661 do { if (c) (h).bssm1(t,&(h),o,val,c); } while (0)
662 #define bus_space_set_multi_2(t, h, o, val, c) \
663 do { if (c) (h).bssm2(t,&(h),o,val,c); } while (0)
664 #define bus_space_set_multi_4(t, h, o, val, c) \
665 do { if (c) (h).bssm4(t,&(h),o,val,c); } while (0)
668 #if 0 /* Cause a link error for bus_space_set_multi_8 */
669 #define bus_space_set_multi_8 \
670 !!! bus_space_set_multi_8 unimplemented !!!
674 * void bus_space_set_region_N(bus_space_tag_t tag,
675 * bus_space_handle_t bsh, bus_size_t, u_intN_t val,
678 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
679 * by tag/handle starting at `offset'.
682 void mac68k_bssr1(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
684 void mac68k_bssr1_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
686 void mac68k_bssr2(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
688 void mac68k_bssr2_swap(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
690 void mac68k_bssr2_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
692 void mac68k_bssr4(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
694 void mac68k_bssr4_swap(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
696 void mac68k_bssr4_gen(bus_space_tag_t
, bus_space_handle_t
*, bus_size_t
,
699 #if defined(DIAGNOSTIC)
700 #define bus_space_set_region_1(t, h, o, val, c) do { \
702 panic("bus_space_set_region_1 called with zero count."); \
703 (h).bssr1(t,&(h),o,val,c); } while (0)
704 #define bus_space_set_region_2(t, h, o, val, c) do { \
706 panic("bus_space_set_region_2 called with zero count."); \
707 (h).bssr2(t,&(h),o,val,c); } while (0)
708 #define bus_space_set_region_4(t, h, o, val, c) do { \
710 panic("bus_space_set_region_4 called with zero count."); \
711 (h).bssr4(t,&(h),o,val,c); } while (0)
713 #define bus_space_set_region_1(t, h, o, val, c) \
714 do { if (c) (h).bssr1(t,&(h),o,val,c); } while (0)
715 #define bus_space_set_region_2(t, h, o, val, c) \
716 do { if (c) (h).bssr2(t,&(h),o,val,c); } while (0)
717 #define bus_space_set_region_4(t, h, o, val, c) \
718 do { if (c) (h).bssr4(t,&(h),o,val,c); } while (0)
721 #if 0 /* Cause a link error for bus_space_set_region_8 */
722 #define bus_space_set_region_8 \
723 !!! bus_space_set_region_8 unimplemented !!!
727 * void bus_space_copy_N(bus_space_tag_t tag,
728 * bus_space_handle_t bsh1, bus_size_t off1,
729 * bus_space_handle_t bsh2, bus_size_t off2, size_t count);
731 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
732 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
735 #define __MAC68K_copy_region_N(BYTES) \
736 static __inline void __CONCAT(bus_space_copy_region_,BYTES) \
738 bus_space_handle_t, bus_size_t, \
739 bus_space_handle_t, bus_size_t, \
742 static __inline void \
743 __CONCAT(bus_space_copy_region_,BYTES)( \
745 bus_space_handle_t h1, \
747 bus_space_handle_t h2, \
753 if ((h1.base + o1) >= (h2.base + o2)) { \
754 /* src after dest: copy forward */ \
755 for (o = 0; c != 0; c--, o += BYTES) \
756 __CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o, \
757 __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \
759 /* dest after src: copy backwards */ \
760 for (o = (c - 1) * BYTES; c != 0; c--, o -= BYTES) \
761 __CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o, \
762 __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \
765 __MAC68K_copy_region_N(1)
766 __MAC68K_copy_region_N(2)
767 __MAC68K_copy_region_N(4)
768 #if 0 /* Cause a link error for bus_space_copy_8 */
769 #define bus_space_copy_8 \
770 !!! bus_space_copy_8 unimplemented !!!
773 #undef __MAC68K_copy_region_N
776 * Bus read/write barrier methods.
778 * void bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t bsh,
779 * bus_size_t offset, bus_size_t len, int flags);
781 * Note: the 680x0 does not currently require barriers, but we must
782 * provide the flags to MI code.
784 #define bus_space_barrier(t, h, o, l, f) \
785 ((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f)))
786 #define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */
787 #define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */
789 #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
791 #include <m68k/bus_dma.h>
793 #endif /* _MAC68K_BUS_H_ */