1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (C) 2020 - 2025 Intel Corporation 4 */ 5 6 #ifndef IPU7_FW_MSG_ABI_H 7 #define IPU7_FW_MSG_ABI_H 8 9 #include "ipu7_fw_common_abi.h" 10 11 #pragma pack(push, 1) 12 enum ipu7_msg_type { 13 IPU_MSG_TYPE_RESERVED = IA_GOFO_MSG_TYPE_RESERVED, 14 IPU_MSG_TYPE_INDIRECT = IA_GOFO_MSG_TYPE_INDIRECT, 15 IPU_MSG_TYPE_DEV_LOG = IA_GOFO_MSG_TYPE_LOG, 16 IPU_MSG_TYPE_GENERAL_ERR = IA_GOFO_MSG_TYPE_GENERAL_ERR, 17 IPU_MSG_TYPE_DEV_OPEN = 4, 18 IPU_MSG_TYPE_DEV_OPEN_ACK = 5, 19 IPU_MSG_TYPE_GRAPH_OPEN = 6, 20 IPU_MSG_TYPE_GRAPH_OPEN_ACK = 7, 21 IPU_MSG_TYPE_TASK_REQ = 8, 22 IPU_MSG_TYPE_TASK_DONE = 9, 23 IPU_MSG_TYPE_GRAPH_CLOSE = 10, 24 IPU_MSG_TYPE_GRAPH_CLOSE_ACK = 11, 25 IPU_MSG_TYPE_DEV_CLOSE = 12, 26 IPU_MSG_TYPE_DEV_CLOSE_ACK = 13, 27 IPU_MSG_TYPE_TERM_EVENT = 14, 28 IPU_MSG_TYPE_N, 29 }; 30 31 #define IPU_MSG_MAX_NODE_TERMS (64U) 32 #define IPU_MSG_MAX_FRAGS (7U) 33 34 enum ipu7_msg_node_type { 35 IPU_MSG_NODE_TYPE_PAD = 0, 36 IPU_MSG_NODE_TYPE_BASE, 37 IPU_MSG_NODE_TYPE_N 38 }; 39 40 #define IPU_MSG_NODE_MAX_DEVICES (128U) 41 #define DEB_NUM_UINT32 (IPU_MSG_NODE_MAX_DEVICES / (sizeof(u32) * 8U)) 42 43 typedef u32 ipu7_msg_teb_t[2]; 44 typedef u32 ipu7_msg_deb_t[DEB_NUM_UINT32]; 45 46 #define IPU_MSG_NODE_MAX_ROUTE_ENABLES (128U) 47 #define RBM_NUM_UINT32 (IPU_MSG_NODE_MAX_ROUTE_ENABLES / (sizeof(u32) * 8U)) 48 49 typedef u32 ipu7_msg_rbm_t[RBM_NUM_UINT32]; 50 51 enum ipu7_msg_node_profile_type { 52 IPU_MSG_NODE_PROFILE_TYPE_PAD = 0, 53 IPU_MSG_NODE_PROFILE_TYPE_BASE, 54 IPU_MSG_NODE_PROFILE_TYPE_CB, 55 IPU_MSG_NODE_PROFILE_TYPE_N 56 }; 57 58 struct ipu7_msg_node_profile { 59 struct ia_gofo_tlv_header tlv_header; 60 ipu7_msg_teb_t teb; 61 }; 62 63 struct ipu7_msg_cb_profile { 64 struct ipu7_msg_node_profile profile_base; 65 ipu7_msg_deb_t deb; 66 ipu7_msg_rbm_t rbm; 67 ipu7_msg_rbm_t reb; 68 }; 69 70 #define IPU_MSG_NODE_MAX_PROFILES (2U) 71 #define IPU_MSG_NODE_DEF_PROFILE_IDX (0U) 72 #define IPU_MSG_NODE_RSRC_ID_EXT_IP (0xffU) 73 74 #define IPU_MSG_NODE_DONT_CARE_TEB_HI (0xffffffffU) 75 #define IPU_MSG_NODE_DONT_CARE_TEB_LO (0xffffffffU) 76 #define IPU_MSG_NODE_RSRC_ID_IS (0xfeU) 77 78 struct ipu7_msg_node { 79 struct ia_gofo_tlv_header tlv_header; 80 u8 node_rsrc_id; 81 u8 node_ctx_id; 82 u8 num_frags; 83 u8 reserved[1]; 84 struct ia_gofo_tlv_list profiles_list; 85 struct ia_gofo_tlv_list terms_list; 86 struct ia_gofo_tlv_list node_options; 87 }; 88 89 enum ipu7_msg_node_option_types { 90 IPU_MSG_NODE_OPTION_TYPES_PADDING = 0, 91 IPU_MSG_NODE_OPTION_TYPES_N 92 }; 93 94 #pragma pack(pop) 95 96 #pragma pack(push, 1) 97 98 enum ipu7_msg_link_type { 99 IPU_MSG_LINK_TYPE_PAD = 0, 100 IPU_MSG_LINK_TYPE_GENERIC = 1, 101 IPU_MSG_LINK_TYPE_N 102 }; 103 104 enum ipu7_msg_link_option_types { 105 IPU_MSG_LINK_OPTION_TYPES_PADDING = 0, 106 IPU_MSG_LINK_OPTION_TYPES_CMPRS = 1, 107 IPU_MSG_LINK_OPTION_TYPES_N 108 }; 109 110 enum ipu7_msg_link_cmprs_option_bit_depth { 111 IPU_MSG_LINK_CMPRS_OPTION_8BPP = 0, 112 IPU_MSG_LINK_CMPRS_OPTION_10BPP = 1, 113 IPU_MSG_LINK_CMPRS_OPTION_12BPP = 2, 114 }; 115 116 #define IPU_MSG_LINK_CMPRS_SPACE_SAVING_DENOM (128U) 117 #define IPU_MSG_LINK_CMPRS_LOSSY_CFG_PAYLOAD_SIZE (5U) 118 #define IPU_MSG_LINK_CMPRS_SPACE_SAVING_NUM_MAX \ 119 (IPU_MSG_LINK_CMPRS_SPACE_SAVING_DENOM - 1U) 120 121 struct ipu7_msg_link_cmprs_plane_desc { 122 u8 plane_enable; 123 u8 cmprs_enable; 124 u8 encoder_plane_id; 125 u8 decoder_plane_id; 126 u8 cmprs_is_lossy; 127 u8 cmprs_is_footprint; 128 u8 bit_depth; 129 u8 space_saving_numerator; 130 u32 pixels_offset; 131 u32 ts_offset; 132 u32 tile_row_to_tile_row_stride; 133 u32 rows_of_tiles; 134 u32 lossy_cfg[IPU_MSG_LINK_CMPRS_LOSSY_CFG_PAYLOAD_SIZE]; 135 }; 136 137 #define IPU_MSG_LINK_CMPRS_MAX_PLANES (2U) 138 #define IPU_MSG_LINK_CMPRS_NO_ALIGN_INTERVAL (0U) 139 #define IPU_MSG_LINK_CMPRS_MIN_ALIGN_INTERVAL (16U) 140 #define IPU_MSG_LINK_CMPRS_MAX_ALIGN_INTERVAL (1024U) 141 struct ipu7_msg_link_cmprs_option { 142 struct ia_gofo_tlv_header header; 143 u32 cmprs_buf_size; 144 u16 align_interval; 145 u8 reserved[2]; 146 struct ipu7_msg_link_cmprs_plane_desc plane_descs[2]; 147 }; 148 149 struct ipu7_msg_link_ep { 150 u8 node_ctx_id; 151 u8 term_id; 152 }; 153 154 struct ipu7_msg_link_ep_pair { 155 struct ipu7_msg_link_ep ep_src; 156 struct ipu7_msg_link_ep ep_dst; 157 }; 158 159 #define IPU_MSG_LINK_FOREIGN_KEY_NONE (65535U) 160 #define IPU_MSG_LINK_FOREIGN_KEY_MAX (64U) 161 #define IPU_MSG_LINK_PBK_ID_DONT_CARE (255U) 162 #define IPU_MSG_LINK_PBK_SLOT_ID_DONT_CARE (255U) 163 #define IPU_MSG_LINK_TERM_ID_DONT_CARE (0xffU) 164 165 struct ipu7_msg_link { 166 struct ia_gofo_tlv_header tlv_header; 167 struct ipu7_msg_link_ep_pair endpoints; 168 u16 foreign_key; 169 u8 streaming_mode; 170 u8 pbk_id; 171 u8 pbk_slot_id; 172 u8 delayed_link; 173 u8 reserved[2]; 174 struct ia_gofo_tlv_list link_options; 175 }; 176 177 #pragma pack(pop) 178 179 enum ipu7_msg_dev_state { 180 IPU_MSG_DEV_STATE_CLOSED = 0, 181 IPU_MSG_DEV_STATE_OPEN_WAIT = 1, 182 IPU_MSG_DEV_STATE_OPEN = 2, 183 IPU_MSG_DEV_STATE_CLOSE_WAIT = 3, 184 IPU_MSG_DEV_STATE_N 185 }; 186 187 enum ipu7_msg_graph_state { 188 IPU_MSG_GRAPH_STATE_CLOSED = 0, 189 IPU_MSG_GRAPH_STATE_OPEN_WAIT = 1, 190 IPU_MSG_GRAPH_STATE_OPEN = 2, 191 IPU_MSG_GRAPH_STATE_CLOSE_WAIT = 3, 192 IPU_MSG_GRAPH_STATE_N 193 }; 194 195 enum ipu7_msg_task_state { 196 IPU_MSG_TASK_STATE_DONE = 0, 197 IPU_MSG_TASK_STATE_WAIT_DONE = 1, 198 IPU_MSG_TASK_STATE_N 199 }; 200 201 enum ipu7_msg_err_groups { 202 IPU_MSG_ERR_GROUP_RESERVED = IA_GOFO_MSG_ERR_GROUP_RESERVED, 203 IPU_MSG_ERR_GROUP_GENERAL = IA_GOFO_MSG_ERR_GROUP_GENERAL, 204 IPU_MSG_ERR_GROUP_DEVICE = 2, 205 IPU_MSG_ERR_GROUP_GRAPH = 3, 206 IPU_MSG_ERR_GROUP_TASK = 4, 207 IPU_MSG_ERR_GROUP_N, 208 }; 209 210 #pragma pack(push, 1) 211 struct ipu7_msg_task { 212 struct ia_gofo_msg_header header; 213 u8 graph_id; 214 u8 profile_idx; 215 u8 node_ctx_id; 216 u8 frame_id; 217 u8 frag_id; 218 u8 req_done_msg; 219 u8 req_done_irq; 220 u8 reserved[1]; 221 ipu7_msg_teb_t payload_reuse_bm; 222 ia_gofo_addr_t term_buffers[IPU_MSG_MAX_NODE_TERMS]; 223 }; 224 225 struct ipu7_msg_task_done { 226 struct ia_gofo_msg_header_ack header; 227 u8 graph_id; 228 u8 frame_id; 229 u8 node_ctx_id; 230 u8 profile_idx; 231 u8 frag_id; 232 u8 reserved[3]; 233 }; 234 235 enum ipu7_msg_err_task { 236 IPU_MSG_ERR_TASK_OK = IA_GOFO_MSG_ERR_OK, 237 IPU_MSG_ERR_TASK_GRAPH_ID = 1, 238 IPU_MSG_ERR_TASK_NODE_CTX_ID = 2, 239 IPU_MSG_ERR_TASK_PROFILE_IDX = 3, 240 IPU_MSG_ERR_TASK_CTX_MEMORY_TASK = 4, 241 IPU_MSG_ERR_TASK_TERM_PAYLOAD_PTR = 5, 242 IPU_MSG_ERR_TASK_FRAME_ID = 6, 243 IPU_MSG_ERR_TASK_FRAG_ID = 7, 244 IPU_MSG_ERR_TASK_EXEC_EXT = 8, 245 IPU_MSG_ERR_TASK_EXEC_SBX = 9, 246 IPU_MSG_ERR_TASK_EXEC_INT = 10, 247 IPU_MSG_ERR_TASK_EXEC_UNKNOWN = 11, 248 IPU_MSG_ERR_TASK_PRE_EXEC = 12, 249 IPU_MSG_ERR_TASK_N 250 }; 251 252 #pragma pack(pop) 253 254 #pragma pack(push, 1) 255 enum ipu7_msg_term_type { 256 IPU_MSG_TERM_TYPE_PAD = 0, 257 IPU_MSG_TERM_TYPE_BASE, 258 IPU_MSG_TERM_TYPE_N, 259 }; 260 261 #define IPU_MSG_TERM_EVENT_TYPE_NONE 0U 262 #define IPU_MSG_TERM_EVENT_TYPE_PROGRESS 1U 263 #define IPU_MSG_TERM_EVENT_TYPE_N (IPU_MSG_TERM_EVENT_TYPE_PROGRESS + 1U) 264 265 struct ipu7_msg_term { 266 struct ia_gofo_tlv_header tlv_header; 267 u8 term_id; 268 u8 event_req_bm; 269 u8 reserved[2]; 270 u32 payload_size; 271 struct ia_gofo_tlv_list term_options; 272 }; 273 274 enum ipu7_msg_term_option_types { 275 IPU_MSG_TERM_OPTION_TYPES_PADDING = 0, 276 IPU_MSG_TERM_OPTION_TYPES_N 277 }; 278 279 struct ipu7_msg_term_event { 280 struct ia_gofo_msg_header header; 281 u8 graph_id; 282 u8 frame_id; 283 u8 node_ctx_id; 284 u8 profile_idx; 285 u8 frag_id; 286 u8 term_id; 287 u8 event_type; 288 u8 reserved[1]; 289 u64 event_ts; 290 }; 291 292 #pragma pack(pop) 293 294 #pragma pack(push, 1) 295 #define IPU_MSG_DEVICE_SEND_MSG_ENABLED 1U 296 #define IPU_MSG_DEVICE_SEND_MSG_DISABLED 0U 297 298 #define IPU_MSG_DEVICE_OPEN_SEND_RESP BIT(0) 299 #define IPU_MSG_DEVICE_OPEN_SEND_IRQ BIT(1) 300 301 #define IPU_MSG_DEVICE_CLOSE_SEND_RESP BIT(0) 302 #define IPU_MSG_DEVICE_CLOSE_SEND_IRQ BIT(1) 303 304 struct ipu7_msg_dev_open { 305 struct ia_gofo_msg_header header; 306 u32 max_graphs; 307 u8 dev_msg_map; 308 u8 enable_power_gating; 309 u8 reserved[2]; 310 }; 311 312 struct ipu7_msg_dev_open_ack { 313 struct ia_gofo_msg_header_ack header; 314 }; 315 316 struct ipu7_msg_dev_close { 317 struct ia_gofo_msg_header header; 318 u8 dev_msg_map; 319 u8 reserved[7]; 320 }; 321 322 struct ipu7_msg_dev_close_ack { 323 struct ia_gofo_msg_header_ack header; 324 }; 325 326 enum ipu7_msg_err_device { 327 IPU_MSG_ERR_DEVICE_OK = IA_GOFO_MSG_ERR_OK, 328 IPU_MSG_ERR_DEVICE_MAX_GRAPHS = 1, 329 IPU_MSG_ERR_DEVICE_MSG_MAP = 2, 330 IPU_MSG_ERR_DEVICE_N 331 }; 332 333 #pragma pack(pop) 334 335 #pragma pack(push, 1) 336 #define IPU_MSG_GRAPH_ID_UNKNOWN (0xffU) 337 #define IPU_MSG_GRAPH_SEND_MSG_ENABLED 1U 338 #define IPU_MSG_GRAPH_SEND_MSG_DISABLED 0U 339 340 #define IPU_MSG_GRAPH_OPEN_SEND_RESP BIT(0) 341 #define IPU_MSG_GRAPH_OPEN_SEND_IRQ BIT(1) 342 343 #define IPU_MSG_GRAPH_CLOSE_SEND_RESP BIT(0) 344 #define IPU_MSG_GRAPH_CLOSE_SEND_IRQ BIT(1) 345 346 struct ipu7_msg_graph_open { 347 struct ia_gofo_msg_header header; 348 struct ia_gofo_tlv_list nodes; 349 struct ia_gofo_tlv_list links; 350 u8 graph_id; 351 u8 graph_msg_map; 352 u8 reserved[6]; 353 }; 354 355 enum ipu7_msg_graph_ack_option_types { 356 IPU_MSG_GRAPH_ACK_OPTION_TYPES_PADDING = 0, 357 IPU_MSG_GRAPH_ACK_TASK_Q_INFO, 358 IPU_MSG_GRAPH_ACK_OPTION_TYPES_N 359 }; 360 361 struct ipu7_msg_graph_open_ack_task_q_info { 362 struct ia_gofo_tlv_header header; 363 u8 node_ctx_id; 364 u8 q_id; 365 u8 reserved[2]; 366 }; 367 368 struct ipu7_msg_graph_open_ack { 369 struct ia_gofo_msg_header_ack header; 370 u8 graph_id; 371 u8 reserved[7]; 372 }; 373 374 struct ipu7_msg_graph_close { 375 struct ia_gofo_msg_header header; 376 u8 graph_id; 377 u8 graph_msg_map; 378 u8 reserved[6]; 379 }; 380 381 struct ipu7_msg_graph_close_ack { 382 struct ia_gofo_msg_header_ack header; 383 u8 graph_id; 384 u8 reserved[7]; 385 }; 386 387 enum ipu7_msg_err_graph { 388 IPU_MSG_ERR_GRAPH_OK = IA_GOFO_MSG_ERR_OK, 389 IPU_MSG_ERR_GRAPH_GRAPH_STATE = 1, 390 IPU_MSG_ERR_GRAPH_MAX_GRAPHS = 2, 391 IPU_MSG_ERR_GRAPH_GRAPH_ID = 3, 392 IPU_MSG_ERR_GRAPH_NODE_CTX_ID = 4, 393 IPU_MSG_ERR_GRAPH_NODE_RSRC_ID = 5, 394 IPU_MSG_ERR_GRAPH_PROFILE_IDX = 6, 395 IPU_MSG_ERR_GRAPH_TERM_ID = 7, 396 IPU_MSG_ERR_GRAPH_TERM_PAYLOAD_SIZE = 8, 397 IPU_MSG_ERR_GRAPH_LINK_NODE_CTX_ID = 9, 398 IPU_MSG_ERR_GRAPH_LINK_TERM_ID = 10, 399 IPU_MSG_ERR_GRAPH_PROFILE_TYPE = 11, 400 IPU_MSG_ERR_GRAPH_NUM_FRAGS = 12, 401 IPU_MSG_ERR_GRAPH_QUEUE_ID_USAGE = 13, 402 IPU_MSG_ERR_GRAPH_QUEUE_OPEN = 14, 403 IPU_MSG_ERR_GRAPH_QUEUE_CLOSE = 15, 404 IPU_MSG_ERR_GRAPH_QUEUE_ID_TASK_REQ_MISMATCH = 16, 405 IPU_MSG_ERR_GRAPH_CTX_MEMORY_FGRAPH = 17, 406 IPU_MSG_ERR_GRAPH_CTX_MEMORY_NODE = 18, 407 IPU_MSG_ERR_GRAPH_CTX_MEMORY_NODE_PROFILE = 19, 408 IPU_MSG_ERR_GRAPH_CTX_MEMORY_TERM = 20, 409 IPU_MSG_ERR_GRAPH_CTX_MEMORY_LINK = 21, 410 IPU_MSG_ERR_GRAPH_CTX_MSG_MAP = 22, 411 IPU_MSG_ERR_GRAPH_CTX_FOREIGN_KEY = 23, 412 IPU_MSG_ERR_GRAPH_CTX_STREAMING_MODE = 24, 413 IPU_MSG_ERR_GRAPH_CTX_PBK_RSRC = 25, 414 IPU_MSG_ERR_GRAPH_UNSUPPORTED_EVENT_TYPE = 26, 415 IPU_MSG_ERR_GRAPH_TOO_MANY_EVENTS = 27, 416 IPU_MSG_ERR_GRAPH_CTX_MEMORY_CMPRS = 28, 417 IPU_MSG_ERR_GRAPH_CTX_CMPRS_ALIGN_INTERVAL = 29, 418 IPU_MSG_ERR_GRAPH_CTX_CMPRS_PLANE_ID = 30, 419 IPU_MSG_ERR_GRAPH_CTX_CMPRS_UNSUPPORTED_MODE = 31, 420 IPU_MSG_ERR_GRAPH_CTX_CMPRS_BIT_DEPTH = 32, 421 IPU_MSG_ERR_GRAPH_CTX_CMPRS_STRIDE_ALIGNMENT = 33, 422 IPU_MSG_ERR_GRAPH_CTX_CMPRS_SUB_BUFFER_ALIGNMENT = 34, 423 IPU_MSG_ERR_GRAPH_CTX_CMPRS_LAYOUT_ORDER = 35, 424 IPU_MSG_ERR_GRAPH_CTX_CMPRS_LAYOUT_OVERLAP = 36, 425 IPU_MSG_ERR_GRAPH_CTX_CMPRS_BUFFER_TOO_SMALL = 37, 426 IPU_MSG_ERR_GRAPH_CTX_DELAYED_LINK = 38, 427 IPU_MSG_ERR_GRAPH_N 428 }; 429 430 #pragma pack(pop) 431 432 #define FWPS_MSG_ABI_MAX_INPUT_QUEUES (60U) 433 #define FWPS_MSG_ABI_MAX_OUTPUT_QUEUES (2U) 434 #define FWPS_MSG_ABI_MAX_QUEUES \ 435 (FWPS_MSG_ABI_MAX_OUTPUT_QUEUES + FWPS_MSG_ABI_MAX_INPUT_QUEUES) 436 437 #define FWPS_MSG_ABI_OUT_ACK_QUEUE_ID (IA_GOFO_MSG_ABI_OUT_ACK_QUEUE_ID) 438 #define FWPS_MSG_ABI_OUT_LOG_QUEUE_ID (IA_GOFO_MSG_ABI_OUT_LOG_QUEUE_ID) 439 #if (FWPS_MSG_ABI_OUT_LOG_QUEUE_ID >= FWPS_MSG_ABI_MAX_OUTPUT_QUEUES) 440 #error "Maximum output queues configuration is too small to fit ACK and LOG \ 441 queues" 442 #endif 443 #define FWPS_MSG_ABI_IN_DEV_QUEUE_ID (IA_GOFO_MSG_ABI_IN_DEV_QUEUE_ID) 444 #define FWPS_MSG_ABI_IN_RESERVED_QUEUE_ID (3U) 445 #define FWPS_MSG_ABI_IN_FIRST_TASK_QUEUE_ID \ 446 (FWPS_MSG_ABI_IN_RESERVED_QUEUE_ID + 1U) 447 448 #if (FWPS_MSG_ABI_IN_FIRST_TASK_QUEUE_ID >= FWPS_MSG_ABI_MAX_INPUT_QUEUES) 449 #error "Maximum queues configuration is too small to fit minimum number of \ 450 useful queues" 451 #endif 452 453 #define FWPS_MSG_ABI_IN_LAST_TASK_QUEUE_ID (FWPS_MSG_ABI_MAX_QUEUES - 1U) 454 #define FWPS_MSG_ABI_IN_MAX_TASK_QUEUES \ 455 (FWPS_MSG_ABI_IN_LAST_TASK_QUEUE_ID - \ 456 FWPS_MSG_ABI_IN_FIRST_TASK_QUEUE_ID + 1U) 457 #define FWPS_MSG_ABI_OUT_FIRST_QUEUE_ID (FWPS_MSG_ABI_OUT_ACK_QUEUE_ID) 458 #define FWPS_MSG_ABI_OUT_LAST_QUEUE_ID (FWPS_MSG_ABI_MAX_OUTPUT_QUEUES - 1U) 459 #define FWPS_MSG_ABI_IN_FIRST_QUEUE_ID (FWPS_MSG_ABI_IN_DEV_QUEUE_ID) 460 #define FWPS_MSG_ABI_IN_LAST_QUEUE_ID (FWPS_MSG_ABI_IN_LAST_TASK_QUEUE_ID) 461 462 #define FWPS_MSG_HOST2FW_MAX_SIZE (2U * 1024U) 463 #define FWPS_MSG_FW2HOST_MAX_SIZE (256U) 464 465 #endif 466