All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jithu Joseph <jithu.joseph@intel.com>
To: hdegoede@redhat.com, markgross@kernel.org
Cc: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de,
	dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com,
	corbet@lwn.net, gregkh@linuxfoundation.org,
	andriy.shevchenko@linux.intel.com, jithu.joseph@intel.com,
	ashok.raj@intel.com, tony.luck@intel.com, rostedt@goodmis.org,
	linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org,
	platform-driver-x86@vger.kernel.org, patches@lists.linux.dev,
	ravi.v.shankar@intel.com
Subject: [RFC 04/10] platform/x86/intel/ifs: Load IFS Image
Date: Tue,  1 Mar 2022 11:54:51 -0800	[thread overview]
Message-ID: <20220301195457.21152-5-jithu.joseph@intel.com> (raw)
In-Reply-To: <20220301195457.21152-1-jithu.joseph@intel.com>

IFS uses a test image that can be regarded as firmware. The image is
specific to a processor family, model and stepping. IFS requires that a
test image be loaded before any ifs test is initiated. Load the image
that matches processor signature. The IFS image is signed by Intel.

The IFS image file follows a similar naming convention as used for
Intel CPU microcode files. The file must be located in the firmware
directory where the microcode files are placed and named as {family/model
/stepping}.scan as below:

/lib/firmware/intel/ifs/{ff-mm-ss}.scan

Originally-by: Kyung Min Park <kyung.min.park@intel.com>
Signed-off-by: Jithu Joseph <jithu.joseph@intel.com>
Reviewed-by: Ashok Raj <ashok.raj@intel.com>
Reviewed-by: Tony Luck <tony.luck@intel.com>
---
 drivers/platform/x86/intel/ifs/Makefile |  2 +-
 drivers/platform/x86/intel/ifs/core.c   |  8 +++
 drivers/platform/x86/intel/ifs/ifs.h    | 13 ++++
 drivers/platform/x86/intel/ifs/load.c   | 95 +++++++++++++++++++++++++
 4 files changed, 117 insertions(+), 1 deletion(-)
 create mode 100644 drivers/platform/x86/intel/ifs/load.c

diff --git a/drivers/platform/x86/intel/ifs/Makefile b/drivers/platform/x86/intel/ifs/Makefile
index 05b4925402b4..105b377de410 100644
--- a/drivers/platform/x86/intel/ifs/Makefile
+++ b/drivers/platform/x86/intel/ifs/Makefile
@@ -4,4 +4,4 @@
 
 obj-$(CONFIG_INTEL_IFS)			+= intel_ifs.o
 
-intel_ifs-objs				:= core.o
+intel_ifs-objs				:= core.o load.o
diff --git a/drivers/platform/x86/intel/ifs/core.c b/drivers/platform/x86/intel/ifs/core.c
index fb3c864d3085..765d9a2c4683 100644
--- a/drivers/platform/x86/intel/ifs/core.c
+++ b/drivers/platform/x86/intel/ifs/core.c
@@ -8,6 +8,7 @@
 #include <asm/cpu_device_id.h>
 
 #include "ifs.h"
