Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
3973637
platform/x86: ISST: Support SST-TF revision 2
spandruvada May 6, 2025
c115631
platform/x86: ISST: Support SST-PP revision 2
spandruvada May 6, 2025
7ecd9f1
platform/x86: ISST: Update minor version
spandruvada May 6, 2025
30762e3
platform/x86: ISST: Reset core count to 0
spandruvada Mar 25, 2026
cc38fc3
tools/power/x86/intel-speed-select: Sanitize integer arguments
spandruvada Sep 7, 2023
8ab4fc7
tools/power/x86/intel-speed-select: Update help for TRL
spandruvada Sep 8, 2023
a618d32
tools/power/x86/intel-speed-select: turbo-mode enable disable swapped
spandruvada Sep 8, 2023
41af44e
tools/power/x86/intel-speed-select: No TRL for non compute domains
spandruvada Sep 8, 2023
c478911
tools/power/x86/intel-speed-select: Display error for core-power support
spandruvada Sep 8, 2023
7833930
tools/power/x86/intel-speed-select: Increase max CPUs in one request
spandruvada Oct 13, 2023
8182014
tools/power/x86/intel-speed-select: Use cgroup isolate for CPU 0
spandruvada Oct 3, 2023
ec11b5f
tools/power/x86/intel-speed-select: v1.18 release
spandruvada Oct 13, 2023
6213eea
tools/power/x86/intel-speed-select: Increase die count
spandruvada Mar 7, 2024
4dc349d
tools/power/x86/intel-speed-select: Support multiple dies
spandruvada Mar 7, 2024
56cbadd
tools/power/x86/intel-speed-select: Fix display for unsupported levels
spandruvada Mar 9, 2024
f164bce
tools/power/x86/intel-speed-select: Present all TRL levels for turbo-…
spandruvada Mar 9, 2024
ffb5850
tools/power/x86/intel-speed-select: Increase number of CPUs displayed
spandruvada Mar 25, 2024
1091ce8
tools/power/x86/intel-speed-select: SST BF/TF support per level
spandruvada Mar 26, 2024
3e4f2bf
tools/power/x86/intel-speed-select: Display CPU as None for -1
spandruvada Apr 26, 2024
57c96c3
tools/power/x86/intel-speed-select: v1.19 release
spandruvada Apr 26, 2024
48ec333
tools/power/x86/intel-speed-select: Set TRL MSR in 100 MHz units
spandruvada Jul 6, 2024
ced881a
tools/power/x86/intel-speed-select: v1.20 release
spandruvada Jul 7, 2024
f964220
tools/power/x86/intel-speed-select: Fix TRL restore after SST-TF disable
spandruvada Nov 20, 2024
3af3117
tools/power/x86/intel-speed-select: v1.21 release
spandruvada Nov 20, 2024
511f9d7
tools/power/x86/intel-speed-select: Prevent increasing MAX_DIE_PER_PA…
spandruvada Mar 5, 2025
40abc4a
tools/power/x86/intel-speed-select: Fix the condition to check multi …
spandruvada Mar 5, 2025
79d8b0d
tools/power/x86/intel-speed-select: Die ID for IO dies
spandruvada Mar 5, 2025
d9897f3
tools/power/x86/intel-speed-select: Prefix header search path with sy…
kraj Jan 29, 2025
4e68d8f
tools/power/x86/intel-speed-select: v1.22 release
spandruvada Mar 6, 2025
1089bbb
tools/power/x86/intel-speed-select: Support SST PP revision 2 fields
spandruvada Mar 30, 2025
b9b218b
tools/power/x86/intel-speed-select: Skip uncore frequency update
spandruvada Apr 17, 2025
a545ccd
tools/power/x86/intel-speed-select: v1.23 release
spandruvada Mar 30, 2025
45e79c2
tools/power/x86/intel-speed-select: Check feature status
spandruvada May 1, 2025
117742a
tools/power/x86/intel-speed-select: Reset isst_turbo_freq_info for in…
spandruvada Jun 11, 2025
db0b1ba
tools/power/x86/intel-speed-select: v1.24 release
spandruvada Nov 8, 2025
6b36bd3
tools/power/x86/intel-speed-select: Allow non root users
spandruvada Jan 16, 2026
60cc4f8
tools/power/x86/intel-speed-select: Use pkg-config for libnl-3.0 dete…
kraj Dec 29, 2025
47671b7
tools/power/x86/intel-speed-select: Fix file descriptor leak in isola…
Jan 15, 2026
d06dcb4
tools/power/x86/intel-speed-select: v1.25 release
spandruvada Jan 16, 2026
959b150
tools/power/x86/intel-speed-select: Avoid current base freq as maximum
spandruvada Mar 12, 2026
392251e
tools/power/x86/intel-speed-select: Fix cpu extended family ID decoding
zhang-rui Jan 26, 2026
ea361a6
tools/power/x86/intel-speed-select: Fix some program return value
zhang-rui Mar 19, 2026
0c7e54c
tools/power/x86/intel-speed-select: Print Version info when Incompati…
zhang-rui Mar 19, 2026
f304cfc
tools/power/x86/intel-speed-select: Fix output when running on unsupp…
zhang-rui Mar 19, 2026
258757c
tools/power/x86/intel-speed-select: v1.26 release
spandruvada Apr 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 103 additions & 2 deletions drivers/platform/x86/intel/speed_select_if/isst_tpmi_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@

