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