2461 lines
79 KiB
Diff
2461 lines
79 KiB
Diff
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
|
||
|