/* Supported SST hardware version by this driver */
#define ISST_MAJOR_VERSION 0
#define ISST_MINOR_VERSION 1
#define ISST_MINOR_VERSION 2

/*
* Used to indicate if value read from MMIO needs to get multiplied
Expand Down Expand Up @@ -381,7 +381,7 @@ static int sst_main(struct auxiliary_device *auxdev, struct tpmi_per_power_domai
return -ENODEV;
}

if (TPMI_MINOR_VERSION(pd_info->sst_header.interface_version) != ISST_MINOR_VERSION)
if (TPMI_MINOR_VERSION(pd_info->sst_header.interface_version) > ISST_MINOR_VERSION)
dev_info(dev, "SST: Ignore: Unsupported minor version:%lx\n",
TPMI_MINOR_VERSION(pd_info->sst_header.interface_version));

Expand Down Expand Up @@ -1017,6 +1017,7 @@ static int isst_if_set_perf_feature(void __user *argp)

#define SST_PP_INFO_10_OFFSET 80
#define SST_PP_INFO_11_OFFSET 88
#define SST_PP_INFO_12_OFFSET 96

#define SST_PP_P1_SSE_START 0
#define SST_PP_P1_SSE_WIDTH 8
Expand Down Expand Up @@ -1069,6 +1070,15 @@ static int isst_if_set_perf_feature(void __user *argp)
#define SST_PP_CORE_RATIO_PM_FABRIC_START 48
#define SST_PP_CORE_RATIO_PM_FABRIC_WIDTH 8

#define SST_PP_CORE_RATIO_P0_FABRIC_1_START 0
#define SST_PP_CORE_RATIO_P0_FABRIC_1_WIDTH 8

#define SST_PP_CORE_RATIO_P1_FABRIC_1_START 8
#define SST_PP_CORE_RATIO_P1_FABRIC_1_WIDTH 8

#define SST_PP_CORE_RATIO_PM_FABRIC_1_START 16
#define SST_PP_CORE_RATIO_PM_FABRIC_1_WIDTH 8

static int isst_if_get_perf_level_info(void __user *argp)
{
struct isst_perf_level_data_info perf_level;
Expand Down Expand Up @@ -1168,6 +1178,59 @@ static int isst_if_get_perf_level_info(void __user *argp)
return 0;
}

static int isst_if_get_perf_level_fabric_info(void __user *argp)
{
struct isst_perf_level_fabric_info perf_level_fabric;
struct tpmi_per_power_domain_info *power_domain_info;
int start = SST_PP_CORE_RATIO_P0_FABRIC_START;
int width = SST_PP_CORE_RATIO_P0_FABRIC_WIDTH;
int offset = SST_PP_INFO_11_OFFSET;
int i;

if (copy_from_user(&perf_level_fabric, argp, sizeof(perf_level_fabric)))
return -EFAULT;

power_domain_info = get_instance(perf_level_fabric.socket_id,
perf_level_fabric.power_domain_id);
if (!power_domain_info)
return -EINVAL;

if (perf_level_fabric.level > power_domain_info->max_level)
return -EINVAL;

if (power_domain_info->pp_header.feature_rev < 2)
return -EINVAL;

if (!(power_domain_info->pp_header.level_en_mask & BIT(perf_level_fabric.level)))
return -EINVAL;

/* For revision 2, maximum number of fabrics is 2 */
perf_level_fabric.max_fabrics = 2;

