1/*- 2 * Copyright (c) 2003 3 * Fraunhofer Institute for Open Communication Systems (FhG Fokus). 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 * Author: Hartmut Brandt <harti@freebsd.org> 28 */ 29 30/* 31 * This implements pools of DMA-able buffers that conserve DMA address space 32 * by putting several buffers into one page and that allow to map between 33 * 32-bit handles for the buffer and buffer addresses (to use 32-bit network 34 * interfaces on 64bit machines). This assists network interfaces that may need 35 * huge numbers of mbufs. 36 * 37 * $FreeBSD$ 38 */ 39#ifndef _SYS_MBPOOL_H_ 40#define _SYS_MBPOOL_H_ 41 42#ifdef _KERNEL 43 44#include <sys/queue.h> 45 46/* opaque */ 47struct mbpool; 48 49/* size of reserved area at end of each chunk */ 50#define MBPOOL_TRAILER_SIZE 4 51 52/* maximum value of max_pages */ 53#define MBPOOL_MAX_MAXPAGES ((1 << 14) - 1) 54 55/* maximum number of chunks per page */ 56#define MBPOOL_MAX_CHUNKS (1 << 9) 57 58/* initialize a pool */ 59int mbp_create(struct mbpool **, const char *, bus_dma_tag_t, u_int, 60 size_t, size_t); 61 62/* destroy a pool */ 63void mbp_destroy(struct mbpool *); 64 65/* allocate a chunk and set used and on card */ 66void *mbp_alloc(struct mbpool *, bus_addr_t *, uint32_t *); 67 68/* free a chunk */ 69void mbp_free(struct mbpool *, void *); 70 71/* free a chunk that is an external mbuf */ 72void mbp_ext_free(void *, void *); 73 74/* free all buffers that are marked to be on the card */ 75void mbp_card_free(struct mbpool *); 76 77/* count used buffers and buffers on card */ 78void mbp_count(struct mbpool *, u_int *, u_int *, u_int *); 79 80/* get the buffer from a handle and clear card bit */ 81void *mbp_get(struct mbpool *, uint32_t); 82 83/* get the buffer from a handle and don't clear card bit */ 84void *mbp_get_keep(struct mbpool *, uint32_t); 85 86/* sync the chunk */ 87void mbp_sync(struct mbpool *, uint32_t, bus_addr_t, bus_size_t, u_int); 88 89#endif /* _KERNEL */ 90#endif /* _SYS_MBPOOL_H_ */ 91