[PATCH v2] platform/x86: ISST: Avoid model check for recent servers
From: Srinivas Pandruvada
Date: Tue Aug 18 2026 - 16:35:15 EST
To enable SST functions, a CPU model entry is required. This causes
unnecessary delays in deploying new servers on older kernels.
To avoid this, if no CPU model match is found, allow the SST common
driver to load, when all of the following conditions are met:
- Not running as a guest.
- The platform is identified as a server via ACPI PM profile.
- The CPU belongs to the Intel family 19 (decimal), which starts with
Diamond Rapids. All recent servers are capable of enumerating SST
features.
- MSR_PM_LOGICAL_ID (0x54) is present to retrieve the PM logical ID.
Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@xxxxxxxxxxxxxxx>
---
Change log:
v2
Addressed Sashiko review comments
- Fix commit description for family and MSR 0x54
- Add isst prefix for isst_acpi_pm_profile_server()
- Add isst prefix to allowed_families definition
- Removed local data for id and ret
.../intel/speed_select_if/isst_if_common.c | 57 ++++++++++++++++++-
1 file changed, 56 insertions(+), 1 deletion(-)
diff --git a/drivers/platform/x86/intel/speed_select_if/isst_if_common.c b/drivers/platform/x86/intel/speed_select_if/isst_if_common.c
index 1c48bf6d5457..4c04f0bc9b47 100644
--- a/drivers/platform/x86/intel/speed_select_if/isst_if_common.c
+++ b/drivers/platform/x86/intel/speed_select_if/isst_if_common.c
@@ -7,6 +7,7 @@
* Author: Srinivas Pandruvada <srinivas.pandruvada@xxxxxxxxxxxxxxx>
*/
+#include <linux/acpi.h>
#include <linux/cpufeature.h>
#include <linux/cpuhotplug.h>
#include <linux/fs.h>
@@ -774,6 +775,54 @@ void isst_if_cdev_unregister(int device_type)
}
EXPORT_SYMBOL_GPL(isst_if_cdev_unregister);
+#ifdef CONFIG_ACPI
+
+static bool isst_acpi_pm_profile_server(void)
+{
+ if (acpi_gbl_FADT.preferred_profile == PM_ENTERPRISE_SERVER ||
+ acpi_gbl_FADT.preferred_profile == PM_PERFORMANCE_SERVER)
+ return true;
+
+ return false;
+}
+
+#else
+
+static bool isst_acpi_pm_profile_server(void)
+{
+ return false;
+}
+
+#endif
+
+static const struct x86_cpu_id isst_allowed_families[] = {
+ X86_MATCH_VENDOR_FAM(INTEL, 19, NULL),
+ {}
+};
+
+static bool isst_features_allowed(void)
+{
+ u64 data;
+
+ /* For hypervisors, explicit model addition is required */
+ if (cpu_feature_enabled(X86_FEATURE_HYPERVISOR))
+ return false;
+
+ /* SST is a server only feature */
+ if (!isst_acpi_pm_profile_server())
+ return false;
+
+ /*
+ * Family 19 and the checks above guarantee the SST enumeration
+ * interfaces are present
+ */
+ if (!x86_match_cpu(isst_allowed_families))
+ return false;
+
+ /* MSR_PM_LOGICAL_ID is required to get PM logical CPU ID */
+ return !rdmsrq_safe(MSR_PM_LOGICAL_ID, &data);
+}
+
#define SST_HPM_SUPPORTED 0x01
#define SST_MBOX_SUPPORTED 0x02
@@ -798,8 +847,13 @@ static int __init isst_if_common_init(void)
const struct x86_cpu_id *id;
id = x86_match_cpu(isst_cpu_ids);
- if (!id)
+ if (!id) {
+ if (isst_features_allowed()) {
+ isst_hpm_support = true;
+ goto misc_reg;
+ }
return -ENODEV;
+ }
if (id->driver_data == SST_HPM_SUPPORTED) {
isst_hpm_support = true;
@@ -812,6 +866,7 @@ static int __init isst_if_common_init(void)
return -ENODEV;
}
+misc_reg:
return isst_misc_reg();
}
module_init(isst_if_common_init)
--
2.54.0