2007-05-09 08:00:38 +07:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2006, 2007 Cisco Systems, Inc. All rights reserved.
|
|
|
|
* Copyright (c) 2005 Mellanox Technologies. All rights reserved.
|
|
|
|
*
|
|
|
|
* This software is available to you under a choice of one of two
|
|
|
|
* licenses. You may choose to be licensed under the terms of the GNU
|
|
|
|
* General Public License (GPL) Version 2, available from the file
|
|
|
|
* COPYING in the main directory of this source tree, or the
|
|
|
|
* OpenIB.org BSD license below:
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or
|
|
|
|
* without modification, are permitted provided that the following
|
|
|
|
* conditions are met:
|
|
|
|
*
|
|
|
|
* - Redistributions of source code must retain the above
|
|
|
|
* copyright notice, this list of conditions and the following
|
|
|
|
* disclaimer.
|
|
|
|
*
|
|
|
|
* - Redistributions in binary form must reproduce the above
|
|
|
|
* copyright notice, this list of conditions and the following
|
|
|
|
* disclaimer in the documentation and/or other materials
|
|
|
|
* provided with the distribution.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
|
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
|
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
|
* SOFTWARE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <linux/errno.h>
|
2011-05-28 03:14:23 +07:00
|
|
|
#include <linux/export.h>
|
2011-03-23 05:38:41 +07:00
|
|
|
#include <linux/io-mapping.h>
|
2007-05-09 08:00:38 +07:00
|
|
|
|
|
|
|
#include <asm/page.h>
|
|
|
|
|
|
|
|
#include "mlx4.h"
|
|
|
|
#include "icm.h"
|
|
|
|
|
2011-03-23 05:38:48 +07:00
|
|
|
enum {
|
|
|
|
MLX4_NUM_RESERVED_UARS = 8
|
|
|
|
};
|
|
|
|
|
2007-05-09 08:00:38 +07:00
|
|
|
int mlx4_pd_alloc(struct mlx4_dev *dev, u32 *pdn)
|
|
|
|
{
|
|
|
|
struct mlx4_priv *priv = mlx4_priv(dev);
|
|
|
|
|
|
|
|
*pdn = mlx4_bitmap_alloc(&priv->pd_bitmap);
|
|
|
|
if (*pdn == -1)
|
|
|
|
return -ENOMEM;
|
2012-01-19 16:45:19 +07:00
|
|
|
|
2007-05-09 08:00:38 +07:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(mlx4_pd_alloc);
|
|
|
|
|
|
|
|
void mlx4_pd_free(struct mlx4_dev *dev, u32 pdn)
|
|
|
|
{
|
mlx4_core: Roll back round robin bitmap allocation commit for CQs, SRQs, and MPTs
Commit f4ec9e9 "mlx4_core: Change bitmap allocator to work in round-robin fashion"
introduced round-robin allocation (via bitmap) for all resources which allocate
via a bitmap.
Round robin allocation is desirable for mcgs, counters, pd's, UARs, and xrcds.
These are simply numbers, with no involvement of ICM memory mapping.
Round robin is required for QPs, since we had a problem with immediate
reuse of a 24-bit QP number (commit f4ec9e9).
However, for other resources which use the bitmap allocator and involve
mapping ICM memory -- MPTs, CQs, SRQs -- round-robin is not desirable.
What happens in these cases is the following:
ICM memory is allocated and mapped in chunks of 256K.
Since the resource allocation index goes up monotonically, the allocator
will eventually require mapping a new chunk. Now, chunks are also unmapped
when their reference count goes back to zero. Thus, if a single app is
running and starts/exits frequently we will have the following situation:
When the app starts, a new chunk must be allocated and mapped.
When the app exits, the chunk reference count goes back to zero, and the
chunk is unmapped and freed. Therefore, the app must pay the cost of allocation
and mapping of ICM memory each time it runs (although the price is paid only when
allocating the initial entry in the new chunk).
For apps which allocate MPTs/SRQs/CQs and which operate as described above,
this presented a performance problem.
We therefore roll back the round-robin allocator modification for MPTs, CQs, SRQs.
Reported-by: Matthew Finlay <matt@mellanox.com>
Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-12-08 21:50:17 +07:00
|
|
|
mlx4_bitmap_free(&mlx4_priv(dev)->pd_bitmap, pdn, MLX4_USE_RR);
|
2007-05-09 08:00:38 +07:00
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(mlx4_pd_free);
|
|
|
|
|
2012-05-15 17:35:03 +07:00
|
|
|
int __mlx4_xrcd_alloc(struct mlx4_dev *dev, u32 *xrcdn)
|
2011-06-02 23:01:33 +07:00
|
|
|
{
|
|
|
|
struct mlx4_priv *priv = mlx4_priv(dev);
|
|
|
|
|
|
|
|
*xrcdn = mlx4_bitmap_alloc(&priv->xrcd_bitmap);
|
|
|
|
if (*xrcdn == -1)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2012-05-15 17:35:03 +07:00
|
|
|
|
|
|
|
int mlx4_xrcd_alloc(struct mlx4_dev *dev, u32 *xrcdn)
|
|
|
|
{
|
|
|
|
u64 out_param;
|
|
|
|
int err;
|
|
|
|
|
|
|
|
if (mlx4_is_mfunc(dev)) {
|
|
|
|
err = mlx4_cmd_imm(dev, 0, &out_param,
|
|
|
|
RES_XRCD, RES_OP_RESERVE,
|
|
|
|
MLX4_CMD_ALLOC_RES,
|
|
|
|
MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
|
|
|
|
if (err)
|
|
|
|
return err;
|
|
|
|
|
|
|
|
*xrcdn = get_param_l(&out_param);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
return __mlx4_xrcd_alloc(dev, xrcdn);
|
|
|
|
}
|
2011-06-02 23:01:33 +07:00
|
|
|
EXPORT_SYMBOL_GPL(mlx4_xrcd_alloc);
|
|
|
|
|
2012-05-15 17:35:03 +07:00
|
|
|
void __mlx4_xrcd_free(struct mlx4_dev *dev, u32 xrcdn)
|
2011-06-02 23:01:33 +07:00
|
|
|
{
|
mlx4_core: Roll back round robin bitmap allocation commit for CQs, SRQs, and MPTs
Commit f4ec9e9 "mlx4_core: Change bitmap allocator to work in round-robin fashion"
introduced round-robin allocation (via bitmap) for all resources which allocate
via a bitmap.
Round robin allocation is desirable for mcgs, counters, pd's, UARs, and xrcds.
These are simply numbers, with no involvement of ICM memory mapping.
Round robin is required for QPs, since we had a problem with immediate
reuse of a 24-bit QP number (commit f4ec9e9).
However, for other resources which use the bitmap allocator and involve
mapping ICM memory -- MPTs, CQs, SRQs -- round-robin is not desirable.
What happens in these cases is the following:
ICM memory is allocated and mapped in chunks of 256K.
Since the resource allocation index goes up monotonically, the allocator
will eventually require mapping a new chunk. Now, chunks are also unmapped
when their reference count goes back to zero. Thus, if a single app is
running and starts/exits frequently we will have the following situation:
When the app starts, a new chunk must be allocated and mapped.
When the app exits, the chunk reference count goes back to zero, and the
chunk is unmapped and freed. Therefore, the app must pay the cost of allocation
and mapping of ICM memory each time it runs (although the price is paid only when
allocating the initial entry in the new chunk).
For apps which allocate MPTs/SRQs/CQs and which operate as described above,
this presented a performance problem.
We therefore roll back the round-robin allocator modification for MPTs, CQs, SRQs.
Reported-by: Matthew Finlay <matt@mellanox.com>
Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-12-08 21:50:17 +07:00
|
|
|
mlx4_bitmap_free(&mlx4_priv(dev)->xrcd_bitmap, xrcdn, MLX4_USE_RR);
|
2011-06-02 23:01:33 +07:00
|
|
|
}
|
2012-05-15 17:35:03 +07:00
|
|
|
|
|
|
|
void mlx4_xrcd_free(struct mlx4_dev *dev, u32 xrcdn)
|
|
|
|
{
|
2013-03-07 10:46:54 +07:00
|
|
|
u64 in_param = 0;
|
2012-05-15 17:35:03 +07:00
|
|
|
int err;
|
|
|
|
|
|
|
|
if (mlx4_is_mfunc(dev)) {
|
|
|
|
set_param_l(&in_param, xrcdn);
|
|
|
|
err = mlx4_cmd(dev, in_param, RES_XRCD,
|
|
|
|
RES_OP_RESERVE, MLX4_CMD_FREE_RES,
|
|
|
|
MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
|
|
|
|
if (err)
|
|
|
|
mlx4_warn(dev, "Failed to release xrcdn %d\n", xrcdn);
|
|
|
|
} else
|
|
|
|
__mlx4_xrcd_free(dev, xrcdn);
|
|
|
|
}
|
2011-06-02 23:01:33 +07:00
|
|
|
EXPORT_SYMBOL_GPL(mlx4_xrcd_free);
|
|
|
|
|
2007-10-11 05:43:54 +07:00
|
|
|
int mlx4_init_pd_table(struct mlx4_dev *dev)
|
2007-05-09 08:00:38 +07:00
|
|
|
{
|
|
|
|
struct mlx4_priv *priv = mlx4_priv(dev);
|
|
|
|
|
|
|
|
return mlx4_bitmap_init(&priv->pd_bitmap, dev->caps.num_pds,
|
2011-12-13 11:12:13 +07:00
|
|
|
(1 << NOT_MASKED_PD_BITS) - 1,
|
|
|
|
dev->caps.reserved_pds, 0);
|
2007-05-09 08:00:38 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
void mlx4_cleanup_pd_table(struct mlx4_dev *dev)
|
|
|
|
{
|
|
|
|
mlx4_bitmap_cleanup(&mlx4_priv(dev)->pd_bitmap);
|
|
|
|
}
|
|
|
|
|
2011-06-02 23:01:33 +07:00
|
|
|
int mlx4_init_xrcd_table(struct mlx4_dev *dev)
|
|
|
|
{
|
|
|
|
struct mlx4_priv *priv = mlx4_priv(dev);
|
|
|
|
|
|
|
|
return mlx4_bitmap_init(&priv->xrcd_bitmap, (1 << 16),
|
|
|
|
(1 << 16) - 1, dev->caps.reserved_xrcds + 1, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void mlx4_cleanup_xrcd_table(struct mlx4_dev *dev)
|
|
|
|
{
|
|
|
|
mlx4_bitmap_cleanup(&mlx4_priv(dev)->xrcd_bitmap);
|
|
|
|
}
|
2007-05-09 08:00:38 +07:00
|
|
|
|
|
|
|
int mlx4_uar_alloc(struct mlx4_dev *dev, struct mlx4_uar *uar)
|
|
|
|
{
|
2011-12-13 11:12:13 +07:00
|
|
|
int offset;
|
|
|
|
|
2007-05-09 08:00:38 +07:00
|
|
|
uar->index = mlx4_bitmap_alloc(&mlx4_priv(dev)->uar_table.bitmap);
|
|
|
|
if (uar->index == -1)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
2011-12-13 11:12:13 +07:00
|
|
|
if (mlx4_is_slave(dev))
|
2015-01-25 21:59:35 +07:00
|
|
|
offset = uar->index % ((int)pci_resource_len(dev->persist->pdev,
|
|
|
|
2) /
|
2011-12-13 11:12:13 +07:00
|
|
|
dev->caps.uar_page_size);
|
|
|
|
else
|
|
|
|
offset = uar->index;
|
2015-01-25 21:59:35 +07:00
|
|
|
uar->pfn = (pci_resource_start(dev->persist->pdev, 2) >> PAGE_SHIFT)
|
|
|
|
+ offset;
|
2011-03-23 05:38:41 +07:00
|
|
|
uar->map = NULL;
|
2007-05-09 08:00:38 +07:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(mlx4_uar_alloc);
|
|
|
|
|
|
|
|
void mlx4_uar_free(struct mlx4_dev *dev, struct mlx4_uar *uar)
|
|
|
|
{
|
mlx4_core: Roll back round robin bitmap allocation commit for CQs, SRQs, and MPTs
Commit f4ec9e9 "mlx4_core: Change bitmap allocator to work in round-robin fashion"
introduced round-robin allocation (via bitmap) for all resources which allocate
via a bitmap.
Round robin allocation is desirable for mcgs, counters, pd's, UARs, and xrcds.
These are simply numbers, with no involvement of ICM memory mapping.
Round robin is required for QPs, since we had a problem with immediate
reuse of a 24-bit QP number (commit f4ec9e9).
However, for other resources which use the bitmap allocator and involve
mapping ICM memory -- MPTs, CQs, SRQs -- round-robin is not desirable.
What happens in these cases is the following:
ICM memory is allocated and mapped in chunks of 256K.
Since the resource allocation index goes up monotonically, the allocator
will eventually require mapping a new chunk. Now, chunks are also unmapped
when their reference count goes back to zero. Thus, if a single app is
running and starts/exits frequently we will have the following situation:
When the app starts, a new chunk must be allocated and mapped.
When the app exits, the chunk reference count goes back to zero, and the
chunk is unmapped and freed. Therefore, the app must pay the cost of allocation
and mapping of ICM memory each time it runs (although the price is paid only when
allocating the initial entry in the new chunk).
For apps which allocate MPTs/SRQs/CQs and which operate as described above,
this presented a performance problem.
We therefore roll back the round-robin allocator modification for MPTs, CQs, SRQs.
Reported-by: Matthew Finlay <matt@mellanox.com>
Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-12-08 21:50:17 +07:00
|
|
|
mlx4_bitmap_free(&mlx4_priv(dev)->uar_table.bitmap, uar->index, MLX4_USE_RR);
|
2007-05-09 08:00:38 +07:00
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(mlx4_uar_free);
|
|
|
|
|
2013-11-07 17:19:54 +07:00
|
|
|
int mlx4_bf_alloc(struct mlx4_dev *dev, struct mlx4_bf *bf, int node)
|
2011-03-23 05:38:41 +07:00
|
|
|
{
|
|
|
|
struct mlx4_priv *priv = mlx4_priv(dev);
|
|
|
|
struct mlx4_uar *uar;
|
|
|
|
int err = 0;
|
|
|
|
int idx;
|
|
|
|
|
|
|
|
if (!priv->bf_mapping)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
mutex_lock(&priv->bf_mutex);
|
|
|
|
if (!list_empty(&priv->bf_list))
|
|
|
|
uar = list_entry(priv->bf_list.next, struct mlx4_uar, bf_list);
|
|
|
|
else {
|
2011-03-23 05:38:48 +07:00
|
|
|
if (mlx4_bitmap_avail(&priv->uar_table.bitmap) < MLX4_NUM_RESERVED_UARS) {
|
|
|
|
err = -ENOMEM;
|
|
|
|
goto out;
|
|
|
|
}
|
2013-11-07 17:19:54 +07:00
|
|
|
uar = kmalloc_node(sizeof(*uar), GFP_KERNEL, node);
|
2011-03-23 05:38:41 +07:00
|
|
|
if (!uar) {
|
2013-11-07 17:19:54 +07:00
|
|
|
uar = kmalloc(sizeof(*uar), GFP_KERNEL);
|
|
|
|
if (!uar) {
|
|
|
|
err = -ENOMEM;
|
|
|
|
goto out;
|
|
|
|
}
|
2011-03-23 05:38:41 +07:00
|
|
|
}
|
|
|
|
err = mlx4_uar_alloc(dev, uar);
|
|
|
|
if (err)
|
|
|
|
goto free_kmalloc;
|
|
|
|
|
|
|
|
uar->map = ioremap(uar->pfn << PAGE_SHIFT, PAGE_SIZE);
|
|
|
|
if (!uar->map) {
|
|
|
|
err = -ENOMEM;
|
|
|
|
goto free_uar;
|
|
|
|
}
|
|
|
|
|
2016-04-28 15:56:37 +07:00
|
|
|
uar->bf_map = io_mapping_map_wc(priv->bf_mapping,
|
|
|
|
uar->index << PAGE_SHIFT,
|
|
|
|
PAGE_SIZE);
|
2011-03-23 05:38:41 +07:00
|
|
|
if (!uar->bf_map) {
|
|
|
|
err = -ENOMEM;
|
|
|
|
goto unamp_uar;
|
|
|
|
}
|
|
|
|
uar->free_bf_bmap = 0;
|
|
|
|
list_add(&uar->bf_list, &priv->bf_list);
|
|
|
|
}
|
|
|
|
|
|
|
|
idx = ffz(uar->free_bf_bmap);
|
|
|
|
uar->free_bf_bmap |= 1 << idx;
|
|
|
|
bf->uar = uar;
|
|
|
|
bf->offset = 0;
|
|
|
|
bf->buf_size = dev->caps.bf_reg_size / 2;
|
|
|
|
bf->reg = uar->bf_map + idx * dev->caps.bf_reg_size;
|
|
|
|
if (uar->free_bf_bmap == (1 << dev->caps.bf_regs_per_page) - 1)
|
|
|
|
list_del_init(&uar->bf_list);
|
|
|
|
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
unamp_uar:
|
|
|
|
bf->uar = NULL;
|
|
|
|
iounmap(uar->map);
|
|
|
|
|
|
|
|
free_uar:
|
|
|
|
mlx4_uar_free(dev, uar);
|
|
|
|
|
|
|
|
free_kmalloc:
|
|
|
|
kfree(uar);
|
|
|
|
|
|
|
|
out:
|
|
|
|
mutex_unlock(&priv->bf_mutex);
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(mlx4_bf_alloc);
|
|
|
|
|
|
|
|
void mlx4_bf_free(struct mlx4_dev *dev, struct mlx4_bf *bf)
|
|
|
|
{
|
|
|
|
struct mlx4_priv *priv = mlx4_priv(dev);
|
|
|
|
int idx;
|
|
|
|
|
|
|
|
if (!bf->uar || !bf->uar->bf_map)
|
|
|
|
return;
|
|
|
|
|
|
|
|
mutex_lock(&priv->bf_mutex);
|
|
|
|
idx = (bf->reg - bf->uar->bf_map) / dev->caps.bf_reg_size;
|
|
|
|
bf->uar->free_bf_bmap &= ~(1 << idx);
|
|
|
|
if (!bf->uar->free_bf_bmap) {
|
|
|
|
if (!list_empty(&bf->uar->bf_list))
|
|
|
|
list_del(&bf->uar->bf_list);
|
|
|
|
|
|
|
|
io_mapping_unmap(bf->uar->bf_map);
|
|
|
|
iounmap(bf->uar->map);
|
|
|
|
mlx4_uar_free(dev, bf->uar);
|
|
|
|
kfree(bf->uar);
|
|
|
|
} else if (list_empty(&bf->uar->bf_list))
|
|
|
|
list_add(&bf->uar->bf_list, &priv->bf_list);
|
|
|
|
|
|
|
|
mutex_unlock(&priv->bf_mutex);
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(mlx4_bf_free);
|
|
|
|
|
2007-05-09 08:00:38 +07:00
|
|
|
int mlx4_init_uar_table(struct mlx4_dev *dev)
|
|
|
|
{
|
net/mlx4_core: Set UAR page size to 4KB regardless of system page size
problem description:
The current code sets UAR page size equal to system page size.
The ConnectX-3 and ConnectX-3 Pro HWs require minimum 128 UAR pages.
The mlx4 kernel drivers are not loaded if there is less than 128 UAR pages.
solution:
Always set UAR page to 4KB. This allows more UAR pages if the OS
has PAGE_SIZE larger than 4KB. For example, PowerPC kernel use 64KB
system page size, with 4MB uar region, there are 4MB/2/64KB = 32
uars (half for uar, half for blueflame). This does not meet minimum 128
UAR pages requirement. With 4KB UAR page, there are 4MB/2/4KB = 512 uars
which meet the minimum requirement.
Note that only codes in mlx4_core that deal with firmware know that uar
page size is 4KB. Codes that deal with usr page in cq and qp context
(mlx4_ib, mlx4_en and part of mlx4_core) still have the same assumption
that uar page size equals to system page size.
Note that with this implementation, on 64KB system page size kernel, there
are 16 uars per system page but only one uars is used. The other 15
uars are ignored because of the above assumption.
Regarding SR-IOV, mlx4_core in hypervisor will set the uar page size
to 4KB and mlx4_core code in virtual OS will obtain the uar page size from
firmware.
Regarding backward compatibility in SR-IOV, if hypervisor has this new code,
the virtual OS must be updated. If hypervisor has old code, and the virtual
OS has this new code, the new code will be backward compatible with the
old code. If the uar size is big enough, this new code in VF continues to
work with 64 KB uar page size (on PowerPc kernel). If the uar size does not
meet 128 uars requirement, this new code not loaded in VF and print the same
error message as the old code in Hypervisor.
Signed-off-by: Huy Nguyen <huyn@mellanox.com>
Reviewed-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2016-02-17 22:24:26 +07:00
|
|
|
int num_reserved_uar = mlx4_get_num_reserved_uar(dev);
|
|
|
|
|
|
|
|
mlx4_dbg(dev, "uar_page_shift = %d", dev->uar_page_shift);
|
|
|
|
mlx4_dbg(dev, "Effective reserved_uars=%d", dev->caps.reserved_uars);
|
|
|
|
|
|
|
|
if (dev->caps.num_uars <= num_reserved_uar) {
|
|
|
|
mlx4_err(
|
|
|
|
dev, "Only %d UAR pages (need more than %d)\n",
|
|
|
|
dev->caps.num_uars, num_reserved_uar);
|
2008-07-23 22:12:47 +07:00
|
|
|
mlx4_err(dev, "Increase firmware log2_uar_bar_megabytes?\n");
|
|
|
|
return -ENODEV;
|
|
|
|
}
|
|
|
|
|
2007-05-09 08:00:38 +07:00
|
|
|
return mlx4_bitmap_init(&mlx4_priv(dev)->uar_table.bitmap,
|
|
|
|
dev->caps.num_uars, dev->caps.num_uars - 1,
|
2011-12-13 11:12:13 +07:00
|
|
|
dev->caps.reserved_uars, 0);
|
2007-05-09 08:00:38 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
void mlx4_cleanup_uar_table(struct mlx4_dev *dev)
|
|
|
|
{
|
|
|
|
mlx4_bitmap_cleanup(&mlx4_priv(dev)->uar_table.bitmap);
|
|
|
|
}
|