1 // SPDX-License-Identifier: GPL-2.0
3 * Intel Speed Select -- Enumerate and control features for TPMI Interface
4 * Copyright (c) 2022 Intel Corporation.
7 #include <linux/isst_if.h>
10 int tpmi_process_ioctl(int ioctl_no
, void *info
)
12 const char *pathname
= "/dev/isst_interface";
15 if (is_debug_enabled()) {
16 debug_printf("Issue IOCTL: ");
18 case ISST_IF_CORE_POWER_STATE
:
19 debug_printf("ISST_IF_CORE_POWER_STATE\n");
21 case ISST_IF_CLOS_PARAM
:
22 debug_printf("ISST_IF_CLOS_PARAM\n");
24 case ISST_IF_CLOS_ASSOC
:
25 debug_printf("ISST_IF_CLOS_ASSOC\n");
27 case ISST_IF_PERF_LEVELS
:
28 debug_printf("ISST_IF_PERF_LEVELS\n");
30 case ISST_IF_PERF_SET_LEVEL
:
31 debug_printf("ISST_IF_PERF_SET_LEVEL\n");
33 case ISST_IF_PERF_SET_FEATURE
:
34 debug_printf("ISST_IF_PERF_SET_FEATURE\n");
36 case ISST_IF_GET_PERF_LEVEL_INFO
:
37 debug_printf("ISST_IF_GET_PERF_LEVEL_INFO\n");
39 case ISST_IF_GET_PERF_LEVEL_CPU_MASK
:
40 debug_printf("ISST_IF_GET_PERF_LEVEL_CPU_MASK\n");
42 case ISST_IF_GET_BASE_FREQ_INFO
:
43 debug_printf("ISST_IF_GET_BASE_FREQ_INFO\n");
45 case ISST_IF_GET_BASE_FREQ_CPU_MASK
:
46 debug_printf("ISST_IF_GET_BASE_FREQ_CPU_MASK\n");
48 case ISST_IF_GET_TURBO_FREQ_INFO
:
49 debug_printf("ISST_IF_GET_TURBO_FREQ_INFO\n");
51 case ISST_IF_COUNT_TPMI_INSTANCES
:
52 debug_printf("ISST_IF_COUNT_TPMI_INSTANCES\n");
55 debug_printf("%d\n", ioctl_no
);
60 fd
= open(pathname
, O_RDWR
);
64 if (ioctl(fd
, ioctl_no
, info
) == -1) {
65 debug_printf("IOCTL %d Failed\n", ioctl_no
);
75 static int tpmi_get_disp_freq_multiplier(void)
80 static int tpmi_get_trl_max_levels(void)
82 return TRL_MAX_LEVELS
;
85 static char *tpmi_get_trl_level_name(int level
)
110 static void tpmi_update_platform_param(enum isst_platform_param param
, int value
)
112 /* No params need to be updated for now */
115 static int tpmi_is_punit_valid(struct isst_id
*id
)
117 struct isst_tpmi_instance_count info
;
123 info
.socket_id
= id
->pkg
;
124 ret
= tpmi_process_ioctl(ISST_IF_COUNT_TPMI_INSTANCES
, &info
);
128 if (info
.valid_mask
& BIT(id
->punit
))
134 static int tpmi_read_pm_config(struct isst_id
*id
, int *cp_state
, int *cp_cap
)
136 struct isst_core_power info
;
140 info
.socket_id
= id
->pkg
;
141 info
.power_domain_id
= id
->punit
;
142 ret
= tpmi_process_ioctl(ISST_IF_CORE_POWER_STATE
, &info
);
146 *cp_state
= info
.enable
;
147 *cp_cap
= info
.supported
;
152 int tpmi_get_config_levels(struct isst_id
*id
, struct isst_pkg_ctdp
*pkg_dev
)
154 struct isst_perf_level_info info
;
157 info
.socket_id
= id
->pkg
;
158 info
.power_domain_id
= id
->punit
;
160 ret
= tpmi_process_ioctl(ISST_IF_PERF_LEVELS
, &info
);
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
;
174 static int tpmi_get_ctdp_control(struct isst_id
*id
, int config_index
,
175 struct isst_pkg_ctdp_level_info
*ctdp_level
)
177 struct isst_core_power core_power_info
;
178 struct isst_perf_level_info info
;
182 info
.socket_id
= id
->pkg
;
183 info
.power_domain_id
= id
->punit
;
185 ret
= tpmi_process_ioctl(ISST_IF_PERF_LEVELS
, &info
);
189 if (config_index
!= 0xff)
190 level_mask
= 1 << config_index
;
192 level_mask
= config_index
;
194 if (!(info
.level_mask
& level_mask
))
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
);
201 ctdp_level
->fact_support
= info
.sst_tf_support
;
202 ctdp_level
->pbf_support
= info
.sst_bf_support
;
205 ctdp_level
->fact_enabled
= !!(info
.feature_state
& BIT(1));
206 ctdp_level
->pbf_enabled
= !!(info
.feature_state
& BIT(0));
208 core_power_info
.get_set
= 0;
209 core_power_info
.socket_id
= id
->pkg
;
210 core_power_info
.power_domain_id
= id
->punit
;
212 ret
= tpmi_process_ioctl(ISST_IF_CORE_POWER_STATE
, &core_power_info
);
216 ctdp_level
->sst_cp_support
= core_power_info
.supported
;
217 ctdp_level
->sst_cp_enabled
= core_power_info
.enable
;
220 ("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
);
227 static int tpmi_get_tdp_info(struct isst_id
*id
, int config_index
,
228 struct isst_pkg_ctdp_level_info
*ctdp_level
)
230 struct isst_perf_level_data_info info
;
233 info
.socket_id
= id
->pkg
;
234 info
.power_domain_id
= id
->punit
;
235 info
.level
= config_index
;
237 ret
= tpmi_process_ioctl(ISST_IF_GET_PERF_LEVEL_INFO
, &info
);
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
;
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
;
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
;
257 ("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
);
264 static int tpmi_get_pwr_info(struct isst_id
*id
, int config_index
,
265 struct isst_pkg_ctdp_level_info
*ctdp_level
)
268 ctdp_level
->pkg_max_power
= 0;
269 ctdp_level
->pkg_min_power
= 0;
272 ("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
);
279 int tpmi_get_coremask_info(struct isst_id
*id
, int config_index
,
280 struct isst_pkg_ctdp_level_info
*ctdp_level
)
282 struct isst_perf_level_cpu_mask info
;
285 info
.socket_id
= id
->pkg
;
286 info
.power_domain_id
= id
->punit
;
287 info
.level
= config_index
;
288 info
.punit_cpu_map
= 1;
290 ret
= tpmi_process_ioctl(ISST_IF_GET_PERF_LEVEL_CPU_MASK
, &info
);
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
;
299 debug_printf("cpu:%d ctdp:%d core_mask ino cpu count:%d\n",
300 id
->cpu
, config_index
, ctdp_level
->cpu_count
);
305 static int tpmi_get_get_trls(struct isst_id
*id
, int config_index
,
306 struct isst_pkg_ctdp_level_info
*ctdp_level
)
308 struct isst_perf_level_data_info info
;
311 info
.socket_id
= id
->pkg
;
312 info
.power_domain_id
= id
->punit
;
313 info
.level
= config_index
;
315 ret
= tpmi_process_ioctl(ISST_IF_GET_PERF_LEVEL_INFO
, &info
);
319 if (info
.max_buckets
> TRL_MAX_BUCKETS
)
320 info
.max_buckets
= TRL_MAX_BUCKETS
;
322 if (info
.max_trl_levels
> TRL_MAX_LEVELS
)
323 info
.max_trl_levels
= TRL_MAX_LEVELS
;
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
];
332 static int tpmi_get_get_trl(struct isst_id
*id
, int level
, int config_index
,
335 struct isst_pkg_ctdp_level_info ctdp_level
;
338 ret
= tpmi_get_get_trls(id
, config_index
, &ctdp_level
);
342 /* FIX ME: Just return for level 0 */
343 for (i
= 0; i
< 8; ++i
)
344 trl
[i
] = ctdp_level
.trl_ratios
[0][i
];
349 static int tpmi_get_trl_bucket_info(struct isst_id
*id
, int config_index
,
350 unsigned long long *buckets_info
)
352 struct isst_perf_level_data_info info
;
353 unsigned char *mask
= (unsigned char *)buckets_info
;
356 info
.socket_id
= id
->pkg
;
357 info
.power_domain_id
= id
->punit
;
358 info
.level
= config_index
;
360 ret
= tpmi_process_ioctl(ISST_IF_GET_PERF_LEVEL_INFO
, &info
);
364 if (info
.max_buckets
> TRL_MAX_BUCKETS
)
365 info
.max_buckets
= TRL_MAX_BUCKETS
;
367 for (i
= 0; i
< info
.max_buckets
; ++i
)
368 mask
[i
] = info
.bucket_core_counts
[i
];
370 debug_printf("cpu:%d TRL bucket info: 0x%llx\n", id
->cpu
,
376 static int tpmi_set_tdp_level(struct isst_id
*id
, int tdp_level
)
378 struct isst_perf_level_control info
;
381 info
.socket_id
= id
->pkg
;
382 info
.power_domain_id
= id
->punit
;
383 info
.level
= tdp_level
;
385 ret
= tpmi_process_ioctl(ISST_IF_PERF_SET_LEVEL
, &info
);
392 static int _pbf_get_coremask_info(struct isst_id
*id
, int config_index
,
393 struct isst_pbf_info
*pbf_info
)
395 struct isst_perf_level_cpu_mask info
;
398 info
.socket_id
= id
->pkg
;
399 info
.power_domain_id
= id
->punit
;
400 info
.level
= config_index
;
401 info
.punit_cpu_map
= 1;
403 ret
= tpmi_process_ioctl(ISST_IF_GET_BASE_FREQ_CPU_MASK
, &info
);
407 set_cpu_mask_from_punit_coremask(id
, info
.mask
,
408 pbf_info
->core_cpumask_size
,
409 pbf_info
->core_cpumask
, &cpu_count
);
411 debug_printf("cpu:%d ctdp:%d pbf core_mask info cpu count:%d\n",
412 id
->cpu
, config_index
, cpu_count
);
417 static int tpmi_get_pbf_info(struct isst_id
*id
, int level
,
418 struct isst_pbf_info
*pbf_info
)
420 struct isst_base_freq_info info
;
423 info
.socket_id
= id
->pkg
;
424 info
.power_domain_id
= id
->punit
;
427 ret
= tpmi_process_ioctl(ISST_IF_GET_BASE_FREQ_INFO
, &info
);
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
;
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
);
440 return _pbf_get_coremask_info(id
, level
, pbf_info
);
443 static int tpmi_set_pbf_fact_status(struct isst_id
*id
, int pbf
, int enable
)
445 struct isst_pkg_ctdp pkg_dev
;
446 struct isst_pkg_ctdp_level_info ctdp_level
;
448 struct isst_perf_feature_control info
;
451 ret
= isst_get_ctdp_levels(id
, &pkg_dev
);
453 debug_printf("cpu:%d No support for dynamic ISST\n", id
->cpu
);
455 current_level
= pkg_dev
.current_level
;
457 ret
= isst_get_ctdp_control(id
, current_level
, &ctdp_level
);
461 info
.socket_id
= id
->pkg
;
462 info
.power_domain_id
= id
->punit
;
467 if (ctdp_level
.fact_enabled
)
468 info
.feature
|= BIT(1);
471 info
.feature
|= BIT(0);
473 info
.feature
&= ~BIT(0);
476 if (enable
&& !ctdp_level
.sst_cp_enabled
)
477 isst_display_error_info_message(0,
478 "Make sure to execute before: core-power enable",
481 if (ctdp_level
.pbf_enabled
)
482 info
.feature
|= BIT(0);
485 info
.feature
|= BIT(1);
487 info
.feature
&= ~BIT(1);
490 ret
= tpmi_process_ioctl(ISST_IF_PERF_SET_FEATURE
, &info
);
497 static int tpmi_get_fact_info(struct isst_id
*id
, int level
, int fact_bucket
,
498 struct isst_fact_info
*fact_info
)
500 struct isst_turbo_freq_info info
;
504 info
.socket_id
= id
->pkg
;
505 info
.power_domain_id
= id
->punit
;
508 ret
= tpmi_process_ioctl(ISST_IF_GET_TURBO_FREQ_INFO
, &info
);
512 for (i
= 0; i
< info
.max_clip_freqs
; ++i
)
513 fact_info
->lp_ratios
[i
] = info
.lp_clip_freq_mhz
[i
];
515 if (info
.max_buckets
> TRL_MAX_BUCKETS
)
516 info
.max_buckets
= TRL_MAX_BUCKETS
;
518 if (info
.max_trl_levels
> TRL_MAX_LEVELS
)
519 info
.max_trl_levels
= TRL_MAX_LEVELS
;
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
];
527 for (i
= 0; i
< info
.max_buckets
; ++i
)
528 fact_info
->bucket_info
[i
].hp_cores
= info
.bucket_core_counts
[i
];
533 static void _set_uncore_min_max(struct isst_id
*id
, int max
, int freq
)
537 struct dirent
*entry
;
542 dir
= opendir("/sys/devices/system/cpu/intel_uncore_frequency/");
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
);
551 filep
= fopen(buffer
, "r");
555 ret
= fscanf(filep
, "%u", &tmp_id
);
560 if (tmp_id
!= id
->punit
)
563 /* Check package_id */
564 snprintf(buffer
, sizeof(buffer
),
565 "/sys/devices/system/cpu/intel_uncore_frequency/%s/package_id", entry
->d_name
);
567 filep
= fopen(buffer
, "r");
571 ret
= fscanf(filep
, "%u", &tmp_id
);
577 if (tmp_id
!= id
->pkg
)
580 /* Found the right sysfs path, adjust and quit */
582 snprintf(buffer
, sizeof(buffer
),
583 "/sys/devices/system/cpu/intel_uncore_frequency/%s/max_freq_khz", entry
->d_name
);
585 snprintf(buffer
, sizeof(buffer
),
586 "/sys/devices/system/cpu/intel_uncore_frequency/%s/min_freq_khz", entry
->d_name
);
588 filep
= fopen(buffer
, "w");
592 fprintf(filep
, "%d\n", freq
);
601 static void tpmi_adjust_uncore_freq(struct isst_id
*id
, int config_index
,
602 struct isst_pkg_ctdp_level_info
*ctdp_level
)
604 struct isst_perf_level_data_info info
;
607 info
.socket_id
= id
->pkg
;
608 info
.power_domain_id
= id
->punit
;
609 info
.level
= config_index
;
611 ret
= tpmi_process_ioctl(ISST_IF_GET_PERF_LEVEL_INFO
, &info
);
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
;
619 if (ctdp_level
->uncore_pm
)
620 _set_uncore_min_max(id
, 0, ctdp_level
->uncore_pm
* 100000);
622 if (ctdp_level
->uncore_p0
)
623 _set_uncore_min_max(id
, 1, ctdp_level
->uncore_p0
* 100000);
628 static int tpmi_get_clos_information(struct isst_id
*id
, int *enable
, int *type
)
630 struct isst_core_power info
;
634 info
.socket_id
= id
->pkg
;
635 info
.power_domain_id
= id
->punit
;
636 ret
= tpmi_process_ioctl(ISST_IF_CORE_POWER_STATE
, &info
);
640 *enable
= info
.enable
;
641 *type
= info
.priority_type
;
646 static int tpmi_pm_qos_config(struct isst_id
*id
, int enable_clos
,
649 struct isst_core_power info
;
650 int i
, ret
, saved_punit
;
653 info
.socket_id
= id
->pkg
;
654 info
.power_domain_id
= id
->punit
;
655 info
.enable
= enable_clos
;
656 info
.priority_type
= priority_type
;
658 saved_punit
= id
->punit
;
660 /* Set for all other dies also. This is per package setting */
661 for (i
= 0; i
< MAX_PUNIT_PER_DIE
; 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
);
667 id
->punit
= saved_punit
;
673 id
->punit
= saved_punit
;
678 int tpmi_pm_get_clos(struct isst_id
*id
, int clos
,
679 struct isst_clos_config
*clos_config
)
681 struct isst_clos_param info
;
685 info
.socket_id
= id
->pkg
;
686 info
.power_domain_id
= id
->punit
;
689 ret
= tpmi_process_ioctl(ISST_IF_CLOS_PARAM
, &info
);
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;
699 debug_printf("cpu:%d clos:%d min:%d max:%d\n", id
->cpu
, clos
,
700 clos_config
->clos_min
, clos_config
->clos_max
);
705 int tpmi_set_clos(struct isst_id
*id
, int clos
,
706 struct isst_clos_config
*clos_config
)
708 struct isst_clos_param info
;
709 int i
, ret
, saved_punit
;
712 info
.socket_id
= id
->pkg
;
713 info
.power_domain_id
= id
->punit
;
715 info
.prop_prio
= clos_config
->clos_prop_prio
;
717 info
.min_freq_mhz
= clos_config
->clos_min
;
718 info
.max_freq_mhz
= clos_config
->clos_max
;
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;
725 saved_punit
= id
->punit
;
727 /* Set for all other dies also. This is per package setting */
728 for (i
= 0; i
< MAX_PUNIT_PER_DIE
; i
++) {
730 if (isst_is_punit_valid(id
)) {
731 info
.power_domain_id
= i
;
732 ret
= tpmi_process_ioctl(ISST_IF_CLOS_PARAM
, &info
);
734 id
->punit
= saved_punit
;
740 id
->punit
= saved_punit
;
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
);
748 static int tpmi_clos_get_assoc_status(struct isst_id
*id
, int *clos_id
)
750 struct isst_if_clos_assoc_cmds assoc_cmds
;
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
;
760 ret
= tpmi_process_ioctl(ISST_IF_CLOS_ASSOC
, &assoc_cmds
);
764 *clos_id
= assoc_cmds
.assoc_info
[0].clos
;
769 static int tpmi_clos_associate(struct isst_id
*id
, int clos_id
)
771 struct isst_if_clos_assoc_cmds assoc_cmds
;
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
;
782 ret
= tpmi_process_ioctl(ISST_IF_CLOS_ASSOC
, &assoc_cmds
);
789 static 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
,
817 struct isst_platform_ops
*tpmi_get_platform_ops(void)