xref: /dpdk/lib/power/power_cpufreq.h (revision 6f987b594fa6751b49769755fe1d1bf9f9d15ac4)
1*6f987b59SSivaprasad Tummala /* SPDX-License-Identifier: BSD-3-Clause
2*6f987b59SSivaprasad Tummala  * Copyright(c) 2010-2014 Intel Corporation
3*6f987b59SSivaprasad Tummala  * Copyright(c) 2024 Advanced Micro Devices, Inc.
4*6f987b59SSivaprasad Tummala  */
5*6f987b59SSivaprasad Tummala 
6*6f987b59SSivaprasad Tummala #ifndef POWER_CPUFREQ_H
7*6f987b59SSivaprasad Tummala #define POWER_CPUFREQ_H
8*6f987b59SSivaprasad Tummala 
9*6f987b59SSivaprasad Tummala /**
10*6f987b59SSivaprasad Tummala  * @file
11*6f987b59SSivaprasad Tummala  * CPU Frequency Management
12*6f987b59SSivaprasad Tummala  */
13*6f987b59SSivaprasad Tummala 
14*6f987b59SSivaprasad Tummala #include <rte_common.h>
15*6f987b59SSivaprasad Tummala #include <rte_log.h>
16*6f987b59SSivaprasad Tummala #include <rte_compat.h>
17*6f987b59SSivaprasad Tummala 
18*6f987b59SSivaprasad Tummala #define RTE_POWER_DRIVER_NAMESZ 24
19*6f987b59SSivaprasad Tummala 
20*6f987b59SSivaprasad Tummala /**
21*6f987b59SSivaprasad Tummala  * Initialize power management for a specific lcore. If rte_power_set_env() has
22*6f987b59SSivaprasad Tummala  * not been called then an auto-detect of the environment will start and
23*6f987b59SSivaprasad Tummala  * initialise the corresponding resources.
24*6f987b59SSivaprasad Tummala  *
25*6f987b59SSivaprasad Tummala  * @param lcore_id
26*6f987b59SSivaprasad Tummala  *  lcore id.
27*6f987b59SSivaprasad Tummala  *
28*6f987b59SSivaprasad Tummala  * @return
29*6f987b59SSivaprasad Tummala  *  - 0 on success.
30*6f987b59SSivaprasad Tummala  *  - Negative on error.
31*6f987b59SSivaprasad Tummala  */
32*6f987b59SSivaprasad Tummala typedef int (*rte_power_cpufreq_init_t)(unsigned int lcore_id);
33*6f987b59SSivaprasad Tummala 
34*6f987b59SSivaprasad Tummala /**
35*6f987b59SSivaprasad Tummala  * Exit power management on a specific lcore. This will call the environment
36*6f987b59SSivaprasad Tummala  * dependent exit function.
37*6f987b59SSivaprasad Tummala  *
38*6f987b59SSivaprasad Tummala  * @param lcore_id
39*6f987b59SSivaprasad Tummala  *  lcore id.
40*6f987b59SSivaprasad Tummala  *
41*6f987b59SSivaprasad Tummala  * @return
42*6f987b59SSivaprasad Tummala  *  - 0 on success.
43*6f987b59SSivaprasad Tummala  *  - Negative on error.
44*6f987b59SSivaprasad Tummala  */
45*6f987b59SSivaprasad Tummala typedef int (*rte_power_cpufreq_exit_t)(unsigned int lcore_id);
46*6f987b59SSivaprasad Tummala 
47*6f987b59SSivaprasad Tummala /**
48*6f987b59SSivaprasad Tummala  * Check if a specific power management environment type is supported on a
49*6f987b59SSivaprasad Tummala  * currently running system.
50*6f987b59SSivaprasad Tummala  *
51*6f987b59SSivaprasad Tummala  * @return
52*6f987b59SSivaprasad Tummala  *   - 1 if supported
53*6f987b59SSivaprasad Tummala  *   - 0 if unsupported
54*6f987b59SSivaprasad Tummala  *   - -1 if error, with rte_errno indicating reason for error.
55*6f987b59SSivaprasad Tummala  */
56*6f987b59SSivaprasad Tummala typedef int (*rte_power_check_env_support_t)(void);
57*6f987b59SSivaprasad Tummala 
58*6f987b59SSivaprasad Tummala /**
59*6f987b59SSivaprasad Tummala  * Get the available frequencies of a specific lcore.
60*6f987b59SSivaprasad Tummala  * Function pointer definition. Review each environments
61*6f987b59SSivaprasad Tummala  * specific documentation for usage.
62*6f987b59SSivaprasad Tummala  *
63*6f987b59SSivaprasad Tummala  * @param lcore_id
64*6f987b59SSivaprasad Tummala  *  lcore id.
65*6f987b59SSivaprasad Tummala  * @param freqs
66*6f987b59SSivaprasad Tummala  *  The buffer array to save the frequencies.
67*6f987b59SSivaprasad Tummala  * @param num
68*6f987b59SSivaprasad Tummala  *  The number of frequencies to get.
69*6f987b59SSivaprasad Tummala  *
70*6f987b59SSivaprasad Tummala  * @return
71*6f987b59SSivaprasad Tummala  *  The number of available frequencies.
72*6f987b59SSivaprasad Tummala  */
73*6f987b59SSivaprasad Tummala typedef uint32_t (*rte_power_freqs_t)(unsigned int lcore_id,
74*6f987b59SSivaprasad Tummala 		uint32_t *freqs, uint32_t num);
75*6f987b59SSivaprasad Tummala 
76*6f987b59SSivaprasad Tummala /**
77*6f987b59SSivaprasad Tummala  * Return the current index of available frequencies of a specific lcore.
78*6f987b59SSivaprasad Tummala  * Function pointer definition. Review each environments
79*6f987b59SSivaprasad Tummala  * specific documentation for usage.
80*6f987b59SSivaprasad Tummala  *
81*6f987b59SSivaprasad Tummala  * @param lcore_id
82*6f987b59SSivaprasad Tummala  *  lcore id.
83*6f987b59SSivaprasad Tummala  *
84*6f987b59SSivaprasad Tummala  * @return
85*6f987b59SSivaprasad Tummala  *  The current index of available frequencies.
86*6f987b59SSivaprasad Tummala  */
87*6f987b59SSivaprasad Tummala typedef uint32_t (*rte_power_get_freq_t)(unsigned int lcore_id);
88*6f987b59SSivaprasad Tummala 
89*6f987b59SSivaprasad Tummala /**
90*6f987b59SSivaprasad Tummala  * Set the new frequency for a specific lcore by indicating the index of
91*6f987b59SSivaprasad Tummala  * available frequencies.
92*6f987b59SSivaprasad Tummala  * Function pointer definition. Review each environments
93*6f987b59SSivaprasad Tummala  * specific documentation for usage.
94*6f987b59SSivaprasad Tummala  *
95*6f987b59SSivaprasad Tummala  * @param lcore_id
96*6f987b59SSivaprasad Tummala  *  lcore id.
97*6f987b59SSivaprasad Tummala  * @param index
98*6f987b59SSivaprasad Tummala  *  The index of available frequencies.
99*6f987b59SSivaprasad Tummala  *
100*6f987b59SSivaprasad Tummala  * @return
101*6f987b59SSivaprasad Tummala  *  - 1 on success with frequency changed.
102*6f987b59SSivaprasad Tummala  *  - 0 on success without frequency changed.
103*6f987b59SSivaprasad Tummala  *  - Negative on error.
104*6f987b59SSivaprasad Tummala  */
105*6f987b59SSivaprasad Tummala typedef int (*rte_power_set_freq_t)(unsigned int lcore_id, uint32_t index);
106*6f987b59SSivaprasad Tummala 
107*6f987b59SSivaprasad Tummala /**
108*6f987b59SSivaprasad Tummala  * Function pointer definition for generic frequency change functions. Review
109*6f987b59SSivaprasad Tummala  * each environments specific documentation for usage.
110*6f987b59SSivaprasad Tummala  *
111*6f987b59SSivaprasad Tummala  * @param lcore_id
112*6f987b59SSivaprasad Tummala  *  lcore id.
113*6f987b59SSivaprasad Tummala  *
114*6f987b59SSivaprasad Tummala  * @return
115*6f987b59SSivaprasad Tummala  *  - 1 on success with frequency changed.
116*6f987b59SSivaprasad Tummala  *  - 0 on success without frequency changed.
117*6f987b59SSivaprasad Tummala  *  - Negative on error.
118*6f987b59SSivaprasad Tummala  */
119*6f987b59SSivaprasad Tummala typedef int (*rte_power_freq_change_t)(unsigned int lcore_id);
120*6f987b59SSivaprasad Tummala 
121*6f987b59SSivaprasad Tummala /**
122*6f987b59SSivaprasad Tummala  * Function pointer definition for generic frequency change functions. Review
123*6f987b59SSivaprasad Tummala  * each environments specific documentation for usage.
124*6f987b59SSivaprasad Tummala  *
125*6f987b59SSivaprasad Tummala  * @param lcore_id
126*6f987b59SSivaprasad Tummala  *  lcore id.
127*6f987b59SSivaprasad Tummala  *
128*6f987b59SSivaprasad Tummala  * @return
129*6f987b59SSivaprasad Tummala  *  - 1 on success with frequency changed.
130*6f987b59SSivaprasad Tummala  *  - 0 on success without frequency changed.
131*6f987b59SSivaprasad Tummala  *  - Negative on error.
132*6f987b59SSivaprasad Tummala  */
133*6f987b59SSivaprasad Tummala 
134*6f987b59SSivaprasad Tummala /**
135*6f987b59SSivaprasad Tummala  * Power capabilities summary.
136*6f987b59SSivaprasad Tummala  */
137*6f987b59SSivaprasad Tummala struct rte_power_core_capabilities {
138*6f987b59SSivaprasad Tummala 	union {
139*6f987b59SSivaprasad Tummala 		uint64_t capabilities;
140*6f987b59SSivaprasad Tummala 		struct {
141*6f987b59SSivaprasad Tummala 			uint64_t turbo:1;       /**< Turbo can be enabled. */
142*6f987b59SSivaprasad Tummala 			uint64_t priority:1;    /**< SST-BF high freq core */
143*6f987b59SSivaprasad Tummala 		};
144*6f987b59SSivaprasad Tummala 	};
145*6f987b59SSivaprasad Tummala };
146*6f987b59SSivaprasad Tummala 
147*6f987b59SSivaprasad Tummala typedef int (*rte_power_get_capabilities_t)(unsigned int lcore_id,
148*6f987b59SSivaprasad Tummala 			struct rte_power_core_capabilities *caps);
149*6f987b59SSivaprasad Tummala 
150*6f987b59SSivaprasad Tummala /** Structure defining core power operations structure */
151*6f987b59SSivaprasad Tummala struct rte_power_cpufreq_ops {
152*6f987b59SSivaprasad Tummala 	RTE_TAILQ_ENTRY(rte_power_cpufreq_ops) next;	/**< Next in list. */
153*6f987b59SSivaprasad Tummala 	char name[RTE_POWER_DRIVER_NAMESZ];             /**< power mgmt driver. */
154*6f987b59SSivaprasad Tummala 	rte_power_cpufreq_init_t init;                  /**< Initialize power management. */
155*6f987b59SSivaprasad Tummala 	rte_power_cpufreq_exit_t exit;                  /**< Exit power management. */
156*6f987b59SSivaprasad Tummala 	rte_power_check_env_support_t check_env_support;/**< verify env is supported. */
157*6f987b59SSivaprasad Tummala 	rte_power_freqs_t get_avail_freqs;              /**< Get the available frequencies. */
158*6f987b59SSivaprasad Tummala 	rte_power_get_freq_t get_freq;                  /**< Get frequency index. */
159*6f987b59SSivaprasad Tummala 	rte_power_set_freq_t set_freq;                  /**< Set frequency index. */
160*6f987b59SSivaprasad Tummala 	rte_power_freq_change_t freq_up;                /**< Scale up frequency. */
161*6f987b59SSivaprasad Tummala 	rte_power_freq_change_t freq_down;              /**< Scale down frequency. */
162*6f987b59SSivaprasad Tummala 	rte_power_freq_change_t freq_max;               /**< Scale up frequency to highest. */
163*6f987b59SSivaprasad Tummala 	rte_power_freq_change_t freq_min;               /**< Scale up frequency to lowest. */
164*6f987b59SSivaprasad Tummala 	rte_power_freq_change_t turbo_status;           /**< Get Turbo status. */
165*6f987b59SSivaprasad Tummala 	rte_power_freq_change_t enable_turbo;           /**< Enable Turbo. */
166*6f987b59SSivaprasad Tummala 	rte_power_freq_change_t disable_turbo;          /**< Disable Turbo. */
167*6f987b59SSivaprasad Tummala 	rte_power_get_capabilities_t get_caps;          /**< power capabilities. */
168*6f987b59SSivaprasad Tummala };
169*6f987b59SSivaprasad Tummala 
170*6f987b59SSivaprasad Tummala /**
171*6f987b59SSivaprasad Tummala  * Register power cpu frequency operations.
172*6f987b59SSivaprasad Tummala  *
173*6f987b59SSivaprasad Tummala  * @param ops
174*6f987b59SSivaprasad Tummala  *   Pointer to an ops structure to register.
175*6f987b59SSivaprasad Tummala  * @return
176*6f987b59SSivaprasad Tummala  *  - 0: Success.
177*6f987b59SSivaprasad Tummala  *  - Negative on error.
178*6f987b59SSivaprasad Tummala  */
179*6f987b59SSivaprasad Tummala __rte_internal
180*6f987b59SSivaprasad Tummala int rte_power_register_cpufreq_ops(struct rte_power_cpufreq_ops *ops);
181*6f987b59SSivaprasad Tummala 
182*6f987b59SSivaprasad Tummala /**
183*6f987b59SSivaprasad Tummala  * Macro to statically register the ops of a cpufreq driver.
184*6f987b59SSivaprasad Tummala  */
185*6f987b59SSivaprasad Tummala #define RTE_POWER_REGISTER_CPUFREQ_OPS(ops) \
186*6f987b59SSivaprasad Tummala RTE_INIT(power_hdlr_init_##ops) \
187*6f987b59SSivaprasad Tummala { \
188*6f987b59SSivaprasad Tummala 	rte_power_register_cpufreq_ops(&ops); \
189*6f987b59SSivaprasad Tummala }
190*6f987b59SSivaprasad Tummala 
191*6f987b59SSivaprasad Tummala #endif /* POWER_CPUFREQ_H */
192