diff options
Diffstat (limited to 'ipmi-fixes.patch')
-rw-r--r-- | ipmi-fixes.patch | 2460 |
1 files changed, 0 insertions, 2460 deletions
diff --git a/ipmi-fixes.patch b/ipmi-fixes.patch deleted file mode 100644 index b1838efa0..000000000 --- a/ipmi-fixes.patch +++ /dev/null @@ -1,2460 +0,0 @@ -From 20d60f61c58e8c937f3653819816dd203e6e3cb4 Mon Sep 17 00:00:00 2001 -From: Haiyue Wang <haiyue.wang@linux.intel.com> -Date: Fri, 2 Feb 2018 10:16:10 +0800 -Subject: [PATCH 1/9] ipmi: add a KCS IPMI BMC driver - -Provides a device driver for the KCS (Keyboard Controller Style) -IPMI interface which meets the requirement of the BMC (Baseboard -Management Controllers) side for handling the IPMI request from -host system software. - -Signed-off-by: Haiyue Wang <haiyue.wang@linux.intel.com> -[Removed the selectability of IPMI_KCS_BMC, as it doesn't do much - good to have it by itself.] -Signed-off-by: Corey Minyard <cminyard@mvista.com> ---- - drivers/char/ipmi/Kconfig | 3 + - drivers/char/ipmi/Makefile | 1 + - drivers/char/ipmi/kcs_bmc.c | 464 ++++++++++++++++++++++++++++++++++++++++++ - drivers/char/ipmi/kcs_bmc.h | 106 ++++++++++ - include/uapi/linux/ipmi_bmc.h | 14 ++ - 5 files changed, 588 insertions(+) - create mode 100644 drivers/char/ipmi/kcs_bmc.c - create mode 100644 drivers/char/ipmi/kcs_bmc.h - create mode 100644 include/uapi/linux/ipmi_bmc.h - -diff --git a/drivers/char/ipmi/Kconfig b/drivers/char/ipmi/Kconfig -index 3544abc0f9f9..7641b8a2f632 100644 ---- a/drivers/char/ipmi/Kconfig -+++ b/drivers/char/ipmi/Kconfig -@@ -96,6 +96,9 @@ config IPMI_POWEROFF - - endif # IPMI_HANDLER - -+config IPMI_KCS_BMC -+ tristate -+ - config ASPEED_BT_IPMI_BMC - depends on ARCH_ASPEED || COMPILE_TEST - depends on REGMAP && REGMAP_MMIO && MFD_SYSCON -diff --git a/drivers/char/ipmi/Makefile b/drivers/char/ipmi/Makefile -index 33b899fcf14a..2abccb30016a 100644 ---- a/drivers/char/ipmi/Makefile -+++ b/drivers/char/ipmi/Makefile -@@ -21,4 +21,5 @@ obj-$(CONFIG_IPMI_SSIF) += ipmi_ssif.o - obj-$(CONFIG_IPMI_POWERNV) += ipmi_powernv.o - obj-$(CONFIG_IPMI_WATCHDOG) += ipmi_watchdog.o - obj-$(CONFIG_IPMI_POWEROFF) += ipmi_poweroff.o -+obj-$(CONFIG_IPMI_KCS_BMC) += kcs_bmc.o - obj-$(CONFIG_ASPEED_BT_IPMI_BMC) += bt-bmc.o -diff --git a/drivers/char/ipmi/kcs_bmc.c b/drivers/char/ipmi/kcs_bmc.c -new file mode 100644 -index 000000000000..3a3498afa427 ---- /dev/null -+++ b/drivers/char/ipmi/kcs_bmc.c -@@ -0,0 +1,464 @@ -+// SPDX-License-Identifier: GPL-2.0 -+// Copyright (c) 2015-2018, Intel Corporation. -+ -+#define pr_fmt(fmt) "kcs-bmc: " fmt -+ -+#include <linux/errno.h> -+#include <linux/io.h> -+#include <linux/ipmi_bmc.h> -+#include <linux/module.h> -+#include <linux/platform_device.h> -+#include <linux/poll.h> -+#include <linux/sched.h> -+#include <linux/slab.h> -+ -+#include "kcs_bmc.h" -+ -+#define KCS_MSG_BUFSIZ 1000 -+ -+#define KCS_ZERO_DATA 0 -+ -+ -+/* IPMI 2.0 - Table 9-1, KCS Interface Status Register Bits */ -+#define KCS_STATUS_STATE(state) (state << 6) -+#define KCS_STATUS_STATE_MASK GENMASK(7, 6) -+#define KCS_STATUS_CMD_DAT BIT(3) -+#define KCS_STATUS_SMS_ATN BIT(2) -+#define KCS_STATUS_IBF BIT(1) -+#define KCS_STATUS_OBF BIT(0) -+ -+/* IPMI 2.0 - Table 9-2, KCS Interface State Bits */ -+enum kcs_states { -+ IDLE_STATE = 0, -+ READ_STATE = 1, -+ WRITE_STATE = 2, -+ ERROR_STATE = 3, -+}; -+ -+/* IPMI 2.0 - Table 9-3, KCS Interface Control Codes */ -+#define KCS_CMD_GET_STATUS_ABORT 0x60 -+#define KCS_CMD_WRITE_START 0x61 -+#define KCS_CMD_WRITE_END 0x62 -+#define KCS_CMD_READ_BYTE 0x68 -+ -+static inline u8 read_data(struct kcs_bmc *kcs_bmc) -+{ -+ return kcs_bmc->io_inputb(kcs_bmc, kcs_bmc->ioreg.idr); -+} -+ -+static inline void write_data(struct kcs_bmc *kcs_bmc, u8 data) -+{ -+ kcs_bmc->io_outputb(kcs_bmc, kcs_bmc->ioreg.odr, data); -+} -+ -+static inline u8 read_status(struct kcs_bmc *kcs_bmc) -+{ -+ return kcs_bmc->io_inputb(kcs_bmc, kcs_bmc->ioreg.str); -+} -+ -+static inline void write_status(struct kcs_bmc *kcs_bmc, u8 data) -+{ -+ kcs_bmc->io_outputb(kcs_bmc, kcs_bmc->ioreg.str, data); -+} -+ -+static void update_status_bits(struct kcs_bmc *kcs_bmc, u8 mask, u8 val) -+{ -+ u8 tmp = read_status(kcs_bmc); -+ -+ tmp &= ~mask; -+ tmp |= val & mask; -+ -+ write_status(kcs_bmc, tmp); -+} -+ -+static inline void set_state(struct kcs_bmc *kcs_bmc, u8 state) -+{ -+ update_status_bits(kcs_bmc, KCS_STATUS_STATE_MASK, -+ KCS_STATUS_STATE(state)); -+} -+ -+static void kcs_force_abort(struct kcs_bmc *kcs_bmc) -+{ -+ set_state(kcs_bmc, ERROR_STATE); -+ read_data(kcs_bmc); -+ write_data(kcs_bmc, KCS_ZERO_DATA); -+ -+ kcs_bmc->phase = KCS_PHASE_ERROR; -+ kcs_bmc->data_in_avail = false; -+ kcs_bmc->data_in_idx = 0; -+} -+ -+static void kcs_bmc_handle_data(struct kcs_bmc *kcs_bmc) -+{ -+ u8 data; -+ -+ switch (kcs_bmc->phase) { -+ case KCS_PHASE_WRITE_START: -+ kcs_bmc->phase = KCS_PHASE_WRITE_DATA; -+ -+ case KCS_PHASE_WRITE_DATA: -+ if (kcs_bmc->data_in_idx < KCS_MSG_BUFSIZ) { -+ set_state(kcs_bmc, WRITE_STATE); -+ write_data(kcs_bmc, KCS_ZERO_DATA); -+ kcs_bmc->data_in[kcs_bmc->data_in_idx++] = -+ read_data(kcs_bmc); -+ } else { -+ kcs_force_abort(kcs_bmc); -+ kcs_bmc->error = KCS_LENGTH_ERROR; -+ } -+ break; -+ -+ case KCS_PHASE_WRITE_END_CMD: -+ if (kcs_bmc->data_in_idx < KCS_MSG_BUFSIZ) { -+ set_state(kcs_bmc, READ_STATE); -+ kcs_bmc->data_in[kcs_bmc->data_in_idx++] = -+ read_data(kcs_bmc); -+ kcs_bmc->phase = KCS_PHASE_WRITE_DONE; -+ kcs_bmc->data_in_avail = true; -+ wake_up_interruptible(&kcs_bmc->queue); -+ } else { -+ kcs_force_abort(kcs_bmc); -+ kcs_bmc->error = KCS_LENGTH_ERROR; -+ } -+ break; -+ -+ case KCS_PHASE_READ: -+ if (kcs_bmc->data_out_idx == kcs_bmc->data_out_len) -+ set_state(kcs_bmc, IDLE_STATE); -+ -+ data = read_data(kcs_bmc); -+ if (data != KCS_CMD_READ_BYTE) { -+ set_state(kcs_bmc, ERROR_STATE); -+ write_data(kcs_bmc, KCS_ZERO_DATA); -+ break; -+ } -+ -+ if (kcs_bmc->data_out_idx == kcs_bmc->data_out_len) { -+ write_data(kcs_bmc, KCS_ZERO_DATA); -+ kcs_bmc->phase = KCS_PHASE_IDLE; -+ break; -+ } -+ -+ write_data(kcs_bmc, -+ kcs_bmc->data_out[kcs_bmc->data_out_idx++]); -+ break; -+ -+ case KCS_PHASE_ABORT_ERROR1: -+ set_state(kcs_bmc, READ_STATE); -+ read_data(kcs_bmc); -+ write_data(kcs_bmc, kcs_bmc->error); -+ kcs_bmc->phase = KCS_PHASE_ABORT_ERROR2; -+ break; -+ -+ case KCS_PHASE_ABORT_ERROR2: -+ set_state(kcs_bmc, IDLE_STATE); -+ read_data(kcs_bmc); -+ write_data(kcs_bmc, KCS_ZERO_DATA); -+ kcs_bmc->phase = KCS_PHASE_IDLE; -+ break; -+ -+ default: -+ kcs_force_abort(kcs_bmc); -+ break; -+ } -+} -+ -+static void kcs_bmc_handle_cmd(struct kcs_bmc *kcs_bmc) -+{ -+ u8 cmd; -+ -+ set_state(kcs_bmc, WRITE_STATE); -+ write_data(kcs_bmc, KCS_ZERO_DATA); -+ -+ cmd = read_data(kcs_bmc); -+ switch (cmd) { -+ case KCS_CMD_WRITE_START: -+ kcs_bmc->phase = KCS_PHASE_WRITE_START; -+ kcs_bmc->error = KCS_NO_ERROR; -+ kcs_bmc->data_in_avail = false; -+ kcs_bmc->data_in_idx = 0; -+ break; -+ -+ case KCS_CMD_WRITE_END: -+ if (kcs_bmc->phase != KCS_PHASE_WRITE_DATA) { -+ kcs_force_abort(kcs_bmc); -+ break; -+ } -+ -+ kcs_bmc->phase = KCS_PHASE_WRITE_END_CMD; -+ break; -+ -+ case KCS_CMD_GET_STATUS_ABORT: -+ if (kcs_bmc->error == KCS_NO_ERROR) -+ kcs_bmc->error = KCS_ABORTED_BY_COMMAND; -+ -+ kcs_bmc->phase = KCS_PHASE_ABORT_ERROR1; -+ kcs_bmc->data_in_avail = false; -+ kcs_bmc->data_in_idx = 0; -+ break; -+ -+ default: -+ kcs_force_abort(kcs_bmc); -+ kcs_bmc->error = KCS_ILLEGAL_CONTROL_CODE; -+ break; -+ } -+} -+ -+int kcs_bmc_handle_event(struct kcs_bmc *kcs_bmc) -+{ -+ unsigned long flags; -+ int ret = 0; -+ u8 status; -+ -+ spin_lock_irqsave(&kcs_bmc->lock, flags); -+ -+ if (!kcs_bmc->running) { -+ kcs_force_abort(kcs_bmc); -+ ret = -ENODEV; -+ goto out_unlock; -+ } -+ -+ status = read_status(kcs_bmc) & (KCS_STATUS_IBF | KCS_STATUS_CMD_DAT); -+ -+ switch (status) { -+ case KCS_STATUS_IBF | KCS_STATUS_CMD_DAT: -+ kcs_bmc_handle_cmd(kcs_bmc); -+ break; -+ -+ case KCS_STATUS_IBF: -+ kcs_bmc_handle_data(kcs_bmc); -+ break; -+ -+ default: -+ ret = -ENODATA; -+ break; -+ } -+ -+out_unlock: -+ spin_unlock_irqrestore(&kcs_bmc->lock, flags); -+ -+ return ret; -+} -+EXPORT_SYMBOL(kcs_bmc_handle_event); -+ -+static inline struct kcs_bmc *file_to_kcs_bmc(struct file *filp) -+{ -+ return container_of(filp->private_data, struct kcs_bmc, miscdev); -+} -+ -+static int kcs_bmc_open(struct inode *inode, struct file *filp) -+{ -+ struct kcs_bmc *kcs_bmc = file_to_kcs_bmc(filp); -+ int ret = 0; -+ -+ spin_lock_irq(&kcs_bmc->lock); -+ if (!kcs_bmc->running) -+ kcs_bmc->running = 1; -+ else -+ ret = -EBUSY; -+ spin_unlock_irq(&kcs_bmc->lock); -+ -+ return ret; -+} -+ -+static unsigned int kcs_bmc_poll(struct file *filp, poll_table *wait) -+{ -+ struct kcs_bmc *kcs_bmc = file_to_kcs_bmc(filp); -+ unsigned int mask = 0; -+ -+ poll_wait(filp, &kcs_bmc->queue, wait); -+ -+ spin_lock_irq(&kcs_bmc->lock); -+ if (kcs_bmc->data_in_avail) -+ mask |= POLLIN; -+ spin_unlock_irq(&kcs_bmc->lock); -+ -+ return mask; -+} -+ -+static ssize_t kcs_bmc_read(struct file *filp, char *buf, -+ size_t count, loff_t *offset) -+{ -+ struct kcs_bmc *kcs_bmc = file_to_kcs_bmc(filp); -+ bool data_avail; -+ size_t data_len; -+ ssize_t ret; -+ -+ if (!(filp->f_flags & O_NONBLOCK)) -+ wait_event_interruptible(kcs_bmc->queue, -+ kcs_bmc->data_in_avail); -+ -+ mutex_lock(&kcs_bmc->mutex); -+ -+ spin_lock_irq(&kcs_bmc->lock); -+ data_avail = kcs_bmc->data_in_avail; -+ if (data_avail) { -+ data_len = kcs_bmc->data_in_idx; -+ memcpy(kcs_bmc->kbuffer, kcs_bmc->data_in, data_len); -+ } -+ spin_unlock_irq(&kcs_bmc->lock); -+ -+ if (!data_avail) { -+ ret = -EAGAIN; -+ goto out_unlock; -+ } -+ -+ if (count < data_len) { -+ pr_err("channel=%u with too large data : %zu\n", -+ kcs_bmc->channel, data_len); -+ -+ spin_lock_irq(&kcs_bmc->lock); -+ kcs_force_abort(kcs_bmc); -+ spin_unlock_irq(&kcs_bmc->lock); -+ -+ ret = -EOVERFLOW; -+ goto out_unlock; -+ } -+ -+ if (copy_to_user(buf, kcs_bmc->kbuffer, data_len)) { -+ ret = -EFAULT; -+ goto out_unlock; -+ } -+ -+ ret = data_len; -+ -+ spin_lock_irq(&kcs_bmc->lock); -+ if (kcs_bmc->phase == KCS_PHASE_WRITE_DONE) { -+ kcs_bmc->phase = KCS_PHASE_WAIT_READ; -+ kcs_bmc->data_in_avail = false; -+ kcs_bmc->data_in_idx = 0; -+ } else { -+ ret = -EAGAIN; -+ } -+ spin_unlock_irq(&kcs_bmc->lock); -+ -+out_unlock: -+ mutex_unlock(&kcs_bmc->mutex); -+ -+ return ret; -+} -+ -+static ssize_t kcs_bmc_write(struct file *filp, const char *buf, -+ size_t count, loff_t *offset) -+{ -+ struct kcs_bmc *kcs_bmc = file_to_kcs_bmc(filp); -+ ssize_t ret; -+ -+ /* a minimum response size '3' : netfn + cmd + ccode */ -+ if (count < 3 || count > KCS_MSG_BUFSIZ) -+ return -EINVAL; -+ -+ mutex_lock(&kcs_bmc->mutex); -+ -+ if (copy_from_user(kcs_bmc->kbuffer, buf, count)) { -+ ret = -EFAULT; -+ goto out_unlock; -+ } -+ -+ spin_lock_irq(&kcs_bmc->lock); -+ if (kcs_bmc->phase == KCS_PHASE_WAIT_READ) { -+ kcs_bmc->phase = KCS_PHASE_READ; -+ kcs_bmc->data_out_idx = 1; -+ kcs_bmc->data_out_len = count; -+ memcpy(kcs_bmc->data_out, kcs_bmc->kbuffer, count); -+ write_data(kcs_bmc, kcs_bmc->data_out[0]); -+ ret = count; -+ } else { -+ ret = -EINVAL; -+ } -+ spin_unlock_irq(&kcs_bmc->lock); -+ -+out_unlock: -+ mutex_unlock(&kcs_bmc->mutex); -+ -+ return ret; -+} -+ -+static long kcs_bmc_ioctl(struct file *filp, unsigned int cmd, -+ unsigned long arg) -+{ -+ struct kcs_bmc *kcs_bmc = file_to_kcs_bmc(filp); -+ long ret = 0; -+ -+ spin_lock_irq(&kcs_bmc->lock); -+ -+ switch (cmd) { -+ case IPMI_BMC_IOCTL_SET_SMS_ATN: -+ update_status_bits(kcs_bmc, KCS_STATUS_SMS_ATN, -+ KCS_STATUS_SMS_ATN); -+ break; -+ -+ case IPMI_BMC_IOCTL_CLEAR_SMS_ATN: -+ update_status_bits(kcs_bmc, KCS_STATUS_SMS_ATN, -+ 0); -+ break; -+ -+ case IPMI_BMC_IOCTL_FORCE_ABORT: -+ kcs_force_abort(kcs_bmc); -+ break; -+ -+ default: -+ ret = -EINVAL; -+ break; -+ } -+ -+ spin_unlock_irq(&kcs_bmc->lock); -+ -+ return ret; -+} -+ -+static int kcs_bmc_release(struct inode *inode, struct file *filp) -+{ -+ struct kcs_bmc *kcs_bmc = file_to_kcs_bmc(filp); -+ -+ spin_lock_irq(&kcs_bmc->lock); -+ kcs_bmc->running = 0; -+ kcs_force_abort(kcs_bmc); -+ spin_unlock_irq(&kcs_bmc->lock); -+ -+ return 0; -+} -+ -+static const struct file_operations kcs_bmc_fops = { -+ .owner = THIS_MODULE, -+ .open = kcs_bmc_open, -+ .read = kcs_bmc_read, -+ .write = kcs_bmc_write, -+ .release = kcs_bmc_release, -+ .poll = kcs_bmc_poll, -+ .unlocked_ioctl = kcs_bmc_ioctl, -+}; -+ -+struct kcs_bmc *kcs_bmc_alloc(struct device *dev, int sizeof_priv, u32 channel) -+{ -+ struct kcs_bmc *kcs_bmc; -+ -+ kcs_bmc = devm_kzalloc(dev, sizeof(*kcs_bmc) + sizeof_priv, GFP_KERNEL); -+ if (!kcs_bmc) -+ return NULL; -+ -+ dev_set_name(dev, "ipmi-kcs%u", channel); -+ -+ spin_lock_init(&kcs_bmc->lock); -+ kcs_bmc->channel = channel; -+ -+ mutex_init(&kcs_bmc->mutex); -+ init_waitqueue_head(&kcs_bmc->queue); -+ -+ kcs_bmc->data_in = devm_kmalloc(dev, KCS_MSG_BUFSIZ, GFP_KERNEL); -+ kcs_bmc->data_out = devm_kmalloc(dev, KCS_MSG_BUFSIZ, GFP_KERNEL); -+ kcs_bmc->kbuffer = devm_kmalloc(dev, KCS_MSG_BUFSIZ, GFP_KERNEL); -+ if (!kcs_bmc->data_in || !kcs_bmc->data_out || !kcs_bmc->kbuffer) -+ return NULL; -+ -+ kcs_bmc->miscdev.minor = MISC_DYNAMIC_MINOR; -+ kcs_bmc->miscdev.name = dev_name(dev); -+ kcs_bmc->miscdev.fops = &kcs_bmc_fops; -+ -+ return kcs_bmc; -+} -+EXPORT_SYMBOL(kcs_bmc_alloc); -+ -+MODULE_LICENSE("GPL v2"); -+MODULE_AUTHOR("Haiyue Wang <haiyue.wang@linux.intel.com>"); -+MODULE_DESCRIPTION("KCS BMC to handle the IPMI request from system software"); -diff --git a/drivers/char/ipmi/kcs_bmc.h b/drivers/char/ipmi/kcs_bmc.h -new file mode 100644 -index 000000000000..c19501db0236 ---- /dev/null -+++ b/drivers/char/ipmi/kcs_bmc.h -@@ -0,0 +1,106 @@ -+// SPDX-License-Identifier: GPL-2.0 -+// Copyright (c) 2015-2018, Intel Corporation. -+ -+#ifndef __KCS_BMC_H__ -+#define __KCS_BMC_H__ -+ -+#include <linux/miscdevice.h> -+ -+/* Different phases of the KCS BMC module : -+ * KCS_PHASE_IDLE : -+ * BMC should not be expecting nor sending any data. -+ * KCS_PHASE_WRITE_START : -+ * BMC is receiving a WRITE_START command from system software. -+ * KCS_PHASE_WRITE_DATA : -+ * BMC is receiving a data byte from system software. -+ * KCS_PHASE_WRITE_END_CMD : -+ * BMC is waiting a last data byte from system software. -+ * KCS_PHASE_WRITE_DONE : -+ * BMC has received the whole request from system software. -+ * KCS_PHASE_WAIT_READ : -+ * BMC is waiting the response from the upper IPMI service. -+ * KCS_PHASE_READ : -+ * BMC is transferring the response to system software. -+ * KCS_PHASE_ABORT_ERROR1 : -+ * BMC is waiting error status request from system software. -+ * KCS_PHASE_ABORT_ERROR2 : -+ * BMC is waiting for idle status afer error from system software. -+ * KCS_PHASE_ERROR : -+ * BMC has detected a protocol violation at the interface level. -+ */ -+enum kcs_phases { -+ KCS_PHASE_IDLE, -+ -+ KCS_PHASE_WRITE_START, -+ KCS_PHASE_WRITE_DATA, -+ KCS_PHASE_WRITE_END_CMD, -+ KCS_PHASE_WRITE_DONE, -+ -+ KCS_PHASE_WAIT_READ, -+ KCS_PHASE_READ, -+ -+ KCS_PHASE_ABORT_ERROR1, -+ KCS_PHASE_ABORT_ERROR2, -+ KCS_PHASE_ERROR -+}; -+ -+/* IPMI 2.0 - Table 9-4, KCS Interface Status Codes */ -+enum kcs_errors { -+ KCS_NO_ERROR = 0x00, -+ KCS_ABORTED_BY_COMMAND = 0x01, -+ KCS_ILLEGAL_CONTROL_CODE = 0x02, -+ KCS_LENGTH_ERROR = 0x06, -+ KCS_UNSPECIFIED_ERROR = 0xFF -+}; -+ -+/* IPMI 2.0 - 9.5, KCS Interface Registers -+ * @idr : Input Data Register -+ * @odr : Output Data Register -+ * @str : Status Register -+ */ -+struct kcs_ioreg { -+ u32 idr; -+ u32 odr; -+ u32 str; -+}; -+ -+struct kcs_bmc { -+ spinlock_t lock; -+ -+ u32 channel; -+ int running; -+ -+ /* Setup by BMC KCS controller driver */ -+ struct kcs_ioreg ioreg; -+ u8 (*io_inputb)(struct kcs_bmc *kcs_bmc, u32 reg); -+ void (*io_outputb)(struct kcs_bmc *kcs_bmc, u32 reg, u8 b); -+ -+ enum kcs_phases phase; -+ enum kcs_errors error; -+ -+ wait_queue_head_t queue; -+ bool data_in_avail; -+ int data_in_idx; -+ u8 *data_in; -+ -+ int data_out_idx; -+ int data_out_len; -+ u8 *data_out; -+ -+ struct mutex mutex; -+ u8 *kbuffer; -+ -+ struct miscdevice miscdev; -+ -+ unsigned long priv[]; -+}; -+ -+static inline void *kcs_bmc_priv(struct kcs_bmc *kcs_bmc) -+{ -+ return kcs_bmc->priv; -+} -+ -+int kcs_bmc_handle_event(struct kcs_bmc *kcs_bmc); -+struct kcs_bmc *kcs_bmc_alloc(struct device *dev, int sizeof_priv, -+ u32 channel); -+#endif -diff --git a/include/uapi/linux/ipmi_bmc.h b/include/uapi/linux/ipmi_bmc.h -new file mode 100644 -index 000000000000..2f9f97e6123a ---- /dev/null -+++ b/include/uapi/linux/ipmi_bmc.h -@@ -0,0 +1,14 @@ -+// SPDX-License-Identifier: GPL-2.0 -+// Copyright (c) 2015-2018, Intel Corporation. -+ -+#ifndef _UAPI_LINUX_IPMI_BMC_H -+#define _UAPI_LINUX_IPMI_BMC_H -+ -+#include <linux/ioctl.h> -+ -+#define __IPMI_BMC_IOCTL_MAGIC 0xB1 -+#define IPMI_BMC_IOCTL_SET_SMS_ATN _IO(__IPMI_BMC_IOCTL_MAGIC, 0x00) -+#define IPMI_BMC_IOCTL_CLEAR_SMS_ATN _IO(__IPMI_BMC_IOCTL_MAGIC, 0x01) -+#define IPMI_BMC_IOCTL_FORCE_ABORT _IO(__IPMI_BMC_IOCTL_MAGIC, 0x02) -+ -+#endif /* _UAPI_LINUX_KCS_BMC_H */ --- -2.14.3 - - -From be2ed207e3745392478e85afa0bb02acdf44c966 Mon Sep 17 00:00:00 2001 -From: Haiyue Wang <haiyue.wang@linux.intel.com> -Date: Fri, 2 Feb 2018 10:16:11 +0800 -Subject: [PATCH 2/9] ipmi: add an Aspeed KCS IPMI BMC driver - -The KCS (Keyboard Controller Style) interface is used to perform in-band -IPMI communication between a server host and its BMC (BaseBoard Management -Controllers). - -This driver exposes the KCS interface on ASpeed SOCs (AST2400 and AST2500) -as a character device. Such SOCs are commonly used as BMCs and this driver -implements the BMC side of the KCS interface. - -Signed-off-by: Haiyue Wang <haiyue.wang@linux.intel.com> -Signed-off-by: Corey Minyard <cminyard@mvista.com> ---- - .../devicetree/bindings/ipmi/aspeed-kcs-bmc.txt | 25 ++ - drivers/char/ipmi/Kconfig | 12 + - drivers/char/ipmi/Makefile | 1 + - drivers/char/ipmi/kcs_bmc_aspeed.c | 319 +++++++++++++++++++++ - 4 files changed, 357 insertions(+) - create mode 100644 Documentation/devicetree/bindings/ipmi/aspeed-kcs-bmc.txt - create mode 100644 drivers/char/ipmi/kcs_bmc_aspeed.c - -diff --git a/Documentation/devicetree/bindings/ipmi/aspeed-kcs-bmc.txt b/Documentation/devicetree/bindings/ipmi/aspeed-kcs-bmc.txt -new file mode 100644 -index 000000000000..d98a9bf45d6c ---- /dev/null -+++ b/Documentation/devicetree/bindings/ipmi/aspeed-kcs-bmc.txt -@@ -0,0 +1,25 @@ -+* Aspeed KCS (Keyboard Controller Style) IPMI interface -+ -+The Aspeed SOCs (AST2400 and AST2500) are commonly used as BMCs -+(Baseboard Management Controllers) and the KCS interface can be -+used to perform in-band IPMI communication with their host. -+ -+Required properties: -+- compatible : should be one of -+ "aspeed,ast2400-kcs-bmc" -+ "aspeed,ast2500-kcs-bmc" -+- interrupts : interrupt generated by the controller -+- kcs_chan : The LPC channel number in the controller -+- kcs_addr : The host CPU IO map address -+ -+ -+Example: -+ -+ kcs3: kcs3@0 { -+ compatible = "aspeed,ast2500-kcs-bmc"; -+ reg = <0x0 0x80>; -+ interrupts = <8>; -+ kcs_chan = <3>; -+ kcs_addr = <0xCA2>; -+ status = "okay"; -+ }; -diff --git a/drivers/char/ipmi/Kconfig b/drivers/char/ipmi/Kconfig -index 7641b8a2f632..3bda116c8aa0 100644 ---- a/drivers/char/ipmi/Kconfig -+++ b/drivers/char/ipmi/Kconfig -@@ -99,6 +99,18 @@ endif # IPMI_HANDLER - config IPMI_KCS_BMC - tristate - -+config ASPEED_KCS_IPMI_BMC -+ depends on ARCH_ASPEED || COMPILE_TEST -+ select IPMI_KCS_BMC -+ select REGMAP_MMIO -+ tristate "Aspeed KCS IPMI BMC driver" -+ help -+ Provides a driver for the KCS (Keyboard Controller Style) IPMI -+ interface found on Aspeed SOCs (AST2400 and AST2500). -+ -+ The driver implements the BMC side of the KCS contorller, it -+ provides the access of KCS IO space for BMC side. -+ - config ASPEED_BT_IPMI_BMC - depends on ARCH_ASPEED || COMPILE_TEST - depends on REGMAP && REGMAP_MMIO && MFD_SYSCON -diff --git a/drivers/char/ipmi/Makefile b/drivers/char/ipmi/Makefile -index 2abccb30016a..21e9e872d973 100644 ---- a/drivers/char/ipmi/Makefile -+++ b/drivers/char/ipmi/Makefile -@@ -23,3 +23,4 @@ obj-$(CONFIG_IPMI_WATCHDOG) += ipmi_watchdog.o - obj-$(CONFIG_IPMI_POWEROFF) += ipmi_poweroff.o - obj-$(CONFIG_IPMI_KCS_BMC) += kcs_bmc.o - obj-$(CONFIG_ASPEED_BT_IPMI_BMC) += bt-bmc.o -+obj-$(CONFIG_ASPEED_KCS_IPMI_BMC) += kcs_bmc_aspeed.o -diff --git a/drivers/char/ipmi/kcs_bmc_aspeed.c b/drivers/char/ipmi/kcs_bmc_aspeed.c -new file mode 100644 -index 000000000000..0c4d1a36dae4 ---- /dev/null -+++ b/drivers/char/ipmi/kcs_bmc_aspeed.c -@@ -0,0 +1,319 @@ -+// SPDX-License-Identifier: GPL-2.0 -+// Copyright (c) 2015-2018, Intel Corporation. -+ -+#define pr_fmt(fmt) "aspeed-kcs-bmc: " fmt -+ -+#include <linux/atomic.h> -+#include <linux/errno.h> -+#include <linux/interrupt.h> -+#include <linux/io.h> -+#include <linux/mfd/syscon.h> -+#include <linux/module.h> -+#include <linux/of.h> -+#include <linux/platform_device.h> -+#include <linux/poll.h> -+#include <linux/regmap.h> -+#include <linux/sched.h> -+#include <linux/slab.h> -+#include <linux/timer.h> -+ -+#include "kcs_bmc.h" -+ -+ -+#define DEVICE_NAME "ast-kcs-bmc" -+ -+#define KCS_CHANNEL_MAX 4 -+ -+/* mapped to lpc-bmc@0 IO space */ -+#define LPC_HICR0 0x000 -+#define LPC_HICR0_LPC3E BIT(7) -+#define LPC_HICR0_LPC2E BIT(6) -+#define LPC_HICR0_LPC1E BIT(5) -+#define LPC_HICR2 0x008 -+#define LPC_HICR2_IBFIF3 BIT(3) -+#define LPC_HICR2_IBFIF2 BIT(2) -+#define LPC_HICR2_IBFIF1 BIT(1) -+#define LPC_HICR4 0x010 -+#define LPC_HICR4_LADR12AS BIT(7) -+#define LPC_HICR4_KCSENBL BIT(2) -+#define LPC_LADR3H 0x014 -+#define LPC_LADR3L 0x018 -+#define LPC_LADR12H 0x01C -+#define LPC_LADR12L 0x020 -+#define LPC_IDR1 0x024 -+#define LPC_IDR2 0x028 -+#define LPC_IDR3 0x02C -+#define LPC_ODR1 0x030 -+#define LPC_ODR2 0x034 -+#define LPC_ODR3 0x038 -+#define LPC_STR1 0x03C -+#define LPC_STR2 0x040 -+#define LPC_STR3 0x044 -+ -+/* mapped to lpc-host@80 IO space */ -+#define LPC_HICRB 0x080 -+#define LPC_HICRB_IBFIF4 BIT(1) -+#define LPC_HICRB_LPC4E BIT(0) -+#define LPC_LADR4 0x090 -+#define LPC_IDR4 0x094 -+#define LPC_ODR4 0x098 -+#define LPC_STR4 0x09C -+ -+struct aspeed_kcs_bmc { -+ struct regmap *map; -+}; -+ -+ -+static u8 aspeed_kcs_inb(struct kcs_bmc *kcs_bmc, u32 reg) -+{ -+ struct aspeed_kcs_bmc *priv = kcs_bmc_priv(kcs_bmc); -+ u32 val = 0; -+ int rc; -+ -+ rc = regmap_read(priv->map, reg, &val); -+ WARN(rc != 0, "regmap_read() failed: %d\n", rc); -+ -+ return rc == 0 ? (u8) val : 0; -+} -+ -+static void aspeed_kcs_outb(struct kcs_bmc *kcs_bmc, u32 reg, u8 data) -+{ -+ struct aspeed_kcs_bmc *priv = kcs_bmc_priv(kcs_bmc); -+ int rc; -+ -+ rc = regmap_write(priv->map, reg, data); -+ WARN(rc != 0, "regmap_write() failed: %d\n", rc); -+} -+ -+ -+/* -+ * AST_usrGuide_KCS.pdf -+ * 2. Background: -+ * we note D for Data, and C for Cmd/Status, default rules are -+ * A. KCS1 / KCS2 ( D / C:X / X+4 ) -+ * D / C : CA0h / CA4h -+ * D / C : CA8h / CACh -+ * B. KCS3 ( D / C:XX2h / XX3h ) -+ * D / C : CA2h / CA3h -+ * D / C : CB2h / CB3h -+ * C. KCS4 -+ * D / C : CA4h / CA5h -+ */ -+static void aspeed_kcs_set_address(struct kcs_bmc *kcs_bmc, u16 addr) -+{ -+ struct aspeed_kcs_bmc *priv = kcs_bmc_priv(kcs_bmc); -+ -+ switch (kcs_bmc->channel) { -+ case 1: -+ regmap_update_bits(priv->map, LPC_HICR4, -+ LPC_HICR4_LADR12AS, 0); -+ regmap_write(priv->map, LPC_LADR12H, addr >> 8); -+ regmap_write(priv->map, LPC_LADR12L, addr & 0xFF); -+ break; -+ -+ case 2: -+ regmap_update_bits(priv->map, LPC_HICR4, -+ LPC_HICR4_LADR12AS, LPC_HICR4_LADR12AS); -+ regmap_write(priv->map, LPC_LADR12H, addr >> 8); -+ regmap_write(priv->map, LPC_LADR12L, addr & 0xFF); -+ break; -+ -+ case 3: -+ regmap_write(priv->map, LPC_LADR3H, addr >> 8); -+ regmap_write(priv->map, LPC_LADR3L, addr & 0xFF); -+ break; -+ -+ case 4: -+ regmap_write(priv->map, LPC_LADR4, ((addr + 1) << 16) | -+ addr); -+ break; -+ -+ default: -+ break; -+ } -+} -+ -+static void aspeed_kcs_enable_channel(struct kcs_bmc *kcs_bmc, bool enable) -+{ -+ struct aspeed_kcs_bmc *priv = kcs_bmc_priv(kcs_bmc); -+ -+ switch (kcs_bmc->channel) { -+ case 1: -+ if (enable) { -+ regmap_update_bits(priv->map, LPC_HICR2, -+ LPC_HICR2_IBFIF1, LPC_HICR2_IBFIF1); -+ regmap_update_bits(priv->map, LPC_HICR0, -+ LPC_HICR0_LPC1E, LPC_HICR0_LPC1E); -+ } else { -+ regmap_update_bits(priv->map, LPC_HICR0, -+ LPC_HICR0_LPC1E, 0); -+ regmap_update_bits(priv->map, LPC_HICR2, -+ LPC_HICR2_IBFIF1, 0); -+ } -+ break; -+ -+ case 2: -+ if (enable) { -+ regmap_update_bits(priv->map, LPC_HICR2, -+ LPC_HICR2_IBFIF2, LPC_HICR2_IBFIF2); -+ regmap_update_bits(priv->map, LPC_HICR0, -+ LPC_HICR0_LPC2E, LPC_HICR0_LPC2E); -+ } else { -+ regmap_update_bits(priv->map, LPC_HICR0, -+ LPC_HICR0_LPC2E, 0); -+ regmap_update_bits(priv->map, LPC_HICR2, -+ LPC_HICR2_IBFIF2, 0); -+ } -+ break; -+ -+ case 3: -+ if (enable) { -+ regmap_update_bits(priv->map, LPC_HICR2, -+ LPC_HICR2_IBFIF3, LPC_HICR2_IBFIF3); -+ regmap_update_bits(priv->map, LPC_HICR0, -+ LPC_HICR0_LPC3E, LPC_HICR0_LPC3E); -+ regmap_update_bits(priv->map, LPC_HICR4, -+ LPC_HICR4_KCSENBL, LPC_HICR4_KCSENBL); -+ } else { -+ regmap_update_bits(priv->map, LPC_HICR0, -+ LPC_HICR0_LPC3E, 0); -+ regmap_update_bits(priv->map, LPC_HICR4, -+ LPC_HICR4_KCSENBL, 0); -+ regmap_update_bits(priv->map, LPC_HICR2, -+ LPC_HICR2_IBFIF3, 0); -+ } -+ break; -+ -+ case 4: -+ if (enable) -+ regmap_update_bits(priv->map, LPC_HICRB, -+ LPC_HICRB_IBFIF4 | LPC_HICRB_LPC4E, -+ LPC_HICRB_IBFIF4 | LPC_HICRB_LPC4E); -+ else -+ regmap_update_bits(priv->map, LPC_HICRB, -+ LPC_HICRB_IBFIF4 | LPC_HICRB_LPC4E, -+ 0); -+ break; -+ -+ default: -+ break; -+ } -+} -+ -+static irqreturn_t aspeed_kcs_irq(int irq, void *arg) -+{ -+ struct kcs_bmc *kcs_bmc = arg; -+ -+ if (!kcs_bmc_handle_event(kcs_bmc)) -+ return IRQ_HANDLED; -+ -+ return IRQ_NONE; -+} -+ -+static int aspeed_kcs_config_irq(struct kcs_bmc *kcs_bmc, -+ struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ int irq; -+ -+ irq = platform_get_irq(pdev, 0); -+ if (irq < 0) -+ return irq; -+ -+ return devm_request_irq(dev, irq, aspeed_kcs_irq, IRQF_SHARED, -+ dev_name(dev), kcs_bmc); -+} -+ -+static const struct kcs_ioreg ast_kcs_bmc_ioregs[KCS_CHANNEL_MAX] = { -+ { .idr = LPC_IDR1, .odr = LPC_ODR1, .str = LPC_STR1 }, -+ { .idr = LPC_IDR2, .odr = LPC_ODR2, .str = LPC_STR2 }, -+ { .idr = LPC_IDR3, .odr = LPC_ODR3, .str = LPC_STR3 }, -+ { .idr = LPC_IDR4, .odr = LPC_ODR4, .str = LPC_STR4 }, -+}; -+ -+static int aspeed_kcs_probe(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct aspeed_kcs_bmc *priv; -+ struct kcs_bmc *kcs_bmc; -+ u32 chan, addr; -+ int rc; -+ -+ rc = of_property_read_u32(dev->of_node, "kcs_chan", &chan); -+ if ((rc != 0) || (chan == 0 || chan > KCS_CHANNEL_MAX)) { -+ dev_err(dev, "no valid 'kcs_chan' configured\n"); -+ return -ENODEV; -+ } -+ -+ rc = of_property_read_u32(dev->of_node, "kcs_addr", &addr); -+ if (rc) { -+ dev_err(dev, "no valid 'kcs_addr' configured\n"); -+ return -ENODEV; -+ } -+ -+ kcs_bmc = kcs_bmc_alloc(dev, sizeof(*priv), chan); -+ if (!kcs_bmc) -+ return -ENOMEM; -+ -+ priv = kcs_bmc_priv(kcs_bmc); -+ priv->map = syscon_node_to_regmap(dev->parent->of_node); -+ if (IS_ERR(priv->map)) { -+ dev_err(dev, "Couldn't get regmap\n"); -+ return -ENODEV; -+ } -+ -+ kcs_bmc->ioreg = ast_kcs_bmc_ioregs[chan - 1]; -+ kcs_bmc->io_inputb = aspeed_kcs_inb; -+ kcs_bmc->io_outputb = aspeed_kcs_outb; -+ -+ dev_set_drvdata(dev, kcs_bmc); -+ -+ aspeed_kcs_set_address(kcs_bmc, addr); -+ aspeed_kcs_enable_channel(kcs_bmc, true); -+ rc = aspeed_kcs_config_irq(kcs_bmc, pdev); -+ if (rc) -+ return rc; -+ -+ rc = misc_register(&kcs_bmc->miscdev); -+ if (rc) { -+ dev_err(dev, "Unable to register device\n"); -+ return rc; -+ } -+ -+ pr_info("channel=%u addr=0x%x idr=0x%x odr=0x%x str=0x%x\n", -+ chan, addr, -+ kcs_bmc->ioreg.idr, kcs_bmc->ioreg.odr, kcs_bmc->ioreg.str); -+ -+ return 0; -+} -+ -+static int aspeed_kcs_remove(struct platform_device *pdev) -+{ -+ struct kcs_bmc *kcs_bmc = dev_get_drvdata(&pdev->dev); -+ -+ misc_deregister(&kcs_bmc->miscdev); -+ -+ return 0; -+} -+ -+static const struct of_device_id ast_kcs_bmc_match[] = { -+ { .compatible = "aspeed,ast2400-kcs-bmc" }, -+ { .compatible = "aspeed,ast2500-kcs-bmc" }, -+ { } -+}; -+ -+static struct platform_driver ast_kcs_bmc_driver = { -+ .driver = { -+ .name = DEVICE_NAME, -+ .of_match_table = ast_kcs_bmc_match, -+ }, -+ .probe = aspeed_kcs_probe, -+ .remove = aspeed_kcs_remove, -+}; -+ -+module_platform_driver(ast_kcs_bmc_driver); -+ -+MODULE_DEVICE_TABLE(of, ast_kcs_bmc_match); -+MODULE_LICENSE("GPL v2"); -+MODULE_AUTHOR("Haiyue Wang <haiyue.wang@linux.intel.com>"); -+MODULE_DESCRIPTION("Aspeed device interface to the KCS BMC device"); --- -2.14.3 - - -From aaf1bbe90a36a6d11dbedc4a99b24096963280c8 Mon Sep 17 00:00:00 2001 -From: "Gustavo A. R. Silva" <garsilva@embeddedor.com> -Date: Wed, 14 Feb 2018 11:30:29 -0600 -Subject: [PATCH 3/9] ipmi: kcs_bmc: mark expected switch fall-through in - kcs_bmc_handle_data - -In preparation to enabling -Wimplicit-fallthrough, mark switch cases -where we are expecting to fall through. - -Addresses-Coverity-ID: 1465255 ("Missing break in switch") -Signed-off-by: Gustavo A. R. Silva <garsilva@embeddedor.com> -Cc: Haiyue Wang <haiyue.wang@linux.intel.com> -Signed-off-by: Corey Minyard <cminyard@mvista.com> ---- - drivers/char/ipmi/kcs_bmc.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/drivers/char/ipmi/kcs_bmc.c b/drivers/char/ipmi/kcs_bmc.c -index 3a3498afa427..6476bfb79f44 100644 ---- a/drivers/char/ipmi/kcs_bmc.c -+++ b/drivers/char/ipmi/kcs_bmc.c -@@ -95,6 +95,7 @@ static void kcs_bmc_handle_data(struct kcs_bmc *kcs_bmc) - switch (kcs_bmc->phase) { - case KCS_PHASE_WRITE_START: - kcs_bmc->phase = KCS_PHASE_WRITE_DATA; -+ /* fall through */ - - case KCS_PHASE_WRITE_DATA: - if (kcs_bmc->data_in_idx < KCS_MSG_BUFSIZ) { --- -2.14.3 - - -From 364993a95888916b8906f655c8654aa60877a35b Mon Sep 17 00:00:00 2001 -From: Aishwarya Pant <aishpant@gmail.com> -Date: Sat, 24 Feb 2018 14:36:45 +0530 -Subject: [PATCH 4/9] char/ipmi: add documentation for sysfs interface - -This is an attempt to document the sysfs interface for the IPMI drivers. -Descriptions were collected from v2.0 of the IPMI specification and from -code comments. - -Signed-off-by: Aishwarya Pant <aishpant@gmail.com> -Signed-off-by: Corey Minyard <cminyard@mvista.com> ---- - .../ABI/testing/sysfs-devices-platform-ipmi | 238 +++++++++++++++++++++ - 1 file changed, 238 insertions(+) - create mode 100644 Documentation/ABI/testing/sysfs-devices-platform-ipmi - -diff --git a/Documentation/ABI/testing/sysfs-devices-platform-ipmi b/Documentation/ABI/testing/sysfs-devices-platform-ipmi -new file mode 100644 -index 000000000000..2a781e7513b7 ---- /dev/null -+++ b/Documentation/ABI/testing/sysfs-devices-platform-ipmi -@@ -0,0 +1,238 @@ -+What: /sys/devices/platform/ipmi_bmc.*/firmware_revision -+Date: Mar, 2006 -+KernelVersion: v2.6.17 -+Contact: openipmi-developer@lists.sourceforge.net -+Description: -+ (RO) The major and minor revision of the firmware. -+ -+ -+What: /sys/devices/platform/ipmi_bmc.*/aux_firmware_revision -+Date: Mar, 2006 -+KernelVersion: v2.6.17 -+Contact: openipmi-developer@lists.sourceforge.net -+Description: -+ (RO) Holds additional information about the firmware revision, -+ such as boot block or internal data structure version numbers. -+ The meanings of the numbers are specific to the vendor -+ identified by Manufacturer ID. -+ -+ -+What: /sys/devices/platform/ipmi_bmc.*/revision -+Date: Mar, 2006 -+KernelVersion: v2.6.17 -+Contact: openipmi-developer@lists.sourceforge.net -+Description: -+ (RO) Device revision. Useful for identifying if significant -+ hardware changes have been made to the implementation of the -+ management controller. -+ -+ -+What: /sys/devices/platform/ipmi_bmc.*/provides_device_sdrs -+Date: Mar, 2006 -+KernelVersion: v2.6.17 -+Contact: openipmi-developer@lists.sourceforge.net -+Description: -+ (RO) Indicates whether device provides device sensor data -+ records (1) or not (0). -+ -+ -+What: /sys/devices/platform/ipmi_bmc.*/device_id -+Date: Mar, 2006 -+KernelVersion: v2.6.17 -+Contact: openipmi-developer@lists.sourceforge.net -+Description: -+ (RO) Device id is specified by the manufacturer identified by -+ the Manufacturer ID field. This field allows controller specific -+ software to identify the unique application command, OEM -+ fields, and functionality that are provided by the controller -+ -+ -+What: /sys/devices/platform/ipmi_bmc.*/additional_device_support -+Date: Mar, 2006 -+KernelVersion: v2.6.17 -+Contact: openipmi-developer@lists.sourceforge.net -+Description: -+ (RO) Lists the IPMI ‘logical device’ commands and functions -+ that the controller supports that are in addition to the -+ mandatory IPM and Application commands. -+ -+ -+What: /sys/devices/platform/ipmi_bmc.*/ipmi_version -+Date: Mar, 2006 -+KernelVersion: v2.6.17 -+Contact: openipmi-developer@lists.sourceforge.net -+Description: -+ (RO) Displays the IPMI Command Specification Version. -+ -+ -+What: /sys/devices/platform/ipmi_bmc.*/manufacturer_id -+Date: Mar, 2006 -+KernelVersion: v2.6.17 -+Contact: openipmi-developer@lists.sourceforge.net -+Description: -+ (RO) Identifies the manufacturer responsible for the -+ specification of functionality of the vendor (OEM)-specific -+ commands, codes, and interfaces used in the controller. -+ -+ -+What: /sys/devices/platform/ipmi_bmc.*/product_id -+Date: Mar, 2006 -+KernelVersion: v2.6.17 -+Contact: openipmi-developer@lists.sourceforge.net -+Description: -+ (RO) Displays a number that identifies a particular system, -+ module, add-in card, or board set. The number is specified -+ according to the manufacturer given by Manufacturer ID. -+ -+For detailed definitions of the above attributes, refer to section 20.1 'Get -+Device ID Command' of the IPMI specification v2.0. -+ -+ -+What: /sys/devices/platform/ipmi_bmc.*/guid -+Date: Mar, 2006 -+KernelVersion: v2.6.17 -+Contact: openipmi-developer@lists.sourceforge.net -+Description: -+ (RO) A GUID (Globally Unique ID), also referred to as a UUID -+ (Universally Unique Identifier), for the management controller, -+ as described in section 20.8 'Get Device GUID Command' of the -+ IPMI specification v2.0. -+ -+ -+What: /sys/devices/platform/ipmi_si.*/type -+Date: Sep, 2017 -+KernelVersion: v4.15 -+Contact: openipmi-developer@lists.sourceforge.net -+Description: -+ (RO) The device interface for IPMI "kcs", "smic", "bt" or -+ "invalid" -+ -+What: /sys/devices/platform/ipmi_si.*/idles -+What: /sys/devices/platform/ipmi_si.*/watchdog_pretimeouts -+What: /sys/devices/platform/ipmi_si.*/complete_transactions -+What: /sys/devices/platform/ipmi_si.*/events -+What: /sys/devices/platform/ipmi_si.*/interrupts -+What: /sys/devices/platform/ipmi_si.*/hosed_count -+What: /sys/devices/platform/ipmi_si.*/long_timeouts -+What: /sys/devices/platform/ipmi_si.*/flag_fetches -+What: /sys/devices/platform/ipmi_si.*/attentions -+What: /sys/devices/platform/ipmi_si.*/incoming_messages -+What: /sys/devices/platform/ipmi_si.*/short_timeouts -+Date: Sep, 2017 -+KernelVersion: v4.15 -+Contact: openipmi-developer@lists.sourceforge.net -+Description: -+ -+ idles: (RO) Number of times the interface was -+ idle while being polled. -+ -+ watchdog_pretimeouts: (RO) Number of watchdog pretimeouts. -+ -+ complete_transactions: (RO) Number of completed messages. -+ -+ events: (RO) Number of IPMI events received from -+ the hardware. -+ -+ interrupts: (RO) Number of interrupts the driver -+ handled. -+ -+ hosed_count: (RO) Number of times the hardware didn't -+ follow the state machine. -+ -+ long_timeouts: (RO) Number of times the driver -+ requested a timer while nothing was in -+ progress. -+ -+ flag_fetches: (RO) Number of times the driver -+ requested flags from the hardware. -+ -+ attentions: (RO) Number of time the driver got an -+ ATTN from the hardware. -+ -+ incoming_messages: (RO) Number of asynchronous messages -+ received. -+ -+ short_timeouts: (RO) Number of times the driver -+ requested a timer while an operation was -+ in progress. -+ -+ -+What: /sys/devices/platform/ipmi_si.*/interrupts_enabled -+Date: Sep, 2017 -+KernelVersion: v4.15 -+Contact: openipmi-developer@lists.sourceforge.net -+Description: -+ (RO) Indicates whether interrupts are enabled or not. The driver -+ disables interrupts when it gets into a situation where it -+ cannot handle messages due to lack of memory. Once that -+ situation clears up, it will re-enable interrupts. -+ -+ -+What: /sys/devices/platform/ipmi_si.*/params -+Date: Sep, 2017 -+KernelVersion: v4.15 -+Contact: openipmi-developer@lists.sourceforge.net -+Description: -+ [to be documented] -+ -+ -+What: /sys/devices/platform/dmi-ipmi-ssif.*/type -+Date: Sep, 2017 -+KernelVersion: v4.15 -+Contact: openipmi-developer@lists.sourceforge.net -+Description: -+ (RO) Shows the IMPI device interface type - "ssif" here. -+ -+ -+What: /sys/devices/platform/dmi-ipmi-ssif.*/hosed -+What: /sys/devices/platform/dmi-ipmi-ssif.*/alerts -+What: /sys/devices/platform/dmi-ipmi-ssif.*/sent_messages -+What: /sys/devices/platform/dmi-ipmi-ssif.*/sent_messages_parts -+What: /sys/devices/platform/dmi-ipmi-ssif.*/received_messages -+What: /sys/devices/platform/dmi-ipmi-ssif.*/received_message_parts -+What: /sys/devices/platform/dmi-ipmi-ssif.*/events -+What: /sys/devices/platform/dmi-ipmi-ssif.*/watchdog_pretimeouts -+What: /sys/devices/platform/dmi-ipmi-ssif.*/flag_fetches -+What: /sys/devices/platform/dmi-ipmi-ssif.*/send_retries -+What: /sys/devices/platform/dmi-ipmi-ssif.*/receive_retries -+What: /sys/devices/platform/dmi-ipmi-ssif.*/send_errors -+What: /sys/devices/platform/dmi-ipmi-ssif.*/receive_errors -+Date: Sep, 2017 -+KernelVersion: v4.15 -+Contact: openipmi-developer@lists.sourceforge.net -+Description: -+ hosed: (RO) Number of times the hardware didn't -+ follow the state machine. -+ -+ alerts: (RO) Number of alerts received. -+ -+ sent_messages: (RO) Number of total messages sent. -+ -+ sent_message_parts: (RO) Number of message parts sent. -+ Messages may be broken into parts if -+ they are long. -+ -+ receieved_messages: (RO) Number of message responses -+ received. -+ -+ received_message_parts: (RO) Number of message fragments -+ received. -+ -+ events: (RO) Number of received events. -+ -+ watchdog_pretimeouts: (RO) Number of watchdog pretimeouts. -+ -+ flag_fetches: (RO) Number of times a flag fetch was -+ requested. -+ -+ send_retries: (RO) Number of time a message was -+ retried. -+ -+ receive_retries: (RO) Number of times the receive of a -+ message was retried. -+ -+ send_errors: (RO) Number of times the send of a -+ message failed. -+ -+ receive_errors: (RO) Number of errors in receiving -+ messages. --- -2.14.3 - - -From 3b6d082f0dfc2b7b9def494d2ab67fd4d3862ea1 Mon Sep 17 00:00:00 2001 -From: Haiyue Wang <haiyue.wang@linux.intel.com> -Date: Mon, 26 Feb 2018 23:48:14 +0800 -Subject: [PATCH 5/9] ipmi: kcs_bmc: coding-style fixes and use new poll type - -Many for coding-style fixes, and update the poll API with the new -type '__poll_t', this is new commit from linux-4.16-rc1. - -Signed-off-by: Haiyue Wang <haiyue.wang@linux.intel.com> -Signed-off-by: Corey Minyard <cminyard@mvista.com> ---- - drivers/char/ipmi/kcs_bmc.c | 32 +++++++++++++++++--------------- - drivers/char/ipmi/kcs_bmc.h | 36 +++++++++++++++++++----------------- - drivers/char/ipmi/kcs_bmc_aspeed.c | 9 +++++---- - include/uapi/linux/ipmi_bmc.h | 8 +++++--- - 4 files changed, 46 insertions(+), 39 deletions(-) - -diff --git a/drivers/char/ipmi/kcs_bmc.c b/drivers/char/ipmi/kcs_bmc.c -index 6476bfb79f44..fbfc05e3f3d1 100644 ---- a/drivers/char/ipmi/kcs_bmc.c -+++ b/drivers/char/ipmi/kcs_bmc.c -@@ -1,5 +1,7 @@ - // SPDX-License-Identifier: GPL-2.0 --// Copyright (c) 2015-2018, Intel Corporation. -+/* -+ * Copyright (c) 2015-2018, Intel Corporation. -+ */ - - #define pr_fmt(fmt) "kcs-bmc: " fmt - -@@ -242,14 +244,14 @@ int kcs_bmc_handle_event(struct kcs_bmc *kcs_bmc) - } - EXPORT_SYMBOL(kcs_bmc_handle_event); - --static inline struct kcs_bmc *file_to_kcs_bmc(struct file *filp) -+static inline struct kcs_bmc *to_kcs_bmc(struct file *filp) - { - return container_of(filp->private_data, struct kcs_bmc, miscdev); - } - - static int kcs_bmc_open(struct inode *inode, struct file *filp) - { -- struct kcs_bmc *kcs_bmc = file_to_kcs_bmc(filp); -+ struct kcs_bmc *kcs_bmc = to_kcs_bmc(filp); - int ret = 0; - - spin_lock_irq(&kcs_bmc->lock); -@@ -262,25 +264,25 @@ static int kcs_bmc_open(struct inode *inode, struct file *filp) - return ret; - } - --static unsigned int kcs_bmc_poll(struct file *filp, poll_table *wait) -+static __poll_t kcs_bmc_poll(struct file *filp, poll_table *wait) - { -- struct kcs_bmc *kcs_bmc = file_to_kcs_bmc(filp); -- unsigned int mask = 0; -+ struct kcs_bmc *kcs_bmc = to_kcs_bmc(filp); -+ __poll_t mask = 0; - - poll_wait(filp, &kcs_bmc->queue, wait); - - spin_lock_irq(&kcs_bmc->lock); - if (kcs_bmc->data_in_avail) -- mask |= POLLIN; -+ mask |= EPOLLIN; - spin_unlock_irq(&kcs_bmc->lock); - - return mask; - } - --static ssize_t kcs_bmc_read(struct file *filp, char *buf, -- size_t count, loff_t *offset) -+static ssize_t kcs_bmc_read(struct file *filp, char __user *buf, -+ size_t count, loff_t *ppos) - { -- struct kcs_bmc *kcs_bmc = file_to_kcs_bmc(filp); -+ struct kcs_bmc *kcs_bmc = to_kcs_bmc(filp); - bool data_avail; - size_t data_len; - ssize_t ret; -@@ -339,10 +341,10 @@ static ssize_t kcs_bmc_read(struct file *filp, char *buf, - return ret; - } - --static ssize_t kcs_bmc_write(struct file *filp, const char *buf, -- size_t count, loff_t *offset) -+static ssize_t kcs_bmc_write(struct file *filp, const char __user *buf, -+ size_t count, loff_t *ppos) - { -- struct kcs_bmc *kcs_bmc = file_to_kcs_bmc(filp); -+ struct kcs_bmc *kcs_bmc = to_kcs_bmc(filp); - ssize_t ret; - - /* a minimum response size '3' : netfn + cmd + ccode */ -@@ -378,7 +380,7 @@ static ssize_t kcs_bmc_write(struct file *filp, const char *buf, - static long kcs_bmc_ioctl(struct file *filp, unsigned int cmd, - unsigned long arg) - { -- struct kcs_bmc *kcs_bmc = file_to_kcs_bmc(filp); -+ struct kcs_bmc *kcs_bmc = to_kcs_bmc(filp); - long ret = 0; - - spin_lock_irq(&kcs_bmc->lock); -@@ -410,7 +412,7 @@ static long kcs_bmc_ioctl(struct file *filp, unsigned int cmd, - - static int kcs_bmc_release(struct inode *inode, struct file *filp) - { -- struct kcs_bmc *kcs_bmc = file_to_kcs_bmc(filp); -+ struct kcs_bmc *kcs_bmc = to_kcs_bmc(filp); - - spin_lock_irq(&kcs_bmc->lock); - kcs_bmc->running = 0; -diff --git a/drivers/char/ipmi/kcs_bmc.h b/drivers/char/ipmi/kcs_bmc.h -index c19501db0236..eb9ea4ce78b8 100644 ---- a/drivers/char/ipmi/kcs_bmc.h -+++ b/drivers/char/ipmi/kcs_bmc.h -@@ -1,31 +1,33 @@ --// SPDX-License-Identifier: GPL-2.0 --// Copyright (c) 2015-2018, Intel Corporation. -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (c) 2015-2018, Intel Corporation. -+ */ - - #ifndef __KCS_BMC_H__ - #define __KCS_BMC_H__ - - #include <linux/miscdevice.h> - --/* Different phases of the KCS BMC module : -- * KCS_PHASE_IDLE : -+/* Different phases of the KCS BMC module. -+ * KCS_PHASE_IDLE: - * BMC should not be expecting nor sending any data. -- * KCS_PHASE_WRITE_START : -+ * KCS_PHASE_WRITE_START: - * BMC is receiving a WRITE_START command from system software. -- * KCS_PHASE_WRITE_DATA : -+ * KCS_PHASE_WRITE_DATA: - * BMC is receiving a data byte from system software. -- * KCS_PHASE_WRITE_END_CMD : -+ * KCS_PHASE_WRITE_END_CMD: - * BMC is waiting a last data byte from system software. -- * KCS_PHASE_WRITE_DONE : -+ * KCS_PHASE_WRITE_DONE: - * BMC has received the whole request from system software. -- * KCS_PHASE_WAIT_READ : -+ * KCS_PHASE_WAIT_READ: - * BMC is waiting the response from the upper IPMI service. -- * KCS_PHASE_READ : -+ * KCS_PHASE_READ: - * BMC is transferring the response to system software. -- * KCS_PHASE_ABORT_ERROR1 : -+ * KCS_PHASE_ABORT_ERROR1: - * BMC is waiting error status request from system software. -- * KCS_PHASE_ABORT_ERROR2 : -+ * KCS_PHASE_ABORT_ERROR2: - * BMC is waiting for idle status afer error from system software. -- * KCS_PHASE_ERROR : -+ * KCS_PHASE_ERROR: - * BMC has detected a protocol violation at the interface level. - */ - enum kcs_phases { -@@ -54,9 +56,9 @@ enum kcs_errors { - }; - - /* IPMI 2.0 - 9.5, KCS Interface Registers -- * @idr : Input Data Register -- * @odr : Output Data Register -- * @str : Status Register -+ * @idr: Input Data Register -+ * @odr: Output Data Register -+ * @str: Status Register - */ - struct kcs_ioreg { - u32 idr; -@@ -103,4 +105,4 @@ static inline void *kcs_bmc_priv(struct kcs_bmc *kcs_bmc) - int kcs_bmc_handle_event(struct kcs_bmc *kcs_bmc); - struct kcs_bmc *kcs_bmc_alloc(struct device *dev, int sizeof_priv, - u32 channel); --#endif -+#endif /* __KCS_BMC_H__ */ -diff --git a/drivers/char/ipmi/kcs_bmc_aspeed.c b/drivers/char/ipmi/kcs_bmc_aspeed.c -index 0c4d1a36dae4..3c955946e647 100644 ---- a/drivers/char/ipmi/kcs_bmc_aspeed.c -+++ b/drivers/char/ipmi/kcs_bmc_aspeed.c -@@ -1,5 +1,7 @@ - // SPDX-License-Identifier: GPL-2.0 --// Copyright (c) 2015-2018, Intel Corporation. -+/* -+ * Copyright (c) 2015-2018, Intel Corporation. -+ */ - - #define pr_fmt(fmt) "aspeed-kcs-bmc: " fmt - -@@ -301,19 +303,18 @@ static const struct of_device_id ast_kcs_bmc_match[] = { - { .compatible = "aspeed,ast2500-kcs-bmc" }, - { } - }; -+MODULE_DEVICE_TABLE(of, ast_kcs_bmc_match); - - static struct platform_driver ast_kcs_bmc_driver = { - .driver = { - .name = DEVICE_NAME, - .of_match_table = ast_kcs_bmc_match, - }, -- .probe = aspeed_kcs_probe, -+ .probe = aspeed_kcs_probe, - .remove = aspeed_kcs_remove, - }; -- - module_platform_driver(ast_kcs_bmc_driver); - --MODULE_DEVICE_TABLE(of, ast_kcs_bmc_match); - MODULE_LICENSE("GPL v2"); - MODULE_AUTHOR("Haiyue Wang <haiyue.wang@linux.intel.com>"); - MODULE_DESCRIPTION("Aspeed device interface to the KCS BMC device"); -diff --git a/include/uapi/linux/ipmi_bmc.h b/include/uapi/linux/ipmi_bmc.h -index 2f9f97e6123a..1670f0944227 100644 ---- a/include/uapi/linux/ipmi_bmc.h -+++ b/include/uapi/linux/ipmi_bmc.h -@@ -1,5 +1,7 @@ --// SPDX-License-Identifier: GPL-2.0 --// Copyright (c) 2015-2018, Intel Corporation. -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (c) 2015-2018, Intel Corporation. -+ */ - - #ifndef _UAPI_LINUX_IPMI_BMC_H - #define _UAPI_LINUX_IPMI_BMC_H -@@ -11,4 +13,4 @@ - #define IPMI_BMC_IOCTL_CLEAR_SMS_ATN _IO(__IPMI_BMC_IOCTL_MAGIC, 0x01) - #define IPMI_BMC_IOCTL_FORCE_ABORT _IO(__IPMI_BMC_IOCTL_MAGIC, 0x02) - --#endif /* _UAPI_LINUX_KCS_BMC_H */ -+#endif /* _UAPI_LINUX_IPMI_BMC_H */ --- -2.14.3 - - -From ad2575f8600d068edb10a9bef7f945482e3c5ca9 Mon Sep 17 00:00:00 2001 -From: Corey Minyard <cminyard@mvista.com> -Date: Mon, 26 Feb 2018 12:46:26 -0600 -Subject: [PATCH 6/9] ipmi:pci: Make the PCI defines consistent with normal - Linux ones - -Signed-off-by: Corey Minyard <cminyard@mvista.com> ---- - drivers/char/ipmi/ipmi_si_pci.c | 31 ++++++++++++++----------------- - 1 file changed, 14 insertions(+), 17 deletions(-) - -diff --git a/drivers/char/ipmi/ipmi_si_pci.c b/drivers/char/ipmi/ipmi_si_pci.c -index 27dd11c49d21..ad4e20b94c08 100644 ---- a/drivers/char/ipmi/ipmi_si_pci.c -+++ b/drivers/char/ipmi/ipmi_si_pci.c -@@ -17,16 +17,12 @@ module_param_named(trypci, si_trypci, bool, 0); - MODULE_PARM_DESC(trypci, "Setting this to zero will disable the" - " default scan of the interfaces identified via pci"); - --#define PCI_ERMC_CLASSCODE 0x0C0700 --#define PCI_ERMC_CLASSCODE_MASK 0xffffff00 --#define PCI_ERMC_CLASSCODE_TYPE_MASK 0xff --#define PCI_ERMC_CLASSCODE_TYPE_SMIC 0x00 --#define PCI_ERMC_CLASSCODE_TYPE_KCS 0x01 --#define PCI_ERMC_CLASSCODE_TYPE_BT 0x02 -+#define PCI_CLASS_SERIAL_IPMI 0x0c07 -+#define PCI_CLASS_SERIAL_IPMI_SMIC 0x0c0700 -+#define PCI_CLASS_SERIAL_IPMI_KCS 0x0c0701 -+#define PCI_CLASS_SERIAL_IPMI_BT 0x0c0702 - --#define PCI_HP_VENDOR_ID 0x103C --#define PCI_MMC_DEVICE_ID 0x121A --#define PCI_MMC_ADDR_CW 0x10 -+#define PCI_DEVICE_ID_HP_MMC 0x121A - - static void ipmi_pci_cleanup(struct si_sm_io *io) - { -@@ -69,28 +65,27 @@ static int ipmi_pci_probe(struct pci_dev *pdev, - const struct pci_device_id *ent) - { - int rv; -- int class_type = pdev->class & PCI_ERMC_CLASSCODE_TYPE_MASK; - struct si_sm_io io; - - memset(&io, 0, sizeof(io)); - io.addr_source = SI_PCI; - dev_info(&pdev->dev, "probing via PCI"); - -- switch (class_type) { -- case PCI_ERMC_CLASSCODE_TYPE_SMIC: -+ switch (pdev->class) { -+ case PCI_CLASS_SERIAL_IPMI_SMIC: - io.si_type = SI_SMIC; - break; - -- case PCI_ERMC_CLASSCODE_TYPE_KCS: -+ case PCI_CLASS_SERIAL_IPMI_KCS: - io.si_type = SI_KCS; - break; - -- case PCI_ERMC_CLASSCODE_TYPE_BT: -+ case PCI_CLASS_SERIAL_IPMI_BT: - io.si_type = SI_BT; - break; - - default: -- dev_info(&pdev->dev, "Unknown IPMI type: %d\n", class_type); -+ dev_info(&pdev->dev, "Unknown IPMI class: %x\n", pdev->class); - return -ENOMEM; - } - -@@ -138,8 +133,10 @@ static void ipmi_pci_remove(struct pci_dev *pdev) - } - - static const struct pci_device_id ipmi_pci_devices[] = { -- { PCI_DEVICE(PCI_HP_VENDOR_ID, PCI_MMC_DEVICE_ID) }, -- { PCI_DEVICE_CLASS(PCI_ERMC_CLASSCODE, PCI_ERMC_CLASSCODE_MASK) }, -+ { PCI_VDEVICE(HP, PCI_DEVICE_ID_HP_MMC) }, -+ { PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_IPMI_SMIC, ~0) }, -+ { PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_IPMI_KCS, ~0) }, -+ { PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_IPMI_BT, ~0) }, - { 0, } - }; - MODULE_DEVICE_TABLE(pci, ipmi_pci_devices); --- -2.14.3 - - -From 243ac21035176ac9692c1308a9f3b8f6a4e5d733 Mon Sep 17 00:00:00 2001 -From: Corey Minyard <cminyard@mvista.com> -Date: Tue, 20 Feb 2018 07:30:22 -0600 -Subject: [PATCH 8/9] ipmi: Add or fix SPDX-License-Identifier in all files - -And get rid of the license text that is no longer necessary. - -Signed-off-by: Corey Minyard <cminyard@mvista.com> -Cc: Kees Cook <keescook@chromium.org> -Cc: Alistair Popple <alistair@popple.id.au> -Cc: Jeremy Kerr <jk@ozlabs.org> -Cc: Joel Stanley <joel@jms.id.au> -Cc: Rocky Craig <rocky.craig@hp.com> ---- - drivers/char/ipmi/bt-bmc.c | 6 +----- - drivers/char/ipmi/ipmi_bt_sm.c | 22 ++-------------------- - drivers/char/ipmi/ipmi_devintf.c | 22 +--------------------- - drivers/char/ipmi/ipmi_dmi.c | 2 +- - drivers/char/ipmi/ipmi_dmi.h | 2 +- - drivers/char/ipmi/ipmi_kcs_sm.c | 22 +--------------------- - drivers/char/ipmi/ipmi_msghandler.c | 22 +--------------------- - drivers/char/ipmi/ipmi_powernv.c | 6 +----- - drivers/char/ipmi/ipmi_poweroff.c | 22 +--------------------- - drivers/char/ipmi/ipmi_si.h | 1 + - drivers/char/ipmi/ipmi_si_hardcode.c | 1 + - drivers/char/ipmi/ipmi_si_hotmod.c | 1 + - drivers/char/ipmi/ipmi_si_intf.c | 22 +--------------------- - drivers/char/ipmi/ipmi_si_mem_io.c | 1 + - drivers/char/ipmi/ipmi_si_parisc.c | 1 + - drivers/char/ipmi/ipmi_si_pci.c | 1 + - drivers/char/ipmi/ipmi_si_platform.c | 1 + - drivers/char/ipmi/ipmi_si_port_io.c | 1 + - drivers/char/ipmi/ipmi_si_sm.h | 22 +--------------------- - drivers/char/ipmi/ipmi_smic_sm.c | 24 ++---------------------- - drivers/char/ipmi/ipmi_ssif.c | 6 +----- - drivers/char/ipmi/ipmi_watchdog.c | 22 +--------------------- - include/linux/ipmi-fru.h | 3 +-- - include/linux/ipmi.h | 21 +-------------------- - include/linux/ipmi_smi.h | 21 +-------------------- - include/uapi/linux/ipmi.h | 20 -------------------- - include/uapi/linux/ipmi_msgdefs.h | 20 -------------------- - 27 files changed, 27 insertions(+), 288 deletions(-) - -diff --git a/drivers/char/ipmi/bt-bmc.c b/drivers/char/ipmi/bt-bmc.c -index c95b93b7598b..40b9927c072c 100644 ---- a/drivers/char/ipmi/bt-bmc.c -+++ b/drivers/char/ipmi/bt-bmc.c -@@ -1,10 +1,6 @@ -+// SPDX-License-Identifier: GPL-2.0+ - /* - * Copyright (c) 2015-2016, IBM Corporation. -- * -- * This program is free software; you can redistribute it and/or -- * modify it under the terms of the GNU General Public License -- * as published by the Free Software Foundation; either version -- * 2 of the License, or (at your option) any later version. - */ - - #include <linux/atomic.h> -diff --git a/drivers/char/ipmi/ipmi_bt_sm.c b/drivers/char/ipmi/ipmi_bt_sm.c -index feafdab734ae..fd4ea8d87d4b 100644 ---- a/drivers/char/ipmi/ipmi_bt_sm.c -+++ b/drivers/char/ipmi/ipmi_bt_sm.c -@@ -1,3 +1,4 @@ -+// SPDX-License-Identifier: GPL-2.0+ - /* - * ipmi_bt_sm.c - * -@@ -5,26 +6,7 @@ - * of the driver architecture at http://sourceforge.net/projects/openipmi - * - * Author: Rocky Craig <first.last@hp.com> -- * -- * This program is free software; you can redistribute it and/or modify it -- * under the terms of the GNU General Public License as published by the -- * Free Software Foundation; either version 2 of the License, or (at your -- * option) any later version. -- * -- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 675 Mass Ave, Cambridge, MA 02139, USA. */ -+ */ - - #include <linux/kernel.h> /* For printk. */ - #include <linux/string.h> -diff --git a/drivers/char/ipmi/ipmi_devintf.c b/drivers/char/ipmi/ipmi_devintf.c -index 5f1bc9174735..8ecfd47806fa 100644 ---- a/drivers/char/ipmi/ipmi_devintf.c -+++ b/drivers/char/ipmi/ipmi_devintf.c -@@ -1,3 +1,4 @@ -+// SPDX-License-Identifier: GPL-2.0+ - /* - * ipmi_devintf.c - * -@@ -8,27 +9,6 @@ - * source@mvista.com - * - * Copyright 2002 MontaVista Software Inc. -- * -- * This program is free software; you can redistribute it and/or modify it -- * under the terms of the GNU General Public License as published by the -- * Free Software Foundation; either version 2 of the License, or (at your -- * option) any later version. -- * -- * -- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - #include <linux/module.h> -diff --git a/drivers/char/ipmi/ipmi_dmi.c b/drivers/char/ipmi/ipmi_dmi.c -index f1df63bc859a..e2c143861b1e 100644 ---- a/drivers/char/ipmi/ipmi_dmi.c -+++ b/drivers/char/ipmi/ipmi_dmi.c -@@ -1,4 +1,4 @@ --// SPDX-License-Identifier: GPL-2.0 -+// SPDX-License-Identifier: GPL-2.0+ - /* - * A hack to create a platform device from a DMI entry. This will - * allow autoloading of the IPMI drive based on SMBIOS entries. -diff --git a/drivers/char/ipmi/ipmi_dmi.h b/drivers/char/ipmi/ipmi_dmi.h -index 6c21018e3668..8d2b094db8e6 100644 ---- a/drivers/char/ipmi/ipmi_dmi.h -+++ b/drivers/char/ipmi/ipmi_dmi.h -@@ -1,4 +1,4 @@ --/* SPDX-License-Identifier: GPL-2.0 */ -+/* SPDX-License-Identifier: GPL-2.0+ */ - /* - * DMI defines for use by IPMI - */ -diff --git a/drivers/char/ipmi/ipmi_kcs_sm.c b/drivers/char/ipmi/ipmi_kcs_sm.c -index 1da61af7f576..f4ea9f47230a 100644 ---- a/drivers/char/ipmi/ipmi_kcs_sm.c -+++ b/drivers/char/ipmi/ipmi_kcs_sm.c -@@ -1,3 +1,4 @@ -+// SPDX-License-Identifier: GPL-2.0+ - /* - * ipmi_kcs_sm.c - * -@@ -8,27 +9,6 @@ - * source@mvista.com - * - * Copyright 2002 MontaVista Software Inc. -- * -- * This program is free software; you can redistribute it and/or modify it -- * under the terms of the GNU General Public License as published by the -- * Free Software Foundation; either version 2 of the License, or (at your -- * option) any later version. -- * -- * -- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - /* -diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c -index e0b0d7e2d976..361148938801 100644 ---- a/drivers/char/ipmi/ipmi_msghandler.c -+++ b/drivers/char/ipmi/ipmi_msghandler.c -@@ -1,3 +1,4 @@ -+// SPDX-License-Identifier: GPL-2.0+ - /* - * ipmi_msghandler.c - * -@@ -8,27 +9,6 @@ - * source@mvista.com - * - * Copyright 2002 MontaVista Software Inc. -- * -- * This program is free software; you can redistribute it and/or modify it -- * under the terms of the GNU General Public License as published by the -- * Free Software Foundation; either version 2 of the License, or (at your -- * option) any later version. -- * -- * -- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - #include <linux/module.h> -diff --git a/drivers/char/ipmi/ipmi_powernv.c b/drivers/char/ipmi/ipmi_powernv.c -index bcf493d8e238..e96500372ce2 100644 ---- a/drivers/char/ipmi/ipmi_powernv.c -+++ b/drivers/char/ipmi/ipmi_powernv.c -@@ -1,12 +1,8 @@ -+// SPDX-License-Identifier: GPL-2.0+ - /* - * PowerNV OPAL IPMI driver - * - * Copyright 2014 IBM Corp. -- * -- * This program is free software; you can redistribute it and/or modify it -- * under the terms of the GNU General Public License as published by the Free -- * Software Foundation; either version 2 of the License, or (at your option) -- * any later version. - */ - - #define pr_fmt(fmt) "ipmi-powernv: " fmt -diff --git a/drivers/char/ipmi/ipmi_poweroff.c b/drivers/char/ipmi/ipmi_poweroff.c -index 38e6af1c8e38..07fa366bc8f0 100644 ---- a/drivers/char/ipmi/ipmi_poweroff.c -+++ b/drivers/char/ipmi/ipmi_poweroff.c -@@ -1,3 +1,4 @@ -+// SPDX-License-Identifier: GPL-2.0+ - /* - * ipmi_poweroff.c - * -@@ -9,27 +10,6 @@ - * source@mvista.com - * - * Copyright 2002,2004 MontaVista Software Inc. -- * -- * This program is free software; you can redistribute it and/or modify it -- * under the terms of the GNU General Public License as published by the -- * Free Software Foundation; either version 2 of the License, or (at your -- * option) any later version. -- * -- * -- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - #include <linux/module.h> - #include <linux/moduleparam.h> -diff --git a/drivers/char/ipmi/ipmi_si.h b/drivers/char/ipmi/ipmi_si.h -index 17ce5f7b89ab..52f6152d1fcb 100644 ---- a/drivers/char/ipmi/ipmi_si.h -+++ b/drivers/char/ipmi/ipmi_si.h -@@ -1,3 +1,4 @@ -+/* SPDX-License-Identifier: GPL-2.0+ */ - /* - * ipmi_si.h - * -diff --git a/drivers/char/ipmi/ipmi_si_hardcode.c b/drivers/char/ipmi/ipmi_si_hardcode.c -index fa9a4780de36..10219f24546b 100644 ---- a/drivers/char/ipmi/ipmi_si_hardcode.c -+++ b/drivers/char/ipmi/ipmi_si_hardcode.c -@@ -1,3 +1,4 @@ -+// SPDX-License-Identifier: GPL-2.0+ - - #include <linux/moduleparam.h> - #include "ipmi_si.h" -diff --git a/drivers/char/ipmi/ipmi_si_hotmod.c b/drivers/char/ipmi/ipmi_si_hotmod.c -index fc03b9be2f3d..a98ca42a50b1 100644 ---- a/drivers/char/ipmi/ipmi_si_hotmod.c -+++ b/drivers/char/ipmi/ipmi_si_hotmod.c -@@ -1,3 +1,4 @@ -+// SPDX-License-Identifier: GPL-2.0+ - /* - * ipmi_si_hotmod.c - * -diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c -index 6768cb2dd740..5141ccf0b958 100644 ---- a/drivers/char/ipmi/ipmi_si_intf.c -+++ b/drivers/char/ipmi/ipmi_si_intf.c -@@ -1,3 +1,4 @@ -+// SPDX-License-Identifier: GPL-2.0+ - /* - * ipmi_si.c - * -@@ -10,27 +11,6 @@ - * - * Copyright 2002 MontaVista Software Inc. - * Copyright 2006 IBM Corp., Christian Krafft <krafft@de.ibm.com> -- * -- * This program is free software; you can redistribute it and/or modify it -- * under the terms of the GNU General Public License as published by the -- * Free Software Foundation; either version 2 of the License, or (at your -- * option) any later version. -- * -- * -- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - /* -diff --git a/drivers/char/ipmi/ipmi_si_mem_io.c b/drivers/char/ipmi/ipmi_si_mem_io.c -index 8796396ecd0f..1b869d530884 100644 ---- a/drivers/char/ipmi/ipmi_si_mem_io.c -+++ b/drivers/char/ipmi/ipmi_si_mem_io.c -@@ -1,3 +1,4 @@ -+// SPDX-License-Identifier: GPL-2.0+ - - #include <linux/io.h> - #include "ipmi_si.h" -diff --git a/drivers/char/ipmi/ipmi_si_parisc.c b/drivers/char/ipmi/ipmi_si_parisc.c -index 6b10f0e18a95..f3c99820f564 100644 ---- a/drivers/char/ipmi/ipmi_si_parisc.c -+++ b/drivers/char/ipmi/ipmi_si_parisc.c -@@ -1,3 +1,4 @@ -+// SPDX-License-Identifier: GPL-2.0+ - - #include <linux/module.h> - #include <asm/hardware.h> /* for register_parisc_driver() stuff */ -diff --git a/drivers/char/ipmi/ipmi_si_pci.c b/drivers/char/ipmi/ipmi_si_pci.c -index ad4e20b94c08..b1c055540b26 100644 ---- a/drivers/char/ipmi/ipmi_si_pci.c -+++ b/drivers/char/ipmi/ipmi_si_pci.c -@@ -1,3 +1,4 @@ -+// SPDX-License-Identifier: GPL-2.0+ - /* - * ipmi_si_pci.c - * -diff --git a/drivers/char/ipmi/ipmi_si_platform.c b/drivers/char/ipmi/ipmi_si_platform.c -index f4214870d726..3d45bf1ee5bc 100644 ---- a/drivers/char/ipmi/ipmi_si_platform.c -+++ b/drivers/char/ipmi/ipmi_si_platform.c -@@ -1,3 +1,4 @@ -+// SPDX-License-Identifier: GPL-2.0+ - /* - * ipmi_si_platform.c - * -diff --git a/drivers/char/ipmi/ipmi_si_port_io.c b/drivers/char/ipmi/ipmi_si_port_io.c -index e5ce174fbeeb..ef6dffcea9fa 100644 ---- a/drivers/char/ipmi/ipmi_si_port_io.c -+++ b/drivers/char/ipmi/ipmi_si_port_io.c -@@ -1,3 +1,4 @@ -+// SPDX-License-Identifier: GPL-2.0+ - - #include <linux/io.h> - #include "ipmi_si.h" -diff --git a/drivers/char/ipmi/ipmi_si_sm.h b/drivers/char/ipmi/ipmi_si_sm.h -index aa8d88ab4433..aaddf047d923 100644 ---- a/drivers/char/ipmi/ipmi_si_sm.h -+++ b/drivers/char/ipmi/ipmi_si_sm.h -@@ -1,3 +1,4 @@ -+/* SPDX-License-Identifier: GPL-2.0+ */ - /* - * ipmi_si_sm.h - * -@@ -11,27 +12,6 @@ - * source@mvista.com - * - * Copyright 2002 MontaVista Software Inc. -- * -- * This program is free software; you can redistribute it and/or modify it -- * under the terms of the GNU General Public License as published by the -- * Free Software Foundation; either version 2 of the License, or (at your -- * option) any later version. -- * -- * -- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - #include <linux/ipmi.h> -diff --git a/drivers/char/ipmi/ipmi_smic_sm.c b/drivers/char/ipmi/ipmi_smic_sm.c -index 8f7c73ff58f2..466a5aac5298 100644 ---- a/drivers/char/ipmi/ipmi_smic_sm.c -+++ b/drivers/char/ipmi/ipmi_smic_sm.c -@@ -1,3 +1,4 @@ -+// SPDX-License-Identifier: GPL-2.0+ - /* - * ipmi_smic_sm.c - * -@@ -18,28 +19,7 @@ - * copyright notice: - * (c) Copyright 2001 Grant Grundler (c) Copyright - * 2001 Hewlett-Packard Company -- * -- * -- * This program is free software; you can redistribute it and/or modify it -- * under the terms of the GNU General Public License as published by the -- * Free Software Foundation; either version 2 of the License, or (at your -- * option) any later version. -- * -- * -- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 675 Mass Ave, Cambridge, MA 02139, USA. */ -+ */ - - #include <linux/kernel.h> /* For printk. */ - #include <linux/string.h> -diff --git a/drivers/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c -index f929e72bdac8..9d3b0fa27560 100644 ---- a/drivers/char/ipmi/ipmi_ssif.c -+++ b/drivers/char/ipmi/ipmi_ssif.c -@@ -1,3 +1,4 @@ -+// SPDX-License-Identifier: GPL-2.0+ - /* - * ipmi_ssif.c - * -@@ -13,11 +14,6 @@ - * - * Copyright 2003 Intel Corporation - * Copyright 2005 MontaVista Software -- * -- * This program is free software; you can redistribute it and/or modify it -- * under the terms of the GNU General Public License as published by the -- * Free Software Foundation; either version 2 of the License, or (at your -- * option) any later version. - */ - - /* -diff --git a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_watchdog.c -index a58acdcf7414..22bc287eac2d 100644 ---- a/drivers/char/ipmi/ipmi_watchdog.c -+++ b/drivers/char/ipmi/ipmi_watchdog.c -@@ -1,3 +1,4 @@ -+// SPDX-License-Identifier: GPL-2.0+ - /* - * ipmi_watchdog.c - * -@@ -8,27 +9,6 @@ - * source@mvista.com - * - * Copyright 2002 MontaVista Software Inc. -- * -- * This program is free software; you can redistribute it and/or modify it -- * under the terms of the GNU General Public License as published by the -- * Free Software Foundation; either version 2 of the License, or (at your -- * option) any later version. -- * -- * -- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - #include <linux/module.h> -diff --git a/include/linux/ipmi-fru.h b/include/linux/ipmi-fru.h -index 4d3a76380e32..05c9422624c6 100644 ---- a/include/linux/ipmi-fru.h -+++ b/include/linux/ipmi-fru.h -@@ -1,9 +1,8 @@ -+/* SPDX-License-Identifier: GPL-2.0+ */ - /* - * Copyright (C) 2012 CERN (www.cern.ch) - * Author: Alessandro Rubini <rubini@gnudd.com> - * -- * Released according to the GNU GPL, version 2 or any later version. -- * - * This work is part of the White Rabbit project, a research effort led - * by CERN, the European Institute for Nuclear Research. - */ -diff --git a/include/linux/ipmi.h b/include/linux/ipmi.h -index f4ffacf4fe9d..8b0626cec980 100644 ---- a/include/linux/ipmi.h -+++ b/include/linux/ipmi.h -@@ -1,3 +1,4 @@ -+/* SPDX-License-Identifier: GPL-2.0+ */ - /* - * ipmi.h - * -@@ -9,26 +10,6 @@ - * - * Copyright 2002 MontaVista Software Inc. - * -- * This program is free software; you can redistribute it and/or modify it -- * under the terms of the GNU General Public License as published by the -- * Free Software Foundation; either version 2 of the License, or (at your -- * option) any later version. -- * -- * -- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - #ifndef __LINUX_IPMI_H - #define __LINUX_IPMI_H -diff --git a/include/linux/ipmi_smi.h b/include/linux/ipmi_smi.h -index 5be51281e14d..af457b5a689e 100644 ---- a/include/linux/ipmi_smi.h -+++ b/include/linux/ipmi_smi.h -@@ -1,3 +1,4 @@ -+/* SPDX-License-Identifier: GPL-2.0+ */ - /* - * ipmi_smi.h - * -@@ -9,26 +10,6 @@ - * - * Copyright 2002 MontaVista Software Inc. - * -- * This program is free software; you can redistribute it and/or modify it -- * under the terms of the GNU General Public License as published by the -- * Free Software Foundation; either version 2 of the License, or (at your -- * option) any later version. -- * -- * -- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - #ifndef __LINUX_IPMI_SMI_H -diff --git a/include/uapi/linux/ipmi.h b/include/uapi/linux/ipmi.h -index b076f7a47407..32d148309b16 100644 ---- a/include/uapi/linux/ipmi.h -+++ b/include/uapi/linux/ipmi.h -@@ -10,26 +10,6 @@ - * - * Copyright 2002 MontaVista Software Inc. - * -- * This program is free software; you can redistribute it and/or modify it -- * under the terms of the GNU General Public License as published by the -- * Free Software Foundation; either version 2 of the License, or (at your -- * option) any later version. -- * -- * -- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - #ifndef _UAPI__LINUX_IPMI_H -diff --git a/include/uapi/linux/ipmi_msgdefs.h b/include/uapi/linux/ipmi_msgdefs.h -index 17f349459587..c2b23a9fdf3d 100644 ---- a/include/uapi/linux/ipmi_msgdefs.h -+++ b/include/uapi/linux/ipmi_msgdefs.h -@@ -10,26 +10,6 @@ - * - * Copyright 2002 MontaVista Software Inc. - * -- * This program is free software; you can redistribute it and/or modify it -- * under the terms of the GNU General Public License as published by the -- * Free Software Foundation; either version 2 of the License, or (at your -- * option) any later version. -- * -- * -- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- * -- * You should have received a copy of the GNU General Public License along -- * with this program; if not, write to the Free Software Foundation, Inc., -- * 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - #ifndef __LINUX_IPMI_MSGDEFS_H --- -2.14.3 - - -From 426fa6179dae677134dfb37b21d057819418515b Mon Sep 17 00:00:00 2001 -From: Corey Minyard <cminyard@mvista.com> -Date: Wed, 28 Feb 2018 08:09:49 -0600 -Subject: [PATCH 9/9] ipmi: Fix some error cleanup issues - -device_remove_group() was called on any cleanup, even if the -device attrs had not been added yet. That can occur in certain -error scenarios, so add a flag to know if it has been added. - -Also make sure we remove the dev if we added it ourselves. - -Signed-off-by: Corey Minyard <cminyard@mvista.com> -Cc: stable@vger.kernel.org # 4.15 ---- - drivers/char/ipmi/ipmi_si_intf.c | 18 ++++++++++++++---- - 1 file changed, 14 insertions(+), 4 deletions(-) - -diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c -index 5141ccf0b958..2b9f434775d4 100644 ---- a/drivers/char/ipmi/ipmi_si_intf.c -+++ b/drivers/char/ipmi/ipmi_si_intf.c -@@ -232,6 +232,9 @@ struct smi_info { - /* Default driver model device. */ - struct platform_device *pdev; - -+ /* Have we added the device group to the device? */ -+ bool dev_group_added; -+ - /* Counters and things for the proc filesystem. */ - atomic_t stats[SI_NUM_STATS]; - -@@ -2007,8 +2010,8 @@ int ipmi_si_add_smi(struct si_sm_io *io) - if (initialized) { - rv = try_smi_init(new_smi); - if (rv) { -- mutex_unlock(&smi_infos_lock); - cleanup_one_si(new_smi); -+ mutex_unlock(&smi_infos_lock); - return rv; - } - } -@@ -2167,6 +2170,7 @@ static int try_smi_init(struct smi_info *new_smi) - rv); - goto out_err_stop_timer; - } -+ new_smi->dev_group_added = true; - - rv = ipmi_register_smi(&handlers, - new_smi, -@@ -2220,7 +2224,10 @@ static int try_smi_init(struct smi_info *new_smi) - return 0; - - out_err_remove_attrs: -- device_remove_group(new_smi->io.dev, &ipmi_si_dev_attr_group); -+ if (new_smi->dev_group_added) { -+ device_remove_group(new_smi->io.dev, &ipmi_si_dev_attr_group); -+ new_smi->dev_group_added = false; -+ } - dev_set_drvdata(new_smi->io.dev, NULL); - - out_err_stop_timer: -@@ -2268,6 +2275,7 @@ static int try_smi_init(struct smi_info *new_smi) - else - platform_device_put(new_smi->pdev); - new_smi->pdev = NULL; -+ new_smi->io.dev = NULL; - } - - kfree(init_name); -@@ -2364,8 +2372,10 @@ static void cleanup_one_si(struct smi_info *to_clean) - } - } - -- device_remove_group(to_clean->io.dev, &ipmi_si_dev_attr_group); -- dev_set_drvdata(to_clean->io.dev, NULL); -+ if (to_clean->dev_group_added) -+ device_remove_group(to_clean->io.dev, &ipmi_si_dev_attr_group); -+ if (to_clean->io.dev) -+ dev_set_drvdata(to_clean->io.dev, NULL); - - list_del(&to_clean->link); - --- -2.14.3 - |