diff options
author | Haiyue Wang <haiyue.wang@linux.intel.com> | 2018-02-02 10:16:10 +0800 |
---|---|---|
committer | Corey Minyard <cminyard@mvista.com> | 2018-02-26 09:21:28 -0600 |
commit | 20d60f61c58e8c937f3653819816dd203e6e3cb4 (patch) | |
tree | 1c3bd754e43f96688297f23953f0d25309f6412d /drivers/char/ipmi/kcs_bmc.h | |
parent | e1171aca7da6407c0e65ffb1f38509ee4486a3e7 (diff) |
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>
Diffstat (limited to 'drivers/char/ipmi/kcs_bmc.h')
-rw-r--r-- | drivers/char/ipmi/kcs_bmc.h | 106 |
1 files changed, 106 insertions, 0 deletions
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 |