1f73373
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
Jeremy Cline d1b6f8c
From: Laura Abbott <labbott@redhat.com>
Jeremy Cline d1b6f8c
Date: Sun, 10 Feb 2019 01:27:54 +0000
Jeremy Cline d1b6f8c
Subject: [PATCH] ipmi: do not configure ipmi for HPE m400
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1670017
Jeremy Cline d1b6f8c
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=20147017
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Commit 913a89f009d9 ("ipmi: Don't initialize anything in the core until
Jeremy Cline d1b6f8c
something uses it") added new locking which broke context.
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
    Message-id: <20180713142210.15700-1-tcamuso@redhat.com>
Jeremy Cline d1b6f8c
    Patchwork-id: 224899
Jeremy Cline d1b6f8c
    O-Subject: [RHEL8 BZ 1583537 1/1] ipmi: do not configure ipmi for HPE m400
Jeremy Cline d1b6f8c
    Bugzilla: 1583537
Jeremy Cline d1b6f8c
    RH-Acked-by: Dean Nelson <dnelson@redhat.com>
Jeremy Cline d1b6f8c
    RH-Acked-by: Al Stone <ahs3@redhat.com>
Jeremy Cline d1b6f8c
    RH-Acked-by: Mark Salter <msalter@redhat.com>
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
    bugzilla:https://bugzilla.redhat.com/show_bug.cgi?id=1583537
Jeremy Cline d1b6f8c
    brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=17150528
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
    RHEL-only
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
    The ARM-based HPE m400 reports host-side ipmi as residing in intel
Jeremy Cline d1b6f8c
    port-io space, which does not exist in ARM processors. Therefore, when
Jeremy Cline d1b6f8c
    running on an m400, host-side ipmi configuration code must simply return
Jeremy Cline d1b6f8c
    zero without trying to configure the host-side ipmi.
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
    This patch prevents panic on boot by averting attempts to configure
Jeremy Cline d1b6f8c
    host-side ipmi on this platform.
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
    Though HPE m400 is not certified with RHEL, and HPE has relegated it to
Jeremy Cline d1b6f8c
    EOL status, the platform is still used extensively in ARM development
Jeremy Cline d1b6f8c
    and test for RHEL.
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
    Testing:
Jeremy Cline d1b6f8c
    Boot without blacklisting ipmi and check to see that no ipmi modules
Jeremy Cline d1b6f8c
    are loaded.
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
    Signed-off-by: Tony Camuso <tcamuso@redhat.com>
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
    cc: Prarit Bhargava <prarit@redhat.com>
Jeremy Cline d1b6f8c
    cc: Brendan Conoboy <blc@redhat.com>
Jeremy Cline d1b6f8c
    cc: Jeff Bastian <jbastian@redhat.com>
Jeremy Cline d1b6f8c
    cc: Scott Herold <sherold@redhat.com>
Jeremy Cline d1b6f8c
    Signed-off-by: Herton R. Krzesinski <herton@redhat.com>
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
Upstream Status: RHEL only
Jeremy Cline d1b6f8c
Signed-off-by: Laura Abbott <labbott@redhat.com>
Jeremy Cline d1b6f8c
Acked-by: Tony Camuso <tcamuso@redhat.com>
Jeremy Cline d1b6f8c
Acked-by: Dean Nelson <dnelson@redhat.com>
Jeremy Cline d1b6f8c
Acked-by: Jarod Wilson <jarod@redhat.com>
Jeremy Cline d1b6f8c
Acked-by: Mark Salter <msalter@redhat.com>
Jeremy Cline d1b6f8c
---
Jeremy Cline d1b6f8c
 drivers/char/ipmi/ipmi_dmi.c        | 15 +++++++++++++++
Jeremy Cline d1b6f8c
 drivers/char/ipmi/ipmi_msghandler.c | 16 +++++++++++++++-
Jeremy Cline d1b6f8c
 2 files changed, 30 insertions(+), 1 deletion(-)
Jeremy Cline d1b6f8c
Jeremy Cline d1b6f8c
diff --git a/drivers/char/ipmi/ipmi_dmi.c b/drivers/char/ipmi/ipmi_dmi.c
Jeremy Cline d1b6f8c
index bbf7029e224b..cf7faa970dd6 100644
Jeremy Cline d1b6f8c
--- a/drivers/char/ipmi/ipmi_dmi.c
Jeremy Cline d1b6f8c
+++ b/drivers/char/ipmi/ipmi_dmi.c
Jeremy Cline d1b6f8c
@@ -215,6 +215,21 @@ static int __init scan_for_dmi_ipmi(void)
Jeremy Cline d1b6f8c
 {
Jeremy Cline d1b6f8c
 	const struct dmi_device *dev = NULL;
d176dfc
Jeremy Cline d1b6f8c
+#ifdef CONFIG_ARM64
Jeremy Cline d1b6f8c
+	/* RHEL-only
Jeremy Cline d1b6f8c
+	 * If this is ARM-based HPE m400, return now, because that platform
Jeremy Cline d1b6f8c
+	 * reports the host-side ipmi address as intel port-io space, which
Jeremy Cline d1b6f8c
+	 * does not exist in the ARM architecture.
Jeremy Cline d1b6f8c
+	 */
Jeremy Cline d1b6f8c
+	const char *dmistr = dmi_get_system_info(DMI_PRODUCT_NAME);
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
+	if (dmistr && (strcmp("ProLiant m400 Server", dmistr) == 0)) {
Jeremy Cline d1b6f8c
+		pr_debug("%s does not support host ipmi\n", dmistr);
Jeremy Cline d1b6f8c
+		return 0;
Jeremy Cline d1b6f8c
+	}
Jeremy Cline d1b6f8c
+	/* END RHEL-only */
Jeremy Cline d1b6f8c
+#endif
Jeremy Cline d1b6f8c
+
Jeremy Cline d1b6f8c
 	while ((dev = dmi_find_device(DMI_DEV_TYPE_IPMI, NULL, dev)))
Jeremy Cline d1b6f8c
 		dmi_decode_ipmi((const struct dmi_header *) dev->device_data);
d176dfc
Jeremy Cline d1b6f8c
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c
676c84f
index e1b22fe0916c..894eda427214 100644
Jeremy Cline d1b6f8c
--- a/drivers/char/ipmi/ipmi_msghandler.c
Jeremy Cline d1b6f8c
+++ b/drivers/char/ipmi/ipmi_msghandler.c
676c84f
@@ -34,6 +34,7 @@
Jeremy Cline d1b6f8c
 #include <linux/uuid.h>
Jeremy Cline d1b6f8c
 #include <linux/nospec.h>
676c84f
 #include <linux/vmalloc.h>
Jeremy Cline d1b6f8c
+#include <linux/dmi.h>
d176dfc
Jeremy Cline d1b6f8c
 #define IPMI_DRIVER_VERSION "39.2"
d176dfc
676c84f
@@ -5155,8 +5156,21 @@ static int __init ipmi_init_msghandler_mod(void)
Jeremy Cline d1b6f8c
 {
Jeremy Cline d1b6f8c
 	int rv;
d176dfc
Jeremy Cline d1b6f8c
-	pr_info("version " IPMI_DRIVER_VERSION "\n");
Jeremy Cline d1b6f8c
+#ifdef CONFIG_ARM64
Jeremy Cline d1b6f8c
+	/* RHEL-only
Jeremy Cline d1b6f8c
+	 * If this is ARM-based HPE m400, return now, because that platform
Jeremy Cline d1b6f8c
+	 * reports the host-side ipmi address as intel port-io space, which
Jeremy Cline d1b6f8c
+	 * does not exist in the ARM architecture.
Jeremy Cline d1b6f8c
+	 */
Jeremy Cline d1b6f8c
+	const char *dmistr = dmi_get_system_info(DMI_PRODUCT_NAME);
d176dfc
Jeremy Cline d1b6f8c
+	if (dmistr && (strcmp("ProLiant m400 Server", dmistr) == 0)) {
Jeremy Cline d1b6f8c
+		pr_debug("%s does not support host ipmi\n", dmistr);
Jeremy Cline d1b6f8c
+		return -ENOSYS;
Jeremy Cline d1b6f8c
+	}
Jeremy Cline d1b6f8c
+	/* END RHEL-only */
Jeremy Cline d1b6f8c
+#endif
Jeremy Cline d1b6f8c
+	pr_info("version " IPMI_DRIVER_VERSION "\n");
Jeremy Cline d1b6f8c
 	mutex_lock(&ipmi_interfaces_mutex);
Jeremy Cline d1b6f8c
 	rv = ipmi_register_driver();
Jeremy Cline d1b6f8c
 	mutex_unlock(&ipmi_interfaces_mutex);
Jeremy Cline d1b6f8c
-- 
d176dfc
2.26.2
Jeremy Cline d1b6f8c