Merge tag 'platform-drivers-x86-v5.7-1' of git://git.infradead.org/linux-platform-drivers-x86
Pull x86 platform driver updates from Andy Shevchenko: - Fix for improper handling of fan_boost_mode in sysfs for ASUS laptops. - On newer ASUS laptops the 1st battery is named differently, here is a fix. - Fix Lex 2I385SW to allow both network cards to be used. - The power integrated circuit driver for Surface 3 has been added. - Refactor and clean up of Intel PMC driver and enable it on Intel Jasper Lake. - Clean up of Dell RBU driver. - Big update for Intel Speed Select technology support tool and driver. * tag 'platform-drivers-x86-v5.7-1' of git://git.infradead.org/linux-platform-drivers-x86: (75 commits) platform/x86: surface3_power: Fix always true condition in mshw0011_space_handler() platform/x86: surface3_power: Fix Kconfig section ordering platform/x86: surface3_power: Add missed headers platform/x86: surface3_power: Reformat GUID assignment platform/x86: surface3_power: Drop useless macro ACPI_PTR() platform/x86: surface3_power: Prefix POLL_INTERVAL with SURFACE_3 platform/x86: surface3_power: Simplify mshw0011_adp_psr() to one liner platform/x86: surface3_power: Use dev_err() instead of pr_err() platform/x86: surface3_power: Drop unused structure definition platform/x86: surface3_power: MSHW0011 rev-eng implementation platform/x86: intel_pmc_core: Make pmc_core_substate_res_show() generic platform/x86: intel_pmc_core: Make pmc_core_lpm_display() generic for platforms that support sub-states tools/power/x86/intel-speed-select: Fix a typo in error message tools/power/x86/intel-speed-select: Update version tools/power/x86/intel-speed-select: Avoid duplicate Package strings for json tools/power/x86/intel-speed-select: Add display for enabled cpus count tools/power/x86/intel-speed-select: Print friendly warning for bad command line tools/power/x86/intel-speed-select: Fix avx options for turbo-freq feature tools/power/x86/intel-speed-select: Improve CLX commands tools/power/x86/intel-speed-select: Show error for invalid CPUs in the options ...
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -114,8 +114,10 @@ int isst_get_tdp_info(int cpu, int config_index,
|
||||
|
||||
ret = isst_send_mbox_command(cpu, CONFIG_TDP, CONFIG_TDP_GET_TDP_INFO,
|
||||
0, config_index, &resp);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
isst_display_error_info_message(1, "Invalid level, Can't get TDP information at level", 1, config_index);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ctdp_level->pkg_tdp = resp & GENMASK(14, 0);
|
||||
ctdp_level->tdp_ratio = (resp & GENMASK(23, 16)) >> 16;
|
||||
@@ -352,7 +354,7 @@ int isst_set_tdp_level_msr(int cpu, int tdp_level)
|
||||
debug_printf("cpu: tdp_level via MSR %d\n", cpu, tdp_level);
|
||||
|
||||
if (isst_get_config_tdp_lock_status(cpu)) {
|
||||
debug_printf("cpu: tdp_locked %d\n", cpu);
|
||||
isst_display_error_info_message(1, "tdp_locked", 0, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -373,19 +375,50 @@ int isst_set_tdp_level(int cpu, int tdp_level)
|
||||
unsigned int resp;
|
||||
int ret;
|
||||
|
||||
|
||||
if (isst_get_config_tdp_lock_status(cpu)) {
|
||||
isst_display_error_info_message(1, "TDP is locked", 0, 0);
|
||||
return -1;
|
||||
|
||||
}
|
||||
|
||||
ret = isst_send_mbox_command(cpu, CONFIG_TDP, CONFIG_TDP_SET_LEVEL, 0,
|
||||
tdp_level, &resp);
|
||||
if (ret)
|
||||
return isst_set_tdp_level_msr(cpu, tdp_level);
|
||||
if (ret) {
|
||||
isst_display_error_info_message(1, "Set TDP level failed for level", 1, tdp_level);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int isst_get_pbf_info(int cpu, int level, struct isst_pbf_info *pbf_info)
|
||||
{
|
||||
struct isst_pkg_ctdp_level_info ctdp_level;
|
||||
struct isst_pkg_ctdp pkg_dev;
|
||||
int i, ret, core_cnt, max;
|
||||
unsigned int req, resp;
|
||||
|
||||
ret = isst_get_ctdp_levels(cpu, &pkg_dev);
|
||||
if (ret) {
|
||||
isst_display_error_info_message(1, "Failed to get number of levels", 0, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (level > pkg_dev.levels) {
|
||||
isst_display_error_info_message(1, "Invalid level", 1, level);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = isst_get_ctdp_control(cpu, level, &ctdp_level);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (!ctdp_level.pbf_support) {
|
||||
isst_display_error_info_message(1, "base-freq feature is not present at this level", 1, level);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pbf_info->core_cpumask_size = alloc_cpu_set(&pbf_info->core_cpumask);
|
||||
|
||||
core_cnt = get_core_count(get_physical_package_id(cpu), get_physical_die_id(cpu));
|
||||
@@ -481,6 +514,10 @@ int isst_set_pbf_fact_status(int cpu, int pbf, int enable)
|
||||
else
|
||||
req &= ~BIT(17);
|
||||
} else {
|
||||
|
||||
if (enable && !ctdp_level.sst_cp_enabled)
|
||||
isst_display_error_info_message(0, "Make sure to execute before: core-power enable", 0, 0);
|
||||
|
||||
if (ctdp_level.pbf_enabled)
|
||||
req = BIT(17);
|
||||
|
||||
@@ -566,10 +603,32 @@ int isst_get_fact_bucket_info(int cpu, int level,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int isst_get_fact_info(int cpu, int level, struct isst_fact_info *fact_info)
|
||||
int isst_get_fact_info(int cpu, 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;
|
||||
unsigned int resp;
|
||||
int ret;
|
||||
int j, ret, print;
|
||||
|
||||
ret = isst_get_ctdp_levels(cpu, &pkg_dev);
|
||||
if (ret) {
|
||||
isst_display_error_info_message(1, "Failed to get number of levels", 0, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (level > pkg_dev.levels) {
|
||||
isst_display_error_info_message(1, "Invalid level", 1, level);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = isst_get_ctdp_control(cpu, 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;
|
||||
}
|
||||
|
||||
ret = isst_send_mbox_command(cpu, CONFIG_TDP,
|
||||
CONFIG_TDP_GET_FACT_LP_CLIPPING_RATIO, 0,
|
||||
@@ -585,8 +644,25 @@ int isst_get_fact_info(int cpu, int level, struct isst_fact_info *fact_info)
|
||||
fact_info->lp_clipping_ratio_license_avx512 = (resp >> 16) & 0xff;
|
||||
|
||||
ret = isst_get_fact_bucket_info(cpu, level, fact_info->bucket_info);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return ret;
|
||||
print = 0;
|
||||
for (j = 0; j < ISST_FACT_MAX_BUCKETS; ++j) {
|
||||
if (fact_bucket != 0xff && fact_bucket != j)
|
||||
continue;
|
||||
|
||||
if (!fact_info->bucket_info[j].high_priority_cores_count)
|
||||
break;
|
||||
|
||||
print = 1;
|
||||
}
|
||||
if (!print) {
|
||||
isst_display_error_info_message(1, "Invalid bucket", 0, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int isst_set_trl(int cpu, unsigned long long trl)
|
||||
@@ -671,7 +747,7 @@ void isst_get_process_ctdp_complete(int cpu, struct isst_pkg_ctdp *pkg_dev)
|
||||
|
||||
int isst_get_process_ctdp(int cpu, int tdp_level, struct isst_pkg_ctdp *pkg_dev)
|
||||
{
|
||||
int i, ret;
|
||||
int i, ret, valid = 0;
|
||||
|
||||
if (pkg_dev->processed)
|
||||
return 0;
|
||||
@@ -684,6 +760,14 @@ int isst_get_process_ctdp(int cpu, int tdp_level, struct isst_pkg_ctdp *pkg_dev)
|
||||
cpu, pkg_dev->enabled, pkg_dev->current_level,
|
||||
pkg_dev->levels);
|
||||
|
||||
if (tdp_level != 0xff && tdp_level > pkg_dev->levels) {
|
||||
isst_display_error_info_message(1, "Invalid level", 0, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!pkg_dev->enabled)
|
||||
isst_display_error_info_message(0, "perf-profile feature is not supported, just base-config level 0 is valid", 0, 0);
|
||||
|
||||
for (i = 0; i <= pkg_dev->levels; ++i) {
|
||||
struct isst_pkg_ctdp_level_info *ctdp_level;
|
||||
|
||||
@@ -703,6 +787,7 @@ int isst_get_process_ctdp(int cpu, int tdp_level, struct isst_pkg_ctdp *pkg_dev)
|
||||
if (ret)
|
||||
continue;
|
||||
|
||||
valid = 1;
|
||||
pkg_dev->processed = 1;
|
||||
ctdp_level->processed = 1;
|
||||
|
||||
@@ -713,7 +798,7 @@ int isst_get_process_ctdp(int cpu, int tdp_level, struct isst_pkg_ctdp *pkg_dev)
|
||||
}
|
||||
|
||||
if (ctdp_level->fact_support) {
|
||||
ret = isst_get_fact_info(cpu, i,
|
||||
ret = isst_get_fact_info(cpu, i, 0xff,
|
||||
&ctdp_level->fact_info);
|
||||
if (ret)
|
||||
return ret;
|
||||
@@ -775,6 +860,9 @@ int isst_get_process_ctdp(int cpu, int tdp_level, struct isst_pkg_ctdp *pkg_dev)
|
||||
isst_get_uncore_mem_freq(cpu, i, ctdp_level);
|
||||
}
|
||||
|
||||
if (!valid)
|
||||
isst_display_error_info_message(0, "Invalid level, Can't get TDP control information at specified levels on cpu", 1, cpu);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -829,17 +917,19 @@ int isst_pm_qos_config(int cpu, int enable_clos, int priority_type)
|
||||
}
|
||||
ret = isst_write_pm_config(cpu, 0);
|
||||
if (ret)
|
||||
perror("isst_write_pm_config\n");
|
||||
isst_display_error_info_message(0, "WRITE_PM_CONFIG command failed, ignoring error\n", 0, 0);
|
||||
} else {
|
||||
ret = isst_write_pm_config(cpu, 1);
|
||||
if (ret)
|
||||
perror("isst_write_pm_config\n");
|
||||
isst_display_error_info_message(0, "WRITE_PM_CONFIG command failed, ignoring error\n", 0, 0);
|
||||
}
|
||||
|
||||
ret = isst_send_mbox_command(cpu, CONFIG_CLOS, CLOS_PM_QOS_CONFIG, 0, 0,
|
||||
&resp);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
isst_display_error_info_message(1, "CLOS_PM_QOS_CONFIG command failed", 0, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
debug_printf("cpu:%d CLOS_PM_QOS_CONFIG resp:%x\n", cpu, resp);
|
||||
|
||||
@@ -850,6 +940,9 @@ int isst_pm_qos_config(int cpu, int enable_clos, int priority_type)
|
||||
else
|
||||
req = req & ~BIT(1);
|
||||
|
||||
if (priority_type > 1)
|
||||
isst_display_error_info_message(1, "Invalid priority type: Changing type to ordered", 0, 0);
|
||||
|
||||
if (priority_type)
|
||||
req = req | BIT(2);
|
||||
else
|
||||
|
||||
@@ -158,10 +158,17 @@ static void format_and_print(FILE *outf, int level, char *header, char *value)
|
||||
last_level = level;
|
||||
}
|
||||
|
||||
static void print_package_info(int cpu, FILE *outf)
|
||||
static int print_package_info(int cpu, FILE *outf)
|
||||
{
|
||||
char header[256];
|
||||
|
||||
if (out_format_is_json()) {
|
||||
snprintf(header, sizeof(header), "package-%d:die-%d:cpu-%d",
|
||||
get_physical_package_id(cpu), get_physical_die_id(cpu),
|
||||
cpu);
|
||||
format_and_print(outf, 1, header, NULL);
|
||||
return 1;
|
||||
}
|
||||
snprintf(header, sizeof(header), "package-%d",
|
||||
get_physical_package_id(cpu));
|
||||
format_and_print(outf, 1, header, NULL);
|
||||
@@ -169,6 +176,8 @@ static void print_package_info(int cpu, FILE *outf)
|
||||
format_and_print(outf, 2, header, NULL);
|
||||
snprintf(header, sizeof(header), "cpu-%d", cpu);
|
||||
format_and_print(outf, 3, header, NULL);
|
||||
|
||||
return 3;
|
||||
}
|
||||
|
||||
static void _isst_pbf_display_information(int cpu, FILE *outf, int level,
|
||||
@@ -178,7 +187,7 @@ static void _isst_pbf_display_information(int cpu, FILE *outf, int level,
|
||||
char header[256];
|
||||
char value[256];
|
||||
|
||||
snprintf(header, sizeof(header), "speed-select-base-freq");
|
||||
snprintf(header, sizeof(header), "speed-select-base-freq-properties");
|
||||
format_and_print(outf, disp_level, header, NULL);
|
||||
|
||||
snprintf(header, sizeof(header), "high-priority-base-frequency(MHz)");
|
||||
@@ -222,9 +231,23 @@ static void _isst_fact_display_information(int cpu, FILE *outf, int level,
|
||||
struct isst_fact_bucket_info *bucket_info = fact_info->bucket_info;
|
||||
char header[256];
|
||||
char value[256];
|
||||
int j;
|
||||
int print = 0, j;
|
||||
|
||||
snprintf(header, sizeof(header), "speed-select-turbo-freq");
|
||||
for (j = 0; j < ISST_FACT_MAX_BUCKETS; ++j) {
|
||||
if (fact_bucket != 0xff && fact_bucket != j)
|
||||
continue;
|
||||
|
||||
if (!bucket_info[j].high_priority_cores_count)
|
||||
break;
|
||||
|
||||
print = 1;
|
||||
}
|
||||
if (!print) {
|
||||
fprintf(stderr, "Invalid bucket\n");
|
||||
return;
|
||||
}
|
||||
|
||||
snprintf(header, sizeof(header), "speed-select-turbo-freq-properties");
|
||||
format_and_print(outf, base_level, header, NULL);
|
||||
for (j = 0; j < ISST_FACT_MAX_BUCKETS; ++j) {
|
||||
if (fact_bucket != 0xff && fact_bucket != j)
|
||||
@@ -289,7 +312,7 @@ static void _isst_fact_display_information(int cpu, FILE *outf, int level,
|
||||
}
|
||||
|
||||
void isst_ctdp_display_core_info(int cpu, FILE *outf, char *prefix,
|
||||
unsigned int val)
|
||||
unsigned int val, char *str0, char *str1)
|
||||
{
|
||||
char header[256];
|
||||
char value[256];
|
||||
@@ -301,8 +324,12 @@ void isst_ctdp_display_core_info(int cpu, FILE *outf, char *prefix,
|
||||
format_and_print(outf, 2, header, NULL);
|
||||
snprintf(header, sizeof(header), "cpu-%d", cpu);
|
||||
format_and_print(outf, 3, header, NULL);
|
||||
|
||||
snprintf(value, sizeof(value), "%u", val);
|
||||
if (str0 && !val)
|
||||
snprintf(value, sizeof(value), "%s", str0);
|
||||
else if (str1 && val)
|
||||
snprintf(value, sizeof(value), "%s", str1);
|
||||
else
|
||||
snprintf(value, sizeof(value), "%u", val);
|
||||
format_and_print(outf, 4, prefix, value);
|
||||
|
||||
format_and_print(outf, 1, NULL, NULL);
|
||||
@@ -313,10 +340,11 @@ void isst_ctdp_display_information(int cpu, FILE *outf, int tdp_level,
|
||||
{
|
||||
char header[256];
|
||||
char value[256];
|
||||
int i, base_level = 1;
|
||||
static int level;
|
||||
int i;
|
||||
|
||||
if (pkg_dev->processed)
|
||||
print_package_info(cpu, outf);
|
||||
level = print_package_info(cpu, outf);
|
||||
|
||||
for (i = 0; i <= pkg_dev->levels; ++i) {
|
||||
struct isst_pkg_ctdp_level_info *ctdp_level;
|
||||
@@ -328,72 +356,80 @@ void isst_ctdp_display_information(int cpu, FILE *outf, int tdp_level,
|
||||
|
||||
snprintf(header, sizeof(header), "perf-profile-level-%d",
|
||||
ctdp_level->level);
|
||||
format_and_print(outf, base_level + 3, header, NULL);
|
||||
format_and_print(outf, level + 1, header, NULL);
|
||||
|
||||
snprintf(header, sizeof(header), "cpu-count");
|
||||
j = get_cpu_count(get_physical_die_id(cpu),
|
||||
get_physical_die_id(cpu));
|
||||
snprintf(value, sizeof(value), "%d", j);
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
j = CPU_COUNT_S(ctdp_level->core_cpumask_size,
|
||||
ctdp_level->core_cpumask);
|
||||
if (j) {
|
||||
snprintf(header, sizeof(header), "enable-cpu-count");
|
||||
snprintf(value, sizeof(value), "%d", j);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
}
|
||||
|
||||
if (ctdp_level->core_cpumask_size) {
|
||||
snprintf(header, sizeof(header), "enable-cpu-mask");
|
||||
printcpumask(sizeof(value), value,
|
||||
ctdp_level->core_cpumask_size,
|
||||
ctdp_level->core_cpumask);
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "enable-cpu-list");
|
||||
printcpulist(sizeof(value), value,
|
||||
ctdp_level->core_cpumask_size,
|
||||
ctdp_level->core_cpumask);
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
}
|
||||
|
||||
snprintf(header, sizeof(header), "thermal-design-power-ratio");
|
||||
snprintf(value, sizeof(value), "%d", ctdp_level->tdp_ratio);
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "base-frequency(MHz)");
|
||||
if (!ctdp_level->sse_p1)
|
||||
ctdp_level->sse_p1 = ctdp_level->tdp_ratio;
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
ctdp_level->sse_p1 * DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
if (ctdp_level->avx2_p1) {
|
||||
snprintf(header, sizeof(header), "base-frequency-avx2(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
ctdp_level->avx2_p1 * DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
}
|
||||
|
||||
if (ctdp_level->avx512_p1) {
|
||||
snprintf(header, sizeof(header), "base-frequency-avx512(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
ctdp_level->avx512_p1 * DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
}
|
||||
|
||||
if (ctdp_level->uncore_p1) {
|
||||
snprintf(header, sizeof(header), "uncore-frequency-min(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
ctdp_level->uncore_p1 * DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
}
|
||||
|
||||
if (ctdp_level->uncore_p0) {
|
||||
snprintf(header, sizeof(header), "uncore-frequency-max(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
ctdp_level->uncore_p0 * DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
}
|
||||
|
||||
if (ctdp_level->mem_freq) {
|
||||
snprintf(header, sizeof(header), "mem-frequency(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
ctdp_level->mem_freq * DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
}
|
||||
|
||||
snprintf(header, sizeof(header),
|
||||
@@ -405,7 +441,7 @@ void isst_ctdp_display_information(int cpu, FILE *outf, int tdp_level,
|
||||
snprintf(value, sizeof(value), "disabled");
|
||||
} else
|
||||
snprintf(value, sizeof(value), "unsupported");
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
snprintf(header, sizeof(header),
|
||||
"speed-select-base-freq");
|
||||
@@ -416,7 +452,7 @@ void isst_ctdp_display_information(int cpu, FILE *outf, int tdp_level,
|
||||
snprintf(value, sizeof(value), "disabled");
|
||||
} else
|
||||
snprintf(value, sizeof(value), "unsupported");
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
snprintf(header, sizeof(header),
|
||||
"speed-select-core-power");
|
||||
@@ -427,110 +463,115 @@ void isst_ctdp_display_information(int cpu, FILE *outf, int tdp_level,
|
||||
snprintf(value, sizeof(value), "disabled");
|
||||
} else
|
||||
snprintf(value, sizeof(value), "unsupported");
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
if (is_clx_n_platform()) {
|
||||
if (ctdp_level->pbf_support)
|
||||
_isst_pbf_display_information(cpu, outf,
|
||||
tdp_level,
|
||||
&ctdp_level->pbf_info,
|
||||
base_level + 4);
|
||||
level + 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ctdp_level->pkg_tdp) {
|
||||
snprintf(header, sizeof(header), "thermal-design-power(W)");
|
||||
snprintf(value, sizeof(value), "%d", ctdp_level->pkg_tdp);
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
}
|
||||
|
||||
if (ctdp_level->t_proc_hot) {
|
||||
snprintf(header, sizeof(header), "tjunction-max(C)");
|
||||
snprintf(value, sizeof(value), "%d", ctdp_level->t_proc_hot);
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
}
|
||||
|
||||
snprintf(header, sizeof(header), "turbo-ratio-limits-sse");
|
||||
format_and_print(outf, base_level + 4, header, NULL);
|
||||
format_and_print(outf, level + 2, header, NULL);
|
||||
for (j = 0; j < 8; ++j) {
|
||||
snprintf(header, sizeof(header), "bucket-%d", j);
|
||||
format_and_print(outf, base_level + 5, header, NULL);
|
||||
format_and_print(outf, level + 3, header, NULL);
|
||||
|
||||
snprintf(header, sizeof(header), "core-count");
|
||||
snprintf(value, sizeof(value), "%llu", (ctdp_level->buckets_info >> (j * 8)) & 0xff);
|
||||
format_and_print(outf, base_level + 6, header, value);
|
||||
format_and_print(outf, level + 4, header, value);
|
||||
|
||||
snprintf(header, sizeof(header),
|
||||
"max-turbo-frequency(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
ctdp_level->trl_sse_active_cores[j] *
|
||||
DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, base_level + 6, header, value);
|
||||
format_and_print(outf, level + 4, header, value);
|
||||
}
|
||||
|
||||
if (ctdp_level->trl_avx_active_cores[0]) {
|
||||
snprintf(header, sizeof(header), "turbo-ratio-limits-avx2");
|
||||
format_and_print(outf, base_level + 4, header, NULL);
|
||||
format_and_print(outf, level + 2, header, NULL);
|
||||
for (j = 0; j < 8; ++j) {
|
||||
snprintf(header, sizeof(header), "bucket-%d", j);
|
||||
format_and_print(outf, base_level + 5, header, NULL);
|
||||
format_and_print(outf, level + 3, header, NULL);
|
||||
|
||||
snprintf(header, sizeof(header), "core-count");
|
||||
snprintf(value, sizeof(value), "%llu", (ctdp_level->buckets_info >> (j * 8)) & 0xff);
|
||||
format_and_print(outf, base_level + 6, header, value);
|
||||
format_and_print(outf, level + 4, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "max-turbo-frequency(MHz)");
|
||||
snprintf(value, sizeof(value), "%d", ctdp_level->trl_avx_active_cores[j] * DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, base_level + 6, header, value);
|
||||
format_and_print(outf, level + 4, header, value);
|
||||
}
|
||||
}
|
||||
|
||||
if (ctdp_level->trl_avx_512_active_cores[0]) {
|
||||
snprintf(header, sizeof(header), "turbo-ratio-limits-avx512");
|
||||
format_and_print(outf, base_level + 4, header, NULL);
|
||||
format_and_print(outf, level + 2, header, NULL);
|
||||
for (j = 0; j < 8; ++j) {
|
||||
snprintf(header, sizeof(header), "bucket-%d", j);
|
||||
format_and_print(outf, base_level + 5, header, NULL);
|
||||
format_and_print(outf, level + 3, header, NULL);
|
||||
|
||||
snprintf(header, sizeof(header), "core-count");
|
||||
snprintf(value, sizeof(value), "%llu", (ctdp_level->buckets_info >> (j * 8)) & 0xff);
|
||||
format_and_print(outf, base_level + 6, header, value);
|
||||
format_and_print(outf, level + 4, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "max-turbo-frequency(MHz)");
|
||||
snprintf(value, sizeof(value), "%d", ctdp_level->trl_avx_512_active_cores[j] * DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, base_level + 6, header, value);
|
||||
format_and_print(outf, level + 4, header, value);
|
||||
}
|
||||
}
|
||||
|
||||
if (ctdp_level->pbf_support)
|
||||
_isst_pbf_display_information(cpu, outf, i,
|
||||
&ctdp_level->pbf_info,
|
||||
base_level + 4);
|
||||
level + 2);
|
||||
if (ctdp_level->fact_support)
|
||||
_isst_fact_display_information(cpu, outf, i, 0xff, 0xff,
|
||||
&ctdp_level->fact_info,
|
||||
base_level + 4);
|
||||
level + 2);
|
||||
}
|
||||
|
||||
format_and_print(outf, 1, NULL, NULL);
|
||||
}
|
||||
|
||||
static int start;
|
||||
void isst_ctdp_display_information_start(FILE *outf)
|
||||
{
|
||||
last_level = 0;
|
||||
format_and_print(outf, 0, "start", NULL);
|
||||
start = 1;
|
||||
}
|
||||
|
||||
void isst_ctdp_display_information_end(FILE *outf)
|
||||
{
|
||||
format_and_print(outf, 0, NULL, NULL);
|
||||
start = 0;
|
||||
}
|
||||
|
||||
void isst_pbf_display_information(int cpu, FILE *outf, int level,
|
||||
struct isst_pbf_info *pbf_info)
|
||||
{
|
||||
print_package_info(cpu, outf);
|
||||
_isst_pbf_display_information(cpu, outf, level, pbf_info, 4);
|
||||
int _level;
|
||||
|
||||
_level = print_package_info(cpu, outf);
|
||||
_isst_pbf_display_information(cpu, outf, level, pbf_info, _level + 1);
|
||||
format_and_print(outf, 1, NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -538,9 +579,11 @@ void isst_fact_display_information(int cpu, FILE *outf, int level,
|
||||
int fact_bucket, int fact_avx,
|
||||
struct isst_fact_info *fact_info)
|
||||
{
|
||||
print_package_info(cpu, outf);
|
||||
int _level;
|
||||
|
||||
_level = print_package_info(cpu, outf);
|
||||
_isst_fact_display_information(cpu, outf, level, fact_bucket, fact_avx,
|
||||
fact_info, 4);
|
||||
fact_info, _level + 1);
|
||||
format_and_print(outf, 1, NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -549,94 +592,103 @@ void isst_clos_display_information(int cpu, FILE *outf, int clos,
|
||||
{
|
||||
char header[256];
|
||||
char value[256];
|
||||
int level;
|
||||
|
||||
snprintf(header, sizeof(header), "package-%d",
|
||||
get_physical_package_id(cpu));
|
||||
format_and_print(outf, 1, header, NULL);
|
||||
snprintf(header, sizeof(header), "die-%d", get_physical_die_id(cpu));
|
||||
format_and_print(outf, 2, header, NULL);
|
||||
snprintf(header, sizeof(header), "cpu-%d", cpu);
|
||||
format_and_print(outf, 3, header, NULL);
|
||||
level = print_package_info(cpu, outf);
|
||||
|
||||
snprintf(header, sizeof(header), "core-power");
|
||||
format_and_print(outf, 4, header, NULL);
|
||||
format_and_print(outf, level + 1, header, NULL);
|
||||
|
||||
snprintf(header, sizeof(header), "clos");
|
||||
snprintf(value, sizeof(value), "%d", clos);
|
||||
format_and_print(outf, 5, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "epp");
|
||||
snprintf(value, sizeof(value), "%d", clos_config->epp);
|
||||
format_and_print(outf, 5, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "clos-proportional-priority");
|
||||
snprintf(value, sizeof(value), "%d", clos_config->clos_prop_prio);
|
||||
format_and_print(outf, 5, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "clos-min");
|
||||
snprintf(value, sizeof(value), "%d MHz", clos_config->clos_min * DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, 5, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "clos-max");
|
||||
snprintf(value, sizeof(value), "%d MHz", clos_config->clos_max * DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, 5, header, value);
|
||||
if (clos_config->clos_max == 0xff)
|
||||
snprintf(value, sizeof(value), "Max Turbo frequency");
|
||||
else
|
||||
snprintf(value, sizeof(value), "%d MHz", clos_config->clos_max * DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "clos-desired");
|
||||
snprintf(value, sizeof(value), "%d MHz", clos_config->clos_desired * DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, 5, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
format_and_print(outf, 1, NULL, NULL);
|
||||
format_and_print(outf, level, NULL, NULL);
|
||||
}
|
||||
|
||||
void isst_clos_display_clos_information(int cpu, FILE *outf,
|
||||
int clos_enable, int type)
|
||||
int clos_enable, int type,
|
||||
int state, int cap)
|
||||
{
|
||||
char header[256];
|
||||
char value[256];
|
||||
int level;
|
||||
|
||||
snprintf(header, sizeof(header), "package-%d",
|
||||
get_physical_package_id(cpu));
|
||||
format_and_print(outf, 1, header, NULL);
|
||||
snprintf(header, sizeof(header), "die-%d", get_physical_die_id(cpu));
|
||||
format_and_print(outf, 2, header, NULL);
|
||||
snprintf(header, sizeof(header), "cpu-%d", cpu);
|
||||
format_and_print(outf, 3, header, NULL);
|
||||
level = print_package_info(cpu, outf);
|
||||
|
||||
snprintf(header, sizeof(header), "core-power");
|
||||
format_and_print(outf, 4, header, NULL);
|
||||
format_and_print(outf, level + 1, header, NULL);
|
||||
|
||||
snprintf(header, sizeof(header), "support-status");
|
||||
if (cap)
|
||||
snprintf(value, sizeof(value), "supported");
|
||||
else
|
||||
snprintf(value, sizeof(value), "unsupported");
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "enable-status");
|
||||
snprintf(value, sizeof(value), "%d", clos_enable);
|
||||
format_and_print(outf, 5, header, value);
|
||||
if (state)
|
||||
snprintf(value, sizeof(value), "enabled");
|
||||
else
|
||||
snprintf(value, sizeof(value), "disabled");
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "clos-enable-status");
|
||||
if (clos_enable)
|
||||
snprintf(value, sizeof(value), "enabled");
|
||||
else
|
||||
snprintf(value, sizeof(value), "disabled");
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "priority-type");
|
||||
snprintf(value, sizeof(value), "%d", type);
|
||||
format_and_print(outf, 5, header, value);
|
||||
if (type)
|
||||
snprintf(value, sizeof(value), "ordered");
|
||||
else
|
||||
snprintf(value, sizeof(value), "proportional");
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
format_and_print(outf, 1, NULL, NULL);
|
||||
format_and_print(outf, level, NULL, NULL);
|
||||
}
|
||||
|
||||
void isst_clos_display_assoc_information(int cpu, FILE *outf, int clos)
|
||||
{
|
||||
char header[256];
|
||||
char value[256];
|
||||
int level;
|
||||
|
||||
snprintf(header, sizeof(header), "package-%d",
|
||||
get_physical_package_id(cpu));
|
||||
format_and_print(outf, 1, header, NULL);
|
||||
snprintf(header, sizeof(header), "die-%d", get_physical_die_id(cpu));
|
||||
format_and_print(outf, 2, header, NULL);
|
||||
snprintf(header, sizeof(header), "cpu-%d", cpu);
|
||||
format_and_print(outf, 3, header, NULL);
|
||||
level = print_package_info(cpu, outf);
|
||||
|
||||
snprintf(header, sizeof(header), "get-assoc");
|
||||
format_and_print(outf, 4, header, NULL);
|
||||
format_and_print(outf, level + 1, header, NULL);
|
||||
|
||||
snprintf(header, sizeof(header), "clos");
|
||||
snprintf(value, sizeof(value), "%d", clos);
|
||||
format_and_print(outf, 5, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
format_and_print(outf, 1, NULL, NULL);
|
||||
format_and_print(outf, level, NULL, NULL);
|
||||
}
|
||||
|
||||
void isst_display_result(int cpu, FILE *outf, char *feature, char *cmd,
|
||||
@@ -644,24 +696,60 @@ void isst_display_result(int cpu, FILE *outf, char *feature, char *cmd,
|
||||
{
|
||||
char header[256];
|
||||
char value[256];
|
||||
int level = 3;
|
||||
|
||||
if (cpu >= 0)
|
||||
level = print_package_info(cpu, outf);
|
||||
|
||||
if (cpu >= 0) {
|
||||
snprintf(header, sizeof(header), "package-%d",
|
||||
get_physical_package_id(cpu));
|
||||
format_and_print(outf, 1, header, NULL);
|
||||
snprintf(header, sizeof(header), "die-%d", get_physical_die_id(cpu));
|
||||
format_and_print(outf, 2, header, NULL);
|
||||
snprintf(header, sizeof(header), "cpu-%d", cpu);
|
||||
format_and_print(outf, 3, header, NULL);
|
||||
}
|
||||
snprintf(header, sizeof(header), "%s", feature);
|
||||
format_and_print(outf, 4, header, NULL);
|
||||
format_and_print(outf, level + 1, header, NULL);
|
||||
snprintf(header, sizeof(header), "%s", cmd);
|
||||
if (!result)
|
||||
snprintf(value, sizeof(value), "success");
|
||||
else
|
||||
snprintf(value, sizeof(value), "failed(error %d)", result);
|
||||
format_and_print(outf, 5, header, value);
|
||||
format_and_print(outf, level + 2, header, value);
|
||||
|
||||
format_and_print(outf, level, NULL, NULL);
|
||||
}
|
||||
|
||||
void isst_display_error_info_message(int error, char *msg, int arg_valid, int arg)
|
||||
{
|
||||
FILE *outf = get_output_file();
|
||||
static int error_index;
|
||||
char header[256];
|
||||
char value[256];
|
||||
|
||||
if (!out_format_is_json()) {
|
||||
if (arg_valid)
|
||||
snprintf(value, sizeof(value), "%s %d", msg, arg);
|
||||
else
|
||||
snprintf(value, sizeof(value), "%s", msg);
|
||||
|
||||
if (error)
|
||||
fprintf(outf, "Error: %s\n", value);
|
||||
else
|
||||
fprintf(outf, "Information: %s\n", value);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!start)
|
||||
format_and_print(outf, 0, "start", NULL);
|
||||
|
||||
if (error)
|
||||
snprintf(header, sizeof(header), "Error%d", error_index++);
|
||||
else
|
||||
snprintf(header, sizeof(header), "Information:%d", error_index++);
|
||||
format_and_print(outf, 1, header, NULL);
|
||||
|
||||
snprintf(header, sizeof(header), "message");
|
||||
if (arg_valid)
|
||||
snprintf(value, sizeof(value), "%s %d", msg, arg);
|
||||
else
|
||||
snprintf(value, sizeof(value), "%s", msg);
|
||||
|
||||
format_and_print(outf, 2, header, value);
|
||||
format_and_print(outf, 1, NULL, NULL);
|
||||
if (!start)
|
||||
format_and_print(outf, 0, NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -172,6 +172,7 @@ extern int get_cpu_count(int pkg_id, int die_id);
|
||||
extern int get_core_count(int pkg_id, int die_id);
|
||||
|
||||
/* Common interfaces */
|
||||
FILE *get_output_file(void);
|
||||
extern void debug_printf(const char *format, ...);
|
||||
extern int out_format_is_json(void);
|
||||
extern int get_physical_package_id(int cpu);
|
||||
@@ -196,6 +197,8 @@ extern int isst_send_msr_command(unsigned int cpu, unsigned int command,
|
||||
int write, unsigned long long *req_resp);
|
||||
|
||||
extern int isst_get_ctdp_levels(int cpu, struct isst_pkg_ctdp *pkg_dev);
|
||||
extern int isst_get_ctdp_control(int cpu, int config_index,
|
||||
struct isst_pkg_ctdp_level_info *ctdp_level);
|
||||
extern int isst_get_coremask_info(int cpu, int config_index,
|
||||
struct isst_pkg_ctdp_level_info *ctdp_level);
|
||||
extern int isst_get_process_ctdp(int cpu, int tdp_level,
|
||||
@@ -205,7 +208,7 @@ extern void isst_get_process_ctdp_complete(int cpu,
|
||||
extern void isst_ctdp_display_information(int cpu, FILE *outf, int tdp_level,
|
||||
struct isst_pkg_ctdp *pkg_dev);
|
||||
extern void isst_ctdp_display_core_info(int cpu, FILE *outf, char *prefix,
|
||||
unsigned int val);
|
||||
unsigned int val, char *str0, char *str1);
|
||||
extern void isst_ctdp_display_information_start(FILE *outf);
|
||||
extern void isst_ctdp_display_information_end(FILE *outf);
|
||||
extern void isst_pbf_display_information(int cpu, FILE *outf, int level,
|
||||
@@ -216,7 +219,7 @@ extern int isst_set_pbf_fact_status(int cpu, int pbf, int enable);
|
||||
extern int isst_get_pbf_info(int cpu, int level,
|
||||
struct isst_pbf_info *pbf_info);
|
||||
extern void isst_get_pbf_info_complete(struct isst_pbf_info *pbf_info);
|
||||
extern int isst_get_fact_info(int cpu, int level,
|
||||
extern int isst_get_fact_info(int cpu, int level, int fact_bucket,
|
||||
struct isst_fact_info *fact_info);
|
||||
extern int isst_get_fact_bucket_info(int cpu, int level,
|
||||
struct isst_fact_bucket_info *bucket_info);
|
||||
@@ -245,7 +248,10 @@ extern void isst_display_result(int cpu, FILE *outf, char *feature, char *cmd,
|
||||
|
||||
extern int isst_clos_get_clos_information(int cpu, int *enable, int *type);
|
||||
extern void isst_clos_display_clos_information(int cpu, FILE *outf,
|
||||
int clos_enable, int type);
|
||||
int clos_enable, int type,
|
||||
int state, int cap);
|
||||
extern int is_clx_n_platform(void);
|
||||
extern int get_cpufreq_base_freq(int cpu);
|
||||
extern int isst_read_pm_config(int cpu, int *cp_state, int *cp_cap);
|
||||
extern void isst_display_error_info_message(int error, char *msg, int arg_valid, int arg);
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user