+struct ifs_params ifs_params;
 
 #define X86_MATCH(model)					\
 	X86_MATCH_VENDOR_FAM_MODEL_FEATURE(INTEL, 6,		\
@@ -24,6 +25,7 @@ static int __init ifs_init(void)
 {
 	const struct x86_cpu_id *m;
 	u64 ia32_core_caps;
+	int ret;
 
 	/* ifs capability check */
 	m = x86_match_cpu(ifs_cpu_ids);
@@ -34,6 +36,12 @@ static int __init ifs_init(void)
 	if (!(ia32_core_caps & MSR_IA32_CORE_CAPS_INTEGRITY))
 		return -ENODEV;
 
+	ret = load_ifs_binary();
+	if (ret) {
+		pr_err("loading ifs binaries failed\n");
+		return ret;
+	}
+
 	return 0;
 }
 
diff --git a/drivers/platform/x86/intel/ifs/ifs.h b/drivers/platform/x86/intel/ifs/ifs.h
index f3f924fced06..f2daf2cfd3e6 100644
--- a/drivers/platform/x86/intel/ifs/ifs.h
+++ b/drivers/platform/x86/intel/ifs/ifs.h
@@ -7,8 +7,21 @@
 #ifndef _IFS_H_
 #define _IFS_H_
 
+#undef pr_fmt
+#define pr_fmt(fmt) "ifs: " fmt
+
 /* These bits are in the IA32_CORE_CAPABILITIES MSR */
 #define MSR_IA32_CORE_CAPS_INTEGRITY_BIT	2
 #define MSR_IA32_CORE_CAPS_INTEGRITY		BIT(MSR_IA32_CORE_CAPS_INTEGRITY_BIT)
 
+/**
+ * struct ifs_params - global ifs parameter for all cpus.
+ * @loaded_version: stores the currently loaded ifs image version.
+ */
+struct ifs_params {
+	int loaded_version;
+};
+
+int load_ifs_binary(void);
+extern struct ifs_params ifs_params;
 #endif
diff --git a/drivers/platform/x86/intel/ifs/load.c b/drivers/platform/x86/intel/ifs/load.c
new file mode 100644
index 000000000000..1a5e906c51af
--- /dev/null
+++ b/drivers/platform/x86/intel/ifs/load.c
@@ -0,0 +1,95 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/* Copyright(c) 2021 Intel Corporation.
+ *
+ * Author: Jithu Joseph <jithu.joseph@intel.com>
+ */
+
+#include <linux/firmware.h>
+#include <linux/platform_device.h>
+
+#include "ifs.h"
+static const char *ifs_path = "intel/ifs/";
+
+struct ifs_header {
+	u32 header_ver;
+	u32 blob_revision;
+	u32 date;
+	u32 processor_sig;
+	u32 check_sum;
+	u32 loader_rev;
+	u32 processor_flags;
+	u32 metadata_size;
+	u32 total_size;
+	u32 fusa_info;
+	u64 reserved;
+};
+
+#define IFS_HEADER_SIZE	(sizeof(struct ifs_header))
+static struct ifs_header *ifs_header_ptr;	/* pointer to the ifs image header */
+static u64 ifs_hash_ptr;			/* Address of ifs metadata (hash) */
+
+static const struct firmware *load_binary(const char *path)
+{
+	struct platform_device *ifs_pdev;
+	const struct firmware *fw;
+	int err;
+
+	ifs_pdev = platform_device_register_simple("ifs", -1, NULL, 0);
+	if (IS_ERR(ifs_pdev)) {
+		pr_err("platform device register failed\n");
+		return NULL;
+	}
+	err = request_firmware_direct(&fw, path, &ifs_pdev->dev);
+	if (err) {
+		pr_err("ifs file %s load failed\n", path);
+		goto out;
+	}
+
+out:
+	platform_device_unregister(ifs_pdev);
+
+	return fw;
+}
+
+/*
+ * Compare the image version whenever loading a new image.
+ * Load the new image only if it is later or equal than the current version.
+ */
+static bool is_newer_binary(int current_loaded_version, struct ifs_header *new_image_ptr)
+{
+	return current_loaded_version <= new_image_ptr->blob_revision;
+}
+
+/*
+ * 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}.
+ */
+int load_ifs_binary(void)
+{
+	const struct firmware *scan_fw;
+	char scan_path[256];
+	int ret;
+
+	snprintf(scan_path, sizeof(scan_path), "%s%02x-%02x-%02x.scan", ifs_path,
+		 boot_cpu_data.x86, boot_cpu_data.x86_model, boot_cpu_data.x86_stepping);
+
+	scan_fw = load_binary(scan_path);
+	if (!scan_fw)
+		return -ENOENT;
+
+	/* only reload new scan image for later version than currently loaded */
+	if (!is_newer_binary(ifs_params.loaded_version, (struct ifs_header *)scan_fw->data)) {
+		pr_warn("Refusing to load older binary");
+		ret = -EINVAL;
+		goto out;
+	}
+
+	ifs_header_ptr = (struct ifs_header *)scan_fw->data;
+	ifs_hash_ptr = (u64)(ifs_header_ptr + 1);
+
+	ret = 0;
+out:
+	release_firmware(scan_fw);
+
+	return ret;
+}
-- 
2.17.1


  parent reply	other threads:[~2022-03-01 19:55 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-01 19:54 [RFC 00/10] Introduce In Field Scan driver Jithu Joseph
2022-03-01 19:54 ` [RFC 01/10] x86/microcode/intel: expose collect_cpu_info_early() for IFS Jithu Joseph
2022-03-01 20:08   ` Greg KH
2022-03-02  0:56     ` Joseph, Jithu
2022-03-02 10:30   ` Borislav Petkov
2022-03-03  1:34     ` Joseph, Jithu
2022-03-01 19:54 ` [RFC 02/10] Documentation: In-Field Scan Jithu Joseph
2022-03-01 20:07   ` Greg KH
2022-03-02  0:58     ` Joseph, Jithu
2022-03-01 19:54 ` [RFC 03/10] platform/x86/intel/ifs: Add driver for " Jithu Joseph
2022-03-02 23:24   ` Williams, Dan J
2022-03-02 23:31     ` Raj, Ashok
2022-03-03  0:02     ` Luck, Tony
2022-03-03  2:04     ` Joseph, Jithu
2022-03-01 19:54 ` Jithu Joseph [this message]
2022-03-03  2:58   ` [RFC 04/10] platform/x86/intel/ifs: Load IFS Image Williams, Dan J
2022-03-01 19:54 ` [RFC 05/10] platform/x86/intel/ifs: Check IFS Image sanity Jithu Joseph
2022-03-01 19:54 ` [RFC 06/10] platform/x86/intel/ifs: Authenticate and copy to secured memory Jithu Joseph
2022-03-01 19:54 ` [RFC 07/10] platform/x86/intel/ifs: Create kthreads for online cpus for scan test Jithu Joseph
2022-03-03  4:17   ` Williams, Dan J
2022-03-03 19:59     ` Luck, Tony
2022-03-04 19:20     ` Joseph, Jithu
2022-03-07 16:52       ` Dan Williams
2022-03-07 17:46         ` Luck, Tony
2022-03-10 21:42           ` Kok, Auke
2022-03-01 19:54 ` [RFC 08/10] platform/x86/intel/ifs: Add IFS sysfs interface Jithu Joseph
2022-03-04  0:31   ` Williams, Dan J
2022-03-04 16:51     ` Luck, Tony
2022-03-04 20:42     ` Joseph, Jithu
2022-03-04 21:01       ` Luck, Tony
2022-03-21 21:15         ` Luck, Tony
2022-03-07 17:38       ` Dan Williams
2022-03-07 19:09         ` Joseph, Jithu
2022-03-07 19:15           ` Dan Williams
2022-03-07 19:55             ` Joseph, Jithu
2022-03-07 20:25               ` Dan Williams
2022-03-07 20:56                 ` Joseph, Jithu
2022-03-07 21:28                   ` Dan Williams
2022-03-07 21:30                   ` gregkh
2022-03-07 21:33                     ` Luck, Tony
2022-03-01 19:54 ` [RFC 09/10] platform/x86/intel/ifs: add ABI documentation for IFS Jithu Joseph
2022-03-04  0:57   ` Williams, Dan J
2022-03-01 19:54 ` [RFC 10/10] trace: platform/x86/intel/ifs: Add trace point to track Intel IFS operations Jithu Joseph
2022-03-01 20:17   ` Steven Rostedt
2022-03-02  1:02     ` Joseph, Jithu
2022-03-01 20:10 ` [RFC 00/10] Introduce In Field Scan driver Greg KH
2022-03-01 20:14   ` Greg KH
2022-03-14 23:10     ` Luck, Tony
2022-03-15  7:34       ` Greg KH
2022-03-15 14:59         ` Luck, Tony
2022-03-15 15:26           ` Greg KH
2022-03-15 16:04             ` Dan Williams
2022-03-15 16:09               ` Dan Williams
2022-03-15 16:10             ` Luck, Tony
2022-03-16  8:09               ` Greg KH
2022-03-02 15:33   ` Steven Rostedt
2022-03-02 16:20     ` Greg KH
2022-03-02 13:59 ` Andy Lutomirski
2022-03-02 20:29   ` Luck, Tony
2022-03-02 21:18     ` Andy Lutomirski
2022-03-02 21:41       ` Luck, Tony
2022-03-02 23:11 ` Williams, Dan J

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=20220301195457.21152-5-jithu.joseph@intel.com \
    --to=jithu.joseph@intel.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=ashok.raj@intel.com \
    --cc=bp@alien8.de \
    --cc=corbet@lwn.net \
    --cc=dave.hansen@linux.intel.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=hdegoede@redhat.com \
    --cc=hpa@zytor.com \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=markgross@kernel.org \
    --cc=mingo@redhat.com \
    --cc=patches@lists.linux.dev \
    --cc=platform-driver-x86@vger.kernel.org \
    --cc=ravi.v.shankar@intel.com \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=tony.luck@intel.com \
    --cc=x86@kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.