// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright 2020-2021 NXP
 */

#include <linux/init.h>
#include <linux/interconnect.h>
#include <linux/ioctl.h>
#include <linux/list.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/time64.h>
#include <media/videobuf2-v4l2.h>
#include <media/videobuf2-dma-contig.h>
#include "vpu.h"
#include "vpu_rpc.h"
#include "vpu_defs.h"
#include "vpu_helpers.h"
#include "vpu_cmds.h"
#include "vpu_v4l2.h"
#include "vpu_imx8q.h"
#include "vpu_windsor.h"

#define CMD_SIZE				2560
#define MSG_SIZE				25600
#define WINDSOR_USER_DATA_WORDS			16
#define WINDSOR_MAX_SRC_FRAMES			0x6
#define WINDSOR_MAX_REF_FRAMES			0x3
#define WINDSOR_BITRATE_UNIT			1024
#define WINDSOR_H264_EXTENDED_SAR		255

enum {
	GTB_ENC_CMD_NOOP        = 0x0,
	GTB_ENC_CMD_STREAM_START,
	GTB_ENC_CMD_FRAME_ENCODE,
	GTB_ENC_CMD_FRAME_SKIP,
	GTB_ENC_CMD_STREAM_STOP,
	GTB_ENC_CMD_PARAMETER_UPD,
	GTB_ENC_CMD_TERMINATE,
	GTB_ENC_CMD_SNAPSHOT,
	GTB_ENC_CMD_ROLL_SNAPSHOT,
	GTB_ENC_CMD_LOCK_SCHEDULER,
	GTB_ENC_CMD_UNLOCK_SCHEDULER,
	GTB_ENC_CMD_CONFIGURE_CODEC,
	GTB_ENC_CMD_DEAD_MARK,
	GTB_ENC_CMD_FIRM_RESET,
	GTB_ENC_CMD_FW_STATUS,
	GTB_ENC_CMD_RESERVED
};

enum {
	VID_API_EVENT_UNDEFINED = 0x0,
	VID_API_ENC_EVENT_RESET_DONE = 0x1,
	VID_API_ENC_EVENT_START_DONE,
	VID_API_ENC_EVENT_STOP_DONE,
	VID_API_ENC_EVENT_TERMINATE_DONE,
	VID_API_ENC_EVENT_FRAME_INPUT_DONE,
	VID_API_ENC_EVENT_FRAME_DONE,
	VID_API_ENC_EVENT_FRAME_RELEASE,
	VID_API_ENC_EVENT_PARA_UPD_DONE,
	VID_API_ENC_EVENT_MEM_REQUEST,
	VID_API_ENC_EVENT_FIRMWARE_XCPT,
	VID_API_ENC_EVENT_RESERVED
};

enum {
	MEDIAIP_ENC_PIC_TYPE_B_FRAME = 0,
	MEDIAIP_ENC_PIC_TYPE_P_FRAME,
	MEDIAIP_ENC_PIC_TYPE_I_FRAME,
	MEDIAIP_ENC_PIC_TYPE_IDR_FRAME,
	MEDIAIP_ENC_PIC_TYPE_BI_FRAME
};

struct windsor_iface {
	u32 exec_base_addr;
	u32 exec_area_size;
	struct vpu_rpc_buffer_desc cmd_buffer_desc;
	struct vpu_rpc_buffer_desc msg_buffer_desc;
	u32 cmd_int_enable[VID_API_NUM_STREAMS];
	u32 fw_version;
	u32 mvd_fw_offset;
	u32 max_streams;
	u32 ctrl_iface[VID_API_NUM_STREAMS];
	struct vpu_rpc_system_config system_config;
	u32 api_version;
	struct vpu_rpc_buffer_desc log_buffer_desc;
};

struct windsor_ctrl_iface {
	u32 enc_yuv_buffer_desc;
	u32 enc_stream_buffer_desc;
	u32 enc_expert_mode_param;
	u32 enc_param;
	u32 enc_mem_pool;
	u32 enc_encoding_status;
	u32 enc_dsa_status;
};

struct vpu_enc_yuv_desc {
	u32 frame_id;
	u32 luma_base;
	u32 chroma_base;
	u32 param_idx;
	u32 key_frame;
};

struct vpu_enc_calib_params {
	u32 use_ame;

	u32 cme_mvx_max;
	u32 cme_mvy_max;
	u32 ame_prefresh_y0;
	u32 ame_prefresh_y1;
	u32 fme_min_sad;
	u32 cme_min_sad;

	u32 fme_pred_int_weight;
	u32 fme_pred_hp_weight;
	u32 fme_pred_qp_weight;
	u32 fme_cost_weight;
	u32 fme_act_thold;
	u32 fme_sad_thold;
	u32 fme_zero_sad_thold;

	u32 fme_lrg_mvx_lmt;
	u32 fme_lrg_mvy_lmt;
	u32 fme_force_mode;
	u32 fme_force4mvcost;
	u32 fme_force2mvcost;

	u32 h264_inter_thrd;

	u32 i16x16_mode_cost;
	u32 i4x4_mode_lambda;
	u32 i8x8_mode_lambda;

	u32 inter_mod_mult;
	u32 inter_sel_mult;
	u32 inter_bid_cost;
	u32 inter_bwd_cost;
	u32 inter_4mv_cost;
	s32 one_mv_i16_cost;
	s32 one_mv_i4x4_cost;
	s32 one_mv_i8x8_cost;
	s32 two_mv_i16_cost;
	s32 two_mv_i4x4_cost;
	s32 two_mv_i8x8_cost;
	s32 four_mv_i16_cost;
	s32 four_mv_i4x4_cost;
	s32 four_mv_i8x8_cost;

