platform/x86/intel/ifs: Gen2 Scan test support
authorJithu Joseph <jithu.joseph@intel.com>
Thu, 5 Oct 2023 19:51:32 +0000 (12:51 -0700)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Fri, 6 Oct 2023 10:05:18 +0000 (13:05 +0300)
Width of chunk related bitfields is ACTIVATE_SCAN and SCAN_STATUS MSRs
are different in newer IFS generation compared to gen0.

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

Account for the 8/16 bit MSR bitfield width differences between gen0 and
newer generations for the scan test trace event too.

Signed-off-by: Jithu Joseph <jithu.joseph@intel.com>
Reviewed-by: Tony Luck <tony.luck@intel.com>
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Tested-by: Pengfei Xu <pengfei.xu@intel.com>
Link: https://lore.kernel.org/r/20231005195137.3117166-5-jithu.joseph@intel.com
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/intel/ifs/ifs.h
drivers/platform/x86/intel/ifs/runtest.c
include/trace/events/intel_ifs.h

index 4824316b3acd9d1df35e541571fe92c30a4b0109..f0dd849b3400606fe353bae189f33fa7468eed5b 100644 (file)
@@ -199,9 +199,17 @@ union ifs_chunks_auth_status_gen2 {
 union ifs_scan {
        u64     data;
        struct {
-               u32     start   :8;
-               u32     stop    :8;
-               u32     rsvd    :16;
+               union {
+                       struct {
+                               u8      start;
+                               u8      stop;
+                               u16     rsvd;
+                       } gen0;
+                       struct {
+                               u16     start;
+                               u16     stop;
+                       } gen2;
+               };
                u32     delay   :31;
                u32     sigmce  :1;
        };
@@ -211,9 +219,17 @@ union ifs_scan {
 union ifs_status {
        u64     data;
        struct {
-               u32     chunk_num               :8;
-               u32     chunk_stop_index        :8;
-               u32     rsvd1                   :16;
+               union {
+                       struct {
+                               u8      chunk_num;
+                               u8      chunk_stop_index;
+                               u16     rsvd1;
+                       } gen0;
+                       struct {
+                               u16     chunk_num;
+                               u16     chunk_stop_index;
+                       } gen2;
+               };
                u32     error_code              :8;
                u32     rsvd2                   :22;
                u32     control_error           :1;
index 1061eb7ec39985e7d43ece8680eeeaa9096e7a00..925c30c79011022c6877bb33894a22ee0e80f074 100644 (file)
@@ -171,21 +171,31 @@ 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;
 
        ifsd = ifs_get_data(dev);
 
-       activate.rsvd = 0;
+       activate.gen0.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.gen0.start = to_start;
+               activate.gen0.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;
@@ -196,13 +206,14 @@ static void ifs_test_core(int cpu, struct device *dev)
 
                status.data = msrvals[1];
 
-               trace_ifs_status(cpu, activate, status);
+               trace_ifs_status(cpu, to_start, to_stop, status.data);
 
                /* Some cases can be retried, give up for others */
                if (!can_restart(status))
                        break;
 
-               if (status.chunk_num == activate.start) {
+               status_chunk = ifsd->generation ? status.gen2.chunk_num : status.gen0.chunk_num;
+               if (status_chunk == to_start) {
                        /* Check for forward progress */
                        if (--retries == 0) {
                                if (status.error_code == IFS_NO_ERROR)
@@ -211,7 +222,11 @@ static void ifs_test_core(int cpu, struct device *dev)
                        }
                } else {
                        retries = MAX_IFS_RETRIES;
-                       activate.start = status.chunk_num;
+                       if (ifsd->generation)
+                               activate.gen2.start = status_chunk;
+                       else
+                               activate.gen0.start = status_chunk;
+                       to_start = status_chunk;
                }
        }
 
index d7353024016cceaeeef9c7bf37c4291fa9a433f4..af0af3f1d9b7c081fb61ab582482302094409ff3 100644 (file)
 
 TRACE_EVENT(ifs_status,
 
-       TP_PROTO(int cpu, union ifs_scan activate, union ifs_status status),
+       TP_PROTO(int cpu, int start, int stop, u64 status),
 
-       TP_ARGS(cpu, activate, status),
+       TP_ARGS(cpu, start, stop, status),
 
        TP_STRUCT__entry(
                __field(        u64,    status  )
                __field(        int,    cpu     )
-               __field(        u8,     start   )
-               __field(        u8,     stop    )
+               __field(        u16,    start   )
+               __field(        u16,    stop    )
        ),
 
        TP_fast_assign(
                __entry->cpu    = cpu;
-               __entry->start  = activate.start;
-               __entry->stop   = activate.stop;
-               __entry->status = status.data;
+               __entry->start  = start;
+               __entry->stop   = stop;
+               __entry->status = status;
        ),
 
-       TP_printk("cpu: %d, start: %.2x, stop: %.2x, status: %llx",
+       TP_printk("cpu: %d, start: %.4x, stop: %.4x, status: %.16llx",
                __entry->cpu,
                __entry->start,
                __entry->stop,