1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2010-2018 Intel Corporation
5 #ifndef _RTE_EMPTY_POLL_H
6 #define _RTE_EMPTY_POLL_H
10 * RTE Power Management
15 #include <rte_common.h>
16 #include <rte_byteorder.h>
18 #include <rte_string_fns.h>
19 #include <rte_power.h>
20 #include <rte_timer.h>
26 #define NUM_FREQS RTE_MAX_LCORE_FREQS
28 #define BINS_AV 4 /* Has to be ^2 */
30 #define DROP (NUM_DIRECTIONS * NUM_DEVICES)
32 #define NUM_PRIORITIES 2
34 #define NUM_NODES 256 /* Max core number*/
36 /* Processor Power State */
45 /* Queue Polling State */
47 TRAINING
, /* NO TRAFFIC */
54 struct freq_threshold
{
58 uint32_t threshold_percent
;
59 uint32_t cur_train_iter
;
62 /* Each Worker Thread Empty Poll Stats */
63 struct priority_worker
{
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
;
71 enum queue_state queue_state
;
73 uint64_t empty_dequeues_prev
;
74 uint64_t num_dequeue_pkts_prev
;
76 /* Used for training only */
77 struct freq_threshold thresh
[NUM_FREQ
];
78 enum freq_val cur_freq
;
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 */
85 /* ppi mean valid poll counter per interval */
86 uint64_t ppi_av
[BINS_AV
];
87 /* valid poll counter */
91 uint32_t iter_counter
;
92 uint32_t threshold_ctr
;
96 } __rte_cache_aligned
;
101 struct priority_worker wrk_stats
[NUM_NODES
];
103 /* flag to stop rx threads processing packets until training over */
108 /* Empty Poll Parameters */
111 /* Timer related stuff */
112 uint64_t interval_ticks
;
113 uint32_t max_train_iter
;
115 struct rte_timer timer0
;
116 struct stats_data wrk_data
;
120 /* Sample App Init information */
123 uint64_t med_base_edpi
;
124 uint64_t hgh_base_edpi
;
126 enum queue_state state
;
132 * Initialize the power management system.
135 * the structure of empty poll configuration
137 * the power state/frequency mapping table
139 * the initialization policy from sample app
143 * - Negative on error.
145 int __rte_experimental
146 rte_power_empty_poll_stat_init(struct ep_params
**eptr
, uint8_t *freq_tlb
,
147 struct ep_policy
*policy
);
150 * Free the resource hold by power management system.
152 void __rte_experimental
153 rte_power_empty_poll_stat_free(void);
156 * Update specific core empty poll counter
157 * It's not thread safe.
164 * - Negative on error.
166 int __rte_experimental
167 rte_power_empty_poll_stat_update(unsigned int lcore_id
);
170 * Update specific core valid poll counter, not thread safe.
175 * The packet number of one valid poll.
179 * - Negative on error.
181 int __rte_experimental
182 rte_power_poll_stat_update(unsigned int lcore_id
, uint8_t nb_pkt
);
185 * Fetch specific core empty poll counter.
191 * Current lcore empty poll counter value.
193 uint64_t __rte_experimental
194 rte_power_empty_poll_stat_fetch(unsigned int lcore_id
);
197 * Fetch specific core valid poll counter.
203 * Current lcore valid poll counter value.
205 uint64_t __rte_experimental
206 rte_power_poll_stat_fetch(unsigned int lcore_id
);
209 * Empty poll state change detection function
212 * The timer structure
214 * The customized parameter
216 void __rte_experimental
217 rte_empty_poll_detection(struct rte_timer
*tim
, void *arg
);