Skip to content

Commit a653183

Browse files
committed
platform/x86: ISST: Support SST-PP revision 2
JIRA: https://issues.redhat.com/browse/RHEL-110834 commit d6644d7 Author: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Date: Tue May 6 09:35:30 2025 -0700 platform/x86: ISST: Support SST-PP revision 2 SST PP revision 2 added fabric 1 P0, P1 and Pm frequencies. Export them by using a new IOCTL ISST_IF_GET_PERF_LEVEL_FABRIC_INFO. This IOCTL requires platforms with SST PP revision 2 or higher. To accommodate potential future increases in fabric count and avoid ABI changes, support is extended for up to 8 fabrics. Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Link: https://lore.kernel.org/r/20250506163531.1061185-3-srinivas.pandruvada@linux.intel.com Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Steve Best <sbest@redhat.com>
1 parent c7f939c commit a653183

File tree

2 files changed

+92
-0
lines changed

2 files changed

+92
-0
lines changed

drivers/platform/x86/intel/speed_select_if/isst_tpmi_core.c

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,6 +1016,7 @@ static int isst_if_set_perf_feature(void __user *argp)
10161016

10171017
#define SST_PP_INFO_10_OFFSET 80
10181018
#define SST_PP_INFO_11_OFFSET 88
1019+
#define SST_PP_INFO_12_OFFSET 96
10191020

10201021
#define SST_PP_P1_SSE_START 0
10211022
#define SST_PP_P1_SSE_WIDTH 8
@@ -1068,6 +1069,15 @@ static int isst_if_set_perf_feature(void __user *argp)
10681069
#define SST_PP_CORE_RATIO_PM_FABRIC_START 48
10691070
#define SST_PP_CORE_RATIO_PM_FABRIC_WIDTH 8
10701071

1072+
#define SST_PP_CORE_RATIO_P0_FABRIC_1_START 0
1073+
#define SST_PP_CORE_RATIO_P0_FABRIC_1_WIDTH 8
1074+
1075+
#define SST_PP_CORE_RATIO_P1_FABRIC_1_START 8
1076+
#define SST_PP_CORE_RATIO_P1_FABRIC_1_WIDTH 8
1077+
1078+
#define SST_PP_CORE_RATIO_PM_FABRIC_1_START 16
1079+
#define SST_PP_CORE_RATIO_PM_FABRIC_1_WIDTH 8
1080+
10711081
static int isst_if_get_perf_level_info(void __user *argp)
10721082
{
10731083
struct isst_perf_level_data_info perf_level;
@@ -1167,6 +1177,59 @@ static int isst_if_get_perf_level_info(void __user *argp)
11671177
return 0;
11681178
}
11691179

1180+
static int isst_if_get_perf_level_fabric_info(void __user *argp)
1181+
{
1182+
struct isst_perf_level_fabric_info perf_level_fabric;
1183+
struct tpmi_per_power_domain_info *power_domain_info;
1184+
int start = SST_PP_CORE_RATIO_P0_FABRIC_START;
1185+
int width = SST_PP_CORE_RATIO_P0_FABRIC_WIDTH;
1186+
int offset = SST_PP_INFO_11_OFFSET;
1187+
int i;
1188+
1189+
if (copy_from_user(&perf_level_fabric, argp, sizeof(perf_level_fabric)))
1190+
return -EFAULT;
1191+
1192+
power_domain_info = get_instance(perf_level_fabric.socket_id,
1193+
perf_level_fabric.power_domain_id);
1194+
if (!power_domain_info)
1195+
return -EINVAL;
1196+
1197+
if (perf_level_fabric.level > power_domain_info->max_level)
1198+
return -EINVAL;
1199+
1200+
if (power_domain_info->pp_header.feature_rev < 2)
1201+
return -EINVAL;
1202+
1203+
if (!(power_domain_info->pp_header.level_en_mask & BIT(perf_level_fabric.level)))
1204+
return -EINVAL;
1205+
1206+
/* For revision 2, maximum number of fabrics is 2 */
1207+
perf_level_fabric.max_fabrics = 2;
1208+
1209+
for (i = 0; i < perf_level_fabric.max_fabrics; i++) {
1210+
_read_pp_level_info("p0_fabric_freq_mhz", perf_level_fabric.p0_fabric_freq_mhz[i],
1211+
perf_level_fabric.level, offset, start, width,
1212+
SST_MUL_FACTOR_FREQ)
1213+
start += width;
1214+
1215+
_read_pp_level_info("p1_fabric_freq_mhz", perf_level_fabric.p1_fabric_freq_mhz[i],
1216+
perf_level_fabric.level, offset, start, width,
1217+
SST_MUL_FACTOR_FREQ)
1218+
start += width;
1219+
1220+
_read_pp_level_info("pm_fabric_freq_mhz", perf_level_fabric.pm_fabric_freq_mhz[i],
1221+
perf_level_fabric.level, offset, start, width,
1222+
SST_MUL_FACTOR_FREQ)
1223+
offset = SST_PP_INFO_12_OFFSET;
1224+
start = SST_PP_CORE_RATIO_P0_FABRIC_1_START;
1225+
}
1226+
1227+
if (copy_to_user(argp, &perf_level_fabric, sizeof(perf_level_fabric)))
1228+
return -EFAULT;
1229+
1230+
return 0;
1231+
}
1232+
11701233
#define SST_PP_FUSED_CORE_COUNT_START 0
11711234
#define SST_PP_FUSED_CORE_COUNT_WIDTH 8
11721235

