sa11x0_io.c revision 129198
1/*	$NetBSD: sa11x0_io.c,v 1.12 2003/07/15 00:24:51 lukem Exp $	*/
2
3/*
4 * Copyright (c) 1997 Mark Brinicombe.
5 * Copyright (c) 1997 Causality Limited.
6 * All rights reserved.
7 *
8 * This code is derived from software contributed to The NetBSD Foundation
9 * by Ichiro FUKUHARA.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 *    notice, this list of conditions and the following disclaimer in the
18 *    documentation and/or other materials provided with the distribution.
19 * 3. All advertising materials mentioning features or use of this software
20 *    must display the following acknowledgement:
21 *	This product includes software developed by Mark Brinicombe.
22 * 4. The name of the company nor the name of the author may be used to
23 *    endorse or promote products derived from this software without specific
24 *    prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
27 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
28 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
29 * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
30 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
31 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
32 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
37 */
38
39/*
40 * bus_space I/O functions for sa11x0
41 */
42
43#include <sys/cdefs.h>
44__FBSDID("$FreeBSD: head/sys/arm/sa11x0/sa11x0_io.c 129198 2004-05-14 11:46:45Z cognet $");
45#include <sys/param.h>
46#include <sys/systm.h>
47#include <sys/queue.h>
48#include <sys/types.h>
49#include <sys/lock.h>
50#include <sys/mutex.h>
51
52#include <vm/vm.h>
53#include <vm/pmap.h>
54#include <vm/vm_extern.h>
55#include <vm/vm_kern.h>
56
57#include <machine/bus.h>
58#include <machine/pmap.h>
59
60/* Proto types for all the bus_space structure functions */
61
62bs_protos(sa11x0);
63
64/* Declare the sa11x0 bus space tag */
65
66struct bus_space sa11x0_bs_tag = {
67	/* cookie */
68	NULL,
69
70	/* mapping/unmapping */
71	sa11x0_bs_map,
72	sa11x0_bs_unmap,
73	sa11x0_bs_subregion,
74
75	/* allocation/deallocation */
76	sa11x0_bs_alloc,
77	sa11x0_bs_free,
78
79	/* get kernel virtual address */
80	sa11x0_bs_vaddr,
81
82	/* mmap bus space for userland */
83	sa11x0_bs_mmap,
84
85	/* barrier */
86	sa11x0_bs_barrier,
87
88	/* read (single) */
89	sa11x0_bs_r_1,
90	sa11x0_bs_r_2,
91	sa11x0_bs_r_4,
92	NULL,
93
94	/* read multiple */
95	sa11x0_bs_rm_1,
96	sa11x0_bs_rm_2,
97	sa11x0_bs_rm_4,
98	NULL,
99
100	/* read region */
101	NULL,
102	sa11x0_bs_rr_2,
103	NULL,
104	NULL,
105	/* write (single) */
106	sa11x0_bs_w_1,
107	sa11x0_bs_w_2,
108	sa11x0_bs_w_4,
109	NULL,
110
111	/* write multiple */
112	sa11x0_bs_wm_1,
113	sa11x0_bs_wm_2,
114	sa11x0_bs_wm_4,
115	NULL,
116
117	/* write region */
118	NULL,
119	sa11x0_bs_wr_2,
120	NULL,
121	NULL,
122
123	/* set multiple */
124	NULL,
125	NULL,
126	NULL,
127	NULL,
128
129	/* set region */
130	NULL,
131	sa11x0_bs_sr_2,
132	NULL,
133	NULL,
134
135	/* copy */
136	NULL,
137	sa11x0_bs_c_2,
138	NULL,
139	NULL,
140};
141
142/* bus space functions */
143
144int
145sa11x0_bs_map(t, bpa, size, cacheable, bshp)
146	void *t;
147	bus_addr_t bpa;
148	bus_size_t size;
149	int cacheable;
150	bus_space_handle_t *bshp;
151{
152	u_long startpa, endpa, pa;
153	vm_offset_t va;
154	pt_entry_t *pte;
155
156	startpa = trunc_page(bpa);
157	endpa = round_page(bpa + size);
158
159	/* XXX use extent manager to check duplicate mapping */
160
161	va = kmem_alloc(kernel_map, endpa - startpa);
162	if (! va)
163		return(ENOMEM);
164
165	*bshp = (bus_space_handle_t)(va + (bpa - startpa));
166
167	for(pa = startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE) {
168		pmap_kenter(va, pa);
169		pte = vtopte(va);
170		if (cacheable == 0) {
171			*pte &= ~L2_S_CACHE_MASK;
172			PTE_SYNC(pte);
173		}
174	}
175	pmap_update(pmap_kernel());
176	return(0);
177}
178
179int
180sa11x0_bs_alloc(t, rstart, rend, size, alignment, boundary, cacheable,
181    bpap, bshp)
182	void *t;
183	bus_addr_t rstart, rend;
184	bus_size_t size, alignment, boundary;
185	int cacheable;
186	bus_addr_t *bpap;
187	bus_space_handle_t *bshp;
188{
189	panic("sa11x0_alloc(): Help!");
190}
191
192
193void
194sa11x0_bs_unmap(t, size)
195	void *t;
196	bus_size_t size;
197{
198	/*
199	 * Temporary implementation
200	 */
201}
202
203void
204sa11x0_bs_free(t, bsh, size)
205	void *t;
206	bus_space_handle_t bsh;
207	bus_size_t size;
208{
209
210	panic("sa11x0_free(): Help!");
211	/* sa11x0_unmap() does all that we need to do. */
212/*	sa11x0_unmap(t, bsh, size);*/
213}
214
215int
216sa11x0_bs_subregion(t, bsh, offset, size, nbshp)
217	void *t;
218	bus_space_handle_t bsh;
219	bus_size_t offset, size;
220	bus_space_handle_t *nbshp;
221{
222
223	*nbshp = bsh + offset;
224	return (0);
225}
226
227int
228sa11x0_bs_mmap(dev_t t, vm_offset_t offset, vm_paddr_t *paddr, int nprot)
229{
230	*paddr = offset;
231	return (0);
232}
233
234void *
235sa11x0_bs_vaddr(t, bsh)
236	void *t;
237	bus_space_handle_t bsh;
238{
239	return ((void *)bsh);
240}
241
242void
243sa11x0_bs_barrier(t, bsh, offset, len, flags)
244	void *t;
245	bus_space_handle_t bsh;
246	bus_size_t offset, len;
247	int flags;
248{
249/* NULL */
250}
251
252/* End of sa11x0_io.c */
253