platform/x86/intel/ifs: Classify error scenarios correctly
authorJithu Joseph <jithu.joseph@intel.com>
Fri, 12 Apr 2024 17:23:47 +0000 (10:23 -0700)
committerHans de Goede <hdegoede@redhat.com>
Mon, 29 Apr 2024 08:52:02 +0000 (10:52 +0200)
"Scan controller error" means that scan hardware encountered an error
prior to doing an actual test on the target CPU. It does not mean that
there is an actual cpu/core failure. "scan signature failure" indicates
that the test result on the target core did not match the expected value
and should be treated as a cpu failure.

Current driver classifies both these scenarios as failures. Modify
the driver to classify this situation with a more appropriate "untested"
status instead of "fail" status.

Signed-off-by: Jithu Joseph <jithu.joseph@intel.com>
Reviewed-by: Tony Luck <tony.luck@intel.com>
Reviewed-by: Ashok Raj <ashok.raj@intel.com>
Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Link: https://lore.kernel.org/r/20240412172349.544064-2-jithu.joseph@intel.com
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
drivers/platform/x86/intel/ifs/runtest.c

index 95b4b71fab537c1c1b5b449d8d55ed327319b257..282e4bfe30da326c47156219a5b74790047ab4e3 100644 (file)
@@ -69,6 +69,19 @@ static const char * const scan_test_status[] = {
 
 static void message_not_tested(struct device *dev, int cpu, union ifs_status status)
 {
+       struct ifs_data *ifsd = ifs_get_data(dev);
+
+       /*
+        * control_error is set when the microcode runs into a problem
+        * loading the image from the reserved BIOS memory, or it has
+        * been corrupted. Reloading the image may fix this issue.
+        */
+       if (status.control_error) {
+               dev_warn(dev, "CPU(s) %*pbl: Scan controller error. Batch: %02x version: 0x%x\n",
+                        cpumask_pr_args(cpu_smt_mask(cpu)), ifsd->cur_batch, ifsd->loaded_version);
+               return;
+       }
+
        if (status.error_code < ARRAY_SIZE(scan_test_status)) {
                dev_info(dev, "CPU(s) %*pbl: SCAN operation did not start. %s\n",
                         cpumask_pr_args(cpu_smt_mask(cpu)),
@@ -90,16 +103,6 @@ static void message_fail(struct device *dev, int cpu, union ifs_status status)
 {
        struct ifs_data *ifsd = ifs_get_data(dev);
 
-       /*
-        * control_error is set when the microcode runs into a problem
-        * loading the image from the reserved BIOS memory, or it has
-        * been corrupted. Reloading the image may fix this issue.
-        */
-       if (status.control_error) {
-               dev_err(dev, "CPU(s) %*pbl: could not execute from loaded scan image. Batch: %02x version: 0x%x\n",
-                       cpumask_pr_args(cpu_smt_mask(cpu)), ifsd->cur_batch, ifsd->loaded_version);
-       }
-
        /*
         * signature_error is set when the output from the scan chains does not
         * match the expected signature. This might be a transient problem (e.g.
@@ -285,10 +288,10 @@ static void ifs_test_core(int cpu, struct device *dev)
        /* Update status for this core */
        ifsd->scan_details = status.data;
 
-       if (status.control_error || status.signature_error) {
+       if (status.signature_error) {
                ifsd->status = SCAN_TEST_FAIL;
                message_fail(dev, cpu, status);
-       } else if (status.error_code) {
+       } else if (status.control_error || status.error_code) {
                ifsd->status = SCAN_NOT_TESTED;
                message_not_tested(dev, cpu, status);
        } else {