1/* SPDX-License-Identifier: GPL-2.0-only
2 *
3 * Copyright (C) 2020-21 Intel Corporation.
4 */
5
6#ifndef IOSM_IPC_PROTOCOL_OPS_H
7#define IOSM_IPC_PROTOCOL_OPS_H
8
9#define SIZE_MASK 0x00FFFFFF
10#define COMPLETION_STATUS 24
11#define RESET_BIT 7
12
13/**
14 * enum ipc_mem_td_cs - Completion status of a TD
15 * @IPC_MEM_TD_CS_INVALID:	      Initial status - td not yet used.
16 * @IPC_MEM_TD_CS_PARTIAL_TRANSFER:   More data pending -> next TD used for this
17 * @IPC_MEM_TD_CS_END_TRANSFER:	      IO transfer is complete.
18 * @IPC_MEM_TD_CS_OVERFLOW:	      IO transfer to small for the buff to write
19 * @IPC_MEM_TD_CS_ABORT:	      TD marked as abort and shall be discarded
20 *				      by AP.
21 * @IPC_MEM_TD_CS_ERROR:	      General error.
22 */
23enum ipc_mem_td_cs {
24	IPC_MEM_TD_CS_INVALID,
25	IPC_MEM_TD_CS_PARTIAL_TRANSFER,
26	IPC_MEM_TD_CS_END_TRANSFER,
27	IPC_MEM_TD_CS_OVERFLOW,
28	IPC_MEM_TD_CS_ABORT,
29	IPC_MEM_TD_CS_ERROR,
30};
31
32/**
33 * enum ipc_mem_msg_cs - Completion status of IPC Message
34 * @IPC_MEM_MSG_CS_INVALID:	Initial status.
35 * @IPC_MEM_MSG_CS_SUCCESS:	IPC Message completion success.
36 * @IPC_MEM_MSG_CS_ERROR:	Message send error.
37 */
38enum ipc_mem_msg_cs {
39	IPC_MEM_MSG_CS_INVALID,
40	IPC_MEM_MSG_CS_SUCCESS,
41	IPC_MEM_MSG_CS_ERROR,
42};
43
44/**
45 * struct ipc_msg_prep_args_pipe - struct for pipe args for message preparation
46 * @pipe:	Pipe to open/close
47 */
48struct ipc_msg_prep_args_pipe {
49	struct ipc_pipe *pipe;
50};
51
52/**
53 * struct ipc_msg_prep_args_sleep - struct for sleep args for message
54 *				    preparation
55 * @target:	0=host, 1=device
56 * @state:	0=enter sleep, 1=exit sleep
57 */
58struct ipc_msg_prep_args_sleep {
59	unsigned int target;
60	unsigned int state;
61};
62
63/**
64 * struct ipc_msg_prep_feature_set - struct for feature set argument for
65 *				     message preparation
66 * @reset_enable:	0=out-of-band, 1=in-band-crash notification
67 */
68struct ipc_msg_prep_feature_set {
69	u8 reset_enable;
70};
71
72/**
73 * struct ipc_msg_prep_map - struct for map argument for message preparation
74 * @region_id:	Region to map
75 * @addr:	Pcie addr of region to map
76 * @size:	Size of the region to map
77 */
78struct ipc_msg_prep_map {
79	unsigned int region_id;
80	unsigned long addr;
81	size_t size;
82};
83
84/**
85 * struct ipc_msg_prep_unmap - struct for unmap argument for message preparation
86 * @region_id:	Region to unmap
87 */
88struct ipc_msg_prep_unmap {
89	unsigned int region_id;
90};
91
92/**
93 * struct ipc_msg_prep_args - Union to handle different message types
94 * @pipe_open:		Pipe open message preparation struct
95 * @pipe_close:		Pipe close message preparation struct
96 * @sleep:		Sleep message preparation struct
97 * @feature_set:	Feature set message preparation struct
98 * @map:		Memory map message preparation struct
99 * @unmap:		Memory unmap message preparation struct
100 */
101union ipc_msg_prep_args {
102	struct ipc_msg_prep_args_pipe pipe_open;
103	struct ipc_msg_prep_args_pipe pipe_close;
104	struct ipc_msg_prep_args_sleep sleep;
105	struct ipc_msg_prep_feature_set feature_set;
106	struct ipc_msg_prep_map map;
107	struct ipc_msg_prep_unmap unmap;
108};
109
110/**
111 * enum ipc_msg_prep_type - Enum for message prepare actions
112 * @IPC_MSG_PREP_SLEEP:		Sleep message preparation type
113 * @IPC_MSG_PREP_PIPE_OPEN:	Pipe open message preparation type
114 * @IPC_MSG_PREP_PIPE_CLOSE:	Pipe close message preparation type
115 * @IPC_MSG_PREP_FEATURE_SET:	Feature set message preparation type
116 * @IPC_MSG_PREP_MAP:		Memory map message preparation type
117 * @IPC_MSG_PREP_UNMAP:		Memory unmap message preparation type
118 */
119enum ipc_msg_prep_type {
120	IPC_MSG_PREP_SLEEP,
121	IPC_MSG_PREP_PIPE_OPEN,
122	IPC_MSG_PREP_PIPE_CLOSE,
123	IPC_MSG_PREP_FEATURE_SET,
124	IPC_MSG_PREP_MAP,
125	IPC_MSG_PREP_UNMAP,
126};
127
128/**
129 * struct ipc_rsp - Response to sent message
130 * @completion:	For waking up requestor
131 * @status:	Completion status
132 */
133struct ipc_rsp {
134	struct completion completion;
135	enum ipc_mem_msg_cs status;
136};
137
138/**
139 * enum ipc_mem_msg - Type-definition of the messages.
140 * @IPC_MEM_MSG_OPEN_PIPE:	AP ->CP: Open a pipe
141 * @IPC_MEM_MSG_CLOSE_PIPE:	AP ->CP: Close a pipe
142 * @IPC_MEM_MSG_ABORT_PIPE:	AP ->CP: wait for completion of the
143 *				running transfer and abort all pending
144 *				IO-transfers for the pipe
145 * @IPC_MEM_MSG_SLEEP:		AP ->CP: host enter or exit sleep
146 * @IPC_MEM_MSG_FEATURE_SET:	AP ->CP: Intel feature configuration
147 */
148enum ipc_mem_msg {
149	IPC_MEM_MSG_OPEN_PIPE = 0x01,
150	IPC_MEM_MSG_CLOSE_PIPE = 0x02,
151	IPC_MEM_MSG_ABORT_PIPE = 0x03,
152	IPC_MEM_MSG_SLEEP = 0x04,
153	IPC_MEM_MSG_FEATURE_SET = 0xF0,
154};
155
156/**
157 * struct ipc_mem_msg_open_pipe - Message structure for open pipe
158 * @tdr_addr:			Tdr address
159 * @tdr_entries:		Tdr entries
160 * @pipe_nr:			Pipe number
161 * @type_of_message:		Message type
162 * @irq_vector:			MSI vector number
163 * @accumulation_backoff:	Time in usec for data accumalation
164 * @completion_status:		Message Completion Status
165 */
166struct ipc_mem_msg_open_pipe {
167	__le64 tdr_addr;
168	__le16 tdr_entries;
169	u8 pipe_nr;
170	u8 type_of_message;
171	__le32 irq_vector;
172	__le32 accumulation_backoff;
173	__le32 completion_status;
174};
175
176/**
177 * struct ipc_mem_msg_close_pipe - Message structure for close pipe
178 * @reserved1:			Reserved
179 * @reserved2:			Reserved
180 * @pipe_nr:			Pipe number
181 * @type_of_message:		Message type
182 * @reserved3:			Reserved
183 * @reserved4:			Reserved
184 * @completion_status:		Message Completion Status
185 */
186struct ipc_mem_msg_close_pipe {
187	__le32 reserved1[2];
188	__le16 reserved2;
189	u8 pipe_nr;
190	u8 type_of_message;
191	__le32  reserved3;
192	__le32 reserved4;
193	__le32 completion_status;
194};
195
196/**
197 * struct ipc_mem_msg_abort_pipe - Message structure for abort pipe
198 * @reserved1:			Reserved
199 * @reserved2:			Reserved
200 * @pipe_nr:			Pipe number
201 * @type_of_message:		Message type
202 * @reserved3:			Reserved
203 * @reserved4:			Reserved
204 * @completion_status:		Message Completion Status
205 */
206struct ipc_mem_msg_abort_pipe {
207	__le32  reserved1[2];
208	__le16 reserved2;
209	u8 pipe_nr;
210	u8 type_of_message;
211	__le32 reserved3;
212	__le32 reserved4;
213	__le32 completion_status;
214};
215
216/**
217 * struct ipc_mem_msg_host_sleep - Message structure for sleep message.
218 * @reserved1:		Reserved
219 * @target:		0=host, 1=device, host or EP devie
220 *			is the message target
221 * @state:		0=enter sleep, 1=exit sleep,
222 *			2=enter sleep no protocol
223 * @reserved2:		Reserved
224 * @type_of_message:	Message type
225 * @reserved3:		Reserved
226 * @reserved4:		Reserved
227 * @completion_status:	Message Completion Status
228 */
229struct ipc_mem_msg_host_sleep {
230	__le32 reserved1[2];
231	u8 target;
232	u8 state;
233	u8 reserved2;
234	u8 type_of_message;
235	__le32 reserved3;
236	__le32 reserved4;
237	__le32 completion_status;
238};
239
240/**
241 * struct ipc_mem_msg_feature_set - Message structure for feature_set message
242 * @reserved1:			Reserved
243 * @reserved2:			Reserved
244 * @reset_enable:		0=out-of-band, 1=in-band-crash notification
245 * @type_of_message:		Message type
246 * @reserved3:			Reserved
247 * @reserved4:			Reserved
248 * @completion_status:		Message Completion Status
249 */
250struct ipc_mem_msg_feature_set {
251	__le32 reserved1[2];
252	__le16 reserved2;
253	u8 reset_enable;
254	u8 type_of_message;
255	__le32 reserved3;
256	__le32 reserved4;
257	__le32 completion_status;
258};
259
260/**
261 * struct ipc_mem_msg_common - Message structure for completion status update.
262 * @reserved1:			Reserved
263 * @reserved2:			Reserved
264 * @type_of_message:		Message type
265 * @reserved3:			Reserved
266 * @reserved4:			Reserved
267 * @completion_status:		Message Completion Status
268 */
269struct ipc_mem_msg_common {
270	__le32 reserved1[2];
271	u8 reserved2[3];
272	u8 type_of_message;
273	__le32 reserved3;
274	__le32 reserved4;
275	__le32 completion_status;
276};
277
278/**
279 * union ipc_mem_msg_entry - Union with all possible messages.
280 * @open_pipe:		Open pipe message struct
281 * @close_pipe:		Close pipe message struct
282 * @abort_pipe:		Abort pipe message struct
283 * @host_sleep:		Host sleep message struct
284 * @feature_set:	Featuer set message struct
285 * @common:		Used to access msg_type and to set the completion status
286 */
287union ipc_mem_msg_entry {
288	struct ipc_mem_msg_open_pipe open_pipe;
289	struct ipc_mem_msg_close_pipe close_pipe;
290	struct ipc_mem_msg_abort_pipe abort_pipe;
291	struct ipc_mem_msg_host_sleep host_sleep;
292	struct ipc_mem_msg_feature_set feature_set;
293	struct ipc_mem_msg_common common;
294};
295
296/* Transfer descriptor definition. */
297struct ipc_protocol_td {
298	union {
299		/*   0 :  63 - 64-bit address of a buffer in host memory. */
300		dma_addr_t address;
301		struct {
302			/*   0 :  31 - 32 bit address */
303			__le32 address;
304			/*  32 :  63 - corresponding descriptor */
305			__le32 desc;
306		} __packed shm;
307	} buffer;
308
309	/*	0 - 2nd byte - Size of the buffer.
310	 *	The host provides the size of the buffer queued.
311	 *	The EP device reads this value and shall update
312	 *	it for downlink transfers to indicate the
313	 *	amount of data written in buffer.
314	 *	3rd byte - This field provides the completion status
315	 *	of the TD. When queuing the TD, the host sets
316	 *	the status to 0. The EP device updates this
317	 *	field when completing the TD.
318	 */
319	__le32 scs;
320
321	/*	0th - nr of following descriptors
322	 *	1 - 3rd byte - reserved
323	 */
324	__le32 next;
325} __packed;
326
327/**
328 * ipc_protocol_msg_prep - Prepare message based upon message type
329 * @ipc_imem:	iosm_protocol instance
330 * @msg_type:	message prepare type
331 * @args:	message arguments
332 *
333 * Return: 0 on success and failure value on error
334 */
335int ipc_protocol_msg_prep(struct iosm_imem *ipc_imem,
336			  enum ipc_msg_prep_type msg_type,
337			  union ipc_msg_prep_args *args);
338
339/**
340 * ipc_protocol_msg_hp_update - Function for head pointer update
341 *				of message ring
342 * @ipc_imem:	iosm_protocol instance
343 */
344void ipc_protocol_msg_hp_update(struct iosm_imem *ipc_imem);
345
346/**
347 * ipc_protocol_msg_process - Function for processing responses
348 *			      to IPC messages
349 * @ipc_imem:	iosm_protocol instance
350 * @irq:	IRQ vector
351 *
352 * Return:	True on success, false if error
353 */
354bool ipc_protocol_msg_process(struct iosm_imem *ipc_imem, int irq);
355
356/**
357 * ipc_protocol_ul_td_send - Function for sending the data to CP
358 * @ipc_protocol:	iosm_protocol instance
359 * @pipe:		Pipe instance
360 * @p_ul_list:		uplink sk_buff list
361 *
362 * Return: true in success, false in case of error
363 */
364bool ipc_protocol_ul_td_send(struct iosm_protocol *ipc_protocol,
365			     struct ipc_pipe *pipe,
366			     struct sk_buff_head *p_ul_list);
367
368/**
369 * ipc_protocol_ul_td_process - Function for processing the sent data
370 * @ipc_protocol:	iosm_protocol instance
371 * @pipe:		Pipe instance
372 *
373 * Return: sk_buff instance
374 */
375struct sk_buff *ipc_protocol_ul_td_process(struct iosm_protocol *ipc_protocol,
376					   struct ipc_pipe *pipe);
377
378/**
379 * ipc_protocol_dl_td_prepare - Function for providing DL TDs to CP
380 * @ipc_protocol:	iosm_protocol instance
381 * @pipe:		Pipe instance
382 *
383 * Return: true in success, false in case of error
384 */
385bool ipc_protocol_dl_td_prepare(struct iosm_protocol *ipc_protocol,
386				struct ipc_pipe *pipe);
387
388/**
389 * ipc_protocol_dl_td_process - Function for processing the DL data
390 * @ipc_protocol:	iosm_protocol instance
391 * @pipe:		Pipe instance
392 *
393 * Return: sk_buff instance
394 */
395struct sk_buff *ipc_protocol_dl_td_process(struct iosm_protocol *ipc_protocol,
396					   struct ipc_pipe *pipe);
397
398/**
399 * ipc_protocol_get_head_tail_index - Function for getting Head and Tail
400 *				      pointer index of given pipe
401 * @ipc_protocol:	iosm_protocol instance
402 * @pipe:		Pipe Instance
403 * @head:		head pointer index of the given pipe
404 * @tail:		tail pointer index of the given pipe
405 */
406void ipc_protocol_get_head_tail_index(struct iosm_protocol *ipc_protocol,
407				      struct ipc_pipe *pipe, u32 *head,
408				      u32 *tail);
409/**
410 * ipc_protocol_get_ipc_status - Function for getting the IPC Status
411 * @ipc_protocol:	iosm_protocol instance
412 *
413 * Return: Returns IPC State
414 */
415enum ipc_mem_device_ipc_state ipc_protocol_get_ipc_status(struct iosm_protocol
416							  *ipc_protocol);
417
418/**
419 * ipc_protocol_pipe_cleanup - Function to cleanup pipe resources
420 * @ipc_protocol:	iosm_protocol instance
421 * @pipe:		Pipe instance
422 */
423void ipc_protocol_pipe_cleanup(struct iosm_protocol *ipc_protocol,
424			       struct ipc_pipe *pipe);
425
426/**
427 * ipc_protocol_get_ap_exec_stage - Function for getting AP Exec Stage
428 * @ipc_protocol:	pointer to struct iosm protocol
429 *
430 * Return: returns BOOT Stages
431 */
432enum ipc_mem_exec_stage
433ipc_protocol_get_ap_exec_stage(struct iosm_protocol *ipc_protocol);
434
435/**
436 * ipc_protocol_pm_dev_get_sleep_notification - Function for getting Dev Sleep
437 *						notification
438 * @ipc_protocol:	iosm_protocol instance
439 *
440 * Return: Returns dev PM State
441 */
442u32 ipc_protocol_pm_dev_get_sleep_notification(struct iosm_protocol
443					       *ipc_protocol);
444#endif
445