	u32 intra_pred_enab;
	u32 intra_chr_pred;
	u32 intra16_pred;
	u32 intra4x4_pred;
	u32 intra8x8_pred;

	u32 cb_base;
	u32 cb_size;
	u32 cb_head_room;

	u32 mem_page_width;
	u32 mem_page_height;
	u32 mem_total_size;
	u32 mem_chunk_phys_addr;
	u32 mem_chunk_virt_addr;
	u32 mem_chunk_size;
	u32 mem_y_stride;
	u32 mem_uv_stride;

	u32 split_wr_enab;
	u32 split_wr_req_size;
	u32 split_rd_enab;
	u32 split_rd_req_size;
};

struct vpu_enc_config_params {
	u32 param_change;
	u32 start_frame;
	u32 end_frame;
	u32 userdata_enable;
	u32 userdata_id[4];
	u32 userdata_message[WINDSOR_USER_DATA_WORDS];
	u32 userdata_length;
	u32 h264_profile_idc;
	u32 h264_level_idc;
	u32 h264_au_delimiter;
	u32 h264_seq_end_code;
	u32 h264_recovery_points;
	u32 h264_vui_parameters;
	u32 h264_aspect_ratio_present;
	u32 h264_aspect_ratio_sar_width;
	u32 h264_aspect_ratio_sar_height;
	u32 h264_overscan_present;
	u32 h264_video_type_present;
	u32 h264_video_format;
	u32 h264_video_full_range;
	u32 h264_video_colour_descriptor;
	u32 h264_video_colour_primaries;
	u32 h264_video_transfer_char;
	u32 h264_video_matrix_coeff;
	u32 h264_chroma_loc_info_present;
	u32 h264_chroma_loc_type_top;
	u32 h264_chroma_loc_type_bot;
	u32 h264_timing_info_present;
	u32 h264_buffering_period_present;
	u32 h264_low_delay_hrd_flag;
	u32 aspect_ratio;
	u32 test_mode;                  // Automated firmware test mode
	u32 dsa_test_mode;              // Automated test mode for the DSA.
	u32 fme_test_mode;              // Automated test mode for the fme
	u32 cbr_row_mode;               //0: FW mode; 1: HW mode
	u32 windsor_mode;               //0: normal mode; 1: intra only mode; 2: intra+0MV mode
	u32 encode_mode;                // H264, VC1, MPEG2, DIVX
	u32 frame_width;                // display width
	u32 frame_height;               // display height
	u32 enc_frame_width;            // encoding width, should be 16-pix align
	u32 enc_frame_height;           // encoding height, should be 16-pix aligned
	u32 frame_rate_num;
	u32 frame_rate_den;
	u32 vi_field_source;
	u32 vi_frame_width;
	u32 vi_frame_height;
	u32 crop_frame_width;
	u32 crop_frame_height;
	u32 crop_x_start_posn;
	u32 crop_y_start_posn;
	u32 mode422;
	u32 mode_yuy2;
	u32 dsa_luma_en;
	u32 dsa_chroma_en;
	u32 dsa_ext_hfilt_en;
	u32 dsa_di_en;
	u32 dsa_di_top_ref;
	u32 dsa_vertf_disable;
	u32 dsa_disable_pwb;
	u32 dsa_hor_phase;
	u32 dsa_ver_phase;
	u32 dsa_iac_enable;
	u32 iac_sc_threshold;
	u32 iac_vm_threshold;
	u32 iac_skip_mode;
	u32 iac_grp_width;
	u32 iac_grp_height;
	u32 rate_control_mode;
	u32 rate_control_resolution;
	u32 buffer_size;
	u32 buffer_level_init;
	u32 buffer_I_bit_budget;
	u32 top_field_first;
	u32 intra_lum_qoffset;
	u32 intra_chr_qoffset;
	u32 inter_lum_qoffset;
	u32 inter_chr_qoffset;
	u32 use_def_scaling_mtx;
	u32 inter_8x8_enab;
	u32 inter_4x4_enab;
	u32 fme_enable_qpel;
	u32 fme_enable_hpel;
	u32 fme_nozeromv;
	u32 fme_predmv_en;
	u32 fme_pred_2mv4mv;
	u32 fme_smallsadthresh;
	u32 ame_en_lmvc;
	u32 ame_x_mult;
	u32 cme_enable_4mv;
	u32 cme_enable_1mv;
	u32 hme_enable_16x8mv;
	u32 hme_enable_8x16mv;
	u32 cme_mv_weight;
	u32 cme_mv_cost;
	u32 ame_mult_mv;
	u32 ame_shift_mv;
	u32 hme_forceto1mv_en;
	u32 hme_2mv_cost;
	u32 hme_pred_mode;
	u32 hme_sc_rnge;
	u32 hme_sw_rnge;
	u32 output_format;
	u32 timestamp_enab;
	u32 initial_pts_enab;
	u32 initial_pts;
};

