xref: /openbmc/linux/drivers/char/ipmi/kcs_bmc.h (revision faae6e39)
13b6d082fSHaiyue Wang /* SPDX-License-Identifier: GPL-2.0 */
23b6d082fSHaiyue Wang /*
33b6d082fSHaiyue Wang  * Copyright (c) 2015-2018, Intel Corporation.
43b6d082fSHaiyue Wang  */
520d60f61SHaiyue Wang 
620d60f61SHaiyue Wang #ifndef __KCS_BMC_H__
720d60f61SHaiyue Wang #define __KCS_BMC_H__
820d60f61SHaiyue Wang 
920d60f61SHaiyue Wang #include <linux/miscdevice.h>
1020d60f61SHaiyue Wang 
11*faae6e39SAndrew Jeffery #include "kcs_bmc_client.h"
12*faae6e39SAndrew Jeffery 
13*faae6e39SAndrew Jeffery #define KCS_BMC_STR_OBF		BIT(0)
14*faae6e39SAndrew Jeffery #define KCS_BMC_STR_IBF		BIT(1)
15*faae6e39SAndrew Jeffery #define KCS_BMC_STR_CMD_DAT	BIT(3)
16*faae6e39SAndrew Jeffery 
173b6d082fSHaiyue Wang /* Different phases of the KCS BMC module.
1820d60f61SHaiyue Wang  *  KCS_PHASE_IDLE:
1920d60f61SHaiyue Wang  *            BMC should not be expecting nor sending any data.
2020d60f61SHaiyue Wang  *  KCS_PHASE_WRITE_START:
2120d60f61SHaiyue Wang  *            BMC is receiving a WRITE_START command from system software.
2220d60f61SHaiyue Wang  *  KCS_PHASE_WRITE_DATA:
2320d60f61SHaiyue Wang  *            BMC is receiving a data byte from system software.
2420d60f61SHaiyue Wang  *  KCS_PHASE_WRITE_END_CMD:
2520d60f61SHaiyue Wang  *            BMC is waiting a last data byte from system software.
2620d60f61SHaiyue Wang  *  KCS_PHASE_WRITE_DONE:
2720d60f61SHaiyue Wang  *            BMC has received the whole request from system software.
2820d60f61SHaiyue Wang  *  KCS_PHASE_WAIT_READ:
2920d60f61SHaiyue Wang  *            BMC is waiting the response from the upper IPMI service.
3020d60f61SHaiyue Wang  *  KCS_PHASE_READ:
3120d60f61SHaiyue Wang  *            BMC is transferring the response to system software.
3220d60f61SHaiyue Wang  *  KCS_PHASE_ABORT_ERROR1:
3320d60f61SHaiyue Wang  *            BMC is waiting error status request from system software.
3420d60f61SHaiyue Wang  *  KCS_PHASE_ABORT_ERROR2:
3520d60f61SHaiyue Wang  *            BMC is waiting for idle status afer error from system software.
3620d60f61SHaiyue Wang  *  KCS_PHASE_ERROR:
3720d60f61SHaiyue Wang  *            BMC has detected a protocol violation at the interface level.
3820d60f61SHaiyue Wang  */
3920d60f61SHaiyue Wang enum kcs_phases {
4020d60f61SHaiyue Wang 	KCS_PHASE_IDLE,
4120d60f61SHaiyue Wang 
4220d60f61SHaiyue Wang 	KCS_PHASE_WRITE_START,
4320d60f61SHaiyue Wang 	KCS_PHASE_WRITE_DATA,
4420d60f61SHaiyue Wang 	KCS_PHASE_WRITE_END_CMD,
4520d60f61SHaiyue Wang 	KCS_PHASE_WRITE_DONE,
4620d60f61SHaiyue Wang 
4720d60f61SHaiyue Wang 	KCS_PHASE_WAIT_READ,
4820d60f61SHaiyue Wang 	KCS_PHASE_READ,
4920d60f61SHaiyue Wang 
5020d60f61SHaiyue Wang 	KCS_PHASE_ABORT_ERROR1,
5120d60f61SHaiyue Wang 	KCS_PHASE_ABORT_ERROR2,
5220d60f61SHaiyue Wang 	KCS_PHASE_ERROR
5320d60f61SHaiyue Wang };
5420d60f61SHaiyue Wang 
5520d60f61SHaiyue Wang /* IPMI 2.0 - Table 9-4, KCS Interface Status Codes */
5620d60f61SHaiyue Wang enum kcs_errors {
5720d60f61SHaiyue Wang 	KCS_NO_ERROR                = 0x00,
5820d60f61SHaiyue Wang 	KCS_ABORTED_BY_COMMAND      = 0x01,
5920d60f61SHaiyue Wang 	KCS_ILLEGAL_CONTROL_CODE    = 0x02,
6020d60f61SHaiyue Wang 	KCS_LENGTH_ERROR            = 0x06,
6120d60f61SHaiyue Wang 	KCS_UNSPECIFIED_ERROR       = 0xFF
6220d60f61SHaiyue Wang };
6320d60f61SHaiyue Wang 
6420d60f61SHaiyue Wang /* IPMI 2.0 - 9.5, KCS Interface Registers
6520d60f61SHaiyue Wang  * @idr: Input Data Register
6620d60f61SHaiyue Wang  * @odr: Output Data Register
6720d60f61SHaiyue Wang  * @str: Status Register
6820d60f61SHaiyue Wang  */
6920d60f61SHaiyue Wang struct kcs_ioreg {
7020d60f61SHaiyue Wang 	u32 idr;
7120d60f61SHaiyue Wang 	u32 odr;
7220d60f61SHaiyue Wang 	u32 str;
7320d60f61SHaiyue Wang };
7420d60f61SHaiyue Wang 
75*faae6e39SAndrew Jeffery struct kcs_bmc_device_ops;
76*faae6e39SAndrew Jeffery 
7720d60f61SHaiyue Wang struct kcs_bmc {
78d7096970SAndrew Jeffery 	struct device *dev;
79d7096970SAndrew Jeffery 
80*faae6e39SAndrew Jeffery 	const struct kcs_bmc_device_ops *ops;
81*faae6e39SAndrew Jeffery 
82*faae6e39SAndrew Jeffery 	struct kcs_bmc_client client;
83*faae6e39SAndrew Jeffery 
8420d60f61SHaiyue Wang 	spinlock_t lock;
8520d60f61SHaiyue Wang 
8620d60f61SHaiyue Wang 	u32 channel;
8720d60f61SHaiyue Wang 	int running;
8820d60f61SHaiyue Wang 
8920d60f61SHaiyue Wang 	struct kcs_ioreg ioreg;
9020d60f61SHaiyue Wang 
9120d60f61SHaiyue Wang 	enum kcs_phases phase;
9220d60f61SHaiyue Wang 	enum kcs_errors error;
9320d60f61SHaiyue Wang 
9420d60f61SHaiyue Wang 	wait_queue_head_t queue;
9520d60f61SHaiyue Wang 	bool data_in_avail;
9620d60f61SHaiyue Wang 	int  data_in_idx;
9720d60f61SHaiyue Wang 	u8  *data_in;
9820d60f61SHaiyue Wang 
9920d60f61SHaiyue Wang 	int  data_out_idx;
10020d60f61SHaiyue Wang 	int  data_out_len;
10120d60f61SHaiyue Wang 	u8  *data_out;
10220d60f61SHaiyue Wang 
10320d60f61SHaiyue Wang 	struct mutex mutex;
10420d60f61SHaiyue Wang 	u8 *kbuffer;
10520d60f61SHaiyue Wang 
10620d60f61SHaiyue Wang 	struct miscdevice miscdev;
10720d60f61SHaiyue Wang };
1083b6d082fSHaiyue Wang #endif /* __KCS_BMC_H__ */
109