Annotation of sys/arch/vax/uba/uba_dma.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: uba_dma.c,v 1.4 2003/11/10 21:05:06 miod Exp $ */
2: /* $NetBSD: uba_dma.c,v 1.2 1999/06/20 00:59:55 ragge Exp $ */
3:
4: /*-
5: * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
6: * All rights reserved.
7: *
8: * This code is derived from software contributed to The NetBSD Foundation
9: * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
10: * NASA Ames Research Center.
11: *
12: * Redistribution and use in source and binary forms, with or without
13: * modification, are permitted provided that the following conditions
14: * are met:
15: * 1. Redistributions of source code must retain the above copyright
16: * notice, this list of conditions and the following disclaimer.
17: * 2. Redistributions in binary form must reproduce the above copyright
18: * notice, this list of conditions and the following disclaimer in the
19: * documentation and/or other materials provided with the distribution.
20: * 3. All advertising materials mentioning features or use of this software
21: * must display the following acknowledgement:
22: * This product includes software developed by the NetBSD
23: * Foundation, Inc. and its contributors.
24: * 4. Neither the name of The NetBSD Foundation nor the names of its
25: * contributors may be used to endorse or promote products derived
26: * from this software without specific prior written permission.
27: *
28: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
29: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
30: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
32: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPEUBAL, EXEMPLARY, OR
33: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
34: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
35: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
36: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38: * POSSIBILITY OF SUCH DAMAGE.
39: */
40:
41:
42: #include <sys/param.h>
43: #include <sys/systm.h>
44: #include <sys/kernel.h>
45: #include <sys/device.h>
46: #include <sys/malloc.h>
47: #include <uvm/uvm_extern.h>
48:
49: #define _VAX_BUS_DMA_PRIVATE
50: #include <machine/bus.h>
51: #include <machine/cpu.h>
52: #include <machine/sgmap.h>
53:
54: #include <arch/vax/qbus/ubavar.h>
55:
56: #include <arch/vax/uba/uba_common.h>
57:
58: int uba_bus_dmamap_create_sgmap(bus_dma_tag_t, bus_size_t, int,
59: bus_size_t, bus_size_t, int, bus_dmamap_t *);
60:
61: void uba_bus_dmamap_destroy_sgmap(bus_dma_tag_t, bus_dmamap_t);
62:
63: int uba_bus_dmamap_load_sgmap(bus_dma_tag_t, bus_dmamap_t, void *,
64: bus_size_t, struct proc *, int);
65:
66: int uba_bus_dmamap_load_mbuf_sgmap(bus_dma_tag_t, bus_dmamap_t,
67: struct mbuf *, int);
68:
69: int uba_bus_dmamap_load_uio_sgmap(bus_dma_tag_t, bus_dmamap_t,
70: struct uio *, int);
71:
72: int uba_bus_dmamap_load_raw_sgmap(bus_dma_tag_t, bus_dmamap_t,
73: bus_dma_segment_t *, int, bus_size_t, int);
74:
75: void uba_bus_dmamap_unload_sgmap(bus_dma_tag_t, bus_dmamap_t);
76:
77: void uba_bus_dmamap_sync(bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
78: bus_size_t, int);
79:
80: void
81: uba_dma_init(sc)
82: struct uba_vsoftc *sc;
83: {
84: bus_dma_tag_t t;
85: pt_entry_t *pte;
86:
87: /*
88: * Initialize the DMA tag used for sgmap-mapped DMA.
89: */
90: t = &sc->uv_dmat;
91: t->_cookie = sc;
92: t->_wbase = 0;
93: t->_wsize = sc->uv_size;
94: t->_boundary = 0;
95: t->_sgmap = &sc->uv_sgmap;
96: t->_dmamap_create = uba_bus_dmamap_create_sgmap;
97: t->_dmamap_destroy = uba_bus_dmamap_destroy_sgmap;
98: t->_dmamap_load = uba_bus_dmamap_load_sgmap;
99: t->_dmamap_load_mbuf = uba_bus_dmamap_load_mbuf_sgmap;
100: t->_dmamap_load_uio = uba_bus_dmamap_load_uio_sgmap;
101: t->_dmamap_load_raw = uba_bus_dmamap_load_raw_sgmap;
102: t->_dmamap_unload = uba_bus_dmamap_unload_sgmap;
103: t->_dmamap_sync = uba_bus_dmamap_sync;
104:
105: t->_dmamem_alloc = _bus_dmamem_alloc;
106: t->_dmamem_free = _bus_dmamem_free;
107: t->_dmamem_map = _bus_dmamem_map;
108: t->_dmamem_unmap = _bus_dmamem_unmap;
109: t->_dmamem_mmap = _bus_dmamem_mmap;
110:
111: /*
112: * Map in Unibus map registers.
113: */
114: pte = (pt_entry_t *)vax_map_physmem(sc->uv_addr, sc->uv_size/VAX_NBPG);
115: if (pte == NULL)
116: panic("uba_dma_init");
117: /*
118: * Initialize the SGMAP.
119: */
120: vax_sgmap_init(t, &sc->uv_sgmap, "uba_sgmap", 0, sc->uv_size, pte, 0);
121:
122: }
123:
124: /*
125: * Create a UBA SGMAP-mapped DMA map.
126: */
127: int
128: uba_bus_dmamap_create_sgmap(t, size, nsegments, maxsegsz, boundary,
129: flags, dmamp)
130: bus_dma_tag_t t;
131: bus_size_t size;
132: int nsegments;
133: bus_size_t maxsegsz;
134: bus_size_t boundary;
135: int flags;
136: bus_dmamap_t *dmamp;
137: {
138: bus_dmamap_t map;
139: int error;
140:
141: error = _bus_dmamap_create(t, size, nsegments, maxsegsz,
142: boundary, flags, dmamp);
143: if (error)
144: return (error);
145:
146: map = *dmamp;
147:
148: if (flags & BUS_DMA_ALLOCNOW) {
149: error = vax_sgmap_alloc(map, vax_round_page(size),
150: t->_sgmap, flags);
151: if (error)
152: uba_bus_dmamap_destroy_sgmap(t, map);
153: }
154:
155: return (error);
156: }
157:
158: /*
159: * Destroy a UBA SGMAP-mapped DMA map.
160: */
161: void
162: uba_bus_dmamap_destroy_sgmap(t, map)
163: bus_dma_tag_t t;
164: bus_dmamap_t map;
165: {
166:
167: if (map->_dm_flags & DMAMAP_HAS_SGMAP)
168: vax_sgmap_free(map, t->_sgmap);
169:
170: _bus_dmamap_destroy(t, map);
171: }
172:
173: /*
174: * Load a UBA SGMAP-mapped DMA map with a linear buffer.
175: */
176: int
177: uba_bus_dmamap_load_sgmap(t, map, buf, buflen, p, flags)
178: bus_dma_tag_t t;
179: bus_dmamap_t map;
180: void *buf;
181: bus_size_t buflen;
182: struct proc *p;
183: int flags;
184: {
185: int error;
186:
187: error = vax_sgmap_load(t, map, buf, buflen, p, flags, t->_sgmap);
188: /*
189: * XXX - Set up BDPs.
190: */
191:
192: return (error);
193: }
194:
195: /*
196: * Load a UBA SGMAP-mapped DMA map with an mbuf chain.
197: */
198: int
199: uba_bus_dmamap_load_mbuf_sgmap(t, map, m, flags)
200: bus_dma_tag_t t;
201: bus_dmamap_t map;
202: struct mbuf *m;
203: int flags;
204: {
205: int error;
206:
207: error = vax_sgmap_load_mbuf(t, map, m, flags, t->_sgmap);
208:
209: return (error);
210: }
211:
212: /*
213: * Load a UBA SGMAP-mapped DMA map with a uio.
214: */
215: int
216: uba_bus_dmamap_load_uio_sgmap(t, map, uio, flags)
217: bus_dma_tag_t t;
218: bus_dmamap_t map;
219: struct uio *uio;
220: int flags;
221: {
222: int error;
223:
224: error = vax_sgmap_load_uio(t, map, uio, flags, t->_sgmap);
225:
226: return (error);
227: }
228:
229: /*
230: * Load a UBA SGMAP-mapped DMA map with raw memory.
231: */
232: int
233: uba_bus_dmamap_load_raw_sgmap(t, map, segs, nsegs, size, flags)
234: bus_dma_tag_t t;
235: bus_dmamap_t map;
236: bus_dma_segment_t *segs;
237: int nsegs;
238: bus_size_t size;
239: int flags;
240: {
241: int error;
242:
243: error = vax_sgmap_load_raw(t, map, segs, nsegs, size, flags,
244: t->_sgmap);
245:
246: return (error);
247: }
248:
249: /*
250: * Unload a UBA DMA map.
251: */
252: void
253: uba_bus_dmamap_unload_sgmap(t, map)
254: bus_dma_tag_t t;
255: bus_dmamap_t map;
256: {
257:
258: /*
259: * Invalidate any SGMAP page table entries used by this
260: * mapping.
261: */
262: vax_sgmap_unload(t, map, t->_sgmap);
263:
264: /*
265: * Do the generic bits of the unload.
266: */
267: _bus_dmamap_unload(t, map);
268: }
269:
270: /*
271: * Sync the bus map. This is only needed if BDP's are used.
272: */
273: void
274: uba_bus_dmamap_sync(tag, dmam, offset, len, ops)
275: bus_dma_tag_t tag;
276: bus_dmamap_t dmam;
277: bus_addr_t offset;
278: bus_size_t len;
279: int ops;
280: {
281: /* Only BDP handling, but not yet. */
282: }
CVSweb