Merge tag 'platform-drivers-x86-v5.4-1' of git://git.infradead.org/linux-platform-drivers-x86
Pull x86 platform-drivers updates from Andy Shevchenko: - ASUS WMI driver got a couple of updates, i.e. support of FAN is fixed for recent products and the charge threshold support has been added - Two uknown key events for Dell laptops are being ignored now to avoid spamming users with harmless messages - HP ZBook 17 G5 and ASUS Zenbook UX430UNR got accelerometer support. - Intel CherryTrail platforms had a regression with wake up. Now it's fixed - Intel PMC driver got fixed in order to work nicely in Xen environment - Intel Speed Select driver provides bucket vs core count relationship. Besides that the tools has been updated for better output - The PrivacyGuard is enabled on Lenovo ThinkPad laptops - Three tablets - Trekstor Primebook C11B 2-in-1, Irbis TW90 and Chuwi Surbook Mini - got touchscreen support * tag 'platform-drivers-x86-v5.4-1' of git://git.infradead.org/linux-platform-drivers-x86: (53 commits) MAINTAINERS: Switch PDx86 subsystem status to Odd Fixes platform/x86: asus-wmi: Refactor charge threshold to use the battery hooking API platform/x86: asus-wmi: Rename CHARGE_THRESHOLD to RSOC platform/x86: asus-wmi: Reorder ASUS_WMI_CHARGE_THRESHOLD tools/power/x86/intel-speed-select: Display core count for bucket platform/x86: ISST: Allow additional TRL MSRs tools/power/x86/intel-speed-select: Fix memory leak tools/power/x86/intel-speed-select: Output success/failed for command output tools/power/x86/intel-speed-select: Output human readable CPU list tools/power/x86/intel-speed-select: Change turbo ratio output to maximum turbo frequency tools/power/x86/intel-speed-select: Switch output to MHz tools/power/x86/intel-speed-select: Simplify output for turbo-freq and base-freq tools/power/x86/intel-speed-select: Fix cpu-count output tools/power/x86/intel-speed-select: Fix help option typo tools/power/x86/intel-speed-select: Fix package typo tools/power/x86/intel-speed-select: Fix a read overflow in isst_set_tdp_level_msr() platform/x86: intel_int0002_vgpio: Use device_init_wakeup platform/x86: intel_int0002_vgpio: Fix wakeups not working on Cherry Trail platform/x86: compal-laptop: Initialize "value" in ec_read_u8() platform/x86: touchscreen_dmi: Add info for the Trekstor Primebook C11B 2-in-1 ...
This commit is contained in:
@@ -304,7 +304,7 @@ static void set_cpu_present_cpu_mask(void)
|
||||
int get_cpu_count(int pkg_id, int die_id)
|
||||
{
|
||||
if (pkg_id < MAX_PACKAGE_COUNT && die_id < MAX_DIE_PER_PACKAGE)
|
||||
return cpu_cnt[pkg_id][die_id] + 1;
|
||||
return cpu_cnt[pkg_id][die_id];
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -603,6 +603,10 @@ static int isst_fill_platform_info(void)
|
||||
|
||||
close(fd);
|
||||
|
||||
if (isst_platform_info.api_version > supported_api_ver) {
|
||||
printf("Incompatible API versions; Upgrade of tool is required\n");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1491,7 +1495,7 @@ static void usage(void)
|
||||
printf("intel-speed-select [OPTIONS] FEATURE COMMAND COMMAND_ARGUMENTS\n");
|
||||
printf("\nUse this tool to enumerate and control the Intel Speed Select Technology features,\n");
|
||||
printf("\nFEATURE : [perf-profile|base-freq|turbo-freq|core-power]\n");
|
||||
printf("\nFor help on each feature, use --h|--help\n");
|
||||
printf("\nFor help on each feature, use -h|--help\n");
|
||||
printf("\tFor example: intel-speed-select perf-profile -h\n");
|
||||
|
||||
printf("\nFor additional help on each command for a feature, use --h|--help\n");
|
||||
@@ -1514,7 +1518,6 @@ static void usage(void)
|
||||
printf("\tResult display uses a common format for each command:\n");
|
||||
printf("\tResults are formatted in text/JSON with\n");
|
||||
printf("\t\tPackage, Die, CPU, and command specific results.\n");
|
||||
printf("\t\t\tFor Set commands, status is 0 for success and rest for failures\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -1529,6 +1532,7 @@ static void cmdline(int argc, char **argv)
|
||||
{
|
||||
int opt;
|
||||
int option_index = 0;
|
||||
int ret;
|
||||
|
||||
static struct option long_options[] = {
|
||||
{ "cpu", required_argument, 0, 'c' },
|
||||
@@ -1590,13 +1594,14 @@ static void cmdline(int argc, char **argv)
|
||||
set_max_cpu_num();
|
||||
set_cpu_present_cpu_mask();
|
||||
set_cpu_target_cpu_mask();
|
||||
isst_fill_platform_info();
|
||||
if (isst_platform_info.api_version > supported_api_ver) {
|
||||
printf("Incompatible API versions; Upgrade of tool is required\n");
|
||||
exit(0);
|
||||
}
|
||||
ret = isst_fill_platform_info();
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
process_command(argc, argv);
|
||||
out:
|
||||
free_cpu_set(present_cpumask);
|
||||
free_cpu_set(target_cpumask);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
|
@@ -188,8 +188,27 @@ int isst_get_get_trl(int cpu, int level, int avx_level, int *trl)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int isst_get_trl_bucket_info(int cpu, unsigned long long *buckets_info)
|
||||
{
|
||||
int ret;
|
||||
|
||||
debug_printf("cpu:%d bucket info via MSR\n", cpu);
|
||||
|
||||
*buckets_info = 0;
|
||||
|
||||
ret = isst_send_msr_command(cpu, 0x1ae, 0, buckets_info);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
debug_printf("cpu:%d bucket info via MSR successful 0x%llx\n", cpu,
|
||||
*buckets_info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int isst_set_tdp_level_msr(int cpu, int tdp_level)
|
||||
{
|
||||
unsigned long long level = tdp_level;
|
||||
int ret;
|
||||
|
||||
debug_printf("cpu: tdp_level via MSR %d\n", cpu, tdp_level);
|
||||
@@ -202,8 +221,7 @@ int isst_set_tdp_level_msr(int cpu, int tdp_level)
|
||||
if (tdp_level > 2)
|
||||
return -1; /* invalid value */
|
||||
|
||||
ret = isst_send_msr_command(cpu, 0x64b, 1,
|
||||
(unsigned long long *)&tdp_level);
|
||||
ret = isst_send_msr_command(cpu, 0x64b, 1, &level);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -563,6 +581,10 @@ int isst_get_process_ctdp(int cpu, int tdp_level, struct isst_pkg_ctdp *pkg_dev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = isst_get_trl_bucket_info(cpu, &ctdp_level->buckets_info);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = isst_get_get_trl(cpu, i, 0,
|
||||
ctdp_level->trl_sse_active_cores);
|
||||
if (ret)
|
||||
|
@@ -6,7 +6,34 @@
|
||||
|
||||
#include "isst.h"
|
||||
|
||||
#define DISP_FREQ_MULTIPLIER 100000
|
||||
#define DISP_FREQ_MULTIPLIER 100
|
||||
|
||||
static void printcpulist(int str_len, char *str, int mask_size,
|
||||
cpu_set_t *cpu_mask)
|
||||
{
|
||||
int i, first, curr_index, index;
|
||||
|
||||
if (!CPU_COUNT_S(mask_size, cpu_mask)) {
|
||||
snprintf(str, str_len, "none");
|
||||
return;
|
||||
}
|
||||
|
||||
curr_index = 0;
|
||||
first = 1;
|
||||
for (i = 0; i < get_topo_max_cpus(); ++i) {
|
||||
if (!CPU_ISSET_S(i, mask_size, cpu_mask))
|
||||
continue;
|
||||
if (!first) {
|
||||
index = snprintf(&str[curr_index],
|
||||
str_len - curr_index, ",");
|
||||
curr_index += index;
|
||||
}
|
||||
index = snprintf(&str[curr_index], str_len - curr_index, "%d",
|
||||
i);
|
||||
curr_index += index;
|
||||
first = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void printcpumask(int str_len, char *str, int mask_size,
|
||||
cpu_set_t *cpu_mask)
|
||||
@@ -133,7 +160,7 @@ static void format_and_print(FILE *outf, int level, char *header, char *value)
|
||||
last_level = level;
|
||||
}
|
||||
|
||||
static void print_packag_info(int cpu, FILE *outf)
|
||||
static void print_package_info(int cpu, FILE *outf)
|
||||
{
|
||||
char header[256];
|
||||
|
||||
@@ -156,7 +183,7 @@ static void _isst_pbf_display_information(int cpu, FILE *outf, int level,
|
||||
snprintf(header, sizeof(header), "speed-select-base-freq");
|
||||
format_and_print(outf, disp_level, header, NULL);
|
||||
|
||||
snprintf(header, sizeof(header), "high-priority-base-frequency(KHz)");
|
||||
snprintf(header, sizeof(header), "high-priority-base-frequency(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
pbf_info->p1_high * DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, disp_level + 1, header, value);
|
||||
@@ -166,7 +193,13 @@ static void _isst_pbf_display_information(int cpu, FILE *outf, int level,
|
||||
pbf_info->core_cpumask);
|
||||
format_and_print(outf, disp_level + 1, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "low-priority-base-frequency(KHz)");
|
||||
snprintf(header, sizeof(header), "high-priority-cpu-list");
|
||||
printcpulist(sizeof(value), value,
|
||||
pbf_info->core_cpumask_size,
|
||||
pbf_info->core_cpumask);
|
||||
format_and_print(outf, disp_level + 1, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "low-priority-base-frequency(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
pbf_info->p1_low * DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, disp_level + 1, header, value);
|
||||
@@ -209,7 +242,7 @@ static void _isst_fact_display_information(int cpu, FILE *outf, int level,
|
||||
|
||||
if (fact_avx & 0x01) {
|
||||
snprintf(header, sizeof(header),
|
||||
"high-priority-max-frequency(KHz)");
|
||||
"high-priority-max-frequency(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
bucket_info[j].sse_trl * DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, base_level + 2, header, value);
|
||||
@@ -217,7 +250,7 @@ static void _isst_fact_display_information(int cpu, FILE *outf, int level,
|
||||
|
||||
if (fact_avx & 0x02) {
|
||||
snprintf(header, sizeof(header),
|
||||
"high-priority-max-avx2-frequency(KHz)");
|
||||
"high-priority-max-avx2-frequency(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
bucket_info[j].avx_trl * DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, base_level + 2, header, value);
|
||||
@@ -225,7 +258,7 @@ static void _isst_fact_display_information(int cpu, FILE *outf, int level,
|
||||
|
||||
if (fact_avx & 0x04) {
|
||||
snprintf(header, sizeof(header),
|
||||
"high-priority-max-avx512-frequency(KHz)");
|
||||
"high-priority-max-avx512-frequency(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
bucket_info[j].avx512_trl *
|
||||
DISP_FREQ_MULTIPLIER);
|
||||
@@ -235,19 +268,19 @@ static void _isst_fact_display_information(int cpu, FILE *outf, int level,
|
||||
snprintf(header, sizeof(header),
|
||||
"speed-select-turbo-freq-clip-frequencies");
|
||||
format_and_print(outf, base_level + 1, header, NULL);
|
||||
snprintf(header, sizeof(header), "low-priority-max-frequency(KHz)");
|
||||
snprintf(header, sizeof(header), "low-priority-max-frequency(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
fact_info->lp_clipping_ratio_license_sse *
|
||||
DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, base_level + 2, header, value);
|
||||
snprintf(header, sizeof(header),
|
||||
"low-priority-max-avx2-frequency(KHz)");
|
||||
"low-priority-max-avx2-frequency(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
fact_info->lp_clipping_ratio_license_avx2 *
|
||||
DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, base_level + 2, header, value);
|
||||
snprintf(header, sizeof(header),
|
||||
"low-priority-max-avx512-frequency(KHz)");
|
||||
"low-priority-max-avx512-frequency(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
fact_info->lp_clipping_ratio_license_avx512 *
|
||||
DISP_FREQ_MULTIPLIER);
|
||||
@@ -261,7 +294,7 @@ void isst_ctdp_display_information(int cpu, FILE *outf, int tdp_level,
|
||||
char value[256];
|
||||
int i, base_level = 1;
|
||||
|
||||
print_packag_info(cpu, outf);
|
||||
print_package_info(cpu, outf);
|
||||
|
||||
for (i = 0; i <= pkg_dev->levels; ++i) {
|
||||
struct isst_pkg_ctdp_level_info *ctdp_level;
|
||||
@@ -287,33 +320,41 @@ void isst_ctdp_display_information(int cpu, FILE *outf, int tdp_level,
|
||||
ctdp_level->core_cpumask);
|
||||
format_and_print(outf, base_level + 4, 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);
|
||||
|
||||
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);
|
||||
|
||||
snprintf(header, sizeof(header), "base-frequency(KHz)");
|
||||
snprintf(header, sizeof(header), "base-frequency(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
ctdp_level->tdp_ratio * DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
|
||||
snprintf(header, sizeof(header),
|
||||
"speed-select-turbo-freq-support");
|
||||
snprintf(value, sizeof(value), "%d", ctdp_level->fact_support);
|
||||
"speed-select-turbo-freq");
|
||||
if (ctdp_level->fact_support) {
|
||||
if (ctdp_level->fact_enabled)
|
||||
snprintf(value, sizeof(value), "enabled");
|
||||
else
|
||||
snprintf(value, sizeof(value), "disabled");
|
||||
} else
|
||||
snprintf(value, sizeof(value), "unsupported");
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
|
||||
snprintf(header, sizeof(header),
|
||||
"speed-select-base-freq-support");
|
||||
snprintf(value, sizeof(value), "%d", ctdp_level->pbf_support);
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
|
||||
snprintf(header, sizeof(header),
|
||||
"speed-select-base-freq-enabled");
|
||||
snprintf(value, sizeof(value), "%d", ctdp_level->pbf_enabled);
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
|
||||
snprintf(header, sizeof(header),
|
||||
"speed-select-turbo-freq-enabled");
|
||||
snprintf(value, sizeof(value), "%d", ctdp_level->fact_enabled);
|
||||
"speed-select-base-freq");
|
||||
if (ctdp_level->pbf_support) {
|
||||
if (ctdp_level->pbf_enabled)
|
||||
snprintf(value, sizeof(value), "enabled");
|
||||
else
|
||||
snprintf(value, sizeof(value), "disabled");
|
||||
} else
|
||||
snprintf(value, sizeof(value), "unsupported");
|
||||
format_and_print(outf, base_level + 4, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "thermal-design-power(W)");
|
||||
@@ -331,12 +372,14 @@ void isst_ctdp_display_information(int cpu, FILE *outf, int tdp_level,
|
||||
format_and_print(outf, base_level + 5, header, NULL);
|
||||
|
||||
snprintf(header, sizeof(header), "core-count");
|
||||
snprintf(value, sizeof(value), "%d", j);
|
||||
snprintf(value, sizeof(value), "%llu", (ctdp_level->buckets_info >> (j * 8)) & 0xff);
|
||||
format_and_print(outf, base_level + 6, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "turbo-ratio");
|
||||
snprintf(header, sizeof(header),
|
||||
"max-turbo-frequency(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
ctdp_level->trl_sse_active_cores[j]);
|
||||
ctdp_level->trl_sse_active_cores[j] *
|
||||
DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, base_level + 6, header, value);
|
||||
}
|
||||
snprintf(header, sizeof(header), "turbo-ratio-limits-avx");
|
||||
@@ -346,12 +389,14 @@ void isst_ctdp_display_information(int cpu, FILE *outf, int tdp_level,
|
||||
format_and_print(outf, base_level + 5, header, NULL);
|
||||
|
||||
snprintf(header, sizeof(header), "core-count");
|
||||
snprintf(value, sizeof(value), "%d", j);
|
||||
snprintf(value, sizeof(value), "%llu", (ctdp_level->buckets_info >> (j * 8)) & 0xff);
|
||||
format_and_print(outf, base_level + 6, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "turbo-ratio");
|
||||
snprintf(header, sizeof(header),
|
||||
"max-turbo-frequency(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
ctdp_level->trl_avx_active_cores[j]);
|
||||
ctdp_level->trl_avx_active_cores[j] *
|
||||
DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, base_level + 6, header, value);
|
||||
}
|
||||
|
||||
@@ -362,12 +407,14 @@ void isst_ctdp_display_information(int cpu, FILE *outf, int tdp_level,
|
||||
format_and_print(outf, base_level + 5, header, NULL);
|
||||
|
||||
snprintf(header, sizeof(header), "core-count");
|
||||
snprintf(value, sizeof(value), "%d", j);
|
||||
snprintf(value, sizeof(value), "%llu", (ctdp_level->buckets_info >> (j * 8)) & 0xff);
|
||||
format_and_print(outf, base_level + 6, header, value);
|
||||
|
||||
snprintf(header, sizeof(header), "turbo-ratio");
|
||||
snprintf(header, sizeof(header),
|
||||
"max-turbo-frequency(MHz)");
|
||||
snprintf(value, sizeof(value), "%d",
|
||||
ctdp_level->trl_avx_512_active_cores[j]);
|
||||
ctdp_level->trl_avx_512_active_cores[j] *
|
||||
DISP_FREQ_MULTIPLIER);
|
||||
format_and_print(outf, base_level + 6, header, value);
|
||||
}
|
||||
if (ctdp_level->pbf_support)
|
||||
@@ -397,7 +444,7 @@ void isst_ctdp_display_information_end(FILE *outf)
|
||||
void isst_pbf_display_information(int cpu, FILE *outf, int level,
|
||||
struct isst_pbf_info *pbf_info)
|
||||
{
|
||||
print_packag_info(cpu, outf);
|
||||
print_package_info(cpu, outf);
|
||||
_isst_pbf_display_information(cpu, outf, level, pbf_info, 4);
|
||||
format_and_print(outf, 1, NULL, NULL);
|
||||
}
|
||||
@@ -406,7 +453,7 @@ void isst_fact_display_information(int cpu, FILE *outf, int level,
|
||||
int fact_bucket, int fact_avx,
|
||||
struct isst_fact_info *fact_info)
|
||||
{
|
||||
print_packag_info(cpu, outf);
|
||||
print_package_info(cpu, outf);
|
||||
_isst_fact_display_information(cpu, outf, level, fact_bucket, fact_avx,
|
||||
fact_info, 4);
|
||||
format_and_print(outf, 1, NULL, NULL);
|
||||
@@ -472,7 +519,10 @@ void isst_display_result(int cpu, FILE *outf, char *feature, char *cmd,
|
||||
snprintf(header, sizeof(header), "%s", feature);
|
||||
format_and_print(outf, 4, header, NULL);
|
||||
snprintf(header, sizeof(header), "%s", cmd);
|
||||
snprintf(value, sizeof(value), "%d", result);
|
||||
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, 1, NULL, NULL);
|
||||
|
@@ -134,6 +134,7 @@ struct isst_pkg_ctdp_level_info {
|
||||
size_t core_cpumask_size;
|
||||
cpu_set_t *core_cpumask;
|
||||
int cpu_count;
|
||||
unsigned long long buckets_info;
|
||||
int trl_sse_active_cores[ISST_TRL_MAX_ACTIVE_CORES];
|
||||
int trl_avx_active_cores[ISST_TRL_MAX_ACTIVE_CORES];
|
||||
int trl_avx_512_active_cores[ISST_TRL_MAX_ACTIVE_CORES];
|
||||
|
مرجع در شماره جدید
Block a user