kcs_bmc.h (faae6e391eda73a5b9870c78349064282a625bfa) kcs_bmc.h (d4e7ac68f771addc19352121706d8584eb0166cd)
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (c) 2015-2018, Intel Corporation.
4 */
5
6#ifndef __KCS_BMC_H__
7#define __KCS_BMC_H__
8
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (c) 2015-2018, Intel Corporation.
4 */
5
6#ifndef __KCS_BMC_H__
7#define __KCS_BMC_H__
8
9#include <linux/miscdevice.h>
9#include <linux/list.h>
10
10
11#include "kcs_bmc_client.h"
12
13#define KCS_BMC_STR_OBF BIT(0)
14#define KCS_BMC_STR_IBF BIT(1)
15#define KCS_BMC_STR_CMD_DAT BIT(3)
16
11#define KCS_BMC_STR_OBF BIT(0)
12#define KCS_BMC_STR_IBF BIT(1)
13#define KCS_BMC_STR_CMD_DAT BIT(3)
14
17/* Different phases of the KCS BMC module.
18 * KCS_PHASE_IDLE:
19 * BMC should not be expecting nor sending any data.
20 * KCS_PHASE_WRITE_START:
21 * BMC is receiving a WRITE_START command from system software.
22 * KCS_PHASE_WRITE_DATA:
23 * BMC is receiving a data byte from system software.
24 * KCS_PHASE_WRITE_END_CMD:
25 * BMC is waiting a last data byte from system software.
26 * KCS_PHASE_WRITE_DONE:
27 * BMC has received the whole request from system software.
28 * KCS_PHASE_WAIT_READ:
29 * BMC is waiting the response from the upper IPMI service.
30 * KCS_PHASE_READ:
31 * BMC is transferring the response to system software.
32 * KCS_PHASE_ABORT_ERROR1:
33 * BMC is waiting error status request from system software.
34 * KCS_PHASE_ABORT_ERROR2:
35 * BMC is waiting for idle status afer error from system software.
36 * KCS_PHASE_ERROR:
37 * BMC has detected a protocol violation at the interface level.
38 */
39enum kcs_phases {
40 KCS_PHASE_IDLE,
41
42 KCS_PHASE_WRITE_START,
43 KCS_PHASE_WRITE_DATA,
44 KCS_PHASE_WRITE_END_CMD,
45 KCS_PHASE_WRITE_DONE,
46
47 KCS_PHASE_WAIT_READ,
48 KCS_PHASE_READ,
49
50 KCS_PHASE_ABORT_ERROR1,
51 KCS_PHASE_ABORT_ERROR2,
52 KCS_PHASE_ERROR
53};
54
55/* IPMI 2.0 - Table 9-4, KCS Interface Status Codes */
56enum kcs_errors {
57 KCS_NO_ERROR = 0x00,
58 KCS_ABORTED_BY_COMMAND = 0x01,
59 KCS_ILLEGAL_CONTROL_CODE = 0x02,
60 KCS_LENGTH_ERROR = 0x06,
61 KCS_UNSPECIFIED_ERROR = 0xFF
62};
63
64/* IPMI 2.0 - 9.5, KCS Interface Registers
65 * @idr: Input Data Register
66 * @odr: Output Data Register
67 * @str: Status Register
68 */
69struct kcs_ioreg {
70 u32 idr;
71 u32 odr;
72 u32 str;
73};
74
75struct kcs_bmc_device_ops;
15/* IPMI 2.0 - 9.5, KCS Interface Registers
16 * @idr: Input Data Register
17 * @odr: Output Data Register
18 * @str: Status Register
19 */
20struct kcs_ioreg {
21 u32 idr;
22 u32 odr;
23 u32 str;
24};
25
26struct kcs_bmc_device_ops;
27struct kcs_bmc_client;
76
28
77struct kcs_bmc {
78 struct device *dev;
29struct kcs_bmc_device {
30 struct list_head entry;
79
31
80 const struct kcs_bmc_device_ops *ops;
81
82 struct kcs_bmc_client client;
83
84 spinlock_t lock;
85
32 struct device *dev;
86 u32 channel;
33 u32 channel;
87 int running;
88
89 struct kcs_ioreg ioreg;
90
34
35 struct kcs_ioreg ioreg;
36
91 enum kcs_phases phase;
92 enum kcs_errors error;
37 const struct kcs_bmc_device_ops *ops;
93
38
94 wait_queue_head_t queue;
95 bool data_in_avail;
96 int data_in_idx;
97 u8 *data_in;
98
99 int data_out_idx;
100 int data_out_len;
101 u8 *data_out;
102
103 struct mutex mutex;
104 u8 *kbuffer;
105
106 struct miscdevice miscdev;
39 spinlock_t lock;
40 struct kcs_bmc_client *client;
107};
41};
42
108#endif /* __KCS_BMC_H__ */
43#endif /* __KCS_BMC_H__ */