diff options
Diffstat (limited to 'sys/dev/vxge/vxgehal/vxgehal-blockpool.h')
-rw-r--r-- | sys/dev/vxge/vxgehal/vxgehal-blockpool.h | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/sys/dev/vxge/vxgehal/vxgehal-blockpool.h b/sys/dev/vxge/vxgehal/vxgehal-blockpool.h new file mode 100644 index 000000000000..fb3a2aa1dbc3 --- /dev/null +++ b/sys/dev/vxge/vxgehal/vxgehal-blockpool.h @@ -0,0 +1,137 @@ +/*- + * Copyright(c) 2002-2011 Exar Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification are permitted provided the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Exar Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +/*$FreeBSD$*/ + +#ifndef VXGE_HAL_BLOCKPOOL_H +#define VXGE_HAL_BLOCKPOOL_H + +__EXTERN_BEGIN_DECLS + +/* + * struct __hal_blockpool_entry_t - Block private data structure + * @item: List header used to link. + * @length: Length of the block + * @memblock: Virtual address block + * @dma_addr: DMA Address of the block. + * @dma_handle: DMA handle of the block. + * @acc_handle: DMA acc handle + * + * Block is allocated with a header to put the blocks into list. + * + */ +typedef struct __hal_blockpool_entry_t { + vxge_list_t item; + u32 length; + void *memblock; + dma_addr_t dma_addr; + pci_dma_h dma_handle; + pci_dma_acc_h acc_handle; +} __hal_blockpool_entry_t; + +/* + * struct __hal_blockpool_t - Block Pool + * @hldev: HAL device + * @block_size: size of each block. + * @Pool_size: Number of blocks in the pool + * @pool_incr: Number of blocks to be requested/freed at a time from OS + * @pool_min: Minimum number of block below which to request additional blocks + * @pool_max: Maximum number of blocks above which to free additional blocks + * @req_out: Number of block requests with OS out standing + * @dma_flags: DMA flags + * @free_block_list: List of free blocks + * @pool_lock: Spin lock for the pool + * + * Block pool contains the DMA blocks preallocated. + * + */ +typedef struct __hal_blockpool_t { + vxge_hal_device_h hldev; + u32 block_size; + u32 pool_size; + u32 pool_incr; + u32 pool_min; + u32 pool_max; + u32 req_out; + u32 dma_flags; + vxge_list_t free_block_list; + vxge_list_t free_entry_list; + +#if defined(VXGE_HAL_BP_POST) || defined(VXGE_HAL_BP_POST_IRQ) + spinlock_t pool_lock; +#endif + +} __hal_blockpool_t; + +vxge_hal_status_e +__hal_blockpool_create(vxge_hal_device_h hldev, + __hal_blockpool_t *blockpool, + u32 pool_size, + u32 pool_incr, + u32 pool_min, + u32 pool_max); + +void +__hal_blockpool_destroy(__hal_blockpool_t *blockpool); + +__hal_blockpool_entry_t * +__hal_blockpool_block_allocate(vxge_hal_device_h hldev, + u32 size); + +void +__hal_blockpool_block_free(vxge_hal_device_h hldev, + __hal_blockpool_entry_t *entry); + +void * +__hal_blockpool_malloc(vxge_hal_device_h hldev, + u32 size, + dma_addr_t *dma_addr, + pci_dma_h *dma_handle, + pci_dma_acc_h *acc_handle); + +void +__hal_blockpool_free(vxge_hal_device_h hldev, + void *memblock, + u32 size, + dma_addr_t *dma_addr, + pci_dma_h *dma_handle, + pci_dma_acc_h *acc_handle); + +vxge_hal_status_e +__hal_blockpool_list_allocate(vxge_hal_device_h hldev, + vxge_list_t *blocklist, u32 count); + +void +__hal_blockpool_list_free(vxge_hal_device_h hldev, + vxge_list_t *blocklist); + +__EXTERN_END_DECLS + +#endif /* VXGE_HAL_BLOCKPOOL_H */ |