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