xref: /trueos/sys/powerpc/powerpc/bus_machdep.c (revision 2963fd0dfbdafac049cadecf0774e0c027b28c88)
1 /*-
2  * Copyright (c) 2006 Semihalf, Rafal Jaworowski <raj@semihalf.com>
3  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
4  * All rights reserved.
5  *
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.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
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.
25  *
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.
37  */
38 
39 #include <sys/cdefs.h>
40 __FBSDID("$FreeBSD$");
41 
42 #define	KTR_BE_IO	0
43 #define	KTR_LE_IO	0
44 
45 #include <sys/param.h>
46 #include <sys/systm.h>
47 #include <sys/bus.h>
48 #include <sys/ktr.h>
49 #include <vm/vm.h>
50 #include <vm/pmap.h>
51 
52 #include <machine/bus.h>
53 #include <machine/pio.h>
54 #include <machine/md_var.h>
55 
56 #define TODO panic("%s: not implemented", __func__)
57 
58 #define	MAX_EARLYBOOT_MAPPINGS	6
59 
60 static struct {
61 	vm_offset_t virt;
62 	bus_addr_t addr;
63 	bus_size_t size;
64 	int flags;
65 } earlyboot_mappings[MAX_EARLYBOOT_MAPPINGS];
66 static int earlyboot_map_idx = 0;
67 
68 void bs_remap_earlyboot(void);
69 
70 static __inline void *
__ppc_ba(bus_space_handle_t bsh,bus_size_t ofs)71 __ppc_ba(bus_space_handle_t bsh, bus_size_t ofs)
72 {
73 	return ((void *)(bsh + ofs));
74 }
75 
76 static int
bs_gen_map(bus_addr_t addr,bus_size_t size,int flags,bus_space_handle_t * bshp)77 bs_gen_map(bus_addr_t addr, bus_size_t size, int flags,
78     bus_space_handle_t *bshp)
79 {
80 	vm_memattr_t ma;
81 
82 	/*
83 	 * Record what we did if we haven't enabled the MMU yet. We
84 	 * will need to remap it as soon as the MMU comes up.
85 	 */
86 	if (!pmap_bootstrapped) {
87 		KASSERT(earlyboot_map_idx < MAX_EARLYBOOT_MAPPINGS,
88 		    ("%s: too many early boot mapping requests", __func__));
89 		earlyboot_mappings[earlyboot_map_idx].addr = addr;
90 		earlyboot_mappings[earlyboot_map_idx].virt =
91 		    pmap_early_io_map(addr, size);
92 		earlyboot_mappings[earlyboot_map_idx].size = size;
93 		earlyboot_mappings[earlyboot_map_idx].flags = flags;
94 		*bshp = earlyboot_mappings[earlyboot_map_idx].virt;
95 		earlyboot_map_idx++;
96 	} else {
97 		ma = VM_MEMATTR_DEFAULT;
98 		switch (flags) {
99 			case BUS_SPACE_MAP_CACHEABLE:
100 				ma = VM_MEMATTR_CACHEABLE;
101 				break;
102 			case BUS_SPACE_MAP_PREFETCHABLE:
103 				ma = VM_MEMATTR_PREFETCHABLE;
104 				break;
105 		}
106 		*bshp = (bus_space_handle_t)pmap_mapdev_attr(addr, size, ma);
107 	}
108 
109 	return (0);
110 }
111 
112 void
bs_remap_earlyboot(void)113 bs_remap_earlyboot(void)
114 {
115 	int i;
116 	vm_offset_t pa, spa, va;
117 	vm_memattr_t ma;
118 
119 	for (i = 0; i < earlyboot_map_idx; i++) {
120 		spa = earlyboot_mappings[i].addr;
121 		if (spa == earlyboot_mappings[i].virt &&
122 		   pmap_dev_direct_mapped(spa, earlyboot_mappings[i].size) == 0)
123 			continue;
124 
125 		ma = VM_MEMATTR_DEFAULT;
126 		switch (earlyboot_mappings[i].flags) {
127 			case BUS_SPACE_MAP_CACHEABLE:
128 				ma = VM_MEMATTR_CACHEABLE;
129 				break;
130 			case BUS_SPACE_MAP_PREFETCHABLE:
131 				ma = VM_MEMATTR_PREFETCHABLE;
132 				break;
133 		}
134 
135 		pa = trunc_page(spa);
136 		va = trunc_page(earlyboot_mappings[i].virt);
137 		while (pa < spa + earlyboot_mappings[i].size) {
138 			pmap_kenter_attr(va, pa, ma);
139 			va += PAGE_SIZE;
140 			pa += PAGE_SIZE;
141 		}
142 	}
143 }
144 
145 static void
bs_gen_unmap(bus_size_t size __unused)146 bs_gen_unmap(bus_size_t size __unused)
147 {
148 }
149 
150 static int
bs_gen_subregion(bus_space_handle_t bsh,bus_size_t ofs,bus_size_t size __unused,bus_space_handle_t * nbshp)151 bs_gen_subregion(bus_space_handle_t bsh, bus_size_t ofs,
152     bus_size_t size __unused, bus_space_handle_t *nbshp)
153 {
154 	*nbshp = bsh + ofs;
155 	return (0);
156 }
157 
158 static int
bs_gen_alloc(bus_addr_t rstart __unused,bus_addr_t rend __unused,bus_size_t size __unused,bus_size_t alignment __unused,bus_size_t boundary __unused,int flags __unused,bus_addr_t * bpap __unused,bus_space_handle_t * bshp __unused)159 bs_gen_alloc(bus_addr_t rstart __unused, bus_addr_t rend __unused,
160     bus_size_t size __unused, bus_size_t alignment __unused,
161     bus_size_t boundary __unused, int flags __unused,
162     bus_addr_t *bpap __unused, bus_space_handle_t *bshp __unused)
163 {
164 	TODO;
165 }
166 
167 static void
bs_gen_free(bus_space_handle_t bsh __unused,bus_size_t size __unused)168 bs_gen_free(bus_space_handle_t bsh __unused, bus_size_t size __unused)
169 {
170 	TODO;
171 }
172 
173 static void
bs_gen_barrier(bus_space_handle_t bsh __unused,bus_size_t ofs __unused,bus_size_t size __unused,int flags __unused)174 bs_gen_barrier(bus_space_handle_t bsh __unused, bus_size_t ofs __unused,
175     bus_size_t size __unused, int flags __unused)
176 {
177 
178 	powerpc_iomb();
179 }
180 
181 /*
182  * Big-endian access functions
183  */
184 static uint8_t
bs_be_rs_1(bus_space_handle_t bsh,bus_size_t ofs)185 bs_be_rs_1(bus_space_handle_t bsh, bus_size_t ofs)
186 {
187 	volatile uint8_t *addr;
188 	uint8_t res;
189 
190 	addr = __ppc_ba(bsh, ofs);
191 	res = *addr;
192 	powerpc_iomb();
193 	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
194 	return (res);
195 }
196 
197 static uint16_t
bs_be_rs_2(bus_space_handle_t bsh,bus_size_t ofs)198 bs_be_rs_2(bus_space_handle_t bsh, bus_size_t ofs)
199 {
200 	volatile uint16_t *addr;
201 	uint16_t res;
202 
203 	addr = __ppc_ba(bsh, ofs);
204 	res = *addr;
205 	powerpc_iomb();
206 	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
207 	return (res);
208 }
209 
210 static uint32_t
bs_be_rs_4(bus_space_handle_t bsh,bus_size_t ofs)211 bs_be_rs_4(bus_space_handle_t bsh, bus_size_t ofs)
212 {
213 	volatile uint32_t *addr;
214 	uint32_t res;
215 
216 	addr = __ppc_ba(bsh, ofs);
217 	res = *addr;
218 	powerpc_iomb();
219 	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
220 	return (res);
221 }
222 
223 static uint64_t
bs_be_rs_8(bus_space_handle_t bsh,bus_size_t ofs)224 bs_be_rs_8(bus_space_handle_t bsh, bus_size_t ofs)
225 {
226 	volatile uint64_t *addr;
227 	uint64_t res;
228 
229 	addr = __ppc_ba(bsh, ofs);
230 	res = *addr;
231 	powerpc_iomb();
232 	return (res);
233 }
234 
235 static void
bs_be_rm_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t * addr,size_t cnt)236 bs_be_rm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
237 {
238 	ins8(__ppc_ba(bsh, ofs), addr, cnt);
239 }
240 
241 static void
bs_be_rm_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t * addr,size_t cnt)242 bs_be_rm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
243 {
244 	ins16(__ppc_ba(bsh, ofs), addr, cnt);
245 }
246 
247 static void
bs_be_rm_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t * addr,size_t cnt)248 bs_be_rm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
249 {
250 	ins32(__ppc_ba(bsh, ofs), addr, cnt);
251 }
252 
253 static void
bs_be_rm_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t * addr,size_t cnt)254 bs_be_rm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
255 {
256 	ins64(__ppc_ba(bsh, ofs), addr, cnt);
257 }
258 
259 static void
bs_be_rr_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t * addr,size_t cnt)260 bs_be_rr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
261 {
262 	volatile uint8_t *s = __ppc_ba(bsh, ofs);
263 
264 	while (cnt--)
265 		*addr++ = *s++;
266 	powerpc_iomb();
267 }
268 
269 static void
bs_be_rr_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t * addr,size_t cnt)270 bs_be_rr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
271 {
272 	volatile uint16_t *s = __ppc_ba(bsh, ofs);
273 
274 	while (cnt--)
275 		*addr++ = *s++;
276 	powerpc_iomb();
277 }
278 
279 static void
bs_be_rr_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t * addr,size_t cnt)280 bs_be_rr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
281 {
282 	volatile uint32_t *s = __ppc_ba(bsh, ofs);
283 
284 	while (cnt--)
285 		*addr++ = *s++;
286 	powerpc_iomb();
287 }
288 
289 static void
bs_be_rr_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t * addr,size_t cnt)290 bs_be_rr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
291 {
292 	volatile uint64_t *s = __ppc_ba(bsh, ofs);
293 
294 	while (cnt--)
295 		*addr++ = *s++;
296 	powerpc_iomb();
297 }
298 
299 static void
bs_be_ws_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val)300 bs_be_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val)
301 {
302 	volatile uint8_t *addr;
303 
304 	addr = __ppc_ba(bsh, ofs);
305 	*addr = val;
306 	powerpc_iomb();
307 	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
308 }
309 
310 static void
bs_be_ws_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val)311 bs_be_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val)
312 {
313 	volatile uint16_t *addr;
314 
315 	addr = __ppc_ba(bsh, ofs);
316 	*addr = val;
317 	powerpc_iomb();
318 	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
319 }
320 
321 static void
bs_be_ws_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val)322 bs_be_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val)
323 {
324 	volatile uint32_t *addr;
325 
326 	addr = __ppc_ba(bsh, ofs);
327 	*addr = val;
328 	powerpc_iomb();
329 	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
330 }
331 
332 static void
bs_be_ws_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val)333 bs_be_ws_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val)
334 {
335 	volatile uint64_t *addr;
336 
337 	addr = __ppc_ba(bsh, ofs);
338 	*addr = val;
339 	powerpc_iomb();
340 }
341 
342 static void
bs_be_wm_1(bus_space_handle_t bsh,bus_size_t ofs,const uint8_t * addr,bus_size_t cnt)343 bs_be_wm_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
344     bus_size_t cnt)
345 {
346 	outsb(__ppc_ba(bsh, ofs), addr, cnt);
347 }
348 
349 static void
bs_be_wm_2(bus_space_handle_t bsh,bus_size_t ofs,const uint16_t * addr,bus_size_t cnt)350 bs_be_wm_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
351     bus_size_t cnt)
352 {
353 	outsw(__ppc_ba(bsh, ofs), addr, cnt);
354 }
355 
356 static void
bs_be_wm_4(bus_space_handle_t bsh,bus_size_t ofs,const uint32_t * addr,bus_size_t cnt)357 bs_be_wm_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
358     bus_size_t cnt)
359 {
360 	outsl(__ppc_ba(bsh, ofs), addr, cnt);
361 }
362 
363 static void
bs_be_wm_8(bus_space_handle_t bsh,bus_size_t ofs,const uint64_t * addr,bus_size_t cnt)364 bs_be_wm_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
365     bus_size_t cnt)
366 {
367 	outsll(__ppc_ba(bsh, ofs), addr, cnt);
368 }
369 
370 static void
bs_be_wr_1(bus_space_handle_t bsh,bus_size_t ofs,const uint8_t * addr,size_t cnt)371 bs_be_wr_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
372     size_t cnt)
373 {
374 	volatile uint8_t *d = __ppc_ba(bsh, ofs);
375 
376 	while (cnt--)
377 		*d++ = *addr++;
378 	powerpc_iomb();
379 }
380 
381 static void
bs_be_wr_2(bus_space_handle_t bsh,bus_size_t ofs,const uint16_t * addr,size_t cnt)382 bs_be_wr_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
383     size_t cnt)
384 {
385 	volatile uint16_t *d = __ppc_ba(bsh, ofs);
386 
387 	while (cnt--)
388 		*d++ = *addr++;
389 	powerpc_iomb();
390 }
391 
392 static void
bs_be_wr_4(bus_space_handle_t bsh,bus_size_t ofs,const uint32_t * addr,size_t cnt)393 bs_be_wr_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
394     size_t cnt)
395 {
396 	volatile uint32_t *d = __ppc_ba(bsh, ofs);
397 
398 	while (cnt--)
399 		*d++ = *addr++;
400 	powerpc_iomb();
401 }
402 
403 static void
bs_be_wr_8(bus_space_handle_t bsh,bus_size_t ofs,const uint64_t * addr,size_t cnt)404 bs_be_wr_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
405     size_t cnt)
406 {
407 	volatile uint64_t *d = __ppc_ba(bsh, ofs);
408 
409 	while (cnt--)
410 		*d++ = *addr++;
411 	powerpc_iomb();
412 }
413 
414 static void
bs_be_sm_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val,size_t cnt)415 bs_be_sm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
416 {
417 	volatile uint8_t *d = __ppc_ba(bsh, ofs);
418 
419 	while (cnt--)
420 		*d = val;
421 	powerpc_iomb();
422 }
423 
424 static void
bs_be_sm_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val,size_t cnt)425 bs_be_sm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
426 {
427 	volatile uint16_t *d = __ppc_ba(bsh, ofs);
428 
429 	while (cnt--)
430 		*d = val;
431 	powerpc_iomb();
432 }
433 
434 static void
bs_be_sm_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val,size_t cnt)435 bs_be_sm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
436 {
437 	volatile uint32_t *d = __ppc_ba(bsh, ofs);
438 
439 	while (cnt--)
440 		*d = val;
441 	powerpc_iomb();
442 }
443 
444 static void
bs_be_sm_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val,size_t cnt)445 bs_be_sm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
446 {
447 	volatile uint64_t *d = __ppc_ba(bsh, ofs);
448 
449 	while (cnt--)
450 		*d = val;
451 	powerpc_iomb();
452 }
453 
454 static void
bs_be_sr_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val,size_t cnt)455 bs_be_sr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
456 {
457 	volatile uint8_t *d = __ppc_ba(bsh, ofs);
458 
459 	while (cnt--)
460 		*d++ = val;
461 	powerpc_iomb();
462 }
463 
464 static void
bs_be_sr_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val,size_t cnt)465 bs_be_sr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
466 {
467 	volatile uint16_t *d = __ppc_ba(bsh, ofs);
468 
469 	while (cnt--)
470 		*d++ = val;
471 	powerpc_iomb();
472 }
473 
474 static void
bs_be_sr_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val,size_t cnt)475 bs_be_sr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
476 {
477 	volatile uint32_t *d = __ppc_ba(bsh, ofs);
478 
479 	while (cnt--)
480 		*d++ = val;
481 	powerpc_iomb();
482 }
483 
484 static void
bs_be_sr_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val,size_t cnt)485 bs_be_sr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
486 {
487 	volatile uint64_t *d = __ppc_ba(bsh, ofs);
488 
489 	while (cnt--)
490 		*d++ = val;
491 	powerpc_iomb();
492 }
493 
494 /*
495  * Little-endian access functions
496  */
497 static uint8_t
bs_le_rs_1(bus_space_handle_t bsh,bus_size_t ofs)498 bs_le_rs_1(bus_space_handle_t bsh, bus_size_t ofs)
499 {
500 	volatile uint8_t *addr;
501 	uint8_t res;
502 
503 	addr = __ppc_ba(bsh, ofs);
504 	res = *addr;
505 	powerpc_iomb();
506 	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
507 	return (res);
508 }
509 
510 static uint16_t
bs_le_rs_2(bus_space_handle_t bsh,bus_size_t ofs)511 bs_le_rs_2(bus_space_handle_t bsh, bus_size_t ofs)
512 {
513 	volatile uint16_t *addr;
514 	uint16_t res;
515 
516 	addr = __ppc_ba(bsh, ofs);
517 	__asm __volatile("lhbrx %0, 0, %1" : "=r"(res) : "r"(addr));
518 	powerpc_iomb();
519 	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
520 	return (res);
521 }
522 
523 static uint32_t
bs_le_rs_4(bus_space_handle_t bsh,bus_size_t ofs)524 bs_le_rs_4(bus_space_handle_t bsh, bus_size_t ofs)
525 {
526 	volatile uint32_t *addr;
527 	uint32_t res;
528 
529 	addr = __ppc_ba(bsh, ofs);
530 	__asm __volatile("lwbrx %0, 0, %1" : "=r"(res) : "r"(addr));
531 	powerpc_iomb();
532 	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
533 	return (res);
534 }
535 
536 static uint64_t
bs_le_rs_8(bus_space_handle_t bsh,bus_size_t ofs)537 bs_le_rs_8(bus_space_handle_t bsh, bus_size_t ofs)
538 {
539 	TODO;
540 }
541 
542 static void
bs_le_rm_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t * addr,size_t cnt)543 bs_le_rm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
544 {
545 	ins8(__ppc_ba(bsh, ofs), addr, cnt);
546 }
547 
548 static void
bs_le_rm_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t * addr,size_t cnt)549 bs_le_rm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
550 {
551 	ins16rb(__ppc_ba(bsh, ofs), addr, cnt);
552 }
553 
554 static void
bs_le_rm_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t * addr,size_t cnt)555 bs_le_rm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
556 {
557 	ins32rb(__ppc_ba(bsh, ofs), addr, cnt);
558 }
559 
560 static void
bs_le_rm_8(bus_space_handle_t bshh,bus_size_t ofs,uint64_t * addr,size_t cnt)561 bs_le_rm_8(bus_space_handle_t bshh, bus_size_t ofs, uint64_t *addr, size_t cnt)
562 {
563 	TODO;
564 }
565 
566 static void
bs_le_rr_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t * addr,size_t cnt)567 bs_le_rr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
568 {
569 	volatile uint8_t *s = __ppc_ba(bsh, ofs);
570 
571 	while (cnt--)
572 		*addr++ = *s++;
573 	powerpc_iomb();
574 }
575 
576 static void
bs_le_rr_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t * addr,size_t cnt)577 bs_le_rr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
578 {
579 	volatile uint16_t *s = __ppc_ba(bsh, ofs);
580 
581 	while (cnt--)
582 		*addr++ = in16rb(s++);
583 	powerpc_iomb();
584 }
585 
586 static void
bs_le_rr_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t * addr,size_t cnt)587 bs_le_rr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
588 {
589 	volatile uint32_t *s = __ppc_ba(bsh, ofs);
590 
591 	while (cnt--)
592 		*addr++ = in32rb(s++);
593 	powerpc_iomb();
594 }
595 
596 static void
bs_le_rr_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t * addr,size_t cnt)597 bs_le_rr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
598 {
599 	TODO;
600 }
601 
602 static void
bs_le_ws_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val)603 bs_le_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val)
604 {
605 	volatile uint8_t *addr;
606 
607 	addr = __ppc_ba(bsh, ofs);
608 	*addr = val;
609 	powerpc_iomb();
610 	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
611 }
612 
613 static void
bs_le_ws_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val)614 bs_le_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val)
615 {
616 	volatile uint16_t *addr;
617 
618 	addr = __ppc_ba(bsh, ofs);
619 	__asm __volatile("sthbrx %0, 0, %1" :: "r"(val), "r"(addr));
620 	powerpc_iomb();
621 	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
622 }
623 
624 static void
bs_le_ws_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val)625 bs_le_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val)
626 {
627 	volatile uint32_t *addr;
628 
629 	addr = __ppc_ba(bsh, ofs);
630 	__asm __volatile("stwbrx %0, 0, %1" :: "r"(val), "r"(addr));
631 	powerpc_iomb();
632 	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
633 }
634 
635 static void
bs_le_ws_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val)636 bs_le_ws_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val)
637 {
638 	TODO;
639 }
640 
641 static void
bs_le_wm_1(bus_space_handle_t bsh,bus_size_t ofs,const uint8_t * addr,bus_size_t cnt)642 bs_le_wm_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
643     bus_size_t cnt)
644 {
645 	outs8(__ppc_ba(bsh, ofs), addr, cnt);
646 }
647 
648 static void
bs_le_wm_2(bus_space_handle_t bsh,bus_size_t ofs,const uint16_t * addr,bus_size_t cnt)649 bs_le_wm_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
650     bus_size_t cnt)
651 {
652 	outs16rb(__ppc_ba(bsh, ofs), addr, cnt);
653 }
654 
655 static void
bs_le_wm_4(bus_space_handle_t bsh,bus_size_t ofs,const uint32_t * addr,bus_size_t cnt)656 bs_le_wm_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
657     bus_size_t cnt)
658 {
659 	outs32rb(__ppc_ba(bsh, ofs), addr, cnt);
660 }
661 
662 static void
bs_le_wm_8(bus_space_handle_t bsh,bus_size_t ofs,const uint64_t * addr,bus_size_t cnt)663 bs_le_wm_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
664     bus_size_t cnt)
665 {
666 	TODO;
667 }
668 
669 static void
bs_le_wr_1(bus_space_handle_t bsh,bus_size_t ofs,const uint8_t * addr,size_t cnt)670 bs_le_wr_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
671     size_t cnt)
672 {
673 	volatile uint8_t *d = __ppc_ba(bsh, ofs);
674 
675 	while (cnt--)
676 		*d++ = *addr++;
677 	powerpc_iomb();
678 }
679 
680 static void
bs_le_wr_2(bus_space_handle_t bsh,bus_size_t ofs,const uint16_t * addr,size_t cnt)681 bs_le_wr_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
682     size_t cnt)
683 {
684 	volatile uint16_t *d = __ppc_ba(bsh, ofs);
685 
686 	while (cnt--)
687 		out16rb(d++, *addr++);
688 	powerpc_iomb();
689 }
690 
691 static void
bs_le_wr_4(bus_space_handle_t bsh,bus_size_t ofs,const uint32_t * addr,size_t cnt)692 bs_le_wr_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
693     size_t cnt)
694 {
695 	volatile uint32_t *d = __ppc_ba(bsh, ofs);
696 
697 	while (cnt--)
698 		out32rb(d++, *addr++);
699 	powerpc_iomb();
700 }
701 
702 static void
bs_le_wr_8(bus_space_handle_t bsh,bus_size_t ofs,const uint64_t * addr,size_t cnt)703 bs_le_wr_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
704     size_t cnt)
705 {
706 	TODO;
707 }
708 
709 static void
bs_le_sm_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val,size_t cnt)710 bs_le_sm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
711 {
712 	volatile uint8_t *d = __ppc_ba(bsh, ofs);
713 
714 	while (cnt--)
715 		*d = val;
716 	powerpc_iomb();
717 }
718 
719 static void
bs_le_sm_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val,size_t cnt)720 bs_le_sm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
721 {
722 	volatile uint16_t *d = __ppc_ba(bsh, ofs);
723 
724 	while (cnt--)
725 		out16rb(d, val);
726 	powerpc_iomb();
727 }
728 
729 static void
bs_le_sm_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val,size_t cnt)730 bs_le_sm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
731 {
732 	volatile uint32_t *d = __ppc_ba(bsh, ofs);
733 
734 	while (cnt--)
735 		out32rb(d, val);
736 	powerpc_iomb();
737 }
738 
739 static void
bs_le_sm_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val,size_t cnt)740 bs_le_sm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
741 {
742 	TODO;
743 }
744 
745 static void
bs_le_sr_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val,size_t cnt)746 bs_le_sr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
747 {
748 	volatile uint8_t *d = __ppc_ba(bsh, ofs);
749 
750 	while (cnt--)
751 		*d++ = val;
752 	powerpc_iomb();
753 }
754 
755 static void
bs_le_sr_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val,size_t cnt)756 bs_le_sr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
757 {
758 	volatile uint16_t *d = __ppc_ba(bsh, ofs);
759 
760 	while (cnt--)
761 		out16rb(d++, val);
762 	powerpc_iomb();
763 }
764 
765 static void
bs_le_sr_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val,size_t cnt)766 bs_le_sr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
767 {
768 	volatile uint32_t *d = __ppc_ba(bsh, ofs);
769 
770 	while (cnt--)
771 		out32rb(d++, val);
772 	powerpc_iomb();
773 }
774 
775 static void
bs_le_sr_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val,size_t cnt)776 bs_le_sr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
777 {
778 	TODO;
779 }
780 
781 struct bus_space bs_be_tag = {
782 	/* mapping/unmapping */
783 	bs_gen_map,
784 	bs_gen_unmap,
785 	bs_gen_subregion,
786 
787 	/* allocation/deallocation */
788 	bs_gen_alloc,
789 	bs_gen_free,
790 
791 	/* barrier */
792 	bs_gen_barrier,
793 
794 	/* read (single) */
795 	bs_be_rs_1,
796 	bs_be_rs_2,
797 	bs_be_rs_4,
798 	bs_be_rs_8,
799 
800 	bs_be_rs_2,
801 	bs_be_rs_4,
802 	bs_be_rs_8,
803 
804 	/* read multiple */
805 	bs_be_rm_1,
806 	bs_be_rm_2,
807 	bs_be_rm_4,
808 	bs_be_rm_8,
809 
810 	bs_be_rm_2,
811 	bs_be_rm_4,
812 	bs_be_rm_8,
813 
814 	/* read region */
815 	bs_be_rr_1,
816 	bs_be_rr_2,
817 	bs_be_rr_4,
818 	bs_be_rr_8,
819 
820 	bs_be_rr_2,
821 	bs_be_rr_4,
822 	bs_be_rr_8,
823 
824 	/* write (single) */
825 	bs_be_ws_1,
826 	bs_be_ws_2,
827 	bs_be_ws_4,
828 	bs_be_ws_8,
829 
830 	bs_be_ws_2,
831 	bs_be_ws_4,
832 	bs_be_ws_8,
833 
834 	/* write multiple */
835 	bs_be_wm_1,
836 	bs_be_wm_2,
837 	bs_be_wm_4,
838 	bs_be_wm_8,
839 
840 	bs_be_wm_2,
841 	bs_be_wm_4,
842 	bs_be_wm_8,
843 
844 	/* write region */
845 	bs_be_wr_1,
846 	bs_be_wr_2,
847 	bs_be_wr_4,
848 	bs_be_wr_8,
849 
850 	bs_be_wr_2,
851 	bs_be_wr_4,
852 	bs_be_wr_8,
853 
854 	/* set multiple */
855 	bs_be_sm_1,
856 	bs_be_sm_2,
857 	bs_be_sm_4,
858 	bs_be_sm_8,
859 
860 	bs_be_sm_2,
861 	bs_be_sm_4,
862 	bs_be_sm_8,
863 
864 	/* set region */
865 	bs_be_sr_1,
866 	bs_be_sr_2,
867 	bs_be_sr_4,
868 	bs_be_sr_8,
869 
870 	bs_be_sr_2,
871 	bs_be_sr_4,
872 	bs_be_sr_8,
873 };
874 
875 struct bus_space bs_le_tag = {
876 	/* mapping/unmapping */
877 	bs_gen_map,
878 	bs_gen_unmap,
879 	bs_gen_subregion,
880 
881 	/* allocation/deallocation */
882 	bs_gen_alloc,
883 	bs_gen_free,
884 
885 	/* barrier */
886 	bs_gen_barrier,
887 
888 	/* read (single) */
889 	bs_le_rs_1,
890 	bs_le_rs_2,
891 	bs_le_rs_4,
892 	bs_le_rs_8,
893 
894 	bs_be_rs_2,
895 	bs_be_rs_4,
896 	bs_be_rs_8,
897 
898 	/* read multiple */
899 	bs_le_rm_1,
900 	bs_le_rm_2,
901 	bs_le_rm_4,
902 	bs_le_rm_8,
903 
904 	bs_be_rm_2,
905 	bs_be_rm_4,
906 	bs_be_rm_8,
907 
908 	/* read region */
909 	bs_le_rr_1,
910 	bs_le_rr_2,
911 	bs_le_rr_4,
912 	bs_le_rr_8,
913 
914 	bs_be_rr_2,
915 	bs_be_rr_4,
916 	bs_be_rr_8,
917 
918 	/* write (single) */
919 	bs_le_ws_1,
920 	bs_le_ws_2,
921 	bs_le_ws_4,
922 	bs_le_ws_8,
923 
924 	bs_be_ws_2,
925 	bs_be_ws_4,
926 	bs_be_ws_8,
927 
928 	/* write multiple */
929 	bs_le_wm_1,
930 	bs_le_wm_2,
931 	bs_le_wm_4,
932 	bs_le_wm_8,
933 
934 	bs_be_wm_2,
935 	bs_be_wm_4,
936 	bs_be_wm_8,
937 
938 	/* write region */
939 	bs_le_wr_1,
940 	bs_le_wr_2,
941 	bs_le_wr_4,
942 	bs_le_wr_8,
943 
944 	bs_be_wr_2,
945 	bs_be_wr_4,
946 	bs_be_wr_8,
947 
948 	/* set multiple */
949 	bs_le_sm_1,
950 	bs_le_sm_2,
951 	bs_le_sm_4,
952 	bs_le_sm_8,
953 
954 	bs_be_sm_2,
955 	bs_be_sm_4,
956 	bs_be_sm_8,
957 
958 	/* set region */
959 	bs_le_sr_1,
960 	bs_le_sr_2,
961 	bs_le_sr_4,
962 	bs_le_sr_8,
963 
964 	bs_be_sr_2,
965 	bs_be_sr_4,
966 	bs_be_sr_8,
967 };
968