1*f30a1bbdSSivaprasad Tummala /* SPDX-License-Identifier: BSD-3-Clause 2*f30a1bbdSSivaprasad Tummala * Copyright(c) 2010-2014 Intel Corporation 3*f30a1bbdSSivaprasad Tummala * Copyright(c) 2024 Advanced Micro Devices, Inc. 4*f30a1bbdSSivaprasad Tummala */ 5*f30a1bbdSSivaprasad Tummala 6*f30a1bbdSSivaprasad Tummala #ifndef RTE_POWER_CPUFREQ_H 7*f30a1bbdSSivaprasad Tummala #define RTE_POWER_CPUFREQ_H 8*f30a1bbdSSivaprasad Tummala 9*f30a1bbdSSivaprasad Tummala /** 10*f30a1bbdSSivaprasad Tummala * @file 11*f30a1bbdSSivaprasad Tummala * CPU Frequency Management 12*f30a1bbdSSivaprasad Tummala */ 13*f30a1bbdSSivaprasad Tummala 14*f30a1bbdSSivaprasad Tummala #include <rte_common.h> 15*f30a1bbdSSivaprasad Tummala #include <rte_log.h> 16*f30a1bbdSSivaprasad Tummala 17*f30a1bbdSSivaprasad Tummala #include "power_cpufreq.h" 18*f30a1bbdSSivaprasad Tummala 19*f30a1bbdSSivaprasad Tummala #ifdef __cplusplus 20*f30a1bbdSSivaprasad Tummala extern "C" { 21*f30a1bbdSSivaprasad Tummala #endif 22*f30a1bbdSSivaprasad Tummala 23*f30a1bbdSSivaprasad Tummala /* Power Management Environment State */ 24*f30a1bbdSSivaprasad Tummala enum power_management_env { 25*f30a1bbdSSivaprasad Tummala PM_ENV_NOT_SET = 0, 26*f30a1bbdSSivaprasad Tummala PM_ENV_ACPI_CPUFREQ, 27*f30a1bbdSSivaprasad Tummala PM_ENV_KVM_VM, 28*f30a1bbdSSivaprasad Tummala PM_ENV_PSTATE_CPUFREQ, 29*f30a1bbdSSivaprasad Tummala PM_ENV_CPPC_CPUFREQ, 30*f30a1bbdSSivaprasad Tummala PM_ENV_AMD_PSTATE_CPUFREQ 31*f30a1bbdSSivaprasad Tummala }; 32*f30a1bbdSSivaprasad Tummala 33*f30a1bbdSSivaprasad Tummala /** 34*f30a1bbdSSivaprasad Tummala * Check if a specific power management environment type is supported on a 35*f30a1bbdSSivaprasad Tummala * currently running system. 36*f30a1bbdSSivaprasad Tummala * 37*f30a1bbdSSivaprasad Tummala * @param env 38*f30a1bbdSSivaprasad Tummala * The environment type to check support for. 39*f30a1bbdSSivaprasad Tummala * 40*f30a1bbdSSivaprasad Tummala * @return 41*f30a1bbdSSivaprasad Tummala * - 1 if supported 42*f30a1bbdSSivaprasad Tummala * - 0 if unsupported 43*f30a1bbdSSivaprasad Tummala * - -1 if error, with rte_errno indicating reason for error. 44*f30a1bbdSSivaprasad Tummala */ 45*f30a1bbdSSivaprasad Tummala int rte_power_check_env_supported(enum power_management_env env); 46*f30a1bbdSSivaprasad Tummala 47*f30a1bbdSSivaprasad Tummala /** 48*f30a1bbdSSivaprasad Tummala * Set the default power management implementation. If this is not called prior 49*f30a1bbdSSivaprasad Tummala * to rte_power_init(), then auto-detect of the environment will take place. 50*f30a1bbdSSivaprasad Tummala * It is thread safe. New env can be set only in uninitialized state 51*f30a1bbdSSivaprasad Tummala * (thus rte_power_unset_env must be called if different env was already set). 52*f30a1bbdSSivaprasad Tummala * 53*f30a1bbdSSivaprasad Tummala * @param env 54*f30a1bbdSSivaprasad Tummala * env. The environment in which to initialise Power Management for. 55*f30a1bbdSSivaprasad Tummala * 56*f30a1bbdSSivaprasad Tummala * @return 57*f30a1bbdSSivaprasad Tummala * - 0 on success. 58*f30a1bbdSSivaprasad Tummala * - Negative on error. 59*f30a1bbdSSivaprasad Tummala */ 60*f30a1bbdSSivaprasad Tummala int rte_power_set_env(enum power_management_env env); 61*f30a1bbdSSivaprasad Tummala 62*f30a1bbdSSivaprasad Tummala /** 63*f30a1bbdSSivaprasad Tummala * Unset the global environment configuration. 64*f30a1bbdSSivaprasad Tummala * This can only be called after all threads have completed. 65*f30a1bbdSSivaprasad Tummala */ 66*f30a1bbdSSivaprasad Tummala void rte_power_unset_env(void); 67*f30a1bbdSSivaprasad Tummala 68*f30a1bbdSSivaprasad Tummala /** 69*f30a1bbdSSivaprasad Tummala * Get the default power management implementation. 70*f30a1bbdSSivaprasad Tummala * 71*f30a1bbdSSivaprasad Tummala * @return 72*f30a1bbdSSivaprasad Tummala * power_management_env The configured environment. 73*f30a1bbdSSivaprasad Tummala */ 74*f30a1bbdSSivaprasad Tummala enum power_management_env rte_power_get_env(void); 75*f30a1bbdSSivaprasad Tummala 76*f30a1bbdSSivaprasad Tummala /** 77*f30a1bbdSSivaprasad Tummala * Initialize power management for a specific lcore. If rte_power_set_env() has 78*f30a1bbdSSivaprasad Tummala * not been called then an auto-detect of the environment will start and 79*f30a1bbdSSivaprasad Tummala * initialise the corresponding resources. 80*f30a1bbdSSivaprasad Tummala * 81*f30a1bbdSSivaprasad Tummala * @param lcore_id 82*f30a1bbdSSivaprasad Tummala * lcore id. 83*f30a1bbdSSivaprasad Tummala * 84*f30a1bbdSSivaprasad Tummala * @return 85*f30a1bbdSSivaprasad Tummala * - 0 on success. 86*f30a1bbdSSivaprasad Tummala * - Negative on error. 87*f30a1bbdSSivaprasad Tummala */ 88*f30a1bbdSSivaprasad Tummala int rte_power_init(unsigned int lcore_id); 89*f30a1bbdSSivaprasad Tummala 90*f30a1bbdSSivaprasad Tummala /** 91*f30a1bbdSSivaprasad Tummala * Exit power management on a specific lcore. This will call the environment 92*f30a1bbdSSivaprasad Tummala * dependent exit function. 93*f30a1bbdSSivaprasad Tummala * 94*f30a1bbdSSivaprasad Tummala * @param lcore_id 95*f30a1bbdSSivaprasad Tummala * lcore id. 96*f30a1bbdSSivaprasad Tummala * 97*f30a1bbdSSivaprasad Tummala * @return 98*f30a1bbdSSivaprasad Tummala * - 0 on success. 99*f30a1bbdSSivaprasad Tummala * - Negative on error. 100*f30a1bbdSSivaprasad Tummala */ 101*f30a1bbdSSivaprasad Tummala int rte_power_exit(unsigned int lcore_id); 102*f30a1bbdSSivaprasad Tummala 103*f30a1bbdSSivaprasad Tummala /** 104*f30a1bbdSSivaprasad Tummala * Get the available frequencies of a specific lcore. 105*f30a1bbdSSivaprasad Tummala * Function pointer definition. Review each environments 106*f30a1bbdSSivaprasad Tummala * specific documentation for usage. 107*f30a1bbdSSivaprasad Tummala * 108*f30a1bbdSSivaprasad Tummala * @param lcore_id 109*f30a1bbdSSivaprasad Tummala * lcore id. 110*f30a1bbdSSivaprasad Tummala * @param freqs 111*f30a1bbdSSivaprasad Tummala * The buffer array to save the frequencies. 112*f30a1bbdSSivaprasad Tummala * @param num 113*f30a1bbdSSivaprasad Tummala * The number of frequencies to get. 114*f30a1bbdSSivaprasad Tummala * 115*f30a1bbdSSivaprasad Tummala * @return 116*f30a1bbdSSivaprasad Tummala * The number of available frequencies. 117*f30a1bbdSSivaprasad Tummala */ 118*f30a1bbdSSivaprasad Tummala uint32_t rte_power_freqs(unsigned int lcore_id, uint32_t *freqs, uint32_t num); 119*f30a1bbdSSivaprasad Tummala 120*f30a1bbdSSivaprasad Tummala /** 121*f30a1bbdSSivaprasad Tummala * Return the current index of available frequencies of a specific lcore. 122*f30a1bbdSSivaprasad Tummala * Function pointer definition. Review each environments 123*f30a1bbdSSivaprasad Tummala * specific documentation for usage. 124*f30a1bbdSSivaprasad Tummala * 125*f30a1bbdSSivaprasad Tummala * @param lcore_id 126*f30a1bbdSSivaprasad Tummala * lcore id. 127*f30a1bbdSSivaprasad Tummala * 128*f30a1bbdSSivaprasad Tummala * @return 129*f30a1bbdSSivaprasad Tummala * The current index of available frequencies. 130*f30a1bbdSSivaprasad Tummala */ 131*f30a1bbdSSivaprasad Tummala uint32_t rte_power_get_freq(unsigned int lcore_id); 132*f30a1bbdSSivaprasad Tummala 133*f30a1bbdSSivaprasad Tummala /** 134*f30a1bbdSSivaprasad Tummala * Set the new frequency for a specific lcore by indicating the index of 135*f30a1bbdSSivaprasad Tummala * available frequencies. 136*f30a1bbdSSivaprasad Tummala * Function pointer definition. Review each environments 137*f30a1bbdSSivaprasad Tummala * specific documentation for usage. 138*f30a1bbdSSivaprasad Tummala * 139*f30a1bbdSSivaprasad Tummala * @param lcore_id 140*f30a1bbdSSivaprasad Tummala * lcore id. 141*f30a1bbdSSivaprasad Tummala * @param index 142*f30a1bbdSSivaprasad Tummala * The index of available frequencies. 143*f30a1bbdSSivaprasad Tummala * 144*f30a1bbdSSivaprasad Tummala * @return 145*f30a1bbdSSivaprasad Tummala * - 1 on success with frequency changed. 146*f30a1bbdSSivaprasad Tummala * - 0 on success without frequency changed. 147*f30a1bbdSSivaprasad Tummala * - Negative on error. 148*f30a1bbdSSivaprasad Tummala */ 149*f30a1bbdSSivaprasad Tummala uint32_t rte_power_set_freq(unsigned int lcore_id, uint32_t index); 150*f30a1bbdSSivaprasad Tummala 151*f30a1bbdSSivaprasad Tummala /** 152*f30a1bbdSSivaprasad Tummala * Scale up the frequency of a specific lcore according to the available 153*f30a1bbdSSivaprasad Tummala * frequencies. 154*f30a1bbdSSivaprasad Tummala * Review each environments specific documentation for usage. 155*f30a1bbdSSivaprasad Tummala * 156*f30a1bbdSSivaprasad Tummala * @param lcore_id 157*f30a1bbdSSivaprasad Tummala * lcore id. 158*f30a1bbdSSivaprasad Tummala * 159*f30a1bbdSSivaprasad Tummala * @return 160*f30a1bbdSSivaprasad Tummala * - 1 on success with frequency changed. 161*f30a1bbdSSivaprasad Tummala * - 0 on success without frequency changed. 162*f30a1bbdSSivaprasad Tummala * - Negative on error. 163*f30a1bbdSSivaprasad Tummala */ 164*f30a1bbdSSivaprasad Tummala int rte_power_freq_up(unsigned int lcore_id); 165*f30a1bbdSSivaprasad Tummala 166*f30a1bbdSSivaprasad Tummala /** 167*f30a1bbdSSivaprasad Tummala * Scale down the frequency of a specific lcore according to the available 168*f30a1bbdSSivaprasad Tummala * frequencies. 169*f30a1bbdSSivaprasad Tummala * Review each environments specific documentation for usage. 170*f30a1bbdSSivaprasad Tummala * 171*f30a1bbdSSivaprasad Tummala * @param lcore_id 172*f30a1bbdSSivaprasad Tummala * lcore id. 173*f30a1bbdSSivaprasad Tummala * 174*f30a1bbdSSivaprasad Tummala * @return 175*f30a1bbdSSivaprasad Tummala * - 1 on success with frequency changed. 176*f30a1bbdSSivaprasad Tummala * - 0 on success without frequency changed. 177*f30a1bbdSSivaprasad Tummala * - Negative on error. 178*f30a1bbdSSivaprasad Tummala */ 179*f30a1bbdSSivaprasad Tummala int rte_power_freq_down(unsigned int lcore_id); 180*f30a1bbdSSivaprasad Tummala 181*f30a1bbdSSivaprasad Tummala /** 182*f30a1bbdSSivaprasad Tummala * Scale up the frequency of a specific lcore to the highest according to the 183*f30a1bbdSSivaprasad Tummala * available frequencies. 184*f30a1bbdSSivaprasad Tummala * Review each environments specific documentation for usage. 185*f30a1bbdSSivaprasad Tummala * 186*f30a1bbdSSivaprasad Tummala * @param lcore_id 187*f30a1bbdSSivaprasad Tummala * lcore id. 188*f30a1bbdSSivaprasad Tummala * 189*f30a1bbdSSivaprasad Tummala * @return 190*f30a1bbdSSivaprasad Tummala * - 1 on success with frequency changed. 191*f30a1bbdSSivaprasad Tummala * - 0 on success without frequency changed. 192*f30a1bbdSSivaprasad Tummala * - Negative on error. 193*f30a1bbdSSivaprasad Tummala */ 194*f30a1bbdSSivaprasad Tummala int rte_power_freq_max(unsigned int lcore_id); 195*f30a1bbdSSivaprasad Tummala 196*f30a1bbdSSivaprasad Tummala /** 197*f30a1bbdSSivaprasad Tummala * Scale down the frequency of a specific lcore to the lowest according to the 198*f30a1bbdSSivaprasad Tummala * available frequencies. 199*f30a1bbdSSivaprasad Tummala * Review each environments specific documentation for usage.. 200*f30a1bbdSSivaprasad Tummala * 201*f30a1bbdSSivaprasad Tummala * @param lcore_id 202*f30a1bbdSSivaprasad Tummala * lcore id. 203*f30a1bbdSSivaprasad Tummala * 204*f30a1bbdSSivaprasad Tummala * @return 205*f30a1bbdSSivaprasad Tummala * - 1 on success with frequency changed. 206*f30a1bbdSSivaprasad Tummala * - 0 on success without frequency changed. 207*f30a1bbdSSivaprasad Tummala * - Negative on error. 208*f30a1bbdSSivaprasad Tummala */ 209*f30a1bbdSSivaprasad Tummala int rte_power_freq_min(unsigned int lcore_id); 210*f30a1bbdSSivaprasad Tummala 211*f30a1bbdSSivaprasad Tummala /** 212*f30a1bbdSSivaprasad Tummala * Query the Turbo Boost status of a specific lcore. 213*f30a1bbdSSivaprasad Tummala * Review each environments specific documentation for usage.. 214*f30a1bbdSSivaprasad Tummala * 215*f30a1bbdSSivaprasad Tummala * @param lcore_id 216*f30a1bbdSSivaprasad Tummala * lcore id. 217*f30a1bbdSSivaprasad Tummala * 218*f30a1bbdSSivaprasad Tummala * @return 219*f30a1bbdSSivaprasad Tummala * - 1 turbo boost enabled. 220*f30a1bbdSSivaprasad Tummala * - 0 turbo boost disabled. 221*f30a1bbdSSivaprasad Tummala * - Negative on error. 222*f30a1bbdSSivaprasad Tummala */ 223*f30a1bbdSSivaprasad Tummala int rte_power_turbo_status(unsigned int lcore_id); 224*f30a1bbdSSivaprasad Tummala 225*f30a1bbdSSivaprasad Tummala /** 226*f30a1bbdSSivaprasad Tummala * Enable Turbo Boost for this lcore. 227*f30a1bbdSSivaprasad Tummala * Review each environments specific documentation for usage.. 228*f30a1bbdSSivaprasad Tummala * 229*f30a1bbdSSivaprasad Tummala * @param lcore_id 230*f30a1bbdSSivaprasad Tummala * lcore id. 231*f30a1bbdSSivaprasad Tummala * 232*f30a1bbdSSivaprasad Tummala * @return 233*f30a1bbdSSivaprasad Tummala * - 0 on success. 234*f30a1bbdSSivaprasad Tummala * - Negative on error. 235*f30a1bbdSSivaprasad Tummala */ 236*f30a1bbdSSivaprasad Tummala int rte_power_freq_enable_turbo(unsigned int lcore_id); 237*f30a1bbdSSivaprasad Tummala 238*f30a1bbdSSivaprasad Tummala /** 239*f30a1bbdSSivaprasad Tummala * Disable Turbo Boost for this lcore. 240*f30a1bbdSSivaprasad Tummala * Review each environments specific documentation for usage.. 241*f30a1bbdSSivaprasad Tummala * 242*f30a1bbdSSivaprasad Tummala * @param lcore_id 243*f30a1bbdSSivaprasad Tummala * lcore id. 244*f30a1bbdSSivaprasad Tummala * 245*f30a1bbdSSivaprasad Tummala * @return 246*f30a1bbdSSivaprasad Tummala * - 0 on success. 247*f30a1bbdSSivaprasad Tummala * - Negative on error. 248*f30a1bbdSSivaprasad Tummala */ 249*f30a1bbdSSivaprasad Tummala int rte_power_freq_disable_turbo(unsigned int lcore_id); 250*f30a1bbdSSivaprasad Tummala 251*f30a1bbdSSivaprasad Tummala /** 252*f30a1bbdSSivaprasad Tummala * Returns power capabilities for a specific lcore. 253*f30a1bbdSSivaprasad Tummala * Function pointer definition. Review each environments 254*f30a1bbdSSivaprasad Tummala * specific documentation for usage. 255*f30a1bbdSSivaprasad Tummala * 256*f30a1bbdSSivaprasad Tummala * @param lcore_id 257*f30a1bbdSSivaprasad Tummala * lcore id. 258*f30a1bbdSSivaprasad Tummala * @param caps 259*f30a1bbdSSivaprasad Tummala * pointer to rte_power_core_capabilities object. 260*f30a1bbdSSivaprasad Tummala * 261*f30a1bbdSSivaprasad Tummala * @return 262*f30a1bbdSSivaprasad Tummala * - 0 on success. 263*f30a1bbdSSivaprasad Tummala * - Negative on error. 264*f30a1bbdSSivaprasad Tummala */ 265*f30a1bbdSSivaprasad Tummala int rte_power_get_capabilities(unsigned int lcore_id, 266*f30a1bbdSSivaprasad Tummala struct rte_power_core_capabilities *caps); 267*f30a1bbdSSivaprasad Tummala 268*f30a1bbdSSivaprasad Tummala #ifdef __cplusplus 269*f30a1bbdSSivaprasad Tummala } 270*f30a1bbdSSivaprasad Tummala #endif 271*f30a1bbdSSivaprasad Tummala 272*f30a1bbdSSivaprasad Tummala #endif /* RTE_POWER_CPUFREQ_H */ 273