| /* 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 |