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