[PATCH 13/17] platform/x86/intel/ifs: Add additional details sysfs interface
From: Ehab Ababneh
Date: Mon Oct 26 2026 - 14:45:43 EST
From: Jithu Joseph <jithu.joseph@xxxxxxxxx>
The MSR_LAST_SAF_WP register provides information about the core when
the last WRMSR(ACTIVATE_SCAN) was executed. It is available only if
enumerated in bits [10:9] of MSR_INTEGRITY_CAPABILITIES.
Add a new sysfs interface, addnl_details_list, to the user space to
provide additional details about the last In-Field Scan testing.
[ Qiuxu: wrote the commit message. ]
Signed-off-by: Jithu Joseph <jithu.joseph@xxxxxxxxx>
Signed-off-by: Ehab Ababneh <ehab.ababneh@xxxxxxxxx>
---
drivers/platform/x86/intel/ifs/ifs.h | 2 ++
drivers/platform/x86/intel/ifs/runtest.c | 4 ++++
drivers/platform/x86/intel/ifs/sysfs.c | 23 +++++++++++++++++++++++
3 files changed, 29 insertions(+)
diff --git a/drivers/platform/x86/intel/ifs/ifs.h b/drivers/platform/x86/intel/ifs/ifs.h
index 1043378c60e5..3f11ae08dce1 100644
--- a/drivers/platform/x86/intel/ifs/ifs.h
+++ b/drivers/platform/x86/intel/ifs/ifs.h
@@ -139,6 +139,7 @@
#define MSR_CHUNKS_AUTHENTICATION_STATUS 0x000002c5
#define MSR_ACTIVATE_SCAN 0x000002c6
#define MSR_SCAN_STATUS 0x000002c7
+#define MSR_LAST_SAF_WP 0x000002c9
#define MSR_ARRAY_TRIGGER 0x000002d6
#define MSR_ARRAY_STATUS 0x000002d7
#define MSR_SAF_CTRL 0x000004f0
@@ -332,6 +333,7 @@ struct ifs_device {
struct ifs_test_output {
u64 test_details;
+ u64 addnl_details;
int test_result;
};
diff --git a/drivers/platform/x86/intel/ifs/runtest.c b/drivers/platform/x86/intel/ifs/runtest.c
index 6c3d025817e7..d5303dd72233 100644
--- a/drivers/platform/x86/intel/ifs/runtest.c
+++ b/drivers/platform/x86/intel/ifs/runtest.c
@@ -177,6 +177,7 @@ static int doscan(void *data)
struct run_params *params = data;
union ifs_status status;
struct ifs_data *ifsd;
+ u64 saf_wp = 0;
ifsd = params->ifsd;
pcpu_scan = this_cpu_ptr(ifsd->result_ptr);
@@ -202,6 +203,8 @@ static int doscan(void *data)
wrmsrq(MSR_ACTIVATE_SCAN, params->activate->data);
rdmsrq(MSR_SCAN_STATUS, status.data);
+ if (ifsd->generation)
+ rdmsrq(MSR_LAST_SAF_WP, saf_wp);
trace_ifs_status(ifsd->cur_batch, start, stop, status.data);
/* Pass back the result of the scan */
@@ -209,6 +212,7 @@ static int doscan(void *data)
params->status = status;
pcpu_scan->test_details = status.data;
+ pcpu_scan->addnl_details = saf_wp;
return 0;
}
diff --git a/drivers/platform/x86/intel/ifs/sysfs.c b/drivers/platform/x86/intel/ifs/sysfs.c
index 82a603cd1fd3..3cbab2acca72 100644
--- a/drivers/platform/x86/intel/ifs/sysfs.c
+++ b/drivers/platform/x86/intel/ifs/sysfs.c
@@ -188,6 +188,28 @@ static ssize_t cpus_ran_list_show(struct device *dev, struct device_attribute *a
}
static DEVICE_ATTR_RO(cpus_ran_list);
+
+static ssize_t addnl_details_list_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ struct ifs_data *ifsd = ifs_get_data(dev);
+ struct ifs_test_output *pcpu_state;
+ int lcpu, len = 0;
+
+ if (cpumask_weight(&ifsd->grp_cpumask) == 0)
+ return sysfs_emit(buf, "%s\n", "none");
+
+ for_each_cpu(lcpu, &ifsd->grp_cpumask) {
+ pcpu_state = per_cpu_ptr(ifsd->result_ptr, lcpu);
+ len += sysfs_emit_at(buf, len, "%s%#llx", (len > 0) ? " " : "",
+ pcpu_state->addnl_details);
+ }
+ len += sysfs_emit_at(buf, len, "\n");
+
+ return len;
+}
+
+static DEVICE_ATTR_RO(addnl_details_list);
+
/* global scan sysfs attributes */
struct attribute *plat_ifs_attrs[] = {
&dev_attr_details.attr,
@@ -198,6 +220,7 @@ struct attribute *plat_ifs_attrs[] = {
&dev_attr_status_list.attr,
&dev_attr_details_list.attr,
&dev_attr_cpus_ran_list.attr,
+ &dev_attr_addnl_details_list.attr,
NULL
};
--
2.43.0