struct vpu_enc_static_params {
	u32 param_change;
	u32 gop_length;
	u32 rate_control_bitrate;
	u32 rate_control_bitrate_min;
	u32 rate_control_bitrate_max;
	u32 rate_control_content_models;
	u32 rate_control_iframe_maxsize;
	u32 rate_control_qp_init;
	u32 rate_control_islice_qp;
	u32 rate_control_pslice_qp;
	u32 rate_control_bslice_qp;
	u32 adaptive_quantization;
	u32 aq_variance;
	u32 cost_optimization;
	u32 fdlp_mode;
	u32 enable_isegbframes;
	u32 enable_adaptive_keyratio;
	u32 keyratio_imin;
	u32 keyratio_imax;
	u32 keyratio_pmin;
	u32 keyratio_pmax;
	u32 keyratio_bmin;
	u32 keyratio_bmax;
	s32 keyratio_istep;
	s32 keyratio_pstep;
	s32 keyratio_bstep;
	u32 enable_paff;
	u32 enable_b_frame_ref;
	u32 enable_adaptive_gop;
	u32 enable_closed_gop;
	u32 open_gop_refresh_freq;
	u32 enable_adaptive_sc;
	u32 enable_fade_detection;
	s32 fade_detection_threshold;
	u32 enable_repeat_b;
	u32 enable_low_delay_b;
};

struct vpu_enc_dynamic_params {
	u32 param_change;
	u32 rows_per_slice;
	u32 mbaff_enable;
	u32 dbf_enable;
	u32 field_source;
	u32 gop_b_length;
	u32 mb_group_size;
	u32 cbr_rows_per_group;
	u32 skip_enable;
	u32 pts_bits_0_to_31;
	u32 pts_bit_32;
	u32 rm_expsv_cff;
	u32 const_ipred;
	s32 chr_qp_offset;
	u32 intra_mb_qp_offset;
	u32 h264_cabac_init_method;
	u32 h264_cabac_init_idc;
	u32 h264_cabac_enable;
	s32 alpha_c0_offset_div2;
	s32 beta_offset_div2;
	u32 intra_prefresh_y0;
	u32 intra_prefresh_y1;
	u32 dbg_dump_rec_src;
};

struct vpu_enc_expert_mode_param {
	struct vpu_enc_calib_params calib_param;
	struct vpu_enc_config_params config_param;
	struct vpu_enc_static_params static_param;
	struct vpu_enc_dynamic_params dynamic_param;
};

enum MEDIAIP_ENC_FMT {
	MEDIAIP_ENC_FMT_H264 = 0,
	MEDIAIP_ENC_FMT_VC1,
	MEDIAIP_ENC_FMT_MPEG2,
	MEDIAIP_ENC_FMT_MPEG4SP,
	MEDIAIP_ENC_FMT_H263,
	MEDIAIP_ENC_FMT_MPEG1,
	MEDIAIP_ENC_FMT_SHORT_HEADER,
	MEDIAIP_ENC_FMT_NULL
};

enum MEDIAIP_ENC_PROFILE {
	MEDIAIP_ENC_PROF_MPEG2_SP = 0,
	MEDIAIP_ENC_PROF_MPEG2_MP,
	MEDIAIP_ENC_PROF_MPEG2_HP,
	MEDIAIP_ENC_PROF_H264_BP,
	MEDIAIP_ENC_PROF_H264_MP,
	MEDIAIP_ENC_PROF_H264_HP,
	MEDIAIP_ENC_PROF_MPEG4_SP,
	MEDIAIP_ENC_PROF_MPEG4_ASP,
	MEDIAIP_ENC_PROF_VC1_SP,
	MEDIAIP_ENC_PROF_VC1_MP,
	MEDIAIP_ENC_PROF_VC1_AP
};

enum MEDIAIP_ENC_BITRATE_MODE {
	MEDIAIP_ENC_BITRATE_MODE_VBR          = 0x00000001,
	MEDIAIP_ENC_BITRATE_MODE_CBR          = 0x00000002,
	MEDIAIP_ENC_BITRATE_MODE_CONSTANT_QP  = 0x00000004
};

struct vpu_enc_memory_resource {
	u32 phys;
	u32 virt;
	u32 size;
};

struct vpu_enc_param {
	enum MEDIAIP_ENC_FMT codec_mode;
	enum MEDIAIP_ENC_PROFILE profile;
	u32 level;

	struct vpu_enc_memory_resource enc_mem_desc;

	u32 frame_rate;
	u32 src_stride;
	u32 src_width;
	u32 src_height;
	u32 src_offset_x;
	u32 src_offset_y;
	u32 src_crop_width;
	u32 src_crop_height;
	u32 out_width;
	u32 out_height;
	u32 iframe_interval;
	u32 bframes;
	u32 low_latency_mode;

	enum MEDIAIP_ENC_BITRATE_MODE  bitrate_mode;
	u32 target_bitrate;
	u32 max_bitrate;
	u32 min_bitrate;
	u32 init_slice_qp;
};

struct vpu_enc_mem_pool {
	struct vpu_enc_memory_resource enc_frames[WINDSOR_MAX_SRC_FRAMES];
	struct vpu_enc_memory_resource ref_frames[WINDSOR_MAX_REF_FRAMES];
	struct vpu_enc_memory_resource act_frame;
};

struct vpu_enc_encoding_status {
	u32   frame_id;
	u32   error_flag;   //Error type
	u32   mb_y;
	u32   mb_x;
	u32   reserved[12];

};

struct vpu_enc_dsa_status {
	u32   frame_id;
	u32   dsa_cyle;
	u32   mb_y;
	u32   mb_x;
	u32   reserved[4];
};

struct vpu_enc_ctrl {
	struct vpu_enc_yuv_desc *yuv_desc;
	struct vpu_rpc_buffer_desc *stream_desc;
	struct vpu_enc_expert_mode_param *expert;
	struct vpu_enc_param *param;
	struct vpu_enc_mem_pool *pool;
	struct vpu_enc_encoding_status *status;
	struct vpu_enc_dsa_status *dsa;
};

