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

Annotation of sys/arch/arm/include/bus.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: bus.h,v 1.8 2007/04/10 18:22:08 miod Exp $    */
                      2: /*     $NetBSD: bus.h,v 1.12 2003/10/23 15:03:24 scw 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) 1996 Charles M. Hannum.  All rights reserved.
                     43:  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
                     44:  *
                     45:  * Redistribution and use in source and binary forms, with or without
                     46:  * modification, are permitted provided that the following conditions
                     47:  * are met:
                     48:  * 1. Redistributions of source code must retain the above copyright
                     49:  *    notice, this list of conditions and the following disclaimer.
                     50:  * 2. Redistributions in binary form must reproduce the above copyright
                     51:  *    notice, this list of conditions and the following disclaimer in the
                     52:  *    documentation and/or other materials provided with the distribution.
                     53:  * 3. All advertising materials mentioning features or use of this software
                     54:  *    must display the following acknowledgement:
                     55:  *      This product includes software developed by Christopher G. Demetriou
                     56:  *     for the NetBSD Project.
                     57:  * 4. The name of the author may not be used to endorse or promote products
                     58:  *    derived from this software without specific prior written permission
                     59:  *
                     60:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     61:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     62:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     63:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     64:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     65:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     66:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     67:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     68:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     69:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     70:  */
                     71:
                     72: #ifndef _ARM32_BUS_H_
                     73: #define _ARM32_BUS_H_
                     74:
                     75: /*
                     76:  * Addresses (in bus space).
                     77:  */
                     78: typedef u_long bus_addr_t;
                     79: typedef u_long bus_size_t;
                     80:
                     81: /*
                     82:  * Access methods for bus space.
                     83:  */
                     84: typedef struct bus_space *bus_space_tag_t;
                     85: typedef u_long bus_space_handle_t;
                     86:
                     87: /*
                     88:  *     int bus_space_map  (bus_space_tag_t t, bus_addr_t addr,
                     89:  *         bus_size_t size, int flags, bus_space_handle_t *bshp);
                     90:  *
                     91:  * Map a region of bus space.
                     92:  */
                     93:
                     94: #define        BUS_SPACE_MAP_CACHEABLE         0x01
                     95: #define        BUS_SPACE_MAP_LINEAR            0x02
                     96: #define        BUS_SPACE_MAP_PREFETCHABLE      0x04
                     97:
                     98: struct bus_space {
                     99:        /* cookie */
                    100:        void            *bs_cookie;
                    101:
                    102:        /* mapping/unmapping */
                    103:        int             (*bs_map) (void *, bus_addr_t, bus_size_t,
                    104:                            int, bus_space_handle_t *);
                    105:        void            (*bs_unmap) (void *, bus_space_handle_t,
                    106:                            bus_size_t);
                    107:        int             (*bs_subregion) (void *, bus_space_handle_t,
                    108:                            bus_size_t, bus_size_t, bus_space_handle_t *);
                    109:
                    110:        /* allocation/deallocation */
                    111:        int             (*bs_alloc) (void *, bus_addr_t, bus_addr_t,
                    112:                            bus_size_t, bus_size_t, bus_size_t, int,
                    113:                            bus_addr_t *, bus_space_handle_t *);
                    114:        void            (*bs_free) (void *, bus_space_handle_t,
                    115:                            bus_size_t);
                    116:
                    117:        /* get kernel virtual address */
                    118:        void *          (*bs_vaddr) (void *, bus_space_handle_t);
                    119:
                    120:        /* mmap bus space for user */
                    121:        paddr_t         (*bs_mmap) (void *, bus_addr_t, off_t, int, int);
                    122:
                    123:        /* barrier */
                    124:        void            (*bs_barrier) (void *, bus_space_handle_t,
                    125:                            bus_size_t, bus_size_t, int);
                    126:
                    127:        /* read (single) */
                    128:        u_int8_t        (*bs_r_1) (void *, bus_space_handle_t,
                    129:                            bus_size_t);
                    130:        u_int16_t       (*bs_r_2) (void *, bus_space_handle_t,
                    131:                            bus_size_t);
                    132:        u_int32_t       (*bs_r_4) (void *, bus_space_handle_t,
                    133:                            bus_size_t);
                    134:        u_int64_t       (*bs_r_8) (void *, bus_space_handle_t,
                    135:                            bus_size_t);
                    136:
                    137:        /* read multiple */
                    138:        void            (*bs_rm_1) (void *, bus_space_handle_t,
                    139:                            bus_size_t, u_int8_t *, bus_size_t);
                    140:        void            (*bs_rm_2) (void *, bus_space_handle_t,
                    141:                            bus_size_t, u_int16_t *, bus_size_t);
                    142:        void            (*bs_rm_4) (void *, bus_space_handle_t,
                    143:                            bus_size_t, u_int32_t *, bus_size_t);
                    144:        void            (*bs_rm_8) (void *, bus_space_handle_t,
                    145:                            bus_size_t, u_int64_t *, bus_size_t);
                    146:
                    147:        /* read region */
                    148:        void            (*bs_rr_1) (void *, bus_space_handle_t,
                    149:                            bus_size_t, u_int8_t *, bus_size_t);
                    150:        void            (*bs_rr_2) (void *, bus_space_handle_t,
                    151:                            bus_size_t, u_int16_t *, bus_size_t);
                    152:        void            (*bs_rr_4) (void *, bus_space_handle_t,
                    153:                            bus_size_t, u_int32_t *, bus_size_t);
                    154:        void            (*bs_rr_8) (void *, bus_space_handle_t,
                    155:                            bus_size_t, u_int64_t *, bus_size_t);
                    156:
                    157:        /* write (single) */
                    158:        void            (*bs_w_1) (void *, bus_space_handle_t,
                    159:                            bus_size_t, u_int8_t);
                    160:        void            (*bs_w_2) (void *, bus_space_handle_t,
                    161:                            bus_size_t, u_int16_t);
                    162:        void            (*bs_w_4) (void *, bus_space_handle_t,
                    163:                            bus_size_t, u_int32_t);
                    164:        void            (*bs_w_8) (void *, bus_space_handle_t,
                    165:                            bus_size_t, u_int64_t);
                    166:
                    167:        /* write multiple */
                    168:        void            (*bs_wm_1) (void *, bus_space_handle_t,
                    169:                            bus_size_t, const u_int8_t *, bus_size_t);
                    170:        void            (*bs_wm_2) (void *, bus_space_handle_t,
                    171:                            bus_size_t, const u_int16_t *, bus_size_t);
                    172:        void            (*bs_wm_4) (void *, bus_space_handle_t,
                    173:                            bus_size_t, const u_int32_t *, bus_size_t);
                    174:        void            (*bs_wm_8) (void *, bus_space_handle_t,
                    175:                            bus_size_t, const u_int64_t *, bus_size_t);
                    176:
                    177:        /* write region */
                    178:        void            (*bs_wr_1) (void *, bus_space_handle_t,
                    179:                            bus_size_t, const u_int8_t *, bus_size_t);
                    180:        void            (*bs_wr_2) (void *, bus_space_handle_t,
                    181:                            bus_size_t, const u_int16_t *, bus_size_t);
                    182:        void            (*bs_wr_4) (void *, bus_space_handle_t,
                    183:                            bus_size_t, const u_int32_t *, bus_size_t);
                    184:        void            (*bs_wr_8) (void *, bus_space_handle_t,
                    185:                            bus_size_t, const u_int64_t *, bus_size_t);
                    186:
                    187:        /* set multiple */
                    188:        void            (*bs_sm_1) (void *, bus_space_handle_t,
                    189:                            bus_size_t, u_int8_t, bus_size_t);
                    190:        void            (*bs_sm_2) (void *, bus_space_handle_t,
                    191:                            bus_size_t, u_int16_t, bus_size_t);
                    192:        void            (*bs_sm_4) (void *, bus_space_handle_t,
                    193:                            bus_size_t, u_int32_t, bus_size_t);
                    194:        void            (*bs_sm_8) (void *, bus_space_handle_t,
                    195:                            bus_size_t, u_int64_t, bus_size_t);
                    196:
                    197:        /* set region */
                    198:        void            (*bs_sr_1) (void *, bus_space_handle_t,
                    199:                            bus_size_t, u_int8_t, bus_size_t);
                    200:        void            (*bs_sr_2) (void *, bus_space_handle_t,
                    201:                            bus_size_t, u_int16_t, bus_size_t);
                    202:        void            (*bs_sr_4) (void *, bus_space_handle_t,
                    203:                            bus_size_t, u_int32_t, bus_size_t);
                    204:        void            (*bs_sr_8) (void *, bus_space_handle_t,
                    205:                            bus_size_t, u_int64_t, bus_size_t);
                    206:
                    207:        /* copy */
                    208:        void            (*bs_c_1) (void *, bus_space_handle_t, bus_size_t,
                    209:                            bus_space_handle_t, bus_size_t, bus_size_t);
                    210:        void            (*bs_c_2) (void *, bus_space_handle_t, bus_size_t,
                    211:                            bus_space_handle_t, bus_size_t, bus_size_t);
                    212:        void            (*bs_c_4) (void *, bus_space_handle_t, bus_size_t,
                    213:                            bus_space_handle_t, bus_size_t, bus_size_t);
                    214:        void            (*bs_c_8) (void *, bus_space_handle_t, bus_size_t,
                    215:                            bus_space_handle_t, bus_size_t, bus_size_t);
                    216:
                    217: #ifdef __BUS_SPACE_HAS_STREAM_METHODS
                    218:        /* read stream (single) */
                    219:        u_int8_t        (*bs_r_1_s) (void *, bus_space_handle_t,
                    220:                            bus_size_t);
                    221:        u_int16_t       (*bs_r_2_s) (void *, bus_space_handle_t,
                    222:                            bus_size_t);
                    223:        u_int32_t       (*bs_r_4_s) (void *, bus_space_handle_t,
                    224:                            bus_size_t);
                    225:        u_int64_t       (*bs_r_8_s) (void *, bus_space_handle_t,
                    226:                            bus_size_t);
                    227:
                    228:        /* read multiple stream */
                    229:        void            (*bs_rm_1_s) (void *, bus_space_handle_t,
                    230:                            bus_size_t, u_int8_t *, bus_size_t);
                    231:        void            (*bs_rm_2_s) (void *, bus_space_handle_t,
                    232:                            bus_size_t, u_int16_t *, bus_size_t);
                    233:        void            (*bs_rm_4_s) (void *, bus_space_handle_t,
                    234:                            bus_size_t, u_int32_t *, bus_size_t);
                    235:        void            (*bs_rm_8_s) (void *, bus_space_handle_t,
                    236:                            bus_size_t, u_int64_t *, bus_size_t);
                    237:
                    238:        /* read region stream */
                    239:        void            (*bs_rr_1_s) (void *, bus_space_handle_t,
                    240:                            bus_size_t, u_int8_t *, bus_size_t);
                    241:        void            (*bs_rr_2_s) (void *, bus_space_handle_t,
                    242:                            bus_size_t, u_int16_t *, bus_size_t);
                    243:        void            (*bs_rr_4_s) (void *, bus_space_handle_t,
                    244:                            bus_size_t, u_int32_t *, bus_size_t);
                    245:        void            (*bs_rr_8_s) (void *, bus_space_handle_t,
                    246:                            bus_size_t, u_int64_t *, bus_size_t);
                    247:
                    248:        /* write stream (single) */
                    249:        void            (*bs_w_1_s) (void *, bus_space_handle_t,
                    250:                            bus_size_t, u_int8_t);
                    251:        void            (*bs_w_2_s) (void *, bus_space_handle_t,
                    252:                            bus_size_t, u_int16_t);
                    253:        void            (*bs_w_4_s) (void *, bus_space_handle_t,
                    254:                            bus_size_t, u_int32_t);
                    255:        void            (*bs_w_8_s) (void *, bus_space_handle_t,
                    256:                            bus_size_t, u_int64_t);
                    257:
                    258:        /* write multiple stream */
                    259:        void            (*bs_wm_1_s) (void *, bus_space_handle_t,
                    260:                            bus_size_t, const u_int8_t *, bus_size_t);
                    261:        void            (*bs_wm_2_s) (void *, bus_space_handle_t,
                    262:                            bus_size_t, const u_int16_t *, bus_size_t);
                    263:        void            (*bs_wm_4_s) (void *, bus_space_handle_t,
                    264:                            bus_size_t, const u_int32_t *, bus_size_t);
                    265:        void            (*bs_wm_8_s) (void *, bus_space_handle_t,
                    266:                            bus_size_t, const u_int64_t *, bus_size_t);
                    267:
                    268:        /* write region stream */
                    269:        void            (*bs_wr_1_s) (void *, bus_space_handle_t,
                    270:                            bus_size_t, const u_int8_t *, bus_size_t);
                    271:        void            (*bs_wr_2_s) (void *, bus_space_handle_t,
                    272:                            bus_size_t, const u_int16_t *, bus_size_t);
                    273:        void            (*bs_wr_4_s) (void *, bus_space_handle_t,
                    274:                            bus_size_t, const u_int32_t *, bus_size_t);
                    275:        void            (*bs_wr_8_s) (void *, bus_space_handle_t,
                    276:                            bus_size_t, const u_int64_t *, bus_size_t);
                    277: #endif /* __BUS_SPACE_HAS_STREAM_METHODS */
                    278: };
                    279:
                    280:
                    281: /*
                    282:  * Utility macros; INTERNAL USE ONLY.
                    283:  */
                    284: #define        __bs_c(a,b)             __CONCAT(a,b)
                    285: #define        __bs_opname(op,size)    __bs_c(__bs_c(__bs_c(bs_,op),_),size)
                    286:
                    287: #define        __bs_rs(sz, t, h, o)                                            \
                    288:        (*(t)->__bs_opname(r,sz))((t)->bs_cookie, h, o)
                    289: #define        __bs_ws(sz, t, h, o, v)                                         \
                    290:        (*(t)->__bs_opname(w,sz))((t)->bs_cookie, h, o, v)
                    291: #define        __bs_nonsingle(type, sz, t, h, o, a, c)                         \
                    292:        (*(t)->__bs_opname(type,sz))((t)->bs_cookie, h, o, a, c)
                    293: #define        __bs_set(type, sz, t, h, o, v, c)                               \
                    294:        (*(t)->__bs_opname(type,sz))((t)->bs_cookie, h, o, v, c)
                    295: #define        __bs_copy(sz, t, h1, o1, h2, o2, cnt)                           \
                    296:        (*(t)->__bs_opname(c,sz))((t)->bs_cookie, h1, o1, h2, o2, cnt)
                    297:
                    298: #ifdef __BUS_SPACE_HAS_STREAM_METHODS
                    299: #define        __bs_opname_s(op,size)  __bs_c(__bs_c(__bs_c(__bs_c(bs_,op),_),size),_s)
                    300: #define        __bs_rs_s(sz, t, h, o)                                          \
                    301:        (*(t)->__bs_opname_s(r,sz))((t)->bs_cookie, h, o)
                    302: #define        __bs_ws_s(sz, t, h, o, v)                                       \
                    303:        (*(t)->__bs_opname_s(w,sz))((t)->bs_cookie, h, o, v)
                    304: #define        __bs_nonsingle_s(type, sz, t, h, o, a, c)                       \
                    305:        (*(t)->__bs_opname_s(type,sz))((t)->bs_cookie, h, o, a, c)
                    306: #define        __bs_set_s(type, sz, t, h, o, v, c)                             \
                    307:        (*(t)->__bs_opname_s(type,sz))((t)->bs_cookie, h, o, v, c)
                    308: #define        __bs_copy_s(sz, t, h1, o1, h2, o2, cnt)                         \
                    309:        (*(t)->__bs_opname_s(c,sz))((t)->bs_cookie, h1, o1, h2, o2, cnt)
                    310: #endif
                    311:
                    312: /*
                    313:  * Mapping and unmapping operations.
                    314:  */
                    315: #define        bus_space_map(t, a, s, c, hp)                                   \
                    316:        (*(t)->bs_map)((t)->bs_cookie, (a), (s), (c), (hp))
                    317: #define        bus_space_unmap(t, h, s)                                        \
                    318:        (*(t)->bs_unmap)((t)->bs_cookie, (h), (s))
                    319: #define        bus_space_subregion(t, h, o, s, hp)                             \
                    320:        (*(t)->bs_subregion)((t)->bs_cookie, (h), (o), (s), (hp))
                    321:
                    322:
                    323: /*
                    324:  * Allocation and deallocation operations.
                    325:  */
                    326: #define        bus_space_alloc(t, rs, re, s, a, b, c, ap, hp)                  \
                    327:        (*(t)->bs_alloc)((t)->bs_cookie, (rs), (re), (s), (a), (b),     \
                    328:            (c), (ap), (hp))
                    329: #define        bus_space_free(t, h, s)                                         \
                    330:        (*(t)->bs_free)((t)->bs_cookie, (h), (s))
                    331:
                    332: /*
                    333:  * Get kernel virtual address for ranges mapped BUS_SPACE_MAP_LINEAR.
                    334:  */
                    335: #define        bus_space_vaddr(t, h)                                           \
                    336:        (*(t)->bs_vaddr)((t)->bs_cookie, (h))
                    337:
                    338: /*
                    339:  * MMap bus space for a user application.
                    340:  */
                    341: #define bus_space_mmap(t, a, o, p, f)                                  \
                    342:        (*(t)->bs_mmap)((t)->bs_cookie, (a), (o), (p), (f))
                    343:
                    344: /*
                    345:  * Bus barrier operations.
                    346:  */
                    347: #define        bus_space_barrier(t, h, o, l, f)                                \
                    348:        (*(t)->bs_barrier)((t)->bs_cookie, (h), (o), (l), (f))
                    349:
                    350: #define        BUS_SPACE_BARRIER_READ  0x01
                    351: #define        BUS_SPACE_BARRIER_WRITE 0x02
                    352:
                    353: /*
                    354:  * Bus read (single) operations.
                    355:  */
                    356: #define        bus_space_read_1(t, h, o)       __bs_rs(1,(t),(h),(o))
                    357: #define        bus_space_read_2(t, h, o)       __bs_rs(2,(t),(h),(o))
                    358: #define        bus_space_read_4(t, h, o)       __bs_rs(4,(t),(h),(o))
                    359: #define        bus_space_read_8(t, h, o)       __bs_rs(8,(t),(h),(o))
                    360: #ifdef __BUS_SPACE_HAS_STREAM_METHODS
                    361: #define        bus_space_read_stream_1(t, h, o)        __bs_rs_s(1,(t),(h),(o))
                    362: #define        bus_space_read_stream_2(t, h, o)        __bs_rs_s(2,(t),(h),(o))
                    363: #define        bus_space_read_stream_4(t, h, o)        __bs_rs_s(4,(t),(h),(o))
                    364: #define        bus_space_read_stream_8(t, h, o)        __bs_rs_s(8,(t),(h),(o))
                    365: #endif
                    366:
                    367:
                    368: /*
                    369:  * Bus read multiple operations.
                    370:  */
                    371: #define        bus_space_read_multi_1(t, h, o, a, c)                           \
                    372:        __bs_nonsingle(rm,1,(t),(h),(o),(a),(c))
                    373: #define        bus_space_read_multi_2(t, h, o, a, c)                           \
                    374:        __bs_nonsingle(rm,2,(t),(h),(o),(a),(c))
                    375: #define        bus_space_read_multi_4(t, h, o, a, c)                           \
                    376:        __bs_nonsingle(rm,4,(t),(h),(o),(a),(c))
                    377: #define        bus_space_read_multi_8(t, h, o, a, c)                           \
                    378:        __bs_nonsingle(rm,8,(t),(h),(o),(a),(c))
                    379: #ifdef __BUS_SPACE_HAS_STREAM_METHODS
                    380: #define        bus_space_read_multi_stream_1(t, h, o, a, c)                    \
                    381:        __bs_nonsingle_s(rm,1,(t),(h),(o),(a),(c))
                    382: #define        bus_space_read_multi_stream_2(t, h, o, a, c)                    \
                    383:        __bs_nonsingle_s(rm,2,(t),(h),(o),(a),(c))
                    384: #define        bus_space_read_multi_stream_4(t, h, o, a, c)                    \
                    385:        __bs_nonsingle_s(rm,4,(t),(h),(o),(a),(c))
                    386: #define        bus_space_read_multi_stream_8(t, h, o, a, c)                    \
                    387:        __bs_nonsingle_s(rm,8,(t),(h),(o),(a),(c))
                    388: #endif
                    389:
                    390:
                    391: /*
                    392:  * Bus read region operations.
                    393:  */
                    394: #define        bus_space_read_region_1(t, h, o, a, c)                          \
                    395:        __bs_nonsingle(rr,1,(t),(h),(o),(a),(c))
                    396: #define        bus_space_read_region_2(t, h, o, a, c)                          \
                    397:        __bs_nonsingle(rr,2,(t),(h),(o),(a),(c))
                    398: #define        bus_space_read_region_4(t, h, o, a, c)                          \
                    399:        __bs_nonsingle(rr,4,(t),(h),(o),(a),(c))
                    400: #define        bus_space_read_region_8(t, h, o, a, c)                          \
                    401:        __bs_nonsingle(rr,8,(t),(h),(o),(a),(c))
                    402: #ifdef __BUS_SPACE_HAS_STREAM_METHODS
                    403: #define        bus_space_read_region_stream_1(t, h, o, a, c)                   \
                    404:        __bs_nonsingle_s(rr,1,(t),(h),(o),(a),(c))
                    405: #define        bus_space_read_region_stream_2(t, h, o, a, c)                   \
                    406:        __bs_nonsingle_s(rr,2,(t),(h),(o),(a),(c))
                    407: #define        bus_space_read_region_stream_4(t, h, o, a, c)                   \
                    408:        __bs_nonsingle_s(rr,4,(t),(h),(o),(a),(c))
                    409: #define        bus_space_read_region_stream_8(t, h, o, a, c)                   \
                    410:        __bs_nonsingle_s(rr,8,(t),(h),(o),(a),(c))
                    411: #endif
                    412:
                    413:
                    414: /*
                    415:  * Bus write (single) operations.
                    416:  */
                    417: #define        bus_space_write_1(t, h, o, v)   __bs_ws(1,(t),(h),(o),(v))
                    418: #define        bus_space_write_2(t, h, o, v)   __bs_ws(2,(t),(h),(o),(v))
                    419: #define        bus_space_write_4(t, h, o, v)   __bs_ws(4,(t),(h),(o),(v))
                    420: #define        bus_space_write_8(t, h, o, v)   __bs_ws(8,(t),(h),(o),(v))
                    421: #ifdef __BUS_SPACE_HAS_STREAM_METHODS
                    422: #define        bus_space_write_stream_1(t, h, o, v)    __bs_ws_s(1,(t),(h),(o),(v))
                    423: #define        bus_space_write_stream_2(t, h, o, v)    __bs_ws_s(2,(t),(h),(o),(v))
                    424: #define        bus_space_write_stream_4(t, h, o, v)    __bs_ws_s(4,(t),(h),(o),(v))
                    425: #define        bus_space_write_stream_8(t, h, o, v)    __bs_ws_s(8,(t),(h),(o),(v))
                    426: #endif
                    427:
                    428:
                    429: /*
                    430:  * Bus write multiple operations.
                    431:  */
                    432: #define        bus_space_write_multi_1(t, h, o, a, c)                          \
                    433:        __bs_nonsingle(wm,1,(t),(h),(o),(a),(c))
                    434: #define        bus_space_write_multi_2(t, h, o, a, c)                          \
                    435:        __bs_nonsingle(wm,2,(t),(h),(o),(a),(c))
                    436: #define        bus_space_write_multi_4(t, h, o, a, c)                          \
                    437:        __bs_nonsingle(wm,4,(t),(h),(o),(a),(c))
                    438: #define        bus_space_write_multi_8(t, h, o, a, c)                          \
                    439:        __bs_nonsingle(wm,8,(t),(h),(o),(a),(c))
                    440: #ifdef __BUS_SPACE_HAS_STREAM_METHODS
                    441: #define        bus_space_write_multi_stream_1(t, h, o, a, c)                   \
                    442:        __bs_nonsingle_s(wm,1,(t),(h),(o),(a),(c))
                    443: #define        bus_space_write_multi_stream_2(t, h, o, a, c)                   \
                    444:        __bs_nonsingle_s(wm,2,(t),(h),(o),(a),(c))
                    445: #define        bus_space_write_multi_stream_4(t, h, o, a, c)                   \
                    446:        __bs_nonsingle_s(wm,4,(t),(h),(o),(a),(c))
                    447: #define        bus_space_write_multi_stream_8(t, h, o, a, c)                   \
                    448:        __bs_nonsingle_s(wm,8,(t),(h),(o),(a),(c))
                    449: #endif
                    450:
                    451:
                    452: /*
                    453:  * Bus write region operations.
                    454:  */
                    455: #define        bus_space_write_region_1(t, h, o, a, c)                         \
                    456:        __bs_nonsingle(wr,1,(t),(h),(o),(a),(c))
                    457: #define        bus_space_write_region_2(t, h, o, a, c)                         \
                    458:        __bs_nonsingle(wr,2,(t),(h),(o),(a),(c))
                    459: #define        bus_space_write_region_4(t, h, o, a, c)                         \
                    460:        __bs_nonsingle(wr,4,(t),(h),(o),(a),(c))
                    461: #define        bus_space_write_region_8(t, h, o, a, c)                         \
                    462:        __bs_nonsingle(wr,8,(t),(h),(o),(a),(c))
                    463: #ifdef __BUS_SPACE_HAS_STREAM_METHODS
                    464: #define        bus_space_write_region_stream_1(t, h, o, a, c)                  \
                    465:        __bs_nonsingle_s(wr,1,(t),(h),(o),(a),(c))
                    466: #define        bus_space_write_region_stream_2(t, h, o, a, c)                  \
                    467:        __bs_nonsingle_s(wr,2,(t),(h),(o),(a),(c))
                    468: #define        bus_space_write_region_stream_4(t, h, o, a, c)                  \
                    469:        __bs_nonsingle_s(wr,4,(t),(h),(o),(a),(c))
                    470: #define        bus_space_write_region_stream_8(t, h, o, a, c)                  \
                    471:        __bs_nonsingle_s(wr,8,(t),(h),(o),(a),(c))
                    472: #endif
                    473:
                    474:
                    475: /*
                    476:  * Set multiple operations.
                    477:  */
                    478: #define        bus_space_set_multi_1(t, h, o, v, c)                            \
                    479:        __bs_set(sm,1,(t),(h),(o),(v),(c))
                    480: #define        bus_space_set_multi_2(t, h, o, v, c)                            \
                    481:        __bs_set(sm,2,(t),(h),(o),(v),(c))
                    482: #define        bus_space_set_multi_4(t, h, o, v, c)                            \
                    483:        __bs_set(sm,4,(t),(h),(o),(v),(c))
                    484: #define        bus_space_set_multi_8(t, h, o, v, c)                            \
                    485:        __bs_set(sm,8,(t),(h),(o),(v),(c))
                    486:
                    487: /*
                    488:  * Set region operations.
                    489:  */
                    490: #define        bus_space_set_region_1(t, h, o, v, c)                           \
                    491:        __bs_set(sr,1,(t),(h),(o),(v),(c))
                    492: #define        bus_space_set_region_2(t, h, o, v, c)                           \
                    493:        __bs_set(sr,2,(t),(h),(o),(v),(c))
                    494: #define        bus_space_set_region_4(t, h, o, v, c)                           \
                    495:        __bs_set(sr,4,(t),(h),(o),(v),(c))
                    496: #define        bus_space_set_region_8(t, h, o, v, c)                           \
                    497:        __bs_set(sr,8,(t),(h),(o),(v),(c))
                    498:
                    499: /*
                    500:  * Copy operations.
                    501:  */
                    502: #define        bus_space_copy_region_1(t, h1, o1, h2, o2, c)                           \
                    503:        __bs_copy(1, t, h1, o1, h2, o2, c)
                    504: #define        bus_space_copy_region_2(t, h1, o1, h2, o2, c)                           \
                    505:        __bs_copy(2, t, h1, o1, h2, o2, c)
                    506: #define        bus_space_copy_region_4(t, h1, o1, h2, o2, c)                           \
                    507:        __bs_copy(4, t, h1, o1, h2, o2, c)
                    508: #define        bus_space_copy_region_8(t, h1, o1, h2, o2, c)                           \
                    509:        __bs_copy(8, t, h1, o1, h2, o2, c)
                    510:
                    511: void
                    512: bus_space_copy_1(bus_space_tag_t bst, bus_space_handle_t h1,
                    513:     bus_space_handle_t h2, bus_size_t o1, bus_size_t o2, bus_size_t c);
                    514: void
                    515: bus_space_copy_2(bus_space_tag_t bst, bus_space_handle_t h1,
                    516:      bus_space_handle_t h2, bus_size_t o1, bus_size_t o2, bus_size_t c);
                    517: void
                    518: bus_space_copy_4(bus_space_tag_t bst, bus_space_handle_t h1,
                    519:      bus_space_handle_t h2, bus_size_t o1, bus_size_t o2, bus_size_t c);
                    520: #define        bus_space_copy_8 \
                    521:     !!! bus_space_write_raw_multi_8 not implemented !!!
                    522:
                    523: /*
                    524:  * Macros to provide prototypes for all the functions used in the
                    525:  * bus_space structure
                    526:  */
                    527:
                    528: #define bs_map_proto(f)                                                        \
                    529: int    __bs_c(f,_bs_map) (void *t, bus_addr_t addr,            \
                    530:            bus_size_t size, int cacheable, bus_space_handle_t *bshp);
                    531:
                    532: #define bs_unmap_proto(f)                                              \
                    533: void   __bs_c(f,_bs_unmap) (void *t, bus_space_handle_t bsh,   \
                    534:            bus_size_t size);
                    535:
                    536: #define bs_subregion_proto(f)                                          \
                    537: int    __bs_c(f,_bs_subregion) (void *t, bus_space_handle_t bsh,       \
                    538:            bus_size_t offset, bus_size_t size,                         \
                    539:            bus_space_handle_t *nbshp);
                    540:
                    541: #define bs_alloc_proto(f)                                              \
                    542: int    __bs_c(f,_bs_alloc) (void *t, bus_addr_t rstart,                \
                    543:            bus_addr_t rend, bus_size_t size, bus_size_t align,         \
                    544:            bus_size_t boundary, int cacheable, bus_addr_t *addrp,      \
                    545:            bus_space_handle_t *bshp);
                    546:
                    547: #define bs_free_proto(f)                                               \
                    548: void   __bs_c(f,_bs_free) (void *t, bus_space_handle_t bsh,    \
                    549:            bus_size_t size);
                    550:
                    551: #define bs_vaddr_proto(f)                                              \
                    552: void * __bs_c(f,_bs_vaddr) (void *t, bus_space_handle_t bsh);
                    553:
                    554: #define bs_mmap_proto(f)                                               \
                    555: paddr_t        __bs_c(f,_bs_mmap) (void *, bus_addr_t, off_t, int, int);
                    556:
                    557: #define bs_barrier_proto(f)                                            \
                    558: void   __bs_c(f,_bs_barrier) (void *t, bus_space_handle_t bsh, \
                    559:            bus_size_t offset, bus_size_t len, int flags);
                    560:
                    561: #define        bs_r_1_proto(f)                                                 \
                    562: u_int8_t       __bs_c(f,_bs_r_1) (void *t, bus_space_handle_t bsh,     \
                    563:                    bus_size_t offset);
                    564:
                    565: #define        bs_r_2_proto(f)                                                 \
                    566: u_int16_t      __bs_c(f,_bs_r_2) (void *t, bus_space_handle_t bsh,     \
                    567:                    bus_size_t offset);
                    568:
                    569: #define        bs_r_4_proto(f)                                                 \
                    570: u_int32_t      __bs_c(f,_bs_r_4) (void *t, bus_space_handle_t bsh,     \
                    571:                    bus_size_t offset);
                    572:
                    573: #define        bs_r_8_proto(f)                                                 \
                    574: u_int64_t      __bs_c(f,_bs_r_8) (void *t, bus_space_handle_t bsh,     \
                    575:                    bus_size_t offset);
                    576:
                    577: #define        bs_w_1_proto(f)                                                 \
                    578: void   __bs_c(f,_bs_w_1) (void *t, bus_space_handle_t bsh,             \
                    579:            bus_size_t offset, u_int8_t value);
                    580:
                    581: #define        bs_w_2_proto(f)                                                 \
                    582: void   __bs_c(f,_bs_w_2) (void *t, bus_space_handle_t bsh,             \
                    583:            bus_size_t offset, u_int16_t value);
                    584:
                    585: #define        bs_w_4_proto(f)                                                 \
                    586: void   __bs_c(f,_bs_w_4) (void *t, bus_space_handle_t bsh,             \
                    587:            bus_size_t offset, u_int32_t value);
                    588:
                    589: #define        bs_w_8_proto(f)                                                 \
                    590: void   __bs_c(f,_bs_w_8) (void *t, bus_space_handle_t bsh,             \
                    591:            bus_size_t offset, u_int64_t value);
                    592:
                    593: #define        bs_rm_1_proto(f)                                                \
                    594: void   __bs_c(f,_bs_rm_1) (void *t, bus_space_handle_t bsh,    \
                    595:            bus_size_t offset, u_int8_t *addr, bus_size_t count);
                    596:
                    597: #define        bs_rm_2_proto(f)                                                \
                    598: void   __bs_c(f,_bs_rm_2) (void *t, bus_space_handle_t bsh,    \
                    599:            bus_size_t offset, u_int16_t *addr, bus_size_t count);
                    600:
                    601: #define        bs_rm_4_proto(f)                                                \
                    602: void   __bs_c(f,_bs_rm_4) (void *t, bus_space_handle_t bsh,    \
                    603:            bus_size_t offset, u_int32_t *addr, bus_size_t count);
                    604:
                    605: #define        bs_rm_8_proto(f)                                                \
                    606: void   __bs_c(f,_bs_rm_8) (void *t, bus_space_handle_t bsh,    \
                    607:            bus_size_t offset, u_int64_t *addr, bus_size_t count);
                    608:
                    609: #define        bs_wm_1_proto(f)                                                \
                    610: void   __bs_c(f,_bs_wm_1) (void *t, bus_space_handle_t bsh,    \
                    611:            bus_size_t offset, const u_int8_t *addr, bus_size_t count);
                    612:
                    613: #define        bs_wm_2_proto(f)                                                \
                    614: void   __bs_c(f,_bs_wm_2) (void *t, bus_space_handle_t bsh,    \
                    615:            bus_size_t offset, const u_int16_t *addr, bus_size_t count);
                    616:
                    617: #define        bs_wm_4_proto(f)                                                \
                    618: void   __bs_c(f,_bs_wm_4) (void *t, bus_space_handle_t bsh,    \
                    619:            bus_size_t offset, const u_int32_t *addr, bus_size_t count);
                    620:
                    621: #define        bs_wm_8_proto(f)                                                \
                    622: void   __bs_c(f,_bs_wm_8) (void *t, bus_space_handle_t bsh,    \
                    623:            bus_size_t offset, const u_int64_t *addr, bus_size_t count);
                    624:
                    625: #define        bs_rr_1_proto(f)                                                \
                    626: void   __bs_c(f, _bs_rr_1) (void *t, bus_space_handle_t bsh,   \
                    627:            bus_size_t offset, u_int8_t *addr, bus_size_t count);
                    628:
                    629: #define        bs_rr_2_proto(f)                                                \
                    630: void   __bs_c(f, _bs_rr_2) (void *t, bus_space_handle_t bsh,   \
                    631:            bus_size_t offset, u_int16_t *addr, bus_size_t count);
                    632:
                    633: #define        bs_rr_4_proto(f)                                                \
                    634: void   __bs_c(f, _bs_rr_4) (void *t, bus_space_handle_t bsh,   \
                    635:            bus_size_t offset, u_int32_t *addr, bus_size_t count);
                    636:
                    637: #define        bs_rr_8_proto(f)                                                \
                    638: void   __bs_c(f, _bs_rr_8) (void *t, bus_space_handle_t bsh,   \
                    639:            bus_size_t offset, u_int64_t *addr, bus_size_t count);
                    640:
                    641: #define        bs_wr_1_proto(f)                                                \
                    642: void   __bs_c(f, _bs_wr_1) (void *t, bus_space_handle_t bsh,   \
                    643:            bus_size_t offset, const u_int8_t *addr, bus_size_t count);
                    644:
                    645: #define        bs_wr_2_proto(f)                                                \
                    646: void   __bs_c(f, _bs_wr_2) (void *t, bus_space_handle_t bsh,   \
                    647:            bus_size_t offset, const u_int16_t *addr, bus_size_t count);
                    648:
                    649: #define        bs_wr_4_proto(f)                                                \
                    650: void   __bs_c(f, _bs_wr_4) (void *t, bus_space_handle_t bsh,   \
                    651:            bus_size_t offset, const u_int32_t *addr, bus_size_t count);
                    652:
                    653: #define        bs_wr_8_proto(f)                                                \
                    654: void   __bs_c(f, _bs_wr_8) (void *t, bus_space_handle_t bsh,   \
                    655:            bus_size_t offset, const u_int64_t *addr, bus_size_t count);
                    656:
                    657: #define        bs_sm_1_proto(f)                                                \
                    658: void   __bs_c(f,_bs_sm_1) (void *t, bus_space_handle_t bsh,    \
                    659:            bus_size_t offset, u_int8_t value, bus_size_t count);
                    660:
                    661: #define        bs_sm_2_proto(f)                                                \
                    662: void   __bs_c(f,_bs_sm_2) (void *t, bus_space_handle_t bsh,    \
                    663:            bus_size_t offset, u_int16_t value, bus_size_t count);
                    664:
                    665: #define        bs_sm_4_proto(f)                                                \
                    666: void   __bs_c(f,_bs_sm_4) (void *t, bus_space_handle_t bsh,    \
                    667:            bus_size_t offset, u_int32_t value, bus_size_t count);
                    668:
                    669: #define        bs_sm_8_proto(f)                                                \
                    670: void   __bs_c(f,_bs_sm_8) (void *t, bus_space_handle_t bsh,    \
                    671:            bus_size_t offset, u_int64_t value, bus_size_t count);
                    672:
                    673: #define        bs_sr_1_proto(f)                                                \
                    674: void   __bs_c(f,_bs_sr_1) (void *t, bus_space_handle_t bsh,    \
                    675:            bus_size_t offset, u_int8_t value, bus_size_t count);
                    676:
                    677: #define        bs_sr_2_proto(f)                                                \
                    678: void   __bs_c(f,_bs_sr_2) (void *t, bus_space_handle_t bsh,    \
                    679:            bus_size_t offset, u_int16_t value, bus_size_t count);
                    680:
                    681: #define        bs_sr_4_proto(f)                                                \
                    682: void   __bs_c(f,_bs_sr_4) (void *t, bus_space_handle_t bsh,    \
                    683:            bus_size_t offset, u_int32_t value, bus_size_t count);
                    684:
                    685: #define        bs_sr_8_proto(f)                                                \
                    686: void   __bs_c(f,_bs_sr_8) (void *t, bus_space_handle_t bsh,    \
                    687:            bus_size_t offset, u_int64_t value, bus_size_t count);
                    688:
                    689: #define        bs_c_1_proto(f)                                                 \
                    690: void   __bs_c(f,_bs_c_1) (void *t, bus_space_handle_t bsh1,    \
                    691:            bus_size_t offset1, bus_space_handle_t bsh2,                \
                    692:            bus_size_t offset2, bus_size_t count);
                    693:
                    694: #define        bs_c_2_proto(f)                                                 \
                    695: void   __bs_c(f,_bs_c_2) (void *t, bus_space_handle_t bsh1,    \
                    696:            bus_size_t offset1, bus_space_handle_t bsh2,                \
                    697:            bus_size_t offset2, bus_size_t count);
                    698:
                    699: #define        bs_c_4_proto(f)                                                 \
                    700: void   __bs_c(f,_bs_c_4) (void *t, bus_space_handle_t bsh1,    \
                    701:            bus_size_t offset1, bus_space_handle_t bsh2,                \
                    702:            bus_size_t offset2, bus_size_t count);
                    703:
                    704: #define        bs_c_8_proto(f)                                                 \
                    705: void   __bs_c(f,_bs_c_8) (void *t, bus_space_handle_t bsh1,    \
                    706:            bus_size_t offset1, bus_space_handle_t bsh2,                \
                    707:            bus_size_t offset2, bus_size_t count);
                    708:
                    709: #define bs_protos(f)           \
                    710: bs_map_proto(f);               \
                    711: bs_unmap_proto(f);             \
                    712: bs_subregion_proto(f);         \
                    713: bs_alloc_proto(f);             \
                    714: bs_free_proto(f);              \
                    715: bs_vaddr_proto(f);             \
                    716: bs_mmap_proto(f);              \
                    717: bs_barrier_proto(f);           \
                    718: bs_r_1_proto(f);               \
                    719: bs_r_2_proto(f);               \
                    720: bs_r_4_proto(f);               \
                    721: bs_r_8_proto(f);               \
                    722: bs_w_1_proto(f);               \
                    723: bs_w_2_proto(f);               \
                    724: bs_w_4_proto(f);               \
                    725: bs_w_8_proto(f);               \
                    726: bs_rm_1_proto(f);              \
                    727: bs_rm_2_proto(f);              \
                    728: bs_rm_4_proto(f);              \
                    729: bs_rm_8_proto(f);              \
                    730: bs_wm_1_proto(f);              \
                    731: bs_wm_2_proto(f);              \
                    732: bs_wm_4_proto(f);              \
                    733: bs_wm_8_proto(f);              \
                    734: bs_rr_1_proto(f);              \
                    735: bs_rr_2_proto(f);              \
                    736: bs_rr_4_proto(f);              \
                    737: bs_rr_8_proto(f);              \
                    738: bs_wr_1_proto(f);              \
                    739: bs_wr_2_proto(f);              \
                    740: bs_wr_4_proto(f);              \
                    741: bs_wr_8_proto(f);              \
                    742: bs_sm_1_proto(f);              \
                    743: bs_sm_2_proto(f);              \
                    744: bs_sm_4_proto(f);              \
                    745: bs_sm_8_proto(f);              \
                    746: bs_sr_1_proto(f);              \
                    747: bs_sr_2_proto(f);              \
                    748: bs_sr_4_proto(f);              \
                    749: bs_sr_8_proto(f);              \
                    750: bs_c_1_proto(f);               \
                    751: bs_c_2_proto(f);               \
                    752: bs_c_4_proto(f);               \
                    753: bs_c_8_proto(f);
                    754:
                    755: /* Bus Space DMA macros */
                    756:
                    757: /*
                    758:  * Flags used in various bus DMA methods.
                    759:  */
                    760: #define        BUS_DMA_WAITOK          0x000   /* safe to sleep (pseudo-flag) */
                    761: #define        BUS_DMA_NOWAIT          0x001   /* not safe to sleep */
                    762: #define        BUS_DMA_ALLOCNOW        0x002   /* perform resource allocation now */
                    763: #define        BUS_DMA_COHERENT        0x004   /* hint: map memory DMA coherent */
                    764: #define        BUS_DMA_STREAMING       0x008   /* hint: sequential, unidirectional */
                    765: #define        BUS_DMA_BUS1            0x010   /* placeholders for bus functions... */
                    766: #define        BUS_DMA_BUS2            0x020
                    767: #define        BUS_DMA_BUS3            0x040
                    768: #define        BUS_DMA_BUS4            0x080
                    769: #define        BUS_DMA_READ            0x100   /* mapping is device -> memory only */
                    770: #define        BUS_DMA_WRITE           0x200   /* mapping is memory -> device only */
                    771: #define        BUS_DMA_NOCACHE         0x400   /* hint: map non-cached memory */
                    772:
                    773: /*
                    774:  * Private flags stored in the DMA map.
                    775:  */
                    776: #define        ARM32_DMAMAP_COHERENT   0x10000 /* no cache flush necessary on sync */
                    777:
                    778: /* Forwards needed by prototypes below. */
                    779: struct mbuf;
                    780: struct uio;
                    781:
                    782: /*
                    783:  * Operations performed by bus_dmamap_sync().
                    784:  */
                    785: #define        BUS_DMASYNC_PREREAD     0x01    /* pre-read synchronization */
                    786: #define        BUS_DMASYNC_POSTREAD    0x02    /* post-read synchronization */
                    787: #define        BUS_DMASYNC_PREWRITE    0x04    /* pre-write synchronization */
                    788: #define        BUS_DMASYNC_POSTWRITE   0x08    /* post-write synchronization */
                    789:
                    790: typedef struct arm32_bus_dma_tag       *bus_dma_tag_t;
                    791: typedef struct arm32_bus_dmamap                *bus_dmamap_t;
                    792:
                    793: #define BUS_DMA_TAG_VALID(t)    ((t) != (bus_dma_tag_t)0)
                    794:
                    795: /*
                    796:  *     bus_dma_segment_t
                    797:  *
                    798:  *     Describes a single contiguous DMA transaction.  Values
                    799:  *     are suitable for programming into DMA registers.
                    800:  */
                    801: struct arm32_bus_dma_segment {
                    802:        /*
                    803:         * PUBLIC MEMBERS: these are used by machine-independent code.
                    804:         */
                    805:        bus_addr_t      ds_addr;        /* DMA address */
                    806:        bus_size_t      ds_len;         /* length of transfer */
                    807:        /*
                    808:         * PRIVATE MEMBERS: not for use by machine-independent code.
                    809:         */
                    810:        bus_addr_t      _ds_vaddr;      /* Virtual mapped address
                    811:                                         * Used by bus_dmamem_sync() */
                    812: };
                    813: typedef struct arm32_bus_dma_segment   bus_dma_segment_t;
                    814:
                    815: /*
                    816:  *     arm32_dma_range
                    817:  *
                    818:  *     This structure describes a valid DMA range.
                    819:  */
                    820: struct arm32_dma_range {
                    821:        bus_addr_t      dr_sysbase;     /* system base address */
                    822:        bus_addr_t      dr_busbase;     /* appears here on bus */
                    823:        bus_size_t      dr_len;         /* length of range */
                    824: };
                    825:
                    826: /*
                    827:  *     bus_dma_tag_t
                    828:  *
                    829:  *     A machine-dependent opaque type describing the implementation of
                    830:  *     DMA for a given bus.
                    831:  */
                    832:
                    833: struct arm32_bus_dma_tag {
                    834:        /*
                    835:         * DMA range for this tag.  If the page doesn't fall within
                    836:         * one of these ranges, an error is returned.  The caller
                    837:         * may then decide what to do with the transfer.  If the
                    838:         * range pointer is NULL, it is ignored.
                    839:         */
                    840:        struct arm32_dma_range *_ranges;
                    841:        int _nranges;
                    842:
                    843:        /*
                    844:         * Opaque cookie for use by back-end.
                    845:         */
                    846:        void *_cookie;
                    847:
                    848:        /*
                    849:         * DMA mapping methods.
                    850:         */
                    851:        int     (*_dmamap_create) (bus_dma_tag_t, bus_size_t, int,
                    852:                    bus_size_t, bus_size_t, int, bus_dmamap_t *);
                    853:        void    (*_dmamap_destroy) (bus_dma_tag_t, bus_dmamap_t);
                    854:        int     (*_dmamap_load) (bus_dma_tag_t, bus_dmamap_t, void *,
                    855:                    bus_size_t, struct proc *, int);
                    856:        int     (*_dmamap_load_mbuf) (bus_dma_tag_t, bus_dmamap_t,
                    857:                    struct mbuf *, int);
                    858:        int     (*_dmamap_load_uio) (bus_dma_tag_t, bus_dmamap_t,
                    859:                    struct uio *, int);
                    860:        int     (*_dmamap_load_raw) (bus_dma_tag_t, bus_dmamap_t,
                    861:                    bus_dma_segment_t *, int, bus_size_t, int);
                    862:        void    (*_dmamap_unload) (bus_dma_tag_t, bus_dmamap_t);
                    863:        void    (*_dmamap_sync) (bus_dma_tag_t, bus_dmamap_t,
                    864:                    bus_addr_t, bus_size_t, int);
                    865:
                    866:        /*
                    867:         * DMA memory utility functions.
                    868:         */
                    869:        int     (*_dmamem_alloc) (bus_dma_tag_t, bus_size_t, bus_size_t,
                    870:                    bus_size_t, bus_dma_segment_t *, int, int *, int);
                    871:        void    (*_dmamem_free) (bus_dma_tag_t,
                    872:                    bus_dma_segment_t *, int);
                    873:        int     (*_dmamem_map) (bus_dma_tag_t, bus_dma_segment_t *,
                    874:                    int, size_t, caddr_t *, int);
                    875:        void    (*_dmamem_unmap) (bus_dma_tag_t, caddr_t, size_t);
                    876:        paddr_t (*_dmamem_mmap) (bus_dma_tag_t, bus_dma_segment_t *,
                    877:                    int, off_t, int, int);
                    878: };
                    879:
                    880: #define        bus_dmamap_create(t, s, n, m, b, f, p)                  \
                    881:        (*(t)->_dmamap_create)((t), (s), (n), (m), (b), (f), (p))
                    882: #define        bus_dmamap_destroy(t, p)                                \
                    883:        (*(t)->_dmamap_destroy)((t), (p))
                    884: #define        bus_dmamap_load(t, m, b, s, p, f)                       \
                    885:        (*(t)->_dmamap_load)((t), (m), (b), (s), (p), (f))
                    886: #define        bus_dmamap_load_mbuf(t, m, b, f)                        \
                    887:        (*(t)->_dmamap_load_mbuf)((t), (m), (b), (f))
                    888: #define        bus_dmamap_load_uio(t, m, u, f)                         \
                    889:        (*(t)->_dmamap_load_uio)((t), (m), (u), (f))
                    890: #define        bus_dmamap_load_raw(t, m, sg, n, s, f)                  \
                    891:        (*(t)->_dmamap_load_raw)((t), (m), (sg), (n), (s), (f))
                    892: #define        bus_dmamap_unload(t, p)                                 \
                    893:        (*(t)->_dmamap_unload)((t), (p))
                    894: #define        bus_dmamap_sync(t, p, o, l, ops)                        \
                    895:        (void)((t)->_dmamap_sync ?                              \
                    896:            (*(t)->_dmamap_sync)((t), (p), (o), (l), (ops)) : (void)0)
                    897:
                    898: #define        bus_dmamem_alloc(t, s, a, b, sg, n, r, f)               \
                    899:        (*(t)->_dmamem_alloc)((t), (s), (a), (b), (sg), (n), (r), (f))
                    900: #define        bus_dmamem_free(t, sg, n)                               \
                    901:        (*(t)->_dmamem_free)((t), (sg), (n))
                    902: #define        bus_dmamem_map(t, sg, n, s, k, f)                       \
                    903:        (*(t)->_dmamem_map)((t), (sg), (n), (s), (k), (f))
                    904: #define        bus_dmamem_unmap(t, k, s)                               \
                    905:        (*(t)->_dmamem_unmap)((t), (k), (s))
                    906: #define        bus_dmamem_mmap(t, sg, n, o, p, f)                      \
                    907:        (*(t)->_dmamem_mmap)((t), (sg), (n), (o), (p), (f))
                    908:
                    909: /*
                    910:  *     bus_dmamap_t
                    911:  *
                    912:  *     Describes a DMA mapping.
                    913:  */
                    914: struct arm32_bus_dmamap {
                    915:        /*
                    916:         * PRIVATE MEMBERS: not for use by machine-independent code.
                    917:         */
                    918:        bus_size_t      _dm_size;       /* largest DMA transfer mappable */
                    919:        int             _dm_segcnt;     /* number of segs this map can map */
                    920:        bus_size_t      _dm_maxsegsz;   /* largest possible segment */
                    921:        bus_size_t      _dm_boundary;   /* don't cross this */
                    922:        int             _dm_flags;      /* misc. flags */
                    923:
                    924:        void            *_dm_origbuf;   /* pointer to original buffer */
                    925:        int             _dm_buftype;    /* type of buffer */
                    926:        struct proc     *_dm_proc;      /* proc that owns the mapping */
                    927:
                    928:        void            *_dm_cookie;    /* cookie for bus-specific functions */
                    929:
                    930:        /*
                    931:         * PUBLIC MEMBERS: these are used by machine-independent code.
                    932:         */
                    933:        bus_size_t      dm_mapsize;     /* size of the mapping */
                    934:        int             dm_nsegs;       /* # valid segments in mapping */
                    935:        bus_dma_segment_t dm_segs[1];   /* segments; variable length */
                    936: };
                    937:
                    938: //#ifdef _ARM32_BUS_DMA_PRIVATE
                    939:
                    940: /* _dm_buftype */
                    941: #define        ARM32_BUFTYPE_INVALID           0
                    942: #define        ARM32_BUFTYPE_LINEAR            1
                    943: #define        ARM32_BUFTYPE_MBUF              2
                    944: #define        ARM32_BUFTYPE_UIO               3
                    945:
                    946: int    arm32_dma_range_intersect(struct arm32_dma_range *, int,
                    947:            paddr_t pa, psize_t size, paddr_t *pap, psize_t *sizep);
                    948:
                    949: int    _bus_dmamap_create (bus_dma_tag_t, bus_size_t, int, bus_size_t,
                    950:            bus_size_t, int, bus_dmamap_t *);
                    951: void   _bus_dmamap_destroy (bus_dma_tag_t, bus_dmamap_t);
                    952: int    _bus_dmamap_load (bus_dma_tag_t, bus_dmamap_t, void *,
                    953:            bus_size_t, struct proc *, int);
                    954: int    _bus_dmamap_load_mbuf (bus_dma_tag_t, bus_dmamap_t,
                    955:            struct mbuf *, int);
                    956: int    _bus_dmamap_load_uio (bus_dma_tag_t, bus_dmamap_t,
                    957:            struct uio *, int);
                    958: int    _bus_dmamap_load_raw (bus_dma_tag_t, bus_dmamap_t,
                    959:            bus_dma_segment_t *, int, bus_size_t, int);
                    960: void   _bus_dmamap_unload (bus_dma_tag_t, bus_dmamap_t);
                    961: void   _bus_dmamap_sync (bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
                    962:            bus_size_t, int);
                    963:
                    964: int    _bus_dmamem_alloc (bus_dma_tag_t tag, bus_size_t size,
                    965:            bus_size_t alignment, bus_size_t boundary,
                    966:            bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags);
                    967: void   _bus_dmamem_free (bus_dma_tag_t tag, bus_dma_segment_t *segs,
                    968:            int nsegs);
                    969: int    _bus_dmamem_map (bus_dma_tag_t tag, bus_dma_segment_t *segs,
                    970:            int nsegs, size_t size, caddr_t *kvap, int flags);
                    971: void   _bus_dmamem_unmap (bus_dma_tag_t tag, caddr_t kva,
                    972:            size_t size);
                    973: paddr_t        _bus_dmamem_mmap (bus_dma_tag_t tag, bus_dma_segment_t *segs,
                    974:            int nsegs, off_t off, int prot, int flags);
                    975:
                    976: int    _bus_dmamem_alloc_range (bus_dma_tag_t tag, bus_size_t size,
                    977:            bus_size_t alignment, bus_size_t boundary,
                    978:            bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags,
                    979:            vaddr_t low, vaddr_t high);
                    980: //#endif /* _ARM32_BUS_DMA_PRIVATE */
                    981: /* These are OpenBSD extensions to the general NetBSD bus interface.  */
                    982: void
                    983: bus_space_read_raw_multi_2(bus_space_tag_t bst, bus_space_handle_t bsh,
                    984:        bus_addr_t ba, u_int8_t *dst, bus_size_t size);
                    985: void
                    986: bus_space_read_raw_multi_4(bus_space_tag_t bst, bus_space_handle_t bsh,
                    987:        bus_addr_t ba, u_int8_t *dst, bus_size_t size);
                    988: #define        bus_space_read_raw_multi_8 \
                    989:     !!! bus_space_read_raw_multi_8 not implemented !!!
                    990:
                    991: void
                    992: bus_space_write_raw_multi_2(bus_space_tag_t bst, bus_space_handle_t bsh,
                    993:        bus_addr_t ba, const u_int8_t *src, bus_size_t size);
                    994: void
                    995: bus_space_write_raw_multi_4(bus_space_tag_t bst, bus_space_handle_t bsh,
                    996:        bus_addr_t ba, const u_int8_t *src, bus_size_t size);
                    997: #define        bus_space_write_raw_multi_8 \
                    998:     !!! bus_space_write_raw_multi_8 not implemented !!!
                    999:
                   1000: /*
                   1001:  *     void bus_space_read_raw_region_N(bus_space_tag_t tag,
                   1002:  *         bus_space_handle_t bsh, bus_size_t offset,
                   1003:  *         u_int8_t *addr, size_t count);
                   1004:  *
                   1005:  * Read `count' bytes in 2, 4 or 8 byte wide quantities from bus space
                   1006:  * described by tag/handle and starting at `offset' and copy into
                   1007:  * buffer provided.  The buffer must have proper alignment for the N byte
                   1008:  * wide entities.  Furthermore possible byte-swapping should be done by
                   1009:  * these functions.
                   1010:  */
                   1011:
                   1012: #define        bus_space_read_raw_region_2(t, h, o, a, c) \
                   1013:     bus_space_read_region_2((t), (h), (o), (u_int16_t *)(a), (c) >> 1)
                   1014: #define        bus_space_read_raw_region_4(t, h, o, a, c) \
                   1015:     bus_space_read_region_4((t), (h), (o), (u_int32_t *)(a), (c) >> 2)
                   1016:
                   1017: #if 0  /* Cause a link error for bus_space_read_raw_region_8 */
                   1018: #define        bus_space_read_raw_region_8 \
                   1019:     !!! bus_space_read_raw_region_8 unimplemented !!!
                   1020: #endif
                   1021:
                   1022: /*
                   1023:  *     void bus_space_write_raw_region_N(bus_space_tag_t tag,
                   1024:  *         bus_space_handle_t bsh, bus_size_t offset,
                   1025:  *         const u_int8_t *addr, size_t count);
                   1026:  *
                   1027:  * Write `count' bytes in 2, 4 or 8 byte wide quantities to bus space
                   1028:  * described by tag/handle and starting at `offset' from the
                   1029:  * buffer provided.  The buffer must have proper alignment for the N byte
                   1030:  * wide entities.  Furthermore possible byte-swapping should be done by
                   1031:  * these functions.
                   1032:  */
                   1033:
                   1034: #define        bus_space_write_raw_region_2(t, h, o, a, c) \
                   1035:     bus_space_write_region_2((t), (h), (o), (const u_int16_t *)(a), (c) >> 1)
                   1036: #define        bus_space_write_raw_region_4(t, h, o, a, c) \
                   1037:     bus_space_write_region_4((t), (h), (o), (const u_int32_t *)(a), (c) >> 2)
                   1038:
                   1039: #if 0  /* Cause a link error for bus_space_write_raw_region_8 */
                   1040: #define        bus_space_write_raw_region_8 \
                   1041:     !!! bus_space_write_raw_region_8 unimplemented !!!
                   1042: #endif
                   1043:
                   1044: #endif /* _ARM32_BUS_H_ */

CVSweb