xref: /illumos-gate/usr/src/uts/common/io/xge/hal/include/xgehal-mm.h (revision 6954e8c5cca918ccea54c08370e374fc0db429da)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  *
21  * Copyright (c) 2002-2006 Neterion, Inc.
22  */
23 
24 #ifndef XGE_HAL_MM_H
25 #define XGE_HAL_MM_H
26 
27 #include "xge-os-pal.h"
28 #include "xge-debug.h"
29 #include "xgehal-types.h"
30 #include "xgehal-driver.h"
31 
32 __EXTERN_BEGIN_DECLS
33 
34 typedef void* xge_hal_mempool_h;
35 
36 /*
37  * struct xge_hal_mempool_dma_t - Represents DMA objects passed to the
38  caller.
39  */
40 typedef struct xge_hal_mempool_dma_t {
41 	dma_addr_t			addr;
42 	pci_dma_h			handle;
43 	pci_dma_acc_h			acc_handle;
44 } xge_hal_mempool_dma_t;
45 
46 /*
47  * xge_hal_mempool_item_f  - Mempool item alloc/free callback
48  * @mempoolh: Memory pool handle.
49  * @item: Item that gets allocated or freed.
50  * @index: Item's index in the memory pool.
51  * @is_last: True, if this item is the last one in the pool; false - otherwise.
52  * userdat: Per-pool user context.
53  *
54  * Memory pool allocation/deallocation callback.
55  */
56 typedef xge_hal_status_e (*xge_hal_mempool_item_f) (xge_hal_mempool_h mempoolh,
57 				void *memblock, int memblock_index,
58 				xge_hal_mempool_dma_t *dma_object, void	*item,
59 				int index, int is_last, void *userdata);
60 
61 /*
62  * struct xge_hal_mempool_t - Memory pool.
63  */
64 typedef struct xge_hal_mempool_t {
65 	xge_hal_mempool_item_f		item_func_alloc;
66 	xge_hal_mempool_item_f		item_func_free;
67 	void				*userdata;
68 	void				**memblocks_arr;
69 	void				**memblocks_priv_arr;
70 	xge_hal_mempool_dma_t		*memblocks_dma_arr;
71 	pci_dev_h			pdev;
72 	int				memblock_size;
73 	int				memblocks_max;
74 	int				memblocks_allocated;
75 	int				item_size;
76 	int				items_max;
77 	int				items_initial;
78 	int				items_current;
79 	int				items_per_memblock;
80 	void				**items_arr;
81 	void				**shadow_items_arr;
82 	int				items_priv_size;
83 } xge_hal_mempool_t;
84 
85 /*
86  * __hal_mempool_item - Returns pointer to the item in the mempool
87  * items array.
88  */
89 static inline void*
90 __hal_mempool_item(xge_hal_mempool_t *mempool, int index)
91 {
92 	return mempool->items_arr[index];
93 }
94 
95 /*
96  * __hal_mempool_item_priv - will return pointer on per item private space
97  */
98 static inline void*
99 __hal_mempool_item_priv(xge_hal_mempool_t *mempool, int memblock_idx,
100 			void *item, int *memblock_item_idx)
101 {
102 	ptrdiff_t offset;
103 	void *memblock = mempool->memblocks_arr[memblock_idx];
104 
105 	xge_assert(memblock);
106 
107 	offset = (int)((char * )item - (char *)memblock);
108 	xge_assert(offset >= 0 && offset < mempool->memblock_size);
109 
110 	(*memblock_item_idx) = (int) offset / mempool->item_size;
111 	xge_assert((*memblock_item_idx) < mempool->items_per_memblock);
112 
113 	return (char*)mempool->memblocks_priv_arr[memblock_idx] +
114 			    (*memblock_item_idx) * mempool->items_priv_size;
115 }
116 
117 /*
118  * __hal_mempool_items_arr - will return pointer to the items array in the
119  *  mempool.
120  */
121 static inline void*
122 __hal_mempool_items_arr(xge_hal_mempool_t *mempool)
123 {
124 	return mempool->items_arr;
125 }
126 
127 /*
128  * __hal_mempool_memblock - will return pointer to the memblock in the
129  *  mempool memblocks array.
130  */
131 static inline void*
132 __hal_mempool_memblock(xge_hal_mempool_t *mempool, int memblock_idx)
133 {
134 	xge_assert(mempool->memblocks_arr[memblock_idx]);
135 	return mempool->memblocks_arr[memblock_idx];
136 }
137 
138 /*
139  * __hal_mempool_memblock_dma - will return pointer to the dma block
140  *  corresponds to the memblock(identified by memblock_idx) in the mempool.
141  */
142 static inline xge_hal_mempool_dma_t*
143 __hal_mempool_memblock_dma(xge_hal_mempool_t *mempool, int memblock_idx)
144 {
145 	return mempool->memblocks_dma_arr + memblock_idx;
146 }
147 
148 xge_hal_status_e __hal_mempool_grow(xge_hal_mempool_t *mempool,
149 			int num_allocate, int *num_allocated);
150 
151 xge_hal_mempool_t* __hal_mempool_create(pci_dev_h pdev, int memblock_size,
152 			int item_size, int private_size, int items_initial,
153 			int items_max, xge_hal_mempool_item_f item_func_alloc,
154 			xge_hal_mempool_item_f item_func_free, void *userdata);
155 
156 void __hal_mempool_destroy(xge_hal_mempool_t *mempool);
157 
158 
159 #ifdef XGEHAL_RNIC
160 
161 xge_hal_status_e
162 __hal_allocate_dma_register(pci_dev_h pdev, int size,
163 		void **dma_register, xge_hal_mempool_dma_t *dma_object);
164 
165 void
166 __hal_free_dma_register(pci_dev_h pdev, int size,
167 			void *dma_register, xge_hal_mempool_dma_t *dma_object);
168 
169 #endif
170 
171 __EXTERN_END_DECLS
172 
173 #endif /* XGE_HAL_MM_H */
174