vxgehal-mm.h revision 331722
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: stable/11/sys/dev/vxge/vxgehal/vxgehal-mm.h 331722 2018-03-29 02:50:57Z eadler $*/
32
33#ifndef	VXGE_HAL_MM_H
34#define	VXGE_HAL_MM_H
35
36__EXTERN_BEGIN_DECLS
37
38typedef void *vxge_hal_mempool_h;
39
40/*
41 * struct vxge_hal_mempool_dma_t - Represents DMA objects passed to the
42 * caller.
43 */
44typedef struct vxge_hal_mempool_dma_t {
45	dma_addr_t			addr;
46	pci_dma_h			handle;
47	pci_dma_acc_h			acc_handle;
48} vxge_hal_mempool_dma_t;
49
50/*
51 * vxge_hal_mempool_item_f  - Mempool item alloc/free callback
52 * @mempoolh: Memory pool handle.
53 * @memblock: Address of memory block
54 * @memblock_index: Index of memory block
55 * @item: Item that gets allocated or freed.
56 * @index: Item's index in the memory pool.
57 * @is_last: True, if this item is the last one in the pool; false - otherwise.
58 * userdata: Per-pool user context.
59 *
60 * Memory pool allocation/deallocation callback.
61 */
62typedef vxge_hal_status_e (*vxge_hal_mempool_item_f) (
63	vxge_hal_mempool_h	mempoolh,
64	void			*memblock,
65	u32			memblock_index,
66	vxge_hal_mempool_dma_t	*dma_object,
67	void			*item,
68	u32			index,
69	u32			is_last,
70	void			*userdata);
71
72/*
73 * struct vxge_hal_mempool_t - Memory pool.
74 */
75typedef struct vxge_hal_mempool_t {
76	vxge_hal_mempool_item_f	item_func_alloc;
77	vxge_hal_mempool_item_f	item_func_free;
78	void			*userdata;
79	void			**memblocks_arr;
80	void			**memblocks_priv_arr;
81	vxge_hal_mempool_dma_t	*memblocks_dma_arr;
82	vxge_hal_device_h	devh;
83	u32			memblock_size;
84	u32			memblocks_max;
85	u32			memblocks_allocated;
86	u32			item_size;
87	u32			items_max;
88	u32			items_initial;
89	u32			items_current;
90	u32			items_per_memblock;
91	u32			dma_flags;
92	void			**items_arr;
93	void			**shadow_items_arr;
94	u32			items_priv_size;
95} vxge_hal_mempool_t;
96
97/*
98 * __hal_mempool_item_count - Returns number of items in the mempool
99 */
100static inline u32
101/* LINTED */
102__hal_mempool_item_count(
103    vxge_hal_mempool_t *mempool)
104{
105	return (mempool->items_current);
106}
107
108/*
109 * __hal_mempool_item - Returns pointer to the item in the mempool
110 * items array.
111 */
112static inline void *
113/* LINTED */
114__hal_mempool_item(
115    vxge_hal_mempool_t *mempool,
116    u32 items_index)
117{
118	return (mempool->items_arr[items_index]);
119}
120
121/*
122 * __hal_mempool_item_priv - will return pointer on per item private space
123 */
124static inline void*
125/* LINTED */
126__hal_mempool_item_priv(
127    vxge_hal_mempool_t *mempool,
128    u32 memblock_idx,
129    void *item,
130    u32 *memblock_item_idx)
131{
132	ptrdiff_t offset;
133	void *memblock = mempool->memblocks_arr[memblock_idx];
134
135	vxge_assert(memblock);
136
137	/* LINTED */
138	offset = (u32) ((u8 *) item - (u8 *) memblock);
139	vxge_assert(offset >= 0 && (u32) offset < mempool->memblock_size);
140
141	(*memblock_item_idx) = (u32) offset / mempool->item_size;
142	vxge_assert((*memblock_item_idx) < mempool->items_per_memblock);
143
144	return ((u8 *) mempool->memblocks_priv_arr[memblock_idx] +
145	    (*memblock_item_idx) * mempool->items_priv_size);
146}
147
148/*
149 * __hal_mempool_items_arr - will return pointer to the items array in the
150 * mempool.
151 */
152static inline void *
153/* LINTED */
154__hal_mempool_items_arr(
155    vxge_hal_mempool_t *mempool)
156{
157	return (mempool->items_arr);
158}
159
160/*
161 * __hal_mempool_memblock - will return pointer to the memblock in the
162 * mempool memblocks array.
163 */
164static inline void *
165/* LINTED */
166__hal_mempool_memblock(
167    vxge_hal_mempool_t *mempool,
168    u32 memblock_idx)
169{
170	vxge_assert(mempool->memblocks_arr[memblock_idx]);
171	return (mempool->memblocks_arr[memblock_idx]);
172}
173
174/*
175 * __hal_mempool_memblock_dma - will return pointer to the dma block
176 * corresponds to the memblock(identified by memblock_idx) in the mempool.
177 */
178static inline vxge_hal_mempool_dma_t *
179/* LINTED */
180__hal_mempool_memblock_dma(
181    vxge_hal_mempool_t *mempool,
182    u32 memblock_idx)
183{
184	return (mempool->memblocks_dma_arr + memblock_idx);
185}
186
187vxge_hal_mempool_t *
188vxge_hal_mempool_create(
189    vxge_hal_device_h devh,
190    u32 memblock_size,
191    u32 item_size,
192    u32 private_size,
193    u32 items_initial,
194    u32 items_max,
195    vxge_hal_mempool_item_f item_func_alloc,
196    vxge_hal_mempool_item_f item_func_free,
197    void *userdata);
198
199void
200vxge_hal_mempool_destroy(
201    vxge_hal_mempool_t *mempool);
202
203
204__EXTERN_END_DECLS
205
206#endif	/* VXGE_HAL_MM_H */
207