445 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			445 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0-only
 | |
|  *
 | |
|  * Copyright (C) 2020-21 Intel Corporation.
 | |
|  */
 | |
| 
 | |
| #ifndef IOSM_IPC_PROTOCOL_OPS_H
 | |
| #define IOSM_IPC_PROTOCOL_OPS_H
 | |
| 
 | |
| #define SIZE_MASK 0x00FFFFFF
 | |
| #define COMPLETION_STATUS 24
 | |
| #define RESET_BIT 7
 | |
| 
 | |
| /**
 | |
|  * enum ipc_mem_td_cs - Completion status of a TD
 | |
|  * @IPC_MEM_TD_CS_INVALID:	      Initial status - td not yet used.
 | |
|  * @IPC_MEM_TD_CS_PARTIAL_TRANSFER:   More data pending -> next TD used for this
 | |
|  * @IPC_MEM_TD_CS_END_TRANSFER:	      IO transfer is complete.
 | |
|  * @IPC_MEM_TD_CS_OVERFLOW:	      IO transfer to small for the buff to write
 | |
|  * @IPC_MEM_TD_CS_ABORT:	      TD marked as abort and shall be discarded
 | |
|  *				      by AP.
 | |
|  * @IPC_MEM_TD_CS_ERROR:	      General error.
 | |
|  */
 | |
