xref: /dpdk/drivers/net/bnxt/tf_ulp/ulp_fc_mgr.h (revision 10eaf41d)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2014-2021 Broadcom
3  * All rights reserved.
4  */
5 
6 #ifndef _ULP_FC_MGR_H_
7 #define _ULP_FC_MGR_H_
8 
9 #include "bnxt_ulp.h"
10 #include "tf_core.h"
11 
12 #define ULP_FLAG_FC_THREAD			BIT(0)
13 #define ULP_FC_TIMER	1/* Timer freq in Sec Flow Counters */
14 
15 /* Macros to extract packet/byte counters from a 64-bit flow counter. */
16 #define FLOW_CNTR_BYTE_WIDTH 36
17 #define FLOW_CNTR_BYTE_MASK  (((uint64_t)1 << FLOW_CNTR_BYTE_WIDTH) - 1)
18 
19 #define FLOW_CNTR_PKTS(v, d) (((v) & (d)->packet_count_mask) >> \
20 		(d)->packet_count_shift)
21 #define FLOW_CNTR_BYTES(v, d) (((v) & (d)->byte_count_mask) >> \
22 		(d)->byte_count_shift)
23 
24 struct sw_acc_counter {
25 	uint64_t pkt_count;
26 	uint64_t byte_count;
27 	bool	valid;
28 	uint32_t hw_cntr_id;
29 	uint32_t parent_flow_id;
30 };
31 
32 struct hw_fc_mem_info {
33 	/*
34 	 * [out] mem_va, pointer to the allocated memory.
35 	 */
36 	void *mem_va;
37 	/*
38 	 * [out] mem_pa, physical address of the allocated memory.
39 	 */
40 	void *mem_pa;
41 	uint32_t start_idx;
42 	bool start_idx_is_set;
43 };
44 
45 struct bnxt_ulp_fc_info {
46 	struct sw_acc_counter	*sw_acc_tbl[TF_DIR_MAX];
47 	struct hw_fc_mem_info	shadow_hw_tbl[TF_DIR_MAX];
48 	uint32_t		flags;
49 	uint32_t		num_entries;
50 	pthread_mutex_t		fc_lock;
51 	uint32_t		num_counters;
52 };
53 
54 int32_t
55 ulp_fc_mgr_init(struct bnxt_ulp_context *ctxt);
56 
57 /*
58  * Release all resources in the flow counter manager for this ulp context
59  *
60  * ctxt [in] The ulp context for the flow counter manager
61  */
62 int32_t
63 ulp_fc_mgr_deinit(struct bnxt_ulp_context *ctxt);
64 
65 /*
66  * Setup the Flow counter timer thread that will fetch/accumulate raw counter
67  * data from the chip's internal flow counters
68  *
69  * ctxt [in] The ulp context for the flow counter manager
70  */
71 int32_t
72 ulp_fc_mgr_thread_start(struct bnxt_ulp_context *ctxt);
73 
74 /*
75  * Alarm handler that will issue the TF-Core API to fetch
76  * data from the chip's internal flow counters
77  *
78  * ctxt [in] The ulp context for the flow counter manager
79  */
80 void
81 ulp_fc_mgr_alarm_cb(void *arg);
82 
83 /*
84  * Cancel the alarm handler
85  *
86  * ctxt [in] The ulp context for the flow counter manager
87  *
88  */
89 void ulp_fc_mgr_thread_cancel(struct bnxt_ulp_context *ctxt);
90 
91 /*
92  * Set the starting index that indicates the first HW flow
93  * counter ID
94  *
95  * ctxt [in] The ulp context for the flow counter manager
96  *
97  * dir [in] The direction of the flow
98  *
99  * start_idx [in] The HW flow counter ID
100  *
101  */
102 int ulp_fc_mgr_start_idx_set(struct bnxt_ulp_context *ctxt, enum tf_dir dir,
103 			     uint32_t start_idx);
104 
105 /*
106  * Set the corresponding SW accumulator table entry based on
107  * the difference between this counter ID and the starting
108  * counter ID. Also, keep track of num of active counter enabled
109  * flows.
110  *
111  * ctxt [in] The ulp context for the flow counter manager
112  *
113  * dir [in] The direction of the flow
114  *
115  * hw_cntr_id [in] The HW flow counter ID
116  *
117  */
118 int ulp_fc_mgr_cntr_set(struct bnxt_ulp_context *ctxt, enum tf_dir dir,
119 			uint32_t hw_cntr_id);
120 /*
121  * Reset the corresponding SW accumulator table entry based on
122  * the difference between this counter ID and the starting
123  * counter ID.
124  *
125  * ctxt [in] The ulp context for the flow counter manager
126  *
127  * dir [in] The direction of the flow
128  *
129  * hw_cntr_id [in] The HW flow counter ID
130  *
131  */
132 int ulp_fc_mgr_cntr_reset(struct bnxt_ulp_context *ctxt, enum tf_dir dir,
133 			  uint32_t hw_cntr_id);
134 /*
135  * Check if the starting HW counter ID value is set in the
136  * flow counter manager.
137  *
138  * ctxt [in] The ulp context for the flow counter manager
139  *
140  * dir [in] The direction of the flow
141  *
142  */
143 bool ulp_fc_mgr_start_idx_isset(struct bnxt_ulp_context *ctxt, enum tf_dir dir);
144 
145 /*
146  * Check if the alarm thread that walks through the flows is started
147  *
148  * ctxt [in] The ulp context for the flow counter manager
149  *
150  */
151 bool ulp_fc_mgr_thread_isstarted(struct bnxt_ulp_context *ctxt);
152 
153 /*
154  * Fill the rte_flow_query_count 'data' argument passed
155  * in the rte_flow_query() with the values obtained and
156  * accumulated locally.
157  *
158  * ctxt [in] The ulp context for the flow counter manager
159  *
160  * flow_id [in] The HW flow ID
161  *
162  * count [out] The rte_flow_query_count 'data' that is set
163  *
164  */
165 int ulp_fc_mgr_query_count_get(struct bnxt_ulp_context *ulp_ctx,
166 			       uint32_t flow_id,
167 			       struct rte_flow_query_count *count);
168 
169 /*
170  * Set the parent flow if in the SW accumulator table entry
171  *
172  * ctxt [in] The ulp context for the flow counter manager
173  *
174  * dir [in] The direction of the flow
175  *
176  * hw_cntr_id [in] The HW flow counter ID
177  *
178  * fid [in] parent flow id
179  *
180  */
181 int32_t ulp_fc_mgr_cntr_parent_flow_set(struct bnxt_ulp_context *ctxt,
182 					enum tf_dir dir,
183 					uint32_t hw_cntr_id,
184 					uint32_t fid);
185 
186 #endif /* _ULP_FC_MGR_H_ */
187