bus_space_rmi.c revision 198957
1198956Srrs/*-
2198956Srrs * Copyright (c) 2009 RMI Corporation
3198956Srrs * All rights reserved.
4198956Srrs *
5198956Srrs * Redistribution and use in source and binary forms, with or without
6198956Srrs * modification, are permitted provided that the following conditions
7198956Srrs * are met:
8198956Srrs * 1. Redistributions of source code must retain the above copyright
9198956Srrs *    notice, this list of conditions and the following disclaimer.
10198956Srrs * 2. Redistributions in binary form must reproduce the above copyright
11198956Srrs *    notice, this list of conditions and the following disclaimer in the
12198956Srrs *    documentation and/or other materials provided with the distribution.
13198956Srrs *
14198956Srrs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15198956Srrs * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16198956Srrs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17198956Srrs * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18198956Srrs * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19198956Srrs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20198956Srrs * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21198956Srrs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22198956Srrs * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23198956Srrs * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24198956Srrs * SUCH DAMAGE.
25198956Srrs *
26198956Srrs * $FreeBSD$
27198956Srrs */
28198956Srrs#include <sys/cdefs.h>
29198956Srrs__FBSDID("$FreeBSD$");
30198956Srrs
31198956Srrs#include <sys/param.h>
32198956Srrs#include <sys/systm.h>
33198956Srrs#include <sys/bus.h>
34198956Srrs#include <sys/kernel.h>
35198956Srrs#include <sys/malloc.h>
36198956Srrs#include <sys/ktr.h>
37198956Srrs
38198956Srrs#include <vm/vm.h>
39198956Srrs#include <vm/pmap.h>
40198956Srrs#include <vm/vm_kern.h>
41198956Srrs#include <vm/vm_extern.h>
42198956Srrs
43198956Srrs#include <machine/bus.h>
44198956Srrs#include <machine/cache.h>
45198956Srrsvoid xlr_putc(char);
46198956Srrsvoid xlr_print_int(uint32_t);
47198956Srrs
48198957Srrsstatic int
49198957Srrsrmi_bus_space_map(void *t, bus_addr_t addr,
50198957Srrs    bus_size_t size, int flags,
51198957Srrs    bus_space_handle_t * bshp);
52198956Srrs
53198956Srrs
54198957Srrsstatic void
55198957Srrsrmi_bus_space_unmap(void *t, bus_space_handle_t bsh,
56198957Srrs    bus_size_t size);
57198956Srrs
58198957Srrsstatic int
59198957Srrsrmi_bus_space_subregion(void *t,
60198957Srrs    bus_space_handle_t bsh,
61198957Srrs    bus_size_t offset, bus_size_t size,
62198957Srrs    bus_space_handle_t * nbshp);
63198956Srrs
64198957Srrsstatic u_int8_t
65198957Srrsrmi_bus_space_read_1(void *t,
66198957Srrs    bus_space_handle_t handle,
67198957Srrs    bus_size_t offset);
68198956Srrs
69198957Srrsstatic u_int16_t
70198957Srrsrmi_bus_space_read_2(void *t,
71198957Srrs    bus_space_handle_t handle,
72198957Srrs    bus_size_t offset);
73198956Srrs
74198957Srrsstatic u_int32_t
75198957Srrsrmi_bus_space_read_4(void *t,
76198957Srrs    bus_space_handle_t handle,
77198957Srrs    bus_size_t offset);
78198956Srrs
79198957Srrsstatic void
80198957Srrsrmi_bus_space_read_multi_1(void *t,
81198957Srrs    bus_space_handle_t handle,
82198957Srrs    bus_size_t offset, u_int8_t * addr,
83198957Srrs    size_t count);
84198956Srrs
85198957Srrsstatic void
86198957Srrsrmi_bus_space_read_multi_2(void *t,
87198957Srrs    bus_space_handle_t handle,
88198957Srrs    bus_size_t offset, u_int16_t * addr,
89198957Srrs    size_t count);
90198956Srrs
91198957Srrsstatic void
92198957Srrsrmi_bus_space_read_multi_4(void *t,
93198957Srrs    bus_space_handle_t handle,
94198957Srrs    bus_size_t offset, u_int32_t * addr,
95198957Srrs    size_t count);
96198956Srrs
97198957Srrsstatic void
98198957Srrsrmi_bus_space_read_region_1(void *t,
99198957Srrs    bus_space_handle_t bsh,
100198957Srrs    bus_size_t offset, u_int8_t * addr,
101198957Srrs    size_t count);
102198956Srrs
103198957Srrsstatic void
104198957Srrsrmi_bus_space_read_region_2(void *t,
105198957Srrs    bus_space_handle_t bsh,
106198957Srrs    bus_size_t offset, u_int16_t * addr,
107198957Srrs    size_t count);
108198956Srrs
109198957Srrsstatic void
110198957Srrsrmi_bus_space_read_region_4(void *t,
111198957Srrs    bus_space_handle_t bsh,
112198957Srrs    bus_size_t offset, u_int32_t * addr,
113198957Srrs    size_t count);
114198956Srrs
115198957Srrsstatic void
116198957Srrsrmi_bus_space_write_1(void *t,
117198957Srrs    bus_space_handle_t handle,
118198957Srrs    bus_size_t offset, u_int8_t value);
119198956Srrs
120198957Srrsstatic void
121198957Srrsrmi_bus_space_write_2(void *t,
122198957Srrs    bus_space_handle_t handle,
123198957Srrs    bus_size_t offset, u_int16_t value);
124198956Srrs
125198957Srrsstatic void
126198957Srrsrmi_bus_space_write_4(void *t,
127198957Srrs    bus_space_handle_t handle,
128198957Srrs    bus_size_t offset, u_int32_t value);
129198956Srrs
130198957Srrsstatic void
131198957Srrsrmi_bus_space_write_multi_1(void *t,
132198957Srrs    bus_space_handle_t handle,
133198957Srrs    bus_size_t offset,
134198957Srrs    const u_int8_t * addr,
135198957Srrs    size_t count);
136198957Srrsstatic void
137198957Srrsrmi_bus_space_write_multi_2(void *t,
138198957Srrs    bus_space_handle_t handle,
139198957Srrs    bus_size_t offset,
140198957Srrs    const u_int16_t * addr,
141198957Srrs    size_t count);
142198956Srrs
143198957Srrsstatic void
144198957Srrsrmi_bus_space_write_multi_4(void *t,
145198957Srrs    bus_space_handle_t handle,
146198957Srrs    bus_size_t offset,
147198957Srrs    const u_int32_t * addr,
148198957Srrs    size_t count);
149198956Srrs
150198957Srrsstatic void
151198957Srrsrmi_bus_space_write_region_2(void *t,
152198957Srrs    bus_space_handle_t bsh,
153198957Srrs    bus_size_t offset,
154198957Srrs    const u_int16_t * addr,
155198957Srrs    size_t count);
156198956Srrs
157198957Srrsstatic void
158198957Srrsrmi_bus_space_write_region_4(void *t,
159198957Srrs    bus_space_handle_t bsh,
160198957Srrs    bus_size_t offset,
161198957Srrs    const u_int32_t * addr,
162198957Srrs    size_t count);
163198956Srrs
164198956Srrs
165198957Srrsstatic void
166198957Srrsrmi_bus_space_set_region_2(void *t,
167198957Srrs    bus_space_handle_t bsh,
168198957Srrs    bus_size_t offset, u_int16_t value,
169198957Srrs    size_t count);
170198957Srrsstatic void
171198957Srrsrmi_bus_space_set_region_4(void *t,
172198957Srrs    bus_space_handle_t bsh,
173198957Srrs    bus_size_t offset, u_int32_t value,
174198957Srrs    size_t count);
175198956Srrs
176198957Srrsstatic void
177198957Srrsrmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
178198957Srrs    bus_size_t offset __unused, bus_size_t len __unused, int flags);
179198956Srrs
180198956Srrs
181198957Srrsstatic void
182198957Srrsrmi_bus_space_copy_region_2(void *t,
183198957Srrs    bus_space_handle_t bsh1,
184198957Srrs    bus_size_t off1,
185198957Srrs    bus_space_handle_t bsh2,
186198957Srrs    bus_size_t off2, size_t count);
187198956Srrs
188198957Srrsu_int8_t
189198957Srrsrmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
190198957Srrs    bus_size_t offset);
191198956Srrs
192198957Srrsstatic u_int16_t
193198957Srrsrmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
194198957Srrs    bus_size_t offset);
195198956Srrs
196198957Srrsstatic u_int32_t
197198957Srrsrmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
198198957Srrs    bus_size_t offset);
199198957Srrsstatic void
200198957Srrsrmi_bus_space_read_multi_stream_1(void *t,
201198957Srrs    bus_space_handle_t handle,
202198957Srrs    bus_size_t offset, u_int8_t * addr,
203198957Srrs    size_t count);
204198956Srrs
205198957Srrsstatic void
206198957Srrsrmi_bus_space_read_multi_stream_2(void *t,
207198957Srrs    bus_space_handle_t handle,
208198957Srrs    bus_size_t offset, u_int16_t * addr,
209198957Srrs    size_t count);
210198956Srrs
211198957Srrsstatic void
212198957Srrsrmi_bus_space_read_multi_stream_4(void *t,
213198957Srrs    bus_space_handle_t handle,
214198957Srrs    bus_size_t offset, u_int32_t * addr,
215198957Srrs    size_t count);
216198956Srrs
217198957Srrsvoid
218198957Srrsrmi_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
219198957Srrs    bus_size_t offset, u_int8_t value);
220198957Srrsstatic void
221198957Srrsrmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
222198957Srrs    bus_size_t offset, u_int16_t value);
223198956Srrs
224198957Srrsstatic void
225198957Srrsrmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
226198957Srrs    bus_size_t offset, u_int32_t value);
227198956Srrs
228198957Srrsstatic void
229198957Srrsrmi_bus_space_write_multi_stream_1(void *t,
230198957Srrs    bus_space_handle_t handle,
231198957Srrs    bus_size_t offset,
232198957Srrs    const u_int8_t * addr,
233198957Srrs    size_t count);
234198957Srrsstatic void
235198957Srrsrmi_bus_space_write_multi_stream_2(void *t,
236198957Srrs    bus_space_handle_t handle,
237198957Srrs    bus_size_t offset,
238198957Srrs    const u_int16_t * addr,
239198957Srrs    size_t count);
240198956Srrs
241198957Srrsstatic void
242198957Srrsrmi_bus_space_write_multi_stream_4(void *t,
243198957Srrs    bus_space_handle_t handle,
244198957Srrs    bus_size_t offset,
245198957Srrs    const u_int32_t * addr,
246198957Srrs    size_t count);
247198956Srrs
248198957Srrs
249198956Srrsstatic struct bus_space local_rmi_bus_space = {
250198956Srrs	/* cookie */
251198957Srrs	(void *)0,
252198956Srrs
253198956Srrs	/* mapping/unmapping */
254198956Srrs	rmi_bus_space_map,
255198956Srrs	rmi_bus_space_unmap,
256198956Srrs	rmi_bus_space_subregion,
257198956Srrs
258198956Srrs	/* allocation/deallocation */
259198956Srrs	NULL,
260198956Srrs	NULL,
261198956Srrs
262198956Srrs	/* barrier */
263198957Srrs	rmi_bus_space_barrier,
264198956Srrs
265198956Srrs	/* read (single) */
266198956Srrs	rmi_bus_space_read_1,
267198956Srrs	rmi_bus_space_read_2,
268198956Srrs	rmi_bus_space_read_4,
269198956Srrs	NULL,
270198956Srrs
271198956Srrs	/* read multiple */
272198956Srrs	rmi_bus_space_read_multi_1,
273198956Srrs	rmi_bus_space_read_multi_2,
274198956Srrs	rmi_bus_space_read_multi_4,
275198956Srrs	NULL,
276198956Srrs
277198956Srrs	/* read region */
278198956Srrs	rmi_bus_space_read_region_1,
279198956Srrs	rmi_bus_space_read_region_2,
280198956Srrs	rmi_bus_space_read_region_4,
281198956Srrs	NULL,
282198956Srrs
283198956Srrs	/* write (single) */
284198956Srrs	rmi_bus_space_write_1,
285198956Srrs	rmi_bus_space_write_2,
286198956Srrs	rmi_bus_space_write_4,
287198956Srrs	NULL,
288198956Srrs
289198956Srrs	/* write multiple */
290198956Srrs	rmi_bus_space_write_multi_1,
291198956Srrs	rmi_bus_space_write_multi_2,
292198956Srrs	rmi_bus_space_write_multi_4,
293198956Srrs	NULL,
294198956Srrs
295198956Srrs	/* write region */
296198956Srrs	NULL,
297198956Srrs	rmi_bus_space_write_region_2,
298198956Srrs	rmi_bus_space_write_region_4,
299198956Srrs	NULL,
300198956Srrs
301198956Srrs	/* set multiple */
302198956Srrs	NULL,
303198956Srrs	NULL,
304198956Srrs	NULL,
305198956Srrs	NULL,
306198956Srrs
307198956Srrs	/* set region */
308198956Srrs	NULL,
309198956Srrs	rmi_bus_space_set_region_2,
310198956Srrs	rmi_bus_space_set_region_4,
311198956Srrs	NULL,
312198956Srrs
313198956Srrs	/* copy */
314198956Srrs	NULL,
315198956Srrs	rmi_bus_space_copy_region_2,
316198956Srrs	NULL,
317198956Srrs	NULL,
318198956Srrs
319198956Srrs	/* read (single) stream */
320198956Srrs	rmi_bus_space_read_stream_1,
321198956Srrs	rmi_bus_space_read_stream_2,
322198956Srrs	rmi_bus_space_read_stream_4,
323198956Srrs	NULL,
324198956Srrs
325198956Srrs	/* read multiple stream */
326198956Srrs	rmi_bus_space_read_multi_stream_1,
327198956Srrs	rmi_bus_space_read_multi_stream_2,
328198956Srrs	rmi_bus_space_read_multi_stream_4,
329198956Srrs	NULL,
330198956Srrs
331198956Srrs	/* read region stream */
332198956Srrs	rmi_bus_space_read_region_1,
333198956Srrs	rmi_bus_space_read_region_2,
334198956Srrs	rmi_bus_space_read_region_4,
335198956Srrs	NULL,
336198956Srrs
337198956Srrs	/* write (single) stream */
338198956Srrs	rmi_bus_space_write_stream_1,
339198956Srrs	rmi_bus_space_write_stream_2,
340198956Srrs	rmi_bus_space_write_stream_4,
341198956Srrs	NULL,
342198956Srrs
343198956Srrs	/* write multiple stream */
344198956Srrs	rmi_bus_space_write_multi_stream_1,
345198956Srrs	rmi_bus_space_write_multi_stream_2,
346198956Srrs	rmi_bus_space_write_multi_stream_4,
347198956Srrs	NULL,
348198956Srrs
349198956Srrs	/* write region stream */
350198956Srrs	NULL,
351198956Srrs	rmi_bus_space_write_region_2,
352198956Srrs	rmi_bus_space_write_region_4,
353198956Srrs	NULL,
354198956Srrs};
355198956Srrs
356198956Srrs/* generic bus_space tag */
357198956Srrsbus_space_tag_t rmi_bus_space = &local_rmi_bus_space;
358198956Srrs
359198956Srrs#define	MIPS_BUS_SPACE_IO	0	/* space is i/o space */
360198956Srrs#define MIPS_BUS_SPACE_MEM	1	/* space is mem space */
361198957Srrs#define MIPS_BUS_SPACE_PCI	10	/* avoid conflict with other spaces */
362198956Srrs
363198956Srrs#define BUS_SPACE_UNRESTRICTED	(~0)
364198956Srrs
365198956Srrs#define SWAP32(x)\
366198956Srrs        (((x) & 0xff000000) >> 24) | \
367198956Srrs        (((x) & 0x000000ff) << 24) | \
368198956Srrs        (((x) & 0x0000ff00) << 8)  | \
369198956Srrs        (((x) & 0x00ff0000) >> 8)
370198956Srrs
371198956Srrs#define SWAP16(x)\
372198956Srrs        (((x) & 0xff00) >> 8) | \
373198957Srrs        (((x) & 0x00ff) << 8)
374198956Srrs
375198956Srrs/*
376198956Srrs * Map a region of device bus space into CPU virtual address space.
377198956Srrs */
378198956Srrs
379198956Srrs
380198956Srrsstatic int
381198956Srrsrmi_bus_space_map(void *t __unused, bus_addr_t addr,
382198957Srrs    bus_size_t size __unused, int flags __unused,
383198957Srrs    bus_space_handle_t * bshp)
384198956Srrs{
385198956Srrs
386198956Srrs	*bshp = addr;
387198956Srrs	return (0);
388198956Srrs}
389198956Srrs
390198956Srrs/*
391198956Srrs * Unmap a region of device bus space.
392198956Srrs */
393198956Srrsstatic void
394198956Srrsrmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
395198957Srrs    bus_size_t size __unused)
396198956Srrs{
397198956Srrs}
398198956Srrs
399198956Srrs/*
400198956Srrs * Get a new handle for a subregion of an already-mapped area of bus space.
401198956Srrs */
402198956Srrs
403198956Srrsstatic int
404198956Srrsrmi_bus_space_subregion(void *t __unused, bus_space_handle_t bsh,
405198957Srrs    bus_size_t offset, bus_size_t size __unused,
406198957Srrs    bus_space_handle_t * nbshp)
407198956Srrs{
408198956Srrs	*nbshp = bsh + offset;
409198956Srrs	return (0);
410198956Srrs}
411198956Srrs
412198956Srrs/*
413198956Srrs * Read a 1, 2, 4, or 8 byte quantity from bus space
414198956Srrs * described by tag/handle/offset.
415198956Srrs */
416198956Srrs
417198956Srrsstatic u_int8_t
418198956Srrsrmi_bus_space_read_1(void *tag, bus_space_handle_t handle,
419198957Srrs    bus_size_t offset)
420198956Srrs{
421198956Srrs	if ((int)tag == MIPS_BUS_SPACE_PCI)
422198957Srrs		return (u_int8_t) (*(volatile u_int8_t *)(handle + offset));
423198956Srrs	else
424198957Srrs		return (u_int8_t) (*(volatile u_int32_t *)(handle + offset));
425198956Srrs}
426198956Srrs
427198956Srrsstatic u_int16_t
428198956Srrsrmi_bus_space_read_2(void *tag, bus_space_handle_t handle,
429198957Srrs    bus_size_t offset)
430198956Srrs{
431198956Srrs	if ((int)tag == MIPS_BUS_SPACE_PCI)
432198957Srrs		return SWAP16((u_int16_t) (*(volatile u_int16_t *)(handle + offset)));
433198956Srrs	else
434198956Srrs		return *(volatile u_int16_t *)(handle + offset);
435198956Srrs}
436198956Srrs
437198956Srrsstatic u_int32_t
438198956Srrsrmi_bus_space_read_4(void *tag, bus_space_handle_t handle,
439198957Srrs    bus_size_t offset)
440198956Srrs{
441198956Srrs	if ((int)tag == MIPS_BUS_SPACE_PCI)
442198956Srrs		return SWAP32((*(volatile u_int32_t *)(handle + offset)));
443198957Srrs	else
444198956Srrs		return (*(volatile u_int32_t *)(handle + offset));
445198956Srrs}
446198956Srrs
447198956Srrs
448198956Srrs
449198956Srrs/*
450198956Srrs * Read `count' 1, 2, 4, or 8 byte quantities from bus space
451198956Srrs * described by tag/handle/offset and copy into buffer provided.
452198956Srrs */
453198956Srrsstatic void
454198956Srrsrmi_bus_space_read_multi_1(void *tag, bus_space_handle_t handle,
455198957Srrs    bus_size_t offset, u_int8_t * addr, size_t count)
456198956Srrs{
457198956Srrs
458198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
459198956Srrs		return;
460198956Srrs	while (count--) {
461198956Srrs		*addr = (*(volatile u_int8_t *)(handle + offset));
462198956Srrs		addr++;
463198956Srrs	}
464198956Srrs}
465198956Srrs
466198956Srrsstatic void
467198956Srrsrmi_bus_space_read_multi_2(void *tag, bus_space_handle_t handle,
468198957Srrs    bus_size_t offset, u_int16_t * addr, size_t count)
469198956Srrs{
470198956Srrs
471198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
472198956Srrs		return;
473198956Srrs	while (count--) {
474198956Srrs		*addr = *(volatile u_int16_t *)(handle + offset);
475198956Srrs		*addr = SWAP16(*addr);
476198956Srrs		addr++;
477198956Srrs	}
478198956Srrs}
479198956Srrs
480198956Srrsstatic void
481198956Srrsrmi_bus_space_read_multi_4(void *tag, bus_space_handle_t handle,
482198957Srrs    bus_size_t offset, u_int32_t * addr, size_t count)
483198956Srrs{
484198956Srrs
485198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
486198956Srrs		return;
487198956Srrs	while (count--) {
488198956Srrs		*addr = *(volatile u_int32_t *)(handle + offset);
489198956Srrs		*addr = SWAP32(*addr);
490198956Srrs		addr++;
491198956Srrs	}
492198956Srrs}
493198956Srrs
494198956Srrs/*
495198956Srrs * Write the 1, 2, 4, or 8 byte value `value' to bus space
496198956Srrs * described by tag/handle/offset.
497198956Srrs */
498198956Srrs
499198956Srrs
500198956Srrsstatic void
501198956Srrsrmi_bus_space_write_1(void *tag, bus_space_handle_t handle,
502198957Srrs    bus_size_t offset, u_int8_t value)
503198956Srrs{
504198956Srrs	mips_sync();
505198956Srrs	if ((int)tag == MIPS_BUS_SPACE_PCI)
506198956Srrs		*(volatile u_int8_t *)(handle + offset) = value;
507198956Srrs	else
508198957Srrs		*(volatile u_int32_t *)(handle + offset) = (u_int32_t) value;
509198956Srrs}
510198956Srrs
511198956Srrsstatic void
512198956Srrsrmi_bus_space_write_2(void *tag, bus_space_handle_t handle,
513198957Srrs    bus_size_t offset, u_int16_t value)
514198956Srrs{
515198956Srrs	mips_sync();
516198956Srrs	if ((int)tag == MIPS_BUS_SPACE_PCI) {
517198956Srrs		*(volatile u_int16_t *)(handle + offset) = SWAP16(value);
518198956Srrs	} else
519198956Srrs		*(volatile u_int16_t *)(handle + offset) = value;
520198956Srrs}
521198956Srrs
522198956Srrs
523198956Srrsstatic void
524198956Srrsrmi_bus_space_write_4(void *tag, bus_space_handle_t handle,
525198957Srrs    bus_size_t offset, u_int32_t value)
526198956Srrs{
527198956Srrs	mips_sync();
528198956Srrs	if ((int)tag == MIPS_BUS_SPACE_PCI) {
529198956Srrs		*(volatile u_int32_t *)(handle + offset) = SWAP32(value);
530198956Srrs	} else
531198956Srrs		*(volatile u_int32_t *)(handle + offset) = value;
532198956Srrs}
533198956Srrs
534198956Srrs
535198956Srrs
536198956Srrs/*
537198956Srrs * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
538198956Srrs * provided to bus space described by tag/handle/offset.
539198956Srrs */
540198956Srrs
541198956Srrs
542198956Srrsstatic void
543198956Srrsrmi_bus_space_write_multi_1(void *tag, bus_space_handle_t handle,
544198957Srrs    bus_size_t offset, const u_int8_t * addr, size_t count)
545198956Srrs{
546198956Srrs	mips_sync();
547198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
548198956Srrs		return;
549198956Srrs	while (count--) {
550198956Srrs		(*(volatile u_int8_t *)(handle + offset)) = *addr;
551198956Srrs		addr++;
552198956Srrs	}
553198956Srrs}
554198956Srrs
555198956Srrsstatic void
556198956Srrsrmi_bus_space_write_multi_2(void *tag, bus_space_handle_t handle,
557198957Srrs    bus_size_t offset, const u_int16_t * addr, size_t count)
558198956Srrs{
559198956Srrs	mips_sync();
560198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
561198956Srrs		return;
562198956Srrs	while (count--) {
563198956Srrs		(*(volatile u_int16_t *)(handle + offset)) = SWAP16(*addr);
564198956Srrs		addr++;
565198956Srrs	}
566198956Srrs}
567198956Srrs
568198956Srrsstatic void
569198956Srrsrmi_bus_space_write_multi_4(void *tag, bus_space_handle_t handle,
570198957Srrs    bus_size_t offset, const u_int32_t * addr, size_t count)
571198956Srrs{
572198956Srrs	mips_sync();
573198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
574198956Srrs		return;
575198956Srrs	while (count--) {
576198956Srrs		(*(volatile u_int32_t *)(handle + offset)) = SWAP32(*addr);
577198956Srrs		addr++;
578198956Srrs	}
579198956Srrs}
580198956Srrs
581198956Srrs/*
582198956Srrs * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
583198956Srrs * by tag/handle starting at `offset'.
584198956Srrs */
585198956Srrs
586198956Srrsstatic void
587198956Srrsrmi_bus_space_set_region_2(void *t, bus_space_handle_t bsh,
588198957Srrs    bus_size_t offset, u_int16_t value, size_t count)
589198956Srrs{
590198956Srrs	bus_addr_t addr = bsh + offset;
591198956Srrs
592198956Srrs	for (; count != 0; count--, addr += 2)
593198956Srrs		(*(volatile u_int16_t *)(addr)) = value;
594198956Srrs}
595198956Srrs
596198956Srrsstatic void
597198956Srrsrmi_bus_space_set_region_4(void *t, bus_space_handle_t bsh,
598198957Srrs    bus_size_t offset, u_int32_t value, size_t count)
599198956Srrs{
600198956Srrs	bus_addr_t addr = bsh + offset;
601198956Srrs
602198956Srrs	for (; count != 0; count--, addr += 4)
603198956Srrs		(*(volatile u_int32_t *)(addr)) = value;
604198956Srrs}
605198956Srrs
606198956Srrs
607198956Srrs/*
608198956Srrs * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
609198956Srrs * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
610198956Srrs */
611198956Srrsstatic void
612198956Srrsrmi_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1,
613198957Srrs    bus_size_t off1, bus_space_handle_t bsh2,
614198957Srrs    bus_size_t off2, size_t count)
615198956Srrs{
616198956Srrs	printf("bus_space_copy_region_2 - unimplemented\n");
617198956Srrs}
618198956Srrs
619198956Srrs/*
620198956Srrs * Read `count' 1, 2, 4, or 8 byte quantities from bus space
621198956Srrs * described by tag/handle/offset and copy into buffer provided.
622198956Srrs */
623198956Srrs
624198956Srrsu_int8_t
625198956Srrsrmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
626198956Srrs    bus_size_t offset)
627198956Srrs{
628198956Srrs
629198956Srrs	return *((volatile u_int8_t *)(handle + offset));
630198956Srrs}
631198956Srrs
632198956Srrs
633198956Srrsstatic u_int16_t
634198956Srrsrmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
635198957Srrs    bus_size_t offset)
636198956Srrs{
637198957Srrs	return *(volatile u_int16_t *)(handle + offset);
638198956Srrs}
639198956Srrs
640198956Srrs
641198956Srrsstatic u_int32_t
642198956Srrsrmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
643198957Srrs    bus_size_t offset)
644198956Srrs{
645198957Srrs	return (*(volatile u_int32_t *)(handle + offset));
646198956Srrs}
647198956Srrs
648198956Srrs
649198956Srrsstatic void
650198956Srrsrmi_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle,
651198957Srrs    bus_size_t offset, u_int8_t * addr, size_t count)
652198956Srrs{
653198956Srrs
654198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
655198956Srrs		return;
656198956Srrs	while (count--) {
657198956Srrs		*addr = (*(volatile u_int8_t *)(handle + offset));
658198956Srrs		addr++;
659198956Srrs	}
660198956Srrs}
661198956Srrs
662198956Srrsstatic void
663198956Srrsrmi_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle,
664198957Srrs    bus_size_t offset, u_int16_t * addr, size_t count)
665198956Srrs{
666198956Srrs
667198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
668198956Srrs		return;
669198956Srrs	while (count--) {
670198956Srrs		*addr = (*(volatile u_int16_t *)(handle + offset));
671198956Srrs		addr++;
672198956Srrs	}
673198956Srrs}
674198956Srrs
675198956Srrsstatic void
676198956Srrsrmi_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle,
677198957Srrs    bus_size_t offset, u_int32_t * addr, size_t count)
678198956Srrs{
679198956Srrs
680198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
681198956Srrs		return;
682198956Srrs	while (count--) {
683198956Srrs		*addr = (*(volatile u_int32_t *)(handle + offset));
684198956Srrs		addr++;
685198956Srrs	}
686198956Srrs}
687198956Srrs
688198956Srrs
689198956Srrs
690198956Srrs/*
691198956Srrs * Read `count' 1, 2, 4, or 8 byte quantities from bus space
692198956Srrs * described by tag/handle and starting at `offset' and copy into
693198956Srrs * buffer provided.
694198956Srrs */
695198956Srrsvoid
696198956Srrsrmi_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
697198957Srrs    bus_size_t offset, u_int8_t * addr, size_t count)
698198956Srrs{
699198956Srrs	bus_addr_t baddr = bsh + offset;
700198956Srrs
701198956Srrs	while (count--) {
702198956Srrs		*addr++ = (*(volatile u_int8_t *)(baddr));
703198956Srrs		baddr += 1;
704198956Srrs	}
705198956Srrs}
706198956Srrs
707198956Srrsvoid
708198956Srrsrmi_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
709198957Srrs    bus_size_t offset, u_int16_t * addr, size_t count)
710198956Srrs{
711198956Srrs	bus_addr_t baddr = bsh + offset;
712198956Srrs
713198956Srrs	while (count--) {
714198956Srrs		*addr++ = (*(volatile u_int16_t *)(baddr));
715198956Srrs		baddr += 2;
716198956Srrs	}
717198956Srrs}
718198956Srrs
719198956Srrsvoid
720198956Srrsrmi_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
721198957Srrs    bus_size_t offset, u_int32_t * addr, size_t count)
722198956Srrs{
723198956Srrs	bus_addr_t baddr = bsh + offset;
724198956Srrs
725198956Srrs	while (count--) {
726198956Srrs		*addr++ = (*(volatile u_int32_t *)(baddr));
727198956Srrs		baddr += 4;
728198956Srrs	}
729198956Srrs}
730198956Srrs
731198956Srrs
732198956Srrsvoid
733198956Srrsrmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
734198956Srrs    bus_size_t offset, u_int8_t value)
735198956Srrs{
736198956Srrs	mips_sync();
737198956Srrs	*(volatile u_int8_t *)(handle + offset) = value;
738198956Srrs}
739198956Srrs
740198956Srrs
741198956Srrsstatic void
742198956Srrsrmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
743198957Srrs    bus_size_t offset, u_int16_t value)
744198956Srrs{
745198956Srrs	mips_sync();
746198956Srrs	*(volatile u_int16_t *)(handle + offset) = value;
747198956Srrs}
748198956Srrs
749198956Srrs
750198956Srrsstatic void
751198956Srrsrmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
752198957Srrs    bus_size_t offset, u_int32_t value)
753198956Srrs{
754198956Srrs	mips_sync();
755198956Srrs	*(volatile u_int32_t *)(handle + offset) = value;
756198956Srrs}
757198956Srrs
758198956Srrs
759198956Srrsstatic void
760198956Srrsrmi_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle,
761198957Srrs    bus_size_t offset, const u_int8_t * addr, size_t count)
762198956Srrs{
763198956Srrs	mips_sync();
764198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
765198956Srrs		return;
766198956Srrs	while (count--) {
767198956Srrs		(*(volatile u_int8_t *)(handle + offset)) = *addr;
768198956Srrs		addr++;
769198956Srrs	}
770198956Srrs}
771198956Srrs
772198956Srrsstatic void
773198956Srrsrmi_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle,
774198957Srrs    bus_size_t offset, const u_int16_t * addr, size_t count)
775198956Srrs{
776198956Srrs	mips_sync();
777198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
778198956Srrs		return;
779198956Srrs	while (count--) {
780198956Srrs		(*(volatile u_int16_t *)(handle + offset)) = *addr;
781198956Srrs		addr++;
782198956Srrs	}
783198956Srrs}
784198956Srrs
785198956Srrsstatic void
786198956Srrsrmi_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle,
787198957Srrs    bus_size_t offset, const u_int32_t * addr, size_t count)
788198956Srrs{
789198956Srrs	mips_sync();
790198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
791198956Srrs		return;
792198956Srrs	while (count--) {
793198956Srrs		(*(volatile u_int32_t *)(handle + offset)) = *addr;
794198956Srrs		addr++;
795198956Srrs	}
796198956Srrs}
797198956Srrs
798198956Srrsvoid
799198956Srrsrmi_bus_space_write_region_2(void *t,
800198957Srrs    bus_space_handle_t bsh,
801198957Srrs    bus_size_t offset,
802198957Srrs    const u_int16_t * addr,
803198957Srrs    size_t count)
804198956Srrs{
805198957Srrs	bus_addr_t baddr = (bus_addr_t) bsh + offset;
806198957Srrs
807198956Srrs	while (count--) {
808198956Srrs		(*(volatile u_int16_t *)(baddr)) = *addr;
809198956Srrs		addr++;
810198956Srrs		baddr += 2;
811198956Srrs	}
812198956Srrs}
813198956Srrs
814198956Srrsvoid
815198956Srrsrmi_bus_space_write_region_4(void *t, bus_space_handle_t bsh,
816198957Srrs    bus_size_t offset, const u_int32_t * addr, size_t count)
817198956Srrs{
818198956Srrs	bus_addr_t baddr = bsh + offset;
819198956Srrs
820198956Srrs	while (count--) {
821198956Srrs		(*(volatile u_int32_t *)(baddr)) = *addr;
822198956Srrs		addr++;
823198956Srrs		baddr += 4;
824198956Srrs	}
825198956Srrs}
826198956Srrs
827198956Srrsstatic void
828198956Srrsrmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
829198957Srrs    bus_size_t offset __unused, bus_size_t len __unused, int flags)
830198956Srrs{
831198956Srrs
832198956Srrs}
833