Skip to content

Commit a7f0636

Browse files
longlimsftrleon
authored andcommitted
RDMA/mana_ib: register RDMA device with GDMA
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 <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Leon Romanovsky <[email protected]>
1 parent 82a8903 commit a7f0636

File tree

5 files changed

+38
-14
lines changed

5 files changed

+38
-14
lines changed

drivers/infiniband/hw/mana/device.c

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ static int mana_ib_probe(struct auxiliary_device *adev,
6868
ibdev_dbg(&dev->ib_dev, "mdev=%p id=%d num_ports=%d\n", mdev,
6969
mdev->dev_id.as_uint32, dev->ib_dev.phys_port_cnt);
7070

71-
dev->gdma_dev = mdev;
7271
dev->ib_dev.node_type = RDMA_NODE_IB_CA;
7372

7473
/*
@@ -78,23 +77,38 @@ static int mana_ib_probe(struct auxiliary_device *adev,
7877
dev->ib_dev.num_comp_vectors = 1;
7978
dev->ib_dev.dev.parent = mdev->gdma_context->dev;
8079

81-
ret = ib_register_device(&dev->ib_dev, "mana_%d",
82-
mdev->gdma_context->dev);
80+
ret = mana_gd_register_device(&mdev->gdma_context->mana_ib);
8381
if (ret) {
84-
ib_dealloc_device(&dev->ib_dev);
85-
return ret;
82+
ibdev_err(&dev->ib_dev, "Failed to register device, ret %d",
83+
ret);
84+
goto free_ib_device;
8685
}
86+
dev->gdma_dev = &mdev->gdma_context->mana_ib;
87+
88+
ret = ib_register_device(&dev->ib_dev, "mana_%d",
89+
mdev->gdma_context->dev);
90+
if (ret)
91+
goto deregister_device;
8792

8893
dev_set_drvdata(&adev->dev, dev);
8994

9095
return 0;
96+
97+
deregister_device:
98+
mana_gd_deregister_device(dev->gdma_dev);
99+
free_ib_device:
100+
ib_dealloc_device(&dev->ib_dev);
101+
return ret;
91102
}
92103

93104
static void mana_ib_remove(struct auxiliary_device *adev)
94105
{
95106
struct mana_ib_dev *dev = dev_get_drvdata(&adev->dev);
96107

97108
ib_unregister_device(&dev->ib_dev);
109+
110+
mana_gd_deregister_device(dev->gdma_dev);
111+
98112
ib_dealloc_device(&dev->ib_dev);
99113
}
100114

drivers/infiniband/hw/mana/main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
void mana_ib_uncfg_vport(struct mana_ib_dev *dev, struct mana_ib_pd *pd,
99
u32 port)
1010
{
11-
struct gdma_dev *gd = dev->gdma_dev;
11+
struct gdma_dev *gd = &dev->gdma_dev->gdma_context->mana;
1212
struct mana_port_context *mpc;
1313
struct net_device *ndev;
1414
struct mana_context *mc;
@@ -31,7 +31,7 @@ void mana_ib_uncfg_vport(struct mana_ib_dev *dev, struct mana_ib_pd *pd,
3131
int mana_ib_cfg_vport(struct mana_ib_dev *dev, u32 port, struct mana_ib_pd *pd,
3232
u32 doorbell_id)
3333
{
34-
struct gdma_dev *mdev = dev->gdma_dev;
34+
struct gdma_dev *mdev = &dev->gdma_dev->gdma_context->mana;
3535
struct mana_port_context *mpc;
3636
struct mana_context *mc;
3737
struct net_device *ndev;

drivers/infiniband/hw/mana/qp.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ static int mana_ib_cfg_vport_steering(struct mana_ib_dev *dev,
2121
u32 req_buf_size;
2222
int i, err;
2323

24-
mdev = dev->gdma_dev;
25-
gc = mdev->gdma_context;
24+
gc = dev->gdma_dev->gdma_context;
25+
mdev = &gc->mana;
2626

2727
req_buf_size =
2828
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,
102102
struct ib_rwq_ind_table *ind_tbl = attr->rwq_ind_tbl;
103103
struct mana_ib_create_qp_rss_resp resp = {};
104104
struct mana_ib_create_qp_rss ucmd = {};
105-
struct gdma_dev *gd = mdev->gdma_dev;
106105
mana_handle_t *mana_ind_table;
107106
struct mana_port_context *mpc;
107+
unsigned int ind_tbl_size;
108108
struct mana_context *mc;
109109
struct net_device *ndev;
110110
struct mana_ib_cq *cq;
111111
struct mana_ib_wq *wq;
112-
unsigned int ind_tbl_size;
112+
struct gdma_dev *gd;
113113
struct ib_cq *ibcq;
114114
struct ib_wq *ibwq;
115115
int i = 0;
116116
u32 port;
117117
int ret;
118118

119+
gd = &mdev->gdma_dev->gdma_context->mana;
119120
mc = gd->driver_data;
120121

121122
if (!udata || udata->inlen < sizeof(ucmd))
@@ -266,8 +267,8 @@ static int mana_ib_create_qp_raw(struct ib_qp *ibqp, struct ib_pd *ibpd,
266267
struct mana_ib_ucontext *mana_ucontext =
267268
rdma_udata_to_drv_context(udata, struct mana_ib_ucontext,
268269
ibucontext);
270+
struct gdma_dev *gd = &mdev->gdma_dev->gdma_context->mana;
269271
struct mana_ib_create_qp_resp resp = {};
270-
struct gdma_dev *gd = mdev->gdma_dev;
271272
struct mana_ib_create_qp ucmd = {};
272273
struct mana_obj_spec wq_spec = {};
273274
struct mana_obj_spec cq_spec = {};
@@ -437,7 +438,7 @@ static int mana_ib_destroy_qp_rss(struct mana_ib_qp *qp,
437438
{
438439
struct mana_ib_dev *mdev =
439440
container_of(qp->ibqp.device, struct mana_ib_dev, ib_dev);
440-
struct gdma_dev *gd = mdev->gdma_dev;
441+
struct gdma_dev *gd = &mdev->gdma_dev->gdma_context->mana;
441442
struct mana_port_context *mpc;
442443
struct mana_context *mc;
443444
struct net_device *ndev;
@@ -464,7 +465,7 @@ static int mana_ib_destroy_qp_raw(struct mana_ib_qp *qp, struct ib_udata *udata)
464465
{
465466
struct mana_ib_dev *mdev =
466467
container_of(qp->ibqp.device, struct mana_ib_dev, ib_dev);
467-
struct gdma_dev *gd = mdev->gdma_dev;
468+
struct gdma_dev *gd = &mdev->gdma_dev->gdma_context->mana;
468469
struct ib_pd *ibpd = qp->ibqp.pd;
469470
struct mana_port_context *mpc;
470471
struct mana_context *mc;

drivers/net/ethernet/microsoft/mana/gdma_main.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@ static int mana_gd_detect_devices(struct pci_dev *pdev)
158158
if (dev_type == GDMA_DEVICE_MANA) {
159159
gc->mana.gdma_context = gc;
160160
gc->mana.dev_id = dev;
161+
} else if (dev_type == GDMA_DEVICE_MANA_IB) {
162+
gc->mana_ib.dev_id = dev;
163+
gc->mana_ib.gdma_context = gc;
161164
}
162165
}
163166

@@ -971,6 +974,7 @@ int mana_gd_register_device(struct gdma_dev *gd)
971974

972975
return 0;
973976
}
977+
EXPORT_SYMBOL_NS(mana_gd_register_device, NET_MANA);
974978

975979
int mana_gd_deregister_device(struct gdma_dev *gd)
976980
{
@@ -1001,6 +1005,7 @@ int mana_gd_deregister_device(struct gdma_dev *gd)
10011005

10021006
return err;
10031007
}
1008+
EXPORT_SYMBOL_NS(mana_gd_deregister_device, NET_MANA);
10041009

10051010
u32 mana_gd_wq_avail_space(struct gdma_queue *wq)
10061011
{

include/net/mana/gdma.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ enum {
6666
GDMA_DEVICE_NONE = 0,
6767
GDMA_DEVICE_HWC = 1,
6868
GDMA_DEVICE_MANA = 2,
69+
GDMA_DEVICE_MANA_IB = 3,
6970
};
7071

7172
struct gdma_resource {
@@ -387,6 +388,9 @@ struct gdma_context {
387388

388389
/* Azure network adapter */
389390
struct gdma_dev mana;
391+
392+
/* Azure RDMA adapter */
393+
struct gdma_dev mana_ib;
390394
};
391395

392396
#define MAX_NUM_GDMA_DEVICES 4

0 commit comments

Comments
 (0)