net/mlx5_core: Move completion eqs from mlx5_ib to mlx5_core
Preparation for ethernet driver. These functions will be used in drivers other than mlx5_ib. Signed-off-by: Achiad Shochat <achiad@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> Signed-off-by: Eli Cohen <eli@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
4ae6c18c59
Коммит
233d05d28a
|
@ -780,7 +780,7 @@ struct ib_cq *mlx5_ib_create_cq(struct ib_device *ibdev, int entries,
|
||||||
cq->cqe_size = cqe_size;
|
cq->cqe_size = cqe_size;
|
||||||
cqb->ctx.cqe_sz_flags = cqe_sz_to_mlx_sz(cqe_size) << 5;
|
cqb->ctx.cqe_sz_flags = cqe_sz_to_mlx_sz(cqe_size) << 5;
|
||||||
cqb->ctx.log_sz_usr_page = cpu_to_be32((ilog2(entries) << 24) | index);
|
cqb->ctx.log_sz_usr_page = cpu_to_be32((ilog2(entries) << 24) | index);
|
||||||
err = mlx5_vector2eqn(dev, vector, &eqn, &irqn);
|
err = mlx5_vector2eqn(dev->mdev, vector, &eqn, &irqn);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_cqb;
|
goto err_cqb;
|
||||||
|
|
||||||
|
|
|
@ -62,95 +62,6 @@ static char mlx5_version[] =
|
||||||
DRIVER_NAME ": Mellanox Connect-IB Infiniband driver v"
|
DRIVER_NAME ": Mellanox Connect-IB Infiniband driver v"
|
||||||
DRIVER_VERSION " (" DRIVER_RELDATE ")\n";
|
DRIVER_VERSION " (" DRIVER_RELDATE ")\n";
|
||||||
|
|
||||||
int mlx5_vector2eqn(struct mlx5_ib_dev *dev, int vector, int *eqn, int *irqn)
|
|
||||||
{
|
|
||||||
struct mlx5_eq_table *table = &dev->mdev->priv.eq_table;
|
|
||||||
struct mlx5_eq *eq, *n;
|
|
||||||
int err = -ENOENT;
|
|
||||||
|
|
||||||
spin_lock(&table->lock);
|
|
||||||
list_for_each_entry_safe(eq, n, &dev->eqs_list, list) {
|
|
||||||
if (eq->index == vector) {
|
|
||||||
*eqn = eq->eqn;
|
|
||||||
*irqn = eq->irqn;
|
|
||||||
err = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
spin_unlock(&table->lock);
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int alloc_comp_eqs(struct mlx5_ib_dev *dev)
|
|
||||||
{
|
|
||||||
struct mlx5_eq_table *table = &dev->mdev->priv.eq_table;
|
|
||||||
char name[MLX5_MAX_EQ_NAME];
|
|
||||||
struct mlx5_eq *eq, *n;
|
|
||||||
int ncomp_vec;
|
|
||||||
int nent;
|
|
||||||
int err;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
INIT_LIST_HEAD(&dev->eqs_list);
|
|
||||||
ncomp_vec = table->num_comp_vectors;
|
|
||||||
nent = MLX5_COMP_EQ_SIZE;
|
|
||||||
for (i = 0; i < ncomp_vec; i++) {
|
|
||||||
eq = kzalloc(sizeof(*eq), GFP_KERNEL);
|
|
||||||
if (!eq) {
|
|
||||||
err = -ENOMEM;
|
|
||||||
goto clean;
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(name, MLX5_MAX_EQ_NAME, "mlx5_comp%d", i);
|
|
||||||
err = mlx5_create_map_eq(dev->mdev, eq,
|
|
||||||
i + MLX5_EQ_VEC_COMP_BASE, nent, 0,
|
|
||||||
name, &dev->mdev->priv.uuari.uars[0]);
|
|
||||||
if (err) {
|
|
||||||
kfree(eq);
|
|
||||||
goto clean;
|
|
||||||
}
|
|
||||||
mlx5_ib_dbg(dev, "allocated completion EQN %d\n", eq->eqn);
|
|
||||||
eq->index = i;
|
|
||||||
spin_lock(&table->lock);
|
|
||||||
list_add_tail(&eq->list, &dev->eqs_list);
|
|
||||||
spin_unlock(&table->lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
dev->num_comp_vectors = ncomp_vec;
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
clean:
|
|
||||||
spin_lock(&table->lock);
|
|
||||||
list_for_each_entry_safe(eq, n, &dev->eqs_list, list) {
|
|
||||||
list_del(&eq->list);
|
|
||||||
spin_unlock(&table->lock);
|
|
||||||
if (mlx5_destroy_unmap_eq(dev->mdev, eq))
|
|
||||||
mlx5_ib_warn(dev, "failed to destroy EQ 0x%x\n", eq->eqn);
|
|
||||||
kfree(eq);
|
|
||||||
spin_lock(&table->lock);
|
|
||||||
}
|
|
||||||
spin_unlock(&table->lock);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void free_comp_eqs(struct mlx5_ib_dev *dev)
|
|
||||||
{
|
|
||||||
struct mlx5_eq_table *table = &dev->mdev->priv.eq_table;
|
|
||||||
struct mlx5_eq *eq, *n;
|
|
||||||
|
|
||||||
spin_lock(&table->lock);
|
|
||||||
list_for_each_entry_safe(eq, n, &dev->eqs_list, list) {
|
|
||||||
list_del(&eq->list);
|
|
||||||
spin_unlock(&table->lock);
|
|
||||||
if (mlx5_destroy_unmap_eq(dev->mdev, eq))
|
|
||||||
mlx5_ib_warn(dev, "failed to destroy EQ 0x%x\n", eq->eqn);
|
|
||||||
kfree(eq);
|
|
||||||
spin_lock(&table->lock);
|
|
||||||
}
|
|
||||||
spin_unlock(&table->lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int mlx5_ib_query_device(struct ib_device *ibdev,
|
static int mlx5_ib_query_device(struct ib_device *ibdev,
|
||||||
struct ib_device_attr *props)
|
struct ib_device_attr *props)
|
||||||
{
|
{
|
||||||
|
@ -1291,10 +1202,6 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
|
||||||
|
|
||||||
get_ext_port_caps(dev);
|
get_ext_port_caps(dev);
|
||||||
|
|
||||||
err = alloc_comp_eqs(dev);
|
|
||||||
if (err)
|
|
||||||
goto err_dealloc;
|
|
||||||
|
|
||||||
MLX5_INIT_DOORBELL_LOCK(&dev->uar_lock);
|
MLX5_INIT_DOORBELL_LOCK(&dev->uar_lock);
|
||||||
|
|
||||||
strlcpy(dev->ib_dev.name, "mlx5_%d", IB_DEVICE_NAME_MAX);
|
strlcpy(dev->ib_dev.name, "mlx5_%d", IB_DEVICE_NAME_MAX);
|
||||||
|
@ -1303,7 +1210,8 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
|
||||||
dev->ib_dev.local_dma_lkey = mdev->caps.gen.reserved_lkey;
|
dev->ib_dev.local_dma_lkey = mdev->caps.gen.reserved_lkey;
|
||||||
dev->num_ports = mdev->caps.gen.num_ports;
|
dev->num_ports = mdev->caps.gen.num_ports;
|
||||||
dev->ib_dev.phys_port_cnt = dev->num_ports;
|
dev->ib_dev.phys_port_cnt = dev->num_ports;
|
||||||
dev->ib_dev.num_comp_vectors = dev->num_comp_vectors;
|
dev->ib_dev.num_comp_vectors =
|
||||||
|
dev->mdev->priv.eq_table.num_comp_vectors;
|
||||||
dev->ib_dev.dma_device = &mdev->pdev->dev;
|
dev->ib_dev.dma_device = &mdev->pdev->dev;
|
||||||
|
|
||||||
dev->ib_dev.uverbs_abi_ver = MLX5_IB_UVERBS_ABI_VERSION;
|
dev->ib_dev.uverbs_abi_ver = MLX5_IB_UVERBS_ABI_VERSION;
|
||||||
|
@ -1390,13 +1298,13 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
|
||||||
|
|
||||||
err = init_node_data(dev);
|
err = init_node_data(dev);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_eqs;
|
goto err_dealloc;
|
||||||
|
|
||||||
mutex_init(&dev->cap_mask_mutex);
|
mutex_init(&dev->cap_mask_mutex);
|
||||||
|
|
||||||
err = create_dev_resources(&dev->devr);
|
err = create_dev_resources(&dev->devr);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_eqs;
|
goto err_dealloc;
|
||||||
|
|
||||||
err = mlx5_ib_odp_init_one(dev);
|
err = mlx5_ib_odp_init_one(dev);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -1433,9 +1341,6 @@ err_odp:
|
||||||
err_rsrc:
|
err_rsrc:
|
||||||
destroy_dev_resources(&dev->devr);
|
destroy_dev_resources(&dev->devr);
|
||||||
|
|
||||||
err_eqs:
|
|
||||||
free_comp_eqs(dev);
|
|
||||||
|
|
||||||
err_dealloc:
|
err_dealloc:
|
||||||
ib_dealloc_device((struct ib_device *)dev);
|
ib_dealloc_device((struct ib_device *)dev);
|
||||||
|
|
||||||
|
@ -1450,7 +1355,6 @@ static void mlx5_ib_remove(struct mlx5_core_dev *mdev, void *context)
|
||||||
destroy_umrc_res(dev);
|
destroy_umrc_res(dev);
|
||||||
mlx5_ib_odp_remove_one(dev);
|
mlx5_ib_odp_remove_one(dev);
|
||||||
destroy_dev_resources(&dev->devr);
|
destroy_dev_resources(&dev->devr);
|
||||||
free_comp_eqs(dev);
|
|
||||||
ib_dealloc_device(&dev->ib_dev);
|
ib_dealloc_device(&dev->ib_dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -421,9 +421,7 @@ struct mlx5_ib_dev {
|
||||||
struct ib_device ib_dev;
|
struct ib_device ib_dev;
|
||||||
struct mlx5_core_dev *mdev;
|
struct mlx5_core_dev *mdev;
|
||||||
MLX5_DECLARE_DOORBELL_LOCK(uar_lock);
|
MLX5_DECLARE_DOORBELL_LOCK(uar_lock);
|
||||||
struct list_head eqs_list;
|
|
||||||
int num_ports;
|
int num_ports;
|
||||||
int num_comp_vectors;
|
|
||||||
/* serialize update of capability mask
|
/* serialize update of capability mask
|
||||||
*/
|
*/
|
||||||
struct mutex cap_mask_mutex;
|
struct mutex cap_mask_mutex;
|
||||||
|
@ -594,7 +592,6 @@ struct ib_xrcd *mlx5_ib_alloc_xrcd(struct ib_device *ibdev,
|
||||||
struct ib_ucontext *context,
|
struct ib_ucontext *context,
|
||||||
struct ib_udata *udata);
|
struct ib_udata *udata);
|
||||||
int mlx5_ib_dealloc_xrcd(struct ib_xrcd *xrcd);
|
int mlx5_ib_dealloc_xrcd(struct ib_xrcd *xrcd);
|
||||||
int mlx5_vector2eqn(struct mlx5_ib_dev *dev, int vector, int *eqn, int *irqn);
|
|
||||||
int mlx5_ib_get_buf_offset(u64 addr, int page_shift, u32 *offset);
|
int mlx5_ib_get_buf_offset(u64 addr, int page_shift, u32 *offset);
|
||||||
int mlx5_query_ext_port_caps(struct mlx5_ib_dev *dev, u8 port);
|
int mlx5_query_ext_port_caps(struct mlx5_ib_dev *dev, u8 port);
|
||||||
int mlx5_ib_query_port(struct ib_device *ibdev, u8 port,
|
int mlx5_ib_query_port(struct ib_device *ibdev, u8 port,
|
||||||
|
|
|
@ -507,6 +507,87 @@ static int mlx5_core_disable_hca(struct mlx5_core_dev *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn, int *irqn)
|
||||||
|
{
|
||||||
|
struct mlx5_eq_table *table = &dev->priv.eq_table;
|
||||||
|
struct mlx5_eq *eq, *n;
|
||||||
|
int err = -ENOENT;
|
||||||
|
|
||||||
|
spin_lock(&table->lock);
|
||||||
|
list_for_each_entry_safe(eq, n, &table->comp_eqs_list, list) {
|
||||||
|
if (eq->index == vector) {
|
||||||
|
*eqn = eq->eqn;
|
||||||
|
*irqn = eq->irqn;
|
||||||
|
err = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
spin_unlock(&table->lock);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(mlx5_vector2eqn);
|
||||||
|
|
||||||
|
static void free_comp_eqs(struct mlx5_core_dev *dev)
|
||||||
|
{
|
||||||
|
struct mlx5_eq_table *table = &dev->priv.eq_table;
|
||||||
|
struct mlx5_eq *eq, *n;
|
||||||
|
|
||||||
|
spin_lock(&table->lock);
|
||||||
|
list_for_each_entry_safe(eq, n, &table->comp_eqs_list, list) {
|
||||||
|
list_del(&eq->list);
|
||||||
|
spin_unlock(&table->lock);
|
||||||
|
if (mlx5_destroy_unmap_eq(dev, eq))
|
||||||
|
mlx5_core_warn(dev, "failed to destroy EQ 0x%x\n",
|
||||||
|
eq->eqn);
|
||||||
|
kfree(eq);
|
||||||
|
spin_lock(&table->lock);
|
||||||
|
}
|
||||||
|
spin_unlock(&table->lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int alloc_comp_eqs(struct mlx5_core_dev *dev)
|
||||||
|
{
|
||||||
|
struct mlx5_eq_table *table = &dev->priv.eq_table;
|
||||||
|
char name[MLX5_MAX_EQ_NAME];
|
||||||
|
struct mlx5_eq *eq;
|
||||||
|
int ncomp_vec;
|
||||||
|
int nent;
|
||||||
|
int err;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
INIT_LIST_HEAD(&table->comp_eqs_list);
|
||||||
|
ncomp_vec = table->num_comp_vectors;
|
||||||
|
nent = MLX5_COMP_EQ_SIZE;
|
||||||
|
for (i = 0; i < ncomp_vec; i++) {
|
||||||
|
eq = kzalloc(sizeof(*eq), GFP_KERNEL);
|
||||||
|
if (!eq) {
|
||||||
|
err = -ENOMEM;
|
||||||
|
goto clean;
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(name, MLX5_MAX_EQ_NAME, "mlx5_comp%d", i);
|
||||||
|
err = mlx5_create_map_eq(dev, eq,
|
||||||
|
i + MLX5_EQ_VEC_COMP_BASE, nent, 0,
|
||||||
|
name, &dev->priv.uuari.uars[0]);
|
||||||
|
if (err) {
|
||||||
|
kfree(eq);
|
||||||
|
goto clean;
|
||||||
|
}
|
||||||
|
mlx5_core_dbg(dev, "allocated completion EQN %d\n", eq->eqn);
|
||||||
|
eq->index = i;
|
||||||
|
spin_lock(&table->lock);
|
||||||
|
list_add_tail(&eq->list, &table->comp_eqs_list);
|
||||||
|
spin_unlock(&table->lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
clean:
|
||||||
|
free_comp_eqs(dev);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
static int mlx5_dev_init(struct mlx5_core_dev *dev, struct pci_dev *pdev)
|
static int mlx5_dev_init(struct mlx5_core_dev *dev, struct pci_dev *pdev)
|
||||||
{
|
{
|
||||||
struct mlx5_priv *priv = &dev->priv;
|
struct mlx5_priv *priv = &dev->priv;
|
||||||
|
@ -643,6 +724,12 @@ static int mlx5_dev_init(struct mlx5_core_dev *dev, struct pci_dev *pdev)
|
||||||
goto err_free_uar;
|
goto err_free_uar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = alloc_comp_eqs(dev);
|
||||||
|
if (err) {
|
||||||
|
dev_err(&pdev->dev, "Failed to alloc completion EQs\n");
|
||||||
|
goto err_stop_eqs;
|
||||||
|
}
|
||||||
|
|
||||||
MLX5_INIT_DOORBELL_LOCK(&priv->cq_uar_lock);
|
MLX5_INIT_DOORBELL_LOCK(&priv->cq_uar_lock);
|
||||||
|
|
||||||
mlx5_init_cq_table(dev);
|
mlx5_init_cq_table(dev);
|
||||||
|
@ -652,6 +739,9 @@ static int mlx5_dev_init(struct mlx5_core_dev *dev, struct pci_dev *pdev)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_stop_eqs:
|
||||||
|
mlx5_stop_eqs(dev);
|
||||||
|
|
||||||
err_free_uar:
|
err_free_uar:
|
||||||
mlx5_free_uuars(dev, &priv->uuari);
|
mlx5_free_uuars(dev, &priv->uuari);
|
||||||
|
|
||||||
|
@ -703,6 +793,7 @@ static void mlx5_dev_cleanup(struct mlx5_core_dev *dev)
|
||||||
mlx5_cleanup_srq_table(dev);
|
mlx5_cleanup_srq_table(dev);
|
||||||
mlx5_cleanup_qp_table(dev);
|
mlx5_cleanup_qp_table(dev);
|
||||||
mlx5_cleanup_cq_table(dev);
|
mlx5_cleanup_cq_table(dev);
|
||||||
|
free_comp_eqs(dev);
|
||||||
mlx5_stop_eqs(dev);
|
mlx5_stop_eqs(dev);
|
||||||
mlx5_free_uuars(dev, &priv->uuari);
|
mlx5_free_uuars(dev, &priv->uuari);
|
||||||
mlx5_eq_cleanup(dev);
|
mlx5_eq_cleanup(dev);
|
||||||
|
|
|
@ -410,7 +410,7 @@ struct mlx5_core_srq {
|
||||||
struct mlx5_eq_table {
|
struct mlx5_eq_table {
|
||||||
void __iomem *update_ci;
|
void __iomem *update_ci;
|
||||||
void __iomem *update_arm_ci;
|
void __iomem *update_arm_ci;
|
||||||
struct list_head *comp_eq_head;
|
struct list_head comp_eqs_list;
|
||||||
struct mlx5_eq pages_eq;
|
struct mlx5_eq pages_eq;
|
||||||
struct mlx5_eq async_eq;
|
struct mlx5_eq async_eq;
|
||||||
struct mlx5_eq cmd_eq;
|
struct mlx5_eq cmd_eq;
|
||||||
|
@ -725,6 +725,7 @@ int mlx5_create_map_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq, u8 vecidx,
|
||||||
int mlx5_destroy_unmap_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq);
|
int mlx5_destroy_unmap_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq);
|
||||||
int mlx5_start_eqs(struct mlx5_core_dev *dev);
|
int mlx5_start_eqs(struct mlx5_core_dev *dev);
|
||||||
int mlx5_stop_eqs(struct mlx5_core_dev *dev);
|
int mlx5_stop_eqs(struct mlx5_core_dev *dev);
|
||||||
|
int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn, int *irqn);
|
||||||
int mlx5_core_attach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid, u32 qpn);
|
int mlx5_core_attach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid, u32 qpn);
|
||||||
int mlx5_core_detach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid, u32 qpn);
|
int mlx5_core_detach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid, u32 qpn);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче