[BACK]Return to usb_mem.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / dev / usb

Annotation of src/sys/dev/usb/usb_mem.h, Revision 1.23.32.1

1.23.32.1! itohy       1: /*     $NetBSD: usb_mem.h,v 1.23 2005/12/11 12:24:01 christos Exp $    */
        !             2: /*     $FreeBSD: src/sys/dev/usb/usb_mem.h,v 1.21 2005/01/06 01:43:29 imp Exp $        */
1.1       augustss    3:
1.23.32.1! itohy       4: /*-
        !             5:  * Copyright (c) 1998, 2007 The NetBSD Foundation, Inc.
1.1       augustss    6:  * All rights reserved.
                      7:  *
1.2       augustss    8:  * This code is derived from software contributed to The NetBSD Foundation
1.13      augustss    9:  * by Lennart Augustsson (lennart@augustsson.net) at
1.2       augustss   10:  * Carlstedt Research & Technology.
1.1       augustss   11:  *
1.23.32.1! itohy      12:  * This code is derived from software contributed to The NetBSD Foundation
        !            13:  * by ITOH Yasufumi (itohy@NetBSD.org).
        !            14:  *
1.1       augustss   15:  * Redistribution and use in source and binary forms, with or without
                     16:  * modification, are permitted provided that the following conditions
                     17:  * are met:
                     18:  * 1. Redistributions of source code must retain the above copyright
                     19:  *    notice, this list of conditions and the following disclaimer.
                     20:  * 2. Redistributions in binary form must reproduce the above copyright
                     21:  *    notice, this list of conditions and the following disclaimer in the
                     22:  *    documentation and/or other materials provided with the distribution.
                     23:  * 3. All advertising materials mentioning features or use of this software
                     24:  *    must display the following acknowledgement:
                     25:  *        This product includes software developed by the NetBSD
                     26:  *        Foundation, Inc. and its contributors.
                     27:  * 4. Neither the name of The NetBSD Foundation nor the names of its
                     28:  *    contributors may be used to endorse or promote products derived
                     29:  *    from this software without specific prior written permission.
                     30:  *
                     31:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     32:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     33:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     34:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     35:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     36:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     37:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     38:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     39:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     40:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     41:  * POSSIBILITY OF SUCH DAMAGE.
                     42:  */
                     43:
1.23.32.1! itohy      44: /* track memory allocation/free */
        !            45: #define USBMEM_DEBUG
        !            46:
        !            47: #define USB_DMA_NSEG (btoc(MAXPHYS) + 1)
        !            48:
1.6       augustss   49: typedef struct usb_dma_block {
1.23.32.1! itohy      50: #ifdef __FreeBSD__
1.1       augustss   51:        bus_dma_tag_t tag;
1.23.32.1! itohy      52: #endif
1.1       augustss   53:        bus_dmamap_t map;
                     54:         caddr_t kaddr;
                     55:         bus_dma_segment_t segs[1];
                     56:         int nsegs;
                     57:         size_t size;
                     58:         size_t align;
1.21      fvdl       59:        int flags;
                     60: #define USB_DMA_FULLBLOCK      0x0001
1.23.32.1! itohy      61: #define USB_DMA_MARKED_TO_FREE 0x0002
1.6       augustss   62:        LIST_ENTRY(usb_dma_block) next;
1.23.32.1! itohy      63: #ifdef USBMEM_DEBUG
        !            64:        TAILQ_ENTRY(usb_dma_block)      b_debug_next;
        !            65:        const char                      *b_fn;
        !            66:        int                             b_ln;
        !            67: #endif
1.1       augustss   68: } usb_dma_block_t;
                     69:
