Annotation of sys/arch/mac68k/include/bus.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: bus.h,v 1.12 2006/04/16 19:07:35 miod Exp $ */
2: /* $NetBSD: bus.h,v 1.9 1998/01/13 18:32:15 scottr Exp $ */
3:
4: /*-
5: * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
6: * All rights reserved.
7: *
8: * This code is derived from software contributed to The NetBSD Foundation
9: * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
10: * NASA Ames Research Center.
11: *
12: * Redistribution and use in source and binary forms, with or without
13: * modification, are permitted provided that the following conditions
14: * are met:
15: * 1. Redistributions of source code must retain the above copyright
16: * notice, this list of conditions and the following disclaimer.
17: * 2. Redistributions in binary form must reproduce the above copyright
18: * notice, this list of conditions and the following disclaimer in the
19: * documentation and/or other materials provided with the distribution.
20: * 3. All advertising materials mentioning features or use of this software
21: * must display the following acknowledgement:
22: * This product includes software developed by the NetBSD
23: * Foundation, Inc. and its contributors.
24: * 4. Neither the name of The NetBSD Foundation nor the names of its
25: * contributors may be used to endorse or promote products derived
26: * from this software without specific prior written permission.
27: *
28: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
29: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
30: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
32: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
34: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
35: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
36: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38: * POSSIBILITY OF SUCH DAMAGE.
39: */
40:
41: /*
42: * Copyright (C) 1997 Scott Reynolds. All rights reserved.
43: *
44: * Redistribution and use in source and binary forms, with or without
45: * modification, are permitted provided that the following conditions
46: * are met:
47: * 1. Redistributions of source code must retain the above copyright
48: * notice, this list of conditions and the following disclaimer.
49: * 2. Redistributions in binary form must reproduce the above copyright
50: * notice, this list of conditions and the following disclaimer in the
51: * documentation and/or other materials provided with the distribution.
52: * 3. The name of the author may not be used to endorse or promote products
53: * derived from this software without specific prior written permission
54: *
55: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
56: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
57: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
58: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
59: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
60: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
61: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
62: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
63: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
64: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
65: */
66:
67: #ifndef _MAC68K_BUS_H_
68: #define _MAC68K_BUS_H_
69:
70: /*
71: * Value for the mac68k bus space tag, not to be used directly by MI code.
72: */
73: #define MAC68K_BUS_SPACE_MEM 0 /* space is mem space */
74:
75: /*
76: * Bus address and size types
77: */
78: typedef u_long bus_addr_t;
79: typedef u_long bus_size_t;
80:
81: /*
82: * Access methods for bus resources and address space.
83: */
84: #define BSH_T struct bus_space_handle_s
85: typedef int bus_space_tag_t;
86: typedef struct bus_space_handle_s {
87: u_long base;
88: int swapped;
89:
90: u_int8_t (*bsr1)(bus_space_tag_t, BSH_T *, bus_size_t);
91: u_int16_t (*bsr2)(bus_space_tag_t, BSH_T *, bus_size_t);
92: u_int32_t (*bsr4)(bus_space_tag_t, BSH_T *, bus_size_t);
93: void (*bsrm1)(bus_space_tag_t, BSH_T *, bus_size_t,
94: u_int8_t *, size_t);
95: void (*bsrm2)(bus_space_tag_t, BSH_T *, bus_size_t,
96: u_int16_t *, size_t);
97: void (*bsrm4)(bus_space_tag_t, BSH_T *, bus_size_t,
98: u_int32_t *, 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,
104: u_int8_t *, 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,
110: u_int8_t *, 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,
117: u_int16_t);
118: void (*bsw4)(bus_space_tag_t, BSH_T *, bus_size_t,
119: u_int32_t);
120: void (*bswm1)(bus_space_tag_t, BSH_T *, bus_size_t,
121: const u_int8_t *, size_t);
122: void (*bswm2)(bus_space_tag_t, BSH_T *, bus_size_t,
123: const u_int16_t *, size_t);
124: void (*bswm4)(bus_space_tag_t, BSH_T *, bus_size_t,
125: const u_int32_t *, size_t);
126: void (*bswms1)(bus_space_tag_t, BSH_T *, bus_size_t,
127: const u_int8_t *, size_t);
128: void (*bswms2)(bus_space_tag_t, BSH_T *, bus_size_t,
129: const u_int16_t *, size_t);
130: void (*bswms4)(bus_space_tag_t, BSH_T *, bus_size_t,
131: const u_int32_t *, size_t);
132: void (*bswr1)(bus_space_tag_t, BSH_T *, bus_size_t,
133: const u_int8_t *, size_t);
134: void (*bswr2)(bus_space_tag_t, BSH_T *, bus_size_t,
135: const u_int16_t *, size_t);
136: void (*bswr4)(bus_space_tag_t, BSH_T *, bus_size_t,
137: const u_int32_t *, size_t);
138: void (*bswrs1)(bus_space_tag_t, BSH_T *, bus_size_t,
139: const u_int8_t *, size_t);
140: void (*bswrs2)(bus_space_tag_t, BSH_T *, bus_size_t,
141: const u_int16_t *, size_t);
142: void (*bswrs4)(bus_space_tag_t, BSH_T *, bus_size_t,
143: const u_int32_t *, size_t);
144: void (*bssm1)(bus_space_tag_t, BSH_T *, bus_size_t,
145: u_int8_t v, size_t);
146: void (*bssm2)(bus_space_tag_t, BSH_T *, bus_size_t,
147: u_int16_t v, size_t);
148: void (*bssm4)(bus_space_tag_t, BSH_T *, bus_size_t,
149: u_int32_t v, size_t);
150: void (*bssr1)(bus_space_tag_t, BSH_T *, bus_size_t,
151: u_int8_t v, size_t);
152: void (*bssr2)(bus_space_tag_t, BSH_T *, bus_size_t,
153: u_int16_t v, size_t);
154: void (*bssr4)(bus_space_tag_t, BSH_T *, bus_size_t,
155: u_int32_t v, size_t);
156: } bus_space_handle_t;
157: #undef BSH_T
158:
159: void mac68k_bus_space_handle_swapped(bus_space_tag_t,
160: bus_space_handle_t *h);
161:
162: /*
163: * int bus_space_map(bus_space_tag_t t, bus_addr_t addr,
164: * bus_size_t size, int flags, bus_space_handle_t *bshp);
165: *
166: * Map a region of bus space.
167: */
168:
169: #define BUS_SPACE_MAP_CACHEABLE 0x01
170: #define BUS_SPACE_MAP_LINEAR 0x02
171:
172: int bus_space_map(bus_space_tag_t, bus_addr_t, bus_size_t,
173: int, bus_space_handle_t *);
174:
175: /*
176: * void bus_space_unmap(bus_space_tag_t t,
177: * bus_space_handle_t bsh, bus_size_t size);
178: *
179: * Unmap a region of bus space.
180: */
181:
182: void bus_space_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t);
183:
184: /*
185: * int bus_space_subregion(bus_space_tag_t t,
186: * bus_space_handle_t bsh, bus_size_t offset, bus_size_t size,
187: * bus_space_handle_t *nbshp);
188: *
189: * Get a new handle for a subregion of an already-mapped area of bus space.
190: */
191:
192: int bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh,
193: bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp);
194:
195: /*
196: * int bus_space_alloc(bus_space_tag_t t, bus_addr_t, rstart,
197: * bus_addr_t rend, bus_size_t size, bus_size_t align,
198: * bus_size_t boundary, int flags, bus_addr_t *addrp,
199: * bus_space_handle_t *bshp);
200: *
201: * Allocate a region of bus space.
202: */
203:
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 cacheable, bus_addr_t *addrp,
207: bus_space_handle_t *bshp);
208:
209: /*
210: * int bus_space_free(bus_space_tag_t t,
211: * bus_space_handle_t bsh, bus_size_t size);
212: *
213: * Free a region of bus space.
214: */
215:
216: void bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh,
217: bus_size_t size);
218:
219: /*
220: * int mac68k_bus_space_probe(bus_space_tag_t t,
221: * bus_space_handle_t bsh, bus_size_t offset, int sz);
222: *
223: * Probe the bus at t/bsh/offset, using sz as the size of the load.
224: *
225: * This is a machine-dependent extension, and is not to be used by
226: * machine-independent code.
227: */
228:
229: int mac68k_bus_space_probe(bus_space_tag_t t,
230: bus_space_handle_t bsh, bus_size_t offset, int sz);
231:
232: /*
233: * u_intN_t bus_space_read_N(bus_space_tag_t tag,
234: * bus_space_handle_t bsh, bus_size_t offset);
235: *
236: * Read a 1, 2, 4, or 8 byte quantity from bus space
237: * described by tag/handle/offset.
238: */
239:
240: u_int8_t mac68k_bsr1(bus_space_tag_t tag, bus_space_handle_t *bsh,
241: bus_size_t offset);
242: u_int16_t mac68k_bsr2(bus_space_tag_t tag, bus_space_handle_t *bsh,
243: bus_size_t offset);
244: u_int16_t mac68k_bsr2_swap(bus_space_tag_t tag, bus_space_handle_t *bsh,
245: bus_size_t offset);
246: u_int32_t mac68k_bsr4(bus_space_tag_t tag, bus_space_handle_t *bsh,
247: bus_size_t offset);
248: u_int32_t mac68k_bsr4_swap(bus_space_tag_t tag, bus_space_handle_t *bsh,
249: bus_size_t offset);
250:
251: #define bus_space_read_1(t,h,o) (h).bsr1((t), &(h), (o))
252: #define bus_space_read_2(t,h,o) (h).bsr2((t), &(h), (o))
253: #define bus_space_read_4(t,h,o) (h).bsr4((t), &(h), (o))
254:
255: /*
256: * void bus_space_read_multi_N(bus_space_tag_t tag,
257: * bus_space_handle_t bsh, bus_size_t offset,
258: * u_intN_t *addr, size_t count);
259: *
260: * Read `count' 1, 2, 4, or 8 byte quantities from bus space
261: * described by tag/handle/offset and copy into buffer provided.
262: */
263:
264: void mac68k_bsrm1(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
265: u_int8_t *, size_t);
266: void mac68k_bsrm2(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
267: u_int16_t *, size_t);
268: void mac68k_bsrm2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
269: u_int16_t *, size_t);
270: void mac68k_bsrm4(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
271: u_int32_t *, size_t);
272: void mac68k_bsrms4(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
273: u_int32_t *, size_t);
274: void mac68k_bsrm4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
275: u_int32_t *, size_t);
276:
277: #define bus_space_read_multi_1(t, h, o, a, c) (h).bsrm1(t, &(h), o, a, c)
278: #define bus_space_read_multi_2(t, h, o, a, c) (h).bsrm2(t, &(h), o, a, c)
279: #define bus_space_read_multi_4(t, h, o, a, c) (h).bsrm4(t, &(h), o, a, c)
280:
281: /*
282: * void bus_space_read_region_N(bus_space_tag_t tag,
283: * bus_space_handle_t bsh, bus_size_t offset,
284: * u_intN_t *addr, size_t count);
285: *
286: * Read `count' 1, 2, 4, or 8 byte quantities from bus space
287: * described by tag/handle and starting at `offset' and copy into
288: * buffer provided.
289: */
290:
291: void mac68k_bsrr1(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
292: u_int8_t *, size_t);
293: void mac68k_bsrr2(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
294: u_int16_t *, size_t);
295: void mac68k_bsrr2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
296: u_int16_t *, size_t);
297: void mac68k_bsrr4(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
298: u_int32_t *, size_t);
299: void mac68k_bsrr4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
300: u_int32_t *, size_t);
301:
302: #define bus_space_read_region_1(t, h, o, a, c) (h).bsrr1(t,&(h),o,a,c)
303: #define bus_space_read_region_2(t, h, o, a, c) (h).bsrr2(t,&(h),o,a,c)
304: #define bus_space_read_region_4(t, h, o, a, c) (h).bsrr4(t,&(h),o,a,c)
305:
306: /*
307: * void bus_space_write_N(bus_space_tag_t tag,
308: * bus_space_handle_t bsh, bus_size_t offset,
309: * u_intN_t value);
310: *
311: * Write the 1, 2, 4, or 8 byte value `value' to bus space
312: * described by tag/handle/offset.
313: */
314:
315: void mac68k_bsw1(bus_space_tag_t, bus_space_handle_t *, bus_size_t, u_int8_t);
316: void mac68k_bsw2(bus_space_tag_t, bus_space_handle_t *, bus_size_t, u_int16_t);
317: void mac68k_bsw2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
318: u_int16_t);
319: void mac68k_bsw4(bus_space_tag_t, bus_space_handle_t *, bus_size_t, u_int32_t);
320: void mac68k_bsw4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
321: u_int32_t);
322:
323: #define bus_space_write_1(t, h, o, v) (h).bsw1(t, &(h), o, v)
324: #define bus_space_write_2(t, h, o, v) (h).bsw2(t, &(h), o, v)
325: #define bus_space_write_4(t, h, o, v) (h).bsw4(t, &(h), o, v)
326:
327: /*
328: * void bus_space_write_multi_N(bus_space_tag_t tag,
329: * bus_space_handle_t bsh, bus_size_t offset,
330: * const u_intN_t *addr, size_t count);
331: *
332: * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
333: * provided to bus space described by tag/handle/offset.
334: */
335:
336: void mac68k_bswm1(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
337: const u_int8_t *, size_t);
338: void mac68k_bswm2(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
339: const u_int16_t *, size_t);
340: void mac68k_bswm2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
341: const u_int16_t *, size_t);
342: void mac68k_bswm4(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
343: const u_int32_t *, size_t);
344: void mac68k_bswm4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
345: const u_int32_t *, size_t);
346:
347: #define bus_space_write_multi_1(t, h, o, a, c) (h).bswm1(t, &(h), o, a, c)
348: #define bus_space_write_multi_2(t, h, o, a, c) (h).bswm2(t, &(h), o, a, c)
349: #define bus_space_write_multi_4(t, h, o, a, c) (h).bswm4(t, &(h), o, a, c)
350:
351: /*
352: * void bus_space_write_region_N(bus_space_tag_t tag,
353: * bus_space_handle_t bsh, bus_size_t offset,
354: * const u_intN_t *addr, size_t count);
355: *
356: * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided
357: * to bus space described by tag/handle starting at `offset'.
358: */
359:
360: void mac68k_bswr1(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
361: const u_int8_t *, size_t);
362: void mac68k_bswr2(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
363: const u_int16_t *, size_t);
364: void mac68k_bswr2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
365: const u_int16_t *, size_t);
366: void mac68k_bswr4(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
367: const u_int32_t *, size_t);
368: void mac68k_bswr4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
369: const u_int32_t *, size_t);
370:
371: #define bus_space_write_region_1(t, h, o, a, c) (h).bswr1(t, &(h), o, a, c)
372: #define bus_space_write_region_2(t, h, o, a, c) (h).bswr2(t, &(h), o, a, c)
373: #define bus_space_write_region_4(t, h, o, a, c) (h).bswr4(t, &(h), o, a, c)
374:
375: /*
376: * void bus_space_set_multi_N(bus_space_tag_t tag,
377: * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
378: * size_t count);
379: *
380: * Write the 1, 2, 4, or 8 byte value `val' to bus space described
381: * by tag/handle/offset `count' times.
382: */
383:
384: void mac68k_bssm1(bus_space_tag_t t, bus_space_handle_t *h,
385: bus_size_t o, u_int8_t v, size_t c);
386: void mac68k_bssm2(bus_space_tag_t t, bus_space_handle_t *h,
387: bus_size_t o, u_int16_t v, size_t c);
388: void mac68k_bssm2_swap(bus_space_tag_t t, bus_space_handle_t *h,
389: bus_size_t o, u_int16_t v, size_t c);
390: void mac68k_bssm4(bus_space_tag_t t, bus_space_handle_t *h,
391: bus_size_t o, u_int32_t v, size_t c);
392: void mac68k_bssm4_swap(bus_space_tag_t t, bus_space_handle_t *h,
393: bus_size_t o, u_int32_t v, size_t c);
394:
395: #define bus_space_set_multi_1(t, h, o, val, c) (h).bssm1(t, &(h), o, val, c)
396: #define bus_space_set_multi_2(t, h, o, val, c) (h).bssm2(t, &(h), o, val, c)
397: #define bus_space_set_multi_4(t, h, o, val, c) (h).bssm4(t, &(h), o, val, c)
398:
399: /*
400: * void bus_space_set_region_N(bus_space_tag_t tag,
401: * bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
402: * size_t count);
403: *
404: * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
405: * by tag/handle starting at `offset'.
406: */
407:
408: void mac68k_bssr1(bus_space_tag_t t, bus_space_handle_t *h,
409: bus_size_t o, u_int8_t v, size_t c);
410: void mac68k_bssr2(bus_space_tag_t t, bus_space_handle_t *h,
411: bus_size_t o, u_int16_t v, size_t c);
412: void mac68k_bssr2_swap(bus_space_tag_t t, bus_space_handle_t *h,
413: bus_size_t o, u_int16_t v, size_t c);
414: void mac68k_bssr4(bus_space_tag_t t, bus_space_handle_t *h,
415: bus_size_t o, u_int32_t v, size_t c);
416: void mac68k_bssr4_swap(bus_space_tag_t t, bus_space_handle_t *h,
417: bus_size_t o, u_int32_t v, size_t c);
418:
419: #define bus_space_set_region_1(t, h, o, val, c) (h).bssr1(t, &(h), o, val, c)
420: #define bus_space_set_region_2(t, h, o, val, c) (h).bssr2(t, &(h), o, val, c)
421: #define bus_space_set_region_4(t, h, o, val, c) (h).bssr4(t, &(h), o, val, c)
422:
423: /*
424: * Bus read/write barrier methods.
425: *
426: * void bus_space_barrier(bus_space_tag_t tag,
427: * bus_space_handle_t bsh, bus_size_t offset,
428: * bus_size_t len, int flags);
429: *
430: * Note: the 680x0 does not currently require barriers, but we must
431: * provide the flags to MI code.
432: */
433: #define bus_space_barrier(t, h, o, l, f) \
434: ((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f)))
435: #define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */
436: #define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */
437:
438: #define bus_space_vaddr(t, h) (void *)((h).base)
439:
440: #endif /* _MAC68K_BUS_H_ */
CVSweb