cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

iosm_ipc_protocol_ops.h (12407B)


      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