1.23.32.1! itohy      70: #if defined(__NetBSD__) || defined(__OpenBSD__)
        !            71: #define DMAADDR(dma, o) \
        !            72:        ((dma)->block->map->dm_segs[0].ds_addr + (dma)->offs + (o))
        !            73: #define USB_MEM_SYNC(utag, dma, ops) \
        !            74:        bus_dmamap_sync((utag)->tag, (dma)->block->map, \
        !            75:                        (dma)->offs, (dma)->len, (ops))
        !            76: #define USB_MEM_SYNC2(utag, dma, off, len, ops) \
        !            77:        bus_dmamap_sync((utag)->tag, (dma)->block->map, \
        !            78:                        (dma)->offs + (off), (len), (ops))
        !            79: #elif defined(__FreeBSD__)
        !            80: #define DMAADDR(dma, o) \
        !            81:        ((dma)->block->segs[0].ds_addr + (dma)->offs + (o))
        !            82: /*
        !            83:  * XXX overkill
        !            84:  * FreeBSD can't sync map partially
        !            85:  */
        !            86: #define USB_MEM_SYNC(utag, dma, ops) \
        !            87:        bus_dmamap_sync((dma)->block->tag, (dma)->block->map, (ops))
        !            88: #define USB_MEM_SYNC2(utag, dma, off, len, ops) \
        !            89:        bus_dmamap_sync((dma)->block->tag, (dma)->block->map, (ops))
        !            90: #endif
        !            91:
1.16      augustss   92: #define KERNADDR(dma, o) \
1.23.32.1! itohy      93:        ((void *)((dma)->block->kaddr + (dma)->offs + (o)))
1.1       augustss   94:
1.23.32.1! itohy      95: typedef struct {
        !            96:        struct usb_dma_block *block;
        !            97:        u_int offs;
        !            98:        u_int len;
        !            99: } usb_dma_t;
1.3       augustss  100:
1.23.32.1! itohy     101: /*
        !           102:  * DMA memory
        !           103:  */
        !           104: struct usb_dmamem {
        !           105: #if defined(__NetBSD__) || defined(__OpenBSD__)
        !           106:        bus_dma_segment_t ud_segs[USB_DMA_NSEG];
        !           107:        int             ud_nsegs;
        !           108:        size_t          ud_len;
        !           109:        caddr_t         ud_kaddr;
        !           110: #elif defined(__FreeBSD__)
        !           111:        void            *ud_kaddr;
        !           112:        bus_dma_tag_t   ud_tag;
        !           113:        bus_dmamap_t    ud_map;
        !           114: #endif
1.21      fvdl      115:
1.23.32.1! itohy     116:        SIMPLEQ_ENTRY(usb_dmamem)       ud_next;
1.21      fvdl      117:
1.23.32.1! itohy     118: #ifdef USBMEM_DEBUG
        !           119:        TAILQ_ENTRY(usb_dmamem)         ud_debug_next;
        !           120:        const char                      *ud_fn;
        !           121:        int                             ud_ln;
1.21      fvdl      122: #endif
1.23.32.1! itohy     123: };
1.21      fvdl      124:
1.23.32.1! itohy     125: /*
        !           126:  * DMA buffer
        !           127:  */
        !           128: struct usb_buffer_dma {
        !           129:        enum { UB_NONE, UB_BUF, UB_ALLOC_MAP, UB_MAP } ub_type;
        !           130:        int             ub_flags;
        !           131: #define USB_BUFFL_ASYNCMAP     0x01    /* created with BUS_DMA_ALLOCNOW */
        !           132: #define USB_BUFFL_MAP          0x02    /* created without BUS_DMA_ALLOCNOW */
1.21      fvdl      133:
1.23.32.1! itohy     134:        usb_dma_t       ub_allocbuf;
        !           135:        struct usb_dmamem *ub_dmamem;
1.21      fvdl      136:
1.23.32.1! itohy     137: #if defined(__NetBSD__) || defined(__OpenBSD__)
        !           138:        bus_dmamap_t    ub_map;
        !           139:        bus_dma_segment_t ub_bufseg;
        !           140: #define _USB_BUFFER_NSEGS(ub)  (ub)->ub_map->dm_nsegs
        !           141: #define USB_BUFFER_NSEGS(ub)   \
        !           142:        ((ub)->ub_type == UB_BUF ? 1 : _USB_BUFFER_NSEGS(ub))
        !           143: #define USB_BUFFER_SEGS(ub)    \
        !           144:        ((ub)->ub_type == UB_BUF ? \
        !           145:         &(ub)->ub_bufseg : (ub)->ub_map->dm_segs)
1.21      fvdl      146:
1.4       augustss  147: #elif defined(__FreeBSD__)
1.23.32.1! itohy     148:        bus_dma_tag_t   ub_curtag;
        !           149:        bus_dma_tag_t   ub_asynctag;
        !           150:        bus_dmamap_t    ub_map;
        !           151:        bus_dma_segment_t ub_segs[USB_DMA_NSEG];
        !           152:        int             ub_nsegs;
        !           153:        int             ub_error;
        !           154: #define _USB_BUFFER_NSEGS(ub)  (ub)->ub_nsegs
        !           155: #define USB_BUFFER_NSEGS(ub)   (_USB_BUFFER_NSEGS(ub))
        !           156: #define USB_BUFFER_SEGS(ub)    (ub)->ub_segs
        !           157: #endif
        !           158: };
