Commit 20d60f61 authored by Haiyue Wang's avatar Haiyue Wang Committed by Corey Minyard

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: default avatarHaiyue 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: default avatarCorey Minyard <cminyard@mvista.com>
parent e1171aca
......@@ -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
......
......@@ -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
This diff is collapsed.
// 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
// 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 */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment