From nobody Sat Dec 27 20:56:51 2025 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 956221FCB; Sat, 16 Dec 2023 02:04:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linuxonhyperv.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.microsoft.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linuxonhyperv.com header.i=@linuxonhyperv.com header.b="LDUh6Wzw" Received: by linux.microsoft.com (Postfix, from userid 1004) id 46F0E2048D68; Fri, 15 Dec 2023 18:04:52 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 46F0E2048D68 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linuxonhyperv.com; s=default; t=1702692292; bh=kFG2UJA7zqgwhnAvb8WqdQxi8BRc3fmUEAvO+u1bgXo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LDUh6WzwP0gqTs/K5UjcTPIDI58YV2yqDVGyon2byP1zSOU4tC92z/iOO6KG3Uqd8 Lh/6Uvf+8RYsvxj0VyALc4u9Emiz+1TiVmHaVAX/NPEBaR4pdXIAm4isikxrYmT46J ++fbYkTVN84iAUuu4Rh45N+TGW09XetK0GnpuDLU= From: longli@linuxonhyperv.com To: Jason Gunthorpe , Leon Romanovsky , Ajay Sharma , Dexuan Cui , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: linux-rdma@vger.kernel.org, linux-hyperv@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Long Li Subject: [Patch v4 1/3] RDMA/mana_ib: register RDMA device with GDMA Date: Fri, 15 Dec 2023 18:04:13 -0800 Message-Id: <1702692255-23640-2-git-send-email-longli@linuxonhyperv.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1702692255-23640-1-git-send-email-longli@linuxonhyperv.com> References: <1702692255-23640-1-git-send-email-longli@linuxonhyperv.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Long Li Software client needs to register with the RDMA management interface on the SoC to access more features, including querying device capabilities and RC queue pair. Signed-off-by: Long Li --- drivers/infiniband/hw/mana/device.c | 24 +++++++++++++++---- drivers/infiniband/hw/mana/main.c | 4 ++-- drivers/infiniband/hw/mana/qp.c | 15 ++++++------ .../net/ethernet/microsoft/mana/gdma_main.c | 5 ++++ include/net/mana/gdma.h | 4 ++++ 5 files changed, 38 insertions(+), 14 deletions(-) diff --git a/drivers/infiniband/hw/mana/device.c b/drivers/infiniband/hw/ma= na/device.c index d4541b8707e4..fe025e13a45c 100644 --- a/drivers/infiniband/hw/mana/device.c +++ b/drivers/infiniband/hw/mana/device.c @@ -68,7 +68,6 @@ static int mana_ib_probe(struct auxiliary_device *adev, ibdev_dbg(&dev->ib_dev, "mdev=3D%p id=3D%d num_ports=3D%d\n", mdev, mdev->dev_id.as_uint32, dev->ib_dev.phys_port_cnt); =20 - dev->gdma_dev =3D mdev; dev->ib_dev.node_type =3D RDMA_NODE_IB_CA; =20 /* @@ -78,16 +77,28 @@ static int mana_ib_probe(struct auxiliary_device *adev, dev->ib_dev.num_comp_vectors =3D 1; dev->ib_dev.dev.parent =3D mdev->gdma_context->dev; =20 - ret =3D ib_register_device(&dev->ib_dev, "mana_%d", - mdev->gdma_context->dev); + ret =3D mana_gd_register_device(&mdev->gdma_context->mana_ib); if (ret) { - ib_dealloc_device(&dev->ib_dev); - return ret; + ibdev_err(&dev->ib_dev, "Failed to register device, ret %d", + ret); + goto free_ib_device; } + dev->gdma_dev =3D &mdev->gdma_context->mana_ib; + + ret =3D ib_register_device(&dev->ib_dev, "mana_%d", + mdev->gdma_context->dev); + if (ret) + goto deregister_device; =20 dev_set_drvdata(&adev->dev, dev); =20 return 0; + +deregister_device: + mana_gd_deregister_device(dev->gdma_dev); +free_ib_device: + ib_dealloc_device(&dev->ib_dev); + return ret; } =20 static void mana_ib_remove(struct auxiliary_device *adev) @@ -95,6 +106,9 @@ static void mana_ib_remove(struct auxiliary_device *adev) struct mana_ib_dev *dev =3D dev_get_drvdata(&adev->dev); =20 ib_unregister_device(&dev->ib_dev); + + mana_gd_deregister_device(dev->gdma_dev); + ib_dealloc_device(&dev->ib_dev); } =20 diff --git a/drivers/infiniband/hw/mana/main.c b/drivers/infiniband/hw/mana= /main.c index 7be4c3adb4e2..53730306ed9b 100644 --- a/drivers/infiniband/hw/mana/main.c +++ b/drivers/infiniband/hw/mana/main.c @@ -8,7 +8,7 @@ void mana_ib_uncfg_vport(struct mana_ib_dev *dev, struct mana_ib_pd *pd, u32 port) { - struct gdma_dev *gd =3D dev->gdma_dev; + struct gdma_dev *gd =3D &dev->gdma_dev->gdma_context->mana; struct mana_port_context *mpc; struct net_device *ndev; struct mana_context *mc; @@ -31,7 +31,7 @@ void mana_ib_uncfg_vport(struct mana_ib_dev *dev, struct = mana_ib_pd *pd, int mana_ib_cfg_vport(struct mana_ib_dev *dev, u32 port, struct mana_ib_pd= *pd, u32 doorbell_id) { - struct gdma_dev *mdev =3D dev->gdma_dev; + struct gdma_dev *mdev =3D &dev->gdma_dev->gdma_context->mana; struct mana_port_context *mpc; struct mana_context *mc; struct net_device *ndev; diff --git a/drivers/infiniband/hw/mana/qp.c b/drivers/infiniband/hw/mana/q= p.c index 4b3b5b274e84..ae45d28eef5e 100644 --- a/drivers/infiniband/hw/mana/qp.c +++ b/drivers/infiniband/hw/mana/qp.c @@ -21,8 +21,8 @@ static int mana_ib_cfg_vport_steering(struct mana_ib_dev = *dev, u32 req_buf_size; int i, err; =20 - mdev =3D dev->gdma_dev; - gc =3D mdev->gdma_context; + gc =3D dev->gdma_dev->gdma_context; + mdev =3D &gc->mana; =20 req_buf_size =3D sizeof(*req) + sizeof(mana_handle_t) * MANA_INDIRECT_TABLE_SIZE; @@ -102,20 +102,21 @@ static int mana_ib_create_qp_rss(struct ib_qp *ibqp, = struct ib_pd *pd, struct ib_rwq_ind_table *ind_tbl =3D attr->rwq_ind_tbl; struct mana_ib_create_qp_rss_resp resp =3D {}; struct mana_ib_create_qp_rss ucmd =3D {}; - struct gdma_dev *gd =3D mdev->gdma_dev; mana_handle_t *mana_ind_table; struct mana_port_context *mpc; + unsigned int ind_tbl_size; struct mana_context *mc; struct net_device *ndev; struct mana_ib_cq *cq; struct mana_ib_wq *wq; - unsigned int ind_tbl_size; + struct gdma_dev *gd; struct ib_cq *ibcq; struct ib_wq *ibwq; int i =3D 0; u32 port; int ret; =20 + gd =3D &mdev->gdma_dev->gdma_context->mana; mc =3D gd->driver_data; =20 if (!udata || udata->inlen < sizeof(ucmd)) @@ -266,8 +267,8 @@ static int mana_ib_create_qp_raw(struct ib_qp *ibqp, st= ruct ib_pd *ibpd, struct mana_ib_ucontext *mana_ucontext =3D rdma_udata_to_drv_context(udata, struct mana_ib_ucontext, ibucontext); + struct gdma_dev *gd =3D &mdev->gdma_dev->gdma_context->mana; struct mana_ib_create_qp_resp resp =3D {}; - struct gdma_dev *gd =3D mdev->gdma_dev; struct mana_ib_create_qp ucmd =3D {}; struct mana_obj_spec wq_spec =3D {}; struct mana_obj_spec cq_spec =3D {}; @@ -437,7 +438,7 @@ static int mana_ib_destroy_qp_rss(struct mana_ib_qp *qp, { struct mana_ib_dev *mdev =3D container_of(qp->ibqp.device, struct mana_ib_dev, ib_dev); - struct gdma_dev *gd =3D mdev->gdma_dev; + struct gdma_dev *gd =3D &mdev->gdma_dev->gdma_context->mana; struct mana_port_context *mpc; struct mana_context *mc; struct net_device *ndev; @@ -464,7 +465,7 @@ static int mana_ib_destroy_qp_raw(struct mana_ib_qp *qp= , struct ib_udata *udata) { struct mana_ib_dev *mdev =3D container_of(qp->ibqp.device, struct mana_ib_dev, ib_dev); - struct gdma_dev *gd =3D mdev->gdma_dev; + struct gdma_dev *gd =3D &mdev->gdma_dev->gdma_context->mana; struct ib_pd *ibpd =3D qp->ibqp.pd; struct mana_port_context *mpc; struct mana_context *mc; diff --git a/drivers/net/ethernet/microsoft/mana/gdma_main.c b/drivers/net/= ethernet/microsoft/mana/gdma_main.c index 6367de0c2c2e..e6e71e3c357c 100644 --- a/drivers/net/ethernet/microsoft/mana/gdma_main.c +++ b/drivers/net/ethernet/microsoft/mana/gdma_main.c @@ -158,6 +158,9 @@ static int mana_gd_detect_devices(struct pci_dev *pdev) if (dev_type =3D=3D GDMA_DEVICE_MANA) { gc->mana.gdma_context =3D gc; gc->mana.dev_id =3D dev; + } else if (dev_type =3D=3D GDMA_DEVICE_MANA_IB) { + gc->mana_ib.dev_id =3D dev; + gc->mana_ib.gdma_context =3D gc; } } =20 @@ -971,6 +974,7 @@ int mana_gd_register_device(struct gdma_dev *gd) =20 return 0; } +EXPORT_SYMBOL_NS(mana_gd_register_device, NET_MANA); =20 int mana_gd_deregister_device(struct gdma_dev *gd) { @@ -1001,6 +1005,7 @@ int mana_gd_deregister_device(struct gdma_dev *gd) =20 return err; } +EXPORT_SYMBOL_NS(mana_gd_deregister_device, NET_MANA); =20 u32 mana_gd_wq_avail_space(struct gdma_queue *wq) { diff --git a/include/net/mana/gdma.h b/include/net/mana/gdma.h index 88b6ef7ce1a6..000f0d7670f7 100644 --- a/include/net/mana/gdma.h +++ b/include/net/mana/gdma.h @@ -66,6 +66,7 @@ enum { GDMA_DEVICE_NONE =3D 0, GDMA_DEVICE_HWC =3D 1, GDMA_DEVICE_MANA =3D 2, + GDMA_DEVICE_MANA_IB =3D 3, }; =20 struct gdma_resource { @@ -387,6 +388,9 @@ struct gdma_context { =20 /* Azure network adapter */ struct gdma_dev mana; + + /* Azure RDMA adapter */ + struct gdma_dev mana_ib; }; =20 #define MAX_NUM_GDMA_DEVICES 4 --=20 2.25.1