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