vxgehal-blockpool.h revision 221167
1/*- 2 * Copyright(c) 2002-2011 Exar Corp. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification are permitted provided the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 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 * 3. Neither the name of the Exar Corporation nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31/*$FreeBSD: head/sys/dev/vxge/vxgehal/vxgehal-blockpool.h 221167 2011-04-28 14:33:15Z gnn $*/ 32 33#ifndef VXGE_HAL_BLOCKPOOL_H 34#define VXGE_HAL_BLOCKPOOL_H 35 36__EXTERN_BEGIN_DECLS 37 38/* 39 * struct __hal_blockpool_entry_t - Block private data structure 40 * @item: List header used to link. 41 * @length: Length of the block 42 * @memblock: Virtual address block 43 * @dma_addr: DMA Address of the block. 44 * @dma_handle: DMA handle of the block. 45 * @acc_handle: DMA acc handle 46 * 47 * Block is allocated with a header to put the blocks into list. 48 * 49 */ 50typedef struct __hal_blockpool_entry_t { 51 vxge_list_t item; 52 u32 length; 53 void *memblock; 54 dma_addr_t dma_addr; 55 pci_dma_h dma_handle; 56 pci_dma_acc_h acc_handle; 57} __hal_blockpool_entry_t; 58 59/* 60 * struct __hal_blockpool_t - Block Pool 61 * @hldev: HAL device 62 * @block_size: size of each block. 63 * @Pool_size: Number of blocks in the pool 64 * @pool_incr: Number of blocks to be requested/freed at a time from OS 65 * @pool_min: Minimum number of block below which to request additional blocks 66 * @pool_max: Maximum number of blocks above which to free additional blocks 67 * @req_out: Number of block requests with OS out standing 68 * @dma_flags: DMA flags 69 * @free_block_list: List of free blocks 70 * @pool_lock: Spin lock for the pool 71 * 72 * Block pool contains the DMA blocks preallocated. 73 * 74 */ 75typedef struct __hal_blockpool_t { 76 vxge_hal_device_h hldev; 77 u32 block_size; 78 u32 pool_size; 79 u32 pool_incr; 80 u32 pool_min; 81 u32 pool_max; 82 u32 req_out; 83 u32 dma_flags; 84 vxge_list_t free_block_list; 85 vxge_list_t free_entry_list; 86 87#if defined(VXGE_HAL_BP_POST) || defined(VXGE_HAL_BP_POST_IRQ) 88 spinlock_t pool_lock; 89#endif 90 91} __hal_blockpool_t; 92 93vxge_hal_status_e 94__hal_blockpool_create(vxge_hal_device_h hldev, 95 __hal_blockpool_t *blockpool, 96 u32 pool_size, 97 u32 pool_incr, 98 u32 pool_min, 99 u32 pool_max); 100 101void 102__hal_blockpool_destroy(__hal_blockpool_t *blockpool); 103 104__hal_blockpool_entry_t * 105__hal_blockpool_block_allocate(vxge_hal_device_h hldev, 106 u32 size); 107 108void 109__hal_blockpool_block_free(vxge_hal_device_h hldev, 110 __hal_blockpool_entry_t *entry); 111 112void * 113__hal_blockpool_malloc(vxge_hal_device_h hldev, 114 u32 size, 115 dma_addr_t *dma_addr, 116 pci_dma_h *dma_handle, 117 pci_dma_acc_h *acc_handle); 118 119void 120__hal_blockpool_free(vxge_hal_device_h hldev, 121 void *memblock, 122 u32 size, 123 dma_addr_t *dma_addr, 124 pci_dma_h *dma_handle, 125 pci_dma_acc_h *acc_handle); 126 127vxge_hal_status_e 128__hal_blockpool_list_allocate(vxge_hal_device_h hldev, 129 vxge_list_t *blocklist, u32 count); 130 131void 132__hal_blockpool_list_free(vxge_hal_device_h hldev, 133 vxge_list_t *blocklist); 134 135__EXTERN_END_DECLS 136 137#endif /* VXGE_HAL_BLOCKPOOL_H */ 138