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 */ 23 enum 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 */ 38 enum 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 */ 48 struct 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 */ 58 struct 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 */ 68 struct 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 */ 78 struct 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 */ 88 struct 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 */ 101 union 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 */ 119 enum 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 */ 133 struct 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 */ 148 enum 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 */ 166 struct 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 */ 186 struct 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 */ 206 struct 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 */ 229 struct 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 */ 250 struct 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 */ 269 struct 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 */ 287 union 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. */ 297 struct 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 */ 335 int 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 */ 344 void 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 */ 354 bool 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 */ 364 bool 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 */ 375 struct 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 */ 385 bool 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 */ 395 struct 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 */ 406 void 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 */ 415 enum 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 */ 423 void 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 */ 432 enum ipc_mem_exec_stage 433 ipc_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 */ 442 u32 ipc_protocol_pm_dev_get_sleep_notification(struct iosm_protocol 443 *ipc_protocol); 444 #endif 445