1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2014-2021 Broadcom
12 #define ULP_FLAG_FC_THREAD BIT(0)
13 #define ULP_FC_TIMER 1/* Timer freq in Sec Flow Counters */
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)
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)
24 #define FLOW_CNTR_PC_FLOW_VALID 0x1000000
26 struct sw_acc_counter {
34 struct hw_fc_mem_info {
36 * [out] mem_va, pointer to the allocated memory.
40 * [out] mem_pa, physical address of the allocated memory.
44 bool start_idx_is_set;
47 struct bnxt_ulp_fc_info {
48 struct sw_acc_counter *sw_acc_tbl[TF_DIR_MAX];
49 struct hw_fc_mem_info shadow_hw_tbl[TF_DIR_MAX];
52 pthread_mutex_t fc_lock;
53 uint32_t num_counters;
57 ulp_fc_mgr_init(struct bnxt_ulp_context *ctxt);
60 * Release all resources in the flow counter manager for this ulp context
62 * ctxt [in] The ulp context for the flow counter manager
65 ulp_fc_mgr_deinit(struct bnxt_ulp_context *ctxt);
68 * Setup the Flow counter timer thread that will fetch/accumulate raw counter
69 * data from the chip's internal flow counters
71 * ctxt [in] The ulp context for the flow counter manager
74 ulp_fc_mgr_thread_start(struct bnxt_ulp_context *ctxt);
77 * Alarm handler that will issue the TF-Core API to fetch
78 * data from the chip's internal flow counters
80 * ctxt [in] The ulp context for the flow counter manager
83 ulp_fc_mgr_alarm_cb(void *arg);
86 * Cancel the alarm handler
88 * ctxt [in] The ulp context for the flow counter manager
91 void ulp_fc_mgr_thread_cancel(struct bnxt_ulp_context *ctxt);
94 * Set the starting index that indicates the first HW flow
97 * ctxt [in] The ulp context for the flow counter manager
99 * dir [in] The direction of the flow
101 * start_idx [in] The HW flow counter ID
104 int ulp_fc_mgr_start_idx_set(struct bnxt_ulp_context *ctxt, enum tf_dir dir,
108 * Set the corresponding SW accumulator table entry based on
109 * the difference between this counter ID and the starting
110 * counter ID. Also, keep track of num of active counter enabled
113 * ctxt [in] The ulp context for the flow counter manager
115 * dir [in] The direction of the flow
117 * hw_cntr_id [in] The HW flow counter ID
120 int ulp_fc_mgr_cntr_set(struct bnxt_ulp_context *ctxt, enum tf_dir dir,
121 uint32_t hw_cntr_id);
123 * Reset the corresponding SW accumulator table entry based on
124 * the difference between this counter ID and the starting
127 * ctxt [in] The ulp context for the flow counter manager
129 * dir [in] The direction of the flow
131 * hw_cntr_id [in] The HW flow counter ID
134 int ulp_fc_mgr_cntr_reset(struct bnxt_ulp_context *ctxt, enum tf_dir dir,
135 uint32_t hw_cntr_id);
137 * Check if the starting HW counter ID value is set in the
138 * flow counter manager.
140 * ctxt [in] The ulp context for the flow counter manager
142 * dir [in] The direction of the flow
145 bool ulp_fc_mgr_start_idx_isset(struct bnxt_ulp_context *ctxt, enum tf_dir dir);
148 * Check if the alarm thread that walks through the flows is started
150 * ctxt [in] The ulp context for the flow counter manager
153 bool ulp_fc_mgr_thread_isstarted(struct bnxt_ulp_context *ctxt);
156 * Fill the rte_flow_query_count 'data' argument passed
157 * in the rte_flow_query() with the values obtained and
158 * accumulated locally.
160 * ctxt [in] The ulp context for the flow counter manager
162 * flow_id [in] The HW flow ID
164 * count [out] The rte_flow_query_count 'data' that is set
167 int ulp_fc_mgr_query_count_get(struct bnxt_ulp_context *ulp_ctx,
169 struct rte_flow_query_count *count);
172 * Set the parent flow if in the SW accumulator table entry
174 * ctxt [in] The ulp context for the flow counter manager
176 * dir [in] The direction of the flow
178 * hw_cntr_id [in] The HW flow counter ID
180 * pc_idx [in] parent child db index
183 int32_t ulp_fc_mgr_cntr_parent_flow_set(struct bnxt_ulp_context *ctxt,
188 #endif /* _ULP_FC_MGR_H_ */