bus_space_rmi.c revision 202066
1250079Scarl/*-
2250079Scarl * Copyright (c) 2009 RMI Corporation
3289542Scem * All rights reserved.
4250079Scarl *
5250079Scarl * Redistribution and use in source and binary forms, with or without
6250079Scarl * modification, are permitted provided that the following conditions
7250079Scarl * are met:
8250079Scarl * 1. Redistributions of source code must retain the above copyright
9250079Scarl *    notice, this list of conditions and the following disclaimer.
10250079Scarl * 2. Redistributions in binary form must reproduce the above copyright
11250079Scarl *    notice, this list of conditions and the following disclaimer in the
12250079Scarl *    documentation and/or other materials provided with the distribution.
13250079Scarl *
14250079Scarl * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15250079Scarl * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16250079Scarl * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17250079Scarl * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18250079Scarl * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19250079Scarl * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20250079Scarl * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21250079Scarl * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22250079Scarl * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23250079Scarl * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24250079Scarl * SUCH DAMAGE.
25250079Scarl *
26250079Scarl * $FreeBSD: head/sys/mips/rmi/bus_space_rmi.c 202066 2010-01-11 04:49:44Z imp $
27250079Scarl */
28250079Scarl#include <sys/cdefs.h>
29250079Scarl__FBSDID("$FreeBSD: head/sys/mips/rmi/bus_space_rmi.c 202066 2010-01-11 04:49:44Z imp $");
30250079Scarl
31250079Scarl#include <sys/param.h>
32250079Scarl#include <sys/systm.h>
33250079Scarl#include <sys/bus.h>
34250079Scarl#include <sys/kernel.h>
35250079Scarl#include <sys/malloc.h>
36250079Scarl#include <sys/ktr.h>
37250079Scarl
38250079Scarl#include <vm/vm.h>
39289207Scem#include <vm/pmap.h>
40250079Scarl#include <vm/vm_kern.h>
41250079Scarl#include <vm/vm_extern.h>
42250079Scarl
43250079Scarl#include <machine/bus.h>
44250079Scarl#include <machine/cache.h>
45250079Scarlvoid xlr_print_int(uint32_t);
46250079Scarl
47250079Scarlstatic int
48250079Scarlrmi_bus_space_map(void *t, bus_addr_t addr,
49250079Scarl    bus_size_t size, int flags,
50250079Scarl    bus_space_handle_t * bshp);
51250079Scarl
52250079Scarl
53250079Scarlstatic void
54250079Scarlrmi_bus_space_unmap(void *t, bus_space_handle_t bsh,
55250079Scarl    bus_size_t size);
56250079Scarl
57250079Scarlstatic int
58250079Scarlrmi_bus_space_subregion(void *t,
59250079Scarl    bus_space_handle_t bsh,
60250079Scarl    bus_size_t offset, bus_size_t size,
61250079Scarl    bus_space_handle_t * nbshp);
62250079Scarl
63289538Scemstatic u_int8_t
64250079Scarlrmi_bus_space_read_1(void *t,
65289539Scem    bus_space_handle_t handle,
66289539Scem    bus_size_t offset);
67250079Scarl
68250079Scarlstatic u_int16_t
69250079Scarlrmi_bus_space_read_2(void *t,
70250079Scarl    bus_space_handle_t handle,
71250079Scarl    bus_size_t offset);
72250079Scarl
73250079Scarlstatic u_int32_t
74250079Scarlrmi_bus_space_read_4(void *t,
75289610Scem    bus_space_handle_t handle,
76289610Scem    bus_size_t offset);
77289610Scem
78289610Scemstatic void
79289610Scemrmi_bus_space_read_multi_1(void *t,
80289610Scem    bus_space_handle_t handle,
81289610Scem    bus_size_t offset, u_int8_t * addr,
82289610Scem    size_t count);
83289610Scem
84289610Scemstatic void
85289610Scemrmi_bus_space_read_multi_2(void *t,
86289610Scem    bus_space_handle_t handle,
87289539Scem    bus_size_t offset, u_int16_t * addr,
88289539Scem    size_t count);
89289539Scem
90289539Scemstatic void
91289539Scemrmi_bus_space_read_multi_4(void *t,
92289539Scem    bus_space_handle_t handle,
93289539Scem    bus_size_t offset, u_int32_t * addr,
94289539Scem    size_t count);
95255274Scarl
96255274Scarlstatic void
97255274Scarlrmi_bus_space_read_region_1(void *t,
98255274Scarl    bus_space_handle_t bsh,
99250079Scarl    bus_size_t offset, u_int8_t * addr,
100250079Scarl    size_t count);
101255274Scarl
102250079Scarlstatic void
103289397Scemrmi_bus_space_read_region_2(void *t,
104250079Scarl    bus_space_handle_t bsh,
105250079Scarl    bus_size_t offset, u_int16_t * addr,
106250079Scarl    size_t count);
107250079Scarl
108250079Scarlstatic void
109250079Scarlrmi_bus_space_read_region_4(void *t,
110250079Scarl    bus_space_handle_t bsh,
111250079Scarl    bus_size_t offset, u_int32_t * addr,
112250079Scarl    size_t count);
113250079Scarl
114289543Scemstatic void
115289543Scemrmi_bus_space_write_1(void *t,
116289543Scem    bus_space_handle_t handle,
117289543Scem    bus_size_t offset, u_int8_t value);
118289543Scem
119250079Scarlstatic void
120250079Scarlrmi_bus_space_write_2(void *t,
121250079Scarl    bus_space_handle_t handle,
122250079Scarl    bus_size_t offset, u_int16_t value);
123250079Scarl
124250079Scarlstatic void
125250079Scarlrmi_bus_space_write_4(void *t,
126250079Scarl    bus_space_handle_t handle,
127289546Scem    bus_size_t offset, u_int32_t value);
128250079Scarl
129289546Scemstatic void
130250079Scarlrmi_bus_space_write_multi_1(void *t,
131250079Scarl    bus_space_handle_t handle,
132289542Scem    bus_size_t offset,
133289542Scem    const u_int8_t * addr,
134289542Scem    size_t count);
135289542Scemstatic void
136289542Scemrmi_bus_space_write_multi_2(void *t,
137289542Scem    bus_space_handle_t handle,
138289542Scem    bus_size_t offset,
139289542Scem    const u_int16_t * addr,
140289542Scem    size_t count);
141289542Scem
142289542Scemstatic void
143289542Scemrmi_bus_space_write_multi_4(void *t,
144289542Scem    bus_space_handle_t handle,
145289542Scem    bus_size_t offset,
146289546Scem    const u_int32_t * addr,
147289546Scem    size_t count);
148289546Scem
149289546Scemstatic void
150289546Scemrmi_bus_space_write_region_2(void *t,
151289546Scem    bus_space_handle_t bsh,
152289546Scem    bus_size_t offset,
153289546Scem    const u_int16_t * addr,
154289546Scem    size_t count);
155289546Scem
156289546Scemstatic void
157289546Scemrmi_bus_space_write_region_4(void *t,
158289542Scem    bus_space_handle_t bsh,
159289542Scem    bus_size_t offset,
160289542Scem    const u_int32_t * addr,
161289542Scem    size_t count);
162289542Scem
163289542Scem
164289542Scemstatic void
165289542Scemrmi_bus_space_set_region_2(void *t,
166289542Scem    bus_space_handle_t bsh,
167289542Scem    bus_size_t offset, u_int16_t value,
168250079Scarl    size_t count);
169250079Scarlstatic void
170250079Scarlrmi_bus_space_set_region_4(void *t,
171255274Scarl    bus_space_handle_t bsh,
172250079Scarl    bus_size_t offset, u_int32_t value,
173250079Scarl    size_t count);
174250079Scarl
175250079Scarlstatic void
176250079Scarlrmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
177250079Scarl    bus_size_t offset __unused, bus_size_t len __unused, int flags);
178250079Scarl
179250079Scarl
180289546Scemstatic void
181289546Scemrmi_bus_space_copy_region_2(void *t,
182289546Scem    bus_space_handle_t bsh1,
183289546Scem    bus_size_t off1,
184289546Scem    bus_space_handle_t bsh2,
185289546Scem    bus_size_t off2, size_t count);
186289546Scem
187250079Scarlu_int8_t
188289610Scemrmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
189289610Scem    bus_size_t offset);
190289610Scem
191289539Scemstatic u_int16_t
192289542Scemrmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
193289542Scem    bus_size_t offset);
194289542Scem
195289543Scemstatic u_int32_t
196289542Scemrmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
197289542Scem    bus_size_t offset);
198289539Scemstatic void
199289539Scemrmi_bus_space_read_multi_stream_1(void *t,
200289539Scem    bus_space_handle_t handle,
201289539Scem    bus_size_t offset, u_int8_t * addr,
202289539Scem    size_t count);
203289542Scem
204289546Scemstatic void
205289546Scemrmi_bus_space_read_multi_stream_2(void *t,
206289546Scem    bus_space_handle_t handle,
207289546Scem    bus_size_t offset, u_int16_t * addr,
208289542Scem    size_t count);
209289542Scem
210289546Scemstatic void
211289546Scemrmi_bus_space_read_multi_stream_4(void *t,
212289542Scem    bus_space_handle_t handle,
213289542Scem    bus_size_t offset, u_int32_t * addr,
214289542Scem    size_t count);
215289546Scem
216289542Scemvoid
217289542Scemrmi_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
218289542Scem    bus_size_t offset, u_int8_t value);
219289542Scemstatic void
220289542Scemrmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
221289542Scem    bus_size_t offset, u_int16_t value);
222289542Scem
223250079Scarlstatic void
224250079Scarlrmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
225289234Scem    bus_size_t offset, u_int32_t value);
226289234Scem
227289234Scemstatic void
228289234Scemrmi_bus_space_write_multi_stream_1(void *t,
229289234Scem    bus_space_handle_t handle,
230289234Scem    bus_size_t offset,
231289234Scem    const u_int8_t * addr,
232289234Scem    size_t count);
233289234Scemstatic void
234289234Scemrmi_bus_space_write_multi_stream_2(void *t,
235289234Scem    bus_space_handle_t handle,
236289234Scem    bus_size_t offset,
237289234Scem    const u_int16_t * addr,
238289234Scem    size_t count);
239289234Scem
240289234Scemstatic void
241289234Scemrmi_bus_space_write_multi_stream_4(void *t,
242289234Scem    bus_space_handle_t handle,
243289234Scem    bus_size_t offset,
244289234Scem    const u_int32_t * addr,
245255279Scarl    size_t count);
246255279Scarl
247255279Scarl
248255279Scarlstatic struct bus_space local_rmi_bus_space = {
249255279Scarl	/* cookie */
250255279Scarl	(void *)0,
251255279Scarl
252250079Scarl	/* mapping/unmapping */
253255279Scarl	rmi_bus_space_map,
254289397Scem	rmi_bus_space_unmap,
255289542Scem	rmi_bus_space_subregion,
256255279Scarl
257289542Scem	/* allocation/deallocation */
258289397Scem	NULL,
259250079Scarl	NULL,
260250079Scarl
261250079Scarl	/* barrier */
262250079Scarl	rmi_bus_space_barrier,
263289539Scem
264289546Scem	/* read (single) */
265289546Scem	rmi_bus_space_read_1,
266289546Scem	rmi_bus_space_read_2,
267255272Scarl	rmi_bus_space_read_4,
268289541Scem	NULL,
269255272Scarl
270255272Scarl	/* read multiple */
271255272Scarl	rmi_bus_space_read_multi_1,
272250079Scarl	rmi_bus_space_read_multi_2,
273289344Scem	rmi_bus_space_read_multi_4,
274289540Scem	NULL,
275289342Scem
276289540Scem	/* read region */
277250079Scarl	rmi_bus_space_read_region_1,
278289540Scem	rmi_bus_space_read_region_2,
279289546Scem	rmi_bus_space_read_region_4,
280289546Scem	NULL,
281289546Scem
282289546Scem	/* write (single) */
283289546Scem	rmi_bus_space_write_1,
284289546Scem	rmi_bus_space_write_2,
285289546Scem	rmi_bus_space_write_4,
286250079Scarl	NULL,
287289397Scem
288289348Scem	/* write multiple */
289289348Scem	rmi_bus_space_write_multi_1,
290289542Scem	rmi_bus_space_write_multi_2,
291289542Scem	rmi_bus_space_write_multi_4,
292289272Scem	NULL,
293255279Scarl
294289543Scem	/* write region */
295289543Scem	NULL,
296289543Scem	rmi_bus_space_write_region_2,
297289543Scem	rmi_bus_space_write_region_4,
298289543Scem	NULL,
299289543Scem
300289542Scem	/* set multiple */
301289542Scem	NULL,
302289546Scem	NULL,
303289546Scem	NULL,
304289546Scem	NULL,
305289546Scem
306289542Scem	/* set region */
307289546Scem	NULL,
308250079Scarl	rmi_bus_space_set_region_2,
309289546Scem	rmi_bus_space_set_region_4,
310255274Scarl	NULL,
311250079Scarl
312250079Scarl	/* copy */
313289612Scem	NULL,
314289612Scem	rmi_bus_space_copy_region_2,
315289612Scem	NULL,
316289233Scem	NULL,
317289233Scem
318289538Scem	/* read (single) stream */
319289233Scem	rmi_bus_space_read_stream_1,
320289538Scem	rmi_bus_space_read_stream_2,
321289233Scem	rmi_bus_space_read_stream_4,
322289538Scem	NULL,
323289538Scem
324289233Scem	/* read multiple stream */
325289538Scem	rmi_bus_space_read_multi_stream_1,
326289538Scem	rmi_bus_space_read_multi_stream_2,
327289233Scem	rmi_bus_space_read_multi_stream_4,
328289538Scem	NULL,
329289538Scem
330289233Scem	/* read region stream */
331255274Scarl	rmi_bus_space_read_region_1,
332250079Scarl	rmi_bus_space_read_region_2,
333250079Scarl	rmi_bus_space_read_region_4,
334289542Scem	NULL,
335289542Scem
336289542Scem	/* write (single) stream */
337289542Scem	rmi_bus_space_write_stream_1,
338289542Scem	rmi_bus_space_write_stream_2,
339289542Scem	rmi_bus_space_write_stream_4,
340289542Scem	NULL,
341289607Scem
342289607Scem	/* write multiple stream */
343289607Scem	rmi_bus_space_write_multi_stream_1,
344289607Scem	rmi_bus_space_write_multi_stream_2,
345289607Scem	rmi_bus_space_write_multi_stream_4,
346289607Scem	NULL,
347289542Scem
348289542Scem	/* write region stream */
349289542Scem	NULL,
350289542Scem	rmi_bus_space_write_region_2,
351289542Scem	rmi_bus_space_write_region_4,
352289542Scem	NULL,
353289542Scem};
354289542Scem
355289542Scem/* generic bus_space tag */
356289546Scembus_space_tag_t rmi_bus_space = &local_rmi_bus_space;
357289546Scem
358289546Scem#define	MIPS_BUS_SPACE_IO	0	/* space is i/o space */
359289542Scem#define MIPS_BUS_SPACE_MEM	1	/* space is mem space */
360289546Scem#define MIPS_BUS_SPACE_PCI	10	/* avoid conflict with other spaces */
361289542Scem
362289546Scem#define BUS_SPACE_UNRESTRICTED	(~0)
363289542Scem
364289546Scem#define SWAP32(x)\
365289542Scem        (((x) & 0xff000000) >> 24) | \
366289542Scem        (((x) & 0x000000ff) << 24) | \
367289542Scem        (((x) & 0x0000ff00) << 8)  | \
368289542Scem        (((x) & 0x00ff0000) >> 8)
369289542Scem
370289542Scem#define SWAP16(x)\
371289542Scem        (((x) & 0xff00) >> 8) | \
372289542Scem        (((x) & 0x00ff) << 8)
373289542Scem
374289607Scem/*
375289607Scem * Map a region of device bus space into CPU virtual address space.
376289607Scem */
377289607Scem
378289607Scem
379289607Scemstatic int
380289542Scemrmi_bus_space_map(void *t __unused, bus_addr_t addr,
381289542Scem    bus_size_t size __unused, int flags __unused,
382289542Scem    bus_space_handle_t * bshp)
383289542Scem{
384289542Scem
385289542Scem	*bshp = addr;
386289542Scem	return (0);
387289546Scem}
388289546Scem
389289546Scem/*
390289546Scem * Unmap a region of device bus space.
391289542Scem */
392289546Scemstatic void
393289546Scemrmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
394289546Scem    bus_size_t size __unused)
395289542Scem{
396289546Scem}
397289546Scem
398289542Scem/*
399289542Scem * Get a new handle for a subregion of an already-mapped area of bus space.
400289614Scem */
401289542Scem
402289542Scemstatic int
403289542Scemrmi_bus_space_subregion(void *t __unused, bus_space_handle_t bsh,
404289542Scem    bus_size_t offset, bus_size_t size __unused,
405289542Scem    bus_space_handle_t * nbshp)
406289542Scem{
407289542Scem	*nbshp = bsh + offset;
408289614Scem	return (0);
409289542Scem}
410289542Scem
411289542Scem/*
412289542Scem * Read a 1, 2, 4, or 8 byte quantity from bus space
413289542Scem * described by tag/handle/offset.
414289542Scem */
415289542Scem
416289614Scemstatic u_int8_t
417289614Scemrmi_bus_space_read_1(void *tag, bus_space_handle_t handle,
418289614Scem    bus_size_t offset)
419289614Scem{
420289614Scem	if ((int)tag == MIPS_BUS_SPACE_PCI)
421289614Scem		return (u_int8_t) (*(volatile u_int8_t *)(handle + offset));
422289614Scem	else
423289614Scem		return (u_int8_t) (*(volatile u_int32_t *)(handle + offset));
424289614Scem}
425289614Scem
426289614Scemstatic u_int16_t
427289614Scemrmi_bus_space_read_2(void *tag, bus_space_handle_t handle,
428289614Scem    bus_size_t offset)
429289614Scem{
430289614Scem	if ((int)tag == MIPS_BUS_SPACE_PCI)
431289614Scem		return SWAP16((u_int16_t) (*(volatile u_int16_t *)(handle + offset)));
432289614Scem	else
433289614Scem		return *(volatile u_int16_t *)(handle + offset);
434289614Scem}
435289614Scem
436289614Scemstatic u_int32_t
437289614Scemrmi_bus_space_read_4(void *tag, bus_space_handle_t handle,
438289614Scem    bus_size_t offset)
439289614Scem{
440289614Scem	if ((int)tag == MIPS_BUS_SPACE_PCI)
441289614Scem		return SWAP32((*(volatile u_int32_t *)(handle + offset)));
442289614Scem	else
443289614Scem		return (*(volatile u_int32_t *)(handle + offset));
444289614Scem}
445289614Scem
446289614Scem
447250079Scarl
448250079Scarl/*
449250079Scarl * Read `count' 1, 2, 4, or 8 byte quantities from bus space
450250079Scarl * described by tag/handle/offset and copy into buffer provided.
451250079Scarl */
452250079Scarlstatic void
453250079Scarlrmi_bus_space_read_multi_1(void *tag, bus_space_handle_t handle,
454250079Scarl    bus_size_t offset, u_int8_t * addr, size_t count)
455250079Scarl{
456250079Scarl
457250079Scarl	if ((int)tag != MIPS_BUS_SPACE_PCI)
458250079Scarl		return;
459250079Scarl	while (count--) {
460250079Scarl		*addr = (*(volatile u_int8_t *)(handle + offset));
461250079Scarl		addr++;
462250079Scarl	}
463250079Scarl}
464250079Scarl
465250079Scarlstatic void
466250079Scarlrmi_bus_space_read_multi_2(void *tag, bus_space_handle_t handle,
467250079Scarl    bus_size_t offset, u_int16_t * addr, size_t count)
468250079Scarl{
469250079Scarl
470289207Scem	if ((int)tag != MIPS_BUS_SPACE_PCI)
471289207Scem		return;
472250079Scarl	while (count--) {
473250079Scarl		*addr = *(volatile u_int16_t *)(handle + offset);
474250079Scarl		*addr = SWAP16(*addr);
475250079Scarl		addr++;
476250079Scarl	}
477250079Scarl}
478289209Scem
479250079Scarlstatic void
480289209Scemrmi_bus_space_read_multi_4(void *tag, bus_space_handle_t handle,
481289209Scem    bus_size_t offset, u_int32_t * addr, size_t count)
482250079Scarl{
483289209Scem
484289209Scem	if ((int)tag != MIPS_BUS_SPACE_PCI)
485289209Scem		return;
486250079Scarl	while (count--) {
487250079Scarl		*addr = *(volatile u_int32_t *)(handle + offset);
488250079Scarl		*addr = SWAP32(*addr);
489250079Scarl		addr++;
490250079Scarl	}
491289209Scem}
492289209Scem
493250079Scarl/*
494250079Scarl * Write the 1, 2, 4, or 8 byte value `value' to bus space
495289209Scem * described by tag/handle/offset.
496289209Scem */
497289209Scem
498250079Scarl
499250079Scarlstatic void
500255274Scarlrmi_bus_space_write_1(void *tag, bus_space_handle_t handle,
501289543Scem    bus_size_t offset, u_int8_t value)
502250079Scarl{
503250079Scarl	mips_sync();
504283291Sjkim	if ((int)tag == MIPS_BUS_SPACE_PCI)
505283291Sjkim		*(volatile u_int8_t *)(handle + offset) = value;
506289542Scem	else
507289546Scem		*(volatile u_int32_t *)(handle + offset) = (u_int32_t) value;
508250079Scarl}
509289348Scem
510289348Scemstatic void
511289348Scemrmi_bus_space_write_2(void *tag, bus_space_handle_t handle,
512289348Scem    bus_size_t offset, u_int16_t value)
513289348Scem{
514289348Scem	mips_sync();
515289348Scem	if ((int)tag == MIPS_BUS_SPACE_PCI) {
516289397Scem		*(volatile u_int16_t *)(handle + offset) = SWAP16(value);
517289396Scem	} else
518289209Scem		*(volatile u_int16_t *)(handle + offset) = value;
519289209Scem}
520289209Scem
521289272Scem
522289542Scemstatic void
523289272Scemrmi_bus_space_write_4(void *tag, bus_space_handle_t handle,
524289542Scem    bus_size_t offset, u_int32_t value)
525289209Scem{
526289209Scem	mips_sync();
527289540Scem	if ((int)tag == MIPS_BUS_SPACE_PCI) {
528289209Scem		*(volatile u_int32_t *)(handle + offset) = SWAP32(value);
529289209Scem	} else
530250079Scarl		*(volatile u_int32_t *)(handle + offset) = value;
531250079Scarl}
532250079Scarl
533289209Scem
534289209Scem
535289209Scem/*
536250079Scarl * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
537250079Scarl * provided to bus space described by tag/handle/offset.
538250079Scarl */
539250079Scarl
540250079Scarl
541250079Scarlstatic void
542289209Scemrmi_bus_space_write_multi_1(void *tag, bus_space_handle_t handle,
543250079Scarl    bus_size_t offset, const u_int8_t * addr, size_t count)
544289209Scem{
545289542Scem	mips_sync();
546289542Scem	if ((int)tag != MIPS_BUS_SPACE_PCI)
547250079Scarl		return;
548250079Scarl	while (count--) {
549289272Scem		(*(volatile u_int8_t *)(handle + offset)) = *addr;
550289272Scem		addr++;
551250079Scarl	}
552289397Scem}
553289542Scem
554289546Scemstatic void
555289542Scemrmi_bus_space_write_multi_2(void *tag, bus_space_handle_t handle,
556289397Scem    bus_size_t offset, const u_int16_t * addr, size_t count)
557289397Scem{
558289397Scem	mips_sync();
559289397Scem	if ((int)tag != MIPS_BUS_SPACE_PCI)
560289397Scem		return;
561250079Scarl	while (count--) {
562250079Scarl		(*(volatile u_int16_t *)(handle + offset)) = SWAP16(*addr);
563250079Scarl		addr++;
564250079Scarl	}
565250079Scarl}
566289542Scem
567289542Scemstatic void
568289542Scemrmi_bus_space_write_multi_4(void *tag, bus_space_handle_t handle,
569289539Scem    bus_size_t offset, const u_int32_t * addr, size_t count)
570289539Scem{
571289539Scem	mips_sync();
572289539Scem	if ((int)tag != MIPS_BUS_SPACE_PCI)
573289543Scem		return;
574289543Scem	while (count--) {
575289542Scem		(*(volatile u_int32_t *)(handle + offset)) = SWAP32(*addr);
576289546Scem		addr++;
577289539Scem	}
578289542Scem}
579289539Scem
580289539Scem/*
581289546Scem * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
582289546Scem * by tag/handle starting at `offset'.
583289546Scem */
584289546Scem
585289546Scemstatic void
586289546Scemrmi_bus_space_set_region_2(void *t, bus_space_handle_t bsh,
587289546Scem    bus_size_t offset, u_int16_t value, size_t count)
588289546Scem{
589289546Scem	bus_addr_t addr = bsh + offset;
590289546Scem
591289546Scem	for (; count != 0; count--, addr += 2)
592289546Scem		(*(volatile u_int16_t *)(addr)) = value;
593289546Scem}
594289546Scem
595289546Scemstatic void
596289546Scemrmi_bus_space_set_region_4(void *t, bus_space_handle_t bsh,
597289546Scem    bus_size_t offset, u_int32_t value, size_t count)
598289546Scem{
599289546Scem	bus_addr_t addr = bsh + offset;
600289546Scem
601289546Scem	for (; count != 0; count--, addr += 4)
602289546Scem		(*(volatile u_int32_t *)(addr)) = value;
603289546Scem}
604289546Scem
605289546Scem
606289546Scem/*
607289546Scem * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
608289546Scem * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
609289546Scem */
610289546Scemstatic void
611289546Scemrmi_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1,
612289546Scem    bus_size_t off1, bus_space_handle_t bsh2,
613289546Scem    bus_size_t off2, size_t count)
614289546Scem{
615289546Scem	printf("bus_space_copy_region_2 - unimplemented\n");
616289546Scem}
617289546Scem
618289546Scem/*
619289546Scem * Read `count' 1, 2, 4, or 8 byte quantities from bus space
620289546Scem * described by tag/handle/offset and copy into buffer provided.
621289546Scem */
622289546Scem
623289546Scemu_int8_t
624289546Scemrmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
625289546Scem    bus_size_t offset)
626250079Scarl{
627255272Scarl
628250079Scarl	return *((volatile u_int8_t *)(handle + offset));
629255272Scarl}
630250079Scarl
631250079Scarl
632289541Scemstatic u_int16_t
633255272Scarlrmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
634289541Scem    bus_size_t offset)
635255272Scarl{
636289209Scem	return *(volatile u_int16_t *)(handle + offset);
637289541Scem}
638255272Scarl
639289541Scem
640289543Scemstatic u_int32_t
641289543Scemrmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
642289543Scem    bus_size_t offset)
643255272Scarl{
644289209Scem	return (*(volatile u_int32_t *)(handle + offset));
645289543Scem}
646289538Scem
647289541Scem
648255279Scarlstatic void
649289541Scemrmi_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle,
650289543Scem    bus_size_t offset, u_int8_t * addr, size_t count)
651289543Scem{
652289543Scem
653289543Scem	if ((int)tag != MIPS_BUS_SPACE_PCI)
654289397Scem		return;
655289541Scem	while (count--) {
656289397Scem		*addr = (*(volatile u_int8_t *)(handle + offset));
657289397Scem		addr++;
658289538Scem	}
659289541Scem}
660289397Scem
661289541Scemstatic void
662289543Scemrmi_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle,
663289543Scem    bus_size_t offset, u_int16_t * addr, size_t count)
664289543Scem{
665250079Scarl
666289541Scem	if ((int)tag != MIPS_BUS_SPACE_PCI)
667289209Scem		return;
668255272Scarl	while (count--) {
669255272Scarl		*addr = (*(volatile u_int16_t *)(handle + offset));
670255272Scarl		addr++;
671255272Scarl	}
672255272Scarl}
673289541Scem
674289541Scemstatic void
675289541Scemrmi_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle,
676289541Scem    bus_size_t offset, u_int32_t * addr, size_t count)
677289541Scem{
678289541Scem
679289541Scem	if ((int)tag != MIPS_BUS_SPACE_PCI)
680289541Scem		return;
681255272Scarl	while (count--) {
682255272Scarl		*addr = (*(volatile u_int32_t *)(handle + offset));
683255272Scarl		addr++;
684255272Scarl	}
685255275Scarl}
686289209Scem
687255272Scarl
688255272Scarl
689289209Scem/*
690289209Scem * Read `count' 1, 2, 4, or 8 byte quantities from bus space
691289541Scem * described by tag/handle and starting at `offset' and copy into
692289209Scem * buffer provided.
693255272Scarl */
694255272Scarlvoid
695255272Scarlrmi_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
696255272Scarl    bus_size_t offset, u_int8_t * addr, size_t count)
697255272Scarl{
698255272Scarl	bus_addr_t baddr = bsh + offset;
699255276Scarl
700255272Scarl	while (count--) {
701289209Scem		*addr++ = (*(volatile u_int8_t *)(baddr));
702289209Scem		baddr += 1;
703250079Scarl	}
704255272Scarl}
705255272Scarl
706255276Scarlvoid
707289209Scemrmi_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
708289209Scem    bus_size_t offset, u_int16_t * addr, size_t count)
709289209Scem{
710289209Scem	bus_addr_t baddr = bsh + offset;
711289209Scem
712289209Scem	while (count--) {
713289209Scem		*addr++ = (*(volatile u_int16_t *)(baddr));
714289209Scem		baddr += 2;
715289209Scem	}
716289209Scem}
717289209Scem
718289209Scemvoid
719289209Scemrmi_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
720289209Scem    bus_size_t offset, u_int32_t * addr, size_t count)
721289209Scem{
722289209Scem	bus_addr_t baddr = bsh + offset;
723289209Scem
724289209Scem	while (count--) {
725289209Scem		*addr++ = (*(volatile u_int32_t *)(baddr));
726289209Scem		baddr += 4;
727289209Scem	}
728289209Scem}
729289209Scem
730289209Scem
731289209Scemvoid
732289209Scemrmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
733289209Scem    bus_size_t offset, u_int8_t value)
734289209Scem{
735255272Scarl	mips_sync();
736289209Scem	*(volatile u_int8_t *)(handle + offset) = value;
737289209Scem}
738255272Scarl
739250079Scarl
740289209Scemstatic void
741289209Scemrmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
742250079Scarl    bus_size_t offset, u_int16_t value)
743289209Scem{
744289209Scem	mips_sync();
745289209Scem	*(volatile u_int16_t *)(handle + offset) = value;
746289209Scem}
747289209Scem
748289209Scem
749289209Scemstatic void
750289209Scemrmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
751289209Scem    bus_size_t offset, u_int32_t value)
752289541Scem{
753250079Scarl	mips_sync();
754250079Scarl	*(volatile u_int32_t *)(handle + offset) = value;
755250079Scarl}
756250079Scarl
757250079Scarl
758250079Scarlstatic void
759250079Scarlrmi_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle,
760250079Scarl    bus_size_t offset, const u_int8_t * addr, size_t count)
761250079Scarl{
762289397Scem	mips_sync();
763250079Scarl	if ((int)tag != MIPS_BUS_SPACE_PCI)
764250079Scarl		return;
765250079Scarl	while (count--) {
766250079Scarl		(*(volatile u_int8_t *)(handle + offset)) = *addr;
767250079Scarl		addr++;
768250079Scarl	}
769250079Scarl}
770250079Scarl
771250079Scarlstatic void
772289540Scemrmi_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle,
773250079Scarl    bus_size_t offset, const u_int16_t * addr, size_t count)
774289342Scem{
775289342Scem	mips_sync();
776289342Scem	if ((int)tag != MIPS_BUS_SPACE_PCI)
777289342Scem		return;
778289342Scem	while (count--) {
779289342Scem		(*(volatile u_int16_t *)(handle + offset)) = *addr;
780289342Scem		addr++;
781289342Scem	}
782289342Scem}
783289342Scem
784289342Scemstatic void
785289342Scemrmi_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle,
786289342Scem    bus_size_t offset, const u_int32_t * addr, size_t count)
787289342Scem{
788289342Scem	mips_sync();
789289546Scem	if ((int)tag != MIPS_BUS_SPACE_PCI)
790289546Scem		return;
791289342Scem	while (count--) {
792289342Scem		(*(volatile u_int32_t *)(handle + offset)) = *addr;
793289342Scem		addr++;
794289342Scem	}
795289342Scem}
796289342Scem
797289342Scemvoid
798289342Scemrmi_bus_space_write_region_2(void *t,
799289344Scem    bus_space_handle_t bsh,
800289344Scem    bus_size_t offset,
801289344Scem    const u_int16_t * addr,
802289344Scem    size_t count)
803289344Scem{
804289344Scem	bus_addr_t baddr = (bus_addr_t) bsh + offset;
805289344Scem
806289344Scem	while (count--) {
807289344Scem		(*(volatile u_int16_t *)(baddr)) = *addr;
808289344Scem		addr++;
809289344Scem		baddr += 2;
810289344Scem	}
811289344Scem}
812289344Scem
813289344Scemvoid
814289344Scemrmi_bus_space_write_region_4(void *t, bus_space_handle_t bsh,
815289344Scem    bus_size_t offset, const u_int32_t * addr, size_t count)
816289344Scem{
817289344Scem	bus_addr_t baddr = bsh + offset;
818289344Scem
819289344Scem	while (count--) {
820289344Scem		(*(volatile u_int32_t *)(baddr)) = *addr;
821289344Scem		addr++;
822289344Scem		baddr += 4;
823289344Scem	}
824289342Scem}
825289344Scem
826289344Scemstatic void
827289344Scemrmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
828289344Scem    bus_size_t offset __unused, bus_size_t len __unused, int flags)
829289344Scem{
830289344Scem
831289344Scem}
832289344Scem