1135669Scognet/*	$NetBSD: i80321_space.c,v 1.6 2003/10/06 15:43:35 thorpej Exp $	*/
2135669Scognet
3139735Simp/*-
4135669Scognet * Copyright (c) 2001, 2002 Wasabi Systems, Inc.
5135669Scognet * All rights reserved.
6135669Scognet *
7135669Scognet * Written by Jason R. Thorpe for Wasabi Systems, Inc.
8135669Scognet *
9135669Scognet * Redistribution and use in source and binary forms, with or without
10135669Scognet * modification, are permitted provided that the following conditions
11135669Scognet * are met:
12135669Scognet * 1. Redistributions of source code must retain the above copyright
13135669Scognet *    notice, this list of conditions and the following disclaimer.
14135669Scognet * 2. Redistributions in binary form must reproduce the above copyright
15135669Scognet *    notice, this list of conditions and the following disclaimer in the
16135669Scognet *    documentation and/or other materials provided with the distribution.
17135669Scognet * 3. All advertising materials mentioning features or use of this software
18135669Scognet *    must display the following acknowledgement:
19135669Scognet *	This product includes software developed for the NetBSD Project by
20135669Scognet *	Wasabi Systems, Inc.
21135669Scognet * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22135669Scognet *    or promote products derived from this software without specific prior
23135669Scognet *    written permission.
24135669Scognet *
25135669Scognet * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26135669Scognet * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27135669Scognet * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28135669Scognet * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
29135669Scognet * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30135669Scognet * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31135669Scognet * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32135669Scognet * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33135669Scognet * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34135669Scognet * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35135669Scognet * POSSIBILITY OF SUCH DAMAGE.
36135669Scognet */
37135669Scognet
38135669Scognet/*
39135669Scognet * bus_space functions for i80321 I/O Processor.
40135669Scognet */
41135669Scognet
42135669Scognet#include <sys/cdefs.h>
43135669Scognet__FBSDID("$FreeBSD$");
44135669Scognet
45135669Scognet#include <sys/param.h>
46135669Scognet#include <sys/systm.h>
47135669Scognet#include <sys/bus.h>
48135669Scognet
49135669Scognet#include <machine/pcb.h>
50135669Scognet
51135669Scognet#include <vm/vm.h>
52135669Scognet#include <vm/vm_kern.h>
53135669Scognet#include <vm/pmap.h>
54135669Scognet#include <vm/vm_page.h>
55135669Scognet#include <vm/vm_extern.h>
56135669Scognet
57135669Scognet#include <machine/bus.h>
58135669Scognet
59135669Scognet#include <arm/xscale/i80321/i80321reg.h>
60135669Scognet#include <arm/xscale/i80321/i80321var.h>
61135669Scognet
62135669Scognet/* Prototypes for all the bus_space structure functions */
63135669Scognetbs_protos(i80321);
64135669Scognetbs_protos(i80321_io);
65135669Scognetbs_protos(i80321_mem);
66135669Scognetbs_protos(generic);
67135669Scognetbs_protos(generic_armv4);
68135669Scognet
69135669Scognet/*
70135669Scognet * Template bus_space -- copied, and the bits that are NULL are
71135669Scognet * filled in.
72135669Scognet */
73135669Scognetconst struct bus_space i80321_bs_tag_template = {
74135669Scognet	/* cookie */
75135669Scognet	(void *) 0,
76135669Scognet
77135669Scognet	/* mapping/unmapping */
78135669Scognet	NULL,
79135669Scognet	NULL,
80135669Scognet	i80321_bs_subregion,
81135669Scognet
82135669Scognet	/* allocation/deallocation */
83135669Scognet	NULL,
84135669Scognet	NULL,
85135669Scognet
86135669Scognet	/* barrier */
87135669Scognet	i80321_bs_barrier,
88135669Scognet
89135669Scognet	/* read (single) */
90135669Scognet	generic_bs_r_1,
91135669Scognet	generic_armv4_bs_r_2,
92135669Scognet	generic_bs_r_4,
93135669Scognet	NULL,
94135669Scognet
95135669Scognet	/* read multiple */
96135669Scognet	generic_bs_rm_1,
97135669Scognet	generic_armv4_bs_rm_2,
98135669Scognet	generic_bs_rm_4,
99135669Scognet	NULL,
100135669Scognet
101135669Scognet	/* read region */
102158746Scognet	generic_bs_rr_1,
103135669Scognet	generic_armv4_bs_rr_2,
104135669Scognet	generic_bs_rr_4,
105135669Scognet	NULL,
106135669Scognet
107135669Scognet	/* write (single) */
108135669Scognet	generic_bs_w_1,
109135669Scognet	generic_armv4_bs_w_2,
110135669Scognet	generic_bs_w_4,
111135669Scognet	NULL,
112135669Scognet
113135669Scognet	/* write multiple */
114135669Scognet	generic_bs_wm_1,
115135669Scognet	generic_armv4_bs_wm_2,
116135669Scognet	generic_bs_wm_4,
117135669Scognet	NULL,
118135669Scognet
119135669Scognet	/* write region */
120135669Scognet	NULL,
121135669Scognet	generic_armv4_bs_wr_2,
122135669Scognet	generic_bs_wr_4,
123135669Scognet	NULL,
124135669Scognet
125135669Scognet	/* set multiple */
126135669Scognet	NULL,
127135669Scognet	NULL,
128135669Scognet	NULL,
129135669Scognet	NULL,
130135669Scognet
131135669Scognet	/* set region */
132135669Scognet	NULL,
133135669Scognet	generic_armv4_bs_sr_2,
134135669Scognet	generic_bs_sr_4,
135135669Scognet	NULL,
136135669Scognet
137135669Scognet	/* copy */
138135669Scognet	NULL,
139135669Scognet	generic_armv4_bs_c_2,
140135669Scognet	NULL,
141135669Scognet	NULL,
142164824Scognet
143164824Scognet	/* read (single) stream */
144164824Scognet	generic_bs_r_1,
145164824Scognet	generic_armv4_bs_r_2,
146164824Scognet	generic_bs_r_4,
147164824Scognet	NULL,
148164824Scognet
149164824Scognet	/* read multiple stream */
150164824Scognet	generic_bs_rm_1,
151164824Scognet	generic_armv4_bs_rm_2,
152164824Scognet	generic_bs_rm_4,
153164824Scognet	NULL,
154164824Scognet
155164824Scognet	/* read region stream */
156164824Scognet	generic_bs_rr_1,
157164824Scognet	generic_armv4_bs_rr_2,
158164824Scognet	generic_bs_rr_4,
159164824Scognet	NULL,
160164824Scognet
161164824Scognet	/* write (single) stream */
162164824Scognet	generic_bs_w_1,
163164824Scognet	generic_armv4_bs_w_2,
164164824Scognet	generic_bs_w_4,
165164824Scognet	NULL,
166164824Scognet
167164824Scognet	/* write multiple stream */
168164824Scognet	generic_bs_wm_1,
169164824Scognet	generic_armv4_bs_wm_2,
170164824Scognet	generic_bs_wm_4,
171164824Scognet	NULL,
172164824Scognet
173164824Scognet	/* write region stream */
174164824Scognet	NULL,
175164824Scognet	generic_armv4_bs_wr_2,
176164824Scognet	generic_bs_wr_4,
177164824Scognet	NULL,
178135669Scognet};
179135669Scognet
180135669Scognetvoid
181135669Scogneti80321_bs_init(bus_space_tag_t bs, void *cookie)
182135669Scognet{
183135669Scognet
184135669Scognet	*bs = i80321_bs_tag_template;
185135669Scognet	bs->bs_cookie = cookie;
186135669Scognet}
187135669Scognet
188135669Scognetvoid
189135669Scogneti80321_io_bs_init(bus_space_tag_t bs, void *cookie)
190135669Scognet{
191135669Scognet
192135669Scognet	*bs = i80321_bs_tag_template;
193135669Scognet	bs->bs_cookie = cookie;
194135669Scognet
195135669Scognet	bs->bs_map = i80321_io_bs_map;
196135669Scognet	bs->bs_unmap = i80321_io_bs_unmap;
197135669Scognet	bs->bs_alloc = i80321_io_bs_alloc;
198135669Scognet	bs->bs_free = i80321_io_bs_free;
199135669Scognet
200135669Scognet}
201135669Scognet
202135669Scognetvoid
203135669Scogneti80321_mem_bs_init(bus_space_tag_t bs, void *cookie)
204135669Scognet{
205135669Scognet
206135669Scognet	*bs = i80321_bs_tag_template;
207135669Scognet	bs->bs_cookie = cookie;
208135669Scognet
209135669Scognet	bs->bs_map = i80321_mem_bs_map;
210135669Scognet	bs->bs_unmap = i80321_mem_bs_unmap;
211135669Scognet	bs->bs_alloc = i80321_mem_bs_alloc;
212135669Scognet	bs->bs_free = i80321_mem_bs_free;
213135669Scognet
214135669Scognet}
215135669Scognet
216135669Scognet/* *** Routines shared by i80321, PCI IO, and PCI MEM. *** */
217135669Scognet
218135669Scognetint
219135669Scogneti80321_bs_subregion(void *t, bus_space_handle_t bsh, bus_size_t offset,
220135669Scognet    bus_size_t size, bus_space_handle_t *nbshp)
221135669Scognet{
222135669Scognet
223135669Scognet	*nbshp = bsh + offset;
224135669Scognet	return (0);
225135669Scognet}
226135669Scognet
227135669Scognetvoid
228135669Scogneti80321_bs_barrier(void *t, bus_space_handle_t bsh, bus_size_t offset,
229135669Scognet    bus_size_t len, int flags)
230135669Scognet{
231135669Scognet
232135669Scognet	/* Nothing to do. */
233135669Scognet}
234135669Scognet
235135669Scognet/* *** Routines for PCI IO. *** */
236135669Scognet
237135669Scognetextern struct i80321_softc *i80321_softc;
238135669Scognetint
239135669Scogneti80321_io_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags,
240135669Scognet    bus_space_handle_t *bshp)
241135669Scognet{
242135669Scognet	struct i80321_softc *sc = i80321_softc;
243135669Scognet	vm_offset_t winvaddr;
244135669Scognet	uint32_t busbase;
245135669Scognet
246135669Scognet	if (bpa >= sc->sc_ioout_xlate &&
247135669Scognet	    bpa < (sc->sc_ioout_xlate + VERDE_OUT_XLATE_IO_WIN_SIZE)) {
248135669Scognet		busbase = sc->sc_ioout_xlate;
249135669Scognet		winvaddr = sc->sc_iow_vaddr;
250135669Scognet	} else
251135669Scognet		return (EINVAL);
252135669Scognet
253135669Scognet	if ((bpa + size) >= (busbase + VERDE_OUT_XLATE_IO_WIN_SIZE))
254135669Scognet		return (EINVAL);
255135669Scognet
256135669Scognet	/*
257135669Scognet	 * Found the window -- PCI I/O space is mapped at a fixed
258135669Scognet	 * virtual address by board-specific code.  Translate the
259135669Scognet	 * bus address to the virtual address.
260135669Scognet	 */
261135669Scognet	*bshp = winvaddr + (bpa - busbase);
262135669Scognet
263135669Scognet	return (0);
264135669Scognet}
265135669Scognet
266135669Scognetvoid
267164440Skevloi80321_io_bs_unmap(void *t, bus_space_handle_t h, bus_size_t size)
268135669Scognet{
269135669Scognet
270135669Scognet	/* Nothing to do. */
271135669Scognet}
272135669Scognet
273135669Scognetint
274135669Scogneti80321_io_bs_alloc(void *t, bus_addr_t rstart, bus_addr_t rend,
275135669Scognet    bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags,
276135669Scognet    bus_addr_t *bpap, bus_space_handle_t *bshp)
277135669Scognet{
278135669Scognet
279135669Scognet	panic("i80321_io_bs_alloc(): not implemented");
280135669Scognet}
281135669Scognet
282236987Simpvoid
283135669Scogneti80321_io_bs_free(void *t, bus_space_handle_t bsh, bus_size_t size)
284135669Scognet{
285135669Scognet
286135669Scognet	panic("i80321_io_bs_free(): not implemented");
287135669Scognet}
288135669Scognet
289135669Scognet
290135669Scognet/* *** Routines for PCI MEM. *** */
291135669Scognetextern int badaddr_read(void *, int, void *);
292135669Scognetint
293135669Scogneti80321_mem_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags,
294135669Scognet    bus_space_handle_t *bshp)
295135669Scognet{
296151524Scognet	vm_paddr_t pa, endpa;
297135669Scognet
298135669Scognet	pa = trunc_page(bpa);
299135669Scognet	endpa = round_page(bpa + size);
300135669Scognet
301135669Scognet	*bshp = (vm_offset_t)pmap_mapdev(pa, endpa - pa);
302236987Simp
303135669Scognet	return (0);
304135669Scognet}
305135669Scognet
306135669Scognetvoid
307164440Skevloi80321_mem_bs_unmap(void *t, bus_space_handle_t h, bus_size_t size)
308135669Scognet{
309135669Scognet	vm_offset_t va, endva;
310135669Scognet
311135669Scognet	va = trunc_page((vm_offset_t)t);
312135669Scognet	endva = va + round_page(size);
313135669Scognet
314135669Scognet	/* Free the kernel virtual mapping. */
315254025Sjeff	kva_free(va, endva - va);
316135669Scognet}
317135669Scognet
318135669Scognetint
319135669Scogneti80321_mem_bs_alloc(void *t, bus_addr_t rstart, bus_addr_t rend,
320135669Scognet    bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags,
321135669Scognet    bus_addr_t *bpap, bus_space_handle_t *bshp)
322135669Scognet{
323135669Scognet
324135669Scognet	panic("i80321_mem_bs_alloc(): not implemented");
325135669Scognet}
326135669Scognet
327236987Simpvoid
328135669Scogneti80321_mem_bs_free(void *t, bus_space_handle_t bsh, bus_size_t size)
329135669Scognet{
330135669Scognet
331135669Scognet	panic("i80321_mem_bs_free(): not implemented");
332135669Scognet}
333