1 /*	$NetBSD: bus_space_through.c,v 1.4 2005/12/11 12:17:33 christos Exp $	*/
2 
3 /*-
4  * Copyright (c) 2001 TAKEMRUA Shin. All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. Neither the name of the project nor the names of its contributors
15  *    may be used to endorse or promote products derived from this software
16  *    without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  *
30  */
31 
32 #include <sys/cdefs.h>
33 __KERNEL_RCSID(0, "$NetBSD: bus_space_through.c,v 1.4 2005/12/11 12:17:33 christos Exp $");
34 
35 #include <sys/systm.h>
36 #include <machine/bus.h>
37 
38 bus_space_protos(bs_through);
39 /*
40  * Mapping and unmapping operations.
41  */
42 int
43 bs_through_bs_map(bus_space_tag_t t, bus_addr_t addr,
44     bus_size_t size, int cacheable, bus_space_handle_t *bshp)
45 {
46 	return bus_space_map(t->bs_base, addr, size, cacheable, bshp);
47 }
48 
49 void
50 bs_through_bs_unmap(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size)
51 {
52 	bus_space_unmap(t->bs_base, bsh, size);
53 }
54 
55 int
56 bs_through_bs_subregion(bus_space_tag_t t, bus_space_handle_t bsh,
57     bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp)
58 {
59 	return bus_space_subregion(t->bs_base, bsh, offset, size, nbshp);
60 }
61 
62 
63 /*
64  * Allocation and deallocation operations.
65  */
66 int
67 bs_through_bs_alloc(bus_space_tag_t t, bus_addr_t rstart, bus_addr_t rend,
68     bus_size_t size, bus_size_t align, bus_size_t boundary, int cacheable,
69     bus_addr_t *addrp, bus_space_handle_t *bshp)
70 {
71 	return bus_space_alloc(t->bs_base, rstart, rend, size, align, boundary,
72 	    cacheable, addrp, bshp);
73 }
74 
75 void
76 bs_through_bs_free(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size)
77 {
78 	bus_space_free(t->bs_base, bsh, size);
79 }
80 
81 
82 /*
83  * Get kernel virtual address for ranges mapped BUS_SPACE_MAP_LINEAR.
84  */
85 void *
86 bs_through_bs_vaddr(bus_space_tag_t t, bus_space_handle_t bsh)
87 {
88 	return bus_space_vaddr(t->bs_base, bsh);
89 }
90 
91 
92 /*
93  * MMap bus space for a user application.
94  */
95 paddr_t
96 bs_through_bs_mmap(bus_space_tag_t t, bus_addr_t addr, off_t offset,
97     int prot, int flags)
98 {
99 	return bus_space_mmap(t->bs_base, addr, offset, prot, flags);
100 }
101 
102 
103 /*
104  * Bus barrier operations.
105  */
106 void
107 bs_through_bs_barrier(bus_space_tag_t t, bus_space_handle_t bsh,
108     bus_size_t offset, bus_size_t len, int flags)
109 {
110 	bus_space_barrier(t->bs_base, bsh, offset, len, flags);
111 }
112 
113 
114 /*
115  * Bus probe operations.
116  */
117 int
118 bs_through_bs_peek(bus_space_tag_t t, bus_space_handle_t bsh,
119     bus_size_t offset, size_t size, void *ptr)
120 {
121 	return bus_space_peek(t->bs_base, bsh, offset, size, ptr);
122 }
123 
124 int
125 bs_through_bs_poke(bus_space_tag_t t, bus_space_handle_t bsh,
126     bus_size_t offset, size_t size, u_int32_t val)
127 {
128 	return bus_space_poke(t->bs_base, bsh, offset, size, val);
129 }
130 
131 
132 /*
133  * Bus read (single) operations.
134  */
135 u_int8_t
136 bs_through_bs_r_1(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t offset)
137 {
138 	return bus_space_read_1(t->bs_base, bsh, offset);
139 }
140 
141 u_int16_t
142 bs_through_bs_r_2(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t offset)
143 {
144 	return bus_space_read_2(t->bs_base, bsh, offset);
145 }
146 
147 u_int32_t
148 bs_through_bs_r_4(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t offset)
149 {
150 	return bus_space_read_4(t->bs_base, bsh, offset);
151 }
152 
153 u_int64_t
154 bs_through_bs_r_8(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t offset)
155 {
156 	return bus_space_read_8(t->bs_base, bsh, offset);
157 }
158 
159 
160 /*
161  * Bus read multiple operations.
162  */
163 void
164 bs_through_bs_rm_1(bus_space_tag_t t, bus_space_handle_t bsh,
165 	    bus_size_t offset, u_int8_t *addr, bus_size_t count)
166 {
167 	bus_space_read_multi_1(t->bs_base, bsh, offset, addr, count);
168 }
169 
170 void
171 bs_through_bs_rm_2(bus_space_tag_t t, bus_space_handle_t bsh,
172 	    bus_size_t offset, u_int16_t *addr, bus_size_t count)
173 {
174 	bus_space_read_multi_2(t->bs_base, bsh, offset, addr, count);
175 }
176 
177 void
178 bs_through_bs_rm_4(bus_space_tag_t t, bus_space_handle_t bsh,
179 	    bus_size_t offset, u_int32_t *addr, bus_size_t count)
180 {
181 	bus_space_read_multi_4(t->bs_base, bsh, offset, addr, count);
182 }
183 
184 void
185 bs_through_bs_rm_8(bus_space_tag_t t, bus_space_handle_t bsh,
186 	    bus_size_t offset, u_int64_t *addr, bus_size_t count)
187 {
188 	bus_space_read_multi_8(t->bs_base, bsh, offset, addr, count);
189 }
190 
191 
192 /*
193  * Bus read region operations.
194  */
195 void
196 bs_through_bs_rr_1(bus_space_tag_t t, bus_space_handle_t bsh,
197 	    bus_size_t offset, u_int8_t *addr, bus_size_t count)
198 {
199 	bus_space_read_region_1(t->bs_base, bsh, offset, addr, count);
200 }
201 
202 void
203 bs_through_bs_rr_2(bus_space_tag_t t, bus_space_handle_t bsh,
204 	    bus_size_t offset, u_int16_t *addr, bus_size_t count)
205 {
206 	bus_space_read_region_2(t->bs_base, bsh, offset, addr, count);
207 }
208 
209 void
210 bs_through_bs_rr_4(bus_space_tag_t t, bus_space_handle_t bsh,
211 	    bus_size_t offset, u_int32_t *addr, bus_size_t count)
212 {
213 	bus_space_read_region_4(t->bs_base, bsh, offset, addr, count);
214 }
215 
216 void
217 bs_through_bs_rr_8(bus_space_tag_t t, bus_space_handle_t bsh,
218 	    bus_size_t offset, u_int64_t *addr, bus_size_t count)
219 {
220 	bus_space_read_region_8(t->bs_base, bsh, offset, addr, count);
221 }
222 
223 
224 /*
225  * Bus write (single) operations.
226  */
227 void
228 bs_through_bs_w_1(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t offset,
229     u_int8_t value)
230 {
231 	bus_space_write_1(t->bs_base, bsh, offset, value);
232 }
233 
234 void
235 bs_through_bs_w_2(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t offset,
236     u_int16_t value)
237 {
238 	bus_space_write_2(t->bs_base, bsh, offset, value);
239 }
240 
241 void
242 bs_through_bs_w_4(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t offset,
243     u_int32_t value)
244 {
245 	bus_space_write_4(t->bs_base, bsh, offset, value);
246 }
247 
248 void
249 bs_through_bs_w_8(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t offset,
250     u_int64_t value)
251 {
252 	bus_space_write_8(t->bs_base, bsh, offset, value);
253 }
254 
255 
256 /*
257  * Bus write multiple operations.
258  */
259 void
260 bs_through_bs_wm_1(bus_space_tag_t t, bus_space_handle_t bsh,
261     bus_size_t offset, const u_int8_t *addr, bus_size_t count)
262 {
263 	bus_space_write_multi_1(t->bs_base, bsh, offset, addr, count);
264 }
265 
266 void
267 bs_through_bs_wm_2(bus_space_tag_t t, bus_space_handle_t bsh,
268     bus_size_t offset, const u_int16_t *addr, bus_size_t count)
269 {
270 	bus_space_write_multi_2(t->bs_base, bsh, offset, addr, count);
271 }
272 
273 void
274 bs_through_bs_wm_4(bus_space_tag_t t, bus_space_handle_t bsh,
275     bus_size_t offset, const u_int32_t *addr, bus_size_t count)
276 {
277 	bus_space_write_multi_4(t->bs_base, bsh, offset, addr, count);
278 }
279 
280 void
281 bs_through_bs_wm_8(bus_space_tag_t t, bus_space_handle_t bsh,
282     bus_size_t offset, const u_int64_t *addr, bus_size_t count)
283 {
284 	bus_space_write_multi_8(t->bs_base, bsh, offset, addr, count);
285 }
286 
287 
288 /*
289  * Bus write region operations.
290  */
291 void
292 bs_through_bs_wr_1(bus_space_tag_t t, bus_space_handle_t bsh,
293     bus_size_t offset, const u_int8_t *addr, bus_size_t count)
294 {
295 	bus_space_write_region_1(t->bs_base, bsh, offset, addr, count);
296 }
297 
298 void
299 bs_through_bs_wr_2(bus_space_tag_t t, bus_space_handle_t bsh,
300     bus_size_t offset, const u_int16_t *addr, bus_size_t count)
301 {
302 	bus_space_write_region_2(t->bs_base, bsh, offset, addr, count);
303 }
304 
305 void
306 bs_through_bs_wr_4(bus_space_tag_t t, bus_space_handle_t bsh,
307     bus_size_t offset, const u_int32_t *addr, bus_size_t count)
308 {
309 	bus_space_write_region_4(t->bs_base, bsh, offset, addr, count);
310 }
311 
312 void
313 bs_through_bs_wr_8(bus_space_tag_t t, bus_space_handle_t bsh,
314     bus_size_t offset, const u_int64_t *addr, bus_size_t count)
315 {
316 	bus_space_write_region_8(t->bs_base, bsh, offset, addr, count);
317 }
318 
319 #ifdef BUS_SPACE_HAS_REAL_STREAM_METHODS
320 /*
321  * Bus read (single) operations.
322  */
323 u_int8_t
324 bs_through_bs_rs_1(bus_space_tag_t t, bus_space_handle_t bsh,
325     bus_size_t offset)
326 {
327 	return bus_space_read_stream_1(t->bs_base, bsh, offset);
328 }
329 
330 u_int16_t
331 bs_through_bs_rs_2(bus_space_tag_t t, bus_space_handle_t bsh,
332     bus_size_t offset)
333 {
334 	return bus_space_read_stream_2(t->bs_base, bsh, offset);
335 }
336 
337 u_int32_t
338 bs_through_bs_rs_4(bus_space_tag_t t, bus_space_handle_t bsh,
339     bus_size_t offset)
340 {
341 	return bus_space_read_stream_4(t->bs_base, bsh, offset);
342 }
343 
344 u_int64_t
345 bs_through_bs_rs_8(bus_space_tag_t t, bus_space_handle_t bsh,
346     bus_size_t offset)
347 {
348 	return bus_space_read_stream_8(t->bs_base, bsh, offset);
349 }
350 
351 
352 /*
353  * Bus read multiple operations.
354  */
355 void
356 bs_through_bs_rms_1(bus_space_tag_t t, bus_space_handle_t bsh,
357 	    bus_size_t offset, u_int8_t *addr, bus_size_t count)
358 {
359 	bus_space_read_multi_stream_1(t->bs_base, bsh, offset, addr, count);
360 }
361 
362 void
363 bs_through_bs_rms_2(bus_space_tag_t t, bus_space_handle_t bsh,
364 	    bus_size_t offset, u_int16_t *addr, bus_size_t count)
365 {
366 	bus_space_read_multi_stream_2(t->bs_base, bsh, offset, addr, count);
367 }
368 
369 void
370 bs_through_bs_rms_4(bus_space_tag_t t, bus_space_handle_t bsh,
371 	    bus_size_t offset, u_int32_t *addr, bus_size_t count)
372 {
373 	bus_space_read_multi_stream_4(t->bs_base, bsh, offset, addr, count);
374 }
375 
376 void
377 bs_through_bs_rms_8(bus_space_tag_t t, bus_space_handle_t bsh,
378 	    bus_size_t offset, u_int64_t *addr, bus_size_t count)
379 {
380 	bus_space_read_multi_stream_8(t->bs_base, bsh, offset, addr, count);
381 }
382 
383 
384 /*
385  * Bus read region operations.
386  */
387 void
388 bs_through_bs_rrs_1(bus_space_tag_t t, bus_space_handle_t bsh,
389 	    bus_size_t offset, u_int8_t *addr, bus_size_t count)
390 {
391 	bus_space_read_reagion_stream_1(t->bs_base, bsh, offset, addr, count);
392 }
393 
394 void
395 bs_through_bs_rrs_2(bus_space_tag_t t, bus_space_handle_t bsh,
396 	    bus_size_t offset, u_int16_t *addr, bus_size_t count)
397 {
398 	bus_space_read_reagion_stream_2(t->bs_base, bsh, offset, addr, count);
399 }
400 
401 void
402 bs_through_bs_rrs_4(bus_space_tag_t t, bus_space_handle_t bsh,
403 	    bus_size_t offset, u_int32_t *addr, bus_size_t count)
404 {
405 	bus_space_read_reagion_stream_4(t->bs_base, bsh, offset, addr, count);
406 }
407 
408 void
409 bs_through_bs_rrs_8(bus_space_tag_t t, bus_space_handle_t bsh,
410 	    bus_size_t offset, u_int64_t *addr, bus_size_t count)
411 {
412 	bus_space_read_reagion_stream_8(t->bs_base, bsh, offset, addr, count);
413 }
414 
415 
416 /*
417  * Bus write (single) operations.
418  */
419 void
420 bs_through_bs_ws_1(bus_space_tag_t t, bus_space_handle_t bsh,
421     bus_size_t offset, u_int8_t value)
422 {
423 	bus_space_write_stream_1(t->bs_base, bsh, offset, value);
424 }
425 
426 void
427 bs_through_bs_ws_2(bus_space_tag_t t, bus_space_handle_t bsh,
428     bus_size_t offset, u_int16_t value)
429 {
430 	bus_space_write_stream_2(t->bs_base, bsh, offset, value);
431 }
432 
433 void
434 bs_through_bs_ws_4(bus_space_tag_t t, bus_space_handle_t bsh,
435     bus_size_t offset, u_int32_t value)
436 {
437 	bus_space_write_stream_4(t->bs_base, bsh, offset, value);
438 }
439 
440 void
441 bs_through_bs_ws_8(bus_space_tag_t t, bus_space_handle_t bsh,
442     bus_size_t offset, u_int64_t value)
443 {
444 	bus_space_write_stream_8(t->bs_base, bsh, offset, value);
445 }
446 
447 
448 /*
449  * Bus write multiple operations.
450  */
451 void
452 bs_through_bs_wms_1(bus_space_tag_t t, bus_space_handle_t bsh,
453     bus_size_t offset, const u_int8_t *addr, bus_size_t count)
454 {
455 	bus_space_write_multi_stream_1(t->bs_base, bsh, offset, addr, count);
456 }
457 
458 void
459 bs_through_bs_wms_2(bus_space_tag_t t, bus_space_handle_t bsh,
460     bus_size_t offset, const u_int16_t *addr, bus_size_t count)
461 {
462 	bus_space_write_multi_stream_2(t->bs_base, bsh, offset, addr, count);
463 }
464 
465 void
466 bs_through_bs_wms_4(bus_space_tag_t t, bus_space_handle_t bsh,
467     bus_size_t offset, const u_int32_t *addr, bus_size_t count)
468 {
469 	bus_space_write_multi_stream_4(t->bs_base, bsh, offset, addr, count);
470 }
471 
472 void
473 bs_through_bs_wms_8(bus_space_tag_t t, bus_space_handle_t bsh,
474     bus_size_t offset, const u_int64_t *addr, bus_size_t count)
475 {
476 	bus_space_write_multi_stream_8(t->bs_base, bsh, offset, addr, count);
477 }
478 
479 
480 /*
481  * Bus write region operations.
482  */
483 void
484 bs_through_bs_wrs_1(bus_space_tag_t t, bus_space_handle_t bsh,
485     bus_size_t offset, const u_int8_t *addr, bus_size_t count)
486 {
487 	bus_space_write_region_stream_1(t->bs_base, bsh, offset, addr, count);
488 }
489 
490 void
491 bs_through_bs_wrs_2(bus_space_tag_t t, bus_space_handle_t bsh,
492     bus_size_t offset, const u_int16_t *addr, bus_size_t count)
493 {
494 	bus_space_write_region_stream_2(t->bs_base, bsh, offset, addr, count);
495 }
496 
497 void
498 bs_through_bs_wrs_4(bus_space_tag_t t, bus_space_handle_t bsh,
499     bus_size_t offset, const u_int32_t *addr, bus_size_t count)
500 {
501 	bus_space_write_region_stream_4(t->bs_base, bsh, offset, addr, count);
502 }
503 
504 void
505 bs_through_bs_wrs_8(bus_space_tag_t t, bus_space_handle_t bsh,
506     bus_size_t offset, const u_int64_t *addr, bus_size_t count)
507 {
508 	bus_space_write_region_stream_8(t->bs_base, bsh, offset, addr, count);
509 }
510 #endif /* ! BUS_SPACE_HAS_REAL_STREAM_METHODS */
511 
512 
513 /*
514  * Set multiple operations.
515  */
516 void
517 bs_through_bs_sm_1(bus_space_tag_t t, bus_space_handle_t bsh,
518     bus_size_t offset, u_int8_t value, bus_size_t count)
519 {
520 	bus_space_set_multi_1(t->bs_base, bsh, offset, value, count);
521 }
522 
523 void
524 bs_through_bs_sm_2(bus_space_tag_t t, bus_space_handle_t bsh,
525     bus_size_t offset, u_int16_t value, bus_size_t count)
526 {
527 	bus_space_set_multi_2(t->bs_base, bsh, offset, value, count);
528 }
529 
530 void
531 bs_through_bs_sm_4(bus_space_tag_t t, bus_space_handle_t bsh,
532     bus_size_t offset, u_int32_t value, bus_size_t count)
533 {
534 	bus_space_set_multi_4(t->bs_base, bsh, offset, value, count);
535 }
536 
537 void
538 bs_through_bs_sm_8(bus_space_tag_t t, bus_space_handle_t bsh,
539     bus_size_t offset, u_int64_t value, bus_size_t count)
540 {
541 	bus_space_set_multi_8(t->bs_base, bsh, offset, value, count);
542 }
543 
544 /*
545  * Set region operations.
546  */
547 void
548 bs_through_bs_sr_1(bus_space_tag_t t, bus_space_handle_t bsh,
549     bus_size_t offset, u_int8_t value, bus_size_t count)
550 {
551 	bus_space_set_region_1(t->bs_base, bsh, offset, value, count);
552 }
553 
554 void
555 bs_through_bs_sr_2(bus_space_tag_t t, bus_space_handle_t bsh,
556     bus_size_t offset, u_int16_t value, bus_size_t count)
557 {
558 	bus_space_set_region_2(t->bs_base, bsh, offset, value, count);
559 }
560 
561 void
562 bs_through_bs_sr_4(bus_space_tag_t t, bus_space_handle_t bsh,
563     bus_size_t offset, u_int32_t value, bus_size_t count)
564 {
565 	bus_space_set_region_4(t->bs_base, bsh, offset, value, count);
566 }
567 
568 void
569 bs_through_bs_sr_8(bus_space_tag_t t, bus_space_handle_t bsh,
570     bus_size_t offset, u_int64_t value, bus_size_t count)
571 {
572 	bus_space_set_region_8(t->bs_base, bsh, offset, value, count);
573 }
574 
575 
576 /*
577  * Copy operations.
578  */
579 void
580 bs_through_bs_c_1(bus_space_tag_t t, bus_space_handle_t bsh1,
581     bus_size_t offset1, bus_space_handle_t bsh2,
582     bus_size_t offset2, bus_size_t n)
583 {
584 	bus_space_copy_region_1(t->bs_base, bsh1, offset1, bsh2, offset2, n);
585 }
586 
587 void
588 bs_through_bs_c_2(bus_space_tag_t t, bus_space_handle_t bsh1,
589     bus_size_t offset1, bus_space_handle_t bsh2,
590     bus_size_t offset2, bus_size_t n)
591 {
592 	bus_space_copy_region_2(t->bs_base, bsh1, offset1, bsh2, offset2, n);
593 }
594 
595 void
596 bs_through_bs_c_4(bus_space_tag_t t, bus_space_handle_t bsh1,
597     bus_size_t offset1, bus_space_handle_t bsh2,
598     bus_size_t offset2, bus_size_t n)
599 {
600 	bus_space_copy_region_4(t->bs_base, bsh1, offset1, bsh2, offset2, n);
601 }
602 
603 void
604 bs_through_bs_c_8(bus_space_tag_t t, bus_space_handle_t bsh1,
605     bus_size_t offset1, bus_space_handle_t bsh2,
606     bus_size_t offset2, bus_size_t n)
607 {
608 	bus_space_copy_region_8(t->bs_base, bsh1, offset1, bsh2, offset2, n);
609 }
610