Skip to content

Commit d9d5c8e

Browse files
Preethi Grleon
authored andcommitted
RDMA/bnxt_re: Support perf management counters
Add support for process_mad hook to retrieve the perf management counters. Supports IB_PMA_PORT_COUNTERS and IB_PMA_PORT_COUNTERS_EXT counters. Query the data from HW contexts and FW commands. Signed-off-by: Preethi G <preethi.gurusiddalingeswaraswamy@broadcom.com> Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com> Link: https://patch.msgid.link/1741855464-27921-1-git-send-email-selvin.xavier@broadcom.com Signed-off-by: Leon Romanovsky <leon@kernel.org>
1 parent 86ab053 commit d9d5c8e

5 files changed

Lines changed: 139 additions & 0 deletions

File tree

drivers/infiniband/hw/bnxt_re/bnxt_re.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,10 @@ struct bnxt_re_dev {
246246
#define BNXT_RE_CHECK_RC(x) ((x) && ((x) != -ETIMEDOUT))
247247
void bnxt_re_pacing_alert(struct bnxt_re_dev *rdev);
248248

249+
int bnxt_re_assign_pma_port_counters(struct bnxt_re_dev *rdev, struct ib_mad *out_mad);
250+
int bnxt_re_assign_pma_port_ext_counters(struct bnxt_re_dev *rdev,
251+
struct ib_mad *out_mad);
252+
249253
static inline struct device *rdev_to_dev(struct bnxt_re_dev *rdev)
250254
{
251255
if (rdev)

drivers/infiniband/hw/bnxt_re/hw_counters.c

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939

4040
#include <linux/types.h>
4141
#include <linux/pci.h>
42+
#include <rdma/ib_mad.h>
43+
#include <rdma/ib_pma.h>
4244

4345
#include "roce_hsi.h"
4446
#include "qplib_res.h"
@@ -285,6 +287,96 @@ static void bnxt_re_copy_db_pacing_stats(struct bnxt_re_dev *rdev,
285287
readl(rdev->en_dev->bar0 + rdev->pacing.dbr_db_fifo_reg_off);
286288
}
287289

290+
int bnxt_re_assign_pma_port_ext_counters(struct bnxt_re_dev *rdev, struct ib_mad *out_mad)
291+
{
292+
struct ib_pma_portcounters_ext *pma_cnt_ext;
293+
struct bnxt_qplib_ext_stat *estat = &rdev->stats.rstat.ext_stat;
294+
struct ctx_hw_stats *hw_stats = NULL;
295+
int rc;
296+
297+
hw_stats = rdev->qplib_ctx.stats.dma;
298+
299+
pma_cnt_ext = (struct ib_pma_portcounters_ext *)(out_mad->data + 40);
300+
if (_is_ext_stats_supported(rdev->dev_attr->dev_cap_flags)) {
301+
u32 fid = PCI_FUNC(rdev->en_dev->pdev->devfn);
302+
303+
rc = bnxt_qplib_qext_stat(&rdev->rcfw, fid, estat);
304+
if (rc)
305+
return rc;
306+
}
307+
308+
pma_cnt_ext = (struct ib_pma_portcounters_ext *)(out_mad->data + 40);
309+
if ((bnxt_qplib_is_chip_gen_p5(rdev->chip_ctx) && rdev->is_virtfn) ||
310+
!bnxt_qplib_is_chip_gen_p5(rdev->chip_ctx)) {
311+
pma_cnt_ext->port_xmit_data =
312+
cpu_to_be64(le64_to_cpu(hw_stats->tx_ucast_bytes) / 4);
313+
pma_cnt_ext->port_rcv_data =
314+
cpu_to_be64(le64_to_cpu(hw_stats->rx_ucast_bytes) / 4);
315+
pma_cnt_ext->port_xmit_packets =
316+
cpu_to_be64(le64_to_cpu(hw_stats->tx_ucast_pkts));
317+
pma_cnt_ext->port_rcv_packets =
318+
cpu_to_be64(le64_to_cpu(hw_stats->rx_ucast_pkts));
319+
pma_cnt_ext->port_unicast_rcv_packets =
320+
cpu_to_be64(le64_to_cpu(hw_stats->rx_ucast_pkts));
321+
pma_cnt_ext->port_unicast_xmit_packets =
322+
cpu_to_be64(le64_to_cpu(hw_stats->tx_ucast_pkts));
323+
324+
} else {
325+
pma_cnt_ext->port_rcv_packets = cpu_to_be64(estat->rx_roce_good_pkts);
326+
pma_cnt_ext->port_rcv_data = cpu_to_be64(estat->rx_roce_good_bytes / 4);
327+
pma_cnt_ext->port_xmit_packets = cpu_to_be64(estat->tx_roce_pkts);
328+
pma_cnt_ext->port_xmit_data = cpu_to_be64(estat->tx_roce_bytes / 4);
329+
pma_cnt_ext->port_unicast_rcv_packets = cpu_to_be64(estat->rx_roce_good_pkts);
330+
pma_cnt_ext->port_unicast_xmit_packets = cpu_to_be64(estat->tx_roce_pkts);
331+
}
332+
return 0;
333+
}
334+
335+
int bnxt_re_assign_pma_port_counters(struct bnxt_re_dev *rdev, struct ib_mad *out_mad)
336+
{
337+
struct bnxt_qplib_ext_stat *estat = &rdev->stats.rstat.ext_stat;
338+
struct ib_pma_portcounters *pma_cnt;
339+
struct ctx_hw_stats *hw_stats = NULL;
340+
int rc;
341+
342+
hw_stats = rdev->qplib_ctx.stats.dma;
343+
344+
pma_cnt = (struct ib_pma_portcounters *)(out_mad->data + 40);
345+
if (_is_ext_stats_supported(rdev->dev_attr->dev_cap_flags)) {
346+
u32 fid = PCI_FUNC(rdev->en_dev->pdev->devfn);
347+
348+
rc = bnxt_qplib_qext_stat(&rdev->rcfw, fid, estat);
349+
if (rc)
350+
return rc;
351+
}
352+
if ((bnxt_qplib_is_chip_gen_p5(rdev->chip_ctx) && rdev->is_virtfn) ||
353+
!bnxt_qplib_is_chip_gen_p5(rdev->chip_ctx)) {
354+
pma_cnt->port_rcv_packets =
355+
cpu_to_be32((u32)(le64_to_cpu(hw_stats->rx_ucast_pkts)) & 0xFFFFFFFF);
356+
pma_cnt->port_rcv_data =
357+
cpu_to_be32((u32)((le64_to_cpu(hw_stats->rx_ucast_bytes) &
358+
0xFFFFFFFF) / 4));
359+
pma_cnt->port_xmit_packets =
360+
cpu_to_be32((u32)(le64_to_cpu(hw_stats->tx_ucast_pkts)) & 0xFFFFFFFF);
361+
pma_cnt->port_xmit_data =
362+
cpu_to_be32((u32)((le64_to_cpu(hw_stats->tx_ucast_bytes)
363+
& 0xFFFFFFFF) / 4));
364+
} else {
365+
pma_cnt->port_rcv_packets = cpu_to_be32(estat->rx_roce_good_pkts);
366+
pma_cnt->port_rcv_data = cpu_to_be32((estat->rx_roce_good_bytes / 4));
367+
pma_cnt->port_xmit_packets = cpu_to_be32(estat->tx_roce_pkts);
368+
pma_cnt->port_xmit_data = cpu_to_be32((estat->tx_roce_bytes / 4));
369+
}
370+
pma_cnt->port_rcv_constraint_errors = (u8)(le64_to_cpu(hw_stats->rx_discard_pkts) & 0xFF);
371+
pma_cnt->port_rcv_errors = cpu_to_be16((u16)(le64_to_cpu(hw_stats->rx_error_pkts)
372+
& 0xFFFF));
373+
pma_cnt->port_xmit_constraint_errors = (u8)(le64_to_cpu(hw_stats->tx_error_pkts) & 0xFF);
374+
pma_cnt->port_xmit_discards = cpu_to_be16((u16)(le64_to_cpu(hw_stats->tx_discard_pkts)
375+
& 0xFFFF));
376+
377+
return 0;
378+
}
379+
288380
int bnxt_re_ib_get_hw_stats(struct ib_device *ibdev,
289381
struct rdma_hw_stats *stats,
290382
u32 port, int index)

drivers/infiniband/hw/bnxt_re/ib_verbs.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#include <rdma/ib_addr.h>
5050
#include <rdma/ib_mad.h>
5151
#include <rdma/ib_cache.h>
52+
#include <rdma/ib_pma.h>
5253
#include <rdma/uverbs_ioctl.h>
5354
#include <linux/hashtable.h>
5455

@@ -4489,6 +4490,41 @@ void bnxt_re_mmap_free(struct rdma_user_mmap_entry *rdma_entry)
44894490
kfree(bnxt_entry);
44904491
}
44914492

4493+
int bnxt_re_process_mad(struct ib_device *ibdev, int mad_flags,
4494+
u32 port_num, const struct ib_wc *in_wc,
4495+
const struct ib_grh *in_grh,
4496+
const struct ib_mad *in_mad, struct ib_mad *out_mad,
4497+
size_t *out_mad_size, u16 *out_mad_pkey_index)
4498+
{
4499+
struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
4500+
struct ib_class_port_info cpi = {};
4501+
int ret = IB_MAD_RESULT_SUCCESS;
4502+
int rc = 0;
4503+
4504+
if (in_mad->mad_hdr.mgmt_class != IB_MGMT_CLASS_PERF_MGMT)
4505+
return ret;
4506+
4507+
switch (in_mad->mad_hdr.attr_id) {
4508+
case IB_PMA_CLASS_PORT_INFO:
4509+
cpi.capability_mask = IB_PMA_CLASS_CAP_EXT_WIDTH;
4510+
memcpy((out_mad->data + 40), &cpi, sizeof(cpi));
4511+
break;
4512+
case IB_PMA_PORT_COUNTERS_EXT:
4513+
rc = bnxt_re_assign_pma_port_ext_counters(rdev, out_mad);
4514+
break;
4515+
case IB_PMA_PORT_COUNTERS:
4516+
rc = bnxt_re_assign_pma_port_counters(rdev, out_mad);
4517+
break;
4518+
default:
4519+
rc = -EINVAL;
4520+
break;
4521+
}
4522+
if (rc)
4523+
return IB_MAD_RESULT_FAILURE;
4524+
ret |= IB_MAD_RESULT_REPLY;
4525+
return ret;
4526+
}
4527+
44924528
static int UVERBS_HANDLER(BNXT_RE_METHOD_NOTIFY_DRV)(struct uverbs_attr_bundle *attrs)
44934529
{
44944530
struct bnxt_re_ucontext *uctx;

drivers/infiniband/hw/bnxt_re/ib_verbs.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,12 @@ void bnxt_re_dealloc_ucontext(struct ib_ucontext *context);
268268
int bnxt_re_mmap(struct ib_ucontext *context, struct vm_area_struct *vma);
269269
void bnxt_re_mmap_free(struct rdma_user_mmap_entry *rdma_entry);
270270

271+
int bnxt_re_process_mad(struct ib_device *device, int process_mad_flags,
272+
u32 port_num, const struct ib_wc *in_wc,
273+
const struct ib_grh *in_grh,
274+
const struct ib_mad *in_mad, struct ib_mad *out_mad,
275+
size_t *out_mad_size, u16 *out_mad_pkey_index);
276+
271277
static inline u32 __to_ib_port_num(u16 port_id)
272278
{
273279
return (u32)port_id + 1;

drivers/infiniband/hw/bnxt_re/main.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1276,6 +1276,7 @@ static const struct ib_device_ops bnxt_re_dev_ops = {
12761276
.post_recv = bnxt_re_post_recv,
12771277
.post_send = bnxt_re_post_send,
12781278
.post_srq_recv = bnxt_re_post_srq_recv,
1279+
.process_mad = bnxt_re_process_mad,
12791280
.query_ah = bnxt_re_query_ah,
12801281
.query_device = bnxt_re_query_device,
12811282
.modify_device = bnxt_re_modify_device,

0 commit comments

Comments
 (0)