bus.h revision 1.24 1 1.24 rkujawa /* $NetBSD: bus.h,v 1.24 2011/08/04 17:48:51 rkujawa Exp $ */
2 1.1 is
3 1.1 is /*
4 1.1 is * Copyright (c) 1996 Leo Weppelman. All rights reserved.
5 1.1 is *
6 1.1 is * Redistribution and use in source and binary forms, with or without
7 1.1 is * modification, are permitted provided that the following conditions
8 1.1 is * are met:
9 1.1 is * 1. Redistributions of source code must retain the above copyright
10 1.1 is * notice, this list of conditions and the following disclaimer.
11 1.1 is * 2. Redistributions in binary form must reproduce the above copyright
12 1.1 is * notice, this list of conditions and the following disclaimer in the
13 1.1 is * documentation and/or other materials provided with the distribution.
14 1.1 is *
15 1.1 is * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 1.1 is * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 1.1 is * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 1.1 is * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 1.1 is * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 1.1 is * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 1.1 is * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 1.1 is * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 1.1 is * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 1.1 is * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 1.1 is */
26 1.1 is
27 1.1 is #ifndef _AMIGA_BUS_H_
28 1.1 is #define _AMIGA_BUS_H_
29 1.1 is
30 1.4 is #include <sys/types.h>
31 1.5 is
32 1.12 is /* for public use: */
33 1.12 is
34 1.1 is /*
35 1.1 is * Memory addresses (in bus space)
36 1.1 is */
37 1.5 is
38 1.4 is typedef u_int32_t bus_addr_t;
39 1.4 is typedef u_int32_t bus_size_t;
40 1.1 is
41 1.1 is /*
42 1.1 is * Access methods for bus resources and address space.
43 1.1 is */
44 1.4 is typedef struct bus_space_tag *bus_space_tag_t;
45 1.4 is typedef u_long bus_space_handle_t;
46 1.4 is
47 1.12 is /* unpublic, but needed by method implementors */
48 1.12 is
49 1.5 is /*
50 1.5 is * Lazyness macros for function declarations.
51 1.5 is */
52 1.5 is
53 1.4 is #define bsr(what, typ) \
54 1.12 is typ (what)(bus_space_handle_t, bus_addr_t)
55 1.4 is
56 1.4 is #define bsw(what, typ) \
57 1.12 is void (what)(bus_space_handle_t, bus_addr_t, unsigned)
58 1.4 is
59 1.4 is #define bsrm(what, typ) \
60 1.12 is void (what)(bus_space_handle_t, bus_size_t, typ *, bus_size_t)
61 1.4 is
62 1.4 is #define bswm(what, typ) \
63 1.12 is void (what)(bus_space_handle_t, bus_size_t, const typ *, bus_size_t)
64 1.4 is
65 1.5 is #define bssr(what, typ) \
66 1.12 is void (what)(bus_space_handle_t, bus_size_t, unsigned, bus_size_t)
67 1.5 is
68 1.5 is #define bscr(what, typ) \
69 1.12 is void (what)(bus_space_handle_t, bus_size_t, \
70 1.12 is bus_space_handle_t, bus_size_t, bus_size_t)
71 1.5 is
72 1.5 is /*
73 1.5 is * Implementation specific structures.
74 1.5 is * XXX Don't use outside of bus_space definitions!
75 1.5 is * XXX maybe this should be encapsuled in a non-global .h file?
76 1.5 is */
77 1.5 is
78 1.5 is struct bus_space_tag {
79 1.5 is bus_addr_t base;
80 1.9 is const struct amiga_bus_space_methods *absm;
81 1.5 is };
82 1.5 is
83 1.4 is struct amiga_bus_space_methods {
84 1.5 is
85 1.12 is /* map, unmap, etc */
86 1.12 is
87 1.12 is int (*bsm)(bus_space_tag_t,
88 1.12 is bus_addr_t, bus_size_t, int, bus_space_handle_t *);
89 1.12 is
90 1.12 is int (*bsms)(bus_space_handle_t,
91 1.12 is bus_size_t, bus_size_t, bus_space_handle_t *);
92 1.12 is
93 1.12 is void (*bsu)(bus_space_handle_t, bus_size_t);
94 1.12 is
95 1.12 is /* placeholders for currently not implemented alloc and free */
96 1.12 is
97 1.12 is void *bsa;
98 1.12 is void *bsf;
99 1.12 is
100 1.12 is /* 8 bit methods */
101 1.12 is
102 1.12 is bsr(*bsr1, u_int8_t);
103 1.12 is bsw(*bsw1, u_int8_t);
104 1.12 is bsrm(*bsrm1, u_int8_t);
105 1.12 is bswm(*bswm1, u_int8_t);
106 1.12 is bsrm(*bsrr1, u_int8_t);
107 1.12 is bswm(*bswr1, u_int8_t);
108 1.12 is bssr(*bssr1, u_int8_t);
109 1.12 is bscr(*bscr1, u_int8_t);
110 1.12 is
111 1.4 is /* 16bit methods */
112 1.5 is
113 1.4 is bsr(*bsr2, u_int16_t);
114 1.4 is bsw(*bsw2, u_int16_t);
115 1.12 is bsr(*bsrs2, u_int16_t);
116 1.12 is bsw(*bsws2, u_int16_t);
117 1.4 is bsrm(*bsrm2, u_int16_t);
118 1.4 is bswm(*bswm2, u_int16_t);
119 1.12 is bsrm(*bsrms2, u_int16_t);
120 1.12 is bswm(*bswms2, u_int16_t);
121 1.4 is bsrm(*bsrr2, u_int16_t);
122 1.4 is bswm(*bswr2, u_int16_t);
123 1.7 is bsrm(*bsrrs2, u_int16_t);
124 1.7 is bswm(*bswrs2, u_int16_t);
125 1.5 is bssr(*bssr2, u_int16_t);
126 1.5 is bscr(*bscr2, u_int16_t);
127 1.4 is
128 1.24 rkujawa /* 32bit methods */
129 1.24 rkujawa
130 1.24 rkujawa bsr(*bsr4, u_int32_t);
131 1.24 rkujawa bsw(*bsw4, u_int32_t);
132 1.24 rkujawa bsr(*bsrs4, u_int32_t);
133 1.24 rkujawa bsw(*bsws4, u_int32_t);
134 1.24 rkujawa bsrm(*bsrm4, u_int32_t);
135 1.24 rkujawa bswm(*bswm4, u_int32_t);
136 1.24 rkujawa bsrm(*bsrms4, u_int32_t);
137 1.24 rkujawa bswm(*bswms4, u_int32_t);
138 1.24 rkujawa bsrm(*bsrr4, u_int32_t);
139 1.24 rkujawa bswm(*bswr4, u_int32_t);
140 1.24 rkujawa bsrm(*bsrrs4, u_int32_t);
141 1.24 rkujawa bswm(*bswrs4, u_int32_t);
142 1.24 rkujawa bssr(*bssr4, u_int32_t);
143 1.24 rkujawa bscr(*bscr4, u_int32_t);
144 1.24 rkujawa
145 1.4 is };
146 1.9 is
147 1.5 is /*
148 1.5 is * Macro definition of map, unmap, etc.
149 1.5 is */
150 1.1 is
151 1.12 is #define bus_space_map(t, o, s, f, hp) \
152 1.12 is ((t)->absm->bsm)((t), (o), (s), (f), (hp))
153 1.2 is
154 1.12 is #define bus_space_subregion(t, h, o, s, hp) \
155 1.12 is ((t)->absm->bsms)((h), (o), (s), (hp))
156 1.1 is
157 1.12 is #define bus_space_unmap(t, h, s) \
158 1.12 is ((t)->absm->bsu)((h), (s))
159 1.1 is
160 1.5 is /*
161 1.12 is * Macro definition of _2 functions as indirect method array calls
162 1.5 is */
163 1.5 is
164 1.12 is /* 0: Helper macros */
165 1.12 is
166 1.12 is #define dbsdr(n, t, h, o) ((t)->absm->n)((h), (o))
167 1.12 is #define dbsdw(n, t, h, o, v) ((t)->absm->n)((h), (o), (v))
168 1.12 is #define dbsm(n, t, h, o, p, c) ((t)->absm->n)((h), (o), (p), (c))
169 1.12 is #define dbss(n, t, h, o, v, c) ((t)->absm->n)((h), (o), (v), (c))
170 1.12 is #define dbsc(n, t, h, o, v, c) ((t)->absm->n)((h), (o), (v), (c))
171 1.1 is
172 1.12 is /* 1: byte-wide "functions" */
173 1.1 is
174 1.12 is #define bus_space_read_1(t, h, o) dbsdr(bsr1, t, h, o)
175 1.12 is #define bus_space_write_1(t, h, o, v) dbsdw(bsw1, t, h, o, v)
176 1.12 is
177 1.12 is #define bus_space_read_multi_1(t, h, o, p, c) dbsm(bsrm1, t, h, o, p, c)
178 1.12 is #define bus_space_write_multi_1(t, h, o, p, c) dbsm(bswm1, t, h, o, p, c)
179 1.12 is
180 1.12 is #define bus_space_read_region_1(t, h, o, p, c) dbsm(bsrr1, t, h, o, p, c)
181 1.12 is #define bus_space_write_region_1(t, h, o, p, c) dbsm(bswr1, t, h, o, p, c)
182 1.12 is
183 1.12 is #define bus_space_set_region_1(t, h, o, v, c) dbss(bssr1, t, h, o, v, c)
184 1.12 is #define bus_space_copy_region_1(t, h, o, g, q, c) dbss(bscr1, t, h, o, g, q, c)
185 1.5 is
186 1.5 is
187 1.12 is /* 2: word-wide "functions" */
188 1.5 is
189 1.12 is #define bus_space_read_2(t, h, o) dbsdr(bsr2, t, h, o)
190 1.12 is #define bus_space_write_2(t, h, o, v) dbsdw(bsw2, t, h, o, v)
191 1.12 is #define bus_space_read_stream_2(t, h, o) dbsdr(bsrs2, t, h, o)
192 1.12 is #define bus_space_write_stream_2(t, h, o, v) dbsdw(bsws2, t, h, o, v)
193 1.5 is
194 1.12 is #define bus_space_read_multi_2(t, h, o, p, c) dbsm(bsrm2, t, h, o, p, c)
195 1.12 is #define bus_space_write_multi_2(t, h, o, p, c) dbsm(bswm2, t, h, o, p, c)
196 1.5 is
197 1.12 is #define bus_space_read_multi_stream_2(t, h, o, p, c) \
198 1.12 is dbsm(bsrms2, t, h, o, p, c)
199 1.5 is
200 1.12 is #define bus_space_write_multi_stream_2(t, h, o, p, c) \
201 1.12 is dbsm(bswms2, t, h, o, p, c)
202 1.5 is
203 1.12 is #define bus_space_read_region_2(t, h, o, p, c) dbsm(bsrr2, t, h, o, p, c)
204 1.12 is #define bus_space_write_region_2(t, h, o, p, c) dbsm(bswr2, t, h, o, p, c)
205 1.5 is
206 1.7 is #define bus_space_read_region_stream_2(t, h, o, p, c) \
207 1.12 is dbsm(bsrrs2, t, h, o, p, c)
208 1.5 is
209 1.7 is #define bus_space_write_region_stream_2(t, h, o, p, c) \
210 1.12 is dbsm(bswrs2, t, h, o, p, c)
211 1.5 is
212 1.12 is #define bus_space_set_region_2(t, h, o, v, c) dbss(bssr2, t, h, o, v, c)
213 1.12 is #define bus_space_copy_region_2(t, h, o, g, q, c) dbss(bscr2, t, h, o, g, q, c)
214 1.10 drochner
215 1.24 rkujawa /* 4: long-wide "functions" */
216 1.18 jdolecek
217 1.24 rkujawa #define bus_space_read_4(t, h, o) dbsdr(bsr4, t, h, o)
218 1.24 rkujawa #define bus_space_write_4(t, h, o, v) dbsdw(bsw4, t, h, o, v)
219 1.24 rkujawa #define bus_space_read_stream_4(t, h, o) dbsdr(bsrs4, t, h, o)
220 1.24 rkujawa #define bus_space_write_stream_4(t, h, o, v) dbsdw(bsws4, t, h, o, v)
221 1.18 jdolecek
222 1.24 rkujawa #define bus_space_read_multi_4(t, h, o, p, c) dbsm(bsrm4, t, h, o, p, c)
223 1.24 rkujawa #define bus_space_write_multi_4(t, h, o, p, c) dbsm(bswm4, t, h, o, p, c)
224 1.13 aymeric
225 1.13 aymeric #define bus_space_read_multi_stream_4(t, h, o, p, c) \
226 1.24 rkujawa dbsm(bsrms4, t, h, o, p, c)
227 1.13 aymeric
228 1.13 aymeric #define bus_space_write_multi_stream_4(t, h, o, p, c) \
229 1.24 rkujawa dbsm(bswms4, t, h, o, p, c)
230 1.24 rkujawa
231 1.24 rkujawa #define bus_space_read_region_4(t, h, o, p, c) dbsm(bsrr4, t, h, o, p, c)
232 1.24 rkujawa #define bus_space_write_region_4(t, h, o, p, c) dbsm(bswr4, t, h, o, p, c)
233 1.13 aymeric
234 1.19 aymeric #define bus_space_read_region_stream_4(t, h, o, p, c) \
235 1.24 rkujawa dbsm(bsrrs4, t, h, o, p, c)
236 1.19 aymeric
237 1.19 aymeric #define bus_space_write_region_stream_4(t, h, o, p, c) \
238 1.24 rkujawa dbsm(bswrs4, t, h, o, p, c)
239 1.24 rkujawa
240 1.24 rkujawa #define bus_space_set_region_4(t, h, o, v, c) dbss(bssr4, t, h, o, v, c)
241 1.24 rkujawa #define bus_space_copy_region_4(t, h, o, g, q, c) dbss(bscr4, t, h, o, g, q, c)
242 1.19 aymeric
243 1.11 is /*
244 1.11 is * Bus read/write barrier methods.
245 1.11 is *
246 1.21 dsl * void bus_space_barrier(bus_space_tag_t tag,
247 1.11 is * bus_space_handle_t bsh, bus_size_t offset,
248 1.21 dsl * bus_size_t len, int flags);
249 1.11 is *
250 1.11 is * Note: the 680x0 does not currently require barriers, but we must
251 1.11 is * provide the flags to MI code.
252 1.11 is */
253 1.24 rkujawa void bus_space_barrier(bus_space_tag_t space, bus_space_handle_t handle,
254 1.24 rkujawa bus_size_t offset, bus_size_t length, int flags);
255 1.24 rkujawa
256 1.11 is #define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */
257 1.11 is #define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */
258 1.11 is
259 1.10 drochner #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
260 1.12 is
261 1.12 is #define __BUS_SPACE_HAS_STREAM_METHODS
262 1.12 is
263 1.24 rkujawa paddr_t bus_space_mmap(bus_space_tag_t t, bus_addr_t addr, off_t off, int prot,
264 1.24 rkujawa int flags);
265 1.24 rkujawa
266 1.24 rkujawa #define BUS_SPACE_MAP_CACHEABLE 0x01
267 1.24 rkujawa #define BUS_SPACE_MAP_LINEAR 0x02
268 1.24 rkujawa #define BUS_SPACE_MAP_PREFETCHABLE 0x04
269 1.24 rkujawa
270 1.23 phx /* Instruction for enforcing reorder protection. Nothing for 68k. */
271 1.23 phx #define amiga_bus_reorder_protect()
272 1.23 phx
273 1.24 rkujawa void * bus_space_vaddr(bus_space_tag_t space, bus_space_handle_t handle);
274 1.24 rkujawa
275 1.17 aymeric extern const struct amiga_bus_space_methods amiga_bus_stride_1;
276 1.24 rkujawa extern const struct amiga_bus_space_methods amiga_bus_stride_1swap;
277 1.24 rkujawa extern const struct amiga_bus_space_methods amiga_bus_stride_1swap_abs;
278 1.17 aymeric extern const struct amiga_bus_space_methods amiga_bus_stride_2;
279 1.17 aymeric extern const struct amiga_bus_space_methods amiga_bus_stride_4;
280 1.17 aymeric extern const struct amiga_bus_space_methods amiga_bus_stride_4swap;
281 1.17 aymeric extern const struct amiga_bus_space_methods amiga_bus_stride_16;
282 1.12 is
283 1.24 rkujawa void *zbusmap(void *pa, u_int size);
284 1.24 rkujawa
285 1.1 is #endif /* _AMIGA_BUS_H_ */
286 1.24 rkujawa
287