xref: /openbmc/linux/include/rdma/rdma_counter.h (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
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