Lines Matching defs:uar

145 int mlx4_uar_alloc(struct mlx4_dev *dev, struct mlx4_uar *uar)
149 uar->index = mlx4_bitmap_alloc(&mlx4_priv(dev)->uar_table.bitmap);
150 if (uar->index == -1)
154 offset = uar->index % ((int)pci_resource_len(dev->persist->pdev,
158 offset = uar->index;
159 uar->pfn = (pci_resource_start(dev->persist->pdev, 2) >> PAGE_SHIFT)
161 uar->map = NULL;
166 void mlx4_uar_free(struct mlx4_dev *dev, struct mlx4_uar *uar)
168 mlx4_bitmap_free(&mlx4_priv(dev)->uar_table.bitmap, uar->index, MLX4_USE_RR);
175 struct mlx4_uar *uar;
184 uar = list_entry(priv->bf_list.next, struct mlx4_uar, bf_list);
190 uar = kmalloc_node(sizeof(*uar), GFP_KERNEL, node);
191 if (!uar) {
192 uar = kmalloc(sizeof(*uar), GFP_KERNEL);
193 if (!uar) {
198 err = mlx4_uar_alloc(dev, uar);
202 uar->map = ioremap(uar->pfn << PAGE_SHIFT, PAGE_SIZE);
203 if (!uar->map) {
208 uar->bf_map = io_mapping_map_wc(priv->bf_mapping,
209 uar->index << PAGE_SHIFT,
211 if (!uar->bf_map) {
215 uar->free_bf_bmap = 0;
216 list_add(&uar->bf_list, &priv->bf_list);
219 idx = ffz(uar->free_bf_bmap);
220 uar->free_bf_bmap |= 1 << idx;
221 bf->uar = uar;
224 bf->reg = uar->bf_map + idx * dev->caps.bf_reg_size;
225 if (uar->free_bf_bmap == (1 << dev->caps.bf_regs_per_page) - 1)
226 list_del_init(&uar->bf_list);
231 bf->uar = NULL;
232 iounmap(uar->map);
235 mlx4_uar_free(dev, uar);
238 kfree(uar);
251 if (!bf->uar || !bf->uar->bf_map)
255 idx = (bf->reg - bf->uar->bf_map) / dev->caps.bf_reg_size;
256 bf->uar->free_bf_bmap &= ~(1 << idx);
257 if (!bf->uar->free_bf_bmap) {
258 if (!list_empty(&bf->uar->bf_list))
259 list_del(&bf->uar->bf_list);
261 io_mapping_unmap(bf->uar->bf_map);
262 iounmap(bf->uar->map);
263 mlx4_uar_free(dev, bf->uar);
264 kfree(bf->uar);
265 } else if (list_empty(&bf->uar->bf_list))
266 list_add(&bf->uar->bf_list, &priv->bf_list);