struct vpu_enc_host_ctrls {
	struct vpu_enc_ctrl ctrls[VID_API_NUM_STREAMS];
};

struct windsor_pic_info {
	u32 frame_id;
	u32 pic_encod_done;
	u32 pic_type;
	u32 skipped_frame;
	u32 error_flag;
	u32 psnr;
	u32 flush_done;
	u32 mb_y;
	u32 mb_x;
	u32 frame_size;
	u32 frame_enc_ttl_cycles;
	u32 frame_enc_ttl_frm_cycles;
	u32 frame_enc_ttl_slc_cycles;
	u32 frame_enc_ttl_enc_cycles;
	u32 frame_enc_ttl_hme_cycles;
	u32 frame_enc_ttl_dsa_cycles;
	u32 frame_enc_fw_cycles;
	u32 frame_crc;
	u32 num_interrupts_1;
	u32 num_interrupts_2;
	u32 poc;
	u32 ref_info;
	u32 pic_num;
	u32 pic_activity;
	u32 scene_change;
	u32 mb_stats;
	u32 enc_cache_count0;
	u32 enc_cache_count1;
	u32 mtl_wr_strb_cnt;
	u32 mtl_rd_strb_cnt;
	u32 str_buff_wptr;
	u32 diagnosticEvents;
	u32 proc_iacc_tot_rd_cnt;
	u32 proc_dacc_tot_rd_cnt;
	u32 proc_dacc_tot_wr_cnt;
	u32 proc_dacc_reg_rd_cnt;
	u32 proc_dacc_reg_wr_cnt;
	u32 proc_dacc_rng_rd_cnt;
	u32 proc_dacc_rng_wr_cnt;
	s32 tv_s;
	u32 tv_ns;
};

u32 vpu_windsor_get_data_size(void)
{
	return sizeof(struct vpu_enc_host_ctrls);
}

static struct vpu_enc_yuv_desc *get_yuv_desc(struct vpu_shared_addr *shared,
					     u32 instance)
{
	struct vpu_enc_host_ctrls *hcs = shared->priv;

	return hcs->ctrls[instance].yuv_desc;
}

static struct vpu_enc_mem_pool *get_mem_pool(struct vpu_shared_addr *shared,
					     u32 instance)
{
	struct vpu_enc_host_ctrls *hcs = shared->priv;

	return hcs->ctrls[instance].pool;
}

static struct vpu_rpc_buffer_desc *get_stream_buf_desc(struct vpu_shared_addr *shared,
						       u32 instance)
{
	struct vpu_enc_host_ctrls *hcs = shared->priv;

	return hcs->ctrls[instance].stream_desc;
}

static struct vpu_enc_expert_mode_param *get_expert_param(struct vpu_shared_addr *shared,
							  u32 instance)
{
	struct vpu_enc_host_ctrls *hcs = shared->priv;

	return hcs->ctrls[instance].expert;
}

static struct vpu_enc_param *get_enc_param(struct vpu_shared_addr *shared, u32 instance)
{
	struct vpu_enc_host_ctrls *hcs = shared->priv;

	return hcs->ctrls[instance].param;
}

static u32 get_ptr(u32 ptr)
{
	return (ptr | 0x80000000);
}

void vpu_windsor_init_rpc(struct vpu_shared_addr *shared,
			  struct vpu_buffer *rpc, dma_addr_t boot_addr)
{
	unsigned long base_phy_addr;
	unsigned long phy_addr;
	unsigned long offset;
	struct windsor_iface *iface;
	struct windsor_ctrl_iface *ctrl;
	struct vpu_enc_host_ctrls *hcs;
	unsigned int i;

	if (rpc->phys < boot_addr)
		return;

	base_phy_addr = rpc->phys - boot_addr;
	iface = rpc->virt;
	shared->iface = iface;
	shared->boot_addr = boot_addr;
	hcs = shared->priv;

	iface->exec_base_addr = base_phy_addr;
	iface->exec_area_size = rpc->length;

	offset = sizeof(struct windsor_iface);
	phy_addr = base_phy_addr + offset;
	shared->cmd_desc = &iface->cmd_buffer_desc;
	shared->cmd_mem_vir = rpc->virt + offset;
	iface->cmd_buffer_desc.start =
	iface->cmd_buffer_desc.rptr =
	iface->cmd_buffer_desc.wptr = phy_addr;
	iface->cmd_buffer_desc.end = iface->cmd_buffer_desc.start + CMD_SIZE;

	offset += CMD_SIZE;
	phy_addr = base_phy_addr + offset;
	shared->msg_desc = &iface->msg_buffer_desc;
	shared->msg_mem_vir = rpc->virt + offset;
	iface->msg_buffer_desc.start =
	iface->msg_buffer_desc.wptr =
	iface->msg_buffer_desc.rptr = phy_addr;
	iface->msg_buffer_desc.end = iface->msg_buffer_desc.start + MSG_SIZE;

