1 /* $FreeBSD: src/sys/i386/include/bus_pc98.h,v 1.8.2.5 2002/03/03 05:42:50 nyan Exp $ */
2 /* $DragonFly: src/sys/platform/pc32/include/Attic/bus_pc98.h,v 1.4 2003/08/26 21:42:18 rob Exp $ */
3 /* $NecBSD: busio.h,v 3.25.4.2.2.1 2000/06/12 03:53:08 honda Exp $ */
4 /* $NetBSD: bus.h,v 1.12 1997/10/01 08:25:15 fvdl Exp $ */
7 * [NetBSD for NEC PC-98 series]
8 * Copyright (c) 1997, 1998
9 * NetBSD/pc98 porting staff. All rights reserved.
11 * [Ported for FreeBSD]
13 * TAKAHASHI Yoshihiro. All rights reserved.
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in the
22 * documentation and/or other materials provided with the distribution.
23 * 3. The name of the author may not be used to endorse or promote products
24 * derived from this software without specific prior written permission.
26 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
28 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
30 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
31 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
34 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
40 * Copyright (c) 1997, 1998
41 * Naofumi HONDA. All rights reserved.
43 * This module support generic bus address relocation mechanism.
44 * To reduce a function call overhead, we employ pascal call methods.
47 #ifndef _I386_BUS_PC98_H_
48 #define _I386_BUS_PC98_H_
50 #include <sys/systm.h>
55 * Bus address and size types
57 typedef u_int bus_addr_t;
58 typedef u_int bus_size_t;
60 #define BUS_SPACE_MAXSIZE_24BIT 0xFFFFFF
61 #define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF
62 #define BUS_SPACE_MAXSIZE (64 * 1024) /* Maximum supported size */
63 #define BUS_SPACE_MAXADDR_24BIT 0xFFFFFF
64 #define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
65 #define BUS_SPACE_MAXADDR 0xFFFFFFFF
67 #define BUS_SPACE_UNRESTRICTED (~0)
69 #define BUS_SPACE_IAT_MAXSIZE 32
72 * Access methods for bus resources and address space.
79 #define _PASCAL_CALL (void)
81 #define _BUS_SPACE_CALL_FUNCS_TAB(NAME,TYPE,BWN) \
82 NAME##_space_read_##BWN##, \
83 NAME##_space_read_multi_##BWN##, \
84 NAME##_space_read_region_##BWN##, \
85 NAME##_space_write_##BWN##, \
86 NAME##_space_write_multi_##BWN##, \
87 NAME##_space_write_region_##BWN##, \
88 NAME##_space_set_multi_##BWN##, \
89 NAME##_space_set_region_##BWN##, \
90 NAME##_space_copy_region_##BWN
92 #define _BUS_SPACE_CALL_FUNCS_PROTO(NAME,TYPE,BWN) \
93 TYPE NAME##_space_read_##BWN _PASCAL_CALL; \
94 void NAME##_space_read_multi_##BWN _PASCAL_CALL; \
95 void NAME##_space_read_region_##BWN _PASCAL_CALL; \
96 void NAME##_space_write_##BWN _PASCAL_CALL; \
97 void NAME##_space_write_multi_##BWN _PASCAL_CALL; \
98 void NAME##_space_write_region_##BWN _PASCAL_CALL; \
99 void NAME##_space_set_multi_##BWN _PASCAL_CALL; \
100 void NAME##_space_set_region_##BWN _PASCAL_CALL; \
101 void NAME##_space_copy_region_##BWN _PASCAL_CALL;
103 #define _BUS_SPACE_CALL_FUNCS(NAME,TYPE,BWN) \
104 TYPE (*##NAME##_read_##BWN) _PASCAL_CALL; \
105 void (*##NAME##_read_multi_##BWN) _PASCAL_CALL; \
106 void (*##NAME##_read_region_##BWN) _PASCAL_CALL; \
107 void (*##NAME##_write_##BWN) _PASCAL_CALL; \
108 void (*##NAME##_write_multi_##BWN) _PASCAL_CALL; \
109 void (*##NAME##_write_region_##BWN) _PASCAL_CALL; \
110 void (*##NAME##_set_multi_##BWN) _PASCAL_CALL; \
111 void (*##NAME##_set_region_##BWN) _PASCAL_CALL; \
112 void (*##NAME##_copy_region_##BWN) _PASCAL_CALL;
114 struct bus_space_access_methods {
115 /* 8 bits access methods */
116 _BUS_SPACE_CALL_FUNCS(bs,u_int8_t,1)
118 /* 16 bits access methods */
119 _BUS_SPACE_CALL_FUNCS(bs,u_int16_t,2)
121 /* 32 bits access methods */
122 _BUS_SPACE_CALL_FUNCS(bs,u_int32_t,4)
125 struct bus_space_tag {
126 #define BUS_SPACE_IO 0
127 #define BUS_SPACE_MEM 1
128 u_int bs_tag; /* bus space flags */
130 struct bus_space_access_methods bs_da; /* direct access */
131 struct bus_space_access_methods bs_ra; /* relocate access */
133 struct bus_space_access_methods bs_ida; /* indexed direct access */
136 typedef struct bus_space_tag *bus_space_tag_t;
139 * Values for the i386 bus space tag, not to be used directly by MI code.
141 extern struct bus_space_tag SBUS_io_space_tag;
142 extern struct bus_space_tag SBUS_mem_space_tag;
144 #define I386_BUS_SPACE_IO (&SBUS_io_space_tag)
145 #define I386_BUS_SPACE_MEM (&SBUS_mem_space_tag)
150 struct bus_space_handle {
154 bus_addr_t bsh_iat[BUS_SPACE_IAT_MAXSIZE];
158 struct resource **bsh_res;
161 struct bus_space_access_methods bsh_bam;
163 typedef struct bus_space_handle *bus_space_handle_t;
166 * Allocate/Free bus_space_handle
168 int i386_bus_space_handle_alloc(bus_space_tag_t t, bus_addr_t bpa,
169 bus_size_t size, bus_space_handle_t *bshp);
170 void i386_bus_space_handle_free(bus_space_tag_t t, bus_space_handle_t bsh,
174 * int bus_space_unmap (bus_space_tag_t t,
175 * bus_space_handle_t bsh, bus_size_t size);
177 * Unmap a region of bus space.
180 void i386_memio_unmap(bus_space_tag_t t, bus_space_handle_t bsh,
183 #define bus_space_unmap(t, h, s) \
184 i386_memio_unmap((t), (h), (s))
187 * int bus_space_subregion (bus_space_tag_t t,
188 * bus_space_handle_t bsh, bus_size_t offset, bus_size_t size,
189 * bus_space_handle_t *nbshp);
191 * Get a new handle for a subregion of an already-mapped area of bus space.
194 int i386_memio_subregion(bus_space_tag_t t, bus_space_handle_t bsh,
195 bus_size_t offset, bus_size_t size,
196 bus_space_handle_t *nbshp);
198 #define bus_space_subregion(t, h, o, s, nhp) \
199 i386_memio_subregion((t), (h), (o), (s), (nhp))
202 * int bus_space_free (bus_space_tag_t t,
203 * bus_space_handle_t bsh, bus_size_t size);
205 * Free a region of bus space.
208 void i386_memio_free(bus_space_tag_t t, bus_space_handle_t bsh,
211 #define bus_space_free(t, h, s) \
212 i386_memio_free((t), (h), (s))
215 * Access methods for bus resources and address space.
217 #define _BUS_ACCESS_METHODS_PROTO(TYPE,BWN) \
218 static __inline TYPE bus_space_read_##BWN \
219 (bus_space_tag_t, bus_space_handle_t, bus_size_t offset); \
220 static __inline void bus_space_read_multi_##BWN \
221 (bus_space_tag_t, bus_space_handle_t, \
222 bus_size_t, TYPE *, size_t); \
223 static __inline void bus_space_read_region_##BWN \
224 (bus_space_tag_t, bus_space_handle_t, \
225 bus_size_t, TYPE *, size_t); \
226 static __inline void bus_space_write_##BWN \
227 (bus_space_tag_t, bus_space_handle_t, bus_size_t, TYPE); \
228 static __inline void bus_space_write_multi_##BWN \
229 (bus_space_tag_t, bus_space_handle_t, \
230 bus_size_t, const TYPE *, size_t); \
231 static __inline void bus_space_write_region_##BWN \
232 (bus_space_tag_t, bus_space_handle_t, \
233 bus_size_t, const TYPE *, size_t); \
234 static __inline void bus_space_set_multi_##BWN \
235 (bus_space_tag_t, bus_space_handle_t, bus_size_t, TYPE, size_t);\
236 static __inline void bus_space_set_region_##BWN \
237 (bus_space_tag_t, bus_space_handle_t, bus_size_t, TYPE, size_t);\
238 static __inline void bus_space_copy_region_##BWN \
239 (bus_space_tag_t, bus_space_handle_t, bus_size_t, \
240 bus_space_handle_t, bus_size_t, size_t);
242 _BUS_ACCESS_METHODS_PROTO(u_int8_t,1)
243 _BUS_ACCESS_METHODS_PROTO(u_int16_t,2)
244 _BUS_ACCESS_METHODS_PROTO(u_int32_t,4)
249 #define _BUS_SPACE_READ(TYPE,BWN) \
250 static __inline TYPE \
251 bus_space_read_##BWN##(tag, bsh, offset) \
252 bus_space_tag_t tag; \
253 bus_space_handle_t bsh; \
256 register TYPE result; \
258 __asm __volatile("call *%2" \
261 :"o" (bsh->bsh_bam.bs_read_##BWN), \
269 _BUS_SPACE_READ(u_int8_t,1)
270 _BUS_SPACE_READ(u_int16_t,2)
271 _BUS_SPACE_READ(u_int32_t,4)
276 #define _BUS_SPACE_WRITE(TYPE,BWN) \
277 static __inline void \
278 bus_space_write_##BWN##(tag, bsh, offset, val) \
279 bus_space_tag_t tag; \
280 bus_space_handle_t bsh; \
285 __asm __volatile("call *%1" \
287 :"o" (bsh->bsh_bam.bs_write_##BWN), \
294 _BUS_SPACE_WRITE(u_int8_t,1)
295 _BUS_SPACE_WRITE(u_int16_t,2)
296 _BUS_SPACE_WRITE(u_int32_t,4)
301 #define _BUS_SPACE_READ_MULTI(TYPE,BWN) \
302 static __inline void \
303 bus_space_read_multi_##BWN##(tag, bsh, offset, buf, cnt) \
304 bus_space_tag_t tag; \
305 bus_space_handle_t bsh; \
311 __asm __volatile("call *%3" \
315 :"o" (bsh->bsh_bam.bs_read_multi_##BWN), \
323 _BUS_SPACE_READ_MULTI(u_int8_t,1)
324 _BUS_SPACE_READ_MULTI(u_int16_t,2)
325 _BUS_SPACE_READ_MULTI(u_int32_t,4)
330 #define _BUS_SPACE_WRITE_MULTI(TYPE,BWN) \
331 static __inline void \
332 bus_space_write_multi_##BWN##(tag, bsh, offset, buf, cnt) \
333 bus_space_tag_t tag; \
334 bus_space_handle_t bsh; \
340 __asm __volatile("call *%3" \
344 :"o" (bsh->bsh_bam.bs_write_multi_##BWN), \
352 _BUS_SPACE_WRITE_MULTI(u_int8_t,1)
353 _BUS_SPACE_WRITE_MULTI(u_int16_t,2)
354 _BUS_SPACE_WRITE_MULTI(u_int32_t,4)
359 #define _BUS_SPACE_READ_REGION(TYPE,BWN) \
360 static __inline void \
361 bus_space_read_region_##BWN##(tag, bsh, offset, buf, cnt) \
362 bus_space_tag_t tag; \
363 bus_space_handle_t bsh; \
369 __asm __volatile("call *%3" \
373 :"o" (bsh->bsh_bam.bs_read_region_##BWN), \
381 _BUS_SPACE_READ_REGION(u_int8_t,1)
382 _BUS_SPACE_READ_REGION(u_int16_t,2)
383 _BUS_SPACE_READ_REGION(u_int32_t,4)
388 #define _BUS_SPACE_WRITE_REGION(TYPE,BWN) \
389 static __inline void \
390 bus_space_write_region_##BWN##(tag, bsh, offset, buf, cnt) \
391 bus_space_tag_t tag; \
392 bus_space_handle_t bsh; \
398 __asm __volatile("call *%3" \
402 :"o" (bsh->bsh_bam.bs_write_region_##BWN), \
410 _BUS_SPACE_WRITE_REGION(u_int8_t,1)
411 _BUS_SPACE_WRITE_REGION(u_int16_t,2)
412 _BUS_SPACE_WRITE_REGION(u_int32_t,4)
417 #define _BUS_SPACE_SET_MULTI(TYPE,BWN) \
418 static __inline void \
419 bus_space_set_multi_##BWN##(tag, bsh, offset, val, cnt) \
420 bus_space_tag_t tag; \
421 bus_space_handle_t bsh; \
427 __asm __volatile("call *%2" \
430 :"o" (bsh->bsh_bam.bs_set_multi_##BWN), \
438 _BUS_SPACE_SET_MULTI(u_int8_t,1)
439 _BUS_SPACE_SET_MULTI(u_int16_t,2)
440 _BUS_SPACE_SET_MULTI(u_int32_t,4)
445 #define _BUS_SPACE_SET_REGION(TYPE,BWN) \
446 static __inline void \
447 bus_space_set_region_##BWN##(tag, bsh, offset, val, cnt) \
448 bus_space_tag_t tag; \
449 bus_space_handle_t bsh; \
455 __asm __volatile("call *%2" \
458 :"o" (bsh->bsh_bam.bs_set_region_##BWN), \
466 _BUS_SPACE_SET_REGION(u_int8_t,1)
467 _BUS_SPACE_SET_REGION(u_int16_t,2)
468 _BUS_SPACE_SET_REGION(u_int32_t,4)
473 #define _BUS_SPACE_COPY_REGION(BWN) \
474 static __inline void \
475 bus_space_copy_region_##BWN##(tag, sbsh, src, dbsh, dst, cnt) \
476 bus_space_tag_t tag; \
477 bus_space_handle_t sbsh; \
479 bus_space_handle_t dbsh; \
484 if (dbsh->bsh_bam.bs_copy_region_1 != sbsh->bsh_bam.bs_copy_region_1) \
485 panic("bus_space_copy_region: funcs mismatch (ENOSUPPORT)");\
487 __asm __volatile("call *%3" \
491 :"o" (dbsh->bsh_bam.bs_copy_region_##BWN), \
500 _BUS_SPACE_COPY_REGION(1)
501 _BUS_SPACE_COPY_REGION(2)
502 _BUS_SPACE_COPY_REGION(4)
505 * Bus read/write barrier methods.
507 * void bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t bsh,
508 * bus_size_t offset, bus_size_t len, int flags);
510 * Note: the i386 does not currently require barriers, but we must
511 * provide the flags to MI code.
513 #define bus_space_barrier(t, h, o, l, f) \
514 ((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f)))
515 #define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */
516 #define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */
518 #endif /* _I386_BUS_PC98_H_ */