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