2 * Copyright (c) 2006 Semihalf, Rafal Jaworowski <raj@semihalf.com>
3 * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
6 * This code is derived from software contributed to The NetBSD Foundation
7 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
8 * NASA Ames Research Center.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the NetBSD
21 * Foundation, Inc. and its contributors.
22 * 4. Neither the name of The NetBSD Foundation nor the names of its
23 * contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
39 #include <sys/cdefs.h>
40 __FBSDID("$FreeBSD$");
42 #include <sys/param.h>
43 #include <sys/systm.h>
46 #include <machine/bus.h>
47 #include <machine/pio.h>
49 #define TODO panic("%s: not implemented", __func__)
51 static __inline void *
52 __ppc_ba(bus_space_handle_t bsh, bus_size_t ofs)
54 return ((void *)(bsh + ofs));
58 bs_gen_map(bus_addr_t addr, bus_size_t size __unused, int flags __unused,
59 bus_space_handle_t *bshp)
66 bs_gen_unmap(bus_size_t size __unused)
71 bs_gen_subregion(bus_space_handle_t bsh, bus_size_t ofs,
72 bus_size_t size __unused, bus_space_handle_t *nbshp)
79 bs_gen_alloc(bus_addr_t rstart __unused, bus_addr_t rend __unused,
80 bus_size_t size __unused, bus_size_t alignment __unused,
81 bus_size_t boundary __unused, int flags __unused,
82 bus_addr_t *bpap __unused, bus_space_handle_t *bshp __unused)
88 bs_gen_free(bus_space_handle_t bsh __unused, bus_size_t size __unused)
94 bs_gen_barrier(bus_space_handle_t bsh __unused, bus_size_t ofs __unused,
95 bus_size_t size __unused, int flags __unused)
97 __asm __volatile("" : : : "memory");
101 * Big-endian access functions
104 bs_be_rs_1(bus_space_handle_t bsh, bus_size_t ofs)
106 return (in8(__ppc_ba(bsh, ofs)));
110 bs_be_rs_2(bus_space_handle_t bsh, bus_size_t ofs)
112 return (in16(__ppc_ba(bsh, ofs)));
116 bs_be_rs_4(bus_space_handle_t bsh, bus_size_t ofs)
118 return (in32(__ppc_ba(bsh, ofs)));
122 bs_be_rs_8(bus_space_handle_t bsh, bus_size_t ofs)
128 bs_be_rm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
130 ins8(__ppc_ba(bsh, ofs), addr, cnt);
134 bs_be_rm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
136 ins16(__ppc_ba(bsh, ofs), addr, cnt);
140 bs_be_rm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
142 ins32(__ppc_ba(bsh, ofs), addr, cnt);
146 bs_be_rm_8(bus_space_handle_t bshh, bus_size_t ofs, uint64_t *addr, size_t cnt)
152 bs_be_rr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
154 volatile uint8_t *s = __ppc_ba(bsh, ofs);
158 __asm __volatile("eieio; sync");
162 bs_be_rr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
164 volatile uint16_t *s = __ppc_ba(bsh, ofs);
168 __asm __volatile("eieio; sync");
172 bs_be_rr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
174 volatile uint32_t *s = __ppc_ba(bsh, ofs);
178 __asm __volatile("eieio; sync");
182 bs_be_rr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
188 bs_be_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val)
190 out8(__ppc_ba(bsh, ofs), val);
194 bs_be_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val)
196 out16(__ppc_ba(bsh, ofs), val);
200 bs_be_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val)
202 out32(__ppc_ba(bsh, ofs), val);
206 bs_be_ws_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val)
212 bs_be_wm_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
215 outsb(__ppc_ba(bsh, ofs), addr, cnt);
219 bs_be_wm_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
222 outsw(__ppc_ba(bsh, ofs), addr, cnt);
226 bs_be_wm_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
229 outsl(__ppc_ba(bsh, ofs), addr, cnt);
233 bs_be_wm_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
240 bs_be_wr_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
243 volatile uint8_t *d = __ppc_ba(bsh, ofs);
247 __asm __volatile("eieio; sync");
251 bs_be_wr_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
254 volatile uint16_t *d = __ppc_ba(bsh, ofs);
258 __asm __volatile("eieio; sync");
262 bs_be_wr_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
265 volatile uint32_t *d = __ppc_ba(bsh, ofs);
269 __asm __volatile("eieio; sync");
273 bs_be_wr_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
280 bs_be_sm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
282 volatile uint8_t *d = __ppc_ba(bsh, ofs);
286 __asm __volatile("eieio; sync");
290 bs_be_sm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
292 volatile uint16_t *d = __ppc_ba(bsh, ofs);
296 __asm __volatile("eieio; sync");
300 bs_be_sm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
302 volatile uint32_t *d = __ppc_ba(bsh, ofs);
306 __asm __volatile("eieio; sync");
310 bs_be_sm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
316 bs_be_sr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
318 volatile uint8_t *d = __ppc_ba(bsh, ofs);
322 __asm __volatile("eieio; sync");
326 bs_be_sr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
328 volatile uint16_t *d = __ppc_ba(bsh, ofs);
332 __asm __volatile("eieio; sync");
336 bs_be_sr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
338 volatile uint32_t *d = __ppc_ba(bsh, ofs);
342 __asm __volatile("eieio; sync");
346 bs_be_sr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
352 * Little-endian access functions
355 bs_le_rs_1(bus_space_handle_t bsh, bus_size_t ofs)
357 return (in8(__ppc_ba(bsh, ofs)));
361 bs_le_rs_2(bus_space_handle_t bsh, bus_size_t ofs)
363 return (in16rb(__ppc_ba(bsh, ofs)));
367 bs_le_rs_4(bus_space_handle_t bsh, bus_size_t ofs)
369 return (in32rb(__ppc_ba(bsh, ofs)));
373 bs_le_rs_8(bus_space_handle_t bsh, bus_size_t ofs)
379 bs_le_rm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
381 ins8(__ppc_ba(bsh, ofs), addr, cnt);
385 bs_le_rm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
387 ins16rb(__ppc_ba(bsh, ofs), addr, cnt);
391 bs_le_rm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
393 ins32rb(__ppc_ba(bsh, ofs), addr, cnt);
397 bs_le_rm_8(bus_space_handle_t bshh, bus_size_t ofs, uint64_t *addr, size_t cnt)
403 bs_le_rr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
405 volatile uint8_t *s = __ppc_ba(bsh, ofs);
409 __asm __volatile("eieio; sync");
413 bs_le_rr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
415 volatile uint16_t *s = __ppc_ba(bsh, ofs);
418 *addr++ = in16rb(s++);
419 __asm __volatile("eieio; sync");
423 bs_le_rr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
425 volatile uint32_t *s = __ppc_ba(bsh, ofs);
428 *addr++ = in32rb(s++);
429 __asm __volatile("eieio; sync");
433 bs_le_rr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
439 bs_le_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val)
441 out8(__ppc_ba(bsh, ofs), val);
445 bs_le_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val)
447 out16rb(__ppc_ba(bsh, ofs), val);
451 bs_le_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val)
453 out32rb(__ppc_ba(bsh, ofs), val);
457 bs_le_ws_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val)
463 bs_le_wm_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
466 outs8(__ppc_ba(bsh, ofs), addr, cnt);
470 bs_le_wm_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
473 outs16rb(__ppc_ba(bsh, ofs), addr, cnt);
477 bs_le_wm_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
480 outs32rb(__ppc_ba(bsh, ofs), addr, cnt);
484 bs_le_wm_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
491 bs_le_wr_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
494 volatile uint8_t *d = __ppc_ba(bsh, ofs);
498 __asm __volatile("eieio; sync");
502 bs_le_wr_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
505 volatile uint16_t *d = __ppc_ba(bsh, ofs);
508 out16rb(d++, *addr++);
509 __asm __volatile("eieio; sync");
513 bs_le_wr_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
516 volatile uint32_t *d = __ppc_ba(bsh, ofs);
519 out32rb(d++, *addr++);
520 __asm __volatile("eieio; sync");
524 bs_le_wr_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
531 bs_le_sm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
533 volatile uint8_t *d = __ppc_ba(bsh, ofs);
537 __asm __volatile("eieio; sync");
541 bs_le_sm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
543 volatile uint16_t *d = __ppc_ba(bsh, ofs);
547 __asm __volatile("eieio; sync");
551 bs_le_sm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
553 volatile uint32_t *d = __ppc_ba(bsh, ofs);
557 __asm __volatile("eieio; sync");
561 bs_le_sm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
567 bs_le_sr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
569 volatile uint8_t *d = __ppc_ba(bsh, ofs);
573 __asm __volatile("eieio; sync");
577 bs_le_sr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
579 volatile uint16_t *d = __ppc_ba(bsh, ofs);
583 __asm __volatile("eieio; sync");
587 bs_le_sr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
589 volatile uint32_t *d = __ppc_ba(bsh, ofs);
593 __asm __volatile("eieio; sync");
597 bs_le_sr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
602 struct bus_space bs_be_tag = {
603 /* mapping/unmapping */
608 /* allocation/deallocation */
696 struct bus_space bs_le_tag = {
697 /* mapping/unmapping */
702 /* allocation/deallocation */