1225394Sjchandra/*-
2225394Sjchandra * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
3225394Sjchandra * reserved.
4225394Sjchandra *
5225394Sjchandra * Redistribution and use in source and binary forms, with or without
6225394Sjchandra * modification, are permitted provided that the following conditions are
7225394Sjchandra * met:
8225394Sjchandra *
9225394Sjchandra * 1. Redistributions of source code must retain the above copyright
10225394Sjchandra *    notice, this list of conditions and the following disclaimer.
11225394Sjchandra * 2. Redistributions in binary form must reproduce the above copyright
12225394Sjchandra *    notice, this list of conditions and the following disclaimer in
13225394Sjchandra *    the documentation and/or other materials provided with the
14225394Sjchandra *    distribution.
15225394Sjchandra *
16225394Sjchandra * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
17225394Sjchandra * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18225394Sjchandra * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19225394Sjchandra * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
20225394Sjchandra * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21225394Sjchandra * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22225394Sjchandra * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23225394Sjchandra * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24225394Sjchandra * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25225394Sjchandra * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26225394Sjchandra * THE POSSIBILITY OF SUCH DAMAGE.
27225394Sjchandra *
28225394Sjchandra * NETLOGIC_BSD */
29225394Sjchandra
30225394Sjchandra#include <sys/cdefs.h>
31225394Sjchandra__FBSDID("$FreeBSD$");
32225394Sjchandra
33225394Sjchandra#include <sys/param.h>
34225394Sjchandra#include <sys/systm.h>
35225394Sjchandra#include <sys/bus.h>
36225394Sjchandra#include <sys/kernel.h>
37225394Sjchandra#include <sys/endian.h>
38225394Sjchandra#include <sys/malloc.h>
39225394Sjchandra#include <sys/ktr.h>
40225394Sjchandra
41225394Sjchandra#include <vm/vm.h>
42225394Sjchandra#include <vm/pmap.h>
43225394Sjchandra#include <vm/vm_kern.h>
44225394Sjchandra#include <vm/vm_extern.h>
45225394Sjchandra
46225394Sjchandra#include <machine/bus.h>
47225394Sjchandra#include <machine/cache.h>
48225394Sjchandra
49225394Sjchandrastatic int
50225394Sjchandrarmi_pci_bus_space_map(void *t, bus_addr_t addr,
51225394Sjchandra    bus_size_t size, int flags,
52225394Sjchandra    bus_space_handle_t * bshp);
53225394Sjchandra
54225394Sjchandrastatic void
55225394Sjchandrarmi_pci_bus_space_unmap(void *t, bus_space_handle_t bsh,
56225394Sjchandra    bus_size_t size);
57225394Sjchandra
58225394Sjchandrastatic int
59225394Sjchandrarmi_pci_bus_space_subregion(void *t,
60225394Sjchandra    bus_space_handle_t bsh,
61225394Sjchandra    bus_size_t offset, bus_size_t size,
62225394Sjchandra    bus_space_handle_t * nbshp);
63225394Sjchandra
64225394Sjchandrastatic u_int8_t
65225394Sjchandrarmi_pci_bus_space_read_1(void *t,
66225394Sjchandra    bus_space_handle_t handle,
67225394Sjchandra    bus_size_t offset);
68225394Sjchandra
69225394Sjchandrastatic u_int16_t
70225394Sjchandrarmi_pci_bus_space_read_2(void *t,
71225394Sjchandra    bus_space_handle_t handle,
72225394Sjchandra    bus_size_t offset);
73225394Sjchandra
74225394Sjchandrastatic u_int32_t
75225394Sjchandrarmi_pci_bus_space_read_4(void *t,
76225394Sjchandra    bus_space_handle_t handle,
77225394Sjchandra    bus_size_t offset);
78225394Sjchandra
79225394Sjchandrastatic void
80225394Sjchandrarmi_pci_bus_space_read_multi_1(void *t,
81225394Sjchandra    bus_space_handle_t handle,
82225394Sjchandra    bus_size_t offset, u_int8_t * addr,
83225394Sjchandra    size_t count);
84225394Sjchandra
85225394Sjchandrastatic void
86225394Sjchandrarmi_pci_bus_space_read_multi_2(void *t,
87225394Sjchandra    bus_space_handle_t handle,
88225394Sjchandra    bus_size_t offset, u_int16_t * addr,
89225394Sjchandra    size_t count);
90225394Sjchandra
91225394Sjchandrastatic void
92225394Sjchandrarmi_pci_bus_space_read_multi_4(void *t,
93225394Sjchandra    bus_space_handle_t handle,
94225394Sjchandra    bus_size_t offset, u_int32_t * addr,
95225394Sjchandra    size_t count);
96225394Sjchandra
97225394Sjchandrastatic void
98225394Sjchandrarmi_pci_bus_space_read_region_1(void *t,
99225394Sjchandra    bus_space_handle_t bsh,
100225394Sjchandra    bus_size_t offset, u_int8_t * addr,
101225394Sjchandra    size_t count);
102225394Sjchandra
103225394Sjchandrastatic void
104225394Sjchandrarmi_pci_bus_space_read_region_2(void *t,
105225394Sjchandra    bus_space_handle_t bsh,
106225394Sjchandra    bus_size_t offset, u_int16_t * addr,
107225394Sjchandra    size_t count);
108225394Sjchandra
109225394Sjchandrastatic void
110225394Sjchandrarmi_pci_bus_space_read_region_4(void *t,
111225394Sjchandra    bus_space_handle_t bsh,
112225394Sjchandra    bus_size_t offset, u_int32_t * addr,
113225394Sjchandra    size_t count);
114225394Sjchandra
115225394Sjchandrastatic void
116225394Sjchandrarmi_pci_bus_space_write_1(void *t,
117225394Sjchandra    bus_space_handle_t handle,
118225394Sjchandra    bus_size_t offset, u_int8_t value);
119225394Sjchandra
120225394Sjchandrastatic void
121225394Sjchandrarmi_pci_bus_space_write_2(void *t,
122225394Sjchandra    bus_space_handle_t handle,
123225394Sjchandra    bus_size_t offset, u_int16_t value);
124225394Sjchandra
125225394Sjchandrastatic void
126225394Sjchandrarmi_pci_bus_space_write_4(void *t,
127225394Sjchandra    bus_space_handle_t handle,
128225394Sjchandra    bus_size_t offset, u_int32_t value);
129225394Sjchandra
130225394Sjchandrastatic void
131225394Sjchandrarmi_pci_bus_space_write_multi_1(void *t,
132225394Sjchandra    bus_space_handle_t handle,
133225394Sjchandra    bus_size_t offset,
134225394Sjchandra    const u_int8_t * addr,
135225394Sjchandra    size_t count);
136225394Sjchandra
137225394Sjchandrastatic void
138225394Sjchandrarmi_pci_bus_space_write_multi_2(void *t,
139225394Sjchandra    bus_space_handle_t handle,
140225394Sjchandra    bus_size_t offset,
141225394Sjchandra    const u_int16_t * addr,
142225394Sjchandra    size_t count);
143225394Sjchandra
144225394Sjchandrastatic void
145225394Sjchandrarmi_pci_bus_space_write_multi_4(void *t,
146225394Sjchandra    bus_space_handle_t handle,
147225394Sjchandra    bus_size_t offset,
148225394Sjchandra    const u_int32_t * addr,
149225394Sjchandra    size_t count);
150225394Sjchandra
151225394Sjchandrastatic void
152225394Sjchandrarmi_pci_bus_space_write_region_2(void *t,
153225394Sjchandra    bus_space_handle_t bsh,
154225394Sjchandra    bus_size_t offset,
155225394Sjchandra    const u_int16_t * addr,
156225394Sjchandra    size_t count);
157225394Sjchandra
158225394Sjchandrastatic void
159225394Sjchandrarmi_pci_bus_space_write_region_4(void *t,
160225394Sjchandra    bus_space_handle_t bsh,
161225394Sjchandra    bus_size_t offset,
162225394Sjchandra    const u_int32_t * addr,
163225394Sjchandra    size_t count);
164225394Sjchandra
165225394Sjchandra
166225394Sjchandrastatic void
167225394Sjchandrarmi_pci_bus_space_set_region_2(void *t,
168225394Sjchandra    bus_space_handle_t bsh,
169225394Sjchandra    bus_size_t offset, u_int16_t value,
170225394Sjchandra    size_t count);
171225394Sjchandrastatic void
172225394Sjchandrarmi_pci_bus_space_set_region_4(void *t,
173225394Sjchandra    bus_space_handle_t bsh,
174225394Sjchandra    bus_size_t offset, u_int32_t value,
175225394Sjchandra    size_t count);
176225394Sjchandra
177225394Sjchandrastatic void
178225394Sjchandrarmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
179225394Sjchandra    bus_size_t offset __unused, bus_size_t len __unused, int flags);
180225394Sjchandra
181225394Sjchandrastatic void
182225394Sjchandrarmi_pci_bus_space_copy_region_2(void *t,
183225394Sjchandra    bus_space_handle_t bsh1,
184225394Sjchandra    bus_size_t off1,
185225394Sjchandra    bus_space_handle_t bsh2,
186225394Sjchandra    bus_size_t off2, size_t count);
187225394Sjchandra
188225394Sjchandrau_int8_t
189225394Sjchandrarmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
190225394Sjchandra    bus_size_t offset);
191225394Sjchandra
192225394Sjchandrastatic u_int16_t
193225394Sjchandrarmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
194225394Sjchandra    bus_size_t offset);
195225394Sjchandra
196225394Sjchandrastatic u_int32_t
197225394Sjchandrarmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
198225394Sjchandra    bus_size_t offset);
199225394Sjchandrastatic void
200225394Sjchandrarmi_pci_bus_space_read_multi_stream_1(void *t,
201225394Sjchandra    bus_space_handle_t handle,
202225394Sjchandra    bus_size_t offset, u_int8_t * addr,
203225394Sjchandra    size_t count);
204225394Sjchandra
205225394Sjchandrastatic void
206225394Sjchandrarmi_pci_bus_space_read_multi_stream_2(void *t,
207225394Sjchandra    bus_space_handle_t handle,
208225394Sjchandra    bus_size_t offset, u_int16_t * addr,
209225394Sjchandra    size_t count);
210225394Sjchandra
211225394Sjchandrastatic void
212225394Sjchandrarmi_pci_bus_space_read_multi_stream_4(void *t,
213225394Sjchandra    bus_space_handle_t handle,
214225394Sjchandra    bus_size_t offset, u_int32_t * addr,
215225394Sjchandra    size_t count);
216225394Sjchandra
217225394Sjchandravoid
218225394Sjchandrarmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
219225394Sjchandra    bus_size_t offset, u_int8_t value);
220225394Sjchandrastatic void
221225394Sjchandrarmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
222225394Sjchandra    bus_size_t offset, u_int16_t value);
223225394Sjchandra
224225394Sjchandrastatic void
225225394Sjchandrarmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
226225394Sjchandra    bus_size_t offset, u_int32_t value);
227225394Sjchandra
228225394Sjchandrastatic void
229225394Sjchandrarmi_pci_bus_space_write_multi_stream_1(void *t,
230225394Sjchandra    bus_space_handle_t handle,
231225394Sjchandra    bus_size_t offset,
232225394Sjchandra    const u_int8_t * addr,
233225394Sjchandra    size_t count);
234225394Sjchandrastatic void
235225394Sjchandrarmi_pci_bus_space_write_multi_stream_2(void *t,
236225394Sjchandra    bus_space_handle_t handle,
237225394Sjchandra    bus_size_t offset,
238225394Sjchandra    const u_int16_t * addr,
239225394Sjchandra    size_t count);
240225394Sjchandra
241225394Sjchandrastatic void
242225394Sjchandrarmi_pci_bus_space_write_multi_stream_4(void *t,
243225394Sjchandra    bus_space_handle_t handle,
244225394Sjchandra    bus_size_t offset,
245225394Sjchandra    const u_int32_t * addr,
246225394Sjchandra    size_t count);
247225394Sjchandra
248225394Sjchandra#define TODO() printf("XLR memory bus space function '%s' unimplemented\n", __func__)
249225394Sjchandra
250225394Sjchandrastatic struct bus_space local_rmi_pci_bus_space = {
251225394Sjchandra	/* cookie */
252225394Sjchandra	(void *)0,
253225394Sjchandra
254225394Sjchandra	/* mapping/unmapping */
255225394Sjchandra	rmi_pci_bus_space_map,
256225394Sjchandra	rmi_pci_bus_space_unmap,
257225394Sjchandra	rmi_pci_bus_space_subregion,
258225394Sjchandra
259225394Sjchandra	/* allocation/deallocation */
260225394Sjchandra	NULL,
261225394Sjchandra	NULL,
262225394Sjchandra
263225394Sjchandra	/* barrier */
264225394Sjchandra	rmi_pci_bus_space_barrier,
265225394Sjchandra
266225394Sjchandra	/* read (single) */
267225394Sjchandra	rmi_pci_bus_space_read_1,
268225394Sjchandra	rmi_pci_bus_space_read_2,
269225394Sjchandra	rmi_pci_bus_space_read_4,
270225394Sjchandra	NULL,
271225394Sjchandra
272225394Sjchandra	/* read multiple */
273225394Sjchandra	rmi_pci_bus_space_read_multi_1,
274225394Sjchandra	rmi_pci_bus_space_read_multi_2,
275225394Sjchandra	rmi_pci_bus_space_read_multi_4,
276225394Sjchandra	NULL,
277225394Sjchandra
278225394Sjchandra	/* read region */
279225394Sjchandra	rmi_pci_bus_space_read_region_1,
280225394Sjchandra	rmi_pci_bus_space_read_region_2,
281225394Sjchandra	rmi_pci_bus_space_read_region_4,
282225394Sjchandra	NULL,
283225394Sjchandra
284225394Sjchandra	/* write (single) */
285225394Sjchandra	rmi_pci_bus_space_write_1,
286225394Sjchandra	rmi_pci_bus_space_write_2,
287225394Sjchandra	rmi_pci_bus_space_write_4,
288225394Sjchandra	NULL,
289225394Sjchandra
290225394Sjchandra	/* write multiple */
291225394Sjchandra	rmi_pci_bus_space_write_multi_1,
292225394Sjchandra	rmi_pci_bus_space_write_multi_2,
293225394Sjchandra	rmi_pci_bus_space_write_multi_4,
294225394Sjchandra	NULL,
295225394Sjchandra
296225394Sjchandra	/* write region */
297225394Sjchandra	NULL,
298225394Sjchandra	rmi_pci_bus_space_write_region_2,
299225394Sjchandra	rmi_pci_bus_space_write_region_4,
300225394Sjchandra	NULL,
301225394Sjchandra
302225394Sjchandra	/* set multiple */
303225394Sjchandra	NULL,
304225394Sjchandra	NULL,
305225394Sjchandra	NULL,
306225394Sjchandra	NULL,
307225394Sjchandra
308225394Sjchandra	/* set region */
309225394Sjchandra	NULL,
310225394Sjchandra	rmi_pci_bus_space_set_region_2,
311225394Sjchandra	rmi_pci_bus_space_set_region_4,
312225394Sjchandra	NULL,
313225394Sjchandra
314225394Sjchandra	/* copy */
315225394Sjchandra	NULL,
316225394Sjchandra	rmi_pci_bus_space_copy_region_2,
317225394Sjchandra	NULL,
318225394Sjchandra	NULL,
319225394Sjchandra
320225394Sjchandra	/* read (single) stream */
321225394Sjchandra	rmi_pci_bus_space_read_stream_1,
322225394Sjchandra	rmi_pci_bus_space_read_stream_2,
323225394Sjchandra	rmi_pci_bus_space_read_stream_4,
324225394Sjchandra	NULL,
325225394Sjchandra
326225394Sjchandra	/* read multiple stream */
327225394Sjchandra	rmi_pci_bus_space_read_multi_stream_1,
328225394Sjchandra	rmi_pci_bus_space_read_multi_stream_2,
329225394Sjchandra	rmi_pci_bus_space_read_multi_stream_4,
330225394Sjchandra	NULL,
331225394Sjchandra
332225394Sjchandra	/* read region stream */
333225394Sjchandra	rmi_pci_bus_space_read_region_1,
334225394Sjchandra	rmi_pci_bus_space_read_region_2,
335225394Sjchandra	rmi_pci_bus_space_read_region_4,
336225394Sjchandra	NULL,
337225394Sjchandra
338225394Sjchandra	/* write (single) stream */
339225394Sjchandra	rmi_pci_bus_space_write_stream_1,
340225394Sjchandra	rmi_pci_bus_space_write_stream_2,
341225394Sjchandra	rmi_pci_bus_space_write_stream_4,
342225394Sjchandra	NULL,
343225394Sjchandra
344225394Sjchandra	/* write multiple stream */
345225394Sjchandra	rmi_pci_bus_space_write_multi_stream_1,
346225394Sjchandra	rmi_pci_bus_space_write_multi_stream_2,
347225394Sjchandra	rmi_pci_bus_space_write_multi_stream_4,
348225394Sjchandra	NULL,
349225394Sjchandra
350225394Sjchandra	/* write region stream */
351225394Sjchandra	NULL,
352225394Sjchandra	rmi_pci_bus_space_write_region_2,
353225394Sjchandra	rmi_pci_bus_space_write_region_4,
354225394Sjchandra	NULL,
355225394Sjchandra};
356225394Sjchandra
357225394Sjchandra/* generic bus_space tag */
358225394Sjchandrabus_space_tag_t rmi_pci_bus_space = &local_rmi_pci_bus_space;
359225394Sjchandra
360225394Sjchandra/*
361225394Sjchandra * Map a region of device bus space into CPU virtual address space.
362225394Sjchandra */
363225394Sjchandrastatic int
364225394Sjchandrarmi_pci_bus_space_map(void *t __unused, bus_addr_t addr,
365225394Sjchandra    bus_size_t size __unused, int flags __unused,
366225394Sjchandra    bus_space_handle_t * bshp)
367225394Sjchandra{
368225394Sjchandra	*bshp = addr;
369225394Sjchandra	return (0);
370225394Sjchandra}
371225394Sjchandra
372225394Sjchandra/*
373225394Sjchandra * Unmap a region of device bus space.
374225394Sjchandra */
375225394Sjchandrastatic void
376225394Sjchandrarmi_pci_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
377225394Sjchandra    bus_size_t size __unused)
378225394Sjchandra{
379225394Sjchandra}
380225394Sjchandra
381225394Sjchandra/*
382225394Sjchandra * Get a new handle for a subregion of an already-mapped area of bus space.
383225394Sjchandra */
384225394Sjchandra
385225394Sjchandrastatic int
386225394Sjchandrarmi_pci_bus_space_subregion(void *t __unused, bus_space_handle_t bsh,
387225394Sjchandra    bus_size_t offset, bus_size_t size __unused,
388225394Sjchandra    bus_space_handle_t * nbshp)
389225394Sjchandra{
390225394Sjchandra	*nbshp = bsh + offset;
391225394Sjchandra	return (0);
392225394Sjchandra}
393225394Sjchandra
394225394Sjchandra/*
395225394Sjchandra * Read a 1, 2, 4, or 8 byte quantity from bus space
396225394Sjchandra * described by tag/handle/offset.
397225394Sjchandra */
398225394Sjchandra
399225394Sjchandrastatic u_int8_t
400225394Sjchandrarmi_pci_bus_space_read_1(void *tag, bus_space_handle_t handle,
401225394Sjchandra    bus_size_t offset)
402225394Sjchandra{
403225394Sjchandra	return (u_int8_t) (*(volatile u_int8_t *)(handle + offset));
404225394Sjchandra}
405225394Sjchandra
406225394Sjchandrastatic u_int16_t
407225394Sjchandrarmi_pci_bus_space_read_2(void *tag, bus_space_handle_t handle,
408225394Sjchandra    bus_size_t offset)
409225394Sjchandra{
410225394Sjchandra	u_int16_t value;
411225394Sjchandra
412225394Sjchandra	value = *(volatile u_int16_t *)(handle + offset);
413225394Sjchandra	return bswap16(value);
414225394Sjchandra}
415225394Sjchandra
416225394Sjchandrastatic u_int32_t
417225394Sjchandrarmi_pci_bus_space_read_4(void *tag, bus_space_handle_t handle,
418225394Sjchandra    bus_size_t offset)
419225394Sjchandra{
420225394Sjchandra	uint32_t value;
421225394Sjchandra
422225394Sjchandra	value = *(volatile u_int32_t *)(handle + offset);
423225394Sjchandra	return bswap32(value);
424225394Sjchandra}
425225394Sjchandra
426225394Sjchandra/*
427225394Sjchandra * Read `count' 1, 2, 4, or 8 byte quantities from bus space
428225394Sjchandra * described by tag/handle/offset and copy into buffer provided.
429225394Sjchandra */
430225394Sjchandrastatic void
431225394Sjchandrarmi_pci_bus_space_read_multi_1(void *tag, bus_space_handle_t handle,
432225394Sjchandra    bus_size_t offset, u_int8_t * addr, size_t count)
433225394Sjchandra{
434225394Sjchandra	while (count--) {
435225394Sjchandra		*addr = *(volatile u_int8_t *)(handle + offset);
436225394Sjchandra		addr++;
437225394Sjchandra	}
438225394Sjchandra}
439225394Sjchandra
440225394Sjchandrastatic void
441225394Sjchandrarmi_pci_bus_space_read_multi_2(void *tag, bus_space_handle_t handle,
442225394Sjchandra    bus_size_t offset, u_int16_t * addr, size_t count)
443225394Sjchandra{
444225394Sjchandra
445225394Sjchandra	while (count--) {
446225394Sjchandra		*addr = *(volatile u_int16_t *)(handle + offset);
447225394Sjchandra		*addr = bswap16(*addr);
448225394Sjchandra		addr++;
449225394Sjchandra	}
450225394Sjchandra}
451225394Sjchandra
452225394Sjchandrastatic void
453225394Sjchandrarmi_pci_bus_space_read_multi_4(void *tag, bus_space_handle_t handle,
454225394Sjchandra    bus_size_t offset, u_int32_t * addr, size_t count)
455225394Sjchandra{
456225394Sjchandra
457225394Sjchandra	while (count--) {
458225394Sjchandra		*addr = *(volatile u_int32_t *)(handle + offset);
459225394Sjchandra		*addr = bswap32(*addr);
460225394Sjchandra		addr++;
461225394Sjchandra	}
462225394Sjchandra}
463225394Sjchandra
464225394Sjchandra/*
465225394Sjchandra * Write the 1, 2, 4, or 8 byte value `value' to bus space
466225394Sjchandra * described by tag/handle/offset.
467225394Sjchandra */
468225394Sjchandra
469225394Sjchandrastatic void
470225394Sjchandrarmi_pci_bus_space_write_1(void *tag, bus_space_handle_t handle,
471225394Sjchandra    bus_size_t offset, u_int8_t value)
472225394Sjchandra{
473225394Sjchandra	mips_sync();
474225394Sjchandra	*(volatile u_int8_t *)(handle + offset) = value;
475225394Sjchandra}
476225394Sjchandra
477225394Sjchandrastatic void
478225394Sjchandrarmi_pci_bus_space_write_2(void *tag, bus_space_handle_t handle,
479225394Sjchandra    bus_size_t offset, u_int16_t value)
480225394Sjchandra{
481225394Sjchandra	mips_sync();
482225394Sjchandra	*(volatile u_int16_t *)(handle + offset) = bswap16(value);
483225394Sjchandra}
484225394Sjchandra
485225394Sjchandra
486225394Sjchandrastatic void
487225394Sjchandrarmi_pci_bus_space_write_4(void *tag, bus_space_handle_t handle,
488225394Sjchandra    bus_size_t offset, u_int32_t value)
489225394Sjchandra{
490225394Sjchandra	mips_sync();
491225394Sjchandra	*(volatile u_int32_t *)(handle + offset) = bswap32(value);
492225394Sjchandra}
493225394Sjchandra
494225394Sjchandra/*
495225394Sjchandra * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
496225394Sjchandra * provided to bus space described by tag/handle/offset.
497225394Sjchandra */
498225394Sjchandra
499225394Sjchandra
500225394Sjchandrastatic void
501225394Sjchandrarmi_pci_bus_space_write_multi_1(void *tag, bus_space_handle_t handle,
502225394Sjchandra    bus_size_t offset, const u_int8_t * addr, size_t count)
503225394Sjchandra{
504225394Sjchandra	mips_sync();
505225394Sjchandra	while (count--) {
506225394Sjchandra		(*(volatile u_int8_t *)(handle + offset)) = *addr;
507225394Sjchandra		addr++;
508225394Sjchandra	}
509225394Sjchandra}
510225394Sjchandra
511225394Sjchandrastatic void
512225394Sjchandrarmi_pci_bus_space_write_multi_2(void *tag, bus_space_handle_t handle,
513225394Sjchandra    bus_size_t offset, const u_int16_t * addr, size_t count)
514225394Sjchandra{
515225394Sjchandra	mips_sync();
516225394Sjchandra	while (count--) {
517225394Sjchandra		(*(volatile u_int16_t *)(handle + offset)) = bswap16(*addr);
518225394Sjchandra		addr++;
519225394Sjchandra	}
520225394Sjchandra}
521225394Sjchandra
522225394Sjchandrastatic void
523225394Sjchandrarmi_pci_bus_space_write_multi_4(void *tag, bus_space_handle_t handle,
524225394Sjchandra    bus_size_t offset, const u_int32_t * addr, size_t count)
525225394Sjchandra{
526225394Sjchandra	mips_sync();
527225394Sjchandra	while (count--) {
528225394Sjchandra		(*(volatile u_int32_t *)(handle + offset)) = bswap32(*addr);
529225394Sjchandra		addr++;
530225394Sjchandra	}
531225394Sjchandra}
532225394Sjchandra
533225394Sjchandra/*
534225394Sjchandra * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
535225394Sjchandra * by tag/handle starting at `offset'.
536225394Sjchandra */
537225394Sjchandra
538225394Sjchandrastatic void
539225394Sjchandrarmi_pci_bus_space_set_region_2(void *t, bus_space_handle_t bsh,
540225394Sjchandra    bus_size_t offset, u_int16_t value, size_t count)
541225394Sjchandra{
542225394Sjchandra	bus_addr_t addr = bsh + offset;
543225394Sjchandra
544225394Sjchandra	for (; count != 0; count--, addr += 2)
545225394Sjchandra		(*(volatile u_int16_t *)(addr)) = value;
546225394Sjchandra}
547225394Sjchandra
548225394Sjchandrastatic void
549225394Sjchandrarmi_pci_bus_space_set_region_4(void *t, bus_space_handle_t bsh,
550225394Sjchandra    bus_size_t offset, u_int32_t value, size_t count)
551225394Sjchandra{
552225394Sjchandra	bus_addr_t addr = bsh + offset;
553225394Sjchandra
554225394Sjchandra	for (; count != 0; count--, addr += 4)
555225394Sjchandra		(*(volatile u_int32_t *)(addr)) = value;
556225394Sjchandra}
557225394Sjchandra
558225394Sjchandra
559225394Sjchandra/*
560225394Sjchandra * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
561225394Sjchandra * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
562225394Sjchandra */
563225394Sjchandrastatic void
564225394Sjchandrarmi_pci_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1,
565225394Sjchandra    bus_size_t off1, bus_space_handle_t bsh2,
566225394Sjchandra    bus_size_t off2, size_t count)
567225394Sjchandra{
568225394Sjchandra	TODO();
569225394Sjchandra}
570225394Sjchandra
571225394Sjchandra/*
572225394Sjchandra * Read `count' 1, 2, 4, or 8 byte quantities from bus space
573225394Sjchandra * described by tag/handle/offset and copy into buffer provided.
574225394Sjchandra */
575225394Sjchandra
576225394Sjchandrau_int8_t
577225394Sjchandrarmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
578225394Sjchandra    bus_size_t offset)
579225394Sjchandra{
580225394Sjchandra
581225394Sjchandra	return *((volatile u_int8_t *)(handle + offset));
582225394Sjchandra}
583225394Sjchandra
584225394Sjchandra
585225394Sjchandrastatic u_int16_t
586225394Sjchandrarmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
587225394Sjchandra    bus_size_t offset)
588225394Sjchandra{
589225394Sjchandra	return *(volatile u_int16_t *)(handle + offset);
590225394Sjchandra}
591225394Sjchandra
592225394Sjchandra
593225394Sjchandrastatic u_int32_t
594225394Sjchandrarmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
595225394Sjchandra    bus_size_t offset)
596225394Sjchandra{
597225394Sjchandra	return (*(volatile u_int32_t *)(handle + offset));
598225394Sjchandra}
599225394Sjchandra
600225394Sjchandra
601225394Sjchandrastatic void
602225394Sjchandrarmi_pci_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle,
603225394Sjchandra    bus_size_t offset, u_int8_t * addr, size_t count)
604225394Sjchandra{
605225394Sjchandra	while (count--) {
606225394Sjchandra		*addr = (*(volatile u_int8_t *)(handle + offset));
607225394Sjchandra		addr++;
608225394Sjchandra	}
609225394Sjchandra}
610225394Sjchandra
611225394Sjchandrastatic void
612225394Sjchandrarmi_pci_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle,
613225394Sjchandra    bus_size_t offset, u_int16_t * addr, size_t count)
614225394Sjchandra{
615225394Sjchandra	while (count--) {
616225394Sjchandra		*addr = (*(volatile u_int16_t *)(handle + offset));
617225394Sjchandra		addr++;
618225394Sjchandra	}
619225394Sjchandra}
620225394Sjchandra
621225394Sjchandrastatic void
622225394Sjchandrarmi_pci_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle,
623225394Sjchandra    bus_size_t offset, u_int32_t * addr, size_t count)
624225394Sjchandra{
625225394Sjchandra	while (count--) {
626225394Sjchandra		*addr = (*(volatile u_int32_t *)(handle + offset));
627225394Sjchandra		addr++;
628225394Sjchandra	}
629225394Sjchandra}
630225394Sjchandra
631225394Sjchandra
632225394Sjchandra
633225394Sjchandra/*
634225394Sjchandra * Read `count' 1, 2, 4, or 8 byte quantities from bus space
635225394Sjchandra * described by tag/handle and starting at `offset' and copy into
636225394Sjchandra * buffer provided.
637225394Sjchandra */
638225394Sjchandravoid
639225394Sjchandrarmi_pci_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
640225394Sjchandra    bus_size_t offset, u_int8_t * addr, size_t count)
641225394Sjchandra{
642225394Sjchandra	bus_addr_t baddr = bsh + offset;
643225394Sjchandra
644225394Sjchandra	while (count--) {
645225394Sjchandra		*addr++ = (*(volatile u_int8_t *)(baddr));
646225394Sjchandra		baddr += 1;
647225394Sjchandra	}
648225394Sjchandra}
649225394Sjchandra
650225394Sjchandravoid
651225394Sjchandrarmi_pci_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
652225394Sjchandra    bus_size_t offset, u_int16_t * addr, size_t count)
653225394Sjchandra{
654225394Sjchandra	bus_addr_t baddr = bsh + offset;
655225394Sjchandra
656225394Sjchandra	while (count--) {
657225394Sjchandra		*addr++ = (*(volatile u_int16_t *)(baddr));
658225394Sjchandra		baddr += 2;
659225394Sjchandra	}
660225394Sjchandra}
661225394Sjchandra
662225394Sjchandravoid
663225394Sjchandrarmi_pci_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
664225394Sjchandra    bus_size_t offset, u_int32_t * addr, size_t count)
665225394Sjchandra{
666225394Sjchandra	bus_addr_t baddr = bsh + offset;
667225394Sjchandra
668225394Sjchandra	while (count--) {
669225394Sjchandra		*addr++ = (*(volatile u_int32_t *)(baddr));
670225394Sjchandra		baddr += 4;
671225394Sjchandra	}
672225394Sjchandra}
673225394Sjchandra
674225394Sjchandra
675225394Sjchandravoid
676225394Sjchandrarmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
677225394Sjchandra    bus_size_t offset, u_int8_t value)
678225394Sjchandra{
679225394Sjchandra	mips_sync();
680225394Sjchandra	*(volatile u_int8_t *)(handle + offset) = value;
681225394Sjchandra}
682225394Sjchandra
683225394Sjchandrastatic void
684225394Sjchandrarmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
685225394Sjchandra    bus_size_t offset, u_int16_t value)
686225394Sjchandra{
687225394Sjchandra	mips_sync();
688225394Sjchandra	*(volatile u_int16_t *)(handle + offset) = value;
689225394Sjchandra}
690225394Sjchandra
691225394Sjchandra
692225394Sjchandrastatic void
693225394Sjchandrarmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
694225394Sjchandra    bus_size_t offset, u_int32_t value)
695225394Sjchandra{
696225394Sjchandra	mips_sync();
697225394Sjchandra	*(volatile u_int32_t *)(handle + offset) = value;
698225394Sjchandra}
699225394Sjchandra
700225394Sjchandra
701225394Sjchandrastatic void
702225394Sjchandrarmi_pci_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle,
703225394Sjchandra    bus_size_t offset, const u_int8_t * addr, size_t count)
704225394Sjchandra{
705225394Sjchandra	mips_sync();
706225394Sjchandra	while (count--) {
707225394Sjchandra		(*(volatile u_int8_t *)(handle + offset)) = *addr;
708225394Sjchandra		addr++;
709225394Sjchandra	}
710225394Sjchandra}
711225394Sjchandra
712225394Sjchandrastatic void
713225394Sjchandrarmi_pci_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle,
714225394Sjchandra    bus_size_t offset, const u_int16_t * addr, size_t count)
715225394Sjchandra{
716225394Sjchandra	mips_sync();
717225394Sjchandra	while (count--) {
718225394Sjchandra		(*(volatile u_int16_t *)(handle + offset)) = *addr;
719225394Sjchandra		addr++;
720225394Sjchandra	}
721225394Sjchandra}
722225394Sjchandra
723225394Sjchandrastatic void
724225394Sjchandrarmi_pci_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle,
725225394Sjchandra    bus_size_t offset, const u_int32_t * addr, size_t count)
726225394Sjchandra{
727225394Sjchandra	mips_sync();
728225394Sjchandra	while (count--) {
729225394Sjchandra		(*(volatile u_int32_t *)(handle + offset)) = *addr;
730225394Sjchandra		addr++;
731225394Sjchandra	}
732225394Sjchandra}
733225394Sjchandra
734225394Sjchandravoid
735225394Sjchandrarmi_pci_bus_space_write_region_2(void *t,
736225394Sjchandra    bus_space_handle_t bsh,
737225394Sjchandra    bus_size_t offset,
738225394Sjchandra    const u_int16_t * addr,
739225394Sjchandra    size_t count)
740225394Sjchandra{
741225394Sjchandra	bus_addr_t baddr = (bus_addr_t) bsh + offset;
742225394Sjchandra
743225394Sjchandra	while (count--) {
744225394Sjchandra		(*(volatile u_int16_t *)(baddr)) = *addr;
745225394Sjchandra		addr++;
746225394Sjchandra		baddr += 2;
747225394Sjchandra	}
748225394Sjchandra}
749225394Sjchandra
750225394Sjchandravoid
751225394Sjchandrarmi_pci_bus_space_write_region_4(void *t, bus_space_handle_t bsh,
752225394Sjchandra    bus_size_t offset, const u_int32_t * addr, size_t count)
753225394Sjchandra{
754225394Sjchandra	bus_addr_t baddr = bsh + offset;
755225394Sjchandra
756225394Sjchandra	while (count--) {
757225394Sjchandra		(*(volatile u_int32_t *)(baddr)) = *addr;
758225394Sjchandra		addr++;
759225394Sjchandra		baddr += 4;
760225394Sjchandra	}
761225394Sjchandra}
762225394Sjchandra
763225394Sjchandrastatic void
764225394Sjchandrarmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
765225394Sjchandra    bus_size_t offset __unused, bus_size_t len __unused, int flags)
766225394Sjchandra{
767225394Sjchandra
768225394Sjchandra}
769