i80321_space.c revision 151524
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: head/sys/arm/xscale/i80321/i80321_space.c 151524 2005-10-20 20:30:51Z cognet $");
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 */
102135669Scognet	NULL,
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,
142135669Scognet};
143135669Scognet
144135669Scognetvoid
145135669Scogneti80321_bs_init(bus_space_tag_t bs, void *cookie)
146135669Scognet{
147135669Scognet
148135669Scognet	*bs = i80321_bs_tag_template;
149135669Scognet	bs->bs_cookie = cookie;
150135669Scognet}
151135669Scognet
152135669Scognetvoid
153135669Scogneti80321_io_bs_init(bus_space_tag_t bs, void *cookie)
154135669Scognet{
155135669Scognet
156135669Scognet	*bs = i80321_bs_tag_template;
157135669Scognet	bs->bs_cookie = cookie;
158135669Scognet
159135669Scognet	bs->bs_map = i80321_io_bs_map;
160135669Scognet	bs->bs_unmap = i80321_io_bs_unmap;
161135669Scognet	bs->bs_alloc = i80321_io_bs_alloc;
162135669Scognet	bs->bs_free = i80321_io_bs_free;
163135669Scognet
164135669Scognet}
165135669Scognet
166135669Scognetvoid
167135669Scogneti80321_mem_bs_init(bus_space_tag_t bs, void *cookie)
168135669Scognet{
169135669Scognet
170135669Scognet	*bs = i80321_bs_tag_template;
171135669Scognet	bs->bs_cookie = cookie;
172135669Scognet
173135669Scognet	bs->bs_map = i80321_mem_bs_map;
174135669Scognet	bs->bs_unmap = i80321_mem_bs_unmap;
175135669Scognet	bs->bs_alloc = i80321_mem_bs_alloc;
176135669Scognet	bs->bs_free = i80321_mem_bs_free;
177135669Scognet
178135669Scognet}
179135669Scognet
180135669Scognet/* *** Routines shared by i80321, PCI IO, and PCI MEM. *** */
181135669Scognet
182135669Scognetint
183135669Scogneti80321_bs_subregion(void *t, bus_space_handle_t bsh, bus_size_t offset,
184135669Scognet    bus_size_t size, bus_space_handle_t *nbshp)
185135669Scognet{
186135669Scognet
187135669Scognet	*nbshp = bsh + offset;
188135669Scognet	return (0);
189135669Scognet}
190135669Scognet
191135669Scognetvoid
192135669Scogneti80321_bs_barrier(void *t, bus_space_handle_t bsh, bus_size_t offset,
193135669Scognet    bus_size_t len, int flags)
194135669Scognet{
195135669Scognet
196135669Scognet	/* Nothing to do. */
197135669Scognet}
198135669Scognet
199135669Scognet/* *** Routines for PCI IO. *** */
200135669Scognet
201135669Scognetextern struct i80321_softc *i80321_softc;
202135669Scognetint
203135669Scogneti80321_io_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags,
204135669Scognet    bus_space_handle_t *bshp)
205135669Scognet{
206135669Scognet	struct i80321_softc *sc = i80321_softc;
207135669Scognet	vm_offset_t winvaddr;
208135669Scognet	uint32_t busbase;
209135669Scognet
210135669Scognet	if (bpa >= sc->sc_ioout_xlate &&
211135669Scognet	    bpa < (sc->sc_ioout_xlate + VERDE_OUT_XLATE_IO_WIN_SIZE)) {
212135669Scognet		busbase = sc->sc_ioout_xlate;
213135669Scognet		winvaddr = sc->sc_iow_vaddr;
214135669Scognet	} else
215135669Scognet		return (EINVAL);
216135669Scognet
217135669Scognet	if ((bpa + size) >= (busbase + VERDE_OUT_XLATE_IO_WIN_SIZE))
218135669Scognet		return (EINVAL);
219135669Scognet
220135669Scognet	/*
221135669Scognet	 * Found the window -- PCI I/O space is mapped at a fixed
222135669Scognet	 * virtual address by board-specific code.  Translate the
223135669Scognet	 * bus address to the virtual address.
224135669Scognet	 */
225135669Scognet	*bshp = winvaddr + (bpa - busbase);
226135669Scognet
227135669Scognet	return (0);
228135669Scognet}
229135669Scognet
230135669Scognetvoid
231135669Scogneti80321_io_bs_unmap(void *t, bus_size_t size)
232135669Scognet{
233135669Scognet
234135669Scognet	/* Nothing to do. */
235135669Scognet}
236135669Scognet
237135669Scognetint
238135669Scogneti80321_io_bs_alloc(void *t, bus_addr_t rstart, bus_addr_t rend,
239135669Scognet    bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags,
240135669Scognet    bus_addr_t *bpap, bus_space_handle_t *bshp)
241135669Scognet{
242135669Scognet
243135669Scognet	panic("i80321_io_bs_alloc(): not implemented");
244135669Scognet}
245135669Scognet
246135669Scognetvoid
247135669Scogneti80321_io_bs_free(void *t, bus_space_handle_t bsh, bus_size_t size)
248135669Scognet{
249135669Scognet
250135669Scognet	panic("i80321_io_bs_free(): not implemented");
251135669Scognet}
252135669Scognet
253135669Scognet
254135669Scognet/* *** Routines for PCI MEM. *** */
255135669Scognetextern int badaddr_read(void *, int, void *);
256135669Scognetint
257135669Scogneti80321_mem_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags,
258135669Scognet    bus_space_handle_t *bshp)
259135669Scognet{
260151524Scognet	vm_paddr_t pa, endpa;
261135669Scognet
262135669Scognet	pa = trunc_page(bpa);
263135669Scognet	endpa = round_page(bpa + size);
264135669Scognet
265135669Scognet	*bshp = (vm_offset_t)pmap_mapdev(pa, endpa - pa);
266135669Scognet
267135669Scognet	return (0);
268135669Scognet}
269135669Scognet
270135669Scognetvoid
271135669Scogneti80321_mem_bs_unmap(void *t, bus_size_t size)
272135669Scognet{
273135669Scognet	vm_offset_t va, endva;
274135669Scognet
275135669Scognet	va = trunc_page((vm_offset_t)t);
276135669Scognet	endva = va + round_page(size);
277135669Scognet
278135669Scognet	/* Free the kernel virtual mapping. */
279135669Scognet	kmem_free(kernel_map, va, endva - va);
280135669Scognet}
281135669Scognet
282135669Scognetint
283135669Scogneti80321_mem_bs_alloc(void *t, bus_addr_t rstart, bus_addr_t rend,
284135669Scognet    bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags,
285135669Scognet    bus_addr_t *bpap, bus_space_handle_t *bshp)
286135669Scognet{
287135669Scognet
288135669Scognet	panic("i80321_mem_bs_alloc(): not implemented");
289135669Scognet}
290135669Scognet
291135669Scognetvoid
292135669Scogneti80321_mem_bs_free(void *t, bus_space_handle_t bsh, bus_size_t size)
293135669Scognet{
294135669Scognet
295135669Scognet	panic("i80321_mem_bs_free(): not implemented");
296135669Scognet}
297