17ade1ff9SMark Zhang /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 27ade1ff9SMark Zhang /* 37ade1ff9SMark Zhang * Copyright (c) 2019 Mellanox Technologies. All rights reserved. 47ade1ff9SMark Zhang */ 57ade1ff9SMark Zhang 67ade1ff9SMark Zhang #ifndef _RDMA_COUNTER_H_ 77ade1ff9SMark Zhang #define _RDMA_COUNTER_H_ 87ade1ff9SMark Zhang 9413d3347SMark Zhang #include <linux/mutex.h> 1099fa331dSMark Zhang #include <linux/pid_namespace.h> 11413d3347SMark Zhang 127ade1ff9SMark Zhang #include <rdma/restrack.h> 13413d3347SMark Zhang #include <rdma/rdma_netlink.h> 14413d3347SMark Zhang 15390d5772SJason Gunthorpe struct ib_device; 1699fa331dSMark Zhang struct ib_qp; 1799fa331dSMark Zhang 18413d3347SMark Zhang struct auto_mode_param { 19413d3347SMark Zhang int qp_type; 20413d3347SMark Zhang }; 21413d3347SMark Zhang 22413d3347SMark Zhang struct rdma_counter_mode { 23413d3347SMark Zhang enum rdma_nl_counter_mode mode; 24413d3347SMark Zhang enum rdma_nl_counter_mask mask; 25413d3347SMark Zhang struct auto_mode_param param; 26413d3347SMark Zhang }; 27413d3347SMark Zhang 28413d3347SMark Zhang struct rdma_port_counter { 29413d3347SMark Zhang struct rdma_counter_mode mode; 30f34a55e4SMark Zhang struct rdma_hw_stats *hstats; 311bd8e0a9SMark Zhang unsigned int num_counters; 32413d3347SMark Zhang struct mutex lock; 33413d3347SMark Zhang }; 347ade1ff9SMark Zhang 357ade1ff9SMark Zhang struct rdma_counter { 367ade1ff9SMark Zhang struct rdma_restrack_entry res; 377ade1ff9SMark Zhang struct ib_device *device; 387ade1ff9SMark Zhang uint32_t id; 3999fa331dSMark Zhang struct kref kref; 4099fa331dSMark Zhang struct rdma_counter_mode mode; 4199fa331dSMark Zhang struct mutex lock; 42c4ffee7cSMark Zhang struct rdma_hw_stats *stats; 431fb7f897SMark Bloch u32 port; 447ade1ff9SMark Zhang }; 45413d3347SMark Zhang 46413d3347SMark Zhang void rdma_counter_init(struct ib_device *dev); 47413d3347SMark Zhang void rdma_counter_release(struct ib_device *dev); 481fb7f897SMark Bloch int rdma_counter_set_auto_mode(struct ib_device *dev, u32 port, 4933eb12f2SPatrisious Haddad enum rdma_nl_counter_mask mask, 5033eb12f2SPatrisious Haddad struct netlink_ext_ack *extack); 511fb7f897SMark Bloch int rdma_counter_bind_qp_auto(struct ib_qp *qp, u32 port); 5299fa331dSMark Zhang int rdma_counter_unbind_qp(struct ib_qp *qp, bool force); 53413d3347SMark Zhang 54c4ffee7cSMark Zhang int rdma_counter_query_stats(struct rdma_counter *counter); 551fb7f897SMark Bloch u64 rdma_counter_get_hwstat_value(struct ib_device *dev, u32 port, u32 index); 561fb7f897SMark Bloch int rdma_counter_bind_qpn(struct ib_device *dev, u32 port, 571bd8e0a9SMark Zhang u32 qp_num, u32 counter_id); 581fb7f897SMark Bloch int rdma_counter_bind_qpn_alloc(struct ib_device *dev, u32 port, 591bd8e0a9SMark Zhang u32 qp_num, u32 *counter_id); 601fb7f897SMark Bloch int rdma_counter_unbind_qpn(struct ib_device *dev, u32 port, 611bd8e0a9SMark Zhang u32 qp_num, u32 counter_id); 621fb7f897SMark Bloch int rdma_counter_get_mode(struct ib_device *dev, u32 port, 63b389327dSMark Zhang enum rdma_nl_counter_mode *mode, 64b389327dSMark Zhang enum rdma_nl_counter_mask *mask); 65c4ffee7cSMark Zhang 66*5e2ddd1eSAharon Landau int rdma_counter_modify(struct ib_device *dev, u32 port, 67*5e2ddd1eSAharon Landau unsigned int index, bool enable); 687ade1ff9SMark Zhang #endif /* _RDMA_COUNTER_H_ */ 69