bus_space_rmi_pci.c revision 225394
197403Sobrien/*-
297403Sobrien * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
3169691Skan * reserved.
497403Sobrien *
597403Sobrien * Redistribution and use in source and binary forms, with or without
697403Sobrien * modification, are permitted provided that the following conditions are
797403Sobrien * met:
897403Sobrien *
997403Sobrien * 1. Redistributions of source code must retain the above copyright
1097403Sobrien *    notice, this list of conditions and the following disclaimer.
1197403Sobrien * 2. Redistributions in binary form must reproduce the above copyright
1297403Sobrien *    notice, this list of conditions and the following disclaimer in
1397403Sobrien *    the documentation and/or other materials provided with the
1497403Sobrien *    distribution.
1597403Sobrien *
1697403Sobrien * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
1797403Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1897403Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19169691Skan * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
2097403Sobrien * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2197403Sobrien * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2297403Sobrien * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2397403Sobrien * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2497403Sobrien * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2597403Sobrien * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2697403Sobrien * THE POSSIBILITY OF SUCH DAMAGE.
2797403Sobrien *
2897403Sobrien * NETLOGIC_BSD */
2997403Sobrien
3097403Sobrien#include <sys/cdefs.h>
3197403Sobrien__FBSDID("$FreeBSD: head/sys/mips/nlm/bus_space_rmi_pci.c 225394 2011-09-05 10:45:29Z jchandra $");
32169691Skan
3397403Sobrien#include <sys/param.h>
3497403Sobrien#include <sys/systm.h>
35169691Skan#include <sys/bus.h>
36169691Skan#include <sys/kernel.h>
37132720Skan#include <sys/endian.h>
38132720Skan#include <sys/malloc.h>
3997403Sobrien#include <sys/ktr.h>
4097403Sobrien
4197403Sobrien#include <vm/vm.h>
4297403Sobrien#include <vm/pmap.h>
4397403Sobrien#include <vm/vm_kern.h>
4497403Sobrien#include <vm/vm_extern.h>
4597403Sobrien
4697403Sobrien#include <machine/bus.h>
4797403Sobrien#include <machine/cache.h>
48132720Skan
4997403Sobrienstatic int
50169691Skanrmi_pci_bus_space_map(void *t, bus_addr_t addr,
51169691Skan    bus_size_t size, int flags,
52117397Skan    bus_space_handle_t * bshp);
53117397Skan
5497403Sobrienstatic void
55117397Skanrmi_pci_bus_space_unmap(void *t, bus_space_handle_t bsh,
56117397Skan    bus_size_t size);
5797403Sobrien
58117397Skanstatic int
59117397Skanrmi_pci_bus_space_subregion(void *t,
6097403Sobrien    bus_space_handle_t bsh,
61117397Skan    bus_size_t offset, bus_size_t size,
6297403Sobrien    bus_space_handle_t * nbshp);
6397403Sobrien
64117397Skanstatic u_int8_t
65117397Skanrmi_pci_bus_space_read_1(void *t,
6697403Sobrien    bus_space_handle_t handle,
67117397Skan    bus_size_t offset);
68117397Skan
6997403Sobrienstatic u_int16_t
70117397Skanrmi_pci_bus_space_read_2(void *t,
71117397Skan    bus_space_handle_t handle,
7297403Sobrien    bus_size_t offset);
73117397Skan
74117397Skanstatic u_int32_t
7597403Sobrienrmi_pci_bus_space_read_4(void *t,
76117397Skan    bus_space_handle_t handle,
77117397Skan    bus_size_t offset);
78117397Skan
79117397Skanstatic void
80117397Skanrmi_pci_bus_space_read_multi_1(void *t,
8197403Sobrien    bus_space_handle_t handle,
82117397Skan    bus_size_t offset, u_int8_t * addr,
83117397Skan    size_t count);
84117397Skan
85117397Skanstatic void
86117397Skanrmi_pci_bus_space_read_multi_2(void *t,
87117397Skan    bus_space_handle_t handle,
88117397Skan    bus_size_t offset, u_int16_t * addr,
8997403Sobrien    size_t count);
90169691Skan
9197403Sobrienstatic void
9297403Sobrienrmi_pci_bus_space_read_multi_4(void *t,
93132720Skan    bus_space_handle_t handle,
9497403Sobrien    bus_size_t offset, u_int32_t * addr,
95169691Skan    size_t count);
96169691Skan
97132720Skanstatic void
98132720Skanrmi_pci_bus_space_read_region_1(void *t,
99132720Skan    bus_space_handle_t bsh,
100132720Skan    bus_size_t offset, u_int8_t * addr,
101132720Skan    size_t count);
102132720Skan
103132720Skanstatic void
104132720Skanrmi_pci_bus_space_read_region_2(void *t,
105132720Skan    bus_space_handle_t bsh,
106132720Skan    bus_size_t offset, u_int16_t * addr,
107132720Skan    size_t count);
108117397Skan
109117397Skanstatic void
110117397Skanrmi_pci_bus_space_read_region_4(void *t,
111117397Skan    bus_space_handle_t bsh,
112117397Skan    bus_size_t offset, u_int32_t * addr,
113117397Skan    size_t count);
114117397Skan
115117397Skanstatic void
116117397Skanrmi_pci_bus_space_write_1(void *t,
117117397Skan    bus_space_handle_t handle,
11897403Sobrien    bus_size_t offset, u_int8_t value);
119117397Skan
120117397Skanstatic void
121132720Skanrmi_pci_bus_space_write_2(void *t,
12297403Sobrien    bus_space_handle_t handle,
123132720Skan    bus_size_t offset, u_int16_t value);
124132720Skan
12597403Sobrienstatic void
126132720Skanrmi_pci_bus_space_write_4(void *t,
127132720Skan    bus_space_handle_t handle,
12897403Sobrien    bus_size_t offset, u_int32_t value);
129132720Skan
130132720Skanstatic void
13197403Sobrienrmi_pci_bus_space_write_multi_1(void *t,
132132720Skan    bus_space_handle_t handle,
133132720Skan    bus_size_t offset,
13497403Sobrien    const u_int8_t * addr,
135132720Skan    size_t count);
136132720Skan
13797403Sobrienstatic void
138132720Skanrmi_pci_bus_space_write_multi_2(void *t,
139132720Skan    bus_space_handle_t handle,
14097403Sobrien    bus_size_t offset,
141132720Skan    const u_int16_t * addr,
142132720Skan    size_t count);
14397403Sobrien
144132720Skanstatic void
145132720Skanrmi_pci_bus_space_write_multi_4(void *t,
14697403Sobrien    bus_space_handle_t handle,
147132720Skan    bus_size_t offset,
14897403Sobrien    const u_int32_t * addr,
149169691Skan    size_t count);
150169691Skan
151117397Skanstatic void
15297403Sobrienrmi_pci_bus_space_write_region_2(void *t,
15397403Sobrien    bus_space_handle_t bsh,
154132720Skan    bus_size_t offset,
155132720Skan    const u_int16_t * addr,
156132720Skan    size_t count);
157132720Skan
158169691Skanstatic void
159132720Skanrmi_pci_bus_space_write_region_4(void *t,
160132720Skan    bus_space_handle_t bsh,
161132720Skan    bus_size_t offset,
16297403Sobrien    const u_int32_t * addr,
163132720Skan    size_t count);
164132720Skan
165132720Skan
166132720Skanstatic void
167132720Skanrmi_pci_bus_space_set_region_2(void *t,
168132720Skan    bus_space_handle_t bsh,
169132720Skan    bus_size_t offset, u_int16_t value,
170132720Skan    size_t count);
17197403Sobrienstatic void
172132720Skanrmi_pci_bus_space_set_region_4(void *t,
173132720Skan    bus_space_handle_t bsh,
174132720Skan    bus_size_t offset, u_int32_t value,
175132720Skan    size_t count);
176132720Skan
177169691Skanstatic void
178132720Skanrmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
179132720Skan    bus_size_t offset __unused, bus_size_t len __unused, int flags);
180132720Skan
18197403Sobrienstatic void
182132720Skanrmi_pci_bus_space_copy_region_2(void *t,
183132720Skan    bus_space_handle_t bsh1,
184132720Skan    bus_size_t off1,
185132720Skan    bus_space_handle_t bsh2,
186132720Skan    bus_size_t off2, size_t count);
187169691Skan
188132720Skanu_int8_t
189132720Skanrmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
190132720Skan    bus_size_t offset);
19197403Sobrien
192132720Skanstatic u_int16_t
193132720Skanrmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
194132720Skan    bus_size_t offset);
195132720Skan
196132720Skanstatic u_int32_t
197169691Skanrmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
198132720Skan    bus_size_t offset);
199132720Skanstatic void
200132720Skanrmi_pci_bus_space_read_multi_stream_1(void *t,
20197403Sobrien    bus_space_handle_t handle,
202132720Skan    bus_size_t offset, u_int8_t * addr,
203132720Skan    size_t count);
204132720Skan
205132720Skanstatic void
206132720Skanrmi_pci_bus_space_read_multi_stream_2(void *t,
207169691Skan    bus_space_handle_t handle,
208132720Skan    bus_size_t offset, u_int16_t * addr,
209132720Skan    size_t count);
210132720Skan
21197403Sobrienstatic void
21297403Sobrienrmi_pci_bus_space_read_multi_stream_4(void *t,
21397403Sobrien    bus_space_handle_t handle,
214169691Skan    bus_size_t offset, u_int32_t * addr,
21597403Sobrien    size_t count);
21697403Sobrien
217132720Skanvoid
218132720Skanrmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
219132720Skan    bus_size_t offset, u_int8_t value);
220132720Skanstatic void
221132720Skanrmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
222132720Skan    bus_size_t offset, u_int16_t value);
223132720Skan
224132720Skanstatic void
225132720Skanrmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
226132720Skan    bus_size_t offset, u_int32_t value);
227132720Skan
228132720Skanstatic void
22997403Sobrienrmi_pci_bus_space_write_multi_stream_1(void *t,
230132720Skan    bus_space_handle_t handle,
231132720Skan    bus_size_t offset,
232132720Skan    const u_int8_t * addr,
233132720Skan    size_t count);
234169691Skanstatic void
235169691Skanrmi_pci_bus_space_write_multi_stream_2(void *t,
236132720Skan    bus_space_handle_t handle,
237132720Skan    bus_size_t offset,
238132720Skan    const u_int16_t * addr,
239132720Skan    size_t count);
240169691Skan
241132720Skanstatic void
242132720Skanrmi_pci_bus_space_write_multi_stream_4(void *t,
243132720Skan    bus_space_handle_t handle,
244132720Skan    bus_size_t offset,
245132720Skan    const u_int32_t * addr,
246169691Skan    size_t count);
247169691Skan
248132720Skan#define TODO() printf("XLR memory bus space function '%s' unimplemented\n", __func__)
249132720Skan
250132720Skanstatic struct bus_space local_rmi_pci_bus_space = {
251132720Skan	/* cookie */
25297403Sobrien	(void *)0,
253132720Skan
254132720Skan	/* mapping/unmapping */
255132720Skan	rmi_pci_bus_space_map,
256132720Skan	rmi_pci_bus_space_unmap,
257132720Skan	rmi_pci_bus_space_subregion,
258132720Skan
259132720Skan	/* allocation/deallocation */
260132720Skan	NULL,
261132720Skan	NULL,
262132720Skan
263169691Skan	/* barrier */
264132720Skan	rmi_pci_bus_space_barrier,
265132720Skan
266132720Skan	/* read (single) */
267132720Skan	rmi_pci_bus_space_read_1,
268132720Skan	rmi_pci_bus_space_read_2,
269169691Skan	rmi_pci_bus_space_read_4,
270169691Skan	NULL,
271132720Skan
272132720Skan	/* read multiple */
273132720Skan	rmi_pci_bus_space_read_multi_1,
274132720Skan	rmi_pci_bus_space_read_multi_2,
27597403Sobrien	rmi_pci_bus_space_read_multi_4,
276132720Skan	NULL,
277132720Skan
278132720Skan	/* read region */
279132720Skan	rmi_pci_bus_space_read_region_1,
280132720Skan	rmi_pci_bus_space_read_region_2,
281132720Skan	rmi_pci_bus_space_read_region_4,
282132720Skan	NULL,
283132720Skan
284132720Skan	/* write (single) */
285132720Skan	rmi_pci_bus_space_write_1,
286132720Skan	rmi_pci_bus_space_write_2,
287132720Skan	rmi_pci_bus_space_write_4,
288132720Skan	NULL,
289169691Skan
290132720Skan	/* write multiple */
291132720Skan	rmi_pci_bus_space_write_multi_1,
292132720Skan	rmi_pci_bus_space_write_multi_2,
293132720Skan	rmi_pci_bus_space_write_multi_4,
294132720Skan	NULL,
295132720Skan
296132720Skan	/* write region */
297132720Skan	NULL,
298132720Skan	rmi_pci_bus_space_write_region_2,
299132720Skan	rmi_pci_bus_space_write_region_4,
300132720Skan	NULL,
301132720Skan
302132720Skan	/* set multiple */
30397403Sobrien	NULL,
304132720Skan	NULL,
305132720Skan	NULL,
306132720Skan	NULL,
307132720Skan
308132720Skan	/* set region */
309132720Skan	NULL,
310132720Skan	rmi_pci_bus_space_set_region_2,
311132720Skan	rmi_pci_bus_space_set_region_4,
312132720Skan	NULL,
313132720Skan
314132720Skan	/* copy */
315132720Skan	NULL,
31697403Sobrien	rmi_pci_bus_space_copy_region_2,
317117397Skan	NULL,
318132720Skan	NULL,
319132720Skan
320132720Skan	/* read (single) stream */
321132720Skan	rmi_pci_bus_space_read_stream_1,
322132720Skan	rmi_pci_bus_space_read_stream_2,
323132720Skan	rmi_pci_bus_space_read_stream_4,
324132720Skan	NULL,
325132720Skan
326132720Skan	/* read multiple stream */
327132720Skan	rmi_pci_bus_space_read_multi_stream_1,
328132720Skan	rmi_pci_bus_space_read_multi_stream_2,
329132720Skan	rmi_pci_bus_space_read_multi_stream_4,
330132720Skan	NULL,
33197403Sobrien
33297403Sobrien	/* read region stream */
33397403Sobrien	rmi_pci_bus_space_read_region_1,
334132720Skan	rmi_pci_bus_space_read_region_2,
335117397Skan	rmi_pci_bus_space_read_region_4,
336132720Skan	NULL,
337132720Skan
338117397Skan	/* write (single) stream */
339132720Skan	rmi_pci_bus_space_write_stream_1,
340132720Skan	rmi_pci_bus_space_write_stream_2,
341117397Skan	rmi_pci_bus_space_write_stream_4,
342132720Skan	NULL,
343132720Skan
344117397Skan	/* write multiple stream */
345117397Skan	rmi_pci_bus_space_write_multi_stream_1,
34697403Sobrien	rmi_pci_bus_space_write_multi_stream_2,
347132720Skan	rmi_pci_bus_space_write_multi_stream_4,
348117397Skan	NULL,
349132720Skan
350132720Skan	/* write region stream */
351117397Skan	NULL,
352132720Skan	rmi_pci_bus_space_write_region_2,
353132720Skan	rmi_pci_bus_space_write_region_4,
354117397Skan	NULL,
355132720Skan};
356132720Skan
357117397Skan/* generic bus_space tag */
358132720Skanbus_space_tag_t rmi_pci_bus_space = &local_rmi_pci_bus_space;
359132720Skan
360117397Skan/*
361132720Skan * Map a region of device bus space into CPU virtual address space.
362132720Skan */
363117397Skanstatic int
364132720Skanrmi_pci_bus_space_map(void *t __unused, bus_addr_t addr,
365132720Skan    bus_size_t size __unused, int flags __unused,
366117397Skan    bus_space_handle_t * bshp)
367132720Skan{
368132720Skan	*bshp = addr;
369117397Skan	return (0);
370132720Skan}
371132720Skan
37297403Sobrien/*
373132720Skan * Unmap a region of device bus space.
374132720Skan */
37597403Sobrienstatic void
376132720Skanrmi_pci_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
377132720Skan    bus_size_t size __unused)
378117397Skan{
379132720Skan}
380132720Skan
381117397Skan/*
382132720Skan * Get a new handle for a subregion of an already-mapped area of bus space.
383132720Skan */
384117397Skan
385132720Skanstatic int
386132720Skanrmi_pci_bus_space_subregion(void *t __unused, bus_space_handle_t bsh,
387117397Skan    bus_size_t offset, bus_size_t size __unused,
388132720Skan    bus_space_handle_t * nbshp)
389132720Skan{
390117397Skan	*nbshp = bsh + offset;
391132720Skan	return (0);
392132720Skan}
393117397Skan
394132720Skan/*
395132720Skan * Read a 1, 2, 4, or 8 byte quantity from bus space
396117397Skan * described by tag/handle/offset.
397132720Skan */
398132720Skan
399117397Skanstatic u_int8_t
400132720Skanrmi_pci_bus_space_read_1(void *tag, bus_space_handle_t handle,
401132720Skan    bus_size_t offset)
40297403Sobrien{
403132720Skan	return (u_int8_t) (*(volatile u_int8_t *)(handle + offset));
404132720Skan}
40597403Sobrien
40697403Sobrienstatic u_int16_t
40797403Sobrienrmi_pci_bus_space_read_2(void *tag, bus_space_handle_t handle,
408169691Skan    bus_size_t offset)
40997403Sobrien{
410169691Skan	u_int16_t value;
41197403Sobrien
412169691Skan	value = *(volatile u_int16_t *)(handle + offset);
41397403Sobrien	return bswap16(value);
414169691Skan}
41597403Sobrien
416169691Skanstatic u_int32_t
41797403Sobrienrmi_pci_bus_space_read_4(void *tag, bus_space_handle_t handle,
418169691Skan    bus_size_t offset)
41997403Sobrien{
420169691Skan	uint32_t value;
42197403Sobrien
422169691Skan	value = *(volatile u_int32_t *)(handle + offset);
42397403Sobrien	return bswap32(value);
424169691Skan}
42597403Sobrien
426169691Skan/*
42797403Sobrien * Read `count' 1, 2, 4, or 8 byte quantities from bus space
42897403Sobrien * described by tag/handle/offset and copy into buffer provided.
429132720Skan */
43097403Sobrienstatic void
431132720Skanrmi_pci_bus_space_read_multi_1(void *tag, bus_space_handle_t handle,
432132720Skan    bus_size_t offset, u_int8_t * addr, size_t count)
433132720Skan{
434132720Skan	while (count--) {
435132720Skan		*addr = *(volatile u_int8_t *)(handle + offset);
436132720Skan		addr++;
437132720Skan	}
438132720Skan}
439132720Skan
440132720Skanstatic void
44197403Sobrienrmi_pci_bus_space_read_multi_2(void *tag, bus_space_handle_t handle,
442132720Skan    bus_size_t offset, u_int16_t * addr, size_t count)
443132720Skan{
44497403Sobrien
44597403Sobrien	while (count--) {
446132720Skan		*addr = *(volatile u_int16_t *)(handle + offset);
447132720Skan		*addr = bswap16(*addr);
448132720Skan		addr++;
449132720Skan	}
450132720Skan}
451169691Skan
452169691Skanstatic void
453132720Skanrmi_pci_bus_space_read_multi_4(void *tag, bus_space_handle_t handle,
454132720Skan    bus_size_t offset, u_int32_t * addr, size_t count)
455132720Skan{
456132720Skan
457132720Skan	while (count--) {
458132720Skan		*addr = *(volatile u_int32_t *)(handle + offset);
459132720Skan		*addr = bswap32(*addr);
460132720Skan		addr++;
46197403Sobrien	}
462132720Skan}
463132720Skan
464132720Skan/*
465132720Skan * Write the 1, 2, 4, or 8 byte value `value' to bus space
466132720Skan * described by tag/handle/offset.
467132720Skan */
468169691Skan
469132720Skanstatic void
470132720Skanrmi_pci_bus_space_write_1(void *tag, bus_space_handle_t handle,
471132720Skan    bus_size_t offset, u_int8_t value)
472132720Skan{
473132720Skan	mips_sync();
474132720Skan	*(volatile u_int8_t *)(handle + offset) = value;
475132720Skan}
476132720Skan
477132720Skanstatic void
47897403Sobrienrmi_pci_bus_space_write_2(void *tag, bus_space_handle_t handle,
479132720Skan    bus_size_t offset, u_int16_t value)
480132720Skan{
481132720Skan	mips_sync();
482132720Skan	*(volatile u_int16_t *)(handle + offset) = bswap16(value);
483132720Skan}
484132720Skan
485169691Skan
486132720Skanstatic void
487132720Skanrmi_pci_bus_space_write_4(void *tag, bus_space_handle_t handle,
488132720Skan    bus_size_t offset, u_int32_t value)
489132720Skan{
490169691Skan	mips_sync();
491132720Skan	*(volatile u_int32_t *)(handle + offset) = bswap32(value);
492132720Skan}
493132720Skan
494132720Skan/*
495132720Skan * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
496132720Skan * provided to bus space described by tag/handle/offset.
497169691Skan */
498132720Skan
499132720Skan
500132720Skanstatic void
501132720Skanrmi_pci_bus_space_write_multi_1(void *tag, bus_space_handle_t handle,
502169691Skan    bus_size_t offset, const u_int8_t * addr, size_t count)
503132720Skan{
504132720Skan	mips_sync();
505132720Skan	while (count--) {
506132720Skan		(*(volatile u_int8_t *)(handle + offset)) = *addr;
507169691Skan		addr++;
508132720Skan	}
509132720Skan}
510132720Skan
511132720Skanstatic void
512132720Skanrmi_pci_bus_space_write_multi_2(void *tag, bus_space_handle_t handle,
51397403Sobrien    bus_size_t offset, const u_int16_t * addr, size_t count)
51497403Sobrien{
515117397Skan	mips_sync();
51697403Sobrien	while (count--) {
51797403Sobrien		(*(volatile u_int16_t *)(handle + offset)) = bswap16(*addr);
518117397Skan		addr++;
51997403Sobrien	}
520117397Skan}
52197403Sobrien
52297403Sobrienstatic void
523117397Skanrmi_pci_bus_space_write_multi_4(void *tag, bus_space_handle_t handle,
524117397Skan    bus_size_t offset, const u_int32_t * addr, size_t count)
525132720Skan{
526132720Skan	mips_sync();
527169691Skan	while (count--) {
528132720Skan		(*(volatile u_int32_t *)(handle + offset)) = bswap32(*addr);
52997403Sobrien		addr++;
53097403Sobrien	}
531117397Skan}
532117397Skan
533132720Skan/*
534132720Skan * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
535169691Skan * by tag/handle starting at `offset'.
536132720Skan */
53797403Sobrien
538169691Skanstatic void
539132720Skanrmi_pci_bus_space_set_region_2(void *t, bus_space_handle_t bsh,
540132720Skan    bus_size_t offset, u_int16_t value, size_t count)
54197403Sobrien{
54297403Sobrien	bus_addr_t addr = bsh + offset;
54397403Sobrien
54497403Sobrien	for (; count != 0; count--, addr += 2)
54597403Sobrien		(*(volatile u_int16_t *)(addr)) = value;
54697403Sobrien}
547169691Skan
548169691Skanstatic void
54997403Sobrienrmi_pci_bus_space_set_region_4(void *t, bus_space_handle_t bsh,
550117397Skan    bus_size_t offset, u_int32_t value, size_t count)
551117397Skan{
55297403Sobrien	bus_addr_t addr = bsh + offset;
55397403Sobrien
554117397Skan	for (; count != 0; count--, addr += 4)
555117397Skan		(*(volatile u_int32_t *)(addr)) = value;
556169691Skan}
557132720Skan
55897403Sobrien
55997403Sobrien/*
560117397Skan * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
561117397Skan * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
562169691Skan */
563132720Skanstatic void
56497403Sobrienrmi_pci_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1,
56597403Sobrien    bus_size_t off1, bus_space_handle_t bsh2,
566117397Skan    bus_size_t off2, size_t count)
567117397Skan{
568169691Skan	TODO();
569132720Skan}
570132720Skan
571132720Skan/*
572132720Skan * Read `count' 1, 2, 4, or 8 byte quantities from bus space
57397403Sobrien * described by tag/handle/offset and copy into buffer provided.
57497403Sobrien */
575117397Skan
576117397Skanu_int8_t
577169691Skanrmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
578169691Skan    bus_size_t offset)
579169691Skan{
58097403Sobrien
58197403Sobrien	return *((volatile u_int8_t *)(handle + offset));
582117397Skan}
583117397Skan
584169691Skan
585117397Skanstatic u_int16_t
586169691Skanrmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
587117397Skan    bus_size_t offset)
588117397Skan{
58997403Sobrien	return *(volatile u_int16_t *)(handle + offset);
59097403Sobrien}
591117397Skan
592117397Skan
593169691Skanstatic u_int32_t
594169691Skanrmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
595117397Skan    bus_size_t offset)
596169691Skan{
597117397Skan	return (*(volatile u_int32_t *)(handle + offset));
598117397Skan}
599117397Skan
60097403Sobrien
60197403Sobrienstatic void
602117397Skanrmi_pci_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle,
603117397Skan    bus_size_t offset, u_int8_t * addr, size_t count)
604169691Skan{
605117397Skan	while (count--) {
606169691Skan		*addr = (*(volatile u_int8_t *)(handle + offset));
607117397Skan		addr++;
608117397Skan	}
60997403Sobrien}
61097403Sobrien
611117397Skanstatic void
612117397Skanrmi_pci_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle,
613169691Skan    bus_size_t offset, u_int16_t * addr, size_t count)
614117397Skan{
615169691Skan	while (count--) {
616117397Skan		*addr = (*(volatile u_int16_t *)(handle + offset));
617117397Skan		addr++;
61897403Sobrien	}
61997403Sobrien}
620117397Skan
621117397Skanstatic void
622169691Skanrmi_pci_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle,
623169691Skan    bus_size_t offset, u_int32_t * addr, size_t count)
62497403Sobrien{
62597403Sobrien	while (count--) {
626117397Skan		*addr = (*(volatile u_int32_t *)(handle + offset));
627117397Skan		addr++;
628117397Skan	}
629132720Skan}
630132720Skan
631117397Skan
63297403Sobrien
63397403Sobrien/*
634117397Skan * Read `count' 1, 2, 4, or 8 byte quantities from bus space
635117397Skan * described by tag/handle and starting at `offset' and copy into
636117397Skan * buffer provided.
637132720Skan */
638132720Skanvoid
63997403Sobrienrmi_pci_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
640117397Skan    bus_size_t offset, u_int8_t * addr, size_t count)
64197403Sobrien{
64297403Sobrien	bus_addr_t baddr = bsh + offset;
643117397Skan
644117397Skan	while (count--) {
645117397Skan		*addr++ = (*(volatile u_int8_t *)(baddr));
646132720Skan		baddr += 1;
64797403Sobrien	}
648117397Skan}
64997403Sobrien
65097403Sobrienvoid
651117397Skanrmi_pci_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
652117397Skan    bus_size_t offset, u_int16_t * addr, size_t count)
653117397Skan{
654132720Skan	bus_addr_t baddr = bsh + offset;
655132720Skan
656132720Skan	while (count--) {
65797403Sobrien		*addr++ = (*(volatile u_int16_t *)(baddr));
658117397Skan		baddr += 2;
65997403Sobrien	}
66097403Sobrien}
661117397Skan
662117397Skanvoid
663117397Skanrmi_pci_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
664132720Skan    bus_size_t offset, u_int32_t * addr, size_t count)
665132720Skan{
666132720Skan	bus_addr_t baddr = bsh + offset;
66797403Sobrien
668117397Skan	while (count--) {
66997403Sobrien		*addr++ = (*(volatile u_int32_t *)(baddr));
67097403Sobrien		baddr += 4;
671117397Skan	}
672117397Skan}
673117397Skan
674132720Skan
675132720Skanvoid
676132720Skanrmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
67797403Sobrien    bus_size_t offset, u_int8_t value)
678117397Skan{
67997403Sobrien	mips_sync();
68097403Sobrien	*(volatile u_int8_t *)(handle + offset) = value;
681117397Skan}
682117397Skan
683117397Skanstatic void
684132720Skanrmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
685132720Skan    bus_size_t offset, u_int16_t value)
686132720Skan{
68797403Sobrien	mips_sync();
688117397Skan	*(volatile u_int16_t *)(handle + offset) = value;
68997403Sobrien}
69097403Sobrien
691117397Skan
692117397Skanstatic void
693117397Skanrmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
694132720Skan    bus_size_t offset, u_int32_t value)
695132720Skan{
696132720Skan	mips_sync();
697117397Skan	*(volatile u_int32_t *)(handle + offset) = value;
69897403Sobrien}
69997403Sobrien
700117397Skan
701117397Skanstatic void
702117397Skanrmi_pci_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle,
70397403Sobrien    bus_size_t offset, const u_int8_t * addr, size_t count)
704117397Skan{
705117397Skan	mips_sync();
70697403Sobrien	while (count--) {
70797403Sobrien		(*(volatile u_int8_t *)(handle + offset)) = *addr;
708117397Skan		addr++;
709117397Skan	}
710169691Skan}
71197403Sobrien
71297403Sobrienstatic void
713117397Skanrmi_pci_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle,
714117397Skan    bus_size_t offset, const u_int16_t * addr, size_t count)
715117397Skan{
71697403Sobrien	mips_sync();
71797403Sobrien	while (count--) {
718117397Skan		(*(volatile u_int16_t *)(handle + offset)) = *addr;
719117397Skan		addr++;
72097403Sobrien	}
72197403Sobrien}
722117397Skan
723117397Skanstatic void
724117397Skanrmi_pci_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle,
72597403Sobrien    bus_size_t offset, const u_int32_t * addr, size_t count)
726117397Skan{
727117397Skan	mips_sync();
72897403Sobrien	while (count--) {
72997403Sobrien		(*(volatile u_int32_t *)(handle + offset)) = *addr;
730117397Skan		addr++;
731117397Skan	}
732117397Skan}
733117397Skan
734117397Skanvoid
73597403Sobrienrmi_pci_bus_space_write_region_2(void *t,
736117397Skan    bus_space_handle_t bsh,
737117397Skan    bus_size_t offset,
738117397Skan    const u_int16_t * addr,
739117397Skan    size_t count)
74097403Sobrien{
74197403Sobrien	bus_addr_t baddr = (bus_addr_t) bsh + offset;
742117397Skan
743117397Skan	while (count--) {
744117397Skan		(*(volatile u_int16_t *)(baddr)) = *addr;
745117397Skan		addr++;
746117397Skan		baddr += 2;
74797403Sobrien	}
748117397Skan}
749117397Skan
750117397Skanvoid
75197403Sobrienrmi_pci_bus_space_write_region_4(void *t, bus_space_handle_t bsh,
75297403Sobrien    bus_size_t offset, const u_int32_t * addr, size_t count)
753117397Skan{
754117397Skan	bus_addr_t baddr = bsh + offset;
755117397Skan
75697403Sobrien	while (count--) {
757117397Skan		(*(volatile u_int32_t *)(baddr)) = *addr;
758117397Skan		addr++;
75997403Sobrien		baddr += 4;
76097403Sobrien	}
761117397Skan}
762117397Skan
763117397Skanstatic void
764117397Skanrmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
765117397Skan    bus_size_t offset __unused, bus_size_t len __unused, int flags)
766117397Skan{
76797403Sobrien
76897403Sobrien}
769117397Skan