1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2006 Semihalf, Rafal Jaworowski <[email protected]>
5  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
6  * All rights reserved.
7  *
8  * This code is derived from software contributed to The NetBSD Foundation
9  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
10  * NASA Ames Research Center.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
25  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #include <sys/cdefs.h>
35 #define	KTR_BE_IO	0
36 #define	KTR_LE_IO	0
37 
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/bus.h>
41 #include <sys/ktr.h>
42 #include <vm/vm.h>
43 #include <vm/pmap.h>
44 #include <sys/endian.h>
45 
46 #include <machine/bus.h>
47 #include <machine/pio.h>
48 #include <machine/md_var.h>
49 
50 #define TODO panic("%s: not implemented", __func__)
51 
52 #define	MAX_EARLYBOOT_MAPPINGS	6
53 
54 static struct {
55 	vm_offset_t virt;
56 	bus_addr_t addr;
57 	bus_size_t size;
58 	int flags;
59 } earlyboot_mappings[MAX_EARLYBOOT_MAPPINGS];
60 static int earlyboot_map_idx = 0;
61 
62 void bs_remap_earlyboot(void);
63 
64 static __inline void *
__ppc_ba(bus_space_handle_t bsh,bus_size_t ofs)65 __ppc_ba(bus_space_handle_t bsh, bus_size_t ofs)
66 {
67 	return ((void *)(bsh + ofs));
68 }
69 
70 static int
bs_gen_map(bus_addr_t addr,bus_size_t size,int flags,bus_space_handle_t * bshp)71 bs_gen_map(bus_addr_t addr, bus_size_t size, int flags,
72     bus_space_handle_t *bshp)
73 {
74 	vm_memattr_t ma;
75 
76 	/*
77 	 * Record what we did if we haven't enabled the MMU yet. We
78 	 * will need to remap it as soon as the MMU comes up.
79 	 */
80 	if (!pmap_bootstrapped) {
81 		KASSERT(earlyboot_map_idx < MAX_EARLYBOOT_MAPPINGS,
82 		    ("%s: too many early boot mapping requests", __func__));
83 		earlyboot_mappings[earlyboot_map_idx].addr = addr;
84 		earlyboot_mappings[earlyboot_map_idx].virt =
85 		    pmap_early_io_map(addr, size);
86 		earlyboot_mappings[earlyboot_map_idx].size = size;
87 		earlyboot_mappings[earlyboot_map_idx].flags = flags;
88 		*bshp = earlyboot_mappings[earlyboot_map_idx].virt;
89 		earlyboot_map_idx++;
90 	} else {
91 		ma = VM_MEMATTR_DEFAULT;
92 		switch (flags) {
93 			case BUS_SPACE_MAP_CACHEABLE:
94 				ma = VM_MEMATTR_CACHEABLE;
95 				break;
96 			case BUS_SPACE_MAP_PREFETCHABLE:
97 				ma = VM_MEMATTR_PREFETCHABLE;
98 				break;
99 		}
100 		*bshp = (bus_space_handle_t)pmap_mapdev_attr(addr, size, ma);
101 	}
102 
103 	return (0);
104 }
105 
106 void
bs_remap_earlyboot(void)107 bs_remap_earlyboot(void)
108 {
109 	vm_paddr_t pa, spa;
110 	vm_offset_t va;
111 	int i;
112 	vm_memattr_t ma;
113 
114 	for (i = 0; i < earlyboot_map_idx; i++) {
115 		spa = earlyboot_mappings[i].addr;
116 
117 		if (hw_direct_map &&
118 		   PHYS_TO_DMAP(spa) == earlyboot_mappings[i].virt &&
119 		   pmap_dev_direct_mapped(spa, earlyboot_mappings[i].size) == 0)
120 			continue;
121 
122 		ma = VM_MEMATTR_DEFAULT;
123 		switch (earlyboot_mappings[i].flags) {
124 			case BUS_SPACE_MAP_CACHEABLE:
125 				ma = VM_MEMATTR_CACHEABLE;
126 				break;
127 			case BUS_SPACE_MAP_PREFETCHABLE:
128 				ma = VM_MEMATTR_PREFETCHABLE;
129 				break;
130 		}
131 
132 		pa = trunc_page(spa);
133 		va = trunc_page(earlyboot_mappings[i].virt);
134 		while (pa < spa + earlyboot_mappings[i].size) {
135 			pmap_kenter_attr(va, pa, ma);
136 			va += PAGE_SIZE;
137 			pa += PAGE_SIZE;
138 		}
139 	}
140 }
141 
142 static void
bs_gen_unmap(bus_size_t size __unused)143 bs_gen_unmap(bus_size_t size __unused)
144 {
145 }
146 
147 static int
bs_gen_subregion(bus_space_handle_t bsh,bus_size_t ofs,bus_size_t size __unused,bus_space_handle_t * nbshp)148 bs_gen_subregion(bus_space_handle_t bsh, bus_size_t ofs,
149     bus_size_t size __unused, bus_space_handle_t *nbshp)
150 {
151 	*nbshp = bsh + ofs;
152 	return (0);
153 }
154 
155 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)156 bs_gen_alloc(bus_addr_t rstart __unused, bus_addr_t rend __unused,
157     bus_size_t size __unused, bus_size_t alignment __unused,
158     bus_size_t boundary __unused, int flags __unused,
159     bus_addr_t *bpap __unused, bus_space_handle_t *bshp __unused)
160 {
161 	TODO;
162 }
163 
164 static void
bs_gen_free(bus_space_handle_t bsh __unused,bus_size_t size __unused)165 bs_gen_free(bus_space_handle_t bsh __unused, bus_size_t size __unused)
166 {
167 	TODO;
168 }
169 
170 static void
bs_gen_barrier(bus_space_handle_t bsh __unused,bus_size_t ofs __unused,bus_size_t size __unused,int flags __unused)171 bs_gen_barrier(bus_space_handle_t bsh __unused, bus_size_t ofs __unused,
172     bus_size_t size __unused, int flags __unused)
173 {
174 
175 	powerpc_iomb();
176 }
177 
178 /*
179  * Native-endian access functions
180  */
181 static uint8_t
native_bs_rs_1(bus_space_handle_t bsh,bus_size_t ofs)182 native_bs_rs_1(bus_space_handle_t bsh, bus_size_t ofs)
183 {
184 	volatile uint8_t *addr;
185 	uint8_t res;
186 
187 	addr = __ppc_ba(bsh, ofs);
188 	res = *addr;
189 	powerpc_iomb();
190 	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
191 	return (res);
192 }
193 
194 static uint16_t
native_bs_rs_2(bus_space_handle_t bsh,bus_size_t ofs)195 native_bs_rs_2(bus_space_handle_t bsh, bus_size_t ofs)
196 {
197 	volatile uint16_t *addr;
198 	uint16_t res;
199 
200 	addr = __ppc_ba(bsh, ofs);
201 	res = *addr;
202 	powerpc_iomb();
203 	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
204 	return (res);
205 }
206 
207 static uint32_t
native_bs_rs_4(bus_space_handle_t bsh,bus_size_t ofs)208 native_bs_rs_4(bus_space_handle_t bsh, bus_size_t ofs)
209 {
210 	volatile uint32_t *addr;
211 	uint32_t res;
212 
213 	addr = __ppc_ba(bsh, ofs);
214 	res = *addr;
215 	powerpc_iomb();
216 	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
217 	return (res);
218 }
219 
220 static uint64_t
native_bs_rs_8(bus_space_handle_t bsh,bus_size_t ofs)221 native_bs_rs_8(bus_space_handle_t bsh, bus_size_t ofs)
222 {
223 	volatile uint64_t *addr;
224 	uint64_t res;
225 
226 	addr = __ppc_ba(bsh, ofs);
227 	res = *addr;
228 	powerpc_iomb();
229 	return (res);
230 }
231 
232 static void
native_bs_rm_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t * addr,size_t cnt)233 native_bs_rm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
234 {
235 	ins8(__ppc_ba(bsh, ofs), addr, cnt);
236 }
237 
238 static void
native_bs_rm_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t * addr,size_t cnt)239 native_bs_rm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
240 {
241 	ins16(__ppc_ba(bsh, ofs), addr, cnt);
242 }
243 
244 static void
native_bs_rm_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t * addr,size_t cnt)245 native_bs_rm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
246 {
247 	ins32(__ppc_ba(bsh, ofs), addr, cnt);
248 }
249 
250 static void
native_bs_rm_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t * addr,size_t cnt)251 native_bs_rm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
252 {
253 	ins64(__ppc_ba(bsh, ofs), addr, cnt);
254 }
255 
256 static void
native_bs_rr_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t * addr,size_t cnt)257 native_bs_rr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
258 {
259 	volatile uint8_t *s = __ppc_ba(bsh, ofs);
260 
261 	while (cnt--)
262 		*addr++ = *s++;
263 	powerpc_iomb();
264 }
265 
266 static void
native_bs_rr_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t * addr,size_t cnt)267 native_bs_rr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
268 {
269 	volatile uint16_t *s = __ppc_ba(bsh, ofs);
270 
271 	while (cnt--)
272 		*addr++ = *s++;
273 	powerpc_iomb();
274 }
275 
276 static void
native_bs_rr_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t * addr,size_t cnt)277 native_bs_rr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
278 {
279 	volatile uint32_t *s = __ppc_ba(bsh, ofs);
280 
281 	while (cnt--)
282 		*addr++ = *s++;
283 	powerpc_iomb();
284 }
285 
286 static void
native_bs_rr_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t * addr,size_t cnt)287 native_bs_rr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
288 {
289 	volatile uint64_t *s = __ppc_ba(bsh, ofs);
290 
291 	while (cnt--)
292 		*addr++ = *s++;
293 	powerpc_iomb();
294 }
295 
296 static void
native_bs_ws_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val)297 native_bs_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val)
298 {
299 	volatile uint8_t *addr;
300 
301 	addr = __ppc_ba(bsh, ofs);
302 	*addr = val;
303 	powerpc_iomb();
304 	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
305 }
306 
307 static void
native_bs_ws_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val)308 native_bs_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val)
309 {
310 	volatile uint16_t *addr;
311 
312 	addr = __ppc_ba(bsh, ofs);
313 	*addr = val;
314 	powerpc_iomb();
315 	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
316 }
317 
318 static void
native_bs_ws_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val)319 native_bs_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val)
320 {
321 	volatile uint32_t *addr;
322 
323 	addr = __ppc_ba(bsh, ofs);
324 	*addr = val;
325 	powerpc_iomb();
326 	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
327 }
328 
329 static void
native_bs_ws_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val)330 native_bs_ws_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val)
331 {
332 	volatile uint64_t *addr;
333 
334 	addr = __ppc_ba(bsh, ofs);
335 	*addr = val;
336 	powerpc_iomb();
337 	CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
338 }
339 
340 static void
native_bs_wm_1(bus_space_handle_t bsh,bus_size_t ofs,const uint8_t * addr,bus_size_t cnt)341 native_bs_wm_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
342     bus_size_t cnt)
343 {
344 	outsb(__ppc_ba(bsh, ofs), addr, cnt);
345 }
346 
347 static void
native_bs_wm_2(bus_space_handle_t bsh,bus_size_t ofs,const uint16_t * addr,bus_size_t cnt)348 native_bs_wm_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
349     bus_size_t cnt)
350 {
351 	outsw(__ppc_ba(bsh, ofs), addr, cnt);
352 }
353 
354 static void
native_bs_wm_4(bus_space_handle_t bsh,bus_size_t ofs,const uint32_t * addr,bus_size_t cnt)355 native_bs_wm_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
356     bus_size_t cnt)
357 {
358 	outsl(__ppc_ba(bsh, ofs), addr, cnt);
359 }
360 
361 static void
native_bs_wm_8(bus_space_handle_t bsh,bus_size_t ofs,const uint64_t * addr,bus_size_t cnt)362 native_bs_wm_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
363     bus_size_t cnt)
364 {
365 	outsll(__ppc_ba(bsh, ofs), addr, cnt);
366 }
367 
368 static void
native_bs_wr_1(bus_space_handle_t bsh,bus_size_t ofs,const uint8_t * addr,size_t cnt)369 native_bs_wr_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
370     size_t cnt)
371 {
372 	volatile uint8_t *d = __ppc_ba(bsh, ofs);
373 
374 	while (cnt--)
375 		*d++ = *addr++;
376 	powerpc_iomb();
377 }
378 
379 static void
native_bs_wr_2(bus_space_handle_t bsh,bus_size_t ofs,const uint16_t * addr,size_t cnt)380 native_bs_wr_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
381     size_t cnt)
382 {
383 	volatile uint16_t *d = __ppc_ba(bsh, ofs);
384 
385 	while (cnt--)
386 		*d++ = *addr++;
387 	powerpc_iomb();
388 }
389 
390 static void
native_bs_wr_4(bus_space_handle_t bsh,bus_size_t ofs,const uint32_t * addr,size_t cnt)391 native_bs_wr_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
392     size_t cnt)
393 {
394 	volatile uint32_t *d = __ppc_ba(bsh, ofs);
395 
396 	while (cnt--)
397 		*d++ = *addr++;
398 	powerpc_iomb();
399 }
400 
401 static void
native_bs_wr_8(bus_space_handle_t bsh,bus_size_t ofs,const uint64_t * addr,size_t cnt)402 native_bs_wr_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
403     size_t cnt)
404 {
405 	volatile uint64_t *d = __ppc_ba(bsh, ofs);
406 
407 	while (cnt--)
408 		*d++ = *addr++;
409 	powerpc_iomb();
410 }
411 
412 static void
native_bs_sm_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val,size_t cnt)413 native_bs_sm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
414 {
415 	volatile uint8_t *d = __ppc_ba(bsh, ofs);
416 
417 	while (cnt--)
418 		*d = val;
419 	powerpc_iomb();
420 }
421 
422 static void
native_bs_sm_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val,size_t cnt)423 native_bs_sm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
424 {
425 	volatile uint16_t *d = __ppc_ba(bsh, ofs);
426 
427 	while (cnt--)
428 		*d = val;
429 	powerpc_iomb();
430 }
431 
432 static void
native_bs_sm_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val,size_t cnt)433 native_bs_sm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
434 {
435 	volatile uint32_t *d = __ppc_ba(bsh, ofs);
436 
437 	while (cnt--)
438 		*d = val;
439 	powerpc_iomb();
440 }
441 
442 static void
native_bs_sm_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val,size_t cnt)443 native_bs_sm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
444 {
445 	volatile uint64_t *d = __ppc_ba(bsh, ofs);
446 
447 	while (cnt--)
448 		*d = val;
449 	powerpc_iomb();
450 }
451 
452 static void
native_bs_sr_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val,size_t cnt)453 native_bs_sr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
454 {
455 	volatile uint8_t *d = __ppc_ba(bsh, ofs);
456 
457 	while (cnt--)
458 		*d++ = val;
459 	powerpc_iomb();
460 }
461 
462 static void
native_bs_sr_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val,size_t cnt)463 native_bs_sr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
464 {
465 	volatile uint16_t *d = __ppc_ba(bsh, ofs);
466 
467 	while (cnt--)
468 		*d++ = val;
469 	powerpc_iomb();
470 }
471 
472 static void
native_bs_sr_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val,size_t cnt)473 native_bs_sr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
474 {
475 	volatile uint32_t *d = __ppc_ba(bsh, ofs);
476 
477 	while (cnt--)
478 		*d++ = val;
479 	powerpc_iomb();
480 }
481 
482 static void
native_bs_sr_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val,size_t cnt)483 native_bs_sr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
484 {
485 	volatile uint64_t *d = __ppc_ba(bsh, ofs);
486 
487 	while (cnt--)
488 		*d++ = val;
489 	powerpc_iomb();
490 }
491 
492 /*
493  * Byteswapped access functions
494  */
495 static uint8_t
swapped_bs_rs_1(bus_space_handle_t bsh,bus_size_t ofs)496 swapped_bs_rs_1(bus_space_handle_t bsh, bus_size_t ofs)
497 {
498 	volatile uint8_t *addr;
499 	uint8_t res;
500 
501 	addr = __ppc_ba(bsh, ofs);
502 	res = *addr;
503 	powerpc_iomb();
504 	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
505 	return (res);
506 }
507 
508 static uint16_t
swapped_bs_rs_2(bus_space_handle_t bsh,bus_size_t ofs)509 swapped_bs_rs_2(bus_space_handle_t bsh, bus_size_t ofs)
510 {
511 	volatile uint16_t *addr;
512 	uint16_t res;
513 
514 	addr = __ppc_ba(bsh, ofs);
515 	__asm __volatile("lhbrx %0, 0, %1" : "=r"(res) : "r"(addr));
516 	powerpc_iomb();
517 	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
518 	return (res);
519 }
520 
521 static uint32_t
swapped_bs_rs_4(bus_space_handle_t bsh,bus_size_t ofs)522 swapped_bs_rs_4(bus_space_handle_t bsh, bus_size_t ofs)
523 {
524 	volatile uint32_t *addr;
525 	uint32_t res;
526 
527 	addr = __ppc_ba(bsh, ofs);
528 	__asm __volatile("lwbrx %0, 0, %1" : "=r"(res) : "r"(addr));
529 	powerpc_iomb();
530 	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
531 	return (res);
532 }
533 
534 static uint64_t
swapped_bs_rs_8(bus_space_handle_t bsh,bus_size_t ofs)535 swapped_bs_rs_8(bus_space_handle_t bsh, bus_size_t ofs)
536 {
537 	volatile uint64_t *addr;
538 	uint64_t res;
539 
540 	addr = __ppc_ba(bsh, ofs);
541 	res = le64toh(*addr);
542 	powerpc_iomb();
543 	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
544 	return (res);
545 }
546 
547 static void
swapped_bs_rm_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t * addr,size_t cnt)548 swapped_bs_rm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
549 {
550 	ins8(__ppc_ba(bsh, ofs), addr, cnt);
551 }
552 
553 static void
swapped_bs_rm_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t * addr,size_t cnt)554 swapped_bs_rm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
555 {
556 	ins16rb(__ppc_ba(bsh, ofs), addr, cnt);
557 }
558 
559 static void
swapped_bs_rm_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t * addr,size_t cnt)560 swapped_bs_rm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
561 {
562 	ins32rb(__ppc_ba(bsh, ofs), addr, cnt);
563 }
564 
565 static void
swapped_bs_rm_8(bus_space_handle_t bshh,bus_size_t ofs,uint64_t * addr,size_t cnt)566 swapped_bs_rm_8(bus_space_handle_t bshh, bus_size_t ofs, uint64_t *addr, size_t cnt)
567 {
568 	TODO;
569 }
570 
571 static void
swapped_bs_rr_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t * addr,size_t cnt)572 swapped_bs_rr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
573 {
574 	volatile uint8_t *s = __ppc_ba(bsh, ofs);
575 
576 	while (cnt--)
577 		*addr++ = *s++;
578 	powerpc_iomb();
579 }
580 
581 static void
swapped_bs_rr_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t * addr,size_t cnt)582 swapped_bs_rr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
583 {
584 	volatile uint16_t *s = __ppc_ba(bsh, ofs);
585 
586 	while (cnt--)
587 		*addr++ = in16rb(s++);
588 	powerpc_iomb();
589 }
590 
591 static void
swapped_bs_rr_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t * addr,size_t cnt)592 swapped_bs_rr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
593 {
594 	volatile uint32_t *s = __ppc_ba(bsh, ofs);
595 
596 	while (cnt--)
597 		*addr++ = in32rb(s++);
598 	powerpc_iomb();
599 }
600 
601 static void
swapped_bs_rr_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t * addr,size_t cnt)602 swapped_bs_rr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
603 {
604 	TODO;
605 }
606 
607 static void
swapped_bs_ws_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val)608 swapped_bs_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val)
609 {
610 	volatile uint8_t *addr;
611 
612 	addr = __ppc_ba(bsh, ofs);
613 	*addr = val;
614 	powerpc_iomb();
615 	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
616 }
617 
618 static void
swapped_bs_ws_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val)619 swapped_bs_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val)
620 {
621 	volatile uint16_t *addr;
622 
623 	addr = __ppc_ba(bsh, ofs);
624 	__asm __volatile("sthbrx %0, 0, %1" :: "r"(val), "r"(addr));
625 	powerpc_iomb();
626 	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
627 }
628 
629 static void
swapped_bs_ws_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val)630 swapped_bs_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val)
631 {
632 	volatile uint32_t *addr;
633 
634 	addr = __ppc_ba(bsh, ofs);
635 	__asm __volatile("stwbrx %0, 0, %1" :: "r"(val), "r"(addr));
636 	powerpc_iomb();
637 	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
638 }
639 
640 static void
swapped_bs_ws_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val)641 swapped_bs_ws_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val)
642 {
643 	volatile uint64_t *addr;
644 
645 	addr = __ppc_ba(bsh, ofs);
646 	*addr = htole64(val);
647 	powerpc_iomb();
648 	CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
649 }
650 
651 static void
swapped_bs_wm_1(bus_space_handle_t bsh,bus_size_t ofs,const uint8_t * addr,bus_size_t cnt)652 swapped_bs_wm_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
653     bus_size_t cnt)
654 {
655 	outs8(__ppc_ba(bsh, ofs), addr, cnt);
656 }
657 
658 static void
swapped_bs_wm_2(bus_space_handle_t bsh,bus_size_t ofs,const uint16_t * addr,bus_size_t cnt)659 swapped_bs_wm_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
660     bus_size_t cnt)
661 {
662 	outs16rb(__ppc_ba(bsh, ofs), addr, cnt);
663 }
664 
665 static void
swapped_bs_wm_4(bus_space_handle_t bsh,bus_size_t ofs,const uint32_t * addr,bus_size_t cnt)666 swapped_bs_wm_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
667     bus_size_t cnt)
668 {
669 	outs32rb(__ppc_ba(bsh, ofs), addr, cnt);
670 }
671 
672 static void
swapped_bs_wm_8(bus_space_handle_t bsh,bus_size_t ofs,const uint64_t * addr,bus_size_t cnt)673 swapped_bs_wm_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
674     bus_size_t cnt)
675 {
676 	TODO;
677 }
678 
679 static void
swapped_bs_wr_1(bus_space_handle_t bsh,bus_size_t ofs,const uint8_t * addr,size_t cnt)680 swapped_bs_wr_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
681     size_t cnt)
682 {
683 	volatile uint8_t *d = __ppc_ba(bsh, ofs);
684 
685 	while (cnt--)
686 		*d++ = *addr++;
687 	powerpc_iomb();
688 }
689 
690 static void
swapped_bs_wr_2(bus_space_handle_t bsh,bus_size_t ofs,const uint16_t * addr,size_t cnt)691 swapped_bs_wr_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
692     size_t cnt)
693 {
694 	volatile uint16_t *d = __ppc_ba(bsh, ofs);
695 
696 	while (cnt--)
697 		out16rb(d++, *addr++);
698 	powerpc_iomb();
699 }
700 
701 static void
swapped_bs_wr_4(bus_space_handle_t bsh,bus_size_t ofs,const uint32_t * addr,size_t cnt)702 swapped_bs_wr_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
703     size_t cnt)
704 {
705 	volatile uint32_t *d = __ppc_ba(bsh, ofs);
706 
707 	while (cnt--)
708 		out32rb(d++, *addr++);
709 	powerpc_iomb();
710 }
711 
712 static void
swapped_bs_wr_8(bus_space_handle_t bsh,bus_size_t ofs,const uint64_t * addr,size_t cnt)713 swapped_bs_wr_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
714     size_t cnt)
715 {
716 	TODO;
717 }
718 
719 static void
swapped_bs_sm_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val,size_t cnt)720 swapped_bs_sm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
721 {
722 	volatile uint8_t *d = __ppc_ba(bsh, ofs);
723 
724 	while (cnt--)
725 		*d = val;
726 	powerpc_iomb();
727 }
728 
729 static void
swapped_bs_sm_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val,size_t cnt)730 swapped_bs_sm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
731 {
732 	volatile uint16_t *d = __ppc_ba(bsh, ofs);
733 
734 	while (cnt--)
735 		out16rb(d, val);
736 	powerpc_iomb();
737 }
738 
739 static void
swapped_bs_sm_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val,size_t cnt)740 swapped_bs_sm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
741 {
742 	volatile uint32_t *d = __ppc_ba(bsh, ofs);
743 
744 	while (cnt--)
745 		out32rb(d, val);
746 	powerpc_iomb();
747 }
748 
749 static void
swapped_bs_sm_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val,size_t cnt)750 swapped_bs_sm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
751 {
752 	TODO;
753 }
754 
755 static void
swapped_bs_sr_1(bus_space_handle_t bsh,bus_size_t ofs,uint8_t val,size_t cnt)756 swapped_bs_sr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
757 {
758 	volatile uint8_t *d = __ppc_ba(bsh, ofs);
759 
760 	while (cnt--)
761 		*d++ = val;
762 	powerpc_iomb();
763 }
764 
765 static void
swapped_bs_sr_2(bus_space_handle_t bsh,bus_size_t ofs,uint16_t val,size_t cnt)766 swapped_bs_sr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
767 {
768 	volatile uint16_t *d = __ppc_ba(bsh, ofs);
769 
770 	while (cnt--)
771 		out16rb(d++, val);
772 	powerpc_iomb();
773 }
774 
775 static void
swapped_bs_sr_4(bus_space_handle_t bsh,bus_size_t ofs,uint32_t val,size_t cnt)776 swapped_bs_sr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
777 {
778 	volatile uint32_t *d = __ppc_ba(bsh, ofs);
779 
780 	while (cnt--)
781 		out32rb(d++, val);
782 	powerpc_iomb();
783 }
784 
785 static void
swapped_bs_sr_8(bus_space_handle_t bsh,bus_size_t ofs,uint64_t val,size_t cnt)786 swapped_bs_sr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
787 {
788 	TODO;
789 }
790 
791 #if BYTE_ORDER == LITTLE_ENDIAN
792 struct bus_space bs_le_tag = {
793 #else
794 struct bus_space bs_be_tag = {
795 #endif
796 	/* mapping/unmapping */
797 	.bs_map =	bs_gen_map,
798 	.bs_unmap =	bs_gen_unmap,
799 	.bs_subregion =	bs_gen_subregion,
800 
801 	/* allocation/deallocation */
802 	.bs_alloc =	bs_gen_alloc,
803 	.bs_free =	bs_gen_free,
804 
805 	/* barrier */
806 	.bs_barrier =	bs_gen_barrier,
807 
808 	/* read (single) */
809 	.bs_r_1 =	native_bs_rs_1,
810 	.bs_r_2 =	native_bs_rs_2,
811 	.bs_r_4 =	native_bs_rs_4,
812 	.bs_r_8 =	native_bs_rs_8,
813 
814 	/* read (single) stream */
815 	.bs_r_s_2 =	native_bs_rs_2,
816 	.bs_r_s_4 =	native_bs_rs_4,
817 	.bs_r_s_8 =	native_bs_rs_8,
818 
819 	/* read multiple */
820 	.bs_rm_1 =	native_bs_rm_1,
821 	.bs_rm_2 =	native_bs_rm_2,
822 	.bs_rm_4 =	native_bs_rm_4,
823 	.bs_rm_8 =	native_bs_rm_8,
824 
825 	/* read multiple stream */
826 	.bs_rm_s_2 =	native_bs_rm_2,
827 	.bs_rm_s_4 =	native_bs_rm_4,
828 	.bs_rm_s_8 =	native_bs_rm_8,
829 
830 	/* read region */
831 	.bs_rr_1 =	native_bs_rr_1,
832 	.bs_rr_2 =	native_bs_rr_2,
833 	.bs_rr_4 =	native_bs_rr_4,
834 	.bs_rr_8 =	native_bs_rr_8,
835 
836 	/* read region stream */
837 	.bs_rr_s_2 =	native_bs_rr_2,
838 	.bs_rr_s_4 =	native_bs_rr_4,
839 	.bs_rr_s_8 =	native_bs_rr_8,
840 
841 	/* write (single) */
842 	.bs_w_1 =	native_bs_ws_1,
843 	.bs_w_2 =	native_bs_ws_2,
844 	.bs_w_4 =	native_bs_ws_4,
845 	.bs_w_8 =	native_bs_ws_8,
846 
847 	/* write (single) stream */
848 	.bs_w_s_2 =	native_bs_ws_2,
849 	.bs_w_s_4 =	native_bs_ws_4,
850 	.bs_w_s_8 =	native_bs_ws_8,
851 
852 	/* write multiple */
853 	.bs_wm_1 =	native_bs_wm_1,
854 	.bs_wm_2 =	native_bs_wm_2,
855 	.bs_wm_4 =	native_bs_wm_4,
856 	.bs_wm_8 =	native_bs_wm_8,
857 
858 	/* write multiple stream */
859 	.bs_wm_s_2 =	native_bs_wm_2,
860 	.bs_wm_s_4 =	native_bs_wm_4,
861 	.bs_wm_s_8 =	native_bs_wm_8,
862 
863 	/* write region */
864 	.bs_wr_1 =	native_bs_wr_1,
865 	.bs_wr_2 =	native_bs_wr_2,
866 	.bs_wr_4 =	native_bs_wr_4,
867 	.bs_wr_8 =	native_bs_wr_8,
868 
869 	/* write region stream */
870 	.bs_wr_s_2 =	native_bs_wr_2,
871 	.bs_wr_s_4 =	native_bs_wr_4,
872 	.bs_wr_s_8 =	native_bs_wr_8,
873 
874 	/* set multiple */
875 	.bs_sm_1 =	native_bs_sm_1,
876 	.bs_sm_2 =	native_bs_sm_2,
877 	.bs_sm_4 =	native_bs_sm_4,
878 	.bs_sm_8 =	native_bs_sm_8,
879 
880 	/* set multiple stream */
881 	.bs_sm_s_2 =	native_bs_sm_2,
882 	.bs_sm_s_4 =	native_bs_sm_4,
883 	.bs_sm_s_8 =	native_bs_sm_8,
884 
885 	/* set region */
886 	.bs_sr_1 =	native_bs_sr_1,
887 	.bs_sr_2 =	native_bs_sr_2,
888 	.bs_sr_4 =	native_bs_sr_4,
889 	.bs_sr_8 =	native_bs_sr_8,
890 
891 	/* set region stream */
892 	.bs_sr_s_2 =	native_bs_sr_2,
893 	.bs_sr_s_4 =	native_bs_sr_4,
894 	.bs_sr_s_8 =	native_bs_sr_8,
895 
896 	/* copy region */
897 	.bs_cr_1 =	NULL, /* UNIMPLEMENTED */
898 	.bs_cr_2 =	NULL, /* UNIMPLEMENTED */
899 	.bs_cr_4 =	NULL, /* UNIMPLEMENTED */
900 	.bs_cr_8 =	NULL, /* UNIMPLEMENTED */
901 
902 	/* copy region stream */
903 	.bs_cr_s_2 =	NULL, /* UNIMPLEMENTED */
904 	.bs_cr_s_4 =	NULL, /* UNIMPLEMENTED */
905 	.bs_cr_s_8 =	NULL, /* UNIMPLEMENTED */
906 };
907 
908 #if BYTE_ORDER == LITTLE_ENDIAN
909 struct bus_space bs_be_tag = {
910 #else
911 struct bus_space bs_le_tag = {
912 #endif
913 	/* mapping/unmapping */
914 	.bs_map =	bs_gen_map,
915 	.bs_unmap =	bs_gen_unmap,
916 	.bs_subregion =	bs_gen_subregion,
917 
918 	/* allocation/deallocation */
919 	.bs_alloc =	bs_gen_alloc,
920 	.bs_free =	bs_gen_free,
921 
922 	/* barrier */
923 	.bs_barrier =	bs_gen_barrier,
924 
925 	/* read (single) */
926 	.bs_r_1 =	swapped_bs_rs_1,
927 	.bs_r_2 =	swapped_bs_rs_2,
928 	.bs_r_4 =	swapped_bs_rs_4,
929 	.bs_r_8 =	swapped_bs_rs_8,
930 
931 	/* read (single) stream */
932 	.bs_r_s_2 =	native_bs_rs_2,
933 	.bs_r_s_4 =	native_bs_rs_4,
934 	.bs_r_s_8 =	native_bs_rs_8,
935 
936 	/* read multiple */
937 	.bs_rm_1 =	swapped_bs_rm_1,
938 	.bs_rm_2 =	swapped_bs_rm_2,
939 	.bs_rm_4 =	swapped_bs_rm_4,
940 	.bs_rm_8 =	swapped_bs_rm_8,
941 
942 	/* read multiple stream */
943 	.bs_rm_s_2 =	native_bs_rm_2,
944 	.bs_rm_s_4 =	native_bs_rm_4,
945 	.bs_rm_s_8 =	native_bs_rm_8,
946 
947 	/* read region */
948 	.bs_rr_1 =	swapped_bs_rr_1,
949 	.bs_rr_2 =	swapped_bs_rr_2,
950 	.bs_rr_4 =	swapped_bs_rr_4,
951 	.bs_rr_8 =	swapped_bs_rr_8,
952 
953 	/* read region stream */
954 	.bs_rr_s_2 =	native_bs_rr_2,
955 	.bs_rr_s_4 =	native_bs_rr_4,
956 	.bs_rr_s_8 =	native_bs_rr_8,
957 
958 	/* write (single) */
959 	.bs_w_1 =	swapped_bs_ws_1,
960 	.bs_w_2 =	swapped_bs_ws_2,
961 	.bs_w_4 =	swapped_bs_ws_4,
962 	.bs_w_8 =	swapped_bs_ws_8,
963 
964 	/* write (single) stream */
965 	.bs_w_s_2 =	native_bs_ws_2,
966 	.bs_w_s_4 =	native_bs_ws_4,
967 	.bs_w_s_8 =	native_bs_ws_8,
968 
969 	/* write multiple */
970 	.bs_wm_1 =	swapped_bs_wm_1,
971 	.bs_wm_2 =	swapped_bs_wm_2,
972 	.bs_wm_4 =	swapped_bs_wm_4,
973 	.bs_wm_8 =	swapped_bs_wm_8,
974 
975 	/* write multiple stream */
976 	.bs_wm_s_2 =	native_bs_wm_2,
977 	.bs_wm_s_4 =	native_bs_wm_4,
978 	.bs_wm_s_8 =	native_bs_wm_8,
979 
980 	/* write region */
981 	.bs_wr_1 =	swapped_bs_wr_1,
982 	.bs_wr_2 =	swapped_bs_wr_2,
983 	.bs_wr_4 =	swapped_bs_wr_4,
984 	.bs_wr_8 =	swapped_bs_wr_8,
985 
986 	/* write region stream */
987 	.bs_wr_s_2 =	native_bs_wr_2,
988 	.bs_wr_s_4 =	native_bs_wr_4,
989 	.bs_wr_s_8 =	native_bs_wr_8,
990 
991 	/* set multiple */
992 	.bs_sm_1 =	swapped_bs_sm_1,
993 	.bs_sm_2 =	swapped_bs_sm_2,
994 	.bs_sm_4 =	swapped_bs_sm_4,
995 	.bs_sm_8 =	swapped_bs_sm_8,
996 
997 	/* set multiple stream */
998 	.bs_sm_s_2 =	native_bs_sm_2,
999 	.bs_sm_s_4 =	native_bs_sm_4,
1000 	.bs_sm_s_8 =	native_bs_sm_8,
1001 
1002 	/* set region */
1003 	.bs_sr_1 =	swapped_bs_sr_1,
1004 	.bs_sr_2 =	swapped_bs_sr_2,
1005 	.bs_sr_4 =	swapped_bs_sr_4,
1006 	.bs_sr_8 =	swapped_bs_sr_8,
1007 
1008 	/* set region stream */
1009 	.bs_sr_s_2 =	native_bs_sr_2,
1010 	.bs_sr_s_4 =	native_bs_sr_4,
1011 	.bs_sr_s_8 =	native_bs_sr_8,
1012 
1013 	/* copy region */
1014 	.bs_cr_1 =	NULL, /* UNIMPLEMENTED */
1015 	.bs_cr_2 =	NULL, /* UNIMPLEMENTED */
1016 	.bs_cr_4 =	NULL, /* UNIMPLEMENTED */
1017 	.bs_cr_8 =	NULL, /* UNIMPLEMENTED */
1018 
1019 	/* copy region stream */
1020 	.bs_cr_s_2 =	NULL, /* UNIMPLEMENTED */
1021 	.bs_cr_s_4 =	NULL, /* UNIMPLEMENTED */
1022 	.bs_cr_s_8 =	NULL, /* UNIMPLEMENTED */
1023 };
1024