Annotation of sys/arch/sparc64/include/bus.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: bus.h,v 1.23 2007/08/04 16:44:15 kettenis Exp $ */
2: /* $NetBSD: bus.h,v 1.31 2001/09/21 15:30:41 wiz Exp $ */
3:
4: /*-
5: * Copyright (c) 1996, 1997, 1998, 2001 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, SPECIAL, 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: * Copyright (c) 1997-1999, 2001 Eduardo E. Horvath. All rights reserved.
43: * Copyright (c) 1996 Charles M. Hannum. All rights reserved.
44: * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved.
45: *
46: * Redistribution and use in source and binary forms, with or without
47: * modification, are permitted provided that the following conditions
48: * are met:
49: * 1. Redistributions of source code must retain the above copyright
50: * notice, this list of conditions and the following disclaimer.
51: * 2. Redistributions in binary form must reproduce the above copyright
52: * notice, this list of conditions and the following disclaimer in the
53: * documentation and/or other materials provided with the distribution.
54: * 3. All advertising materials mentioning features or use of this software
55: * must display the following acknowledgement:
56: * This product includes software developed by Christopher G. Demetriou
57: * for the NetBSD Project.
58: * 4. The name of the author may not be used to endorse or promote products
59: * derived from this software without specific prior written permission
60: *
61: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
62: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
63: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
64: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
65: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
66: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
67: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
68: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
69: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
70: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
71: */
72:
73: #ifndef _SPARC_BUS_H_
74: #define _SPARC_BUS_H_
75:
76: #include <machine/ctlreg.h>
77:
78: /*
79: * Debug hooks
80: */
81:
82: #define BSDB_ACCESS 0x01
83: #define BSDB_MAP 0x02
84: #define BSDB_ASSERT 0x04
85: #define BSDB_MAPDETAIL 0x08
86: #define BSDB_ALL_ACCESS 0x10
87: extern int bus_space_debug;
88:
89: #define BSHDB_ACCESS 0x01
90: #define BSHDB_NO_ACCESS 0x02
91:
92: #if defined(BUS_SPACE_DEBUG)
93: #ifndef __SYSTM_H__
94: #include <sys/systm.h>
95: #endif
96: #define BUS_SPACE_PRINTF(l, s) do { \
97: if(bus_space_debug & (l)) printf s; \
98: } while(0)
99: #define BUS_SPACE_TRACE(t, h, s) do { \
100: if ( (((bus_space_debug & BSDB_ALL_ACCESS) != 0) && \
101: (((h).bh_flags & BSHDB_NO_ACCESS) == 0)) || \
102: (((bus_space_debug & BSDB_ACCESS) != 0) && \
103: (((h).bh_flags & BSHDB_ACCESS) != 0))) \
104: printf s; \
105: } while(0)
106: #define BUS_SPACE_SET_FLAGS(t, h, f) ((h).bh_flags |= (f))
107: #define BUS_SPACE_CLEAR_FLAGS(t, h, f) ((h).bh_flags &= ~(f))
108: #define BUS_SPACE_FLAG_DECL(s) int s
109: #define BUS_SPACE_SAVE_FLAGS(t, h, s) (s = (h).bh_flags)
110: #define BUS_SPACE_RESTORE_FLAGS(t, h, s) (s = (h).bh_flags)
111: #define BUS_SPACE_ASSERT(t, h, o, n) do { \
112: if (bus_space_debug & BSDB_ASSERT) \
113: bus_space_assert(t, &(h), o, n); \
114: } while(0)
115: #else /* BUS_SPACE_DEBUG */
116: #define BUS_SPACE_PRINTF(l, s)
117: #define BUS_SPACE_TRACE(t, h, s)
118: #define BUS_SPACE_SET_FLAGS(t, h, f)
119: #define BUS_SPACE_CLEAR_FLAGS(t, h, f)
120: #define BUS_SPACE_FLAG_DECL(s)
121: #define BUS_SPACE_SAVE_FLAGS(t, h, s)
122: #define BUS_SPACE_RESTORE_FLAGS(t, h, s)
123: #define BUS_SPACE_ASSERT(t, h, o, n)
124: #endif /* BUS_SPACE_DEBUG */
125:
126:
127: /*
128: * UPA and SBus spaces are non-cached and big endian
129: * (except for RAM and PROM)
130: *
131: * PCI spaces are non-cached and little endian
132: */
133:
134: enum bus_type {
135: UPA_BUS_SPACE,
136: SBUS_BUS_SPACE,
137: PCI_CONFIG_BUS_SPACE,
138: PCI_IO_BUS_SPACE,
139: PCI_MEMORY_BUS_SPACE,
140: LAST_BUS_SPACE
141: };
142: /* For backwards compatibility */
143: #define SPARC_BUS_SPACE UPA_BUS_SPACE
144:
145: /*
146: * Bus address and size types
147: */
148: typedef const struct sparc_bus_space_tag *bus_space_tag_t;
149: typedef u_int64_t bus_addr_t;
150: typedef u_int64_t bus_size_t;
151:
152:
153: typedef struct _bus_space_handle {
154: paddr_t bh_ptr;
155: #ifdef BUS_SPACE_DEBUG
156: bus_space_tag_t bh_tag;
157: bus_size_t bh_size;
158: int bh_flags;
159: #endif
160: } bus_space_handle_t;
161:
162: /* For buses which have an iospace. */
163: #define BUS_ADDR_IOSPACE(x) ((x)>>32)
164: #define BUS_ADDR_PADDR(x) ((x)&0xffffffff)
165: #define BUS_ADDR(io, pa) ((((bus_addr_t)io)<<32)|(pa))
166:
167: /*
168: * Access methods for bus resources and address space.
169: */
170:
171: struct sparc_bus_space_tag {
172: void *cookie;
173: bus_space_tag_t parent;
174: enum bus_type default_type;
175: u_int8_t asi;
176: u_int8_t sasi;
177: char name[32];
178:
179: int (*sparc_bus_alloc)(bus_space_tag_t,
180: bus_space_tag_t,
181: bus_addr_t, bus_addr_t,
182: bus_size_t, bus_size_t, bus_size_t,
183: int, bus_addr_t *, bus_space_handle_t *);
184:
185: void (*sparc_bus_free)(bus_space_tag_t,
186: bus_space_tag_t,
187: bus_space_handle_t, bus_size_t);
188:
189: int (*sparc_bus_map)(bus_space_tag_t,
190: bus_space_tag_t,
191: bus_addr_t, bus_size_t,
192: int, bus_space_handle_t *);
193:
194: int (*sparc_bus_protect)(bus_space_tag_t,
195: bus_space_tag_t,
196: bus_space_handle_t, bus_size_t, int);
197:
198: int (*sparc_bus_unmap)(bus_space_tag_t,
199: bus_space_tag_t,
200: bus_space_handle_t, bus_size_t);
201:
202: int (*sparc_bus_subregion)(bus_space_tag_t,
203: bus_space_tag_t,
204: bus_space_handle_t, bus_size_t,
205: bus_size_t, bus_space_handle_t *);
206:
207: void (*sparc_bus_barrier)(bus_space_tag_t,
208: bus_space_tag_t,
209: bus_space_handle_t, bus_size_t,
210: bus_size_t, int);
211:
212: paddr_t (*sparc_bus_mmap)(bus_space_tag_t,
213: bus_space_tag_t,
214: bus_addr_t, off_t, int, int);
215:
216: void *(*sparc_intr_establish)(bus_space_tag_t,
217: bus_space_tag_t,
218: int, int, int,
219: int (*)(void *), void *,
220: const char *);
221:
222: bus_addr_t (*sparc_bus_addr)(bus_space_tag_t,
223: bus_space_tag_t, bus_space_handle_t);
224: };
225:
226: /*
227: * Bus space function prototypes.
228: */
229: int bus_space_alloc(
230: bus_space_tag_t,
231: bus_addr_t, /* reg start */
232: bus_addr_t, /* reg end */
233: bus_size_t, /* size */
234: bus_size_t, /* alignment */
235: bus_size_t, /* boundary */
236: int, /* flags */
237: bus_addr_t *,
238: bus_space_handle_t *);
239: void bus_space_free(
240: bus_space_tag_t,
241: bus_space_handle_t,
242: bus_size_t);
243: int bus_space_map(
244: bus_space_tag_t,
245: bus_addr_t,
246: bus_size_t,
247: int, /*flags*/
248: bus_space_handle_t *);
249: int bus_space_protect(
250: bus_space_tag_t,
251: bus_space_handle_t,
252: bus_size_t,
253: int); /*flags*/
254: int bus_space_unmap(
255: bus_space_tag_t,
256: bus_space_handle_t,
257: bus_size_t);
258: int bus_space_subregion(
259: bus_space_tag_t,
260: bus_space_handle_t,
261: bus_size_t,
262: bus_size_t,
263: bus_space_handle_t *);
264: static void bus_space_barrier(
265: bus_space_tag_t,
266: bus_space_handle_t,
267: bus_size_t,
268: bus_size_t,
269: int);
270: paddr_t bus_space_mmap(
271: bus_space_tag_t,
272: bus_addr_t, /*addr*/
273: off_t, /*offset*/
274: int, /*prot*/
275: int); /*flags*/
276: void *bus_intr_establish(
277: bus_space_tag_t,
278: int, /*bus-specific intr*/
279: int, /*device class level,
280: see machine/intr.h*/
281: int, /*flags*/
282: int (*)(void *), /*handler*/
283: void *, /*handler arg*/
284: const char *); /*what*/
285: void *bus_intr_allocate(
286: bus_space_tag_t,
287: int (*)(void *), /*handler*/
288: void *, /*handler arg*/
289: int, /*number*/
290: int, /*pil*/
291: volatile u_int64_t *, /*map*/
292: volatile u_int64_t *, /*clr*/
293: const char *); /*what*/
294: void bus_intr_free(void *);
295: void bus_space_render_tag(
296: bus_space_tag_t,
297: char *,
298: size_t);
299: void *bus_space_vaddr(
300: bus_space_tag_t,
301: bus_space_handle_t);
302:
303: #ifdef BUS_SPACE_DEBUG
304: void bus_space_assert(bus_space_tag_t,
305: const bus_space_handle_t *,
306: bus_size_t, int);
307: void bus_space_render_tag(bus_space_tag_t, char*, size_t);
308: #endif /* BUS_SPACE_DEBUG */
309:
310:
311: #define _BS_PRECALL(t,f) \
312: while (t->f == NULL) \
313: t = t->parent;
314: #define _BS_POSTCALL
315:
316: #define _BS_CALL(t,f) \
317: (*(t)->f)
318:
319: static inline void
320: bus_space_barrier(t, h, o, s, f)
321: bus_space_tag_t t;
322: bus_space_handle_t h;
323: bus_size_t o;
324: bus_size_t s;
325: int f;
326: {
327: const bus_space_tag_t t0 = t;
328: _BS_PRECALL(t, sparc_bus_barrier);
329: _BS_CALL(t, sparc_bus_barrier)(t, t0, h, o, s, f);
330: _BS_POSTCALL;
331: }
332:
333: #include <sparc64/sparc64/busop.h>
334:
335: /* flags for bus space map functions */
336: #define BUS_SPACE_MAP_CACHEABLE 0x0001
337: #define BUS_SPACE_MAP_LINEAR 0x0002
338: #define BUS_SPACE_MAP_READONLY 0x0004
339: #define BUS_SPACE_MAP_PREFETCHABLE 0x0008
340: #define BUS_SPACE_MAP_PROMADDRESS 0x0010
341: #define BUS_SPACE_MAP_BUS1 0x0100 /* placeholders for bus functions... */
342: #define BUS_SPACE_MAP_BUS2 0x0200
343: #define BUS_SPACE_MAP_BUS3 0x0400
344: #define BUS_SPACE_MAP_BUS4 0x0800
345:
346:
347: /* flags for intr_establish() */
348: #define BUS_INTR_ESTABLISH_FASTTRAP 1
349: #define BUS_INTR_ESTABLISH_SOFTINTR 2
350:
351: /* flags for bus_space_barrier() */
352: #define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */
353: #define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */
354:
355: /*
356: * Flags used in various bus DMA methods.
357: */
358: #define BUS_DMA_WAITOK 0x000 /* safe to sleep (pseudo-flag) */
359: #define BUS_DMA_NOWAIT 0x001 /* not safe to sleep */
360: #define BUS_DMA_ALLOCNOW 0x002 /* perform resource allocation now */
361: #define BUS_DMA_COHERENT 0x004 /* hint: map memory DMA coherent */
362: #define BUS_DMA_NOWRITE 0x008 /* I suppose the following two should default on */
363: #define BUS_DMA_BUS1 0x010 /* placeholders for bus functions... */
364: #define BUS_DMA_BUS2 0x020
365: #define BUS_DMA_BUS3 0x040
366: #define BUS_DMA_BUS4 0x080
367: #define BUS_DMA_STREAMING 0x100 /* hint: sequential, unidirectional */
368: #define BUS_DMA_READ 0x200 /* mapping is device -> memory only */
369: #define BUS_DMA_WRITE 0x400 /* mapping is memory -> device only */
370:
371: #define BUS_DMA_NOCACHE BUS_DMA_BUS1
372: #define BUS_DMA_DVMA BUS_DMA_BUS2 /* Don't bother with alignment */
373: #define BUS_DMA_24BIT BUS_DMA_BUS3 /* 24bit device */
374:
375: #define BUS_DMA_RAW BUS_DMA_STREAMING
376:
377: /* Forwards needed by prototypes below. */
378: struct mbuf;
379: struct uio;
380:
381: /*
382: * Operations performed by bus_dmamap_sync().
383: */
384: #define BUS_DMASYNC_PREREAD 0x01 /* pre-read synchronization */
385: #define BUS_DMASYNC_POSTREAD 0x02 /* post-read synchronization */
386: #define BUS_DMASYNC_PREWRITE 0x04 /* pre-write synchronization */
387: #define BUS_DMASYNC_POSTWRITE 0x08 /* post-write synchronization */
388:
389: typedef struct sparc_bus_dma_tag *bus_dma_tag_t;
390: typedef struct sparc_bus_dmamap *bus_dmamap_t;
391:
392: /*
393: * bus_dma_segment_t
394: *
395: * Describes a single contiguous DMA transaction. Values
396: * are suitable for programming into DMA registers.
397: */
398: struct sparc_bus_dma_segment {
399: bus_addr_t ds_addr; /* DVMA address */
400: bus_size_t ds_len; /* length of transfer */
401: /*
402: * The following is to support bus_dmamem_alloc()'s
403: * odd interface. Only the values in the first
404: * segment are used. This means that 3/5ths of
405: * most segments are useless space (and mbufs use 1024
406: * segments).
407: */
408: bus_size_t _ds_boundary; /* don't cross this */
409: bus_size_t _ds_align; /* align to this */
410: void *_ds_mlist; /* XXX - dmamap_alloc'ed pages */
411: };
412: typedef struct sparc_bus_dma_segment bus_dma_segment_t;
413:
414:
415: /*
416: * bus_dma_tag_t
417: *
418: * A machine-dependent opaque type describing the implementation of
419: * DMA for a given bus.
420: */
421: struct sparc_bus_dma_tag {
422: void *_cookie; /* cookie used in the guts */
423: struct sparc_bus_dma_tag* _parent;
424:
425: /*
426: * DMA mapping methods.
427: */
428: int (*_dmamap_create)(bus_dma_tag_t, bus_dma_tag_t, bus_size_t,
429: int, bus_size_t, bus_size_t, int, bus_dmamap_t *);
430: void (*_dmamap_destroy)(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t);
431: int (*_dmamap_load)(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t,
432: void *, bus_size_t, struct proc *, int);
433: int (*_dmamap_load_mbuf)(bus_dma_tag_t, bus_dma_tag_t,
434: bus_dmamap_t, struct mbuf *, int);
435: int (*_dmamap_load_uio)(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t,
436: struct uio *, int);
437: int (*_dmamap_load_raw)(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t,
438: bus_dma_segment_t *, int, bus_size_t, int);
439: void (*_dmamap_unload)(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t);
440: void (*_dmamap_sync)(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t,
441: bus_addr_t, bus_size_t, int);
442:
443: /*
444: * DMA memory utility functions.
445: */
446: int (*_dmamem_alloc)(bus_dma_tag_t, bus_dma_tag_t, bus_size_t,
447: bus_size_t, bus_size_t, bus_dma_segment_t *, int, int *,
448: int);
449: void (*_dmamem_free)(bus_dma_tag_t, bus_dma_tag_t,
450: bus_dma_segment_t *, int);
451: int (*_dmamem_map)(bus_dma_tag_t, bus_dma_tag_t,
452: bus_dma_segment_t *, int, size_t, caddr_t *, int);
453: void (*_dmamem_unmap)(bus_dma_tag_t, bus_dma_tag_t, caddr_t,
454: size_t);
455: paddr_t (*_dmamem_mmap)(bus_dma_tag_t, bus_dma_tag_t,
456: bus_dma_segment_t *, int, off_t, int, int);
457: };
458:
459: #define _BD_PRECALL(t,f) \
460: while (t->f == NULL) { \
461: t = t->_parent; \
462: }
463: #define _BD_CALL(t,f) \
464: (*(t)->f)
465: #define _BD_POSTCALL
466:
467: static inline int
468: bus_dmamap_create(bus_dma_tag_t t, bus_size_t s, int n, bus_size_t m,
469: bus_size_t b, int f, bus_dmamap_t *p)
470: {
471: int r;
472: const bus_dma_tag_t t0 = t;
473: _BD_PRECALL(t, _dmamap_create);
474: r = _BD_CALL(t, _dmamap_create)(t, t0, s, n, m, b, f, p);
475: _BD_POSTCALL;
476: return (r);
477: }
478: static inline void
479: bus_dmamap_destroy(bus_dma_tag_t t, bus_dmamap_t p)
480: {
481: const bus_dma_tag_t t0 = t;
482: _BD_PRECALL(t, _dmamap_destroy);
483: _BD_CALL(t, _dmamap_destroy)(t, t0, p);
484: _BD_POSTCALL;
485: }
486: static inline int
487: bus_dmamap_load(bus_dma_tag_t t, bus_dmamap_t m, void *b, bus_size_t s,
488: struct proc *p, int f)
489: {
490: const bus_dma_tag_t t0 = t;
491: int r;
492: _BD_PRECALL(t, _dmamap_load);
493: r = _BD_CALL(t, _dmamap_load)(t, t0, m, b, s, p, f);
494: _BD_POSTCALL;
495: return (r);
496: }
497: static inline int
498: bus_dmamap_load_mbuf(bus_dma_tag_t t, bus_dmamap_t m, struct mbuf *b,
499: int f)
500: {
501: const bus_dma_tag_t t0 = t;
502: int r;
503: _BD_PRECALL(t, _dmamap_load_mbuf);
504: r = _BD_CALL(t, _dmamap_load_mbuf)(t, t0, m, b, f);
505: _BD_POSTCALL;
506: return (r);
507: }
508: static inline int
509: bus_dmamap_load_uio(bus_dma_tag_t t, bus_dmamap_t m, struct uio * u, int f)
510: {
511: const bus_dma_tag_t t0 = t;
512: int r;
513: _BD_PRECALL(t, _dmamap_load_uio);
514: r = _BD_CALL(t, _dmamap_load_uio)(t, t0, m, u, f);
515: _BD_POSTCALL;
516: return (r);
517: }
518: static inline int
519: bus_dmamap_load_raw(bus_dma_tag_t t, bus_dmamap_t m, bus_dma_segment_t *sg,
520: int n, bus_size_t s, int f)
521: {
522: const bus_dma_tag_t t0 = t;
523: int r;
524: _BD_PRECALL(t, _dmamap_load_raw);
525: r = _BD_CALL(t, _dmamap_load_raw)(t, t0, m, sg, n, s, f);
526: _BD_POSTCALL;
527: return (r);
528: }
529: static inline void
530: bus_dmamap_unload(bus_dma_tag_t t, bus_dmamap_t p)
531: {
532: const bus_dma_tag_t t0 = t;
533: _BD_PRECALL(t, _dmamap_unload);
534: _BD_CALL(t, _dmamap_unload)(t, t0, p);
535: _BD_POSTCALL;
536: }
537: static inline void
538: bus_dmamap_sync(bus_dma_tag_t t, bus_dmamap_t p, bus_addr_t o, bus_size_t l,
539: int ops)
540: {
541: const bus_dma_tag_t t0 = t;
542: _BD_PRECALL(t, _dmamap_sync);
543: _BD_CALL(t, _dmamap_sync)(t, t0, p, o, l, ops);
544: _BD_POSTCALL;
545: }
546: static inline int
547: bus_dmamem_alloc(bus_dma_tag_t t, bus_size_t s, bus_size_t a, bus_size_t b,
548: bus_dma_segment_t *sg, int n, int *r, int f)
549: {
550: const bus_dma_tag_t t0 = t;
551: int ret;
552: _BD_PRECALL(t, _dmamem_alloc);
553: ret = _BD_CALL(t, _dmamem_alloc)(t, t0, s, a, b, sg, n, r, f);
554: _BD_POSTCALL;
555: return (ret);
556: }
557: static inline void
558: bus_dmamem_free(bus_dma_tag_t t, bus_dma_segment_t *sg, int n)
559: {
560: const bus_dma_tag_t t0 = t;
561: _BD_PRECALL(t, _dmamem_free);
562: _BD_CALL(t, _dmamem_free)(t, t0, sg, n);
563: _BD_POSTCALL;
564: }
565: static inline int
566: bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *sg, int n, size_t s,
567: caddr_t *k, int f)
568: {
569: const bus_dma_tag_t t0 = t;
570: int r;
571: _BD_PRECALL(t, _dmamem_map);
572: r = _BD_CALL(t, _dmamem_map)(t, t0, sg, n, s, k, f);
573: _BD_POSTCALL;
574: return (r);
575: }
576: static inline void
577: bus_dmamem_unmap(bus_dma_tag_t t, caddr_t k, size_t s)
578: {
579: const bus_dma_tag_t t0 = t;
580: _BD_PRECALL(t, _dmamem_unmap);
581: _BD_CALL(t, _dmamem_unmap)(t, t0, k, s);
582: _BD_POSTCALL;
583: }
584: static inline paddr_t
585: bus_dmamem_mmap(bus_dma_tag_t t, bus_dma_segment_t *sg, int n, off_t o, int p,
586: int f)
587: {
588: const bus_dma_tag_t t0 = t;
589: int r;
590: _BD_PRECALL(t, _dmamem_mmap);
591: r = _BD_CALL(t, _dmamem_mmap)(t, t0, sg, n, o, p, f);
592: _BD_POSTCALL;
593: return (r);
594: }
595:
596: /*
597: * bus_dmamap_t
598: *
599: * Describes a DMA mapping.
600: */
601: struct sparc_bus_dmamap {
602: /*
603: * PRIVATE MEMBERS: not for use by machine-independent code.
604: */
605: bus_addr_t _dm_dvmastart; /* start and size of allocated */
606: bus_size_t _dm_dvmasize; /* DVMA segment for this map */
607:
608: bus_size_t _dm_size; /* largest DMA transfer mappable */
609: bus_size_t _dm_maxsegsz; /* largest possible segment */
610: bus_size_t _dm_boundary; /* don't cross this */
611: int _dm_segcnt; /* number of segs this map can map */
612: int _dm_flags; /* misc. flags */
613: #define _DM_TYPE_LOAD 0
614: #define _DM_TYPE_SEGS 1
615: #define _DM_TYPE_UIO 2
616: #define _DM_TYPE_MBUF 3
617: int _dm_type; /* mapping type: raw, uio, mbuf, etc */
618: void *_dm_source; /* source mbuf/uio/etc. for unload */
619:
620: void *_dm_cookie; /* cookie for bus-specific functions */
621:
622: /*
623: * PUBLIC MEMBERS: these are used by machine-independent code.
624: */
625: bus_size_t dm_mapsize; /* size of the mapping */
626: int dm_nsegs; /* # valid segments in mapping */
627:
628: bus_dma_segment_t dm_segs[1]; /* segments; variable length */
629: };
630:
631: #endif /* _SPARC_BUS_H_ */
632:
CVSweb