	offset += MSG_SIZE;
	for (i = 0; i < ARRAY_SIZE(iface->ctrl_iface); i++) {
		iface->ctrl_iface[i] = base_phy_addr + offset;
		offset += sizeof(struct windsor_ctrl_iface);
	}
	for (i = 0; i < ARRAY_SIZE(iface->ctrl_iface); i++) {
		ctrl = rpc->virt + (iface->ctrl_iface[i] - base_phy_addr);

		ctrl->enc_yuv_buffer_desc = base_phy_addr + offset;
		hcs->ctrls[i].yuv_desc = rpc->virt + offset;
		offset += sizeof(struct vpu_enc_yuv_desc);

		ctrl->enc_stream_buffer_desc = base_phy_addr + offset;
		hcs->ctrls[i].stream_desc = rpc->virt + offset;
		offset += sizeof(struct vpu_rpc_buffer_desc);

		ctrl->enc_expert_mode_param = base_phy_addr + offset;
		hcs->ctrls[i].expert = rpc->virt + offset;
		offset += sizeof(struct vpu_enc_expert_mode_param);

		ctrl->enc_param = base_phy_addr + offset;
		hcs->ctrls[i].param = rpc->virt + offset;
		offset += sizeof(struct vpu_enc_param);

		ctrl->enc_mem_pool = base_phy_addr + offset;
		hcs->ctrls[i].pool = rpc->virt + offset;
		offset += sizeof(struct vpu_enc_mem_pool);

		ctrl->enc_encoding_status = base_phy_addr + offset;
		hcs->ctrls[i].status = rpc->virt + offset;
		offset += sizeof(struct vpu_enc_encoding_status);

		ctrl->enc_dsa_status = base_phy_addr + offset;
		hcs->ctrls[i].dsa = rpc->virt + offset;
		offset += sizeof(struct vpu_enc_dsa_status);
	}

	rpc->bytesused = offset;
}

void vpu_windsor_set_log_buf(struct vpu_shared_addr *shared, struct vpu_buffer *log)
{
	struct windsor_iface *iface = shared->iface;

	iface->log_buffer_desc.start =
	iface->log_buffer_desc.wptr =
	iface->log_buffer_desc.rptr = log->phys - shared->boot_addr;
	iface->log_buffer_desc.end = iface->log_buffer_desc.start + log->length;
}

void vpu_windsor_set_system_cfg(struct vpu_shared_addr *shared,
				u32 regs_base, void __iomem *regs, u32 core_id)
{
	struct windsor_iface *iface = shared->iface;
	struct vpu_rpc_system_config *config = &iface->system_config;

	vpu_imx8q_set_system_cfg_common(config, regs_base, core_id);
}

int vpu_windsor_get_stream_buffer_size(struct vpu_shared_addr *shared)
{
	return 0x300000;
}

static struct vpu_pair windsor_cmds[] = {
	{VPU_CMD_ID_NOOP, GTB_ENC_CMD_NOOP},
	{VPU_CMD_ID_CONFIGURE_CODEC, GTB_ENC_CMD_CONFIGURE_CODEC},
	{VPU_CMD_ID_START, GTB_ENC_CMD_STREAM_START},
	{VPU_CMD_ID_STOP, GTB_ENC_CMD_STREAM_STOP},
	{VPU_CMD_ID_FRAME_ENCODE, GTB_ENC_CMD_FRAME_ENCODE},
	{VPU_CMD_ID_SNAPSHOT, GTB_ENC_CMD_SNAPSHOT},
	{VPU_CMD_ID_FIRM_RESET, GTB_ENC_CMD_FIRM_RESET},
	{VPU_CMD_ID_UPDATE_PARAMETER, GTB_ENC_CMD_PARAMETER_UPD},
	{VPU_CMD_ID_DEBUG, GTB_ENC_CMD_FW_STATUS}
};

static struct vpu_pair windsor_msgs[] = {
	{VPU_MSG_ID_RESET_DONE, VID_API_ENC_EVENT_RESET_DONE},
	{VPU_MSG_ID_START_DONE, VID_API_ENC_EVENT_START_DONE},
	{VPU_MSG_ID_STOP_DONE, VID_API_ENC_EVENT_STOP_DONE},
	{VPU_MSG_ID_FRAME_INPUT_DONE, VID_API_ENC_EVENT_FRAME_INPUT_DONE},
	{VPU_MSG_ID_ENC_DONE, VID_API_ENC_EVENT_FRAME_DONE},
	{VPU_MSG_ID_FRAME_RELEASE, VID_API_ENC_EVENT_FRAME_RELEASE},
	{VPU_MSG_ID_MEM_REQUEST, VID_API_ENC_EVENT_MEM_REQUEST},
	{VPU_MSG_ID_PARAM_UPD_DONE, VID_API_ENC_EVENT_PARA_UPD_DONE},
	{VPU_MSG_ID_FIRMWARE_XCPT, VID_API_ENC_EVENT_FIRMWARE_XCPT},
};

int vpu_windsor_pack_cmd(struct vpu_rpc_event *pkt, u32 index, u32 id, void *data)
{
	int ret;

	ret = vpu_find_dst_by_src(windsor_cmds, ARRAY_SIZE(windsor_cmds), id);
	if (ret < 0)
		return ret;
	pkt->hdr.id = ret;
	pkt->hdr.num = 0;
	pkt->hdr.index = index;
	if (id == VPU_CMD_ID_FRAME_ENCODE) {
		s64 timestamp = *(s64 *)data;
		struct timespec64 ts = ns_to_timespec64(timestamp);

		pkt->hdr.num = 2;
		pkt->data[0] = ts.tv_sec;
		pkt->data[1] = ts.tv_nsec;
	}

	return 0;
}

int vpu_windsor_convert_msg_id(u32 id)
{
	return vpu_find_src_by_dst(windsor_msgs, ARRAY_SIZE(windsor_msgs), id);
}

