GNU Linux-libre 4.14.265-gnu1
[releases.git] / drivers / hid / intel-ish-hid / ishtp / hbm.h
1 /*
2  * ISHTP bus layer messages handling
3  *
4  * Copyright (c) 2003-2016, Intel Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13  * more details.
14  */
15
16 #ifndef _ISHTP_HBM_H_
17 #define _ISHTP_HBM_H_
18
19 #include <linux/uuid.h>
20
21 struct ishtp_device;
22 struct ishtp_msg_hdr;
23 struct ishtp_cl;
24
25 /*
26  * Timeouts in Seconds
27  */
28 #define ISHTP_INTEROP_TIMEOUT           7 /* Timeout on ready message */
29
30 #define ISHTP_CL_CONNECT_TIMEOUT        15 /* HPS: Client Connect Timeout */
31
32 /*
33  * ISHTP Version
34  */
35 #define HBM_MINOR_VERSION               0
36 #define HBM_MAJOR_VERSION               1
37
38 /* Host bus message command opcode */
39 #define ISHTP_HBM_CMD_OP_MSK            0x7f
40 /* Host bus message command RESPONSE */
41 #define ISHTP_HBM_CMD_RES_MSK           0x80
42
43 /*
44  * ISHTP Bus Message Command IDs
45  */
46 #define HOST_START_REQ_CMD              0x01
47 #define HOST_START_RES_CMD              0x81
48
49 #define HOST_STOP_REQ_CMD               0x02
50 #define HOST_STOP_RES_CMD               0x82
51
52 #define FW_STOP_REQ_CMD                 0x03
53
54 #define HOST_ENUM_REQ_CMD               0x04
55 #define HOST_ENUM_RES_CMD               0x84
56
57 #define HOST_CLIENT_PROPERTIES_REQ_CMD  0x05
58 #define HOST_CLIENT_PROPERTIES_RES_CMD  0x85
59
60 #define CLIENT_CONNECT_REQ_CMD          0x06
61 #define CLIENT_CONNECT_RES_CMD          0x86
62
63 #define CLIENT_DISCONNECT_REQ_CMD       0x07
64 #define CLIENT_DISCONNECT_RES_CMD       0x87
65
66 #define ISHTP_FLOW_CONTROL_CMD          0x08
67
68 #define DMA_BUFFER_ALLOC_NOTIFY         0x11
69 #define DMA_BUFFER_ALLOC_RESPONSE       0x91
70
71 #define DMA_XFER                        0x12
72 #define DMA_XFER_ACK                    0x92
73
74 /*
75  * ISHTP Stop Reason
76  * used by hbm_host_stop_request.reason
77  */
78 #define DRIVER_STOP_REQUEST             0x00
79
80 /*
81  * ISHTP BUS Interface Section
82  */
83 struct ishtp_msg_hdr {
84         uint32_t fw_addr:8;
85         uint32_t host_addr:8;
86         uint32_t length:9;
87         uint32_t reserved:6;
88         uint32_t msg_complete:1;
89 } __packed;
90
91 struct ishtp_bus_message {
92         uint8_t hbm_cmd;
93         uint8_t data[0];
94 } __packed;
95
96 /**
97  * struct hbm_cl_cmd - client specific host bus command
98  *      CONNECT, DISCONNECT, and FlOW CONTROL
99  *
100  * @hbm_cmd - bus message command header
101  * @fw_addr - address of the fw client
102  * @host_addr - address of the client in the driver
103  * @data
104  */
105 struct ishtp_hbm_cl_cmd {
106         uint8_t hbm_cmd;
107         uint8_t fw_addr;
108         uint8_t host_addr;
109         uint8_t data;
110 };
111
112 struct hbm_version {
113         uint8_t minor_version;
114         uint8_t major_version;
115 } __packed;
116
117 struct hbm_host_version_request {
118         uint8_t hbm_cmd;
119         uint8_t reserved;
120         struct hbm_version host_version;
121 } __packed;
122
123 struct hbm_host_version_response {
124         uint8_t hbm_cmd;
125         uint8_t host_version_supported;
126         struct hbm_version fw_max_version;
127 } __packed;
128
129 struct hbm_host_stop_request {
130         uint8_t hbm_cmd;
131         uint8_t reason;
132         uint8_t reserved[2];
133 } __packed;
134
135 struct hbm_host_stop_response {
136         uint8_t hbm_cmd;
137         uint8_t reserved[3];
138 } __packed;
139
140 struct hbm_host_enum_request {
141         uint8_t hbm_cmd;
142         uint8_t reserved[3];
143 } __packed;
144
145 struct hbm_host_enum_response {
146         uint8_t hbm_cmd;
147         uint8_t reserved[3];
148         uint8_t valid_addresses[32];
149 } __packed;
150
151 struct ishtp_client_properties {
152         uuid_le protocol_name;
153         uint8_t protocol_version;
154         uint8_t max_number_of_connections;
155         uint8_t fixed_address;
156         uint8_t single_recv_buf;
157         uint32_t max_msg_length;
158         uint8_t dma_hdr_len;
159 #define ISHTP_CLIENT_DMA_ENABLED        0x80
160         uint8_t reserved4;
161         uint8_t reserved5;
162         uint8_t reserved6;
163 } __packed;
164
165 struct hbm_props_request {
166         uint8_t hbm_cmd;
167         uint8_t address;
168         uint8_t reserved[2];
169 } __packed;
170
171 struct hbm_props_response {
172         uint8_t hbm_cmd;
173         uint8_t address;
174         uint8_t status;
175         uint8_t reserved[1];
176         struct ishtp_client_properties client_properties;
177 } __packed;
178
179 /**
180  * struct hbm_client_connect_request - connect/disconnect request
181  *
182  * @hbm_cmd - bus message command header
183  * @fw_addr - address of the fw client
184  * @host_addr - address of the client in the driver
185  * @reserved
186  */
187 struct hbm_client_connect_request {
188         uint8_t hbm_cmd;
189         uint8_t fw_addr;
190         uint8_t host_addr;
191         uint8_t reserved;
192 } __packed;
193
194 /**
195  * struct hbm_client_connect_response - connect/disconnect response
196  *
197  * @hbm_cmd - bus message command header
198  * @fw_addr - address of the fw client
199  * @host_addr - address of the client in the driver
200  * @status - status of the request
201  */
202 struct hbm_client_connect_response {
203         uint8_t hbm_cmd;
204         uint8_t fw_addr;
205         uint8_t host_addr;
206         uint8_t status;
207 } __packed;
208
209
210 #define ISHTP_FC_MESSAGE_RESERVED_LENGTH                5
211
212 struct hbm_flow_control {
213         uint8_t hbm_cmd;
214         uint8_t fw_addr;
215         uint8_t host_addr;
216         uint8_t reserved[ISHTP_FC_MESSAGE_RESERVED_LENGTH];
217 } __packed;
218
219 struct dma_alloc_notify {
220         uint8_t hbm;
221         uint8_t status;
222         uint8_t reserved[2];
223         uint32_t buf_size;
224         uint64_t buf_address;
225         /* [...] May come more size/address pairs */
226 } __packed;
227
228 struct dma_xfer_hbm {
229         uint8_t hbm;
230         uint8_t fw_client_id;
231         uint8_t host_client_id;
232         uint8_t reserved;
233         uint64_t msg_addr;
234         uint32_t msg_length;
235         uint32_t reserved2;
236 } __packed;
237
238 /* System state */
239 #define ISHTP_SYSTEM_STATE_CLIENT_ADDR          13
240
241 #define SYSTEM_STATE_SUBSCRIBE                  0x1
242 #define SYSTEM_STATE_STATUS                     0x2
243 #define SYSTEM_STATE_QUERY_SUBSCRIBERS          0x3
244 #define SYSTEM_STATE_STATE_CHANGE_REQ           0x4
245 /*indicates suspend and resume states*/
246 #define SUSPEND_STATE_BIT                       (1<<1)
247
248 struct ish_system_states_header {
249         uint32_t cmd;
250         uint32_t cmd_status;    /*responses will have this set*/
251 } __packed;
252
253 struct ish_system_states_subscribe {
254         struct ish_system_states_header hdr;
255         uint32_t states;
256 } __packed;
257
258 struct ish_system_states_status {
259         struct ish_system_states_header hdr;
260         uint32_t supported_states;
261         uint32_t states_status;
262 } __packed;
263
264 struct ish_system_states_query_subscribers {
265         struct ish_system_states_header hdr;
266 } __packed;
267
268 struct ish_system_states_state_change_req {
269         struct ish_system_states_header hdr;
270         uint32_t requested_states;
271         uint32_t states_status;
272 } __packed;
273
274 /**
275  * enum ishtp_hbm_state - host bus message protocol state
276  *
277  * @ISHTP_HBM_IDLE : protocol not started
278  * @ISHTP_HBM_START : start request message was sent
279  * @ISHTP_HBM_ENUM_CLIENTS : enumeration request was sent
280  * @ISHTP_HBM_CLIENT_PROPERTIES : acquiring clients properties
281  */
282 enum ishtp_hbm_state {
283         ISHTP_HBM_IDLE = 0,
284         ISHTP_HBM_START,
285         ISHTP_HBM_STARTED,
286         ISHTP_HBM_ENUM_CLIENTS,
287         ISHTP_HBM_CLIENT_PROPERTIES,
288         ISHTP_HBM_WORKING,
289         ISHTP_HBM_STOPPED,
290 };
291
292 static inline void ishtp_hbm_hdr(struct ishtp_msg_hdr *hdr, size_t length)
293 {
294         hdr->host_addr = 0;
295         hdr->fw_addr = 0;
296         hdr->length = length;
297         hdr->msg_complete = 1;
298         hdr->reserved = 0;
299 }
300
301 int ishtp_hbm_start_req(struct ishtp_device *dev);
302 int ishtp_hbm_start_wait(struct ishtp_device *dev);
303 int ishtp_hbm_cl_flow_control_req(struct ishtp_device *dev,
304                                   struct ishtp_cl *cl);
305 int ishtp_hbm_cl_disconnect_req(struct ishtp_device *dev, struct ishtp_cl *cl);
306 int ishtp_hbm_cl_connect_req(struct ishtp_device *dev, struct ishtp_cl *cl);
307 void ishtp_hbm_enum_clients_req(struct ishtp_device *dev);
308 void bh_hbm_work_fn(struct work_struct *work);
309 void recv_hbm(struct ishtp_device *dev, struct ishtp_msg_hdr *ishtp_hdr);
310 void recv_fixed_cl_msg(struct ishtp_device *dev,
311         struct ishtp_msg_hdr *ishtp_hdr);
312 void ishtp_hbm_dispatch(struct ishtp_device *dev,
313         struct ishtp_bus_message *hdr);
314
315 void ishtp_query_subscribers(struct ishtp_device *dev);
316
317 /* Exported I/F */
318 void ishtp_send_suspend(struct ishtp_device *dev);
319 void ishtp_send_resume(struct ishtp_device *dev);
320
321 #endif /* _ISHTP_HBM_H_ */