int isst_read_pm_config(struct isst_id *id, int *cp_state, int *cp_cap)
{
CHECK_CB(read_pm_config); return isst_ops->read_pm_config(id, cp_state, cp_cap);
}
int isst_get_get_trl(struct isst_id *id, int level, int avx_level, int *trl)
{
CHECK_CB(get_get_trl); return isst_ops->get_get_trl(id, level, avx_level, trl);
}
int isst_get_get_trls(struct isst_id *id, int level, struct isst_pkg_ctdp_level_info *ctdp_level)
{
CHECK_CB(get_get_trls); return isst_ops->get_get_trls(id, level, ctdp_level);
}
int isst_get_trl_bucket_info(struct isst_id *id, int level, unsignedlonglong *buckets_info)
{
CHECK_CB(get_trl_bucket_info); return isst_ops->get_trl_bucket_info(id, level, buckets_info);
}
int isst_set_tdp_level(struct isst_id *id, int tdp_level)
{
CHECK_CB(set_tdp_level); return isst_ops->set_tdp_level(id, tdp_level);
}
int isst_get_pbf_info(struct isst_id *id, int level, struct isst_pbf_info *pbf_info)
{ struct isst_pkg_ctdp_level_info ctdp_level; struct isst_pkg_ctdp pkg_dev; int ret;
ret = isst_get_ctdp_levels(id, &pkg_dev); if (ret) {
isst_display_error_info_message(1, "Failed to get number of levels", 0, 0); return ret;
}
int isst_set_pbf_fact_status(struct isst_id *id, int pbf, int enable)
{
CHECK_CB(set_pbf_fact_status); return isst_ops->set_pbf_fact_status(id, pbf, enable);
}
int isst_get_fact_info(struct isst_id *id, int level, int fact_bucket, struct isst_fact_info *fact_info)
{ struct isst_pkg_ctdp_level_info ctdp_level; struct isst_pkg_ctdp pkg_dev; int ret;
ret = isst_get_ctdp_levels(id, &pkg_dev); if (ret) {
isst_display_error_info_message(1, "Failed to get number of levels", 0, 0); return ret;
}
ret = isst_get_ctdp_control(id, level, &ctdp_level); if (ret) return ret;
if (!ctdp_level.fact_support) {
isst_display_error_info_message(1, "turbo-freq feature is not present at this level", 1, level); return -1;
}
CHECK_CB(get_fact_info); return isst_ops->get_fact_info(id, level, fact_bucket, fact_info);
}
int isst_get_trl(struct isst_id *id, unsignedlonglong *trl)
{ int ret;
ret = isst_send_msr_command(id->cpu, 0x1AD, 0, trl); if (ret) return ret;
return 0;
}
int isst_set_trl(struct isst_id *id, unsignedlonglong trl)
{ int ret;
if (!trl)
trl = 0xFFFFFFFFFFFFFFFFULL;
ret = isst_send_msr_command(id->cpu, 0x1AD, 1, &trl); if (ret) return ret;
return 0;
}
#define MSR_TRL_FREQ_MULTIPLIER 100
int isst_set_trl_from_current_tdp(struct isst_id *id, unsignedlonglong trl)
{ unsignedlonglong msr_trl; int ret;
if (id->cpu < 0) return 0;
if (trl) {
msr_trl = trl;
} else { struct isst_pkg_ctdp pkg_dev; int trl[8]; int i;
ret = isst_get_ctdp_levels(id, &pkg_dev); if (ret) return ret;
ret = isst_get_get_trl(id, pkg_dev.current_level, 0, trl); if (ret) return ret;
msr_trl = 0; for (i = 0; i < 8; ++i) { unsignedlonglong _trl = trl[i];
/* MSR is always in 100 MHz unit */ if (isst_get_disp_freq_multiplier() == 1)
_trl /= MSR_TRL_FREQ_MULTIPLIER;
msr_trl |= (_trl << (i * 8));
}
}
ret = isst_send_msr_command(id->cpu, 0x1AD, 1, &msr_trl); if (ret) return ret;
return 0;
}
/* Return 1 if locked */ int isst_get_config_tdp_lock_status(struct isst_id *id)
{ unsignedlonglong tdp_control = 0; int ret;
ret = isst_send_msr_command(id->cpu, 0x64b, 0, &tdp_control); if (ret) return ret;
ret = !!(tdp_control & BIT(31));
return ret;
}
void isst_get_process_ctdp_complete(struct isst_id *id, struct isst_pkg_ctdp *pkg_dev)
{ int i;
if (!pkg_dev->processed) return;
for (i = 0; i < pkg_dev->levels; ++i) { struct isst_pkg_ctdp_level_info *ctdp_level;
ctdp_level = &pkg_dev->ctdp_level[i]; if (ctdp_level->pbf_support)
free_cpu_set(ctdp_level->pbf_info.core_cpumask);
free_cpu_set(ctdp_level->core_cpumask);
}
}
isst_get_get_trl_from_msr(id, ctdp_level->trl_ratios[0]);
isst_get_trl_bucket_info(id, i, &ctdp_level->trl_cores); continue;
}
ret = isst_get_tdp_info(id, i, ctdp_level); if (ret) return ret;
ret = isst_get_pwr_info(id, i, ctdp_level); if (ret) return ret;
ctdp_level->core_cpumask_size =
alloc_cpu_set(&ctdp_level->core_cpumask);
ret = isst_get_coremask_info(id, i, ctdp_level); if (ret) return ret;
ret = isst_get_trl_bucket_info(id, i, &ctdp_level->trl_cores); if (ret) return ret;
ret = isst_get_get_trls(id, i, ctdp_level); if (ret) return ret;
}
if (!valid)
isst_display_error_info_message(0, "Invalid level, Can't get TDP control information at specified levels on cpu", 1, id->cpu);
return 0;
}
int isst_clos_get_clos_information(struct isst_id *id, int *enable, int *type)
{
CHECK_CB(get_clos_information); return isst_ops->get_clos_information(id, enable, type);
}
int isst_pm_qos_config(struct isst_id *id, int enable_clos, int priority_type)
{
CHECK_CB(pm_qos_config); return isst_ops->pm_qos_config(id, enable_clos, priority_type);
}
int isst_pm_get_clos(struct isst_id *id, int clos, struct isst_clos_config *clos_config)
{
CHECK_CB(pm_get_clos); return isst_ops->pm_get_clos(id, clos, clos_config);
}
int isst_set_clos(struct isst_id *id, int clos, struct isst_clos_config *clos_config)
{
CHECK_CB(set_clos); return isst_ops->set_clos(id, clos, clos_config);
}
int isst_clos_get_assoc_status(struct isst_id *id, int *clos_id)
{
CHECK_CB(clos_get_assoc_status); return isst_ops->clos_get_assoc_status(id, clos_id);
}
int isst_clos_associate(struct isst_id *id, int clos_id)
{
CHECK_CB(clos_associate); return isst_ops->clos_associate(id, clos_id);
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.0 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.