static void vpu_windsor_unpack_pic_info(struct vpu_rpc_event *pkt, void *data)
{
	struct vpu_enc_pic_info *info = data;
	struct windsor_pic_info *windsor = (struct windsor_pic_info *)pkt->data;
	struct timespec64 ts = { windsor->tv_s, windsor->tv_ns };

	info->frame_id = windsor->frame_id;
	switch (windsor->pic_type) {
	case MEDIAIP_ENC_PIC_TYPE_I_FRAME:
	case MEDIAIP_ENC_PIC_TYPE_IDR_FRAME:
		info->pic_type = V4L2_BUF_FLAG_KEYFRAME;
		break;
	case MEDIAIP_ENC_PIC_TYPE_P_FRAME:
		info->pic_type = V4L2_BUF_FLAG_PFRAME;
		break;
	case MEDIAIP_ENC_PIC_TYPE_B_FRAME:
		info->pic_type = V4L2_BUF_FLAG_BFRAME;
		break;
	default:
		break;
	}
	info->skipped_frame = windsor->skipped_frame;
	info->error_flag = windsor->error_flag;
	info->psnr = windsor->psnr;
	info->frame_size = windsor->frame_size;
	info->wptr = get_ptr(windsor->str_buff_wptr);
	info->crc = windsor->frame_crc;
	info->timestamp = timespec64_to_ns(&ts);
}

static void vpu_windsor_unpack_mem_req(struct vpu_rpc_event *pkt, void *data)
{
	struct vpu_pkt_mem_req_data *req_data = data;

	req_data->enc_frame_size = pkt->data[0];
	req_data->enc_frame_num = pkt->data[1];
	req_data->ref_frame_size = pkt->data[2];
	req_data->ref_frame_num = pkt->data[3];
	req_data->act_buf_size = pkt->data[4];
	req_data->act_buf_num = 1;
}

int vpu_windsor_unpack_msg_data(struct vpu_rpc_event *pkt, void *data)
{
	if (!pkt || !data)
		return -EINVAL;

	switch (pkt->hdr.id) {
	case VID_API_ENC_EVENT_FRAME_DONE:
		vpu_windsor_unpack_pic_info(pkt, data);
		break;
	case VID_API_ENC_EVENT_MEM_REQUEST:
		vpu_windsor_unpack_mem_req(pkt, data);
		break;
	case VID_API_ENC_EVENT_FRAME_RELEASE:
		*(u32 *)data = pkt->data[0];
		break;
	default:
		break;
	}

	return 0;
}

static int vpu_windsor_fill_yuv_frame(struct vpu_shared_addr *shared,
				      u32 instance,
				      struct vb2_buffer *vb)
{
	struct vpu_inst *inst = vb2_get_drv_priv(vb->vb2_queue);
	struct vpu_format *out_fmt;
	struct vpu_enc_yuv_desc *desc;
	struct vb2_v4l2_buffer *vbuf;

	if (instance >= VID_API_NUM_STREAMS)
		return -EINVAL;

	desc = get_yuv_desc(shared, instance);
	out_fmt = vpu_get_format(inst, vb->type);

	vbuf = to_vb2_v4l2_buffer(vb);
	desc->frame_id = vbuf->sequence;
	if (vbuf->flags & V4L2_BUF_FLAG_KEYFRAME)
		desc->key_frame = 1;
	else
		desc->key_frame = 0;
	desc->luma_base = vpu_get_vb_phy_addr(vb, 0);
	if (vb->num_planes > 1)
		desc->chroma_base = vpu_get_vb_phy_addr(vb, 1);
	else
		desc->chroma_base = desc->luma_base + out_fmt->sizeimage[0];

	return 0;
}

int vpu_windsor_input_frame(struct vpu_shared_addr *shared,
			    struct vpu_inst *inst, struct vb2_buffer *vb)
{
	vpu_windsor_fill_yuv_frame(shared, inst->id, vb);
	return vpu_session_encode_frame(inst, vb->timestamp);
}

int vpu_windsor_config_memory_resource(struct vpu_shared_addr *shared,
				       u32 instance,
				       u32 type,
				       u32 index,
				       struct vpu_buffer *buf)
{
	struct vpu_enc_mem_pool *pool;
	struct vpu_enc_memory_resource *res;

	if (instance >= VID_API_NUM_STREAMS)
		return -EINVAL;

	pool = get_mem_pool(shared, instance);

	switch (type) {
	case MEM_RES_ENC:
		if (index >= ARRAY_SIZE(pool->enc_frames))
			return -EINVAL;
		res = &pool->enc_frames[index];
		break;
	case MEM_RES_REF:
		if (index >= ARRAY_SIZE(pool->ref_frames))
			return -EINVAL;
		res = &pool->ref_frames[index];
		break;
	case MEM_RES_ACT:
		if (index)
			return -EINVAL;
		res = &pool->act_frame;
		break;
	default:
		return -EINVAL;
	}

	res->phys = buf->phys;
	res->virt = buf->phys - shared->boot_addr;
	res->size = buf->length;

	return 0;
}

int vpu_windsor_config_stream_buffer(struct vpu_shared_addr *shared,
				     u32 instance,
				     struct vpu_buffer *buf)
{
	struct vpu_rpc_buffer_desc *desc;
	struct vpu_enc_expert_mode_param *expert;

	desc = get_stream_buf_desc(shared, instance);
	expert = get_expert_param(shared, instance);

	desc->start = buf->phys;
	desc->wptr = buf->phys;
	desc->rptr = buf->phys;
	desc->end = buf->phys + buf->length;

	expert->calib_param.mem_chunk_phys_addr = 0;
	expert->calib_param.mem_chunk_virt_addr = 0;
	expert->calib_param.mem_chunk_size = 0;
	expert->calib_param.cb_base = buf->phys;
	expert->calib_param.cb_size = buf->length;

