Path: blob/master/tools/power/x86/intel-speed-select/isst-core-tpmi.c
53512 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}453454#define FEATURE_ENABLE_WAIT_US 1000455#define FEATURE_ENABLE_RETRIES 5456457static int tpmi_set_pbf_fact_status(struct isst_id *id, int pbf, int enable)458{459struct isst_pkg_ctdp pkg_dev;460struct isst_pkg_ctdp_level_info ctdp_level;461int current_level;462struct isst_perf_feature_control info;463int ret, i;464465ret = isst_get_ctdp_levels(id, &pkg_dev);466if (ret)467debug_printf("cpu:%d No support for dynamic ISST\n", id->cpu);468469current_level = pkg_dev.current_level;470471ret = isst_get_ctdp_control(id, current_level, &ctdp_level);472if (ret)473return ret;474475info.socket_id = id->pkg;476info.power_domain_id = id->punit;477478info.feature = 0;479480if (pbf) {481if (ctdp_level.fact_enabled)482info.feature |= BIT(1);483484if (enable)485info.feature |= BIT(0);486else487info.feature &= ~BIT(0);488} else {489490if (enable && !ctdp_level.sst_cp_enabled)491isst_display_error_info_message(0,492"Make sure to execute before: core-power enable",4930, 0);494495if (ctdp_level.pbf_enabled)496info.feature |= BIT(0);497498if (enable)499info.feature |= BIT(1);500else501info.feature &= ~BIT(1);502}503504ret = tpmi_process_ioctl(ISST_IF_PERF_SET_FEATURE, &info);505if (ret == -1)506return ret;507508for (i = 0; i < FEATURE_ENABLE_RETRIES; ++i) {509510usleep(FEATURE_ENABLE_WAIT_US);511512/* Check status */513ret = isst_get_ctdp_control(id, current_level, &ctdp_level);514if (ret)515return ret;516517debug_printf("pbf_enabled:%d fact_enabled:%d\n",518ctdp_level.pbf_enabled, ctdp_level.fact_enabled);519520if (pbf) {521if (ctdp_level.pbf_enabled == enable)522break;523} else {524if (ctdp_level.fact_enabled == enable)525break;526}527}528529if (i == FEATURE_ENABLE_RETRIES)530return -1;531532return 0;533}534535static int tpmi_get_fact_info(struct isst_id *id, int level, int fact_bucket,536struct isst_fact_info *fact_info)537{538struct isst_turbo_freq_info info;539int i, j;540int ret;541542memset(&info, 0, sizeof(info));543info.socket_id = id->pkg;544info.power_domain_id = id->punit;545info.level = level;546547ret = tpmi_process_ioctl(ISST_IF_GET_TURBO_FREQ_INFO, &info);548if (ret == -1)549return ret;550551for (i = 0; i < info.max_clip_freqs; ++i)552fact_info->lp_ratios[i] = info.lp_clip_freq_mhz[i];553554if (info.max_buckets > TRL_MAX_BUCKETS)555info.max_buckets = TRL_MAX_BUCKETS;556557if (info.max_trl_levels > TRL_MAX_LEVELS)558info.max_trl_levels = TRL_MAX_LEVELS;559560for (i = 0; i < info.max_trl_levels; ++i) {561for (j = 0; j < info.max_buckets; ++j)562fact_info->bucket_info[j].hp_ratios[i] =563info.trl_freq_mhz[i][j];564}565566for (i = 0; i < info.max_buckets; ++i)567fact_info->bucket_info[i].hp_cores = info.bucket_core_counts[i];568569return 0;570}571572static void _set_uncore_min_max(struct isst_id *id, int max, int freq)573{574DIR *dir;575FILE *filep;576struct dirent *entry;577char buffer[512];578unsigned int tmp_id;579int ret;580581dir = opendir("/sys/devices/system/cpu/intel_uncore_frequency/");582if (!dir)583return;584585while ((entry = readdir(dir)) != NULL ) {586/* Check domain_id */587snprintf(buffer, sizeof(buffer),588"/sys/devices/system/cpu/intel_uncore_frequency/%s/domain_id", entry->d_name);589590filep = fopen(buffer, "r");591if (!filep)592goto end;593594ret = fscanf(filep, "%u", &tmp_id);595fclose(filep);596if (ret != 1)597goto end;598599if (tmp_id != id->punit)600continue;601602/* Check package_id */603snprintf(buffer, sizeof(buffer),604"/sys/devices/system/cpu/intel_uncore_frequency/%s/package_id", entry->d_name);605606filep = fopen(buffer, "r");607if (!filep)608goto end;609610ret = fscanf(filep, "%u", &tmp_id);611fclose(filep);612613if (ret != 1)614goto end;615616if (tmp_id != id->pkg)617continue;618619/* Found the right sysfs path, adjust and quit */620if (max)621snprintf(buffer, sizeof(buffer),622"/sys/devices/system/cpu/intel_uncore_frequency/%s/max_freq_khz", entry->d_name);623else624snprintf(buffer, sizeof(buffer),625"/sys/devices/system/cpu/intel_uncore_frequency/%s/min_freq_khz", entry->d_name);626627filep = fopen(buffer, "w");628if (!filep)629goto end;630631fprintf(filep, "%d\n", freq);632fclose(filep);633break;634}635636end:637closedir(dir);638}639640static void tpmi_adjust_uncore_freq(struct isst_id *id, int config_index,641struct isst_pkg_ctdp_level_info *ctdp_level)642{643struct isst_perf_level_data_info info;644int ret;645646info.socket_id = id->pkg;647info.power_domain_id = id->punit;648info.level = config_index;649650ret = tpmi_process_ioctl(ISST_IF_GET_PERF_LEVEL_INFO, &info);651if (ret == -1)652return;653654ctdp_level->uncore_p0 = info.p0_fabric_freq_mhz;655ctdp_level->uncore_p1 = info.p1_fabric_freq_mhz;656ctdp_level->uncore_pm = info.pm_fabric_freq_mhz;657658if (ctdp_level->uncore_pm)659_set_uncore_min_max(id, 0, ctdp_level->uncore_pm * 100000);660661if (ctdp_level->uncore_p0)662_set_uncore_min_max(id, 1, ctdp_level->uncore_p0 * 100000);663664return;665}666667static int tpmi_get_clos_information(struct isst_id *id, int *enable, int *type)668{669struct isst_core_power info;670int ret;671672info.get_set = 0;673info.socket_id = id->pkg;674info.power_domain_id = id->punit;675ret = tpmi_process_ioctl(ISST_IF_CORE_POWER_STATE, &info);676if (ret == -1)677return ret;678679*enable = info.enable;680*type = info.priority_type;681682return 0;683}684685static int tpmi_pm_qos_config(struct isst_id *id, int enable_clos,686int priority_type)687{688struct isst_core_power info;689int cp_state = 0, cp_cap = 0;690int i, j, ret, saved_punit;691692info.get_set = 1;693info.socket_id = id->pkg;694info.power_domain_id = id->punit;695info.enable = enable_clos;696info.priority_type = priority_type;697698saved_punit = id->punit;699700/* Set for all other dies also. This is per package setting */701for (i = 0; i < MAX_PUNIT_PER_DIE; i++) {702id->punit = i;703if (isst_is_punit_valid(id)) {704info.power_domain_id = i;705ret = tpmi_process_ioctl(ISST_IF_CORE_POWER_STATE, &info);706if (ret == -1) {707id->punit = saved_punit;708return ret;709}710/* Get status */711for (j = 0; j < FEATURE_ENABLE_RETRIES; ++j) {712usleep(FEATURE_ENABLE_WAIT_US);713ret = tpmi_read_pm_config(id, &cp_state, &cp_cap);714debug_printf("ret:%d cp_state:%d enable_clos:%d\n", ret,715cp_state, enable_clos);716if (ret || cp_state == enable_clos)717break;718}719if (j == FEATURE_ENABLE_RETRIES) {720id->punit = saved_punit;721return -1;722}723}724}725726id->punit = saved_punit;727728return 0;729}730731int tpmi_pm_get_clos(struct isst_id *id, int clos,732struct isst_clos_config *clos_config)733{734struct isst_clos_param info;735int ret;736737info.get_set = 0;738info.socket_id = id->pkg;739info.power_domain_id = id->punit;740info.clos = clos;741742ret = tpmi_process_ioctl(ISST_IF_CLOS_PARAM, &info);743if (ret == -1)744return ret;745746clos_config->epp = 0;747clos_config->clos_prop_prio = info.prop_prio;748clos_config->clos_min = info.min_freq_mhz;749clos_config->clos_max = info.max_freq_mhz;750clos_config->clos_desired = 0;751752debug_printf("cpu:%d clos:%d min:%d max:%d\n", id->cpu, clos,753clos_config->clos_min, clos_config->clos_max);754755return 0;756}757758int tpmi_set_clos(struct isst_id *id, int clos,759struct isst_clos_config *clos_config)760{761struct isst_clos_param info;762int i, ret, saved_punit;763764info.get_set = 1;765info.socket_id = id->pkg;766info.power_domain_id = id->punit;767info.clos = clos;768info.prop_prio = clos_config->clos_prop_prio;769770info.min_freq_mhz = clos_config->clos_min;771info.max_freq_mhz = clos_config->clos_max;772773if (info.min_freq_mhz <= 0xff)774info.min_freq_mhz *= 100;775if (info.max_freq_mhz <= 0xff)776info.max_freq_mhz *= 100;777778saved_punit = id->punit;779780/* Set for all other dies also. This is per package setting */781for (i = 0; i < MAX_PUNIT_PER_DIE; i++) {782id->punit = i;783if (isst_is_punit_valid(id)) {784info.power_domain_id = i;785ret = tpmi_process_ioctl(ISST_IF_CLOS_PARAM, &info);786if (ret == -1) {787id->punit = saved_punit;788return ret;789}790}791}792793id->punit = saved_punit;794795debug_printf("set cpu:%d clos:%d min:%d max:%d\n", id->cpu, clos,796clos_config->clos_min, clos_config->clos_max);797798return 0;799}800801static int tpmi_clos_get_assoc_status(struct isst_id *id, int *clos_id)802{803struct isst_if_clos_assoc_cmds assoc_cmds;804int ret;805806assoc_cmds.cmd_count = 1;807assoc_cmds.get_set = 0;808assoc_cmds.punit_cpu_map = 1;809assoc_cmds.assoc_info[0].logical_cpu = find_phy_core_num(id->cpu);810assoc_cmds.assoc_info[0].socket_id = id->pkg;811assoc_cmds.assoc_info[0].power_domain_id = id->punit;812813ret = tpmi_process_ioctl(ISST_IF_CLOS_ASSOC, &assoc_cmds);814if (ret == -1)815return ret;816817*clos_id = assoc_cmds.assoc_info[0].clos;818819return 0;820}821822static int tpmi_clos_associate(struct isst_id *id, int clos_id)823{824struct isst_if_clos_assoc_cmds assoc_cmds;825int ret;826827assoc_cmds.cmd_count = 1;828assoc_cmds.get_set = 1;829assoc_cmds.punit_cpu_map = 1;830assoc_cmds.assoc_info[0].logical_cpu = find_phy_core_num(id->cpu);831assoc_cmds.assoc_info[0].clos = clos_id;832assoc_cmds.assoc_info[0].socket_id = id->pkg;833assoc_cmds.assoc_info[0].power_domain_id = id->punit;834835ret = tpmi_process_ioctl(ISST_IF_CLOS_ASSOC, &assoc_cmds);836if (ret == -1)837return ret;838839return 0;840}841842static struct isst_platform_ops tpmi_ops = {843.get_disp_freq_multiplier = tpmi_get_disp_freq_multiplier,844.get_trl_max_levels = tpmi_get_trl_max_levels,845.get_trl_level_name = tpmi_get_trl_level_name,846.update_platform_param = tpmi_update_platform_param,847.is_punit_valid = tpmi_is_punit_valid,848.read_pm_config = tpmi_read_pm_config,849.get_config_levels = tpmi_get_config_levels,850.get_ctdp_control = tpmi_get_ctdp_control,851.get_tdp_info = tpmi_get_tdp_info,852.get_pwr_info = tpmi_get_pwr_info,853.get_coremask_info = tpmi_get_coremask_info,854.get_get_trl = tpmi_get_get_trl,855.get_get_trls = tpmi_get_get_trls,856.get_trl_bucket_info = tpmi_get_trl_bucket_info,857.set_tdp_level = tpmi_set_tdp_level,858.get_pbf_info = tpmi_get_pbf_info,859.set_pbf_fact_status = tpmi_set_pbf_fact_status,860.get_fact_info = tpmi_get_fact_info,861.adjust_uncore_freq = tpmi_adjust_uncore_freq,862.get_clos_information = tpmi_get_clos_information,863.pm_qos_config = tpmi_pm_qos_config,864.pm_get_clos = tpmi_pm_get_clos,865.set_clos = tpmi_set_clos,866.clos_get_assoc_status = tpmi_clos_get_assoc_status,867.clos_associate = tpmi_clos_associate,868};869870struct isst_platform_ops *tpmi_get_platform_ops(void)871{872return &tpmi_ops;873}874875876