[PATCH 04/10] platform/x86/intel/ifs: Scan test for new generations

From: Jithu Joseph
Date: Wed Sep 13 2023 - 14:38:07 EST


Make changes to scan test flow such that MSRs are populated
appropriately based on the generation supported by hardware.

Width of chunk related bitfields is ACTIVATE_SCAN and SCAN_STATUS MSRs
are different in newer IFS generation compared to gen0.

Signed-off-by: Jithu Joseph <jithu.joseph@xxxxxxxxx>
Reviewed-by: Tony Luck <tony.luck@xxxxxxxxx>
Tested-by: Pengfei Xu <pengfei.xu@xxxxxxxxx>
---
drivers/platform/x86/intel/ifs/ifs.h | 14 ++++++++++++++
drivers/platform/x86/intel/ifs/runtest.c | 23 ++++++++++++++++++-----
2 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/drivers/platform/x86/intel/ifs/ifs.h b/drivers/platform/x86/intel/ifs/ifs.h
index 886dc74de57d..3265a6d8a6f3 100644
--- a/drivers/platform/x86/intel/ifs/ifs.h
+++ b/drivers/platform/x86/intel/ifs/ifs.h
@@ -205,6 +205,12 @@ union ifs_scan {
u32 delay :31;
u32 sigmce :1;
};
+ struct {
+ u16 start;
+ u16 stop;
+ u32 delay :31;
+ u32 sigmce :1;
+ } gen2;
};

/* MSR_SCAN_STATUS bit fields */
@@ -219,6 +225,14 @@ union ifs_status {
u32 control_error :1;
u32 signature_error :1;
};
+ struct {
+ u16 chunk_num;
+ u16 chunk_stop_index;
+ u8 error_code;
+ u32 rsvd1 :22;
+ u32 control_error :1;
+ u32 signature_error :1;
+ } gen2;
};

/* MSR_ARRAY_BIST bit fields */
diff --git a/drivers/platform/x86/intel/ifs/runtest.c b/drivers/platform/x86/intel/ifs/runtest.c
index 1061eb7ec399..4bbab6be2fa2 100644
--- a/drivers/platform/x86/intel/ifs/runtest.c
+++ b/drivers/platform/x86/intel/ifs/runtest.c
@@ -171,6 +171,8 @@ static void ifs_test_core(int cpu, struct device *dev)
union ifs_status status;
unsigned long timeout;
struct ifs_data *ifsd;
+ int to_start, to_stop;
+ int status_chunk;
u64 msrvals[2];
int retries;

@@ -179,13 +181,21 @@ static void ifs_test_core(int cpu, struct device *dev)
activate.rsvd = 0;
activate.delay = IFS_THREAD_WAIT;
activate.sigmce = 0;
- activate.start = 0;
- activate.stop = ifsd->valid_chunks - 1;
+ to_start = 0;
+ to_stop = ifsd->valid_chunks - 1;
+
+ if (ifsd->generation) {
+ activate.gen2.start = to_start;
+ activate.gen2.stop = to_stop;
+ } else {
+ activate.start = to_start;
+ activate.stop = to_stop;
+ }

timeout = jiffies + HZ / 2;
retries = MAX_IFS_RETRIES;

- while (activate.start <= activate.stop) {
+ while (to_start <= to_stop) {
if (time_after(jiffies, timeout)) {
status.error_code = IFS_SW_TIMEOUT;
break;
@@ -202,7 +212,8 @@ static void ifs_test_core(int cpu, struct device *dev)
if (!can_restart(status))
break;

- if (status.chunk_num == activate.start) {
+ status_chunk = ifsd->generation ? status.gen2.chunk_num : status.chunk_num;
+ if (status_chunk == to_start) {
/* Check for forward progress */
if (--retries == 0) {
if (status.error_code == IFS_NO_ERROR)
@@ -211,7 +222,9 @@ static void ifs_test_core(int cpu, struct device *dev)
}
} else {
retries = MAX_IFS_RETRIES;
- activate.start = status.chunk_num;
+ ifsd->generation ? (activate.gen2.start = status_chunk) :
+ (activate.start = status_chunk);
+ to_start = status_chunk;
}
}

--
2.25.1