1.3       augustss  159:
                    160:
1.23.32.1! itohy     161: #ifdef USBMEM_DEBUG
        !           162: struct usb_frag_debug {
        !           163:        const char                      *f_fn;
        !           164:        int                             f_ln;
        !           165:        struct usb_frag_dma             *f_frag;
        !           166:        TAILQ_ENTRY(usb_frag_debug)     f_debug_next;
        !           167: };
        !           168: #endif
1.18      augustss  169:
1.23.32.1! itohy     170: /*
        !           171:  * per host controller
        !           172:  */
        !           173: typedef struct usb_dma_tag {
        !           174:        /*
        !           175:         * bus_dma(9) tag, filled by host controller driver
        !           176:         */
        !           177: #if defined(__NetBSD__) || defined(__OpenBSD__)
        !           178:        bus_dma_tag_t   tag;
        !           179: #endif
        !           180: #ifdef __FreeBSD__
        !           181:        bus_dma_tag_t   tag_parent;
        !           182:        bus_dma_tag_t   tag_buffer;
        !           183: #endif
1.3       augustss  184:
1.23.32.1! itohy     185:        /*
        !           186:         * Lists of free DMA memory
        !           187:         */
        !           188:        LIST_HEAD(, usb_dma_block) blk_freelist;
        !           189:        int     blk_nfree;
        !           190:        LIST_HEAD(, usb_frag_dma) frag_freelist;
        !           191:        /* for statistical and diagnostic purposes */
        !           192:        int     nblks;          /* number of allocated buffers */
        !           193:        int     nfrags;         /* number of allocated fragments */
        !           194:
        !           195:        /* for delayed free */
        !           196:        SIMPLEQ_HEAD(, usb_dmamem) uds_idle, uds_tobefreed;
        !           197:        /* for statistical and diagnostic purposes */
        !           198:        int     nbufs;          /* number of allocated buffer structures */
        !           199:
        !           200:        struct usb_task         unmap_task;
        !           201:
        !           202: #ifdef USBMEM_DEBUG
        !           203:        const char                      *devname;
        !           204:        TAILQ_HEAD(usb_debug_dmamem_head, usb_dmamem)   uds_lease;
        !           205:        TAILQ_HEAD(usb_debug_blk_head, usb_dma_block)   blks_lease;
        !           206:        TAILQ_HEAD(usb_debug_frag_head, usb_frag_debug)
        !           207:                                        frags_lease, free_frag_debug;
        !           208: #define USBMEM_DEBUG_NFRAG     100
        !           209:        struct usb_frag_debug           frag_debug_chunk[USBMEM_DEBUG_NFRAG];
        !           210:        int     frag_debug_used, frag_debug_used_max;
        !           211: #endif
        !           212: } usb_dma_tag_t;
1.3       augustss  213:
1.23.32.1! itohy     214: #ifdef USBMEM_DEBUG
        !           215: #define usb_allocmem           usb_allocmem_debug
        !           216: #define usb_freemem            usb_freemem_debug
        !           217: #define usb_alloc_buffer_dma   usb_alloc_buffer_dma_debug
        !           218: #define usb_free_buffer_dma    usb_free_buffer_dma_debug
        !           219: #define usb_clean_buffer_dma   usb_clean_buffer_dma_debug
        !           220: #define usb_dma_tag_init       usb_dma_tag_init_debug
        !           221: #define usb_dma_tag_finish     usb_dma_tag_finish_debug
        !           222: #define USBMEM_DEBUGPARAMS     , const char *, int
