#ifndef IPU7_FW_MSG_ABI_H
#define IPU7_FW_MSG_ABI_H
#include "ipu7_fw_common_abi.h"
#pragma pack(push, 1)
enum ipu7_msg_type {
IPU_MSG_TYPE_RESERVED = IA_GOFO_MSG_TYPE_RESERVED,
IPU_MSG_TYPE_INDIRECT = IA_GOFO_MSG_TYPE_INDIRECT,
IPU_MSG_TYPE_DEV_LOG = IA_GOFO_MSG_TYPE_LOG,
IPU_MSG_TYPE_GENERAL_ERR = IA_GOFO_MSG_TYPE_GENERAL_ERR,
IPU_MSG_TYPE_DEV_OPEN = 4,
IPU_MSG_TYPE_DEV_OPEN_ACK = 5,
IPU_MSG_TYPE_GRAPH_OPEN = 6,
IPU_MSG_TYPE_GRAPH_OPEN_ACK = 7,
IPU_MSG_TYPE_TASK_REQ = 8,
IPU_MSG_TYPE_TASK_DONE = 9,
IPU_MSG_TYPE_GRAPH_CLOSE = 10,
IPU_MSG_TYPE_GRAPH_CLOSE_ACK = 11,
IPU_MSG_TYPE_DEV_CLOSE = 12,
IPU_MSG_TYPE_DEV_CLOSE_ACK = 13,
IPU_MSG_TYPE_TERM_EVENT = 14,
IPU_MSG_TYPE_N,
};
#define IPU_MSG_MAX_NODE_TERMS (64U)
#define IPU_MSG_MAX_FRAGS (7U)
enum ipu7_msg_node_type {
IPU_MSG_NODE_TYPE_PAD = 0,
IPU_MSG_NODE_TYPE_BASE,
IPU_MSG_NODE_TYPE_N
};
#define IPU_MSG_NODE_MAX_DEVICES (128U)
#define DEB_NUM_UINT32 (IPU_MSG_NODE_MAX_DEVICES / (sizeof(u32) * 8U))
typedef u32 ipu7_msg_teb_t[2];
typedef u32 ipu7_msg_deb_t[DEB_NUM_UINT32];
#define IPU_MSG_NODE_MAX_ROUTE_ENABLES (128U)
#define RBM_NUM_UINT32 (IPU_MSG_NODE_MAX_ROUTE_ENABLES / (sizeof(u32) * 8U))
typedef u32 ipu7_msg_rbm_t[RBM_NUM_UINT32];
enum ipu7_msg_node_profile_type {
IPU_MSG_NODE_PROFILE_TYPE_PAD = 0,
IPU_MSG_NODE_PROFILE_TYPE_BASE,
IPU_MSG_NODE_PROFILE_TYPE_CB,
IPU_MSG_NODE_PROFILE_TYPE_N
};
struct ipu7_msg_node_profile {
struct ia_gofo_tlv_header tlv_header;
ipu7_msg_teb_t teb;
};
struct ipu7_msg_cb_profile {
struct ipu7_msg_node_profile profile_base;
ipu7_msg_deb_t deb;
ipu7_msg_rbm_t rbm;
ipu7_msg_rbm_t reb;
};
#define IPU_MSG_NODE_MAX_PROFILES (2U)
#define IPU_MSG_NODE_DEF_PROFILE_IDX (0U)
#define IPU_MSG_NODE_RSRC_ID_EXT_IP (0xffU)
#define IPU_MSG_NODE_DONT_CARE_TEB_HI (0xffffffffU)
#define IPU_MSG_NODE_DONT_CARE_TEB_LO (0xffffffffU)
#define IPU_MSG_NODE_RSRC_ID_IS (0xfeU)
struct ipu7_msg_node {
struct ia_gofo_tlv_header tlv_header;
u8 node_rsrc_id;
u8 node_ctx_id;
u8 num_frags;
u8 reserved[1];
struct ia_gofo_tlv_list profiles_list;
struct ia_gofo_tlv_list terms_list;
struct ia_gofo_tlv_list node_options;
};
enum ipu7_msg_node_option_types {
IPU_MSG_NODE_OPTION_TYPES_PADDING = 0,
IPU_MSG_NODE_OPTION_TYPES_N
};
#pragma pack(pop)
#pragma pack(push, 1)
enum ipu7_msg_link_type {
IPU_MSG_LINK_TYPE_PAD = 0,
IPU_MSG_LINK_TYPE_GENERIC = 1,
IPU_MSG_LINK_TYPE_N
};
enum ipu7_msg_link_option_types {
IPU_MSG_LINK_OPTION_TYPES_PADDING = 0,
IPU_MSG_LINK_OPTION_TYPES_CMPRS = 1,
IPU_MSG_LINK_OPTION_TYPES_N
};
enum ipu7_msg_link_cmprs_option_bit_depth {
IPU_MSG_LINK_CMPRS_OPTION_8BPP = 0,
IPU_MSG_LINK_CMPRS_OPTION_10BPP = 1,
IPU_MSG_LINK_CMPRS_OPTION_12BPP = 2,
};
#define IPU_MSG_LINK_CMPRS_SPACE_SAVING_DENOM (128U)
#define IPU_MSG_LINK_CMPRS_LOSSY_CFG_PAYLOAD_SIZE (5U)
#define IPU_MSG_LINK_CMPRS_SPACE_SAVING_NUM_MAX \
(IPU_MSG_LINK_CMPRS_SPACE_SAVING_DENOM - 1U)
struct ipu7_msg_link_cmprs_plane_desc {
u8 plane_enable;
u8 cmprs_enable;
u8 encoder_plane_id;
u8 decoder_plane_id;
u8 cmprs_is_lossy;
u8 cmprs_is_footprint;
u8 bit_depth;
u8 space_saving_numerator;
u32 pixels_offset;
u32 ts_offset;
u32 tile_row_to_tile_row_stride;
u32 rows_of_tiles;
u32 lossy_cfg[IPU_MSG_LINK_CMPRS_LOSSY_CFG_PAYLOAD_SIZE];
};
#define IPU_MSG_LINK_CMPRS_MAX_PLANES (2U)
#define IPU_MSG_LINK_CMPRS_NO_ALIGN_INTERVAL (0U)
#define IPU_MSG_LINK_CMPRS_MIN_ALIGN_INTERVAL (16U)
#define IPU_MSG_LINK_CMPRS_MAX_ALIGN_INTERVAL (1024U)
struct ipu7_msg_link_cmprs_option {
struct ia_gofo_tlv_header header;
u32 cmprs_buf_size;
u16 align_interval;
u8 reserved[2];
struct ipu7_msg_link_cmprs_plane_desc plane_descs[2];
};
struct ipu7_msg_link_ep {
u8 node_ctx_id;
u8 term_id;
};
struct ipu7_msg_link_ep_pair {
struct ipu7_msg_link_ep ep_src;
struct ipu7_msg_link_ep ep_dst;
};
#define IPU_MSG_LINK_FOREIGN_KEY_NONE (65535U)
#define IPU_MSG_LINK_FOREIGN_KEY_MAX (64U)
#define IPU_MSG_LINK_PBK_ID_DONT_CARE (255U)
#define IPU_MSG_LINK_PBK_SLOT_ID_DONT_CARE (255U)
#define IPU_MSG_LINK_TERM_ID_DONT_CARE (0xffU)
struct ipu7_msg_link {
struct ia_gofo_tlv_header tlv_header;
struct ipu7_msg_link_ep_pair endpoints;
u16 foreign_key;
u8 streaming_mode;
u8 pbk_id;
u8 pbk_slot_id;
u8 delayed_link;
u8 reserved[2];
struct ia_gofo_tlv_list link_options;
};
#pragma pack(pop)
enum ipu7_msg_dev_state {
IPU_MSG_DEV_STATE_CLOSED = 0,
IPU_MSG_DEV_STATE_OPEN_WAIT = 1,
IPU_MSG_DEV_STATE_OPEN = 2,
IPU_MSG_DEV_STATE_CLOSE_WAIT = 3,
IPU_MSG_DEV_STATE_N
};
enum ipu7_msg_graph_state {
IPU_MSG_GRAPH_STATE_CLOSED = 0,
IPU_MSG_GRAPH_STATE_OPEN_WAIT = 1,
IPU_MSG_GRAPH_STATE_OPEN = 2,
IPU_MSG_GRAPH_STATE_CLOSE_WAIT = 3,
IPU_MSG_GRAPH_STATE_N
};
enum ipu7_msg_task_state {
IPU_MSG_TASK_STATE_DONE = 0,
IPU_MSG_TASK_STATE_WAIT_DONE = 1,
IPU_MSG_TASK_STATE_N
};
enum ipu7_msg_err_groups {
IPU_MSG_ERR_GROUP_RESERVED = IA_GOFO_MSG_ERR_GROUP_RESERVED,
IPU_MSG_ERR_GROUP_GENERAL = IA_GOFO_MSG_ERR_GROUP_GENERAL,
IPU_MSG_ERR_GROUP_DEVICE = 2,
IPU_MSG_ERR_GROUP_GRAPH = 3,
IPU_MSG_ERR_GROUP_TASK = 4,
IPU_MSG_ERR_GROUP_N,
};
#pragma pack(push, 1)
struct ipu7_msg_task {
struct ia_gofo_msg_header header;
u8 graph_id;
u8 profile_idx;
u8 node_ctx_id;
u8 frame_id;
u8 frag_id;
u8 req_done_msg;
u8 req_done_irq;
u8 reserved[1];
ipu7_msg_teb_t payload_reuse_bm;
ia_gofo_addr_t term_buffers[IPU_MSG_MAX_NODE_TERMS];
};
struct ipu7_msg_task_done {
struct ia_gofo_msg_header_ack header;
u8 graph_id;
u8 frame_id;
u8 node_ctx_id;
u8 profile_idx;
u8 frag_id;
u8 reserved[3];
};
enum ipu7_msg_err_task {
IPU_MSG_ERR_TASK_OK = IA_GOFO_MSG_ERR_OK,
IPU_MSG_ERR_TASK_GRAPH_ID = 1,
IPU_MSG_ERR_TASK_NODE_CTX_ID = 2,
IPU_MSG_ERR_TASK_PROFILE_IDX = 3,
IPU_MSG_ERR_TASK_CTX_MEMORY_TASK = 4,
IPU_MSG_ERR_TASK_TERM_PAYLOAD_PTR = 5,
IPU_MSG_ERR_TASK_FRAME_ID = 6,
IPU_MSG_ERR_TASK_FRAG_ID = 7,
IPU_MSG_ERR_TASK_EXEC_EXT = 8,
IPU_MSG_ERR_TASK_EXEC_SBX = 9,
IPU_MSG_ERR_TASK_EXEC_INT = 10,
IPU_MSG_ERR_TASK_EXEC_UNKNOWN = 11,
IPU_MSG_ERR_TASK_PRE_EXEC = 12,
IPU_MSG_ERR_TASK_N
};
#pragma pack(pop)
#pragma pack(push, 1)
enum ipu7_msg_term_type {
IPU_MSG_TERM_TYPE_PAD = 0,
IPU_MSG_TERM_TYPE_BASE,
IPU_MSG_TERM_TYPE_N,
};
#define IPU_MSG_TERM_EVENT_TYPE_NONE 0U
#define IPU_MSG_TERM_EVENT_TYPE_PROGRESS 1U
#define IPU_MSG_TERM_EVENT_TYPE_N (IPU_MSG_TERM_EVENT_TYPE_PROGRESS + 1U)
struct ipu7_msg_term {
struct ia_gofo_tlv_header tlv_header;
u8 term_id;
u8 event_req_bm;
u8 reserved[2];
u32 payload_size;
struct ia_gofo_tlv_list term_options;
};
enum ipu7_msg_term_option_types {
IPU_MSG_TERM_OPTION_TYPES_PADDING = 0,
IPU_MSG_TERM_OPTION_TYPES_N
};
struct ipu7_msg_term_event {
struct ia_gofo_msg_header header;
u8 graph_id;
u8 frame_id;
u8 node_ctx_id;
u8 profile_idx;
u8 frag_id;
u8 term_id;
u8 event_type;
u8 reserved[1];
u64 event_ts;
};
#pragma pack(pop)
#pragma pack(push, 1)
#define IPU_MSG_DEVICE_SEND_MSG_ENABLED 1U
#define IPU_MSG_DEVICE_SEND_MSG_DISABLED 0U
#define IPU_MSG_DEVICE_OPEN_SEND_RESP BIT(0)
#define IPU_MSG_DEVICE_OPEN_SEND_IRQ BIT(1)
#define IPU_MSG_DEVICE_CLOSE_SEND_RESP BIT(0)
#define IPU_MSG_DEVICE_CLOSE_SEND_IRQ BIT(1)
struct ipu7_msg_dev_open {
struct ia_gofo_msg_header header;
u32 max_graphs;
u8 dev_msg_map;
u8 enable_power_gating;
u8 reserved[2];
};
struct ipu7_msg_dev_open_ack {
struct ia_gofo_msg_header_ack header;
};
struct ipu7_msg_dev_close {
struct ia_gofo_msg_header header;
u8 dev_msg_map;
u8 reserved[7];
};
struct ipu7_msg_dev_close_ack {
struct ia_gofo_msg_header_ack header;
};
enum ipu7_msg_err_device {
IPU_MSG_ERR_DEVICE_OK = IA_GOFO_MSG_ERR_OK,
IPU_MSG_ERR_DEVICE_MAX_GRAPHS = 1,
IPU_MSG_ERR_DEVICE_MSG_MAP = 2,
IPU_MSG_ERR_DEVICE_N
};
#pragma pack(pop)
#pragma pack(push, 1)
#define IPU_MSG_GRAPH_ID_UNKNOWN (0xffU)
#define IPU_MSG_GRAPH_SEND_MSG_ENABLED 1U
#define IPU_MSG_GRAPH_SEND_MSG_DISABLED 0U
#define IPU_MSG_GRAPH_OPEN_SEND_RESP BIT(0)
#define IPU_MSG_GRAPH_OPEN_SEND_IRQ BIT(1)
#define IPU_MSG_GRAPH_CLOSE_SEND_RESP BIT(0)
#define IPU_MSG_GRAPH_CLOSE_SEND_IRQ BIT(1)
struct ipu7_msg_graph_open {
struct ia_gofo_msg_header header;
struct ia_gofo_tlv_list nodes;
struct ia_gofo_tlv_list links;
u8 graph_id;
u8 graph_msg_map;
u8 reserved[6];
};
enum ipu7_msg_graph_ack_option_types {
IPU_MSG_GRAPH_ACK_OPTION_TYPES_PADDING = 0,
IPU_MSG_GRAPH_ACK_TASK_Q_INFO,
IPU_MSG_GRAPH_ACK_OPTION_TYPES_N
};
struct ipu7_msg_graph_open_ack_task_q_info {
struct ia_gofo_tlv_header header;
u8 node_ctx_id;
u8 q_id;
u8 reserved[2];
};
struct ipu7_msg_graph_open_ack {
struct ia_gofo_msg_header_ack header;
u8 graph_id;
u8 reserved[7];
};
struct ipu7_msg_graph_close {
struct ia_gofo_msg_header header;
u8 graph_id;
u8 graph_msg_map;
u8 reserved[6];
};
struct ipu7_msg_graph_close_ack {
struct ia_gofo_msg_header_ack header;
u8 graph_id;
u8 reserved[7];
};
enum ipu7_msg_err_graph {
IPU_MSG_ERR_GRAPH_OK = IA_GOFO_MSG_ERR_OK,
IPU_MSG_ERR_GRAPH_GRAPH_STATE = 1,
IPU_MSG_ERR_GRAPH_MAX_GRAPHS = 2,
IPU_MSG_ERR_GRAPH_GRAPH_ID = 3,
IPU_MSG_ERR_GRAPH_NODE_CTX_ID = 4,
IPU_MSG_ERR_GRAPH_NODE_RSRC_ID = 5,
IPU_MSG_ERR_GRAPH_PROFILE_IDX = 6,
IPU_MSG_ERR_GRAPH_TERM_ID = 7,
IPU_MSG_ERR_GRAPH_TERM_PAYLOAD_SIZE = 8,
IPU_MSG_ERR_GRAPH_LINK_NODE_CTX_ID = 9,
IPU_MSG_ERR_GRAPH_LINK_TERM_ID = 10,
IPU_MSG_ERR_GRAPH_PROFILE_TYPE = 11,
IPU_MSG_ERR_GRAPH_NUM_FRAGS = 12,
IPU_MSG_ERR_GRAPH_QUEUE_ID_USAGE = 13,
IPU_MSG_ERR_GRAPH_QUEUE_OPEN = 14,
IPU_MSG_ERR_GRAPH_QUEUE_CLOSE = 15,
IPU_MSG_ERR_GRAPH_QUEUE_ID_TASK_REQ_MISMATCH = 16,
IPU_MSG_ERR_GRAPH_CTX_MEMORY_FGRAPH = 17,
IPU_MSG_ERR_GRAPH_CTX_MEMORY_NODE = 18,
IPU_MSG_ERR_GRAPH_CTX_MEMORY_NODE_PROFILE = 19,
IPU_MSG_ERR_GRAPH_CTX_MEMORY_TERM = 20,
IPU_MSG_ERR_GRAPH_CTX_MEMORY_LINK = 21,
IPU_MSG_ERR_GRAPH_CTX_MSG_MAP = 22,
IPU_MSG_ERR_GRAPH_CTX_FOREIGN_KEY = 23,
IPU_MSG_ERR_GRAPH_CTX_STREAMING_MODE = 24,
IPU_MSG_ERR_GRAPH_CTX_PBK_RSRC = 25,
IPU_MSG_ERR_GRAPH_UNSUPPORTED_EVENT_TYPE = 26,
IPU_MSG_ERR_GRAPH_TOO_MANY_EVENTS = 27,
IPU_MSG_ERR_GRAPH_CTX_MEMORY_CMPRS = 28,
IPU_MSG_ERR_GRAPH_CTX_CMPRS_ALIGN_INTERVAL = 29,
IPU_MSG_ERR_GRAPH_CTX_CMPRS_PLANE_ID = 30,
IPU_MSG_ERR_GRAPH_CTX_CMPRS_UNSUPPORTED_MODE = 31,
IPU_MSG_ERR_GRAPH_CTX_CMPRS_BIT_DEPTH = 32,
IPU_MSG_ERR_GRAPH_CTX_CMPRS_STRIDE_ALIGNMENT = 33,
IPU_MSG_ERR_GRAPH_CTX_CMPRS_SUB_BUFFER_ALIGNMENT = 34,
IPU_MSG_ERR_GRAPH_CTX_CMPRS_LAYOUT_ORDER = 35,
IPU_MSG_ERR_GRAPH_CTX_CMPRS_LAYOUT_OVERLAP = 36,
IPU_MSG_ERR_GRAPH_CTX_CMPRS_BUFFER_TOO_SMALL = 37,
IPU_MSG_ERR_GRAPH_CTX_DELAYED_LINK = 38,
IPU_MSG_ERR_GRAPH_N
};
#pragma pack(pop)
#define FWPS_MSG_ABI_MAX_INPUT_QUEUES (60U)
#define FWPS_MSG_ABI_MAX_OUTPUT_QUEUES (2U)
#define FWPS_MSG_ABI_MAX_QUEUES \
(FWPS_MSG_ABI_MAX_OUTPUT_QUEUES + FWPS_MSG_ABI_MAX_INPUT_QUEUES)
#define FWPS_MSG_ABI_OUT_ACK_QUEUE_ID (IA_GOFO_MSG_ABI_OUT_ACK_QUEUE_ID)
#define FWPS_MSG_ABI_OUT_LOG_QUEUE_ID (IA_GOFO_MSG_ABI_OUT_LOG_QUEUE_ID)
#if (FWPS_MSG_ABI_OUT_LOG_QUEUE_ID >= FWPS_MSG_ABI_MAX_OUTPUT_QUEUES)
#error "Maximum output queues configuration is too small to fit ACK and LOG \
queues"
#endif
#define FWPS_MSG_ABI_IN_DEV_QUEUE_ID (IA_GOFO_MSG_ABI_IN_DEV_QUEUE_ID)
#define FWPS_MSG_ABI_IN_RESERVED_QUEUE_ID (3U)
#define FWPS_MSG_ABI_IN_FIRST_TASK_QUEUE_ID \
(FWPS_MSG_ABI_IN_RESERVED_QUEUE_ID + 1U)
#if (FWPS_MSG_ABI_IN_FIRST_TASK_QUEUE_ID >= FWPS_MSG_ABI_MAX_INPUT_QUEUES)
#error "Maximum queues configuration is too small to fit minimum number of \
useful queues"
#endif
#define FWPS_MSG_ABI_IN_LAST_TASK_QUEUE_ID (FWPS_MSG_ABI_MAX_QUEUES - 1U)
#define FWPS_MSG_ABI_IN_MAX_TASK_QUEUES \
(FWPS_MSG_ABI_IN_LAST_TASK_QUEUE_ID - \
FWPS_MSG_ABI_IN_FIRST_TASK_QUEUE_ID + 1U)
#define FWPS_MSG_ABI_OUT_FIRST_QUEUE_ID (FWPS_MSG_ABI_OUT_ACK_QUEUE_ID)
#define FWPS_MSG_ABI_OUT_LAST_QUEUE_ID (FWPS_MSG_ABI_MAX_OUTPUT_QUEUES - 1U)
#define FWPS_MSG_ABI_IN_FIRST_QUEUE_ID (FWPS_MSG_ABI_IN_DEV_QUEUE_ID)
#define FWPS_MSG_ABI_IN_LAST_QUEUE_ID (FWPS_MSG_ABI_IN_LAST_TASK_QUEUE_ID)
#define FWPS_MSG_HOST2FW_MAX_SIZE (2U * 1024U)
#define FWPS_MSG_FW2HOST_MAX_SIZE (256U)
#endif