@@ -1453,6 +1516,9 @@ static long isst_if_def_ioctl(struct file *file, unsigned int cmd,
14531516
case ISST_IF_GET_PERF_LEVEL_INFO:
14541517
ret = isst_if_get_perf_level_info(argp);
14551518
break;
1519+
case ISST_IF_GET_PERF_LEVEL_FABRIC_INFO:
1520+
ret = isst_if_get_perf_level_fabric_info(argp);
1521+
break;
14561522
case ISST_IF_GET_PERF_LEVEL_CPU_MASK:
14571523
ret = isst_if_get_perf_level_mask(argp);
14581524
break;

include/uapi/linux/isst_if.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,30 @@ struct isst_perf_level_data_info {
375375
__u16 trl_freq_mhz[TRL_MAX_LEVELS][TRL_MAX_BUCKETS];
376376
};
377377

378+
#define MAX_FABRIC_COUNT 8
379+
380+
/**
381+
* struct isst_perf_level_fabric_info - Structure to get SST-PP fabric details
382+
* @socket_id: Socket/package id
383+
* @power_domain_id: Power Domain id
384+
* @level: SST-PP level for which caller wants to get information
385+
* @max_fabrics: Count of fabrics in resonse
386+
* @p0_fabric_freq_mhz: Fabric (Uncore) maximum frequency
387+
* @p1_fabric_freq_mhz: Fabric (Uncore) TDP frequency
388+
* @pm_fabric_freq_mhz: Fabric (Uncore) minimum frequency
389+
*
390+
* Structure used to get information on frequencies for fabrics.
391+
*/
392+
struct isst_perf_level_fabric_info {
393+
__u8 socket_id;
394+
__u8 power_domain_id;
395+
__u16 level;
396+
__u16 max_fabrics;
397+
__u16 p0_fabric_freq_mhz[MAX_FABRIC_COUNT];
398+
__u16 p1_fabric_freq_mhz[MAX_FABRIC_COUNT];
399+
__u16 pm_fabric_freq_mhz[MAX_FABRIC_COUNT];
400+
};
401+
378402
/**
379403
* struct isst_perf_level_cpu_mask - Structure to get SST-PP level CPU mask
380404
* @socket_id: Socket/package id
@@ -471,5 +495,7 @@ struct isst_turbo_freq_info {
471495
#define ISST_IF_GET_BASE_FREQ_INFO _IOR(ISST_IF_MAGIC, 14, struct isst_base_freq_info *)
472496
#define ISST_IF_GET_BASE_FREQ_CPU_MASK _IOR(ISST_IF_MAGIC, 15, struct isst_perf_level_cpu_mask *)
473497
#define ISST_IF_GET_TURBO_FREQ_INFO _IOR(ISST_IF_MAGIC, 16, struct isst_turbo_freq_info *)
498+
#define ISST_IF_GET_PERF_LEVEL_FABRIC_INFO _IOR(ISST_IF_MAGIC, 17,\
499+
struct isst_perf_level_fabric_info *)
474500

475501
#endif

0 commit comments

Comments
 (0)