#ifndef IPU6_FW_ISYS_H
#define IPU6_FW_ISYS_H
#include <linux/types.h>
struct device;
struct ipu6_isys;
#define IPU6_MAX_IPINS 4
#define IPU6_MAX_OPINS ((IPU6_MAX_IPINS) + 1)
#define IPU6_STREAM_ID_MAX 16
#define IPU6_NONSECURE_STREAM_ID_MAX 12
#define IPU6_DEV_SEND_QUEUE_SIZE (IPU6_STREAM_ID_MAX)
#define IPU6_NOF_SRAM_BLOCKS_MAX (IPU6_STREAM_ID_MAX)
#define IPU6_N_MAX_MSG_SEND_QUEUES (IPU6_STREAM_ID_MAX)
#define IPU6SE_STREAM_ID_MAX 8
#define IPU6SE_NONSECURE_STREAM_ID_MAX 4
#define IPU6SE_DEV_SEND_QUEUE_SIZE (IPU6SE_STREAM_ID_MAX)
#define IPU6SE_NOF_SRAM_BLOCKS_MAX (IPU6SE_STREAM_ID_MAX)
#define IPU6SE_N_MAX_MSG_SEND_QUEUES (IPU6SE_STREAM_ID_MAX)
#define IPU6_N_MAX_MSG_RECV_QUEUES 1
#define IPU6_N_MAX_DEV_SEND_QUEUES 1
#define IPU6_N_MAX_PROXY_SEND_QUEUES 1
#define IPU6_N_MAX_PROXY_RECV_QUEUES 1
#define IPU6_BASE_PROXY_SEND_QUEUES 0
#define IPU6_BASE_DEV_SEND_QUEUES \
(IPU6_BASE_PROXY_SEND_QUEUES + IPU6_N_MAX_PROXY_SEND_QUEUES)
#define IPU6_BASE_MSG_SEND_QUEUES \
(IPU6_BASE_DEV_SEND_QUEUES + IPU6_N_MAX_DEV_SEND_QUEUES)
#define IPU6_BASE_PROXY_RECV_QUEUES 0
#define IPU6_BASE_MSG_RECV_QUEUES \
(IPU6_BASE_PROXY_RECV_QUEUES + IPU6_N_MAX_PROXY_RECV_QUEUES)
#define IPU6_N_MAX_RECV_QUEUES \
(IPU6_BASE_MSG_RECV_QUEUES + IPU6_N_MAX_MSG_RECV_QUEUES)
#define IPU6_N_MAX_SEND_QUEUES \
(IPU6_BASE_MSG_SEND_QUEUES + IPU6_N_MAX_MSG_SEND_QUEUES)
#define IPU6SE_N_MAX_SEND_QUEUES \
(IPU6_BASE_MSG_SEND_QUEUES + IPU6SE_N_MAX_MSG_SEND_QUEUES)
#define IPU6_PIN_PLANES_MAX 4
#define IPU6_FW_ISYS_SENSOR_TYPE_START 14
#define IPU6_FW_ISYS_SENSOR_TYPE_END 19
#define IPU6SE_FW_ISYS_SENSOR_TYPE_START 6
#define IPU6SE_FW_ISYS_SENSOR_TYPE_END 11
#define IPU6_ISYS_OPEN_RETRY 2000
#define IPU6_ISYS_CLOSE_RETRY 2000
#define IPU6_FW_CALL_TIMEOUT_JIFFIES msecs_to_jiffies(2000)
enum ipu6_fw_isys_resp_type {
IPU6_FW_ISYS_RESP_TYPE_STREAM_OPEN_DONE = 0,
IPU6_FW_ISYS_RESP_TYPE_STREAM_START_ACK,
IPU6_FW_ISYS_RESP_TYPE_STREAM_START_AND_CAPTURE_ACK,
IPU6_FW_ISYS_RESP_TYPE_STREAM_CAPTURE_ACK,
IPU6_FW_ISYS_RESP_TYPE_STREAM_STOP_ACK,
IPU6_FW_ISYS_RESP_TYPE_STREAM_FLUSH_ACK,
IPU6_FW_ISYS_RESP_TYPE_STREAM_CLOSE_ACK,
IPU6_FW_ISYS_RESP_TYPE_PIN_DATA_READY,
IPU6_FW_ISYS_RESP_TYPE_PIN_DATA_WATERMARK,
IPU6_FW_ISYS_RESP_TYPE_FRAME_SOF,
IPU6_FW_ISYS_RESP_TYPE_FRAME_EOF,
IPU6_FW_ISYS_RESP_TYPE_STREAM_START_AND_CAPTURE_DONE,
IPU6_FW_ISYS_RESP_TYPE_STREAM_CAPTURE_DONE,
IPU6_FW_ISYS_RESP_TYPE_PIN_DATA_SKIPPED,
IPU6_FW_ISYS_RESP_TYPE_STREAM_CAPTURE_SKIPPED,
IPU6_FW_ISYS_RESP_TYPE_FRAME_SOF_DISCARDED,
IPU6_FW_ISYS_RESP_TYPE_FRAME_EOF_DISCARDED,
IPU6_FW_ISYS_RESP_TYPE_STATS_DATA_READY,
N_IPU6_FW_ISYS_RESP_TYPE
};
enum ipu6_fw_isys_send_type {
IPU6_FW_ISYS_SEND_TYPE_STREAM_OPEN = 0,
IPU6_FW_ISYS_SEND_TYPE_STREAM_START,
IPU6_FW_ISYS_SEND_TYPE_STREAM_START_AND_CAPTURE,
IPU6_FW_ISYS_SEND_TYPE_STREAM_CAPTURE,
IPU6_FW_ISYS_SEND_TYPE_STREAM_STOP,
IPU6_FW_ISYS_SEND_TYPE_STREAM_FLUSH,
IPU6_FW_ISYS_SEND_TYPE_STREAM_CLOSE,
N_IPU6_FW_ISYS_SEND_TYPE
};
enum ipu6_fw_isys_queue_type {
IPU6_FW_ISYS_QUEUE_TYPE_PROXY = 0,
IPU6_FW_ISYS_QUEUE_TYPE_DEV,
IPU6_FW_ISYS_QUEUE_TYPE_MSG,
N_IPU6_FW_ISYS_QUEUE_TYPE
};
enum ipu6_fw_isys_stream_source {
IPU6_FW_ISYS_STREAM_SRC_PORT_0 = 0,
IPU6_FW_ISYS_STREAM_SRC_PORT_1,
IPU6_FW_ISYS_STREAM_SRC_PORT_2,
IPU6_FW_ISYS_STREAM_SRC_PORT_3,
IPU6_FW_ISYS_STREAM_SRC_PORT_4,
IPU6_FW_ISYS_STREAM_SRC_PORT_5,
IPU6_FW_ISYS_STREAM_SRC_PORT_6,
IPU6_FW_ISYS_STREAM_SRC_PORT_7,
IPU6_FW_ISYS_STREAM_SRC_PORT_8,
IPU6_FW_ISYS_STREAM_SRC_PORT_9,
IPU6_FW_ISYS_STREAM_SRC_PORT_10,
IPU6_FW_ISYS_STREAM_SRC_PORT_11,
IPU6_FW_ISYS_STREAM_SRC_PORT_12,
IPU6_FW_ISYS_STREAM_SRC_PORT_13,
IPU6_FW_ISYS_STREAM_SRC_PORT_14,
IPU6_FW_ISYS_STREAM_SRC_PORT_15,
IPU6_FW_ISYS_STREAM_SRC_MIPIGEN_0,
IPU6_FW_ISYS_STREAM_SRC_MIPIGEN_1,
IPU6_FW_ISYS_STREAM_SRC_MIPIGEN_2,
IPU6_FW_ISYS_STREAM_SRC_MIPIGEN_3,
IPU6_FW_ISYS_STREAM_SRC_MIPIGEN_4,
IPU6_FW_ISYS_STREAM_SRC_MIPIGEN_5,
IPU6_FW_ISYS_STREAM_SRC_MIPIGEN_6,
IPU6_FW_ISYS_STREAM_SRC_MIPIGEN_7,
IPU6_FW_ISYS_STREAM_SRC_MIPIGEN_8,
IPU6_FW_ISYS_STREAM_SRC_MIPIGEN_9,
N_IPU6_FW_ISYS_STREAM_SRC
};
#define IPU6_FW_ISYS_STREAM_SRC_CSI2_PORT0 IPU6_FW_ISYS_STREAM_SRC_PORT_0
#define IPU6_FW_ISYS_STREAM_SRC_CSI2_PORT1 IPU6_FW_ISYS_STREAM_SRC_PORT_1
#define IPU6_FW_ISYS_STREAM_SRC_CSI2_PORT2 IPU6_FW_ISYS_STREAM_SRC_PORT_2
#define IPU6_FW_ISYS_STREAM_SRC_CSI2_PORT3 IPU6_FW_ISYS_STREAM_SRC_PORT_3
#define IPU6_FW_ISYS_STREAM_SRC_CSI2_3PH_PORTA IPU6_FW_ISYS_STREAM_SRC_PORT_4
#define IPU6_FW_ISYS_STREAM_SRC_CSI2_3PH_PORTB IPU6_FW_ISYS_STREAM_SRC_PORT_5
#define IPU6_FW_ISYS_STREAM_SRC_CSI2_3PH_CPHY_PORT0 \
IPU6_FW_ISYS_STREAM_SRC_PORT_6
#define IPU6_FW_ISYS_STREAM_SRC_CSI2_3PH_CPHY_PORT1 \
IPU6_FW_ISYS_STREAM_SRC_PORT_7
#define IPU6_FW_ISYS_STREAM_SRC_CSI2_3PH_CPHY_PORT2 \
IPU6_FW_ISYS_STREAM_SRC_PORT_8
#define IPU6_FW_ISYS_STREAM_SRC_CSI2_3PH_CPHY_PORT3 \
IPU6_FW_ISYS_STREAM_SRC_PORT_9
#define IPU6_FW_ISYS_STREAM_SRC_MIPIGEN_PORT0 IPU6_FW_ISYS_STREAM_SRC_MIPIGEN_0
#define IPU6_FW_ISYS_STREAM_SRC_MIPIGEN_PORT1 IPU6_FW_ISYS_STREAM_SRC_MIPIGEN_1
enum ipu6_fw_isys_mipi_vc {
IPU6_FW_ISYS_MIPI_VC_0 = 0,
IPU6_FW_ISYS_MIPI_VC_1,
IPU6_FW_ISYS_MIPI_VC_2,
IPU6_FW_ISYS_MIPI_VC_3,
N_IPU6_FW_ISYS_MIPI_VC
};
enum ipu6_fw_isys_frame_format_type {
IPU6_FW_ISYS_FRAME_FORMAT_NV11 = 0,
IPU6_FW_ISYS_FRAME_FORMAT_NV12,
IPU6_FW_ISYS_FRAME_FORMAT_NV12_16,
IPU6_FW_ISYS_FRAME_FORMAT_NV12_TILEY,
IPU6_FW_ISYS_FRAME_FORMAT_NV16,
IPU6_FW_ISYS_FRAME_FORMAT_NV21,
IPU6_FW_ISYS_FRAME_FORMAT_NV61,
IPU6_FW_ISYS_FRAME_FORMAT_YV12,
IPU6_FW_ISYS_FRAME_FORMAT_YV16,
IPU6_FW_ISYS_FRAME_FORMAT_YUV420,
IPU6_FW_ISYS_FRAME_FORMAT_YUV420_10,
IPU6_FW_ISYS_FRAME_FORMAT_YUV420_12,
IPU6_FW_ISYS_FRAME_FORMAT_YUV420_14,
IPU6_FW_ISYS_FRAME_FORMAT_YUV420_16,
IPU6_FW_ISYS_FRAME_FORMAT_YUV422,
IPU6_FW_ISYS_FRAME_FORMAT_YUV422_16,
IPU6_FW_ISYS_FRAME_FORMAT_UYVY,
IPU6_FW_ISYS_FRAME_FORMAT_YUYV,
IPU6_FW_ISYS_FRAME_FORMAT_YUV444,
IPU6_FW_ISYS_FRAME_FORMAT_YUV_LINE,
IPU6_FW_ISYS_FRAME_FORMAT_RAW8,
IPU6_FW_ISYS_FRAME_FORMAT_RAW10,
IPU6_FW_ISYS_FRAME_FORMAT_RAW12,
IPU6_FW_ISYS_FRAME_FORMAT_RAW14,
IPU6_FW_ISYS_FRAME_FORMAT_RAW16,
IPU6_FW_ISYS_FRAME_FORMAT_RGB565,
IPU6_FW_ISYS_FRAME_FORMAT_PLANAR_RGB888,
IPU6_FW_ISYS_FRAME_FORMAT_RGBA888,
IPU6_FW_ISYS_FRAME_FORMAT_QPLANE6,
IPU6_FW_ISYS_FRAME_FORMAT_BINARY_8,
N_IPU6_FW_ISYS_FRAME_FORMAT
};
enum ipu6_fw_isys_pin_type {
IPU6_FW_ISYS_PIN_TYPE_MIPI = 0,
IPU6_FW_ISYS_PIN_TYPE_RAW_SOC = 3,
};
enum ipu6_fw_isys_mipi_store_mode {
IPU6_FW_ISYS_MIPI_STORE_MODE_NORMAL = 0,
IPU6_FW_ISYS_MIPI_STORE_MODE_DISCARD_LONG_HEADER,
N_IPU6_FW_ISYS_MIPI_STORE_MODE
};
enum ipu6_fw_isys_capture_mode {
IPU6_FW_ISYS_CAPTURE_MODE_REGULAR = 0,
IPU6_FW_ISYS_CAPTURE_MODE_BURST,
N_IPU6_FW_ISYS_CAPTURE_MODE,
};
enum ipu6_fw_isys_sensor_mode {
IPU6_FW_ISYS_SENSOR_MODE_NORMAL = 0,
IPU6_FW_ISYS_SENSOR_MODE_TOBII,
N_IPU6_FW_ISYS_SENSOR_MODE,
};
enum ipu6_fw_isys_error {
IPU6_FW_ISYS_ERROR_NONE = 0,
IPU6_FW_ISYS_ERROR_FW_INTERNAL_CONSISTENCY,
IPU6_FW_ISYS_ERROR_HW_CONSISTENCY,
IPU6_FW_ISYS_ERROR_DRIVER_INVALID_COMMAND_SEQUENCE,
IPU6_FW_ISYS_ERROR_DRIVER_INVALID_DEVICE_CONFIGURATION,
IPU6_FW_ISYS_ERROR_DRIVER_INVALID_STREAM_CONFIGURATION,
IPU6_FW_ISYS_ERROR_DRIVER_INVALID_FRAME_CONFIGURATION,
IPU6_FW_ISYS_ERROR_INSUFFICIENT_RESOURCES,
IPU6_FW_ISYS_ERROR_HW_REPORTED_STR2MMIO,
IPU6_FW_ISYS_ERROR_HW_REPORTED_SIG2CIO,
IPU6_FW_ISYS_ERROR_SENSOR_FW_SYNC,
IPU6_FW_ISYS_ERROR_STREAM_IN_SUSPENSION,
IPU6_FW_ISYS_ERROR_RESPONSE_QUEUE_FULL,
N_IPU6_FW_ISYS_ERROR
};
enum ipu6_fw_proxy_error {
IPU6_FW_PROXY_ERROR_NONE = 0,
IPU6_FW_PROXY_ERROR_INVALID_WRITE_REGION,
IPU6_FW_PROXY_ERROR_INVALID_WRITE_OFFSET,
N_IPU6_FW_PROXY_ERROR
};
struct ipu6_fw_isys_buffer_partition_abi {
u32 num_gda_pages[IPU6_STREAM_ID_MAX];
};
struct ipu6_fw_isys_fw_config {
struct ipu6_fw_isys_buffer_partition_abi buffer_partition;
u32 num_send_queues[N_IPU6_FW_ISYS_QUEUE_TYPE];
u32 num_recv_queues[N_IPU6_FW_ISYS_QUEUE_TYPE];
};
struct ipu6_fw_isys_resolution_abi {
u32 width;
u32 height;
};
struct ipu6_fw_isys_output_pin_payload_abi {
u64 out_buf_id;
u32 addr;
u32 compress;
};
struct ipu6_fw_isys_output_pin_info_abi {
struct ipu6_fw_isys_resolution_abi output_res;
u32 stride;
u32 watermark_in_lines;
u32 payload_buf_size;
u32 ts_offsets[IPU6_PIN_PLANES_MAX];
u32 s2m_pixel_soc_pixel_remapping;
u32 csi_be_soc_pixel_remapping;
u8 send_irq;
u8 input_pin_id;
u8 pt;
u8 ft;
u8 reserved;
u8 reserve_compression;
u8 snoopable;
u8 error_handling_enable;
u32 sensor_type;
};
struct ipu6_fw_isys_input_pin_info_abi {
struct ipu6_fw_isys_resolution_abi input_res;
u8 dt;
u8 mipi_store_mode;
u8 bits_per_pix;
u8 mapped_dt;
u8 mipi_decompression;
u8 crop_first_and_last_lines;
u8 capture_mode;
u8 reserved;
};
struct ipu6_fw_isys_cropping_abi {
s32 top_offset;
s32 left_offset;
s32 bottom_offset;
s32 right_offset;
};
struct ipu6_fw_isys_stream_cfg_data_abi {
struct ipu6_fw_isys_cropping_abi crop;
struct ipu6_fw_isys_input_pin_info_abi input_pins[IPU6_MAX_IPINS];
struct ipu6_fw_isys_output_pin_info_abi output_pins[IPU6_MAX_OPINS];
u32 compfmt;
u8 nof_input_pins;
u8 nof_output_pins;
u8 send_irq_sof_discarded;
u8 send_irq_eof_discarded;
u8 send_resp_sof_discarded;
u8 send_resp_eof_discarded;
u8 src;
u8 vc;
u8 isl_use;
u8 sensor_type;
u8 reserved;
u8 reserved2;
};
struct ipu6_fw_isys_frame_buff_set_abi {
struct ipu6_fw_isys_output_pin_payload_abi output_pins[IPU6_MAX_OPINS];
u8 send_irq_sof;
u8 send_irq_eof;
u8 send_irq_capture_ack;
u8 send_irq_capture_done;
u8 send_resp_sof;
u8 send_resp_eof;
u8 send_resp_capture_ack;
u8 send_resp_capture_done;
u8 reserved[8];
};
struct ipu6_fw_isys_error_info_abi {
u32 error;
u32 error_details;
};
struct ipu6_fw_isys_resp_info_abi {
u64 buf_id;
struct ipu6_fw_isys_output_pin_payload_abi pin;
struct ipu6_fw_isys_error_info_abi error_info;
u32 timestamp[2];
u8 stream_handle;
u8 type;
u8 pin_id;
u8 reserved;
u32 reserved2;
};
struct ipu6_fw_isys_proxy_error_info_abi {
u32 error;
u32 error_details;
};
struct ipu6_fw_isys_proxy_resp_info_abi {
u32 request_id;
struct ipu6_fw_isys_proxy_error_info_abi error_info;
};
struct ipu6_fw_proxy_write_queue_token {
u32 request_id;
u32 region_index;
u32 offset;
u32 value;
};
struct ipu6_fw_resp_queue_token {
struct ipu6_fw_isys_resp_info_abi resp_info;
};
struct ipu6_fw_send_queue_token {
u64 buf_handle;
u32 payload;
u16 send_type;
u16 stream_id;
};
struct ipu6_fw_proxy_resp_queue_token {
struct ipu6_fw_isys_proxy_resp_info_abi proxy_resp_info;
};
struct ipu6_fw_proxy_send_queue_token {
u32 request_id;
u32 region_index;
u32 offset;
u32 value;
};
void
ipu6_fw_isys_dump_stream_cfg(struct device *dev,
struct ipu6_fw_isys_stream_cfg_data_abi *cfg);
void
ipu6_fw_isys_dump_frame_buff_set(struct device *dev,
struct ipu6_fw_isys_frame_buff_set_abi *buf,
unsigned int outputs);
int ipu6_fw_isys_init(struct ipu6_isys *isys, unsigned int num_streams);
int ipu6_fw_isys_close(struct ipu6_isys *isys);
int ipu6_fw_isys_simple_cmd(struct ipu6_isys *isys,
const unsigned int stream_handle, u16 send_type);
int ipu6_fw_isys_complex_cmd(struct ipu6_isys *isys,
const unsigned int stream_handle,
void *cpu_mapped_buf, dma_addr_t dma_mapped_buf,
size_t size, u16 send_type);
int ipu6_fw_isys_send_proxy_token(struct ipu6_isys *isys,
unsigned int req_id,
unsigned int index,
unsigned int offset, u32 value);
void ipu6_fw_isys_cleanup(struct ipu6_isys *isys);
struct ipu6_fw_isys_resp_info_abi *
ipu6_fw_isys_get_resp(void *context, unsigned int queue);
void ipu6_fw_isys_put_resp(void *context, unsigned int queue);
#endif