brintos

brintos / linux-shallow public Read only

0
0
Text · 19.3 KiB · 32ea70c Raw
821 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Intel Speed Select -- Enumerate and control features for TPMI Interface4 * Copyright (c) 2022 Intel Corporation.5 */6 7#include <linux/isst_if.h>8#include "isst.h"9 10int tpmi_process_ioctl(int ioctl_no, void *info)11{12	const char *pathname = "/dev/isst_interface";13	int fd;14 15	if (is_debug_enabled()) {16		debug_printf("Issue IOCTL: ");17		switch (ioctl_no) {18		case ISST_IF_CORE_POWER_STATE:19			debug_printf("ISST_IF_CORE_POWER_STATE\n");20			break;21		case ISST_IF_CLOS_PARAM:22			debug_printf("ISST_IF_CLOS_PARAM\n");23			break;24		case ISST_IF_CLOS_ASSOC:25			debug_printf("ISST_IF_CLOS_ASSOC\n");26			break;27		case ISST_IF_PERF_LEVELS:28			debug_printf("ISST_IF_PERF_LEVELS\n");29			break;30		case ISST_IF_PERF_SET_LEVEL:31			debug_printf("ISST_IF_PERF_SET_LEVEL\n");32			break;33		case ISST_IF_PERF_SET_FEATURE:34			debug_printf("ISST_IF_PERF_SET_FEATURE\n");35			break;36		case ISST_IF_GET_PERF_LEVEL_INFO:37			debug_printf("ISST_IF_GET_PERF_LEVEL_INFO\n");38			break;39		case ISST_IF_GET_PERF_LEVEL_CPU_MASK:40			debug_printf("ISST_IF_GET_PERF_LEVEL_CPU_MASK\n");41			break;42		case ISST_IF_GET_BASE_FREQ_INFO:43			debug_printf("ISST_IF_GET_BASE_FREQ_INFO\n");44			break;45		case ISST_IF_GET_BASE_FREQ_CPU_MASK:46			debug_printf("ISST_IF_GET_BASE_FREQ_CPU_MASK\n");47			break;48		case ISST_IF_GET_TURBO_FREQ_INFO:49			debug_printf("ISST_IF_GET_TURBO_FREQ_INFO\n");50			break;51		case ISST_IF_COUNT_TPMI_INSTANCES:52			debug_printf("ISST_IF_COUNT_TPMI_INSTANCES\n");53			break;54		default:55			debug_printf("%d\n", ioctl_no);56			break;57		}58	}59 60	fd = open(pathname, O_RDWR);61	if (fd < 0)62		return -1;63 64	if (ioctl(fd, ioctl_no, info) == -1) {65		debug_printf("IOCTL %d Failed\n", ioctl_no);66		close(fd);67		return -1;68	}69 70	close(fd);71 72	return 0;73}74 75static int tpmi_get_disp_freq_multiplier(void)76{77	return 1;78}79 80static int tpmi_get_trl_max_levels(void)81{82	return TRL_MAX_LEVELS;83}84 85static char *tpmi_get_trl_level_name(int level)86{87	switch (level) {88	case 0:89		return "level-0";90	case 1:91		return "level-1";92	case 2:93		return "level-2";94	case 3:95		return "level-3";96	case 4:97		return "level-4";98	case 5:99		return "level-5";100	case 6:101		return "level-6";102	case 7:103		return "level-7";104	default:105		return NULL;106	}107}108 109 110static void tpmi_update_platform_param(enum isst_platform_param param, int value)111{112	/* No params need to be updated for now */113}114 115static int tpmi_is_punit_valid(struct isst_id *id)116{117	struct isst_tpmi_instance_count info;118	int ret;119 120	if (id->punit < 0)121		return 0;122 123	info.socket_id = id->pkg;124	ret = tpmi_process_ioctl(ISST_IF_COUNT_TPMI_INSTANCES, &info);125	if (ret == -1)126		return 0;127 128	if (info.valid_mask & BIT(id->punit))129		return 1;130 131	return 0;132}133 134static int tpmi_read_pm_config(struct isst_id *id, int *cp_state, int *cp_cap)135{136	struct isst_core_power info;137	int ret;138 139	info.get_set = 0;140	info.socket_id = id->pkg;141	info.power_domain_id = id->punit;142	ret = tpmi_process_ioctl(ISST_IF_CORE_POWER_STATE, &info);143	if (ret == -1)144		return ret;145 146	*cp_state = info.enable;147	*cp_cap = info.supported;148 149	return 0;150}151 152int tpmi_get_config_levels(struct isst_id *id, struct isst_pkg_ctdp *pkg_dev)153{154	struct isst_perf_level_info info;155	int ret;156 157	info.socket_id = id->pkg;158	info.power_domain_id = id->punit;159 160	ret = tpmi_process_ioctl(ISST_IF_PERF_LEVELS, &info);161	if (ret == -1)162		return ret;163 164	pkg_dev->version = info.feature_rev;165	pkg_dev->levels = info.max_level;166	pkg_dev->locked = info.locked;167	pkg_dev->current_level = info.current_level;168	pkg_dev->locked = info.locked;169	pkg_dev->enabled = info.enabled;170 171	return 0;172}173 174static int tpmi_get_ctdp_control(struct isst_id *id, int config_index,175				 struct isst_pkg_ctdp_level_info *ctdp_level)176{177	struct isst_core_power core_power_info;178	struct isst_perf_level_info info;179	int level_mask;180	int ret;181 182	info.socket_id = id->pkg;183	info.power_domain_id = id->punit;184 185	ret = tpmi_process_ioctl(ISST_IF_PERF_LEVELS, &info);186	if (ret == -1)187		return -1;188 189	if (config_index != 0xff)190		level_mask = 1 << config_index;191	else192		level_mask = config_index;193 194	if (!(info.level_mask & level_mask))195		return -1;196 197	if (api_version() > 2) {198		ctdp_level->fact_support = info.sst_tf_support & BIT(config_index);199		ctdp_level->pbf_support = info.sst_bf_support & BIT(config_index);200	} else {201		ctdp_level->fact_support = info.sst_tf_support;202		ctdp_level->pbf_support = info.sst_bf_support;203	}204 205	ctdp_level->fact_enabled = !!(info.feature_state & BIT(1));206	ctdp_level->pbf_enabled = !!(info.feature_state & BIT(0));207 208	core_power_info.get_set = 0;209	core_power_info.socket_id = id->pkg;210	core_power_info.power_domain_id = id->punit;211 212	ret = tpmi_process_ioctl(ISST_IF_CORE_POWER_STATE, &core_power_info);213	if (ret == -1)214		return ret;215 216	ctdp_level->sst_cp_support = core_power_info.supported;217	ctdp_level->sst_cp_enabled = core_power_info.enable;218 219	debug_printf220	    ("cpu:%d CONFIG_TDP_GET_TDP_CONTROL fact_support:%d pbf_support: %d fact_enabled:%d pbf_enabled:%d\n",221	     id->cpu, ctdp_level->fact_support, ctdp_level->pbf_support,222	     ctdp_level->fact_enabled, ctdp_level->pbf_enabled);223 224	return 0;225}226 227static int tpmi_get_tdp_info(struct isst_id *id, int config_index,228			     struct isst_pkg_ctdp_level_info *ctdp_level)229{230	struct isst_perf_level_data_info info;231	int ret;232 233	info.socket_id = id->pkg;234	info.power_domain_id = id->punit;235	info.level = config_index;236 237	ret = tpmi_process_ioctl(ISST_IF_GET_PERF_LEVEL_INFO, &info);238	if (ret == -1)239		return ret;240 241	ctdp_level->pkg_tdp = info.thermal_design_power_w;242	ctdp_level->tdp_ratio = info.tdp_ratio;243	ctdp_level->sse_p1 = info.base_freq_mhz;244	ctdp_level->avx2_p1 = info.base_freq_avx2_mhz;245	ctdp_level->avx512_p1 = info.base_freq_avx512_mhz;246	ctdp_level->amx_p1 = info.base_freq_amx_mhz;247 248	ctdp_level->t_proc_hot = info.tjunction_max_c;249	ctdp_level->mem_freq = info.max_memory_freq_mhz;250	ctdp_level->cooling_type = info.cooling_type;251 252	ctdp_level->uncore_p0 = info.p0_fabric_freq_mhz;253	ctdp_level->uncore_p1 = info.p1_fabric_freq_mhz;254	ctdp_level->uncore_pm = info.pm_fabric_freq_mhz;255 256	debug_printf257	    ("cpu:%d ctdp:%d CONFIG_TDP_GET_TDP_INFO tdp_ratio:%d pkg_tdp:%d ctdp_level->t_proc_hot:%d\n",258	     id->cpu, config_index, ctdp_level->tdp_ratio, ctdp_level->pkg_tdp,259	     ctdp_level->t_proc_hot);260 261	return 0;262}263 264static int tpmi_get_pwr_info(struct isst_id *id, int config_index,265			     struct isst_pkg_ctdp_level_info *ctdp_level)266{267	/* TBD */268	ctdp_level->pkg_max_power = 0;269	ctdp_level->pkg_min_power = 0;270 271	debug_printf272	    ("cpu:%d ctdp:%d CONFIG_TDP_GET_PWR_INFO pkg_max_power:%d pkg_min_power:%d\n",273	     id->cpu, config_index, ctdp_level->pkg_max_power,274	     ctdp_level->pkg_min_power);275 276	return 0;277}278 279int tpmi_get_coremask_info(struct isst_id *id, int config_index,280			   struct isst_pkg_ctdp_level_info *ctdp_level)281{282	struct isst_perf_level_cpu_mask info;283	int ret, cpu_count;284 285	info.socket_id = id->pkg;286	info.power_domain_id = id->punit;287	info.level = config_index;288	info.punit_cpu_map = 1;289 290	ret = tpmi_process_ioctl(ISST_IF_GET_PERF_LEVEL_CPU_MASK, &info);291	if (ret == -1)292		return ret;293 294	set_cpu_mask_from_punit_coremask(id, info.mask,295					 ctdp_level->core_cpumask_size,296					 ctdp_level->core_cpumask, &cpu_count);297	ctdp_level->cpu_count = cpu_count;298 299	debug_printf("cpu:%d ctdp:%d core_mask ino cpu count:%d\n",300		     id->cpu, config_index, ctdp_level->cpu_count);301 302	return 0;303}304 305static int tpmi_get_get_trls(struct isst_id *id, int config_index,306			     struct isst_pkg_ctdp_level_info *ctdp_level)307{308	struct isst_perf_level_data_info info;309	int ret, i, j;310 311	info.socket_id = id->pkg;312	info.power_domain_id = id->punit;313	info.level = config_index;314 315	ret = tpmi_process_ioctl(ISST_IF_GET_PERF_LEVEL_INFO, &info);316	if (ret == -1)317		return ret;318 319	if (info.max_buckets > TRL_MAX_BUCKETS)320		info.max_buckets = TRL_MAX_BUCKETS;321 322	if (info.max_trl_levels > TRL_MAX_LEVELS)323		info.max_trl_levels = TRL_MAX_LEVELS;324 325	for (i = 0; i < info.max_trl_levels; ++i)326		for (j = 0; j < info.max_buckets; ++j)327			ctdp_level->trl_ratios[i][j] = info.trl_freq_mhz[i][j];328 329	return 0;330}331 332static int tpmi_get_get_trl(struct isst_id *id, int level, int config_index,333			    int *trl)334{335	struct isst_pkg_ctdp_level_info ctdp_level;336	int ret, i;337 338	ret = tpmi_get_get_trls(id, config_index, &ctdp_level);339	if (ret)340		return ret;341 342	/* FIX ME: Just return for level 0 */343	for (i = 0; i < 8; ++i)344		trl[i] = ctdp_level.trl_ratios[0][i];345 346	return 0;347}348 349static int tpmi_get_trl_bucket_info(struct isst_id *id, int config_index,350				    unsigned long long *buckets_info)351{352	struct isst_perf_level_data_info info;353	unsigned char *mask = (unsigned char *)buckets_info;354	int ret, i;355 356	info.socket_id = id->pkg;357	info.power_domain_id = id->punit;358	info.level = config_index;359 360	ret = tpmi_process_ioctl(ISST_IF_GET_PERF_LEVEL_INFO, &info);361	if (ret == -1)362		return ret;363 364	if (info.max_buckets > TRL_MAX_BUCKETS)365		info.max_buckets = TRL_MAX_BUCKETS;366 367	for (i = 0; i < info.max_buckets; ++i)368		mask[i] = info.bucket_core_counts[i];369 370	debug_printf("cpu:%d TRL bucket info: 0x%llx\n", id->cpu,371		     *buckets_info);372 373	return 0;374}375 376static int tpmi_set_tdp_level(struct isst_id *id, int tdp_level)377{378	struct isst_perf_level_control info;379	int ret;380 381	info.socket_id = id->pkg;382	info.power_domain_id = id->punit;383	info.level = tdp_level;384 385	ret = tpmi_process_ioctl(ISST_IF_PERF_SET_LEVEL, &info);386	if (ret == -1)387		return ret;388 389	return 0;390}391 392static int _pbf_get_coremask_info(struct isst_id *id, int config_index,393				  struct isst_pbf_info *pbf_info)394{395	struct isst_perf_level_cpu_mask info;396	int ret, cpu_count;397 398	info.socket_id = id->pkg;399	info.power_domain_id = id->punit;400	info.level = config_index;401	info.punit_cpu_map = 1;402 403	ret = tpmi_process_ioctl(ISST_IF_GET_BASE_FREQ_CPU_MASK, &info);404	if (ret == -1)405		return ret;406 407	set_cpu_mask_from_punit_coremask(id, info.mask,408					 pbf_info->core_cpumask_size,409					 pbf_info->core_cpumask, &cpu_count);410 411	debug_printf("cpu:%d ctdp:%d pbf core_mask info cpu count:%d\n",412		     id->cpu, config_index, cpu_count);413 414	return 0;415}416 417static int tpmi_get_pbf_info(struct isst_id *id, int level,418			     struct isst_pbf_info *pbf_info)419{420	struct isst_base_freq_info info;421	int ret;422 423	info.socket_id = id->pkg;424	info.power_domain_id = id->punit;425	info.level = level;426 427	ret = tpmi_process_ioctl(ISST_IF_GET_BASE_FREQ_INFO, &info);428	if (ret == -1)429		return ret;430 431	pbf_info->p1_low = info.low_base_freq_mhz;432	pbf_info->p1_high = info.high_base_freq_mhz;433	pbf_info->tdp = info.thermal_design_power_w;434	pbf_info->t_prochot = info.tjunction_max_c;435 436	debug_printf("cpu:%d ctdp:%d pbf info:%d:%d:%d:%d\n",437		     id->cpu, level, pbf_info->p1_low, pbf_info->p1_high,438		     pbf_info->tdp, pbf_info->t_prochot);439 440	return _pbf_get_coremask_info(id, level, pbf_info);441}442 443static int tpmi_set_pbf_fact_status(struct isst_id *id, int pbf, int enable)444{445	struct isst_pkg_ctdp pkg_dev;446	struct isst_pkg_ctdp_level_info ctdp_level;447	int current_level;448	struct isst_perf_feature_control info;449	int ret;450 451	ret = isst_get_ctdp_levels(id, &pkg_dev);452	if (ret)453		debug_printf("cpu:%d No support for dynamic ISST\n", id->cpu);454 455	current_level = pkg_dev.current_level;456 457	ret = isst_get_ctdp_control(id, current_level, &ctdp_level);458	if (ret)459		return ret;460 461	info.socket_id = id->pkg;462	info.power_domain_id = id->punit;463 464	info.feature = 0;465 466	if (pbf) {467		if (ctdp_level.fact_enabled)468			info.feature |= BIT(1);469 470		if (enable)471			info.feature |= BIT(0);472		else473			info.feature &= ~BIT(0);474	} else {475 476		if (enable && !ctdp_level.sst_cp_enabled)477			isst_display_error_info_message(0,478							"Make sure to execute before: core-power enable",479							0, 0);480 481		if (ctdp_level.pbf_enabled)482			info.feature |= BIT(0);483 484		if (enable)485			info.feature |= BIT(1);486		else487			info.feature &= ~BIT(1);488	}489 490	ret = tpmi_process_ioctl(ISST_IF_PERF_SET_FEATURE, &info);491	if (ret == -1)492		return ret;493 494	return 0;495}496 497static int tpmi_get_fact_info(struct isst_id *id, int level, int fact_bucket,498			      struct isst_fact_info *fact_info)499{500	struct isst_turbo_freq_info info;501	int i, j;502	int ret;503 504	info.socket_id = id->pkg;505	info.power_domain_id = id->punit;506	info.level = level;507 508	ret = tpmi_process_ioctl(ISST_IF_GET_TURBO_FREQ_INFO, &info);509	if (ret == -1)510		return ret;511 512	for (i = 0; i < info.max_clip_freqs; ++i)513		fact_info->lp_ratios[i] = info.lp_clip_freq_mhz[i];514 515	if (info.max_buckets > TRL_MAX_BUCKETS)516		info.max_buckets = TRL_MAX_BUCKETS;517 518	if (info.max_trl_levels > TRL_MAX_LEVELS)519		info.max_trl_levels = TRL_MAX_LEVELS;520 521	for (i = 0; i < info.max_trl_levels; ++i) {522		for (j = 0; j < info.max_buckets; ++j)523			fact_info->bucket_info[j].hp_ratios[i] =524			    info.trl_freq_mhz[i][j];525	}526 527	for (i = 0; i < info.max_buckets; ++i)528		fact_info->bucket_info[i].hp_cores = info.bucket_core_counts[i];529 530	return 0;531}532 533static void _set_uncore_min_max(struct isst_id *id, int max, int freq)534{535	DIR *dir;536	FILE *filep;537	struct dirent *entry;538	char buffer[512];539	unsigned int tmp_id;540	int ret;541 542	dir = opendir("/sys/devices/system/cpu/intel_uncore_frequency/");543	if (!dir)544		return;545 546	while ((entry = readdir(dir)) != NULL ) {547		/* Check domain_id */548		snprintf(buffer, sizeof(buffer),549			 "/sys/devices/system/cpu/intel_uncore_frequency/%s/domain_id", entry->d_name);550 551		filep = fopen(buffer, "r");552		if (!filep)553			goto end;554 555		ret = fscanf(filep, "%u", &tmp_id);556		fclose(filep);557		if (ret != 1)558			goto end;559 560		if (tmp_id != id->punit)561			continue;562 563		/* Check package_id */564		snprintf(buffer, sizeof(buffer),565			 "/sys/devices/system/cpu/intel_uncore_frequency/%s/package_id", entry->d_name);566 567		filep = fopen(buffer, "r");568		if (!filep)569			goto end;570 571		ret = fscanf(filep, "%u", &tmp_id);572		fclose(filep);573 574		if (ret != 1)575			goto end;576 577		if (tmp_id != id->pkg)578			continue;579 580		/* Found the right sysfs path, adjust and quit */581		if (max)582			snprintf(buffer, sizeof(buffer),583				 "/sys/devices/system/cpu/intel_uncore_frequency/%s/max_freq_khz", entry->d_name);584		 else585			snprintf(buffer, sizeof(buffer),586				 "/sys/devices/system/cpu/intel_uncore_frequency/%s/min_freq_khz", entry->d_name);587 588		filep = fopen(buffer, "w");589		if (!filep)590			goto end;591 592		fprintf(filep, "%d\n", freq);593		fclose(filep);594		break;595	}596 597end:598	closedir(dir);599}600 601static void tpmi_adjust_uncore_freq(struct isst_id *id, int config_index,602				struct isst_pkg_ctdp_level_info *ctdp_level)603{604	struct isst_perf_level_data_info info;605	int ret;606 607	info.socket_id = id->pkg;608	info.power_domain_id = id->punit;609	info.level = config_index;610 611	ret = tpmi_process_ioctl(ISST_IF_GET_PERF_LEVEL_INFO, &info);612	if (ret == -1)613		return;614 615	ctdp_level->uncore_p0 = info.p0_fabric_freq_mhz;616	ctdp_level->uncore_p1 = info.p1_fabric_freq_mhz;617	ctdp_level->uncore_pm = info.pm_fabric_freq_mhz;618 619	if (ctdp_level->uncore_pm)620		_set_uncore_min_max(id, 0, ctdp_level->uncore_pm * 100000);621 622	if (ctdp_level->uncore_p0)623		_set_uncore_min_max(id, 1, ctdp_level->uncore_p0 * 100000);624 625	return;626}627 628static int tpmi_get_clos_information(struct isst_id *id, int *enable, int *type)629{630	struct isst_core_power info;631	int ret;632 633	info.get_set = 0;634	info.socket_id = id->pkg;635	info.power_domain_id = id->punit;636	ret = tpmi_process_ioctl(ISST_IF_CORE_POWER_STATE, &info);637	if (ret == -1)638		return ret;639 640	*enable = info.enable;641	*type = info.priority_type;642 643	return 0;644}645 646static int tpmi_pm_qos_config(struct isst_id *id, int enable_clos,647			      int priority_type)648{649	struct isst_core_power info;650	int i, ret, saved_punit;651 652	info.get_set = 1;653	info.socket_id = id->pkg;654	info.power_domain_id = id->punit;655	info.enable = enable_clos;656	info.priority_type = priority_type;657 658	saved_punit = id->punit;659 660	/* Set for all other dies also. This is per package setting */661	for (i = 0; i < MAX_PUNIT_PER_DIE; i++) {662		id->punit = i;663		if (isst_is_punit_valid(id)) {664			info.power_domain_id = i;665			ret = tpmi_process_ioctl(ISST_IF_CORE_POWER_STATE, &info);666			if (ret == -1) {667				id->punit = saved_punit;668				return ret;669			}670		}671	}672 673	id->punit = saved_punit;674 675	return 0;676}677 678int tpmi_pm_get_clos(struct isst_id *id, int clos,679		     struct isst_clos_config *clos_config)680{681	struct isst_clos_param info;682	int ret;683 684	info.get_set = 0;685	info.socket_id = id->pkg;686	info.power_domain_id = id->punit;687	info.clos = clos;688 689	ret = tpmi_process_ioctl(ISST_IF_CLOS_PARAM, &info);690	if (ret == -1)691		return ret;692 693	clos_config->epp = 0;694	clos_config->clos_prop_prio = info.prop_prio;695	clos_config->clos_min = info.min_freq_mhz;696	clos_config->clos_max = info.max_freq_mhz;697	clos_config->clos_desired = 0;698 699	debug_printf("cpu:%d clos:%d min:%d max:%d\n", id->cpu, clos,700		     clos_config->clos_min, clos_config->clos_max);701 702	return 0;703}704 705int tpmi_set_clos(struct isst_id *id, int clos,706		  struct isst_clos_config *clos_config)707{708	struct isst_clos_param info;709	int i, ret, saved_punit;710 711	info.get_set = 1;712	info.socket_id = id->pkg;713	info.power_domain_id = id->punit;714	info.clos = clos;715	info.prop_prio = clos_config->clos_prop_prio;716 717	info.min_freq_mhz = clos_config->clos_min;718	info.max_freq_mhz = clos_config->clos_max;719 720	if (info.min_freq_mhz <= 0xff)721		info.min_freq_mhz *= 100;722	if (info.max_freq_mhz <= 0xff)723		info.max_freq_mhz *= 100;724 725	saved_punit = id->punit;726 727	/* Set for all other dies also. This is per package setting */728	for (i = 0; i < MAX_PUNIT_PER_DIE; i++) {729		id->punit = i;730		if (isst_is_punit_valid(id)) {731			info.power_domain_id = i;732			ret = tpmi_process_ioctl(ISST_IF_CLOS_PARAM, &info);733			if (ret == -1) {734				id->punit = saved_punit;735				return ret;736			}737		}738	}739 740	id->punit = saved_punit;741 742	debug_printf("set cpu:%d clos:%d min:%d max:%d\n", id->cpu, clos,743		     clos_config->clos_min, clos_config->clos_max);744 745	return 0;746}747 748static int tpmi_clos_get_assoc_status(struct isst_id *id, int *clos_id)749{750	struct isst_if_clos_assoc_cmds assoc_cmds;751	int ret;752 753	assoc_cmds.cmd_count = 1;754	assoc_cmds.get_set = 0;755	assoc_cmds.punit_cpu_map = 1;756	assoc_cmds.assoc_info[0].logical_cpu = find_phy_core_num(id->cpu);757	assoc_cmds.assoc_info[0].socket_id = id->pkg;758	assoc_cmds.assoc_info[0].power_domain_id = id->punit;759 760	ret = tpmi_process_ioctl(ISST_IF_CLOS_ASSOC, &assoc_cmds);761	if (ret == -1)762		return ret;763 764	*clos_id = assoc_cmds.assoc_info[0].clos;765 766	return 0;767}768 769static int tpmi_clos_associate(struct isst_id *id, int clos_id)770{771	struct isst_if_clos_assoc_cmds assoc_cmds;772	int ret;773 774	assoc_cmds.cmd_count = 1;775	assoc_cmds.get_set = 1;776	assoc_cmds.punit_cpu_map = 1;777	assoc_cmds.assoc_info[0].logical_cpu = find_phy_core_num(id->cpu);778	assoc_cmds.assoc_info[0].clos = clos_id;779	assoc_cmds.assoc_info[0].socket_id = id->pkg;780	assoc_cmds.assoc_info[0].power_domain_id = id->punit;781 782	ret = tpmi_process_ioctl(ISST_IF_CLOS_ASSOC, &assoc_cmds);783	if (ret == -1)784		return ret;785 786	return 0;787}788 789static struct isst_platform_ops tpmi_ops = {790	.get_disp_freq_multiplier = tpmi_get_disp_freq_multiplier,791	.get_trl_max_levels = tpmi_get_trl_max_levels,792	.get_trl_level_name = tpmi_get_trl_level_name,793	.update_platform_param = tpmi_update_platform_param,794	.is_punit_valid = tpmi_is_punit_valid,795	.read_pm_config = tpmi_read_pm_config,796	.get_config_levels = tpmi_get_config_levels,797	.get_ctdp_control = tpmi_get_ctdp_control,798	.get_tdp_info = tpmi_get_tdp_info,799	.get_pwr_info = tpmi_get_pwr_info,800	.get_coremask_info = tpmi_get_coremask_info,801	.get_get_trl = tpmi_get_get_trl,802	.get_get_trls = tpmi_get_get_trls,803	.get_trl_bucket_info = tpmi_get_trl_bucket_info,804	.set_tdp_level = tpmi_set_tdp_level,805	.get_pbf_info = tpmi_get_pbf_info,806	.set_pbf_fact_status = tpmi_set_pbf_fact_status,807	.get_fact_info = tpmi_get_fact_info,808	.adjust_uncore_freq = tpmi_adjust_uncore_freq,809	.get_clos_information = tpmi_get_clos_information,810	.pm_qos_config = tpmi_pm_qos_config,811	.pm_get_clos = tpmi_pm_get_clos,812	.set_clos = tpmi_set_clos,813	.clos_get_assoc_status = tpmi_clos_get_assoc_status,814	.clos_associate = tpmi_clos_associate,815};816 817struct isst_platform_ops *tpmi_get_platform_ops(void)818{819	return &tpmi_ops;820}821