Path: blob/master/tools/power/x86/intel-speed-select/isst-core-tpmi.c
26289 views
// SPDX-License-Identifier: GPL-2.01/*2* Intel Speed Select -- Enumerate and control features for TPMI Interface3* Copyright (c) 2022 Intel Corporation.4*/56#include <linux/isst_if.h>7#include "isst.h"89int tpmi_process_ioctl(int ioctl_no, void *info)10{11const char *pathname = "/dev/isst_interface";12int fd;1314if (is_debug_enabled()) {15debug_printf("Issue IOCTL: ");16switch (ioctl_no) {17case ISST_IF_CORE_POWER_STATE:18debug_printf("ISST_IF_CORE_POWER_STATE\n");19break;20case ISST_IF_CLOS_PARAM:21debug_printf("ISST_IF_CLOS_PARAM\n");22break;23case ISST_IF_CLOS_ASSOC:24debug_printf("ISST_IF_CLOS_ASSOC\n");25break;26case ISST_IF_PERF_LEVELS:27debug_printf("ISST_IF_PERF_LEVELS\n");28break;29case ISST_IF_PERF_SET_LEVEL:30debug_printf("ISST_IF_PERF_SET_LEVEL\n");31break;32case ISST_IF_PERF_SET_FEATURE:33debug_printf("ISST_IF_PERF_SET_FEATURE\n");34break;35case ISST_IF_GET_PERF_LEVEL_INFO:36debug_printf("ISST_IF_GET_PERF_LEVEL_INFO\n");37break;38case ISST_IF_GET_PERF_LEVEL_CPU_MASK:39debug_printf("ISST_IF_GET_PERF_LEVEL_CPU_MASK\n");40break;41case ISST_IF_GET_BASE_FREQ_INFO:42debug_printf("ISST_IF_GET_BASE_FREQ_INFO\n");43break;44case ISST_IF_GET_BASE_FREQ_CPU_MASK:45debug_printf("ISST_IF_GET_BASE_FREQ_CPU_MASK\n");46break;47case ISST_IF_GET_TURBO_FREQ_INFO:48debug_printf("ISST_IF_GET_TURBO_FREQ_INFO\n");49break;50case ISST_IF_COUNT_TPMI_INSTANCES:51debug_printf("ISST_IF_COUNT_TPMI_INSTANCES\n");52break;53default:54debug_printf("%d\n", ioctl_no);55break;56}57}5859fd = open(pathname, O_RDWR);60if (fd < 0)61return -1;6263if (ioctl(fd, ioctl_no, info) == -1) {64debug_printf("IOCTL %d Failed\n", ioctl_no);65close(fd);66return -1;67}6869close(fd);7071return 0;72}7374static int tpmi_get_disp_freq_multiplier(void)75{76return 1;77}7879static int tpmi_get_trl_max_levels(void)80{81return TRL_MAX_LEVELS;82}8384static char *tpmi_get_trl_level_name(int level)85{86switch (level) {87case 0:88return "level-0";89case 1:90return "level-1";91case 2:92return "level-2";93case 3:94return "level-3";95case 4:96return "level-4";97case 5:98return "level-5";99case 6:100return "level-6";101case 7:102return "level-7";103default:104return NULL;105}106}107108109static void tpmi_update_platform_param(enum isst_platform_param param, int value)110{111/* No params need to be updated for now */112}113114static int tpmi_is_punit_valid(struct isst_id *id)115{116struct isst_tpmi_instance_count info;117int ret;118119if (id->punit < 0)120return 0;121122info.socket_id = id->pkg;123ret = tpmi_process_ioctl(ISST_IF_COUNT_TPMI_INSTANCES, &info);124if (ret == -1)125return 0;126127if (info.valid_mask & BIT(id->punit))128return 1;129130return 0;131}132133static int tpmi_read_pm_config(struct isst_id *id, int *cp_state, int *cp_cap)134{135struct isst_core_power info;136int ret;137138info.get_set = 0;139info.socket_id = id->pkg;140info.power_domain_id = id->punit;141ret = tpmi_process_ioctl(ISST_IF_CORE_POWER_STATE, &info);142if (ret == -1)143return ret;144145*cp_state = info.enable;146*cp_cap = info.supported;147148return 0;149}150151int tpmi_get_config_levels(struct isst_id *id, struct isst_pkg_ctdp *pkg_dev)152{153struct isst_perf_level_info info;154int ret;155156info.socket_id = id->pkg;157info.power_domain_id = id->punit;158159ret = tpmi_process_ioctl(ISST_IF_PERF_LEVELS, &info);160if (ret == -1)161return ret;162163pkg_dev->version = info.feature_rev;164pkg_dev->levels = info.max_level;165pkg_dev->locked = info.locked;166pkg_dev->current_level = info.current_level;167pkg_dev->locked = info.locked;168pkg_dev->enabled = info.enabled;169170return 0;171}172173static int tpmi_get_ctdp_control(struct isst_id *id, int config_index,174struct isst_pkg_ctdp_level_info *ctdp_level)175{176struct isst_core_power core_power_info;177struct isst_perf_level_info info;178int level_mask;179int ret;180181info.socket_id = id->pkg;182info.power_domain_id = id->punit;183184ret = tpmi_process_ioctl(ISST_IF_PERF_LEVELS, &info);185if (ret == -1)186return -1;187188if (config_index != 0xff)189level_mask = 1 << config_index;190else191level_mask = config_index;192193if (!(info.level_mask & level_mask))194return -1;195196if (api_version() > 2) {197ctdp_level->fact_support = info.sst_tf_support & BIT(config_index);198ctdp_level->pbf_support = info.sst_bf_support & BIT(config_index);199} else {200ctdp_level->fact_support = info.sst_tf_support;201ctdp_level->pbf_support = info.sst_bf_support;202}203204ctdp_level->fact_enabled = !!(info.feature_state & BIT(1));205ctdp_level->pbf_enabled = !!(info.feature_state & BIT(0));206207core_power_info.get_set = 0;208core_power_info.socket_id = id->pkg;209core_power_info.power_domain_id = id->punit;210211ret = tpmi_process_ioctl(ISST_IF_CORE_POWER_STATE, &core_power_info);212if (ret == -1)213return ret;214215ctdp_level->sst_cp_support = core_power_info.supported;216ctdp_level->sst_cp_enabled = core_power_info.enable;217218debug_printf219("cpu:%d CONFIG_TDP_GET_TDP_CONTROL fact_support:%d pbf_support: %d fact_enabled:%d pbf_enabled:%d\n",220id->cpu, ctdp_level->fact_support, ctdp_level->pbf_support,221ctdp_level->fact_enabled, ctdp_level->pbf_enabled);222223return 0;224}225226static int tpmi_get_tdp_info(struct isst_id *id, int config_index,227struct isst_pkg_ctdp_level_info *ctdp_level)228{229struct isst_perf_level_fabric_info fabric_info;230struct isst_perf_level_data_info info;231int ret;232233info.socket_id = id->pkg;234info.power_domain_id = id->punit;235info.level = config_index;236237ret = tpmi_process_ioctl(ISST_IF_GET_PERF_LEVEL_INFO, &info);238if (ret == -1)239return ret;240241ctdp_level->pkg_tdp = info.thermal_design_power_w;242ctdp_level->tdp_ratio = info.tdp_ratio;243ctdp_level->sse_p1 = info.base_freq_mhz;244ctdp_level->avx2_p1 = info.base_freq_avx2_mhz;245ctdp_level->avx512_p1 = info.base_freq_avx512_mhz;246ctdp_level->amx_p1 = info.base_freq_amx_mhz;247248ctdp_level->t_proc_hot = info.tjunction_max_c;249ctdp_level->mem_freq = info.max_memory_freq_mhz;250ctdp_level->cooling_type = info.cooling_type;251252ctdp_level->uncore_p0 = info.p0_fabric_freq_mhz;253ctdp_level->uncore_p1 = info.p1_fabric_freq_mhz;254ctdp_level->uncore_pm = info.pm_fabric_freq_mhz;255256fabric_info.socket_id = id->pkg;257fabric_info.power_domain_id = id->punit;258fabric_info.level = config_index;259260ret = tpmi_process_ioctl(ISST_IF_GET_PERF_LEVEL_FABRIC_INFO, &fabric_info);261if (ret != -1) {262ctdp_level->uncore1_p0 = fabric_info.p0_fabric_freq_mhz[1];263ctdp_level->uncore1_p1 = fabric_info.p1_fabric_freq_mhz[1];264ctdp_level->uncore1_pm = fabric_info.pm_fabric_freq_mhz[1];265}266267debug_printf268("cpu:%d ctdp:%d CONFIG_TDP_GET_TDP_INFO tdp_ratio:%d pkg_tdp:%d ctdp_level->t_proc_hot:%d\n",269id->cpu, config_index, ctdp_level->tdp_ratio, ctdp_level->pkg_tdp,270ctdp_level->t_proc_hot);271272return 0;273}274275static int tpmi_get_pwr_info(struct isst_id *id, int config_index,276struct isst_pkg_ctdp_level_info *ctdp_level)277{278/* TBD */279ctdp_level->pkg_max_power = 0;280ctdp_level->pkg_min_power = 0;281282debug_printf283("cpu:%d ctdp:%d CONFIG_TDP_GET_PWR_INFO pkg_max_power:%d pkg_min_power:%d\n",284id->cpu, config_index, ctdp_level->pkg_max_power,285ctdp_level->pkg_min_power);286287return 0;288}289290int tpmi_get_coremask_info(struct isst_id *id, int config_index,291struct isst_pkg_ctdp_level_info *ctdp_level)292{293struct isst_perf_level_cpu_mask info;294int ret, cpu_count;295296info.socket_id = id->pkg;297info.power_domain_id = id->punit;298info.level = config_index;299info.punit_cpu_map = 1;300301ret = tpmi_process_ioctl(ISST_IF_GET_PERF_LEVEL_CPU_MASK, &info);302if (ret == -1)303return ret;304305set_cpu_mask_from_punit_coremask(id, info.mask,306ctdp_level->core_cpumask_size,307ctdp_level->core_cpumask, &cpu_count);308ctdp_level->cpu_count = cpu_count;309310debug_printf("cpu:%d ctdp:%d core_mask ino cpu count:%d\n",311id->cpu, config_index, ctdp_level->cpu_count);312313return 0;314}315316static int tpmi_get_get_trls(struct isst_id *id, int config_index,317struct isst_pkg_ctdp_level_info *ctdp_level)318{319struct isst_perf_level_data_info info;320int ret, i, j;321322info.socket_id = id->pkg;323info.power_domain_id = id->punit;324info.level = config_index;325326ret = tpmi_process_ioctl(ISST_IF_GET_PERF_LEVEL_INFO, &info);327if (ret == -1)328return ret;329330if (info.max_buckets > TRL_MAX_BUCKETS)331info.max_buckets = TRL_MAX_BUCKETS;332333if (info.max_trl_levels > TRL_MAX_LEVELS)334info.max_trl_levels = TRL_MAX_LEVELS;335336for (i = 0; i < info.max_trl_levels; ++i)337for (j = 0; j < info.max_buckets; ++j)338ctdp_level->trl_ratios[i][j] = info.trl_freq_mhz[i][j];339340return 0;341}342343static int tpmi_get_get_trl(struct isst_id *id, int config_index, int level,344int *trl)345{346struct isst_pkg_ctdp_level_info ctdp_level;347int ret, i;348349ret = tpmi_get_get_trls(id, config_index, &ctdp_level);350if (ret)351return ret;352353/* FIX ME: Just return for level 0 */354for (i = 0; i < 8; ++i)355trl[i] = ctdp_level.trl_ratios[0][i];356357return 0;358}359360static int tpmi_get_trl_bucket_info(struct isst_id *id, int config_index,361unsigned long long *buckets_info)362{363struct isst_perf_level_data_info info;364unsigned char *mask = (unsigned char *)buckets_info;365int ret, i;366367info.socket_id = id->pkg;368info.power_domain_id = id->punit;369info.level = config_index;370371ret = tpmi_process_ioctl(ISST_IF_GET_PERF_LEVEL_INFO, &info);372if (ret == -1)373return ret;374375if (info.max_buckets > TRL_MAX_BUCKETS)376info.max_buckets = TRL_MAX_BUCKETS;377378for (i = 0; i < info.max_buckets; ++i)379mask[i] = info.bucket_core_counts[i];380381debug_printf("cpu:%d TRL bucket info: 0x%llx\n", id->cpu,382*buckets_info);383384return 0;385}386387static int tpmi_set_tdp_level(struct isst_id *id, int tdp_level)388{389struct isst_perf_level_control info;390int ret;391392info.socket_id = id->pkg;393info.power_domain_id = id->punit;394info.level = tdp_level;395396ret = tpmi_process_ioctl(ISST_IF_PERF_SET_LEVEL, &info);397if (ret == -1)398return ret;399400return 0;401}402403static int _pbf_get_coremask_info(struct isst_id *id, int config_index,404struct isst_pbf_info *pbf_info)405{406struct isst_perf_level_cpu_mask info;407int ret, cpu_count;408409info.socket_id = id->pkg;410info.power_domain_id = id->punit;411info.level = config_index;412info.punit_cpu_map = 1;413414ret = tpmi_process_ioctl(ISST_IF_GET_BASE_FREQ_CPU_MASK, &info);415if (ret == -1)416return ret;417418set_cpu_mask_from_punit_coremask(id, info.mask,419pbf_info->core_cpumask_size,420pbf_info->core_cpumask, &cpu_count);421422debug_printf("cpu:%d ctdp:%d pbf core_mask info cpu count:%d\n",423id->cpu, config_index, cpu_count);424425return 0;426}427428static int tpmi_get_pbf_info(struct isst_id *id, int level,429struct isst_pbf_info *pbf_info)430{431struct isst_base_freq_info info;432int ret;433434info.socket_id = id->pkg;435info.power_domain_id = id->punit;436info.level = level;437438ret = tpmi_process_ioctl(ISST_IF_GET_BASE_FREQ_INFO, &info);439if (ret == -1)440return ret;441442pbf_info->p1_low = info.low_base_freq_mhz;443pbf_info->p1_high = info.high_base_freq_mhz;444pbf_info->tdp = info.thermal_design_power_w;445pbf_info->t_prochot = info.tjunction_max_c;446447debug_printf("cpu:%d ctdp:%d pbf info:%d:%d:%d:%d\n",448id->cpu, level, pbf_info->p1_low, pbf_info->p1_high,449pbf_info->tdp, pbf_info->t_prochot);450451return _pbf_get_coremask_info(id, level, pbf_info);452}453454static int tpmi_set_pbf_fact_status(struct isst_id *id, int pbf, int enable)455{456struct isst_pkg_ctdp pkg_dev;457struct isst_pkg_ctdp_level_info ctdp_level;458int current_level;459struct isst_perf_feature_control info;460int ret;461462ret = isst_get_ctdp_levels(id, &pkg_dev);463if (ret)464debug_printf("cpu:%d No support for dynamic ISST\n", id->cpu);465466current_level = pkg_dev.current_level;467468ret = isst_get_ctdp_control(id, current_level, &ctdp_level);469if (ret)470return ret;471472info.socket_id = id->pkg;473info.power_domain_id = id->punit;474475info.feature = 0;476477if (pbf) {478if (ctdp_level.fact_enabled)479info.feature |= BIT(1);480481if (enable)482info.feature |= BIT(0);483else484info.feature &= ~BIT(0);485} else {486487if (enable && !ctdp_level.sst_cp_enabled)488isst_display_error_info_message(0,489"Make sure to execute before: core-power enable",4900, 0);491492if (ctdp_level.pbf_enabled)493info.feature |= BIT(0);494495if (enable)496info.feature |= BIT(1);497else498info.feature &= ~BIT(1);499}500501ret = tpmi_process_ioctl(ISST_IF_PERF_SET_FEATURE, &info);502if (ret == -1)503return ret;504505return 0;506}507508static int tpmi_get_fact_info(struct isst_id *id, int level, int fact_bucket,509struct isst_fact_info *fact_info)510{511struct isst_turbo_freq_info info;512int i, j;513int ret;514515info.socket_id = id->pkg;516info.power_domain_id = id->punit;517info.level = level;518519ret = tpmi_process_ioctl(ISST_IF_GET_TURBO_FREQ_INFO, &info);520if (ret == -1)521return ret;522523for (i = 0; i < info.max_clip_freqs; ++i)524fact_info->lp_ratios[i] = info.lp_clip_freq_mhz[i];525526if (info.max_buckets > TRL_MAX_BUCKETS)527info.max_buckets = TRL_MAX_BUCKETS;528529if (info.max_trl_levels > TRL_MAX_LEVELS)530info.max_trl_levels = TRL_MAX_LEVELS;531532for (i = 0; i < info.max_trl_levels; ++i) {533for (j = 0; j < info.max_buckets; ++j)534fact_info->bucket_info[j].hp_ratios[i] =535info.trl_freq_mhz[i][j];536}537538for (i = 0; i < info.max_buckets; ++i)539fact_info->bucket_info[i].hp_cores = info.bucket_core_counts[i];540541return 0;542}543544static void _set_uncore_min_max(struct isst_id *id, int max, int freq)545{546DIR *dir;547FILE *filep;548struct dirent *entry;549char buffer[512];550unsigned int tmp_id;551int ret;552553dir = opendir("/sys/devices/system/cpu/intel_uncore_frequency/");554if (!dir)555return;556557while ((entry = readdir(dir)) != NULL ) {558/* Check domain_id */559snprintf(buffer, sizeof(buffer),560"/sys/devices/system/cpu/intel_uncore_frequency/%s/domain_id", entry->d_name);561562filep = fopen(buffer, "r");563if (!filep)564goto end;565566ret = fscanf(filep, "%u", &tmp_id);567fclose(filep);568if (ret != 1)569goto end;570571if (tmp_id != id->punit)572continue;573574/* Check package_id */575snprintf(buffer, sizeof(buffer),576"/sys/devices/system/cpu/intel_uncore_frequency/%s/package_id", entry->d_name);577578filep = fopen(buffer, "r");579if (!filep)580goto end;581582ret = fscanf(filep, "%u", &tmp_id);583fclose(filep);584585if (ret != 1)586goto end;587588if (tmp_id != id->pkg)589continue;590591/* Found the right sysfs path, adjust and quit */592if (max)593snprintf(buffer, sizeof(buffer),594"/sys/devices/system/cpu/intel_uncore_frequency/%s/max_freq_khz", entry->d_name);595else596snprintf(buffer, sizeof(buffer),597"/sys/devices/system/cpu/intel_uncore_frequency/%s/min_freq_khz", entry->d_name);598599filep = fopen(buffer, "w");600if (!filep)601goto end;602603fprintf(filep, "%d\n", freq);604fclose(filep);605break;606}607608end:609closedir(dir);610}611612static void tpmi_adjust_uncore_freq(struct isst_id *id, int config_index,613struct isst_pkg_ctdp_level_info *ctdp_level)614{615struct isst_perf_level_data_info info;616int ret;617618info.socket_id = id->pkg;619info.power_domain_id = id->punit;620info.level = config_index;621622ret = tpmi_process_ioctl(ISST_IF_GET_PERF_LEVEL_INFO, &info);623if (ret == -1)624return;625626ctdp_level->uncore_p0 = info.p0_fabric_freq_mhz;627ctdp_level->uncore_p1 = info.p1_fabric_freq_mhz;628ctdp_level->uncore_pm = info.pm_fabric_freq_mhz;629630if (ctdp_level->uncore_pm)631_set_uncore_min_max(id, 0, ctdp_level->uncore_pm * 100000);632633if (ctdp_level->uncore_p0)634_set_uncore_min_max(id, 1, ctdp_level->uncore_p0 * 100000);635636return;637}638639static int tpmi_get_clos_information(struct isst_id *id, int *enable, int *type)640{641struct isst_core_power info;642int ret;643644info.get_set = 0;645info.socket_id = id->pkg;646info.power_domain_id = id->punit;647ret = tpmi_process_ioctl(ISST_IF_CORE_POWER_STATE, &info);648if (ret == -1)649return ret;650651*enable = info.enable;652*type = info.priority_type;653654return 0;655}656657static int tpmi_pm_qos_config(struct isst_id *id, int enable_clos,658int priority_type)659{660struct isst_core_power info;661int i, ret, saved_punit;662663info.get_set = 1;664info.socket_id = id->pkg;665info.power_domain_id = id->punit;666info.enable = enable_clos;667info.priority_type = priority_type;668669saved_punit = id->punit;670671/* Set for all other dies also. This is per package setting */672for (i = 0; i < MAX_PUNIT_PER_DIE; i++) {673id->punit = i;674if (isst_is_punit_valid(id)) {675info.power_domain_id = i;676ret = tpmi_process_ioctl(ISST_IF_CORE_POWER_STATE, &info);677if (ret == -1) {678id->punit = saved_punit;679return ret;680}681}682}683684id->punit = saved_punit;685686return 0;687}688689int tpmi_pm_get_clos(struct isst_id *id, int clos,690struct isst_clos_config *clos_config)691{692struct isst_clos_param info;693int ret;694695info.get_set = 0;696info.socket_id = id->pkg;697info.power_domain_id = id->punit;698info.clos = clos;699700ret = tpmi_process_ioctl(ISST_IF_CLOS_PARAM, &info);701if (ret == -1)702return ret;703704clos_config->epp = 0;705clos_config->clos_prop_prio = info.prop_prio;706clos_config->clos_min = info.min_freq_mhz;707clos_config->clos_max = info.max_freq_mhz;708clos_config->clos_desired = 0;709710debug_printf("cpu:%d clos:%d min:%d max:%d\n", id->cpu, clos,711clos_config->clos_min, clos_config->clos_max);712713return 0;714}715716int tpmi_set_clos(struct isst_id *id, int clos,717struct isst_clos_config *clos_config)718{719struct isst_clos_param info;720int i, ret, saved_punit;721722info.get_set = 1;723info.socket_id = id->pkg;724info.power_domain_id = id->punit;725info.clos = clos;726info.prop_prio = clos_config->clos_prop_prio;727728info.min_freq_mhz = clos_config->clos_min;729info.max_freq_mhz = clos_config->clos_max;730731if (info.min_freq_mhz <= 0xff)732info.min_freq_mhz *= 100;733if (info.max_freq_mhz <= 0xff)734info.max_freq_mhz *= 100;735736saved_punit = id->punit;737738/* Set for all other dies also. This is per package setting */739for (i = 0; i < MAX_PUNIT_PER_DIE; i++) {740id->punit = i;741if (isst_is_punit_valid(id)) {742info.power_domain_id = i;743ret = tpmi_process_ioctl(ISST_IF_CLOS_PARAM, &info);744if (ret == -1) {745id->punit = saved_punit;746return ret;747}748}749}750751id->punit = saved_punit;752753debug_printf("set cpu:%d clos:%d min:%d max:%d\n", id->cpu, clos,754clos_config->clos_min, clos_config->clos_max);755756return 0;757}758759static int tpmi_clos_get_assoc_status(struct isst_id *id, int *clos_id)760{761struct isst_if_clos_assoc_cmds assoc_cmds;762int ret;763764assoc_cmds.cmd_count = 1;765assoc_cmds.get_set = 0;766assoc_cmds.punit_cpu_map = 1;767assoc_cmds.assoc_info[0].logical_cpu = find_phy_core_num(id->cpu);768assoc_cmds.assoc_info[0].socket_id = id->pkg;769assoc_cmds.assoc_info[0].power_domain_id = id->punit;770771ret = tpmi_process_ioctl(ISST_IF_CLOS_ASSOC, &assoc_cmds);772if (ret == -1)773return ret;774775*clos_id = assoc_cmds.assoc_info[0].clos;776777return 0;778}779780static int tpmi_clos_associate(struct isst_id *id, int clos_id)781{782struct isst_if_clos_assoc_cmds assoc_cmds;783int ret;784785assoc_cmds.cmd_count = 1;786assoc_cmds.get_set = 1;787assoc_cmds.punit_cpu_map = 1;788assoc_cmds.assoc_info[0].logical_cpu = find_phy_core_num(id->cpu);789assoc_cmds.assoc_info[0].clos = clos_id;790assoc_cmds.assoc_info[0].socket_id = id->pkg;791assoc_cmds.assoc_info[0].power_domain_id = id->punit;792793ret = tpmi_process_ioctl(ISST_IF_CLOS_ASSOC, &assoc_cmds);794if (ret == -1)795return ret;796797return 0;798}799800static struct isst_platform_ops tpmi_ops = {801.get_disp_freq_multiplier = tpmi_get_disp_freq_multiplier,802.get_trl_max_levels = tpmi_get_trl_max_levels,803.get_trl_level_name = tpmi_get_trl_level_name,804.update_platform_param = tpmi_update_platform_param,805.is_punit_valid = tpmi_is_punit_valid,806.read_pm_config = tpmi_read_pm_config,807.get_config_levels = tpmi_get_config_levels,808.get_ctdp_control = tpmi_get_ctdp_control,809.get_tdp_info = tpmi_get_tdp_info,810.get_pwr_info = tpmi_get_pwr_info,811.get_coremask_info = tpmi_get_coremask_info,812.get_get_trl = tpmi_get_get_trl,813.get_get_trls = tpmi_get_get_trls,814.get_trl_bucket_info = tpmi_get_trl_bucket_info,815.set_tdp_level = tpmi_set_tdp_level,816.get_pbf_info = tpmi_get_pbf_info,817.set_pbf_fact_status = tpmi_set_pbf_fact_status,818.get_fact_info = tpmi_get_fact_info,819.adjust_uncore_freq = tpmi_adjust_uncore_freq,820.get_clos_information = tpmi_get_clos_information,821.pm_qos_config = tpmi_pm_qos_config,822.pm_get_clos = tpmi_pm_get_clos,823.set_clos = tpmi_set_clos,824.clos_get_assoc_status = tpmi_clos_get_assoc_status,825.clos_associate = tpmi_clos_associate,826};827828struct isst_platform_ops *tpmi_get_platform_ops(void)829{830return &tpmi_ops;831}832833834