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