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