	return 0;
}

int vpu_windsor_update_stream_buffer(struct vpu_shared_addr *shared,
				     u32 instance, u32 ptr, bool write)
{
	struct vpu_rpc_buffer_desc *desc;

	desc = get_stream_buf_desc(shared, instance);

	/*update wptr/rptr after data is written or read*/
	mb();
	if (write)
		desc->wptr = ptr;
	else
		desc->rptr = ptr;

	return 0;
}

int vpu_windsor_get_stream_buffer_desc(struct vpu_shared_addr *shared,
				       u32 instance, struct vpu_rpc_buffer_desc *desc)
{
	struct vpu_rpc_buffer_desc *rpc_desc;

	rpc_desc = get_stream_buf_desc(shared, instance);
	if (desc) {
		desc->wptr = get_ptr(rpc_desc->wptr);
		desc->rptr = get_ptr(rpc_desc->rptr);
		desc->start = get_ptr(rpc_desc->start);
		desc->end = get_ptr(rpc_desc->end);
	}

	return 0;
}

u32 vpu_windsor_get_version(struct vpu_shared_addr *shared)
{
	struct windsor_iface *iface = shared->iface;

	return iface->fw_version;
}

static int vpu_windsor_set_frame_rate(struct vpu_enc_expert_mode_param *expert,
				      struct vpu_encode_params *params)
{
	expert->config_param.frame_rate_num = params->frame_rate.numerator;
	expert->config_param.frame_rate_den = params->frame_rate.denominator;

	return 0;
}

static int vpu_windsor_set_format(struct vpu_enc_param *param, u32 pixelformat)
{
	switch (pixelformat) {
	case V4L2_PIX_FMT_H264:
		param->codec_mode = MEDIAIP_ENC_FMT_H264;
		break;
	default:
		return -EINVAL;
	}

	return 0;
}

static int vpu_windsor_set_profile(struct vpu_enc_param *param, u32 profile)
{
	switch (profile) {
	case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
		param->profile = MEDIAIP_ENC_PROF_H264_BP;
		break;
	case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
		param->profile = MEDIAIP_ENC_PROF_H264_MP;
		break;
	case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
		param->profile = MEDIAIP_ENC_PROF_H264_HP;
		break;
	default:
		return -EINVAL;
	}

	return 0;
}

static const u32 h264_level[] = {
	[V4L2_MPEG_VIDEO_H264_LEVEL_1_0] = 10,
	[V4L2_MPEG_VIDEO_H264_LEVEL_1B]  = 14,
	[V4L2_MPEG_VIDEO_H264_LEVEL_1_1] = 11,
	[V4L2_MPEG_VIDEO_H264_LEVEL_1_2] = 12,
	[V4L2_MPEG_VIDEO_H264_LEVEL_1_3] = 13,
	[V4L2_MPEG_VIDEO_H264_LEVEL_2_0] = 20,
	[V4L2_MPEG_VIDEO_H264_LEVEL_2_1] = 21,
	[V4L2_MPEG_VIDEO_H264_LEVEL_2_2] = 22,
	[V4L2_MPEG_VIDEO_H264_LEVEL_3_0] = 30,
	[V4L2_MPEG_VIDEO_H264_LEVEL_3_1] = 31,
	[V4L2_MPEG_VIDEO_H264_LEVEL_3_2] = 32,
	[V4L2_MPEG_VIDEO_H264_LEVEL_4_0] = 40,
	[V4L2_MPEG_VIDEO_H264_LEVEL_4_1] = 41,
	[V4L2_MPEG_VIDEO_H264_LEVEL_4_2] = 42,
	[V4L2_MPEG_VIDEO_H264_LEVEL_5_0] = 50,
	[V4L2_MPEG_VIDEO_H264_LEVEL_5_1] = 51
};

static int vpu_windsor_set_level(struct vpu_enc_param *param, u32 level)
{
	if (level >= ARRAY_SIZE(h264_level))
		return -EINVAL;

	param->level = h264_level[level];

	return 0;
}

static int vpu_windsor_set_size(struct vpu_enc_param *windsor,
				struct vpu_encode_params *params)
{
	windsor->src_stride = params->src_stride;
	windsor->src_width = params->src_width;
	windsor->src_height = params->src_height;
	windsor->src_offset_x = params->crop.left;
	windsor->src_offset_y = params->crop.top;
	windsor->src_crop_width = params->crop.width;
	windsor->src_crop_height = params->crop.height;
	windsor->out_width = params->out_width;
	windsor->out_height = params->out_height;

	return 0;
}

static int vpu_windsor_set_gop(struct vpu_enc_param *param, u32 gop)
{
	param->iframe_interval = gop;

	return 0;
}

static int vpu_windsor_set_bframes(struct vpu_enc_param *param, u32 bframes)
{
	if (bframes) {
		param->low_latency_mode = 0;
		param->bframes = bframes;
	} else {
		param->low_latency_mode = 1;
		param->bframes = 0;
	}

	return 0;
}

static int vpu_windsor_set_bitrate_mode(struct vpu_enc_param *param, u32 rc_enable, u32 mode)
{
	if (!rc_enable)
		param->bitrate_mode = MEDIAIP_ENC_BITRATE_MODE_CONSTANT_QP;
	else if (mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR)
		param->bitrate_mode = MEDIAIP_ENC_BITRATE_MODE_VBR;
	else
		param->bitrate_mode = MEDIAIP_ENC_BITRATE_MODE_CBR;

	return 0;
}