| enum ipc_mem_td_cs {
 | |
| 	IPC_MEM_TD_CS_INVALID,
 | |
| 	IPC_MEM_TD_CS_PARTIAL_TRANSFER,
 | |
| 	IPC_MEM_TD_CS_END_TRANSFER,
 | |
| 	IPC_MEM_TD_CS_OVERFLOW,
 | |
| 	IPC_MEM_TD_CS_ABORT,
 | |
| 	IPC_MEM_TD_CS_ERROR,
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * enum ipc_mem_msg_cs - Completion status of IPC Message
 | |
|  * @IPC_MEM_MSG_CS_INVALID:	Initial status.
 | |
|  * @IPC_MEM_MSG_CS_SUCCESS:	IPC Message completion success.
 | |
|  * @IPC_MEM_MSG_CS_ERROR:	Message send error.
 | |
|  */
 | |
| enum ipc_mem_msg_cs {
 | |
| 	IPC_MEM_MSG_CS_INVALID,
 | |
| 	IPC_MEM_MSG_CS_SUCCESS,
 | |
| 	IPC_MEM_MSG_CS_ERROR,
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct ipc_msg_prep_args_pipe - struct for pipe args for message preparation
 | |
|  * @pipe:	Pipe to open/close
 | |
|  */
 | |
| struct ipc_msg_prep_args_pipe {
 | |
| 	struct ipc_pipe *pipe;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct ipc_msg_prep_args_sleep - struct for sleep args for message
 | |
|  *				    preparation
 | |
|  * @target:	0=host, 1=device
 | |
|  * @state:	0=enter sleep, 1=exit sleep
 | |
|  */
 | |
| struct ipc_msg_prep_args_sleep {
 | |
| 	unsigned int target;
 | |
| 	unsigned int state;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct ipc_msg_prep_feature_set - struct for feature set argument for
 | |
|  *				     message preparation
 | |
|  * @reset_enable:	0=out-of-band, 1=in-band-crash notification
 | |
|  */
 | |
| struct ipc_msg_prep_feature_set {
 | |
| 	u8 reset_enable;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct ipc_msg_prep_map - struct for map argument for message preparation
 | |
|  * @region_id:	Region to map
 | |
|  * @addr:	Pcie addr of region to map
 | |
|  * @size:	Size of the region to map
 | |
|  */
 | |
| struct ipc_msg_prep_map {
 | |
| 	unsigned int region_id;
 | |
| 	unsigned long addr;
 | |
| 	size_t size;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct ipc_msg_prep_unmap - struct for unmap argument for message preparation
 | |
|  * @region_id:	Region to unmap
 | |
|  */
 | |
| struct ipc_msg_prep_unmap {
 | |
| 	unsigned int region_id;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct ipc_msg_prep_args - Union to handle different message types
 | |
|  * @pipe_open:		Pipe open message preparation struct
 | |
|  * @pipe_close:		Pipe close message preparation struct
 | |
|  * @sleep:		Sleep message preparation struct
 | |
|  * @feature_set:	Feature set message preparation struct
 | |
|  * @map:		Memory map message preparation struct
 | |
|  * @unmap:		Memory unmap message preparation struct
 | |
|  */
 | |
| union ipc_msg_prep_args {
 | |
| 	struct ipc_msg_prep_args_pipe pipe_open;
 | |
| 	struct ipc_msg_prep_args_pipe pipe_close;
 | |
| 	struct ipc_msg_prep_args_sleep sleep;
 | |
| 	struct ipc_msg_prep_feature_set feature_set;
 | |
| 	struct ipc_msg_prep_map map;
 | |
| 	struct ipc_msg_prep_unmap unmap;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * enum ipc_msg_prep_type - Enum for message prepare actions
 | |
|  * @IPC_MSG_PREP_SLEEP:		Sleep message preparation type
 | |
|  * @IPC_MSG_PREP_PIPE_OPEN:	Pipe open message preparation type
 | |
|  * @IPC_MSG_PREP_PIPE_CLOSE:	Pipe close message preparation type
 | |
|  * @IPC_MSG_PREP_FEATURE_SET:	Feature set message preparation type
 | |
|  * @IPC_MSG_PREP_MAP:		Memory map message preparation type
 | |
|  * @IPC_MSG_PREP_UNMAP:		Memory unmap message preparation type
 | |
|  */
 | |
| enum ipc_msg_prep_type {
 | |
| 	IPC_MSG_PREP_SLEEP,
 | |
| 	IPC_MSG_PREP_PIPE_OPEN,
 | |
| 	IPC_MSG_PREP_PIPE_CLOSE,
 | |
| 	IPC_MSG_PREP_FEATURE_SET,
 | |
| 	IPC_MSG_PREP_MAP,
 | |
| 	IPC_MSG_PREP_UNMAP,
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct ipc_rsp - Response to sent message
 | |
|  * @completion:	For waking up requestor
 | |
|  * @status:	Completion status
 | |
|  */
 | |
| struct ipc_rsp {
 | |
| 	struct completion completion;
 | |
| 	enum ipc_mem_msg_cs status;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * enum ipc_mem_msg - Type-definition of the messages.
 | |
|  * @IPC_MEM_MSG_OPEN_PIPE:	AP ->CP: Open a pipe
 | |
|  * @IPC_MEM_MSG_CLOSE_PIPE:	AP ->CP: Close a pipe
 | |
|  * @IPC_MEM_MSG_ABORT_PIPE:	AP ->CP: wait for completion of the
 | |
|  *				running transfer and abort all pending
 | |
|  *				IO-transfers for the pipe
 | |
|  * @IPC_MEM_MSG_SLEEP:		AP ->CP: host enter or exit sleep
 | |
|  * @IPC_MEM_MSG_FEATURE_SET:	AP ->CP: Intel feature configuration
 | |
|  */
 | |
| enum ipc_mem_msg {
 | |
| 	IPC_MEM_MSG_OPEN_PIPE = 0x01,
 | |
| 	IPC_MEM_MSG_CLOSE_PIPE = 0x02,
 | |
| 	IPC_MEM_MSG_ABORT_PIPE = 0x03,
 | |
| 	IPC_MEM_MSG_SLEEP = 0x04,
 | |
| 	IPC_MEM_MSG_FEATURE_SET = 0xF0,
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct ipc_mem_msg_open_pipe - Message structure for open pipe
 | |
|  * @tdr_addr:			Tdr address
 | |
|  * @tdr_entries:		Tdr entries
 | |
|  * @pipe_nr:			Pipe number
 | |
|  * @type_of_message:		Message type
 | |
|  * @irq_vector:			MSI vector number
 | |
|  * @accumulation_backoff:	Time in usec for data accumalation
 | |
|  * @completion_status:		Message Completion Status
 | |
|  */
 | |
| struct ipc_mem_msg_open_pipe {
 | |
| 	__le64 tdr_addr;
 | |
| 	__le16 tdr_entries;
 | |
| 	u8 pipe_nr;
 | |
| 	u8 type_of_message;
 | |
| 	__le32 irq_vector;
 | |
| 	__le32 accumulation_backoff;
 | |
| 	__le32 completion_status;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct ipc_mem_msg_close_pipe - Message structure for close pipe
 | |
|  * @reserved1:			Reserved
 | |
|  * @reserved2:			Reserved
 | |
|  * @pipe_nr:			Pipe number
 | |
|  * @type_of_message:		Message type
 | |
|  * @reserved3:			Reserved
 | |
|  * @reserved4:			Reserved
 | |
|  * @completion_status:		Message Completion Status
 | |
|  */
 | |
| struct ipc_mem_msg_close_pipe {
 | |
| 	__le32 reserved1[2];
 | |
| 	__le16 reserved2;
 | |
| 	u8 pipe_nr;
 | |
| 	u8 type_of_message;
 | |
| 	__le32  reserved3;
 | |
| 	__le32 reserved4;
 | |
| 	__le32 completion_status;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct ipc_mem_msg_abort_pipe - Message structure for abort pipe
 | |
|  * @reserved1:			Reserved
 | |
|  * @reserved2:			Reserved
 | |
|  * @pipe_nr:			Pipe number
 | |
|  * @type_of_message:		Message type
 | |
|  * @reserved3:			Reserved
 | |
|  * @reserved4:			Reserved
 | |
|  * @completion_status:		Message Completion Status
 | |
|  */
 | |
| struct ipc_mem_msg_abort_pipe {
 | |
| 	__le32  reserved1[2];
 | |
| 	__le16 reserved2;
 | |
| 	u8 pipe_nr;
 | |
| 	u8 type_of_message;
 | |
| 	__le32 reserved3;
 | |
| 	__le32 reserved4;
 | |
| 	__le32 completion_status;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct ipc_mem_msg_host_sleep - Message structure for sleep message.
 | |
|  * @reserved1:		Reserved
 | |
|  * @target:		0=host, 1=device, host or EP devie
 | |
|  *			is the message target
 | |
|  * @state:		0=enter sleep, 1=exit sleep,
 | |
|  *			2=enter sleep no protocol
 | |
|  * @reserved2:		Reserved
 | |
|  * @type_of_message:	Message type
 | |
|  * @reserved3:		Reserved
 | |
|  * @reserved4:		Reserved
 | |
|  * @completion_status:	Message Completion Status
 | |
|  */
 | |
| struct ipc_mem_msg_host_sleep {
 | |
| 	__le32 reserved1[2];
 | |
| 	u8 target;
 | |
| 	u8 state;
 | |
| 	u8 reserved2;
 | |
| 	u8 type_of_message;
 | |
| 	__le32 reserved3;
 | |
| 	__le32 reserved4;
 | |
| 	__le32 completion_status;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct ipc_mem_msg_feature_set - Message structure for feature_set message
 | |
|  * @reserved1:			Reserved
 | |
|  * @reserved2:			Reserved
 | |
|  * @reset_enable:		0=out-of-band, 1=in-band-crash notification
 | |
|  * @type_of_message:		Message type
 | |
|  * @reserved3:			Reserved
 | |
|  * @reserved4:			Reserved
 | |
|  * @completion_status:		Message Completion Status
 | |
|  */
 | |
| struct ipc_mem_msg_feature_set {
 | |
| 	__le32 reserved1[2];
 | |
| 	__le16 reserved2;
 | |
| 	u8 reset_enable;
 | |
| 	u8 type_of_message;
 | |
| 	__le32 reserved3;
 | |
| 	__le32 reserved4;
 | |
| 	__le32 completion_status;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * struct ipc_mem_msg_common - Message structure for completion status update.
 | |
|  * @reserved1:			Reserved
 | |
|  * @reserved2:			Reserved
 | |
|  * @type_of_message:		Message type
 | |
|  * @reserved3:			Reserved
 | |
|  * @reserved4:			Reserved
 | |
|  * @completion_status:		Message Completion Status
 | |
|  */
 | |
| struct ipc_mem_msg_common {
 | |
| 	__le32 reserved1[2];
 | |
| 	u8 reserved2[3];
 | |
| 	u8 type_of_message;
 | |
| 	__le32 reserved3;
 | |
| 	__le32 reserved4;
 | |
| 	__le32 completion_status;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * union ipc_mem_msg_entry - Union with all possible messages.
 | |
|  * @open_pipe:		Open pipe message struct
 | |
|  * @close_pipe:		Close pipe message struct
 | |
|  * @abort_pipe:		Abort pipe message struct
 | |
|  * @host_sleep:		Host sleep message struct
 | |
|  * @feature_set:	Featuer set message struct
 | |
|  * @common:		Used to access msg_type and to set the completion status
 | |
|  */
 | |
| union ipc_mem_msg_entry {
 | |
| 	struct ipc_mem_msg_open_pipe open_pipe;
 | |
| 	struct ipc_mem_msg_close_pipe close_pipe;
 | |
| 	struct ipc_mem_msg_abort_pipe abort_pipe;
 | |
| 	struct ipc_mem_msg_host_sleep host_sleep;
 | |
| 	struct ipc_mem_msg_feature_set feature_set;
 | |
| 	struct ipc_mem_msg_common common;
 | |
| };
 | |
| 
 | |
| /* Transfer descriptor definition. */
 | |
| struct ipc_protocol_td {
 | |
| 	union {
 | |
| 		/*   0 :  63 - 64-bit address of a buffer in host memory. */
 | |
| 		dma_addr_t address;
 | |
| 		struct {
 | |
| 			/*   0 :  31 - 32 bit address */
 | |
| 			__le32 address;
 | |
| 			/*  32 :  63 - corresponding descriptor */
 | |
| 			__le32 desc;
 | |
| 		} __packed shm;
 | |
| 	} buffer;
 | |
| 
 | |
| 	/*	0 - 2nd byte - Size of the buffer.
 | |
| 	 *	The host provides the size of the buffer queued.
 | |
| 	 *	The EP device reads this value and shall update
 | |
| 	 *	it for downlink transfers to indicate the
 | |
| 	 *	amount of data written in buffer.
 | |
| 	 *	3rd byte - This field provides the completion status
 | |
| 	 *	of the TD. When queuing the TD, the host sets
 | |
| 	 *	the status to 0. The EP device updates this
 | |
| 	 *	field when completing the TD.
 | |
| 	 */
 | |
| 	__le32 scs;
 | |
| 
 | |
| 	/*	0th - nr of following descriptors
 | |
| 	 *	1 - 3rd byte - reserved
 | |
| 	 */
 | |
| 	__le32 next;
 | |
| } __packed;
 | |
| 
 | |
| /**
 | |
|  * ipc_protocol_msg_prep - Prepare message based upon message type
 | |
|  * @ipc_imem:	iosm_protocol instance
 | |
|  * @msg_type:	message prepare type
 | |
|  * @args:	message arguments
 | |
|  *
 | |
|  * Return: 0 on success and failure value on error
 | |
|  */
 | |
| int ipc_protocol_msg_prep(struct iosm_imem *ipc_imem,
 | |
| 			  enum ipc_msg_prep_type msg_type,
 | |
| 			  union ipc_msg_prep_args *args);
 | |
| 
 | |
| /**
 | |
|  * ipc_protocol_msg_hp_update - Function for head pointer update
 | |
|  *				of message ring
 | |
|  * @ipc_imem:	iosm_protocol instance
 | |
|  */
 | |
| void ipc_protocol_msg_hp_update(struct iosm_imem *ipc_imem);
 | |
| 
 | |
| /**
 | |
|  * ipc_protocol_msg_process - Function for processing responses
 | |
|  *			      to IPC messages
 | |
|  * @ipc_imem:	iosm_protocol instance
 | |
|  * @irq:	IRQ vector
 | |
|  *
 | |
|  * Return:	True on success, false if error
 | |
|  */
 | |
| bool ipc_protocol_msg_process(struct iosm_imem *ipc_imem, int irq);
 | |
| 
 | |
| /**
 | |
|  * ipc_protocol_ul_td_send - Function for sending the data to CP
 | |
|  * @ipc_protocol:	iosm_protocol instance
 | |
|  * @pipe:		Pipe instance
 | |
|  * @p_ul_list:		uplink sk_buff list
 | |
|  *
 | |
|  * Return: true in success, false in case of error
 | |
|  */
 | |
| bool ipc_protocol_ul_td_send(struct iosm_protocol *ipc_protocol,
 | |
| 			     struct ipc_pipe *pipe,
 | |
| 			     struct sk_buff_head *p_ul_list);
 | |
| 
 | |
| /**
 | |
|  * ipc_protocol_ul_td_process - Function for processing the sent data
 | |
|  * @ipc_protocol:	iosm_protocol instance
 | |
|  * @pipe:		Pipe instance
 | |
|  *
 | |
|  * Return: sk_buff instance
 | |
|  */
 | |
| struct sk_buff *ipc_protocol_ul_td_process(struct iosm_protocol *ipc_protocol,
 | |
| 					   struct ipc_pipe *pipe);
 | |
| 
 | |
| /**
 | |
|  * ipc_protocol_dl_td_prepare - Function for providing DL TDs to CP
 | |
|  * @ipc_protocol:	iosm_protocol instance
 | |
|  * @pipe:		Pipe instance
 | |
|  *
 | |
|  * Return: true in success, false in case of error
 | |
|  */
 | |
| bool ipc_protocol_dl_td_prepare(struct iosm_protocol *ipc_protocol,
 | |
| 				struct ipc_pipe *pipe);
 | |
| 
 | |
| /**
 | |
|  * ipc_protocol_dl_td_process - Function for processing the DL data
 | |
|  * @ipc_protocol:	iosm_protocol instance
 | |
|  * @pipe:		Pipe instance
 | |
|  *
 | |
|  * Return: sk_buff instance
 | |
|  */
 | |
| struct sk_buff *ipc_protocol_dl_td_process(struct iosm_protocol *ipc_protocol,
 | |
| 					   struct ipc_pipe *pipe);
 | |
| 
 | |
| /**
 | |
|  * ipc_protocol_get_head_tail_index - Function for getting Head and Tail
 | |
|  *				      pointer index of given pipe
 | |
|  * @ipc_protocol:	iosm_protocol instance
 | |
|  * @pipe:		Pipe Instance
 | |
|  * @head:		head pointer index of the given pipe
 | |
|  * @tail:		tail pointer index of the given pipe
 | |
|  */
 | |
| void ipc_protocol_get_head_tail_index(struct iosm_protocol *ipc_protocol,
 | |
| 				      struct ipc_pipe *pipe, u32 *head,
 | |
| 				      u32 *tail);
 | |
| /**
 | |
|  * ipc_protocol_get_ipc_status - Function for getting the IPC Status
 | |
|  * @ipc_protocol:	iosm_protocol instance
 | |
|  *
 | |
|  * Return: Returns IPC State
 | |
|  */
 | |
| enum ipc_mem_device_ipc_state ipc_protocol_get_ipc_status(struct iosm_protocol
 | |
| 							  *ipc_protocol);
 | |
| 
 | |
| /**
 | |
|  * ipc_protocol_pipe_cleanup - Function to cleanup pipe resources
 | |
|  * @ipc_protocol:	iosm_protocol instance
 | |
|  * @pipe:		Pipe instance
 | |
|  */
 | |
| void ipc_protocol_pipe_cleanup(struct iosm_protocol *ipc_protocol,
 | |
| 			       struct ipc_pipe *pipe);
 | |
| 
 | |
| /**
 | |
|  * ipc_protocol_get_ap_exec_stage - Function for getting AP Exec Stage
 | |
|  * @ipc_protocol:	pointer to struct iosm protocol
 | |
|  *
 | |
|  * Return: returns BOOT Stages
 | |
|  */
 | |
| enum ipc_mem_exec_stage
 | |
| ipc_protocol_get_ap_exec_stage(struct iosm_protocol *ipc_protocol);
 | |
| 
 | |
| /**
 | |
|  * ipc_protocol_pm_dev_get_sleep_notification - Function for getting Dev Sleep
 | |
|  *						notification
 | |
|  * @ipc_protocol:	iosm_protocol instance
 | |
|  *
 | |
|  * Return: Returns dev PM State
 | |
|  */
 | |
| u32 ipc_protocol_pm_dev_get_sleep_notification(struct iosm_protocol
 | |
| 					       *ipc_protocol);
 | |
| #endif
 |