for (i = 0; i < perf_level_fabric.max_fabrics; i++) {
_read_pp_level_info("p0_fabric_freq_mhz", perf_level_fabric.p0_fabric_freq_mhz[i],
perf_level_fabric.level, offset, start, width,
SST_MUL_FACTOR_FREQ)
start += width;

_read_pp_level_info("p1_fabric_freq_mhz", perf_level_fabric.p1_fabric_freq_mhz[i],
perf_level_fabric.level, offset, start, width,
SST_MUL_FACTOR_FREQ)
start += width;

_read_pp_level_info("pm_fabric_freq_mhz", perf_level_fabric.pm_fabric_freq_mhz[i],
perf_level_fabric.level, offset, start, width,
SST_MUL_FACTOR_FREQ)
offset = SST_PP_INFO_12_OFFSET;
start = SST_PP_CORE_RATIO_P0_FABRIC_1_START;
}

if (copy_to_user(argp, &perf_level_fabric, sizeof(perf_level_fabric)))
return -EFAULT;

return 0;
}

#define SST_PP_FUSED_CORE_COUNT_START 0
#define SST_PP_FUSED_CORE_COUNT_WIDTH 8

Expand Down Expand Up @@ -1329,9 +1392,14 @@ static int isst_if_get_tpmi_instance_count(void __user *argp)
#define SST_TF_INFO_0_OFFSET 0
#define SST_TF_INFO_1_OFFSET 8
#define SST_TF_INFO_2_OFFSET 16
#define SST_TF_INFO_8_OFFSET 64
#define SST_TF_INFO_8_BUCKETS 3

#define SST_TF_MAX_LP_CLIP_RATIOS TRL_MAX_LEVELS

#define SST_TF_FEATURE_REV_START 4
#define SST_TF_FEATURE_REV_WIDTH 8

#define SST_TF_LP_CLIP_RATIO_0_START 16
#define SST_TF_LP_CLIP_RATIO_0_WIDTH 8

Expand All @@ -1341,10 +1409,14 @@ static int isst_if_get_tpmi_instance_count(void __user *argp)
#define SST_TF_NUM_CORE_0_START 0
#define SST_TF_NUM_CORE_0_WIDTH 8

#define SST_TF_NUM_MOD_0_START 0
#define SST_TF_NUM_MOD_0_WIDTH 16

static int isst_if_get_turbo_freq_info(void __user *argp)
{
static struct isst_turbo_freq_info turbo_freq;
struct tpmi_per_power_domain_info *power_domain_info;
u8 feature_rev;
int i, j;

if (copy_from_user(&turbo_freq, argp, sizeof(turbo_freq)))
Expand All @@ -1361,6 +1433,10 @@ static int isst_if_get_turbo_freq_info(void __user *argp)
turbo_freq.max_trl_levels = TRL_MAX_LEVELS;
turbo_freq.max_clip_freqs = SST_TF_MAX_LP_CLIP_RATIOS;

_read_tf_level_info("feature_rev", feature_rev, turbo_freq.level,
SST_TF_INFO_0_OFFSET, SST_TF_FEATURE_REV_START,
SST_TF_FEATURE_REV_WIDTH, SST_MUL_FACTOR_NONE);

for (i = 0; i < turbo_freq.max_clip_freqs; ++i)
_read_tf_level_info("lp_clip*", turbo_freq.lp_clip_freq_mhz[i],
turbo_freq.level, SST_TF_INFO_0_OFFSET,
Expand All @@ -1377,12 +1453,34 @@ static int isst_if_get_turbo_freq_info(void __user *argp)
SST_MUL_FACTOR_FREQ)
}

memset(turbo_freq.bucket_core_counts, 0, sizeof(turbo_freq.bucket_core_counts));

if (feature_rev >= 2) {
bool has_tf_info_8 = false;

for (i = 0; i < SST_TF_INFO_8_BUCKETS; ++i) {
_read_tf_level_info("bucket_*_mod_count", turbo_freq.bucket_core_counts[i],
turbo_freq.level, SST_TF_INFO_8_OFFSET,
SST_TF_NUM_MOD_0_WIDTH * i, SST_TF_NUM_MOD_0_WIDTH,
SST_MUL_FACTOR_NONE)

if (turbo_freq.bucket_core_counts[i])
has_tf_info_8 = true;
}

if (has_tf_info_8)
goto done_core_count;
}