1.9       augustss  223: #else
1.23.32.1! itohy     224: #define USBMEM_DEBUGPARAMS
1.9       augustss  225: #endif
1.3       augustss  226:
1.23.32.1! itohy     227: usbd_status    usb_allocmem(usb_dma_tag_t *, size_t, size_t, usb_dma_t *
        !           228:                    USBMEM_DEBUGPARAMS);
        !           229: void           usb_freemem(usb_dma_tag_t *, usb_dma_t *
        !           230:                    USBMEM_DEBUGPARAMS);
        !           231: usbd_status    usb_alloc_buffer_dma(usb_dma_tag_t *, struct usb_buffer_dma *,
        !           232:                    void *, size_t, void **
        !           233:                    USBMEM_DEBUGPARAMS);
        !           234: void           usb_free_buffer_dma(usb_dma_tag_t *, struct usb_buffer_dma *,
        !           235:                    enum usbd_waitflg
        !           236:                    USBMEM_DEBUGPARAMS);
        !           237: void           usb_map_dma(usb_dma_tag_t *, struct usb_buffer_dma *,
        !           238:                    void *, size_t);
        !           239: void           usb_map_mbuf_dma(usb_dma_tag_t *, struct usb_buffer_dma *,
        !           240:                    struct mbuf *);
        !           241: void           usb_unmap_dma(usb_dma_tag_t *u, struct usb_buffer_dma *);
        !           242: usbd_status    usb_alloc_dma_resources(usb_dma_tag_t *,
        !           243:                    struct usb_buffer_dma *);
        !           244: void           usb_free_dma_resources(usb_dma_tag_t *,
        !           245:                    struct usb_buffer_dma *);
        !           246: void           usb_sync_buffer_dma(usb_dma_tag_t *, struct usb_buffer_dma *,
        !           247:                    int /*ops*/);
        !           248: void           usb_clean_buffer_dma(usb_dma_tag_t *, struct usb_buffer_dma *
        !           249:                    USBMEM_DEBUGPARAMS);
        !           250: usbd_status    usb_insert_transfer_dma(usbd_xfer_handle, usb_dma_tag_t *,
        !           251:                    struct usb_buffer_dma *);
        !           252: void           usb_transfer_complete_dma(usbd_xfer_handle, usb_dma_tag_t *,
        !           253:                    struct usb_buffer_dma *);
        !           254: void           usb_dma_tag_init(usb_dma_tag_t *
        !           255: #ifdef USBMEM_DEBUG
        !           256:                    , device_ptr_t
        !           257: #endif
        !           258:                    USBMEM_DEBUGPARAMS);
        !           259: void           usb_dma_tag_finish(usb_dma_tag_t *
        !           260:                    USBMEM_DEBUGPARAMS);
        !           261:
        !           262: #ifdef USBMEM_DEBUG
        !           263: #undef USBMEM_DEBUGPARAMS
        !           264: #ifndef USBMEM_PRIVATE
        !           265: #undef usb_allocmem
        !           266: #define usb_allocmem(utag, sz, al, dma) \
        !           267:        usb_allocmem_debug(utag, sz, al, dma, __FILE__, __LINE__)
        !           268: #undef usb_freemem
        !           269: #define usb_freemem(utag, dma) \
        !           270:        usb_freemem_debug(utag, dma, __FILE__, __LINE__)
        !           271: #undef usb_alloc_buffer_dma
        !           272: #define usb_alloc_buffer_dma(utag, ub, ptr, sz, padr) \
        !           273:        usb_alloc_buffer_dma_debug(utag, ub, ptr, sz, padr, __FILE__, __LINE__)
        !           274: #undef usb_free_buffer_dma
        !           275: #define usb_free_buffer_dma(utag, ub, w) \
        !           276:        usb_free_buffer_dma_debug(utag, ub, w, __FILE__, __LINE__)
        !           277: #undef usb_clean_buffer_dma
        !           278: #define usb_clean_buffer_dma(utag, ub) \
        !           279:        usb_clean_buffer_dma_debug(utag, ub, __FILE__, __LINE__)
        !           280: #undef usb_dma_tag_init
        !           281: #define usb_dma_tag_init(utag) \
        !           282:        usb_dma_tag_init_debug(utag, (device_ptr_t)sc, __FILE__, __LINE__)
        !           283: #undef usb_dma_tag_finish
        !           284: #define usb_dma_tag_finish(utag) \
        !           285:        usb_dma_tag_finish_debug(utag, __FILE__, __LINE__)
        !           286: #endif /* !USBMEM_PRIVATE */
        !           287: #endif /* USBMEM_DEBUG */

CVSweb <webmaster@jp.NetBSD.org>