at v2.6.26 102 lines 3.1 kB view raw
1/* 2 * Copyright (c) 2006, 2007 Cisco Systems, Inc. All rights reserved. 3 * Copyright (c) 2005 Mellanox Technologies. All rights reserved. 4 * 5 * This software is available to you under a choice of one of two 6 * licenses. You may choose to be licensed under the terms of the GNU 7 * General Public License (GPL) Version 2, available from the file 8 * COPYING in the main directory of this source tree, or the 9 * OpenIB.org BSD license below: 10 * 11 * Redistribution and use in source and binary forms, with or 12 * without modification, are permitted provided that the following 13 * conditions are met: 14 * 15 * - Redistributions of source code must retain the above 16 * copyright notice, this list of conditions and the following 17 * disclaimer. 18 * 19 * - Redistributions in binary form must reproduce the above 20 * copyright notice, this list of conditions and the following 21 * disclaimer in the documentation and/or other materials 22 * provided with the distribution. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 * SOFTWARE. 32 */ 33 34#include <linux/init.h> 35#include <linux/errno.h> 36 37#include <asm/page.h> 38 39#include "mlx4.h" 40#include "icm.h" 41 42int mlx4_pd_alloc(struct mlx4_dev *dev, u32 *pdn) 43{ 44 struct mlx4_priv *priv = mlx4_priv(dev); 45 46 *pdn = mlx4_bitmap_alloc(&priv->pd_bitmap); 47 if (*pdn == -1) 48 return -ENOMEM; 49 50 return 0; 51} 52EXPORT_SYMBOL_GPL(mlx4_pd_alloc); 53 54void mlx4_pd_free(struct mlx4_dev *dev, u32 pdn) 55{ 56 mlx4_bitmap_free(&mlx4_priv(dev)->pd_bitmap, pdn); 57} 58EXPORT_SYMBOL_GPL(mlx4_pd_free); 59 60int mlx4_init_pd_table(struct mlx4_dev *dev) 61{ 62 struct mlx4_priv *priv = mlx4_priv(dev); 63 64 return mlx4_bitmap_init(&priv->pd_bitmap, dev->caps.num_pds, 65 (1 << 24) - 1, dev->caps.reserved_pds); 66} 67 68void mlx4_cleanup_pd_table(struct mlx4_dev *dev) 69{ 70 mlx4_bitmap_cleanup(&mlx4_priv(dev)->pd_bitmap); 71} 72 73 74int mlx4_uar_alloc(struct mlx4_dev *dev, struct mlx4_uar *uar) 75{ 76 uar->index = mlx4_bitmap_alloc(&mlx4_priv(dev)->uar_table.bitmap); 77 if (uar->index == -1) 78 return -ENOMEM; 79 80 uar->pfn = (pci_resource_start(dev->pdev, 2) >> PAGE_SHIFT) + uar->index; 81 82 return 0; 83} 84EXPORT_SYMBOL_GPL(mlx4_uar_alloc); 85 86void mlx4_uar_free(struct mlx4_dev *dev, struct mlx4_uar *uar) 87{ 88 mlx4_bitmap_free(&mlx4_priv(dev)->uar_table.bitmap, uar->index); 89} 90EXPORT_SYMBOL_GPL(mlx4_uar_free); 91 92int mlx4_init_uar_table(struct mlx4_dev *dev) 93{ 94 return mlx4_bitmap_init(&mlx4_priv(dev)->uar_table.bitmap, 95 dev->caps.num_uars, dev->caps.num_uars - 1, 96 max(128, dev->caps.reserved_uars)); 97} 98 99void mlx4_cleanup_uar_table(struct mlx4_dev *dev) 100{ 101 mlx4_bitmap_cleanup(&mlx4_priv(dev)->uar_table.bitmap); 102}