1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2010-2018 Intel Corporation 3 */ 4 5 #ifndef _RTE_EMPTY_POLL_H 6 #define _RTE_EMPTY_POLL_H 7 8 /** 9 * @file 10 * RTE Power Management 11 */ 12 #include <stdint.h> 13 #include <stdbool.h> 14 15 #include <rte_common.h> 16 #include <rte_byteorder.h> 17 #include <rte_log.h> 18 #include <rte_string_fns.h> 19 #include <rte_power.h> 20 #include <rte_timer.h> 21 22 #ifdef __cplusplus 23 extern "C" { 24 #endif 25 26 #define NUM_FREQS RTE_MAX_LCORE_FREQS 27 28 #define BINS_AV 4 /* Has to be ^2 */ 29 30 #define DROP (NUM_DIRECTIONS * NUM_DEVICES) 31 32 #define NUM_PRIORITIES 2 33 34 #define NUM_NODES 256 /* Max core number*/ 35 36 /* Processor Power State */ 37 enum freq_val { 38 LOW, 39 MED, 40 HGH, 41 NUM_FREQ = NUM_FREQS 42 }; 43 44 45 /* Queue Polling State */ 46 enum queue_state { 47 TRAINING, /* NO TRAFFIC */ 48 MED_NORMAL, /* MED */ 49 HGH_BUSY, /* HIGH */ 50 LOW_PURGE, /* LOW */ 51 }; 52 53 /* Queue Stats */ 54 struct freq_threshold { 55 56 uint64_t base_edpi; 57 bool trained; 58 uint32_t threshold_percent; 59 uint32_t cur_train_iter; 60 }; 61 62 /* Each Worker Thread Empty Poll Stats */ 63 struct priority_worker { 64 65 /* Current dequeue and throughput counts */ 66 /* These 2 are written to by the worker threads */ 67 /* So keep them on their own cache line */ 68 uint64_t empty_dequeues; 69 uint64_t num_dequeue_pkts; 70 71 enum queue_state queue_state; 72 73 uint64_t empty_dequeues_prev; 74 uint64_t num_dequeue_pkts_prev; 75 76 /* Used for training only */ 77 struct freq_threshold thresh[NUM_FREQ]; 78 enum freq_val cur_freq; 79 80 /* bucket arrays to calculate the averages */ 81 /* edpi mean empty poll counter difference per interval */ 82 uint64_t edpi_av[BINS_AV]; 83 /* empty poll counter */ 84 uint32_t ec; 85 /* ppi mean valid poll counter per interval */ 86 uint64_t ppi_av[BINS_AV]; 87 /* valid poll counter */ 88 uint32_t pc; 89 90 uint32_t lcore_id; 91 uint32_t iter_counter; 92 uint32_t threshold_ctr; 93 uint32_t display_ctr; 94 uint8_t dev_id; 95 96 } __rte_cache_aligned; 97 98 99 struct stats_data { 100 101 struct priority_worker wrk_stats[NUM_NODES]; 102 103 /* flag to stop rx threads processing packets until training over */ 104 bool start_rx; 105 106 }; 107 108 /* Empty Poll Parameters */ 109 struct ep_params { 110 111 /* Timer related stuff */ 112 uint64_t interval_ticks; 113 uint32_t max_train_iter; 114 115 struct rte_timer timer0; 116 struct stats_data wrk_data; 117 }; 118 119 120 /* Sample App Init information */ 121 struct ep_policy { 122 123 uint64_t med_base_edpi; 124 uint64_t hgh_base_edpi; 125 126 enum queue_state state; 127 }; 128 129 130 131 /** 132 * Initialize the power management system. 133 * 134 * @param eptr 135 * the structure of empty poll configuration 136 * @param freq_tlb 137 * the power state/frequency mapping table 138 * @param policy 139 * the initialization policy from sample app 140 * 141 * @return 142 * - 0 on success. 143 * - Negative on error. 144 */ 145 int __rte_experimental 146 rte_power_empty_poll_stat_init(struct ep_params **eptr, uint8_t *freq_tlb, 147 struct ep_policy *policy); 148 149 /** 150 * Free the resource hold by power management system. 151 */ 152 void __rte_experimental 153 rte_power_empty_poll_stat_free(void); 154 155 /** 156 * Update specific core empty poll counter 157 * It's not thread safe. 158 * 159 * @param lcore_id 160 * lcore id 161 * 162 * @return 163 * - 0 on success. 164 * - Negative on error. 165 */ 166 int __rte_experimental 167 rte_power_empty_poll_stat_update(unsigned int lcore_id); 168 169 /** 170 * Update specific core valid poll counter, not thread safe. 171 * 172 * @param lcore_id 173 * lcore id. 174 * @param nb_pkt 175 * The packet number of one valid poll. 176 * 177 * @return 178 * - 0 on success. 179 * - Negative on error. 180 */ 181 int __rte_experimental 182 rte_power_poll_stat_update(unsigned int lcore_id, uint8_t nb_pkt); 183 184 /** 185 * Fetch specific core empty poll counter. 186 * 187 * @param lcore_id 188 * lcore id 189 * 190 * @return 191 * Current lcore empty poll counter value. 192 */ 193 uint64_t __rte_experimental 194 rte_power_empty_poll_stat_fetch(unsigned int lcore_id); 195 196 /** 197 * Fetch specific core valid poll counter. 198 * 199 * @param lcore_id 200 * lcore id 201 * 202 * @return 203 * Current lcore valid poll counter value. 204 */ 205 uint64_t __rte_experimental 206 rte_power_poll_stat_fetch(unsigned int lcore_id); 207 208 /** 209 * Empty poll state change detection function 210 * 211 * @param tim 212 * The timer structure 213 * @param arg 214 * The customized parameter 215 */ 216 void __rte_experimental 217 rte_empty_poll_detection(struct rte_timer *tim, void *arg); 218 219 #ifdef __cplusplus 220 } 221 #endif 222 223 #endif 224