Lines Matching +full:8 +full:- +full:level
1 // SPDX-License-Identifier: GPL-2.0
3 * Intel Speed Select -- Enumerate and control features for Mailbox Interface
26 static char *mbox_get_trl_level_name(int level) in mbox_get_trl_level_name() argument
31 if (level >= MAX_TRL_LEVELS_EMR) in mbox_get_trl_level_name()
34 snprintf(level_str, sizeof(level_str), "level-%d", level); in mbox_get_trl_level_name()
38 switch (level) { in mbox_get_trl_level_name()
66 if (id->cpu < 0) in mbox_is_punit_valid()
69 if (id->pkg < 0 || id->die < 0 || id->punit) in mbox_is_punit_valid()
88 err(-1, "%s open failed", pathname); in _send_mmio_command()
101 if (ioctl(fd, cmd, &io_regs) == -1) { in _send_mmio_command()
185 err(-1, "%s open failed", pathname); in _send_mbox_command()
189 if (ioctl(fd, ISST_IF_MBOX_COMMAND, &mbox_cmds) == -1) { in _send_mbox_command()
198 --retry; in _send_mbox_command()
212 return -1; in _send_mbox_command()
224 ret = _send_mbox_command(id->cpu, READ_PM_CONFIG, PM_FEATURE, 0, 0, in mbox_read_pm_config()
229 debug_printf("cpu:%d READ_PM_CONFIG resp:%x\n", id->cpu, resp); in mbox_read_pm_config()
242 ret = _send_mbox_command(id->cpu, CONFIG_TDP, in mbox_get_config_levels()
245 pkg_dev->levels = 0; in mbox_get_config_levels()
246 pkg_dev->locked = 1; in mbox_get_config_levels()
247 pkg_dev->current_level = 0; in mbox_get_config_levels()
248 pkg_dev->version = 0; in mbox_get_config_levels()
249 pkg_dev->enabled = 0; in mbox_get_config_levels()
253 debug_printf("cpu:%d CONFIG_TDP_GET_LEVELS_INFO resp:%x\n", id->cpu, resp); in mbox_get_config_levels()
255 pkg_dev->version = resp & 0xff; in mbox_get_config_levels()
256 pkg_dev->levels = (resp >> 8) & 0xff; in mbox_get_config_levels()
257 pkg_dev->current_level = (resp >> 16) & 0xff; in mbox_get_config_levels()
258 pkg_dev->locked = !!(resp & BIT(24)); in mbox_get_config_levels()
259 pkg_dev->enabled = !!(resp & BIT(31)); in mbox_get_config_levels()
271 ret = _send_mbox_command(id->cpu, CONFIG_TDP, in mbox_get_ctdp_control()
277 ctdp_level->fact_support = resp & BIT(0); in mbox_get_ctdp_control()
278 ctdp_level->pbf_support = !!(resp & BIT(1)); in mbox_get_ctdp_control()
279 ctdp_level->fact_enabled = !!(resp & BIT(16)); in mbox_get_ctdp_control()
280 ctdp_level->pbf_enabled = !!(resp & BIT(17)); in mbox_get_ctdp_control()
284 debug_printf("cpu:%d pm_config is not supported\n", id->cpu); in mbox_get_ctdp_control()
286 debug_printf("cpu:%d pm_config SST-CP state:%d cap:%d\n", id->cpu, cp_state, cp_cap); in mbox_get_ctdp_control()
287 ctdp_level->sst_cp_support = cp_cap; in mbox_get_ctdp_control()
288 ctdp_level->sst_cp_enabled = cp_state; in mbox_get_ctdp_control()
293 id->cpu, resp, ctdp_level->fact_support, ctdp_level->pbf_support, in mbox_get_ctdp_control()
294 ctdp_level->fact_enabled, ctdp_level->pbf_enabled); in mbox_get_ctdp_control()
305 ctdp_level->uncore_pm = 0; in _get_uncore_p0_p1_info()
306 ctdp_level->uncore_p0 = 0; in _get_uncore_p0_p1_info()
307 ctdp_level->uncore_p1 = 0; in _get_uncore_p0_p1_info()
309 ret = _send_mbox_command(id->cpu, CONFIG_TDP, in _get_uncore_p0_p1_info()
316 ctdp_level->uncore_p0 = resp & GENMASK(7, 0); in _get_uncore_p0_p1_info()
317 ctdp_level->uncore_p1 = (resp & GENMASK(15, 8)) >> 8; in _get_uncore_p0_p1_info()
318 ctdp_level->uncore_pm = (resp & GENMASK(31, 24)) >> 24; in _get_uncore_p0_p1_info()
322 id->cpu, config_index, resp, ctdp_level->uncore_p0, ctdp_level->uncore_p1, in _get_uncore_p0_p1_info()
323 ctdp_level->uncore_pm); in _get_uncore_p0_p1_info()
328 ret = _send_mbox_command(id->cpu, CONFIG_TDP, in _get_uncore_p0_p1_info()
332 ctdp_level->uncore_p0 = 0; in _get_uncore_p0_p1_info()
333 ctdp_level->uncore_p1 = 0; in _get_uncore_p0_p1_info()
337 ctdp_level->uncore_p0 = resp & GENMASK(7, 0); in _get_uncore_p0_p1_info()
338 ctdp_level->uncore_p1 = (resp & GENMASK(15, 8)) >> 8; in _get_uncore_p0_p1_info()
341 id->cpu, config_index, resp, ctdp_level->uncore_p0, in _get_uncore_p0_p1_info()
342 ctdp_level->uncore_p1); in _get_uncore_p0_p1_info()
352 …s/devices/system/cpu/intel_uncore_frequency/package_%02d_die_%02d/max_freq_khz", id->pkg, id->die); in _set_uncore_min_max()
355 …s/devices/system/cpu/intel_uncore_frequency/package_%02d_die_%02d/min_freq_khz", id->pkg, id->die); in _set_uncore_min_max()
364 if (ret == -1) { in _set_uncore_min_max()
377 if (ctdp_level->uncore_pm) in mbox_adjust_uncore_freq()
378 _set_uncore_min_max(id, 0, ctdp_level->uncore_pm * 100000); in mbox_adjust_uncore_freq()
380 if (ctdp_level->uncore_p0) in mbox_adjust_uncore_freq()
381 _set_uncore_min_max(id, 1, ctdp_level->uncore_p0 * 100000); in mbox_adjust_uncore_freq()
389 ret = _send_mbox_command(id->cpu, CONFIG_TDP, CONFIG_TDP_GET_P1_INFO, 0, in _get_p1_info()
392 ctdp_level->sse_p1 = 0; in _get_p1_info()
393 ctdp_level->avx2_p1 = 0; in _get_p1_info()
394 ctdp_level->avx512_p1 = 0; in _get_p1_info()
398 ctdp_level->sse_p1 = resp & GENMASK(7, 0); in _get_p1_info()
399 ctdp_level->avx2_p1 = (resp & GENMASK(15, 8)) >> 8; in _get_p1_info()
400 ctdp_level->avx512_p1 = (resp & GENMASK(23, 16)) >> 16; in _get_p1_info()
401 ctdp_level->amx_p1 = (resp & GENMASK(31, 24)) >> 24; in _get_p1_info()
404 id->cpu, config_index, resp, ctdp_level->sse_p1, in _get_p1_info()
405 ctdp_level->avx2_p1, ctdp_level->avx512_p1, ctdp_level->amx_p1); in _get_p1_info()
414 ret = _send_mbox_command(id->cpu, CONFIG_TDP, CONFIG_TDP_GET_MEM_FREQ, in _get_uncore_mem_freq()
417 ctdp_level->mem_freq = 0; in _get_uncore_mem_freq()
421 ctdp_level->mem_freq = resp & GENMASK(7, 0); in _get_uncore_mem_freq()
423 ctdp_level->mem_freq *= 200; in _get_uncore_mem_freq()
425 if (ctdp_level->mem_freq < 7) { in _get_uncore_mem_freq()
426 ctdp_level->mem_freq = (12 - ctdp_level->mem_freq) * 133.33 * 2 * 10; in _get_uncore_mem_freq()
427 ctdp_level->mem_freq /= 10; in _get_uncore_mem_freq()
428 if (ctdp_level->mem_freq % 10 > 5) in _get_uncore_mem_freq()
429 ctdp_level->mem_freq++; in _get_uncore_mem_freq()
431 ctdp_level->mem_freq = 0; in _get_uncore_mem_freq()
434 ctdp_level->mem_freq = 0; in _get_uncore_mem_freq()
438 id->cpu, config_index, resp, ctdp_level->mem_freq); in _get_uncore_mem_freq()
447 ret = _send_mbox_command(id->cpu, CONFIG_TDP, CONFIG_TDP_GET_TDP_INFO, in mbox_get_tdp_info()
450 …isst_display_error_info_message(1, "Invalid level, Can't get TDP information at level", 1, config_… in mbox_get_tdp_info()
454 ctdp_level->pkg_tdp = resp & GENMASK(14, 0); in mbox_get_tdp_info()
455 ctdp_level->tdp_ratio = (resp & GENMASK(23, 16)) >> 16; in mbox_get_tdp_info()
459 id->cpu, config_index, resp, ctdp_level->tdp_ratio, in mbox_get_tdp_info()
460 ctdp_level->pkg_tdp); in mbox_get_tdp_info()
462 ret = _send_mbox_command(id->cpu, CONFIG_TDP, CONFIG_TDP_GET_TJMAX_INFO, in mbox_get_tdp_info()
467 ctdp_level->t_proc_hot = resp & GENMASK(7, 0); in mbox_get_tdp_info()
475 id->cpu, config_index, resp, ctdp_level->t_proc_hot); in mbox_get_tdp_info()
486 ret = _send_mbox_command(id->cpu, CONFIG_TDP, CONFIG_TDP_GET_PWR_INFO, in mbox_get_pwr_info()
491 ctdp_level->pkg_max_power = resp & GENMASK(14, 0); in mbox_get_pwr_info()
492 ctdp_level->pkg_min_power = (resp & GENMASK(30, 16)) >> 16; in mbox_get_pwr_info()
496 id->cpu, config_index, resp, ctdp_level->pkg_max_power, in mbox_get_pwr_info()
497 ctdp_level->pkg_min_power); in mbox_get_pwr_info()
508 ctdp_level->cpu_count = 0; in mbox_get_coremask_info()
513 ret = _send_mbox_command(id->cpu, CONFIG_TDP, in mbox_get_coremask_info()
515 (i << 8) | config_index, &resp); in mbox_get_coremask_info()
521 id->cpu, config_index, i, resp); in mbox_get_coremask_info()
525 ctdp_level->core_cpumask_size, in mbox_get_coremask_info()
526 ctdp_level->core_cpumask, in mbox_get_coremask_info()
528 ctdp_level->cpu_count += cpu_count; in mbox_get_coremask_info()
529 debug_printf("cpu:%d ctdp:%d mask:%d cpu count:%d\n", id->cpu, in mbox_get_coremask_info()
530 config_index, i, ctdp_level->cpu_count); in mbox_get_coremask_info()
536 static int mbox_get_get_trl(struct isst_id *id, int level, int avx_level, int *trl) in mbox_get_get_trl() argument
541 req = level | (avx_level << 16); in mbox_get_get_trl()
542 ret = _send_mbox_command(id->cpu, CONFIG_TDP, in mbox_get_get_trl()
550 id->cpu, req, resp); in mbox_get_get_trl()
553 trl[1] = (resp & GENMASK(15, 8)) >> 8; in mbox_get_get_trl()
557 req = level | BIT(8) | (avx_level << 16); in mbox_get_get_trl()
558 ret = _send_mbox_command(id->cpu, CONFIG_TDP, in mbox_get_get_trl()
564 debug_printf("cpu:%d CONFIG_TDP_GET_TURBO_LIMIT req:%x resp:%x\n", id->cpu, in mbox_get_get_trl()
568 trl[5] = (resp & GENMASK(15, 8)) >> 8; in mbox_get_get_trl()
575 static int mbox_get_get_trls(struct isst_id *id, int level, struct isst_pkg_ctdp_level_info *ctdp_l… in mbox_get_get_trls() argument
581 ret = mbox_get_get_trl(id, level, i, ctdp_level->trl_ratios[i]); in mbox_get_get_trls()
588 static int mbox_get_trl_bucket_info(struct isst_id *id, int level, unsigned long long *buckets_info) in mbox_get_trl_bucket_info() argument
592 debug_printf("cpu:%d bucket info via MSR\n", id->cpu); in mbox_get_trl_bucket_info()
596 ret = isst_send_msr_command(id->cpu, 0x1ae, 0, buckets_info); in mbox_get_trl_bucket_info()
600 debug_printf("cpu:%d bucket info via MSR successful 0x%llx\n", id->cpu, in mbox_get_trl_bucket_info()
614 return -1; in mbox_set_tdp_level()
618 ret = _send_mbox_command(id->cpu, CONFIG_TDP, CONFIG_TDP_SET_LEVEL, 0, in mbox_set_tdp_level()
621 isst_display_error_info_message(1, "Set TDP level failed for level", 1, tdp_level); in mbox_set_tdp_level()
628 static int mbox_get_pbf_info(struct isst_id *id, int level, struct isst_pbf_info *pbf_info) in mbox_get_pbf_info() argument
641 ret = _send_mbox_command(id->cpu, CONFIG_TDP, in mbox_get_pbf_info()
643 0, (i << 8) | level, &resp); in mbox_get_pbf_info()
649 id->cpu, resp); in mbox_get_pbf_info()
653 pbf_info->core_cpumask_size, in mbox_get_pbf_info()
654 pbf_info->core_cpumask, in mbox_get_pbf_info()
658 req = level; in mbox_get_pbf_info()
659 ret = _send_mbox_command(id->cpu, CONFIG_TDP, in mbox_get_pbf_info()
665 debug_printf("cpu:%d CONFIG_TDP_PBF_GET_P1HI_P1LO_INFO resp:%x\n", id->cpu, in mbox_get_pbf_info()
668 pbf_info->p1_low = resp & 0xff; in mbox_get_pbf_info()
669 pbf_info->p1_high = (resp & GENMASK(15, 8)) >> 8; in mbox_get_pbf_info()
671 req = level; in mbox_get_pbf_info()
673 id->cpu, CONFIG_TDP, CONFIG_TDP_PBF_GET_TDP_INFO, 0, req, &resp); in mbox_get_pbf_info()
677 debug_printf("cpu:%d CONFIG_TDP_PBF_GET_TDP_INFO resp:%x\n", id->cpu, resp); in mbox_get_pbf_info()
679 pbf_info->tdp = resp & 0xffff; in mbox_get_pbf_info()
681 req = level; in mbox_get_pbf_info()
683 id->cpu, CONFIG_TDP, CONFIG_TDP_PBF_GET_TJ_MAX_INFO, 0, req, &resp); in mbox_get_pbf_info()
687 debug_printf("cpu:%d CONFIG_TDP_PBF_GET_TJ_MAX_INFO resp:%x\n", id->cpu, in mbox_get_pbf_info()
689 pbf_info->t_control = (resp >> 8) & 0xff; in mbox_get_pbf_info()
690 pbf_info->t_prochot = resp & 0xff; in mbox_get_pbf_info()
705 debug_printf("cpu:%d No support for dynamic ISST\n", id->cpu); in mbox_set_pbf_fact_status()
724 isst_display_error_info_message(0, "Make sure to execute before: core-power enable", 0, 0); in mbox_set_pbf_fact_status()
735 ret = _send_mbox_command(id->cpu, CONFIG_TDP, in mbox_set_pbf_fact_status()
741 id->cpu, pbf, req); in mbox_set_pbf_fact_status()
746 static int _get_fact_bucket_info(struct isst_id *id, int level, in _get_fact_bucket_info() argument
757 id->cpu, CONFIG_TDP, in _get_fact_bucket_info()
759 (i << 8) | level, &resp); in _get_fact_bucket_info()
764 "cpu:%d CONFIG_TDP_GET_FACT_HP_TURBO_LIMIT_NUMCORES index:%d level:%d resp:%x\n", in _get_fact_bucket_info()
765 id->cpu, i, level, resp); in _get_fact_bucket_info()
769 (resp >> (j * 8)) & 0xff; in _get_fact_bucket_info()
778 id->cpu, CONFIG_TDP, in _get_fact_bucket_info()
780 (k << 16) | (i << 8) | level, &resp); in _get_fact_bucket_info()
785 "cpu:%d CONFIG_TDP_GET_FACT_HP_TURBO_LIMIT_RATIOS index:%d level:%d avx:%d resp:%x\n", in _get_fact_bucket_info()
786 id->cpu, i, level, k, resp); in _get_fact_bucket_info()
790 (resp >> (j * 8)) & 0xff; in _get_fact_bucket_info()
798 static int mbox_get_fact_info(struct isst_id *id, int level, int fact_bucket, struct isst_fact_info… in mbox_get_fact_info() argument
803 ret = _send_mbox_command(id->cpu, CONFIG_TDP, in mbox_get_fact_info()
805 level, &resp); in mbox_get_fact_info()
810 id->cpu, resp); in mbox_get_fact_info()
812 fact_info->lp_ratios[0] = resp & 0xff; in mbox_get_fact_info()
813 fact_info->lp_ratios[1] = (resp >> 8) & 0xff; in mbox_get_fact_info()
814 fact_info->lp_ratios[2] = (resp >> 16) & 0xff; in mbox_get_fact_info()
816 ret = _get_fact_bucket_info(id, level, fact_info->bucket_info); in mbox_get_fact_info()
825 if (!fact_info->bucket_info[j].hp_cores) in mbox_get_fact_info()
832 return -1; in mbox_get_fact_info()
843 ret = _send_mbox_command(id->cpu, CONFIG_CLOS, CLOS_PM_QOS_CONFIG, 0, 0, in mbox_get_clos_information()
848 debug_printf("cpu:%d CLOS_PM_QOS_CONFIG resp:%x\n", id->cpu, resp); in mbox_get_clos_information()
873 ret = _send_mbox_command(id->cpu, WRITE_PM_CONFIG, PM_FEATURE, 0, req, in _write_pm_config()
878 debug_printf("cpu:%d WRITE_PM_CONFIG resp:%x\n", id->cpu, resp); in _write_pm_config()
904 … isst_display_error_info_message(1, "Ignoring request, turbo-freq feature is still enabled", 0, 0); in mbox_pm_qos_config()
905 return -EINVAL; in mbox_pm_qos_config()
916 ret = _send_mbox_command(id->cpu, CONFIG_CLOS, CLOS_PM_QOS_CONFIG, 0, 0, in mbox_pm_qos_config()
923 debug_printf("cpu:%d CLOS_PM_QOS_CONFIG resp:%x\n", id->cpu, resp); in mbox_pm_qos_config()
940 ret = _send_mbox_command(id->cpu, CONFIG_CLOS, CLOS_PM_QOS_CONFIG, in mbox_pm_qos_config()
945 debug_printf("cpu:%d CLOS_PM_QOS_CONFIG priority type:%d req:%x\n", id->cpu, in mbox_pm_qos_config()
956 ret = _send_mbox_command(id->cpu, CONFIG_CLOS, CLOS_PM_CLOS, clos, 0, in mbox_pm_get_clos()
961 clos_config->epp = resp & 0x0f; in mbox_pm_get_clos()
962 clos_config->clos_prop_prio = (resp >> 4) & 0x0f; in mbox_pm_get_clos()
963 clos_config->clos_min = (resp >> 8) & 0xff; in mbox_pm_get_clos()
964 clos_config->clos_max = (resp >> 16) & 0xff; in mbox_pm_get_clos()
965 clos_config->clos_desired = (resp >> 24) & 0xff; in mbox_pm_get_clos()
976 req = clos_config->epp & 0x0f; in mbox_set_clos()
977 req |= (clos_config->clos_prop_prio & 0x0f) << 4; in mbox_set_clos()
978 req |= (clos_config->clos_min & 0xff) << 8; in mbox_set_clos()
979 req |= (clos_config->clos_max & 0xff) << 16; in mbox_set_clos()
980 req |= (clos_config->clos_desired & 0xff) << 24; in mbox_set_clos()
984 ret = _send_mbox_command(id->cpu, CONFIG_CLOS, CLOS_PM_CLOS, param, req, in mbox_set_clos()
989 debug_printf("cpu:%d CLOS_PM_CLOS param:%x req:%x\n", id->cpu, param, req); in mbox_set_clos()
1000 core_id = find_phy_core_num(id->cpu); in mbox_clos_get_assoc_status()
1003 ret = _send_mbox_command(id->cpu, CONFIG_CLOS, CLOS_PQR_ASSOC, param, 0, in mbox_clos_get_assoc_status()
1008 debug_printf("cpu:%d CLOS_PQR_ASSOC param:%x resp:%x\n", id->cpu, param, in mbox_clos_get_assoc_status()
1022 core_id = find_phy_core_num(id->cpu); in mbox_clos_associate()
1025 ret = _send_mbox_command(id->cpu, CONFIG_CLOS, CLOS_PQR_ASSOC, param, in mbox_clos_associate()
1030 debug_printf("cpu:%d CLOS_PQR_ASSOC param:%x req:%x\n", id->cpu, param, in mbox_clos_associate()