From: Jithu Joseph <jithu.joseph@intel.com>
To: hdegoede@redhat.com, markgross@kernel.org
Cc: ashok.raj@intel.com, tony.luck@intel.com,
gregkh@linuxfoundation.org, ravi.v.shankar@intel.com,
jithu.joseph@intel.com, linux-kernel@vger.kernel.org,
platform-driver-x86@vger.kernel.org, patches@lists.linux.dev
Subject: [PATCH] platform/x86/intel/ifs: Allow non-default names for IFS image
Date: Fri, 8 Jul 2022 08:19:38 -0700 [thread overview]
Message-ID: <20220708151938.986530-1-jithu.joseph@intel.com> (raw)
Existing implementation limits IFS image to be loaded only from
a default file-name (ff-mm-ss.scan).
Change the semantics of the "reload" file. Writing "1" keeps the legacy
behavior to reload from the default "ff-mm-ss.scan" file, but now interpret
other strings as a filename to be loaded from the /lib/firmware/intel/ifs
directory.
Situations where multiple image files are helpful:
1. Test contents are larger than the memory reserved for IFS by BIOS
2. Increased test coverage
3. Custom test files to debug certain specific issues in field
Fix the below items in adjacent code
- Return error when ifs_image_sanity_check() fails in ifs_load_firmware()
- Correct documentation "ifs.0"->"ifs"
Reviewed-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: Jithu Joseph <jithu.joseph@intel.com>
---
drivers/platform/x86/intel/ifs/ifs.h | 11 +++++--
drivers/platform/x86/intel/ifs/core.c | 2 +-
drivers/platform/x86/intel/ifs/load.c | 30 +++++++++++++++----
drivers/platform/x86/intel/ifs/sysfs.c | 13 ++------
.../ABI/testing/sysfs-platform-intel-ifs | 5 +++-
5 files changed, 41 insertions(+), 20 deletions(-)
diff --git a/drivers/platform/x86/intel/ifs/ifs.h b/drivers/platform/x86/intel/ifs/ifs.h
index 73c8e91cf144..ee258e896dd0 100644
--- a/drivers/platform/x86/intel/ifs/ifs.h
+++ b/drivers/platform/x86/intel/ifs/ifs.h
@@ -39,7 +39,14 @@
* # echo 1 > /sys/devices/virtual/misc/intel_ifs_0/reload
*
* Similar to microcode, the current version of the scan tests is stored
- * in a fixed location: /lib/firmware/intel/ifs.0/family-model-stepping.scan
+ * in a fixed location: /lib/firmware/intel/ifs/family-model-stepping.scan
+ *
+ * An alternate scan file can be loaded by writing its filename to the
+ * reload file::
+ *
+ * # echo mytest > /sys/devices/virtual/misc/intel_ifs_0/reload
+ *
+ * The file will be loaded from the same directory, i.e. /lib/firmware/intel/ifs/mytest
*
* Running tests
* -------------
@@ -225,7 +232,7 @@ static inline struct ifs_data *ifs_get_data(struct device *dev)
return &d->data;
}
-void ifs_load_firmware(struct device *dev);
+int ifs_load_firmware(struct device *dev, const char *file_name);
int do_core_test(int cpu, struct device *dev);
const struct attribute_group **ifs_get_groups(void);
diff --git a/drivers/platform/x86/intel/ifs/core.c b/drivers/platform/x86/intel/ifs/core.c
index 27204e3d674d..306f599a8f5a 100644
--- a/drivers/platform/x86/intel/ifs/core.c
+++ b/drivers/platform/x86/intel/ifs/core.c
@@ -53,7 +53,7 @@ static int __init ifs_init(void)
if ((msrval & BIT(ifs_device.data.integrity_cap_bit)) &&
!misc_register(&ifs_device.misc)) {
down(&ifs_sem);
- ifs_load_firmware(ifs_device.misc.this_device);
+ ifs_load_firmware(ifs_device.misc.this_device, "1");
up(&ifs_sem);
return 0;
}
diff --git a/drivers/platform/x86/intel/ifs/load.c b/drivers/platform/x86/intel/ifs/load.c
index d056617ddc85..6f49a2c593f4 100644
--- a/drivers/platform/x86/intel/ifs/load.c
+++ b/drivers/platform/x86/intel/ifs/load.c
@@ -232,17 +232,33 @@ static bool ifs_image_sanity_check(struct device *dev, const struct microcode_he
/*
* Load ifs image. Before loading ifs module, the ifs image must be located
- * in /lib/firmware/intel/ifs and named as {family/model/stepping}.{testname}.
+ * in the folder /lib/firmware/intel/ifs/
*/
-void ifs_load_firmware(struct device *dev)
+int ifs_load_firmware(struct device *dev, const char *file_name)
{
struct ifs_data *ifsd = ifs_get_data(dev);
+ bool default_name = false;
const struct firmware *fw;
- char scan_path[32];
- int ret;
+ char scan_path[64];
+ int ret = -EINVAL;
+ int file_name_len;
+
+ if ((kstrtobool(file_name, &default_name) == 0)) {
+ if (default_name)
+ snprintf(scan_path, sizeof(scan_path), "intel/ifs/%02x-%02x-%02x.scan",
+ boot_cpu_data.x86,
+ boot_cpu_data.x86_model,
+ boot_cpu_data.x86_stepping);
+ }
- snprintf(scan_path, sizeof(scan_path), "intel/ifs/%02x-%02x-%02x.scan",
- boot_cpu_data.x86, boot_cpu_data.x86_model, boot_cpu_data.x86_stepping);
+ if (!default_name) {
+ if (strchr(file_name, '/'))
+ goto done;
+ file_name_len = strchrnul(file_name, '\n') - file_name;
+ if (snprintf(scan_path, sizeof(scan_path), "intel/ifs/%.*s",
+ file_name_len, file_name) >= sizeof(scan_path))
+ goto done;
+ }
ret = request_firmware_direct(&fw, scan_path, dev);
if (ret) {
@@ -252,6 +268,7 @@ void ifs_load_firmware(struct device *dev)
if (!ifs_image_sanity_check(dev, (struct microcode_header_intel *)fw->data)) {
dev_err(dev, "ifs header sanity check failed\n");
+ ret = -EINVAL;
goto release;
}
@@ -263,4 +280,5 @@ void ifs_load_firmware(struct device *dev)
release_firmware(fw);
done:
ifsd->loaded = (ret == 0);
+ return ret;
}
diff --git a/drivers/platform/x86/intel/ifs/sysfs.c b/drivers/platform/x86/intel/ifs/sysfs.c
index 37d8380d6fa8..b4716b7d36aa 100644
--- a/drivers/platform/x86/intel/ifs/sysfs.c
+++ b/drivers/platform/x86/intel/ifs/sysfs.c
@@ -94,23 +94,16 @@ static ssize_t reload_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
- struct ifs_data *ifsd = ifs_get_data(dev);
- bool res;
-
-
- if (kstrtobool(buf, &res))
- return -EINVAL;
- if (!res)
- return count;
+ int ret;
if (down_interruptible(&ifs_sem))
return -EINTR;
- ifs_load_firmware(dev);
+ ret = ifs_load_firmware(dev, buf);
up(&ifs_sem);
- return ifsd->loaded ? count : -ENODEV;
+ return ret ? ret : count;
}
static DEVICE_ATTR_WO(reload);
diff --git a/Documentation/ABI/testing/sysfs-platform-intel-ifs b/Documentation/ABI/testing/sysfs-platform-intel-ifs
index 486d6d2ff8a0..560b85561eac 100644
--- a/Documentation/ABI/testing/sysfs-platform-intel-ifs
+++ b/Documentation/ABI/testing/sysfs-platform-intel-ifs
@@ -36,4 +36,7 @@ Date: April 21 2022
KernelVersion: 5.19
Contact: "Jithu Joseph" <jithu.joseph@intel.com>
Description: Write "1" (or "y" or "Y") to reload the IFS image from
- /lib/firmware/intel/ifs/ff-mm-ss.scan.
+ the default location /lib/firmware/intel/ifs/ff-mm-ss.scan.
+ Alternatively write <file_name> to use a specific IFS image file.
+ In this case image from /lib/firmware/intel/ifs/<file_name> will
+ be loaded.
base-commit: 88084a3df1672e131ddc1b4e39eeacfd39864acf
--
2.25.1
next reply other threads:[~2022-07-08 15:21 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-08 15:19 Jithu Joseph [this message]
2022-07-08 15:28 ` [PATCH] platform/x86/intel/ifs: Allow non-default names for IFS image Greg KH
2022-07-08 18:34 ` Joseph, Jithu
2022-07-10 10:15 ` Greg KH
2022-07-10 13:42 ` Hans de Goede
2022-07-10 13:53 ` Greg KH
2022-07-10 14:08 ` Hans de Goede
2022-07-10 16:04 ` Joseph, Jithu
2022-07-10 16:09 ` Hans de Goede
2022-07-10 18:25 ` [PATCH 0/2] Two fixes for IFS Tony Luck
2022-07-10 18:25 ` [PATCH 1/2] Documentation: Correct IFS reload documentation Tony Luck
2022-07-10 20:00 ` Greg KH
2022-07-10 18:25 ` [PATCH 2/2] platform/x86/intel/ifs: return error on load failure Tony Luck
2022-07-10 19:57 ` [PATCH 0/2] Two fixes for IFS Hans de Goede
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220708151938.986530-1-jithu.joseph@intel.com \
--to=jithu.joseph@intel.com \
--cc=ashok.raj@intel.com \
--cc=gregkh@linuxfoundation.org \
--cc=hdegoede@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=markgross@kernel.org \
--cc=patches@lists.linux.dev \
--cc=platform-driver-x86@vger.kernel.org \
--cc=ravi.v.shankar@intel.com \
--cc=tony.luck@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox