Skip to content

Commit

Permalink
RDMA/mana_ib: Add a driver for Microsoft Azure Network Adapter
Browse files Browse the repository at this point in the history
Add a RDMA VF driver for Microsoft Azure Network Adapter (MANA).

Signed-off-by: Long Li <longli@microsoft.com>
  • Loading branch information
longlimsft authored and intel-lab-lkp committed May 24, 2022
1 parent 8dc701c commit e448735
Show file tree
Hide file tree
Showing 14 changed files with 1,702 additions and 0 deletions.
3 changes: 3 additions & 0 deletions MAINTAINERS
Expand Up @@ -9082,6 +9082,7 @@ M: Haiyang Zhang <haiyangz@microsoft.com>
M: Stephen Hemminger <sthemmin@microsoft.com>
M: Wei Liu <wei.liu@kernel.org>
M: Dexuan Cui <decui@microsoft.com>
M: Long Li <longli@microsoft.com>
L: linux-hyperv@vger.kernel.org
S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux.git
Expand All @@ -9099,6 +9100,7 @@ F: arch/x86/kernel/cpu/mshyperv.c
F: drivers/clocksource/hyperv_timer.c
F: drivers/hid/hid-hyperv.c
F: drivers/hv/
F: drivers/infiniband/hw/mana/
F: drivers/input/serio/hyperv-keyboard.c
F: drivers/iommu/hyperv-iommu.c
F: drivers/net/ethernet/microsoft/
Expand All @@ -9114,6 +9116,7 @@ F: include/clocksource/hyperv_timer.h
F: include/linux/hyperv.h
F: include/net/mana
F: include/uapi/linux/hyperv.h
F: include/uapi/rdma/mana-abi.h
F: net/vmw_vsock/hyperv_transport.c
F: tools/hv/

Expand Down
1 change: 1 addition & 0 deletions drivers/infiniband/Kconfig
Expand Up @@ -83,6 +83,7 @@ source "drivers/infiniband/hw/qib/Kconfig"
source "drivers/infiniband/hw/cxgb4/Kconfig"
source "drivers/infiniband/hw/efa/Kconfig"
source "drivers/infiniband/hw/irdma/Kconfig"
source "drivers/infiniband/hw/mana/Kconfig"
source "drivers/infiniband/hw/mlx4/Kconfig"
source "drivers/infiniband/hw/mlx5/Kconfig"
source "drivers/infiniband/hw/ocrdma/Kconfig"
Expand Down
1 change: 1 addition & 0 deletions drivers/infiniband/hw/Makefile
Expand Up @@ -4,6 +4,7 @@ obj-$(CONFIG_INFINIBAND_QIB) += qib/
obj-$(CONFIG_INFINIBAND_CXGB4) += cxgb4/
obj-$(CONFIG_INFINIBAND_EFA) += efa/
obj-$(CONFIG_INFINIBAND_IRDMA) += irdma/
obj-$(CONFIG_MANA_INFINIBAND) += mana/
obj-$(CONFIG_MLX4_INFINIBAND) += mlx4/
obj-$(CONFIG_MLX5_INFINIBAND) += mlx5/
obj-$(CONFIG_INFINIBAND_OCRDMA) += ocrdma/
Expand Down
7 changes: 7 additions & 0 deletions drivers/infiniband/hw/mana/Kconfig
@@ -0,0 +1,7 @@
# SPDX-License-Identifier: GPL-2.0-only
config MANA_INFINIBAND
tristate "Microsoft Azure Network Adapter support"
depends on NETDEVICES && ETHERNET && PCI && MICROSOFT_MANA
help
This driver provides low-level RDMA support for
Microsoft Azure Network Adapter (MANA).
4 changes: 4 additions & 0 deletions drivers/infiniband/hw/mana/Makefile
@@ -0,0 +1,4 @@
# SPDX-License-Identifier: GPL-2.0-only
obj-$(CONFIG_MANA_INFINIBAND) += mana_ib.o

mana_ib-y := main.o wq.o qp.o cq.o mr.o
79 changes: 79 additions & 0 deletions drivers/infiniband/hw/mana/cq.c
@@ -0,0 +1,79 @@
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
/*
* Copyright (c) 2022, Microsoft Corporation. All rights reserved.
*/

#include "mana_ib.h"

int mana_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
struct ib_udata *udata)
{
struct mana_ib_create_cq ucmd = {};
struct ib_device *ibdev = ibcq->device;
struct mana_ib_dev *mdev =
container_of(ibdev, struct mana_ib_dev, ib_dev);
struct mana_ib_cq *cq = container_of(ibcq, struct mana_ib_cq, ibcq);
int err;

if (udata->inlen < sizeof(ucmd))
return -EINVAL;

err = ib_copy_from_udata(&ucmd, udata, min(sizeof(ucmd), udata->inlen));
if (err) {
ibdev_dbg(ibdev,
"Failed to copy from udata for create cq, %d\n", err);
return -EFAULT;
}

if (attr->cqe > MAX_SEND_BUFFERS_PER_QUEUE) {
ibdev_dbg(ibdev, "CQE %d exceeding limit\n", attr->cqe);
return -EINVAL;
}

cq->cqe = attr->cqe;
cq->umem = ib_umem_get(ibdev, ucmd.buf_addr, cq->cqe * COMP_ENTRY_SIZE,
IB_ACCESS_LOCAL_WRITE);
if (IS_ERR(cq->umem)) {
err = PTR_ERR(cq->umem);
ibdev_dbg(ibdev, "Failed to get umem for create cq, err %d\n",
err);
return err;
}

err = mana_ib_gd_create_dma_region(mdev, cq->umem, &cq->gdma_region,
PAGE_SIZE);
if (err) {
ibdev_err(ibdev,
"Failed to create dma region for create cq, %d\n",
err);
goto err_release_umem;
}

ibdev_dbg(ibdev,
"mana_ib_gd_create_dma_region ret %d gdma_region 0x%llx\n",
err, cq->gdma_region);

/*
* The CQ ID is not known at this time
* The ID is generated at create_qp
*/

return 0;

err_release_umem:
ib_umem_release(cq->umem);
return err;
}

int mana_ib_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
{
struct mana_ib_cq *cq = container_of(ibcq, struct mana_ib_cq, ibcq);
struct ib_device *ibdev = ibcq->device;
struct mana_ib_dev *mdev =
container_of(ibdev, struct mana_ib_dev, ib_dev);

mana_ib_gd_destroy_dma_region(mdev, cq->gdma_region);
ib_umem_release(cq->umem);

return 0;
}

0 comments on commit e448735

Please sign in to comment.