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