mirror of
https://github.com/torvalds/linux.git
synced 2024-12-11 21:52:04 +00:00
64516f633b
1) Update UL/DL transfer descriptors in message ring. 2) Define message set for pipe/sleep protocol. Signed-off-by: M Chetan Kumar <m.chetan.kumar@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
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
|