[BACK]Return to bus.h CVS log [TXT][DIR] Up to [local] / sys / arch / sparc64 / include

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