bus_machdep.c revision 257178
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 257178 2013-10-26 18:18:14Z 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	vm_offset_t virt;
62	bus_addr_t addr;
63	bus_size_t size;
64	int flags;
65} earlyboot_mappings[MAX_EARLYBOOT_MAPPINGS];
66static int earlyboot_map_idx = 0;
67
68void bs_remap_earlyboot(void);
69
70static __inline void *
71__ppc_ba(bus_space_handle_t bsh, bus_size_t ofs)
72{
73	return ((void *)(bsh + ofs));
74}
75
76static int
77bs_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
112void
113bs_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
145static void
146bs_gen_unmap(bus_size_t size __unused)
147{
148}
149
150static int
151bs_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
158static int
159bs_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
167static void
168bs_gen_free(bus_space_handle_t bsh __unused, bus_size_t size __unused)
169{
170	TODO;
171}
172
173static void
174bs_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 */
184static uint8_t
185bs_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
197static uint16_t
198bs_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
210static uint32_t
211bs_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
223static uint64_t
224bs_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
235static void
236bs_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
241static void
242bs_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
247static void
248bs_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
253static void
254bs_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
259static void
260bs_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
269static void
270bs_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
279static void
280bs_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
289static void
290bs_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
299static void
300bs_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
310static void
311bs_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
321static void
322bs_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
332static void
333bs_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
342static void
343bs_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
349static void
350bs_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
356static void
357bs_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
363static void
364bs_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
370static void
371bs_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
381static void
382bs_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
392static void
393bs_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
403static void
404bs_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
414static void
415bs_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
424static void
425bs_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
434static void
435bs_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
444static void
445bs_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
454static void
455bs_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
464static void
465bs_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
474static void
475bs_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
484static void
485bs_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 */
497static uint8_t
498bs_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
510static uint16_t
511bs_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
523static uint32_t
524bs_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
536static uint64_t
537bs_le_rs_8(bus_space_handle_t bsh, bus_size_t ofs)
538{
539	TODO;
540}
541
542static void
543bs_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
548static void
549bs_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
554static void
555bs_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
560static void
561bs_le_rm_8(bus_space_handle_t bshh, bus_size_t ofs, uint64_t *addr, size_t cnt)
562{
563	TODO;
564}
565
566static void
567bs_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
576static void
577bs_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
586static void
587bs_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
596static void
597bs_le_rr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
598{
599	TODO;
600}
601
602static void
603bs_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
613static void
614bs_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
624static void
625bs_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
635static void
636bs_le_ws_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val)
637{
638	TODO;
639}
640
641static void
642bs_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
648static void
649bs_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
655static void
656bs_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
662static void
663bs_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
669static void
670bs_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
680static void
681bs_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
691static void
692bs_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
702static void
703bs_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
709static void
710bs_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
719static void
720bs_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
729static void
730bs_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
739static void
740bs_le_sm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
741{
742	TODO;
743}
744
745static void
746bs_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
755static void
756bs_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
765static void
766bs_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
775static void
776bs_le_sr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
777{
778	TODO;
779}
780
781struct 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
875struct 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