for (i = 0; i < TRL_MAX_BUCKETS; ++i)
_read_tf_level_info("bucket_*_core_count", turbo_freq.bucket_core_counts[i],
turbo_freq.level, SST_TF_INFO_1_OFFSET,
SST_TF_NUM_CORE_0_WIDTH * i, SST_TF_NUM_CORE_0_WIDTH,
SST_MUL_FACTOR_NONE)


done_core_count:

if (copy_to_user(argp, &turbo_freq, sizeof(turbo_freq)))
return -EFAULT;

Expand Down Expand Up @@ -1421,6 +1519,9 @@ static long isst_if_def_ioctl(struct file *file, unsigned int cmd,
case ISST_IF_GET_PERF_LEVEL_INFO:
ret = isst_if_get_perf_level_info(argp);
break;
case ISST_IF_GET_PERF_LEVEL_FABRIC_INFO:
ret = isst_if_get_perf_level_fabric_info(argp);
break;
case ISST_IF_GET_PERF_LEVEL_CPU_MASK:
ret = isst_if_get_perf_level_mask(argp);
break;
Expand Down
26 changes: 26 additions & 0 deletions include/uapi/linux/isst_if.h
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,30 @@ struct isst_perf_level_data_info {
__u16 trl_freq_mhz[TRL_MAX_LEVELS][TRL_MAX_BUCKETS];
};

#define MAX_FABRIC_COUNT 8

/**
* struct isst_perf_level_fabric_info - Structure to get SST-PP fabric details
* @socket_id: Socket/package id
* @power_domain_id: Power Domain id
* @level: SST-PP level for which caller wants to get information
* @max_fabrics: Count of fabrics in resonse
* @p0_fabric_freq_mhz: Fabric (Uncore) maximum frequency
* @p1_fabric_freq_mhz: Fabric (Uncore) TDP frequency
* @pm_fabric_freq_mhz: Fabric (Uncore) minimum frequency
*
* Structure used to get information on frequencies for fabrics.
*/
struct isst_perf_level_fabric_info {
__u8 socket_id;
__u8 power_domain_id;
__u16 level;
__u16 max_fabrics;
__u16 p0_fabric_freq_mhz[MAX_FABRIC_COUNT];
__u16 p1_fabric_freq_mhz[MAX_FABRIC_COUNT];
__u16 pm_fabric_freq_mhz[MAX_FABRIC_COUNT];
};

/**
* struct isst_perf_level_cpu_mask - Structure to get SST-PP level CPU mask
* @socket_id: Socket/package id
Expand Down Expand Up @@ -471,5 +495,7 @@ struct isst_turbo_freq_info {
#define ISST_IF_GET_BASE_FREQ_INFO _IOR(ISST_IF_MAGIC, 14, struct isst_base_freq_info *)
#define ISST_IF_GET_BASE_FREQ_CPU_MASK _IOR(ISST_IF_MAGIC, 15, struct isst_perf_level_cpu_mask *)
#define ISST_IF_GET_TURBO_FREQ_INFO _IOR(ISST_IF_MAGIC, 16, struct isst_turbo_freq_info *)
#define ISST_IF_GET_PERF_LEVEL_FABRIC_INFO _IOR(ISST_IF_MAGIC, 17,\
struct isst_perf_level_fabric_info *)

#endif
8 changes: 7 additions & 1 deletion tools/power/x86/intel-speed-select/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,13 @@ endif
# Do not use make's built-in rules
# (this improves performance and avoids hard-to-debug behaviour);
MAKEFLAGS += -r
override CFLAGS += -O2 -Wall -g -D_GNU_SOURCE -I$(OUTPUT)include -I/usr/include/libnl3

NL3_CFLAGS = $(shell pkg-config --cflags libnl-3.0 2>/dev/null)
ifeq ($(NL3_CFLAGS),)
NL3_CFLAGS = -I/usr/include/libnl3
endif

override CFLAGS += -O2 -Wall -g -D_GNU_SOURCE -I$(OUTPUT)include $(NL3_CFLAGS)
override LDFLAGS += -lnl-genl-3 -lnl-3

ALL_TARGETS := intel-speed-select
Expand Down
Loading