xref: /dpdk/lib/power/power_uncore_ops.h (revision ebe99d351a3f79acf305b882052f286c65cd9b25)
1*ebe99d35SSivaprasad Tummala /* SPDX-License-Identifier: BSD-3-Clause
2*ebe99d35SSivaprasad Tummala  * Copyright(c) 2022 Intel Corporation
3*ebe99d35SSivaprasad Tummala  * Copyright(c) 2024 Advanced Micro Devices, Inc.
4*ebe99d35SSivaprasad Tummala  */
5*ebe99d35SSivaprasad Tummala 
6*ebe99d35SSivaprasad Tummala #ifndef POWER_UNCORE_OPS_H
7*ebe99d35SSivaprasad Tummala #define POWER_UNCORE_OPS_H
8*ebe99d35SSivaprasad Tummala 
9*ebe99d35SSivaprasad Tummala /**
10*ebe99d35SSivaprasad Tummala  * @file
11*ebe99d35SSivaprasad Tummala  * Uncore Frequency Management
12*ebe99d35SSivaprasad Tummala  */
13*ebe99d35SSivaprasad Tummala 
14*ebe99d35SSivaprasad Tummala #include <rte_compat.h>
15*ebe99d35SSivaprasad Tummala #include <rte_common.h>
16*ebe99d35SSivaprasad Tummala 
17*ebe99d35SSivaprasad Tummala #define RTE_POWER_UNCORE_DRIVER_NAMESZ 24
18*ebe99d35SSivaprasad Tummala 
19*ebe99d35SSivaprasad Tummala /**
20*ebe99d35SSivaprasad Tummala  * Initialize uncore frequency management for specific die on a package.
21*ebe99d35SSivaprasad Tummala  * It will get the available frequencies and prepare to set new die frequencies.
22*ebe99d35SSivaprasad Tummala  *
23*ebe99d35SSivaprasad Tummala  * This function should NOT be called in the fast path.
24*ebe99d35SSivaprasad Tummala  *
25*ebe99d35SSivaprasad Tummala  * @param pkg
26*ebe99d35SSivaprasad Tummala  *  Package number.
27*ebe99d35SSivaprasad Tummala  *  Each physical CPU in a system is referred to as a package.
28*ebe99d35SSivaprasad Tummala  * @param die
29*ebe99d35SSivaprasad Tummala  *  Die number.
30*ebe99d35SSivaprasad Tummala  *  Each package can have several dies connected together via the uncore mesh.
31*ebe99d35SSivaprasad Tummala  *
32*ebe99d35SSivaprasad Tummala  * @return
33*ebe99d35SSivaprasad Tummala  * - 0 on success.
34*ebe99d35SSivaprasad Tummala  * - Negative on error.
35*ebe99d35SSivaprasad Tummala  */
36*ebe99d35SSivaprasad Tummala typedef int (*rte_power_uncore_init_t)(unsigned int pkg, unsigned int die);
37*ebe99d35SSivaprasad Tummala 
38*ebe99d35SSivaprasad Tummala /**
39*ebe99d35SSivaprasad Tummala  * Exit uncore frequency management on a specific die on a package.
40*ebe99d35SSivaprasad Tummala  * It will restore uncore min and* max values to previous values
41*ebe99d35SSivaprasad Tummala  * before initialization of API.
42*ebe99d35SSivaprasad Tummala  *
43*ebe99d35SSivaprasad Tummala  * This function should NOT be called in the fast path.
44*ebe99d35SSivaprasad Tummala  *
45*ebe99d35SSivaprasad Tummala  * @param pkg
46*ebe99d35SSivaprasad Tummala  *  Package number.
47*ebe99d35SSivaprasad Tummala  *  Each physical CPU in a system is referred to as a package.
48*ebe99d35SSivaprasad Tummala  * @param die
49*ebe99d35SSivaprasad Tummala  *  Die number.
50*ebe99d35SSivaprasad Tummala  *  Each package can have several dies connected together via the uncore mesh.
51*ebe99d35SSivaprasad Tummala  *
52*ebe99d35SSivaprasad Tummala  * @return
53*ebe99d35SSivaprasad Tummala  * - 0 on success.
54*ebe99d35SSivaprasad Tummala  * - Negative on error.
55*ebe99d35SSivaprasad Tummala  */
56*ebe99d35SSivaprasad Tummala typedef int (*rte_power_uncore_exit_t)(unsigned int pkg, unsigned int die);
57*ebe99d35SSivaprasad Tummala 
58*ebe99d35SSivaprasad Tummala /**
59*ebe99d35SSivaprasad Tummala  * Return the current index of available frequencies of a specific die on a package.
60*ebe99d35SSivaprasad Tummala  * It should be protected outside of this function for threadsafe.
61*ebe99d35SSivaprasad Tummala  *
62*ebe99d35SSivaprasad Tummala  * This function should NOT be called in the fast path.
63*ebe99d35SSivaprasad Tummala  *
64*ebe99d35SSivaprasad Tummala  * @param pkg
65*ebe99d35SSivaprasad Tummala  *  Package number.
66*ebe99d35SSivaprasad Tummala  *  Each physical CPU in a system is referred to as a package.
67*ebe99d35SSivaprasad Tummala  * @param die
68*ebe99d35SSivaprasad Tummala  *  Die number.
69*ebe99d35SSivaprasad Tummala  *  Each package can have several dies connected together via the uncore mesh.
70*ebe99d35SSivaprasad Tummala  *
71*ebe99d35SSivaprasad Tummala  * @return
72*ebe99d35SSivaprasad Tummala  *  The current index of available frequencies.
73*ebe99d35SSivaprasad Tummala  *  If error, it will return 'RTE_POWER_INVALID_FREQ_INDEX = (~0)'.
74*ebe99d35SSivaprasad Tummala  */
75*ebe99d35SSivaprasad Tummala typedef uint32_t (*rte_power_get_uncore_freq_t)(unsigned int pkg, unsigned int die);
76*ebe99d35SSivaprasad Tummala 
77*ebe99d35SSivaprasad Tummala /**
78*ebe99d35SSivaprasad Tummala  * Set minimum and maximum uncore frequency for specified die on a package
79*ebe99d35SSivaprasad Tummala  * to specified index value.
80*ebe99d35SSivaprasad Tummala  * It should be protected outside of this function for threadsafe.
81*ebe99d35SSivaprasad Tummala  *
82*ebe99d35SSivaprasad Tummala  * This function should NOT be called in the fast path.
83*ebe99d35SSivaprasad Tummala  *
84*ebe99d35SSivaprasad Tummala  * @param pkg
85*ebe99d35SSivaprasad Tummala  *  Package number.
86*ebe99d35SSivaprasad Tummala  *  Each physical CPU in a system is referred to as a package.
87*ebe99d35SSivaprasad Tummala  * @param die
88*ebe99d35SSivaprasad Tummala  *  Die number.
89*ebe99d35SSivaprasad Tummala  *  Each package can have several dies connected together via the uncore mesh.
90*ebe99d35SSivaprasad Tummala  * @param index
91*ebe99d35SSivaprasad Tummala  *  The index of available frequencies.
92*ebe99d35SSivaprasad Tummala  *
93*ebe99d35SSivaprasad Tummala  * @return
94*ebe99d35SSivaprasad Tummala  *  - 1 on success with frequency changed.
95*ebe99d35SSivaprasad Tummala  *  - 0 on success without frequency changed.
96*ebe99d35SSivaprasad Tummala  *  - Negative on error.
97*ebe99d35SSivaprasad Tummala  */
98*ebe99d35SSivaprasad Tummala typedef int (*rte_power_set_uncore_freq_t)(unsigned int pkg, unsigned int die, uint32_t index);
99*ebe99d35SSivaprasad Tummala 
100*ebe99d35SSivaprasad Tummala /**
101*ebe99d35SSivaprasad Tummala  * Return the list length of available frequencies in the index array.
102*ebe99d35SSivaprasad Tummala  *
103*ebe99d35SSivaprasad Tummala  * This function should NOT be called in the fast path.
104*ebe99d35SSivaprasad Tummala  *
105*ebe99d35SSivaprasad Tummala  * @param pkg
106*ebe99d35SSivaprasad Tummala  *  Package number.
107*ebe99d35SSivaprasad Tummala  *  Each physical CPU in a system is referred to as a package.
108*ebe99d35SSivaprasad Tummala  * @param die
109*ebe99d35SSivaprasad Tummala  *  Die number.
110*ebe99d35SSivaprasad Tummala  *  Each package can have several dies connected together via the uncore mesh.
111*ebe99d35SSivaprasad Tummala  * @param index
112*ebe99d35SSivaprasad Tummala  *  The index of available frequencies.
113*ebe99d35SSivaprasad Tummala  *
114*ebe99d35SSivaprasad Tummala  * @return
115*ebe99d35SSivaprasad Tummala  *  - 1 on success with frequency changed.
116*ebe99d35SSivaprasad Tummala  *  - 0 on success without frequency changed.
117*ebe99d35SSivaprasad Tummala  *  - Negative on error.
118*ebe99d35SSivaprasad Tummala  */
119*ebe99d35SSivaprasad Tummala typedef int (*rte_power_set_uncore_freq_t)(unsigned int pkg, unsigned int die, uint32_t index);
120*ebe99d35SSivaprasad Tummala 
121*ebe99d35SSivaprasad Tummala /**
122*ebe99d35SSivaprasad Tummala  * Return the list length of available frequencies in the index array.
123*ebe99d35SSivaprasad Tummala  *
124*ebe99d35SSivaprasad Tummala  * This function should NOT be called in the fast path.
125*ebe99d35SSivaprasad Tummala  *
126*ebe99d35SSivaprasad Tummala  * @param pkg
127*ebe99d35SSivaprasad Tummala  *  Package number.
128*ebe99d35SSivaprasad Tummala  *  Each physical CPU in a system is referred to as a package.
129*ebe99d35SSivaprasad Tummala  * @param die
130*ebe99d35SSivaprasad Tummala  *  Die number.
131*ebe99d35SSivaprasad Tummala  *  Each package can have several dies connected together via the uncore mesh.
132*ebe99d35SSivaprasad Tummala  *
133*ebe99d35SSivaprasad Tummala  * @return
134*ebe99d35SSivaprasad Tummala  *  - The number of available index's in frequency array.
135*ebe99d35SSivaprasad Tummala  *  - Negative on error.
136*ebe99d35SSivaprasad Tummala  */
137*ebe99d35SSivaprasad Tummala typedef int (*rte_power_uncore_get_num_freqs_t)(unsigned int pkg, unsigned int die);
138*ebe99d35SSivaprasad Tummala 
139*ebe99d35SSivaprasad Tummala /**
140*ebe99d35SSivaprasad Tummala  * Return the list of available frequencies in the index array.
141*ebe99d35SSivaprasad Tummala  *
142*ebe99d35SSivaprasad Tummala  * This function should NOT be called in the fast path.
143*ebe99d35SSivaprasad Tummala  *
144*ebe99d35SSivaprasad Tummala  * @param pkg
145*ebe99d35SSivaprasad Tummala  *  Package number.
146*ebe99d35SSivaprasad Tummala  *  Each physical CPU in a system is referred to as a package.
147*ebe99d35SSivaprasad Tummala  * @param die
148*ebe99d35SSivaprasad Tummala  *  Die number.
149*ebe99d35SSivaprasad Tummala  *  Each package can have several dies connected together via the uncore mesh.
150*ebe99d35SSivaprasad Tummala  * @param freqs
151*ebe99d35SSivaprasad Tummala  *  The buffer array to save the frequencies.
152*ebe99d35SSivaprasad Tummala  * @param num
153*ebe99d35SSivaprasad Tummala  *  The number of frequencies to get.
154*ebe99d35SSivaprasad Tummala  *
155*ebe99d35SSivaprasad Tummala  * @return
156*ebe99d35SSivaprasad Tummala  *  - The number of available index's in frequency array.
157*ebe99d35SSivaprasad Tummala  *  - Negative on error.
158*ebe99d35SSivaprasad Tummala  */
159*ebe99d35SSivaprasad Tummala typedef int (*rte_power_uncore_freqs_t)(unsigned int pkg, unsigned int die,
160*ebe99d35SSivaprasad Tummala 					uint32_t *freqs, uint32_t num);
161*ebe99d35SSivaprasad Tummala /**
162*ebe99d35SSivaprasad Tummala  * Function pointers for generic frequency change functions.
163*ebe99d35SSivaprasad Tummala  *
164*ebe99d35SSivaprasad Tummala  * @param pkg
165*ebe99d35SSivaprasad Tummala  *  Package number.
166*ebe99d35SSivaprasad Tummala  *  Each physical CPU in a system is referred to as a package.
167*ebe99d35SSivaprasad Tummala  * @param die
168*ebe99d35SSivaprasad Tummala  *  Die number.
169*ebe99d35SSivaprasad Tummala  *  Each package can have several dies connected together via the uncore mesh.
170*ebe99d35SSivaprasad Tummala  *
171*ebe99d35SSivaprasad Tummala  * @return
172*ebe99d35SSivaprasad Tummala  *  - 1 on success with frequency changed.
173*ebe99d35SSivaprasad Tummala  *  - 0 on success without frequency changed.
174*ebe99d35SSivaprasad Tummala  *  - Negative on error.
175*ebe99d35SSivaprasad Tummala  */
176*ebe99d35SSivaprasad Tummala typedef int (*rte_power_uncore_freq_change_t)(unsigned int pkg, unsigned int die);
177*ebe99d35SSivaprasad Tummala 
178*ebe99d35SSivaprasad Tummala /**
179*ebe99d35SSivaprasad Tummala  * Return the number of packages (CPUs) on a system
180*ebe99d35SSivaprasad Tummala  * by parsing the uncore sysfs directory.
181*ebe99d35SSivaprasad Tummala  *
182*ebe99d35SSivaprasad Tummala  * This function should NOT be called in the fast path.
183*ebe99d35SSivaprasad Tummala  *
184*ebe99d35SSivaprasad Tummala  * @return
185*ebe99d35SSivaprasad Tummala  *  - Zero on error.
186*ebe99d35SSivaprasad Tummala  *  - Number of package on system on success.
187*ebe99d35SSivaprasad Tummala  */
188*ebe99d35SSivaprasad Tummala typedef unsigned int (*rte_power_uncore_get_num_pkgs_t)(void);
189*ebe99d35SSivaprasad Tummala 
190*ebe99d35SSivaprasad Tummala /**
191*ebe99d35SSivaprasad Tummala  * Return the number of dies for pakckages (CPUs) specified
192*ebe99d35SSivaprasad Tummala  * from parsing the uncore sysfs directory.
193*ebe99d35SSivaprasad Tummala  *
194*ebe99d35SSivaprasad Tummala  * This function should NOT be called in the fast path.
195*ebe99d35SSivaprasad Tummala  *
196*ebe99d35SSivaprasad Tummala  * @param pkg
197*ebe99d35SSivaprasad Tummala  *  Package number.
198*ebe99d35SSivaprasad Tummala  *  Each physical CPU in a system is referred to as a package.
199*ebe99d35SSivaprasad Tummala  *
200*ebe99d35SSivaprasad Tummala  * @return
201*ebe99d35SSivaprasad Tummala  *  - Zero on error.
202*ebe99d35SSivaprasad Tummala  *  - Number of dies for package on sucecss.
203*ebe99d35SSivaprasad Tummala  */
204*ebe99d35SSivaprasad Tummala typedef unsigned int (*rte_power_uncore_get_num_dies_t)(unsigned int pkg);
205*ebe99d35SSivaprasad Tummala typedef void (*rte_power_uncore_driver_cb_t)(void);
206*ebe99d35SSivaprasad Tummala 
207*ebe99d35SSivaprasad Tummala /** Structure defining uncore power operations structure */
208*ebe99d35SSivaprasad Tummala struct rte_power_uncore_ops {
209*ebe99d35SSivaprasad Tummala 	RTE_TAILQ_ENTRY(rte_power_uncore_ops) next;     /**< Next in list. */
210*ebe99d35SSivaprasad Tummala 	char name[RTE_POWER_UNCORE_DRIVER_NAMESZ];      /**< power mgmt driver. */
211*ebe99d35SSivaprasad Tummala 	rte_power_uncore_driver_cb_t cb;                /**< Driver specific callbacks. */
212*ebe99d35SSivaprasad Tummala 	rte_power_uncore_init_t init;                   /**< Initialize power management. */
213*ebe99d35SSivaprasad Tummala 	rte_power_uncore_exit_t exit;                   /**< Exit power management. */
214*ebe99d35SSivaprasad Tummala 	rte_power_uncore_get_num_pkgs_t get_num_pkgs;
215*ebe99d35SSivaprasad Tummala 	rte_power_uncore_get_num_dies_t get_num_dies;
216*ebe99d35SSivaprasad Tummala 	rte_power_uncore_get_num_freqs_t get_num_freqs; /**< Number of available frequencies. */
217*ebe99d35SSivaprasad Tummala 	rte_power_uncore_freqs_t get_avail_freqs;       /**< Get the available frequencies. */
218*ebe99d35SSivaprasad Tummala 	rte_power_get_uncore_freq_t get_freq;           /**< Get frequency index. */
219*ebe99d35SSivaprasad Tummala 	rte_power_set_uncore_freq_t set_freq;           /**< Set frequency index. */
220*ebe99d35SSivaprasad Tummala 	rte_power_uncore_freq_change_t freq_max;        /**< Scale up frequency to highest. */
221*ebe99d35SSivaprasad Tummala 	rte_power_uncore_freq_change_t freq_min;        /**< Scale up frequency to lowest. */
222*ebe99d35SSivaprasad Tummala };
223*ebe99d35SSivaprasad Tummala 
224*ebe99d35SSivaprasad Tummala /**
225*ebe99d35SSivaprasad Tummala  * Register power uncore frequency operations.
226*ebe99d35SSivaprasad Tummala  * @param ops
227*ebe99d35SSivaprasad Tummala  *   Pointer to an ops structure to register.
228*ebe99d35SSivaprasad Tummala  * @return
229*ebe99d35SSivaprasad Tummala  *  - 0: Success.
230*ebe99d35SSivaprasad Tummala  *  - Negative on error.
231*ebe99d35SSivaprasad Tummala  */
232*ebe99d35SSivaprasad Tummala __rte_internal
233*ebe99d35SSivaprasad Tummala int rte_power_register_uncore_ops(struct rte_power_uncore_ops *ops);
234*ebe99d35SSivaprasad Tummala 
235*ebe99d35SSivaprasad Tummala /**
236*ebe99d35SSivaprasad Tummala  * Macro to statically register the ops of an uncore driver.
237*ebe99d35SSivaprasad Tummala  */
238*ebe99d35SSivaprasad Tummala #define RTE_POWER_REGISTER_UNCORE_OPS(ops) \
239*ebe99d35SSivaprasad Tummala RTE_INIT(power_hdlr_init_uncore_##ops) \
240*ebe99d35SSivaprasad Tummala { \
241*ebe99d35SSivaprasad Tummala 	rte_power_register_uncore_ops(&ops); \
242*ebe99d35SSivaprasad Tummala }
243*ebe99d35SSivaprasad Tummala 
244*ebe99d35SSivaprasad Tummala #endif /* POWER_UNCORE_OPS_H */
245