bus_space_rmi.c revision 198956
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
48198956Srrsstatic int rmi_bus_space_map(void *t, bus_addr_t addr,
49198956Srrs				  bus_size_t size, int flags,
50198956Srrs				  bus_space_handle_t *bshp);
51198956Srrs
52198956Srrs
53198956Srrsstatic void rmi_bus_space_unmap(void *t, bus_space_handle_t bsh,
54198956Srrs				     bus_size_t size);
55198956Srrs
56198956Srrsstatic int rmi_bus_space_subregion(void *t,
57198956Srrs					bus_space_handle_t bsh,
58198956Srrs					bus_size_t offset, bus_size_t size,
59198956Srrs					bus_space_handle_t *nbshp);
60198956Srrs
61198956Srrsstatic u_int8_t rmi_bus_space_read_1(void *t,
62198956Srrs					  bus_space_handle_t handle,
63198956Srrs					  bus_size_t offset);
64198956Srrs
65198956Srrsstatic u_int16_t rmi_bus_space_read_2(void *t,
66198956Srrs					   bus_space_handle_t handle,
67198956Srrs					   bus_size_t offset);
68198956Srrs
69198956Srrsstatic u_int32_t rmi_bus_space_read_4(void *t,
70198956Srrs					   bus_space_handle_t handle,
71198956Srrs					   bus_size_t offset);
72198956Srrs
73198956Srrsstatic void rmi_bus_space_read_multi_1(void *t,
74198956Srrs					    bus_space_handle_t handle,
75198956Srrs					    bus_size_t offset, u_int8_t *addr,
76198956Srrs					    size_t count);
77198956Srrs
78198956Srrsstatic void rmi_bus_space_read_multi_2(void *t,
79198956Srrs					    bus_space_handle_t handle,
80198956Srrs					    bus_size_t offset, u_int16_t *addr,
81198956Srrs					    size_t count);
82198956Srrs
83198956Srrsstatic void rmi_bus_space_read_multi_4(void *t,
84198956Srrs					    bus_space_handle_t handle,
85198956Srrs					    bus_size_t offset, u_int32_t *addr,
86198956Srrs					    size_t count);
87198956Srrs
88198956Srrsstatic void rmi_bus_space_read_region_1(void *t,
89198956Srrs					     bus_space_handle_t bsh,
90198956Srrs					     bus_size_t offset, u_int8_t *addr,
91198956Srrs					     size_t count);
92198956Srrs
93198956Srrsstatic void rmi_bus_space_read_region_2(void *t,
94198956Srrs					     bus_space_handle_t bsh,
95198956Srrs					     bus_size_t offset, u_int16_t *addr,
96198956Srrs					     size_t count);
97198956Srrs
98198956Srrsstatic void rmi_bus_space_read_region_4(void *t,
99198956Srrs					     bus_space_handle_t bsh,
100198956Srrs					     bus_size_t offset, u_int32_t *addr,
101198956Srrs					     size_t count);
102198956Srrs
103198956Srrsstatic void rmi_bus_space_write_1(void *t,
104198956Srrs				       bus_space_handle_t handle,
105198956Srrs				       bus_size_t offset, u_int8_t value);
106198956Srrs
107198956Srrsstatic void rmi_bus_space_write_2(void *t,
108198956Srrs				       bus_space_handle_t handle,
109198956Srrs				       bus_size_t offset, u_int16_t value);
110198956Srrs
111198956Srrsstatic void rmi_bus_space_write_4(void *t,
112198956Srrs				       bus_space_handle_t handle,
113198956Srrs				       bus_size_t offset, u_int32_t value);
114198956Srrs
115198956Srrsstatic void rmi_bus_space_write_multi_1(void *t,
116198956Srrs					     bus_space_handle_t handle,
117198956Srrs					     bus_size_t offset,
118198956Srrs					     const u_int8_t *addr,
119198956Srrs					     size_t count);
120198956Srrsstatic void rmi_bus_space_write_multi_2(void *t,
121198956Srrs					     bus_space_handle_t handle,
122198956Srrs					     bus_size_t offset,
123198956Srrs					     const u_int16_t *addr,
124198956Srrs					     size_t count);
125198956Srrs
126198956Srrsstatic void rmi_bus_space_write_multi_4(void *t,
127198956Srrs										bus_space_handle_t handle,
128198956Srrs										bus_size_t offset,
129198956Srrs										const u_int32_t *addr,
130198956Srrs										size_t count);
131198956Srrs
132198956Srrsstatic void rmi_bus_space_write_region_2(void *t,
133198956Srrs										 bus_space_handle_t bsh,
134198956Srrs										 bus_size_t offset,
135198956Srrs										 const u_int16_t *addr,
136198956Srrs										 size_t count);
137198956Srrs
138198956Srrsstatic void rmi_bus_space_write_region_4(void *t,
139198956Srrs					      bus_space_handle_t bsh,
140198956Srrs					      bus_size_t offset,
141198956Srrs					      const u_int32_t *addr,
142198956Srrs					      size_t count);
143198956Srrs
144198956Srrs
145198956Srrsstatic void rmi_bus_space_set_region_2(void *t,
146198956Srrs					    bus_space_handle_t bsh,
147198956Srrs					    bus_size_t offset, u_int16_t value,
148198956Srrs					    size_t count);
149198956Srrsstatic void rmi_bus_space_set_region_4(void *t,
150198956Srrs					    bus_space_handle_t bsh,
151198956Srrs					    bus_size_t offset, u_int32_t value,
152198956Srrs					    size_t count);
153198956Srrs
154198956Srrsstatic void rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
155198956Srrs					  bus_size_t offset __unused, bus_size_t len __unused, int flags);
156198956Srrs
157198956Srrs
158198956Srrsstatic void rmi_bus_space_copy_region_2(void *t,
159198956Srrs					     bus_space_handle_t bsh1,
160198956Srrs					     bus_size_t off1,
161198956Srrs					     bus_space_handle_t bsh2,
162198956Srrs					     bus_size_t off2, size_t count);
163198956Srrs
164198956Srrsu_int8_t rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
165198956Srrs									 bus_size_t offset);
166198956Srrs
167198956Srrsstatic u_int16_t rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
168198956Srrs							bus_size_t offset);
169198956Srrs
170198956Srrsstatic u_int32_t rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
171198956Srrs							bus_size_t offset);
172198956Srrsstatic void rmi_bus_space_read_multi_stream_1(void *t,
173198956Srrs					    bus_space_handle_t handle,
174198956Srrs					    bus_size_t offset, u_int8_t *addr,
175198956Srrs					    size_t count);
176198956Srrs
177198956Srrsstatic void rmi_bus_space_read_multi_stream_2(void *t,
178198956Srrs					    bus_space_handle_t handle,
179198956Srrs					    bus_size_t offset, u_int16_t *addr,
180198956Srrs					    size_t count);
181198956Srrs
182198956Srrsstatic void rmi_bus_space_read_multi_stream_4(void *t,
183198956Srrs					    bus_space_handle_t handle,
184198956Srrs					    bus_size_t offset, u_int32_t *addr,
185198956Srrs					    size_t count);
186198956Srrs
187198956Srrsvoid rmi_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
188198956Srrs								  bus_size_t offset, u_int8_t value);
189198956Srrsstatic void rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
190198956Srrs						 bus_size_t offset, u_int16_t value);
191198956Srrs
192198956Srrsstatic void rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
193198956Srrs						 bus_size_t offset, u_int32_t value);
194198956Srrs
195198956Srrsstatic void rmi_bus_space_write_multi_stream_1(void *t,
196198956Srrs					     bus_space_handle_t handle,
197198956Srrs					     bus_size_t offset,
198198956Srrs					     const u_int8_t *addr,
199198956Srrs					     size_t count);
200198956Srrsstatic void rmi_bus_space_write_multi_stream_2(void *t,
201198956Srrs					     bus_space_handle_t handle,
202198956Srrs					     bus_size_t offset,
203198956Srrs					     const u_int16_t *addr,
204198956Srrs					     size_t count);
205198956Srrs
206198956Srrsstatic void rmi_bus_space_write_multi_stream_4(void *t,
207198956Srrs					     bus_space_handle_t handle,
208198956Srrs					     bus_size_t offset,
209198956Srrs					     const u_int32_t *addr,
210198956Srrs					     size_t count);
211198956Srrs
212198956Srrs
213198956Srrsstatic struct bus_space local_rmi_bus_space = {
214198956Srrs	/* cookie */
215198956Srrs	(void *) 0,
216198956Srrs
217198956Srrs	/* mapping/unmapping */
218198956Srrs	rmi_bus_space_map,
219198956Srrs	rmi_bus_space_unmap,
220198956Srrs	rmi_bus_space_subregion,
221198956Srrs
222198956Srrs	/* allocation/deallocation */
223198956Srrs	NULL,
224198956Srrs	NULL,
225198956Srrs
226198956Srrs	/* barrier */
227198956Srrs	rmi_bus_space_barrier,
228198956Srrs
229198956Srrs	/* read (single) */
230198956Srrs	rmi_bus_space_read_1,
231198956Srrs	rmi_bus_space_read_2,
232198956Srrs	rmi_bus_space_read_4,
233198956Srrs	NULL,
234198956Srrs
235198956Srrs	/* read multiple */
236198956Srrs	rmi_bus_space_read_multi_1,
237198956Srrs	rmi_bus_space_read_multi_2,
238198956Srrs	rmi_bus_space_read_multi_4,
239198956Srrs	NULL,
240198956Srrs
241198956Srrs	/* read region */
242198956Srrs	rmi_bus_space_read_region_1,
243198956Srrs	rmi_bus_space_read_region_2,
244198956Srrs	rmi_bus_space_read_region_4,
245198956Srrs	NULL,
246198956Srrs
247198956Srrs	/* write (single) */
248198956Srrs	rmi_bus_space_write_1,
249198956Srrs	rmi_bus_space_write_2,
250198956Srrs	rmi_bus_space_write_4,
251198956Srrs	NULL,
252198956Srrs
253198956Srrs	/* write multiple */
254198956Srrs	rmi_bus_space_write_multi_1,
255198956Srrs	rmi_bus_space_write_multi_2,
256198956Srrs	rmi_bus_space_write_multi_4,
257198956Srrs	NULL,
258198956Srrs
259198956Srrs	/* write region */
260198956Srrs	NULL,
261198956Srrs	rmi_bus_space_write_region_2,
262198956Srrs	rmi_bus_space_write_region_4,
263198956Srrs	NULL,
264198956Srrs
265198956Srrs	/* set multiple */
266198956Srrs	NULL,
267198956Srrs	NULL,
268198956Srrs	NULL,
269198956Srrs	NULL,
270198956Srrs
271198956Srrs	/* set region */
272198956Srrs	NULL,
273198956Srrs	rmi_bus_space_set_region_2,
274198956Srrs	rmi_bus_space_set_region_4,
275198956Srrs	NULL,
276198956Srrs
277198956Srrs	/* copy */
278198956Srrs	NULL,
279198956Srrs	rmi_bus_space_copy_region_2,
280198956Srrs	NULL,
281198956Srrs	NULL,
282198956Srrs
283198956Srrs	/* read (single) stream */
284198956Srrs	rmi_bus_space_read_stream_1,
285198956Srrs	rmi_bus_space_read_stream_2,
286198956Srrs	rmi_bus_space_read_stream_4,
287198956Srrs	NULL,
288198956Srrs
289198956Srrs	/* read multiple stream */
290198956Srrs	rmi_bus_space_read_multi_stream_1,
291198956Srrs	rmi_bus_space_read_multi_stream_2,
292198956Srrs	rmi_bus_space_read_multi_stream_4,
293198956Srrs	NULL,
294198956Srrs
295198956Srrs	/* read region stream */
296198956Srrs	rmi_bus_space_read_region_1,
297198956Srrs	rmi_bus_space_read_region_2,
298198956Srrs	rmi_bus_space_read_region_4,
299198956Srrs	NULL,
300198956Srrs
301198956Srrs	/* write (single) stream */
302198956Srrs	rmi_bus_space_write_stream_1,
303198956Srrs	rmi_bus_space_write_stream_2,
304198956Srrs	rmi_bus_space_write_stream_4,
305198956Srrs	NULL,
306198956Srrs
307198956Srrs	/* write multiple stream */
308198956Srrs	rmi_bus_space_write_multi_stream_1,
309198956Srrs	rmi_bus_space_write_multi_stream_2,
310198956Srrs	rmi_bus_space_write_multi_stream_4,
311198956Srrs	NULL,
312198956Srrs
313198956Srrs	/* write region stream */
314198956Srrs	NULL,
315198956Srrs	rmi_bus_space_write_region_2,
316198956Srrs	rmi_bus_space_write_region_4,
317198956Srrs	NULL,
318198956Srrs};
319198956Srrs
320198956Srrs/* generic bus_space tag */
321198956Srrsbus_space_tag_t rmi_bus_space = &local_rmi_bus_space;
322198956Srrs
323198956Srrs#define	MIPS_BUS_SPACE_IO	0	/* space is i/o space */
324198956Srrs#define MIPS_BUS_SPACE_MEM	1	/* space is mem space */
325198956Srrs#define MIPS_BUS_SPACE_PCI	10      /* avoid conflict with other spaces */
326198956Srrs
327198956Srrs#define BUS_SPACE_UNRESTRICTED	(~0)
328198956Srrs
329198956Srrs#define SWAP32(x)\
330198956Srrs        (((x) & 0xff000000) >> 24) | \
331198956Srrs        (((x) & 0x000000ff) << 24) | \
332198956Srrs        (((x) & 0x0000ff00) << 8)  | \
333198956Srrs        (((x) & 0x00ff0000) >> 8)
334198956Srrs
335198956Srrs#define SWAP16(x)\
336198956Srrs        (((x) & 0xff00) >> 8) | \
337198956Srrs        (((x) & 0x00ff) << 8)
338198956Srrs
339198956Srrs/*
340198956Srrs * Map a region of device bus space into CPU virtual address space.
341198956Srrs */
342198956Srrs
343198956Srrs
344198956Srrsstatic int
345198956Srrsrmi_bus_space_map(void *t __unused, bus_addr_t addr,
346198956Srrs	      bus_size_t size __unused, int flags __unused,
347198956Srrs	      bus_space_handle_t *bshp)
348198956Srrs{
349198956Srrs
350198956Srrs	*bshp = addr;
351198956Srrs	return (0);
352198956Srrs}
353198956Srrs
354198956Srrs/*
355198956Srrs * Unmap a region of device bus space.
356198956Srrs */
357198956Srrsstatic void
358198956Srrsrmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
359198956Srrs		bus_size_t size __unused)
360198956Srrs{
361198956Srrs}
362198956Srrs
363198956Srrs/*
364198956Srrs * Get a new handle for a subregion of an already-mapped area of bus space.
365198956Srrs */
366198956Srrs
367198956Srrsstatic int
368198956Srrsrmi_bus_space_subregion(void *t __unused, bus_space_handle_t bsh,
369198956Srrs		    bus_size_t offset, bus_size_t size __unused,
370198956Srrs		    bus_space_handle_t *nbshp)
371198956Srrs{
372198956Srrs	*nbshp = bsh + offset;
373198956Srrs	return (0);
374198956Srrs}
375198956Srrs
376198956Srrs/*
377198956Srrs * Read a 1, 2, 4, or 8 byte quantity from bus space
378198956Srrs * described by tag/handle/offset.
379198956Srrs */
380198956Srrs
381198956Srrsstatic u_int8_t
382198956Srrsrmi_bus_space_read_1(void *tag, bus_space_handle_t handle,
383198956Srrs		 bus_size_t offset)
384198956Srrs{
385198956Srrs	if ((int)tag == MIPS_BUS_SPACE_PCI)
386198956Srrs		return (u_int8_t)(*(volatile u_int8_t *)(handle + offset));
387198956Srrs	else
388198956Srrs		return (u_int8_t)(*(volatile u_int32_t *)(handle + offset));
389198956Srrs}
390198956Srrs
391198956Srrsstatic u_int16_t
392198956Srrsrmi_bus_space_read_2(void *tag, bus_space_handle_t handle,
393198956Srrs		 bus_size_t offset)
394198956Srrs{
395198956Srrs	if ((int)tag == MIPS_BUS_SPACE_PCI)
396198956Srrs		return SWAP16((u_int16_t)(*(volatile u_int16_t *)(handle + offset)));
397198956Srrs	else
398198956Srrs		return *(volatile u_int16_t *)(handle + offset);
399198956Srrs}
400198956Srrs
401198956Srrsstatic u_int32_t
402198956Srrsrmi_bus_space_read_4(void *tag, bus_space_handle_t handle,
403198956Srrs		 bus_size_t offset)
404198956Srrs{
405198956Srrs	if ((int)tag == MIPS_BUS_SPACE_PCI)
406198956Srrs		return SWAP32((*(volatile u_int32_t *)(handle + offset)));
407198956Srrs	else
408198956Srrs		return (*(volatile u_int32_t *)(handle + offset));
409198956Srrs}
410198956Srrs
411198956Srrs
412198956Srrs
413198956Srrs/*
414198956Srrs * Read `count' 1, 2, 4, or 8 byte quantities from bus space
415198956Srrs * described by tag/handle/offset and copy into buffer provided.
416198956Srrs */
417198956Srrsstatic void
418198956Srrsrmi_bus_space_read_multi_1(void *tag, bus_space_handle_t handle,
419198956Srrs		       bus_size_t offset, u_int8_t *addr, size_t count)
420198956Srrs{
421198956Srrs
422198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
423198956Srrs		return;
424198956Srrs	while (count--) {
425198956Srrs		*addr = (*(volatile u_int8_t *)(handle + offset));
426198956Srrs		addr++;
427198956Srrs	}
428198956Srrs}
429198956Srrs
430198956Srrsstatic void
431198956Srrsrmi_bus_space_read_multi_2(void *tag, bus_space_handle_t handle,
432198956Srrs		       bus_size_t offset, u_int16_t *addr, size_t count)
433198956Srrs{
434198956Srrs
435198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
436198956Srrs		return;
437198956Srrs	while (count--) {
438198956Srrs		*addr = *(volatile u_int16_t *)(handle + offset);
439198956Srrs		*addr = SWAP16(*addr);
440198956Srrs		addr++;
441198956Srrs	}
442198956Srrs}
443198956Srrs
444198956Srrsstatic void
445198956Srrsrmi_bus_space_read_multi_4(void *tag, bus_space_handle_t handle,
446198956Srrs		       bus_size_t offset, u_int32_t *addr, size_t count)
447198956Srrs{
448198956Srrs
449198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
450198956Srrs		return;
451198956Srrs	while (count--) {
452198956Srrs		*addr = *(volatile u_int32_t *)(handle + offset);
453198956Srrs		*addr = SWAP32(*addr);
454198956Srrs		addr++;
455198956Srrs	}
456198956Srrs}
457198956Srrs
458198956Srrs/*
459198956Srrs * Write the 1, 2, 4, or 8 byte value `value' to bus space
460198956Srrs * described by tag/handle/offset.
461198956Srrs */
462198956Srrs
463198956Srrs
464198956Srrsstatic void
465198956Srrsrmi_bus_space_write_1(void *tag, bus_space_handle_t handle,
466198956Srrs		       bus_size_t offset, u_int8_t value)
467198956Srrs{
468198956Srrs	mips_sync();
469198956Srrs	if ((int)tag == MIPS_BUS_SPACE_PCI)
470198956Srrs		*(volatile u_int8_t *)(handle + offset) = value;
471198956Srrs	else
472198956Srrs	  	*(volatile u_int32_t *)(handle + offset) = (u_int32_t)value;
473198956Srrs}
474198956Srrs
475198956Srrsstatic void
476198956Srrsrmi_bus_space_write_2(void *tag, bus_space_handle_t handle,
477198956Srrs		       bus_size_t offset, u_int16_t value)
478198956Srrs{
479198956Srrs	mips_sync();
480198956Srrs	if ((int)tag == MIPS_BUS_SPACE_PCI) {
481198956Srrs		*(volatile u_int16_t *)(handle + offset) = SWAP16(value);
482198956Srrs	} else
483198956Srrs		*(volatile u_int16_t *)(handle + offset) = value;
484198956Srrs}
485198956Srrs
486198956Srrs
487198956Srrsstatic void
488198956Srrsrmi_bus_space_write_4(void *tag, bus_space_handle_t handle,
489198956Srrs		       bus_size_t offset, u_int32_t value)
490198956Srrs{
491198956Srrs	mips_sync();
492198956Srrs	if ((int)tag == MIPS_BUS_SPACE_PCI) {
493198956Srrs		*(volatile u_int32_t *)(handle + offset) = SWAP32(value);
494198956Srrs	} else
495198956Srrs		*(volatile u_int32_t *)(handle + offset) = value;
496198956Srrs}
497198956Srrs
498198956Srrs
499198956Srrs
500198956Srrs/*
501198956Srrs * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
502198956Srrs * provided to bus space described by tag/handle/offset.
503198956Srrs */
504198956Srrs
505198956Srrs
506198956Srrsstatic void
507198956Srrsrmi_bus_space_write_multi_1(void *tag, bus_space_handle_t handle,
508198956Srrs			bus_size_t offset, const u_int8_t *addr, size_t count)
509198956Srrs{
510198956Srrs	mips_sync();
511198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
512198956Srrs		return;
513198956Srrs	while (count--) {
514198956Srrs		(*(volatile u_int8_t *)(handle + offset)) = *addr;
515198956Srrs		addr++;
516198956Srrs	}
517198956Srrs}
518198956Srrs
519198956Srrsstatic void
520198956Srrsrmi_bus_space_write_multi_2(void *tag, bus_space_handle_t handle,
521198956Srrs			bus_size_t offset, const u_int16_t *addr, size_t count)
522198956Srrs{
523198956Srrs	mips_sync();
524198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
525198956Srrs		return;
526198956Srrs	while (count--) {
527198956Srrs		(*(volatile u_int16_t *)(handle + offset)) = SWAP16(*addr);
528198956Srrs		addr++;
529198956Srrs	}
530198956Srrs}
531198956Srrs
532198956Srrsstatic void
533198956Srrsrmi_bus_space_write_multi_4(void *tag, bus_space_handle_t handle,
534198956Srrs			bus_size_t offset, const u_int32_t *addr, size_t count)
535198956Srrs{
536198956Srrs	mips_sync();
537198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
538198956Srrs		return;
539198956Srrs	while (count--) {
540198956Srrs		(*(volatile u_int32_t *)(handle + offset)) = SWAP32(*addr);
541198956Srrs		addr++;
542198956Srrs	}
543198956Srrs}
544198956Srrs
545198956Srrs/*
546198956Srrs * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
547198956Srrs * by tag/handle starting at `offset'.
548198956Srrs */
549198956Srrs
550198956Srrsstatic void
551198956Srrsrmi_bus_space_set_region_2(void *t, bus_space_handle_t bsh,
552198956Srrs		       bus_size_t offset, u_int16_t value, size_t count)
553198956Srrs{
554198956Srrs	bus_addr_t addr = bsh + offset;
555198956Srrs
556198956Srrs	for (; count != 0; count--, addr += 2)
557198956Srrs		(*(volatile u_int16_t *)(addr)) = value;
558198956Srrs}
559198956Srrs
560198956Srrsstatic void
561198956Srrsrmi_bus_space_set_region_4(void *t, bus_space_handle_t bsh,
562198956Srrs		       bus_size_t offset, u_int32_t value, size_t count)
563198956Srrs{
564198956Srrs	bus_addr_t addr = bsh + offset;
565198956Srrs
566198956Srrs	for (; count != 0; count--, addr += 4)
567198956Srrs		(*(volatile u_int32_t *)(addr)) = value;
568198956Srrs}
569198956Srrs
570198956Srrs
571198956Srrs/*
572198956Srrs * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
573198956Srrs * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
574198956Srrs */
575198956Srrsstatic void
576198956Srrsrmi_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1,
577198956Srrs			bus_size_t off1, bus_space_handle_t bsh2,
578198956Srrs			bus_size_t off2, size_t count)
579198956Srrs{
580198956Srrs	printf("bus_space_copy_region_2 - unimplemented\n");
581198956Srrs}
582198956Srrs
583198956Srrs/*
584198956Srrs * Read `count' 1, 2, 4, or 8 byte quantities from bus space
585198956Srrs * described by tag/handle/offset and copy into buffer provided.
586198956Srrs */
587198956Srrs
588198956Srrsu_int8_t
589198956Srrsrmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
590198956Srrs    bus_size_t offset)
591198956Srrs{
592198956Srrs
593198956Srrs	return *((volatile u_int8_t *)(handle + offset));
594198956Srrs}
595198956Srrs
596198956Srrs
597198956Srrsstatic u_int16_t
598198956Srrsrmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
599198956Srrs		 bus_size_t offset)
600198956Srrs{
601198956Srrs		return *(volatile u_int16_t *)(handle + offset);
602198956Srrs}
603198956Srrs
604198956Srrs
605198956Srrsstatic u_int32_t
606198956Srrsrmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
607198956Srrs		 bus_size_t offset)
608198956Srrs{
609198956Srrs		return (*(volatile u_int32_t *)(handle + offset));
610198956Srrs}
611198956Srrs
612198956Srrs
613198956Srrsstatic void
614198956Srrsrmi_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle,
615198956Srrs		       bus_size_t offset, u_int8_t *addr, size_t count)
616198956Srrs{
617198956Srrs
618198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
619198956Srrs		return;
620198956Srrs	while (count--) {
621198956Srrs		*addr = (*(volatile u_int8_t *)(handle + offset));
622198956Srrs		addr++;
623198956Srrs	}
624198956Srrs}
625198956Srrs
626198956Srrsstatic void
627198956Srrsrmi_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle,
628198956Srrs		       bus_size_t offset, u_int16_t *addr, size_t count)
629198956Srrs{
630198956Srrs
631198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
632198956Srrs		return;
633198956Srrs	while (count--) {
634198956Srrs		*addr = (*(volatile u_int16_t *)(handle + offset));
635198956Srrs		addr++;
636198956Srrs	}
637198956Srrs}
638198956Srrs
639198956Srrsstatic void
640198956Srrsrmi_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle,
641198956Srrs		       bus_size_t offset, u_int32_t *addr, size_t count)
642198956Srrs{
643198956Srrs
644198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
645198956Srrs		return;
646198956Srrs	while (count--) {
647198956Srrs		*addr = (*(volatile u_int32_t *)(handle + offset));
648198956Srrs		addr++;
649198956Srrs	}
650198956Srrs}
651198956Srrs
652198956Srrs
653198956Srrs
654198956Srrs/*
655198956Srrs * Read `count' 1, 2, 4, or 8 byte quantities from bus space
656198956Srrs * described by tag/handle and starting at `offset' and copy into
657198956Srrs * buffer provided.
658198956Srrs */
659198956Srrsvoid
660198956Srrsrmi_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
661198956Srrs    bus_size_t offset, u_int8_t *addr, size_t count)
662198956Srrs{
663198956Srrs	bus_addr_t baddr = bsh + offset;
664198956Srrs
665198956Srrs	while (count--) {
666198956Srrs		*addr++ = (*(volatile u_int8_t *)(baddr));
667198956Srrs		baddr += 1;
668198956Srrs	}
669198956Srrs}
670198956Srrs
671198956Srrsvoid
672198956Srrsrmi_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
673198956Srrs    bus_size_t offset, u_int16_t *addr, size_t count)
674198956Srrs{
675198956Srrs	bus_addr_t baddr = bsh + offset;
676198956Srrs
677198956Srrs	while (count--) {
678198956Srrs		*addr++ = (*(volatile u_int16_t *)(baddr));
679198956Srrs		baddr += 2;
680198956Srrs	}
681198956Srrs}
682198956Srrs
683198956Srrsvoid
684198956Srrsrmi_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
685198956Srrs    bus_size_t offset, u_int32_t *addr, size_t count)
686198956Srrs{
687198956Srrs	bus_addr_t baddr = bsh + offset;
688198956Srrs
689198956Srrs	while (count--) {
690198956Srrs		*addr++ = (*(volatile u_int32_t *)(baddr));
691198956Srrs		baddr += 4;
692198956Srrs	}
693198956Srrs}
694198956Srrs
695198956Srrs
696198956Srrsvoid
697198956Srrsrmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
698198956Srrs    bus_size_t offset, u_int8_t value)
699198956Srrs{
700198956Srrs	mips_sync();
701198956Srrs	*(volatile u_int8_t *)(handle + offset) = value;
702198956Srrs}
703198956Srrs
704198956Srrs
705198956Srrsstatic void
706198956Srrsrmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
707198956Srrs		       bus_size_t offset, u_int16_t value)
708198956Srrs{
709198956Srrs	mips_sync();
710198956Srrs	*(volatile u_int16_t *)(handle + offset) = value;
711198956Srrs}
712198956Srrs
713198956Srrs
714198956Srrsstatic void
715198956Srrsrmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
716198956Srrs		       bus_size_t offset, u_int32_t value)
717198956Srrs{
718198956Srrs	mips_sync();
719198956Srrs	*(volatile u_int32_t *)(handle + offset) = value;
720198956Srrs}
721198956Srrs
722198956Srrs
723198956Srrsstatic void
724198956Srrsrmi_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle,
725198956Srrs			bus_size_t offset, const u_int8_t *addr, size_t count)
726198956Srrs{
727198956Srrs	mips_sync();
728198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
729198956Srrs		return;
730198956Srrs	while (count--) {
731198956Srrs		(*(volatile u_int8_t *)(handle + offset)) = *addr;
732198956Srrs		addr++;
733198956Srrs	}
734198956Srrs}
735198956Srrs
736198956Srrsstatic void
737198956Srrsrmi_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle,
738198956Srrs			bus_size_t offset, const u_int16_t *addr, size_t count)
739198956Srrs{
740198956Srrs	mips_sync();
741198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
742198956Srrs		return;
743198956Srrs	while (count--) {
744198956Srrs		(*(volatile u_int16_t *)(handle + offset)) = *addr;
745198956Srrs		addr++;
746198956Srrs	}
747198956Srrs}
748198956Srrs
749198956Srrsstatic void
750198956Srrsrmi_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle,
751198956Srrs			bus_size_t offset, const u_int32_t *addr, size_t count)
752198956Srrs{
753198956Srrs	mips_sync();
754198956Srrs	if ((int)tag != MIPS_BUS_SPACE_PCI)
755198956Srrs		return;
756198956Srrs	while (count--) {
757198956Srrs		(*(volatile u_int32_t *)(handle + offset)) = *addr;
758198956Srrs		addr++;
759198956Srrs	}
760198956Srrs}
761198956Srrs
762198956Srrsvoid
763198956Srrsrmi_bus_space_write_region_2(void *t,
764198956Srrs							 bus_space_handle_t bsh,
765198956Srrs							 bus_size_t offset,
766198956Srrs							 const u_int16_t *addr,
767198956Srrs							 size_t count)
768198956Srrs{
769198956Srrs	bus_addr_t baddr = (bus_addr_t)bsh + offset;
770198956Srrs	while (count--) {
771198956Srrs		(*(volatile u_int16_t *)(baddr)) = *addr;
772198956Srrs		addr++;
773198956Srrs		baddr += 2;
774198956Srrs	}
775198956Srrs}
776198956Srrs
777198956Srrsvoid
778198956Srrsrmi_bus_space_write_region_4(void *t, bus_space_handle_t bsh,
779198956Srrs    bus_size_t offset, const u_int32_t *addr, size_t count)
780198956Srrs{
781198956Srrs	bus_addr_t baddr = bsh + offset;
782198956Srrs
783198956Srrs	while (count--) {
784198956Srrs		(*(volatile u_int32_t *)(baddr)) = *addr;
785198956Srrs		addr++;
786198956Srrs		baddr += 4;
787198956Srrs	}
788198956Srrs}
789198956Srrs
790198956Srrsstatic void
791198956Srrsrmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
792198956Srrs		  bus_size_t offset __unused, bus_size_t len __unused, int flags)
793198956Srrs{
794198956Srrs
795198956Srrs}
796