static u32 vpu_windsor_bitrate(u32 bitrate)
{
	return DIV_ROUND_CLOSEST(bitrate, WINDSOR_BITRATE_UNIT);
}

static int vpu_windsor_set_bitrate(struct vpu_enc_param *windsor,
				   struct vpu_encode_params *params)
{
	windsor->target_bitrate = vpu_windsor_bitrate(params->bitrate);
	windsor->min_bitrate = vpu_windsor_bitrate(params->bitrate_min);
	windsor->max_bitrate = vpu_windsor_bitrate(params->bitrate_max);

	return 0;
}

static int vpu_windsor_set_qp(struct vpu_enc_expert_mode_param *expert,
			      struct vpu_encode_params *params)
{
	expert->static_param.rate_control_islice_qp = params->i_frame_qp;
	expert->static_param.rate_control_pslice_qp = params->p_frame_qp;
	expert->static_param.rate_control_bslice_qp = params->b_frame_qp;

	return 0;
}

static int vpu_windsor_set_sar(struct vpu_enc_expert_mode_param *expert,
			       struct vpu_encode_params *params)
{
	expert->config_param.h264_aspect_ratio_present = params->sar.enable;
	if (params->sar.idc == V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_EXTENDED)
		expert->config_param.aspect_ratio = WINDSOR_H264_EXTENDED_SAR;
	else
		expert->config_param.aspect_ratio = params->sar.idc;
	expert->config_param.h264_aspect_ratio_sar_width = params->sar.width;
	expert->config_param.h264_aspect_ratio_sar_height = params->sar.height;

	return 0;
}

static int vpu_windsor_set_color(struct vpu_enc_expert_mode_param *expert,
				 struct vpu_encode_params *params)
{
	expert->config_param.h264_video_type_present = 1;
	expert->config_param.h264_video_format = 5;
	expert->config_param.h264_video_colour_descriptor = 1;
	expert->config_param.h264_video_colour_primaries =
		vpu_color_cvrt_primaries_v2i(params->color.primaries);
	expert->config_param.h264_video_transfer_char =
		vpu_color_cvrt_transfers_v2i(params->color.transfer);
	expert->config_param.h264_video_matrix_coeff =
		vpu_color_cvrt_matrix_v2i(params->color.matrix);
	expert->config_param.h264_video_full_range =
		vpu_color_cvrt_full_range_v2i(params->color.full_range);
	return 0;
}

static int vpu_windsor_update_bitrate(struct vpu_shared_addr *shared,
				      u32 instance, struct vpu_encode_params *params)
{
	struct vpu_enc_param *windsor;
	struct vpu_enc_expert_mode_param *expert;

	windsor = get_enc_param(shared, instance);
	expert = get_expert_param(shared, instance);

	if (windsor->bitrate_mode != MEDIAIP_ENC_BITRATE_MODE_CBR)
		return 0;
	if (!params->rc_enable)
		return 0;
	if (vpu_windsor_bitrate(params->bitrate) == windsor->target_bitrate)
		return 0;

	vpu_windsor_set_bitrate(windsor, params);
	expert->static_param.rate_control_bitrate = windsor->target_bitrate;
	expert->static_param.rate_control_bitrate_min = windsor->min_bitrate;
	expert->static_param.rate_control_bitrate_max = windsor->max_bitrate;

	return 0;
}

static int vpu_windsor_set_params(struct vpu_shared_addr *shared,
				  u32 instance, struct vpu_encode_params *params)
{
	struct vpu_enc_param *windsor;
	int ret;

	windsor = get_enc_param(shared, instance);

	if (params->input_format != V4L2_PIX_FMT_NV12 &&
	    params->input_format != V4L2_PIX_FMT_NV12M)
		return -EINVAL;

	ret = vpu_windsor_set_format(windsor, params->codec_format);
	if (ret)
		return ret;
	vpu_windsor_set_profile(windsor, params->profile);
	vpu_windsor_set_level(windsor, params->level);
	vpu_windsor_set_size(windsor, params);
	vpu_windsor_set_gop(windsor, params->gop_length);
	vpu_windsor_set_bframes(windsor, params->bframes);
	vpu_windsor_set_bitrate_mode(windsor, params->rc_enable, params->rc_mode);
	vpu_windsor_set_bitrate(windsor, params);
	windsor->init_slice_qp = params->i_frame_qp;

	if (!params->frame_rate.numerator)
		return -EINVAL;
	windsor->frame_rate = params->frame_rate.denominator / params->frame_rate.numerator;

	return 0;
}

static int vpu_windsor_update_params(struct vpu_shared_addr *shared,
				     u32 instance, struct vpu_encode_params *params)
{
	struct vpu_enc_expert_mode_param *expert;

	expert = get_expert_param(shared, instance);

	vpu_windsor_set_frame_rate(expert, params);
	vpu_windsor_set_qp(expert, params);
	vpu_windsor_set_sar(expert, params);
	vpu_windsor_set_color(expert, params);
	vpu_windsor_update_bitrate(shared, instance, params);
	/*expert->config_param.iac_sc_threshold = 0;*/

	return 0;
}

int vpu_windsor_set_encode_params(struct vpu_shared_addr *shared,
				  u32 instance, struct vpu_encode_params *params, u32 update)
{
	if (!params)
		return -EINVAL;

	if (!update)
		return vpu_windsor_set_params(shared, instance, params);
	else
		return vpu_windsor_update_params(shared, instance, params);
}

u32 vpu_windsor_get_max_instance_count(struct vpu_shared_addr *shared)
{
	struct windsor_iface *iface = shared->iface;

	return iface->max_streams;
}
