Skip to content

Commit c390828

Browse files
Konstantin Taranovrleon
authored andcommitted
RDMA/mana_ib: Add support of mana_ib for RNIC and ETH nic
Allow mana_ib to be created over ethernet gdma device and over rnic gdma device. The HW has two devices with different capabilities and different use-cases. Initialize required resources depending on the used gdma device. Signed-off-by: Konstantin Taranov <[email protected]> Link: https://patch.msgid.link/[email protected] Reviewed-by: Long Li <[email protected]> Signed-off-by: Leon Romanovsky <[email protected]>
1 parent ced82fc commit c390828

File tree

3 files changed

+138
-97
lines changed

3 files changed

+138
-97
lines changed

drivers/infiniband/hw/mana/device.c

Lines changed: 83 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -101,103 +101,95 @@ static int mana_ib_probe(struct auxiliary_device *adev,
101101
const struct auxiliary_device_id *id)
102102
{
103103
struct mana_adev *madev = container_of(adev, struct mana_adev, adev);
104+
struct gdma_context *gc = madev->mdev->gdma_context;
105+
struct mana_context *mc = gc->mana.driver_data;
104106
struct gdma_dev *mdev = madev->mdev;
105107
struct net_device *ndev;
106-
struct mana_context *mc;
107108
struct mana_ib_dev *dev;
108109
u8 mac_addr[ETH_ALEN];
109110
int ret;
110111

111-
mc = mdev->driver_data;
112-
113112
dev = ib_alloc_device(mana_ib_dev, ib_dev);
114113
if (!dev)
115114
return -ENOMEM;
116115

117116
ib_set_device_ops(&dev->ib_dev, &mana_ib_dev_ops);
118-
119-
dev->ib_dev.phys_port_cnt = mc->num_ports;
120-
121-
ibdev_dbg(&dev->ib_dev, "mdev=%p id=%d num_ports=%d\n", mdev,
122-
mdev->dev_id.as_uint32, dev->ib_dev.phys_port_cnt);
123-
124117
dev->ib_dev.node_type = RDMA_NODE_IB_CA;
125-
126-
/*
127-
* num_comp_vectors needs to set to the max MSIX index
128-
* when interrupts and event queues are implemented
129-
*/
130-
dev->ib_dev.num_comp_vectors = mdev->gdma_context->max_num_queues;
131-
dev->ib_dev.dev.parent = mdev->gdma_context->dev;
132-
133-
ndev = mana_get_primary_netdev(mc, 0, &dev->dev_tracker);
134-
if (!ndev) {
135-
ret = -ENODEV;
136-
ibdev_err(&dev->ib_dev, "Failed to get netdev for IB port 1");
137-
goto free_ib_device;
138-
}
139-
ether_addr_copy(mac_addr, ndev->dev_addr);
140-
addrconf_addr_eui48((u8 *)&dev->ib_dev.node_guid, ndev->dev_addr);
141-
ret = ib_device_set_netdev(&dev->ib_dev, ndev, 1);
142-
/* mana_get_primary_netdev() returns ndev with refcount held */
143-
netdev_put(ndev, &dev->dev_tracker);
144-
if (ret) {
145-
ibdev_err(&dev->ib_dev, "Failed to set ib netdev, ret %d", ret);
146-
goto free_ib_device;
147-
}
148-
149-
ret = mana_gd_register_device(&mdev->gdma_context->mana_ib);
150-
if (ret) {
151-
ibdev_err(&dev->ib_dev, "Failed to register device, ret %d",
152-
ret);
153-
goto free_ib_device;
154-
}
155-
dev->gdma_dev = &mdev->gdma_context->mana_ib;
156-
157-
dev->nb.notifier_call = mana_ib_netdev_event;
158-
ret = register_netdevice_notifier(&dev->nb);
159-
if (ret) {
160-
ibdev_err(&dev->ib_dev, "Failed to register net notifier, %d",
161-
ret);
162-
goto deregister_device;
163-
}
164-
165-
ret = mana_ib_gd_query_adapter_caps(dev);
166-
if (ret) {
167-
ibdev_err(&dev->ib_dev, "Failed to query device caps, ret %d",
168-
ret);
169-
goto deregister_net_notifier;
170-
}
171-
172-
ib_set_device_ops(&dev->ib_dev, &mana_ib_stats_ops);
173-
174-
ret = mana_ib_create_eqs(dev);
175-
if (ret) {
176-
ibdev_err(&dev->ib_dev, "Failed to create EQs, ret %d", ret);
177-
goto deregister_net_notifier;
178-
}
179-
180-
ret = mana_ib_gd_create_rnic_adapter(dev);
181-
if (ret)
182-
goto destroy_eqs;
183-
118+
dev->ib_dev.num_comp_vectors = gc->max_num_queues;
119+
dev->ib_dev.dev.parent = gc->dev;
120+
dev->gdma_dev = mdev;
184121
xa_init_flags(&dev->qp_table_wq, XA_FLAGS_LOCK_IRQ);
185-
ret = mana_ib_gd_config_mac(dev, ADDR_OP_ADD, mac_addr);
186-
if (ret) {
187-
ibdev_err(&dev->ib_dev, "Failed to add Mac address, ret %d",
188-
ret);
189-
goto destroy_rnic;
122+
123+
if (mana_ib_is_rnic(dev)) {
124+
dev->ib_dev.phys_port_cnt = 1;
125+
ndev = mana_get_primary_netdev(mc, 0, &dev->dev_tracker);
126+
if (!ndev) {
127+
ret = -ENODEV;
128+
ibdev_err(&dev->ib_dev, "Failed to get netdev for IB port 1");
129+
goto free_ib_device;
130+
}
131+
ether_addr_copy(mac_addr, ndev->dev_addr);
132+
addrconf_addr_eui48((u8 *)&dev->ib_dev.node_guid, ndev->dev_addr);
133+
ret = ib_device_set_netdev(&dev->ib_dev, ndev, 1);
134+
/* mana_get_primary_netdev() returns ndev with refcount held */
135+
netdev_put(ndev, &dev->dev_tracker);
136+
if (ret) {
137+
ibdev_err(&dev->ib_dev, "Failed to set ib netdev, ret %d", ret);
138+
goto free_ib_device;
139+
}
140+
141+
dev->nb.notifier_call = mana_ib_netdev_event;
142+
ret = register_netdevice_notifier(&dev->nb);
143+
if (ret) {
144+
ibdev_err(&dev->ib_dev, "Failed to register net notifier, %d",
145+
ret);
146+
goto free_ib_device;
147+
}
148+
149+
ret = mana_ib_gd_query_adapter_caps(dev);
150+
if (ret) {
151+
ibdev_err(&dev->ib_dev, "Failed to query device caps, ret %d", ret);
152+
goto deregister_net_notifier;
153+
}
154+
155+
ib_set_device_ops(&dev->ib_dev, &mana_ib_stats_ops);
156+
157+
ret = mana_ib_create_eqs(dev);
158+
if (ret) {
159+
ibdev_err(&dev->ib_dev, "Failed to create EQs, ret %d", ret);
160+
goto deregister_net_notifier;
161+
}
162+
163+
ret = mana_ib_gd_create_rnic_adapter(dev);
164+
if (ret)
165+
goto destroy_eqs;
166+
167+
ret = mana_ib_gd_config_mac(dev, ADDR_OP_ADD, mac_addr);
168+
if (ret) {
169+
ibdev_err(&dev->ib_dev, "Failed to add Mac address, ret %d", ret);
170+
goto destroy_rnic;
171+
}
172+
} else {
173+
dev->ib_dev.phys_port_cnt = mc->num_ports;
174+
ret = mana_eth_query_adapter_caps(dev);
175+
if (ret) {
176+
ibdev_err(&dev->ib_dev, "Failed to query ETH device caps, ret %d", ret);
177+
goto free_ib_device;
178+
}
190179
}
191180

192-
dev->av_pool = dma_pool_create("mana_ib_av", mdev->gdma_context->dev,
193-
MANA_AV_BUFFER_SIZE, MANA_AV_BUFFER_SIZE, 0);
181+
dev->av_pool = dma_pool_create("mana_ib_av", gc->dev, MANA_AV_BUFFER_SIZE,
182+
MANA_AV_BUFFER_SIZE, 0);
194183
if (!dev->av_pool) {
195184
ret = -ENOMEM;
196185
goto destroy_rnic;
197186
}
198187

199-
ret = ib_register_device(&dev->ib_dev, "mana_%d",
200-
mdev->gdma_context->dev);
188+
ibdev_dbg(&dev->ib_dev, "mdev=%p id=%d num_ports=%d\n", mdev,
189+
mdev->dev_id.as_uint32, dev->ib_dev.phys_port_cnt);
190+
191+
ret = ib_register_device(&dev->ib_dev, mana_ib_is_rnic(dev) ? "mana_%d" : "manae_%d",
192+
gc->dev);
201193
if (ret)
202194
goto deallocate_pool;
203195

@@ -208,15 +200,16 @@ static int mana_ib_probe(struct auxiliary_device *adev,
208200
deallocate_pool:
209201
dma_pool_destroy(dev->av_pool);
210202
destroy_rnic:
211-
xa_destroy(&dev->qp_table_wq);
212-
mana_ib_gd_destroy_rnic_adapter(dev);
203+
if (mana_ib_is_rnic(dev))
204+
mana_ib_gd_destroy_rnic_adapter(dev);
213205
destroy_eqs:
214-
mana_ib_destroy_eqs(dev);
206+
if (mana_ib_is_rnic(dev))
207+
mana_ib_destroy_eqs(dev);
215208
deregister_net_notifier:
216-
unregister_netdevice_notifier(&dev->nb);
217-
deregister_device:
218-
mana_gd_deregister_device(dev->gdma_dev);
209+
if (mana_ib_is_rnic(dev))
210+
unregister_netdevice_notifier(&dev->nb);
219211
free_ib_device:
212+
xa_destroy(&dev->qp_table_wq);
220213
ib_dealloc_device(&dev->ib_dev);
221214
return ret;
222215
}
@@ -227,25 +220,24 @@ static void mana_ib_remove(struct auxiliary_device *adev)
227220

228221
ib_unregister_device(&dev->ib_dev);
229222
dma_pool_destroy(dev->av_pool);
223+
if (mana_ib_is_rnic(dev)) {
224+
mana_ib_gd_destroy_rnic_adapter(dev);
225+
mana_ib_destroy_eqs(dev);
226+
unregister_netdevice_notifier(&dev->nb);
227+
}
230228
xa_destroy(&dev->qp_table_wq);
231-
mana_ib_gd_destroy_rnic_adapter(dev);
232-
mana_ib_destroy_eqs(dev);
233-
unregister_netdevice_notifier(&dev->nb);
234-
mana_gd_deregister_device(dev->gdma_dev);
235229
ib_dealloc_device(&dev->ib_dev);
236230
}
237231

238232
static const struct auxiliary_device_id mana_id_table[] = {
239-
{
240-
.name = "mana.rdma",
241-
},
233+
{ .name = "mana.rdma", },
234+
{ .name = "mana.eth", },
242235
{},
243236
};
244237

245238
MODULE_DEVICE_TABLE(auxiliary, mana_id_table);
246239

247240
static struct auxiliary_driver mana_driver = {
248-
.name = "rdma",
249241
.probe = mana_ib_probe,
250242
.remove = mana_ib_remove,
251243
.id_table = mana_id_table,

drivers/infiniband/hw/mana/main.c

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55

66
#include "mana_ib.h"
7+
#include "linux/pci.h"
78

89
void mana_ib_uncfg_vport(struct mana_ib_dev *dev, struct mana_ib_pd *pd,
910
u32 port)
@@ -551,6 +552,7 @@ int mana_ib_mmap(struct ib_ucontext *ibcontext, struct vm_area_struct *vma)
551552
int mana_ib_get_port_immutable(struct ib_device *ibdev, u32 port_num,
552553
struct ib_port_immutable *immutable)
553554
{
555+
struct mana_ib_dev *dev = container_of(ibdev, struct mana_ib_dev, ib_dev);
554556
struct ib_port_attr attr;
555557
int err;
556558

@@ -560,10 +562,12 @@ int mana_ib_get_port_immutable(struct ib_device *ibdev, u32 port_num,
560562

561563
immutable->pkey_tbl_len = attr.pkey_tbl_len;
562564
immutable->gid_tbl_len = attr.gid_tbl_len;
563-
immutable->core_cap_flags = RDMA_CORE_PORT_RAW_PACKET;
564-
if (port_num == 1) {
565-
immutable->core_cap_flags |= RDMA_CORE_PORT_IBA_ROCE_UDP_ENCAP;
565+
566+
if (mana_ib_is_rnic(dev)) {
567+
immutable->core_cap_flags = RDMA_CORE_PORT_IBA_ROCE_UDP_ENCAP;
566568
immutable->max_mad_size = IB_MGMT_MAD_SIZE;
569+
} else {
570+
immutable->core_cap_flags = RDMA_CORE_PORT_RAW_PACKET;
567571
}
568572

569573
return 0;
@@ -572,10 +576,12 @@ int mana_ib_get_port_immutable(struct ib_device *ibdev, u32 port_num,
572576
int mana_ib_query_device(struct ib_device *ibdev, struct ib_device_attr *props,
573577
struct ib_udata *uhw)
574578
{
575-
struct mana_ib_dev *dev = container_of(ibdev,
576-
struct mana_ib_dev, ib_dev);
579+
struct mana_ib_dev *dev = container_of(ibdev, struct mana_ib_dev, ib_dev);
580+
struct pci_dev *pdev = to_pci_dev(mdev_to_gc(dev)->dev);
577581

578582
memset(props, 0, sizeof(*props));
583+
props->vendor_id = pdev->vendor;
584+
props->vendor_part_id = dev->gdma_dev->dev_id.type;
579585
props->max_mr_size = MANA_IB_MAX_MR_SIZE;
580586
props->page_size_cap = dev->adapter_caps.page_size_cap;
581587
props->max_qp = dev->adapter_caps.max_qp_count;
@@ -596,13 +602,16 @@ int mana_ib_query_device(struct ib_device *ibdev, struct ib_device_attr *props,
596602
props->max_ah = INT_MAX;
597603
props->max_pkeys = 1;
598604
props->local_ca_ack_delay = MANA_CA_ACK_DELAY;
605+
if (!mana_ib_is_rnic(dev))
606+
props->raw_packet_caps = IB_RAW_PACKET_CAP_IP_CSUM;
599607

600608
return 0;
601609
}
602610

603611
int mana_ib_query_port(struct ib_device *ibdev, u32 port,
604612
struct ib_port_attr *props)
605613
{
614+
struct mana_ib_dev *dev = container_of(ibdev, struct mana_ib_dev, ib_dev);
606615
struct net_device *ndev = mana_ib_get_netdev(ibdev, port);
607616

608617
if (!ndev)
@@ -623,7 +632,7 @@ int mana_ib_query_port(struct ib_device *ibdev, u32 port,
623632
props->active_width = IB_WIDTH_4X;
624633
props->active_speed = IB_SPEED_EDR;
625634
props->pkey_tbl_len = 1;
626-
if (port == 1) {
635+
if (mana_ib_is_rnic(dev)) {
627636
props->gid_tbl_len = 16;
628637
props->port_cap_flags = IB_PORT_CM_SUP;
629638
props->ip_gids = true;
@@ -703,6 +712,37 @@ int mana_ib_gd_query_adapter_caps(struct mana_ib_dev *dev)
703712
return 0;
704713
}
705714

715+
int mana_eth_query_adapter_caps(struct mana_ib_dev *dev)
716+
{
717+
struct mana_ib_adapter_caps *caps = &dev->adapter_caps;
718+
struct gdma_query_max_resources_resp resp = {};
719+
struct gdma_general_req req = {};
720+
int err;
721+
722+
mana_gd_init_req_hdr(&req.hdr, GDMA_QUERY_MAX_RESOURCES,
723+
sizeof(req), sizeof(resp));
724+
725+
err = mana_gd_send_request(mdev_to_gc(dev), sizeof(req), &req, sizeof(resp), &resp);
726+
if (err) {
727+
ibdev_err(&dev->ib_dev,
728+
"Failed to query adapter caps err %d", err);
729+
return err;
730+
}
731+
732+
caps->max_qp_count = min_t(u32, resp.max_sq, resp.max_rq);
733+
caps->max_cq_count = resp.max_cq;
734+
caps->max_mr_count = resp.max_mst;
735+
caps->max_pd_count = 0x6000;
736+
caps->max_qp_wr = min_t(u32,
737+
0x100000 / GDMA_MAX_SQE_SIZE,
738+
0x100000 / GDMA_MAX_RQE_SIZE);
739+
caps->max_send_sge_count = 30;
740+
caps->max_recv_sge_count = 15;
741+
caps->page_size_cap = PAGE_SZ_BM;
742+
743+
return 0;
744+
}
745+
706746
static void
707747
mana_ib_event_handler(void *ctx, struct gdma_queue *q, struct gdma_event *event)
708748
{
@@ -921,6 +961,9 @@ int mana_ib_gd_create_cq(struct mana_ib_dev *mdev, struct mana_ib_cq *cq, u32 do
921961
struct mana_rnic_create_cq_req req = {};
922962
int err;
923963

964+
if (!mdev->eqs)
965+
return -EINVAL;
966+
924967
mana_gd_init_req_hdr(&req.hdr, MANA_IB_CREATE_CQ, sizeof(req), sizeof(resp));
925968
req.hdr.dev_id = gc->mana_ib.dev_id;
926969
req.adapter = mdev->adapter_handle;

drivers/infiniband/hw/mana/mana_ib.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,11 @@ static inline void mana_put_qp_ref(struct mana_ib_qp *qp)
544544
complete(&qp->free);
545545
}
546546

547+
static inline bool mana_ib_is_rnic(struct mana_ib_dev *mdev)
548+
{
549+
return mdev->gdma_dev->dev_id.type == GDMA_DEVICE_MANA_IB;
550+
}
551+
547552
static inline struct net_device *mana_ib_get_netdev(struct ib_device *ibdev, u32 port)
548553
{
549554
struct mana_ib_dev *mdev = container_of(ibdev, struct mana_ib_dev, ib_dev);
@@ -643,6 +648,7 @@ int mana_ib_query_gid(struct ib_device *ibdev, u32 port, int index,
643648
void mana_ib_disassociate_ucontext(struct ib_ucontext *ibcontext);
644649

645650
int mana_ib_gd_query_adapter_caps(struct mana_ib_dev *mdev);
651+
int mana_eth_query_adapter_caps(struct mana_ib_dev *mdev);
646652

647653
int mana_ib_create_eqs(struct mana_ib_dev *mdev);
648654

0 commit comments

Comments
 (0)