162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2020-2021 NXP 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/init.h> 762306a36Sopenharmony_ci#include <linux/interconnect.h> 862306a36Sopenharmony_ci#include <linux/ioctl.h> 962306a36Sopenharmony_ci#include <linux/list.h> 1062306a36Sopenharmony_ci#include <linux/kernel.h> 1162306a36Sopenharmony_ci#include <linux/module.h> 1262306a36Sopenharmony_ci#include <linux/platform_device.h> 1362306a36Sopenharmony_ci#include <linux/delay.h> 1462306a36Sopenharmony_ci#include <linux/rational.h> 1562306a36Sopenharmony_ci#include <linux/time64.h> 1662306a36Sopenharmony_ci#include <media/videobuf2-v4l2.h> 1762306a36Sopenharmony_ci#include <media/videobuf2-dma-contig.h> 1862306a36Sopenharmony_ci#include <linux/videodev2.h> 1962306a36Sopenharmony_ci#include "vpu.h" 2062306a36Sopenharmony_ci#include "vpu_rpc.h" 2162306a36Sopenharmony_ci#include "vpu_defs.h" 2262306a36Sopenharmony_ci#include "vpu_helpers.h" 2362306a36Sopenharmony_ci#include "vpu_v4l2.h" 2462306a36Sopenharmony_ci#include "vpu_cmds.h" 2562306a36Sopenharmony_ci#include "vpu_imx8q.h" 2662306a36Sopenharmony_ci#include "vpu_malone.h" 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define CMD_SIZE 25600 2962306a36Sopenharmony_ci#define MSG_SIZE 25600 3062306a36Sopenharmony_ci#define CODEC_SIZE 0x1000 3162306a36Sopenharmony_ci#define JPEG_SIZE 0x1000 3262306a36Sopenharmony_ci#define SEQ_SIZE 0x1000 3362306a36Sopenharmony_ci#define GOP_SIZE 0x1000 3462306a36Sopenharmony_ci#define PIC_SIZE 0x1000 3562306a36Sopenharmony_ci#define QMETER_SIZE 0x1000 3662306a36Sopenharmony_ci#define DBGLOG_SIZE 0x10000 3762306a36Sopenharmony_ci#define DEBUG_SIZE 0x80000 3862306a36Sopenharmony_ci#define ENG_SIZE 0x1000 3962306a36Sopenharmony_ci#define MALONE_SKIPPED_FRAME_ID 0x555 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#define MALONE_ALIGN_MBI 0x800 4262306a36Sopenharmony_ci#define MALONE_DCP_CHUNK_BIT 16 4362306a36Sopenharmony_ci#define MALONE_DCP_SIZE_MAX 0x3000000 4462306a36Sopenharmony_ci#define MALONE_DCP_SIZE_MIN 0x100000 4562306a36Sopenharmony_ci#define MALONE_DCP_FIXED_MB_ALLOC 250 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci#define CONFIG_SET(val, cfg, pos, mask) \ 4862306a36Sopenharmony_ci (*(cfg) |= (((val) << (pos)) & (mask))) 4962306a36Sopenharmony_ci//x means source data , y means destination data 5062306a36Sopenharmony_ci#define STREAM_CONFIG_FORMAT_SET(x, y) CONFIG_SET(x, y, 0, 0x0000000F) 5162306a36Sopenharmony_ci#define STREAM_CONFIG_STRBUFIDX_SET(x, y) CONFIG_SET(x, y, 8, 0x00000300) 5262306a36Sopenharmony_ci#define STREAM_CONFIG_NOSEQ_SET(x, y) CONFIG_SET(x, y, 10, 0x00000400) 5362306a36Sopenharmony_ci#define STREAM_CONFIG_DEBLOCK_SET(x, y) CONFIG_SET(x, y, 11, 0x00000800) 5462306a36Sopenharmony_ci#define STREAM_CONFIG_DERING_SET(x, y) CONFIG_SET(x, y, 12, 0x00001000) 5562306a36Sopenharmony_ci#define STREAM_CONFIG_IBWAIT_SET(x, y) CONFIG_SET(x, y, 13, 0x00002000) 5662306a36Sopenharmony_ci#define STREAM_CONFIG_FBC_SET(x, y) CONFIG_SET(x, y, 14, 0x00004000) 5762306a36Sopenharmony_ci#define STREAM_CONFIG_PLAY_MODE_SET(x, y) CONFIG_SET(x, y, 16, 0x00030000) 5862306a36Sopenharmony_ci#define STREAM_CONFIG_ENABLE_DCP_SET(x, y) CONFIG_SET(x, y, 20, 0x00100000) 5962306a36Sopenharmony_ci#define STREAM_CONFIG_NUM_STR_BUF_SET(x, y) CONFIG_SET(x, y, 21, 0x00600000) 6062306a36Sopenharmony_ci#define STREAM_CONFIG_MALONE_USAGE_SET(x, y) CONFIG_SET(x, y, 23, 0x01800000) 6162306a36Sopenharmony_ci#define STREAM_CONFIG_MULTI_VID_SET(x, y) CONFIG_SET(x, y, 25, 0x02000000) 6262306a36Sopenharmony_ci#define STREAM_CONFIG_OBFUSC_EN_SET(x, y) CONFIG_SET(x, y, 26, 0x04000000) 6362306a36Sopenharmony_ci#define STREAM_CONFIG_RC4_EN_SET(x, y) CONFIG_SET(x, y, 27, 0x08000000) 6462306a36Sopenharmony_ci#define STREAM_CONFIG_MCX_SET(x, y) CONFIG_SET(x, y, 28, 0x10000000) 6562306a36Sopenharmony_ci#define STREAM_CONFIG_PES_SET(x, y) CONFIG_SET(x, y, 29, 0x20000000) 6662306a36Sopenharmony_ci#define STREAM_CONFIG_NUM_DBE_SET(x, y) CONFIG_SET(x, y, 30, 0x40000000) 6762306a36Sopenharmony_ci#define STREAM_CONFIG_FS_CTRL_MODE_SET(x, y) CONFIG_SET(x, y, 31, 0x80000000) 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#define MALONE_DEC_FMT_RV_MASK BIT(21) 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cienum vpu_malone_stream_input_mode { 7262306a36Sopenharmony_ci INVALID_MODE = 0, 7362306a36Sopenharmony_ci FRAME_LVL, 7462306a36Sopenharmony_ci NON_FRAME_LVL 7562306a36Sopenharmony_ci}; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_cienum vpu_malone_format { 7862306a36Sopenharmony_ci MALONE_FMT_NULL = 0x0, 7962306a36Sopenharmony_ci MALONE_FMT_AVC = 0x1, 8062306a36Sopenharmony_ci MALONE_FMT_MP2 = 0x2, 8162306a36Sopenharmony_ci MALONE_FMT_VC1 = 0x3, 8262306a36Sopenharmony_ci MALONE_FMT_AVS = 0x4, 8362306a36Sopenharmony_ci MALONE_FMT_ASP = 0x5, 8462306a36Sopenharmony_ci MALONE_FMT_JPG = 0x6, 8562306a36Sopenharmony_ci MALONE_FMT_RV = 0x7, 8662306a36Sopenharmony_ci MALONE_FMT_VP6 = 0x8, 8762306a36Sopenharmony_ci MALONE_FMT_SPK = 0x9, 8862306a36Sopenharmony_ci MALONE_FMT_VP8 = 0xA, 8962306a36Sopenharmony_ci MALONE_FMT_HEVC = 0xB, 9062306a36Sopenharmony_ci MALONE_FMT_LAST = MALONE_FMT_HEVC 9162306a36Sopenharmony_ci}; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cienum { 9462306a36Sopenharmony_ci VID_API_CMD_NULL = 0x00, 9562306a36Sopenharmony_ci VID_API_CMD_PARSE_NEXT_SEQ = 0x01, 9662306a36Sopenharmony_ci VID_API_CMD_PARSE_NEXT_I = 0x02, 9762306a36Sopenharmony_ci VID_API_CMD_PARSE_NEXT_IP = 0x03, 9862306a36Sopenharmony_ci VID_API_CMD_PARSE_NEXT_ANY = 0x04, 9962306a36Sopenharmony_ci VID_API_CMD_DEC_PIC = 0x05, 10062306a36Sopenharmony_ci VID_API_CMD_UPDATE_ES_WR_PTR = 0x06, 10162306a36Sopenharmony_ci VID_API_CMD_UPDATE_ES_RD_PTR = 0x07, 10262306a36Sopenharmony_ci VID_API_CMD_UPDATE_UDATA = 0x08, 10362306a36Sopenharmony_ci VID_API_CMD_GET_FSINFO = 0x09, 10462306a36Sopenharmony_ci VID_API_CMD_SKIP_PIC = 0x0a, 10562306a36Sopenharmony_ci VID_API_CMD_DEC_CHUNK = 0x0b, 10662306a36Sopenharmony_ci VID_API_CMD_START = 0x10, 10762306a36Sopenharmony_ci VID_API_CMD_STOP = 0x11, 10862306a36Sopenharmony_ci VID_API_CMD_ABORT = 0x12, 10962306a36Sopenharmony_ci VID_API_CMD_RST_BUF = 0x13, 11062306a36Sopenharmony_ci VID_API_CMD_FS_RELEASE = 0x15, 11162306a36Sopenharmony_ci VID_API_CMD_MEM_REGION_ATTACH = 0x16, 11262306a36Sopenharmony_ci VID_API_CMD_MEM_REGION_DETACH = 0x17, 11362306a36Sopenharmony_ci VID_API_CMD_MVC_VIEW_SELECT = 0x18, 11462306a36Sopenharmony_ci VID_API_CMD_FS_ALLOC = 0x19, 11562306a36Sopenharmony_ci VID_API_CMD_DBG_GET_STATUS = 0x1C, 11662306a36Sopenharmony_ci VID_API_CMD_DBG_START_LOG = 0x1D, 11762306a36Sopenharmony_ci VID_API_CMD_DBG_STOP_LOG = 0x1E, 11862306a36Sopenharmony_ci VID_API_CMD_DBG_DUMP_LOG = 0x1F, 11962306a36Sopenharmony_ci VID_API_CMD_YUV_READY = 0x20, 12062306a36Sopenharmony_ci VID_API_CMD_TS = 0x21, 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci VID_API_CMD_FIRM_RESET = 0x40, 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci VID_API_CMD_SNAPSHOT = 0xAA, 12562306a36Sopenharmony_ci VID_API_CMD_ROLL_SNAPSHOT = 0xAB, 12662306a36Sopenharmony_ci VID_API_CMD_LOCK_SCHEDULER = 0xAC, 12762306a36Sopenharmony_ci VID_API_CMD_UNLOCK_SCHEDULER = 0xAD, 12862306a36Sopenharmony_ci VID_API_CMD_CQ_FIFO_DUMP = 0xAE, 12962306a36Sopenharmony_ci VID_API_CMD_DBG_FIFO_DUMP = 0xAF, 13062306a36Sopenharmony_ci VID_API_CMD_SVC_ILP = 0xBB, 13162306a36Sopenharmony_ci VID_API_CMD_FW_STATUS = 0xF0, 13262306a36Sopenharmony_ci VID_API_CMD_INVALID = 0xFF 13362306a36Sopenharmony_ci}; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_cienum { 13662306a36Sopenharmony_ci VID_API_EVENT_NULL = 0x00, 13762306a36Sopenharmony_ci VID_API_EVENT_RESET_DONE = 0x01, 13862306a36Sopenharmony_ci VID_API_EVENT_SEQ_HDR_FOUND = 0x02, 13962306a36Sopenharmony_ci VID_API_EVENT_PIC_HDR_FOUND = 0x03, 14062306a36Sopenharmony_ci VID_API_EVENT_PIC_DECODED = 0x04, 14162306a36Sopenharmony_ci VID_API_EVENT_FIFO_LOW = 0x05, 14262306a36Sopenharmony_ci VID_API_EVENT_FIFO_HIGH = 0x06, 14362306a36Sopenharmony_ci VID_API_EVENT_FIFO_EMPTY = 0x07, 14462306a36Sopenharmony_ci VID_API_EVENT_FIFO_FULL = 0x08, 14562306a36Sopenharmony_ci VID_API_EVENT_BS_ERROR = 0x09, 14662306a36Sopenharmony_ci VID_API_EVENT_UDATA_FIFO_UPTD = 0x0A, 14762306a36Sopenharmony_ci VID_API_EVENT_RES_CHANGE = 0x0B, 14862306a36Sopenharmony_ci VID_API_EVENT_FIFO_OVF = 0x0C, 14962306a36Sopenharmony_ci VID_API_EVENT_CHUNK_DECODED = 0x0D, 15062306a36Sopenharmony_ci VID_API_EVENT_REQ_FRAME_BUFF = 0x10, 15162306a36Sopenharmony_ci VID_API_EVENT_FRAME_BUFF_RDY = 0x11, 15262306a36Sopenharmony_ci VID_API_EVENT_REL_FRAME_BUFF = 0x12, 15362306a36Sopenharmony_ci VID_API_EVENT_STR_BUF_RST = 0x13, 15462306a36Sopenharmony_ci VID_API_EVENT_RET_PING = 0x14, 15562306a36Sopenharmony_ci VID_API_EVENT_QMETER = 0x15, 15662306a36Sopenharmony_ci VID_API_EVENT_STR_FMT_CHANGE = 0x16, 15762306a36Sopenharmony_ci VID_API_EVENT_FIRMWARE_XCPT = 0x17, 15862306a36Sopenharmony_ci VID_API_EVENT_START_DONE = 0x18, 15962306a36Sopenharmony_ci VID_API_EVENT_STOPPED = 0x19, 16062306a36Sopenharmony_ci VID_API_EVENT_ABORT_DONE = 0x1A, 16162306a36Sopenharmony_ci VID_API_EVENT_FINISHED = 0x1B, 16262306a36Sopenharmony_ci VID_API_EVENT_DBG_STAT_UPDATE = 0x1C, 16362306a36Sopenharmony_ci VID_API_EVENT_DBG_LOG_STARTED = 0x1D, 16462306a36Sopenharmony_ci VID_API_EVENT_DBG_LOG_STOPPED = 0x1E, 16562306a36Sopenharmony_ci VID_API_EVENT_DBG_LOG_UPDATED = 0x1F, 16662306a36Sopenharmony_ci VID_API_EVENT_DBG_MSG_DEC = 0x20, 16762306a36Sopenharmony_ci VID_API_EVENT_DEC_SC_ERR = 0x21, 16862306a36Sopenharmony_ci VID_API_EVENT_CQ_FIFO_DUMP = 0x22, 16962306a36Sopenharmony_ci VID_API_EVENT_DBG_FIFO_DUMP = 0x23, 17062306a36Sopenharmony_ci VID_API_EVENT_DEC_CHECK_RES = 0x24, 17162306a36Sopenharmony_ci VID_API_EVENT_DEC_CFG_INFO = 0x25, 17262306a36Sopenharmony_ci VID_API_EVENT_UNSUPPORTED_STREAM = 0x26, 17362306a36Sopenharmony_ci VID_API_EVENT_PIC_SKIPPED = 0x27, 17462306a36Sopenharmony_ci VID_API_EVENT_STR_SUSPENDED = 0x30, 17562306a36Sopenharmony_ci VID_API_EVENT_SNAPSHOT_DONE = 0x40, 17662306a36Sopenharmony_ci VID_API_EVENT_FW_STATUS = 0xF0, 17762306a36Sopenharmony_ci VID_API_EVENT_INVALID = 0xFF 17862306a36Sopenharmony_ci}; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_cistruct vpu_malone_buffer_desc { 18162306a36Sopenharmony_ci struct vpu_rpc_buffer_desc buffer; 18262306a36Sopenharmony_ci u32 low; 18362306a36Sopenharmony_ci u32 high; 18462306a36Sopenharmony_ci}; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cistruct vpu_malone_str_buffer { 18762306a36Sopenharmony_ci u32 wptr; 18862306a36Sopenharmony_ci u32 rptr; 18962306a36Sopenharmony_ci u32 start; 19062306a36Sopenharmony_ci u32 end; 19162306a36Sopenharmony_ci u32 lwm; 19262306a36Sopenharmony_ci}; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_cistruct vpu_malone_picth_info { 19562306a36Sopenharmony_ci u32 frame_pitch; 19662306a36Sopenharmony_ci}; 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_cistruct vpu_malone_table_desc { 19962306a36Sopenharmony_ci u32 array_base; 20062306a36Sopenharmony_ci u32 size; 20162306a36Sopenharmony_ci}; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_cistruct vpu_malone_dbglog_desc { 20462306a36Sopenharmony_ci u32 addr; 20562306a36Sopenharmony_ci u32 size; 20662306a36Sopenharmony_ci u32 level; 20762306a36Sopenharmony_ci u32 reserved; 20862306a36Sopenharmony_ci}; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_cistruct vpu_malone_frame_buffer { 21162306a36Sopenharmony_ci u32 addr; 21262306a36Sopenharmony_ci u32 size; 21362306a36Sopenharmony_ci}; 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_cistruct vpu_malone_udata { 21662306a36Sopenharmony_ci u32 base; 21762306a36Sopenharmony_ci u32 total_size; 21862306a36Sopenharmony_ci u32 slot_size; 21962306a36Sopenharmony_ci}; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_cistruct vpu_malone_buffer_info { 22262306a36Sopenharmony_ci u32 stream_input_mode; 22362306a36Sopenharmony_ci u32 stream_pic_input_count; 22462306a36Sopenharmony_ci u32 stream_pic_parsed_count; 22562306a36Sopenharmony_ci u32 stream_buffer_threshold; 22662306a36Sopenharmony_ci u32 stream_pic_end_flag; 22762306a36Sopenharmony_ci}; 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_cistruct vpu_malone_encrypt_info { 23062306a36Sopenharmony_ci u32 rec4key[8]; 23162306a36Sopenharmony_ci u32 obfusc; 23262306a36Sopenharmony_ci}; 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_cistruct malone_iface { 23562306a36Sopenharmony_ci u32 exec_base_addr; 23662306a36Sopenharmony_ci u32 exec_area_size; 23762306a36Sopenharmony_ci struct vpu_malone_buffer_desc cmd_buffer_desc; 23862306a36Sopenharmony_ci struct vpu_malone_buffer_desc msg_buffer_desc; 23962306a36Sopenharmony_ci u32 cmd_int_enable[VID_API_NUM_STREAMS]; 24062306a36Sopenharmony_ci struct vpu_malone_picth_info stream_pitch_info[VID_API_NUM_STREAMS]; 24162306a36Sopenharmony_ci u32 stream_config[VID_API_NUM_STREAMS]; 24262306a36Sopenharmony_ci struct vpu_malone_table_desc codec_param_tab_desc; 24362306a36Sopenharmony_ci struct vpu_malone_table_desc jpeg_param_tab_desc; 24462306a36Sopenharmony_ci u32 stream_buffer_desc[VID_API_NUM_STREAMS][VID_API_MAX_BUF_PER_STR]; 24562306a36Sopenharmony_ci struct vpu_malone_table_desc seq_info_tab_desc; 24662306a36Sopenharmony_ci struct vpu_malone_table_desc pic_info_tab_desc; 24762306a36Sopenharmony_ci struct vpu_malone_table_desc gop_info_tab_desc; 24862306a36Sopenharmony_ci struct vpu_malone_table_desc qmeter_info_tab_desc; 24962306a36Sopenharmony_ci u32 stream_error[VID_API_NUM_STREAMS]; 25062306a36Sopenharmony_ci u32 fw_version; 25162306a36Sopenharmony_ci u32 fw_offset; 25262306a36Sopenharmony_ci u32 max_streams; 25362306a36Sopenharmony_ci struct vpu_malone_dbglog_desc dbglog_desc; 25462306a36Sopenharmony_ci struct vpu_rpc_buffer_desc api_cmd_buffer_desc[VID_API_NUM_STREAMS]; 25562306a36Sopenharmony_ci struct vpu_malone_udata udata_buffer[VID_API_NUM_STREAMS]; 25662306a36Sopenharmony_ci struct vpu_malone_buffer_desc debug_buffer_desc; 25762306a36Sopenharmony_ci struct vpu_malone_buffer_desc eng_access_buff_desc[VID_API_NUM_STREAMS]; 25862306a36Sopenharmony_ci u32 encrypt_info[VID_API_NUM_STREAMS]; 25962306a36Sopenharmony_ci struct vpu_rpc_system_config system_cfg; 26062306a36Sopenharmony_ci u32 api_version; 26162306a36Sopenharmony_ci struct vpu_malone_buffer_info stream_buff_info[VID_API_NUM_STREAMS]; 26262306a36Sopenharmony_ci}; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_cistruct malone_jpg_params { 26562306a36Sopenharmony_ci u32 rotation_angle; 26662306a36Sopenharmony_ci u32 horiz_scale_factor; 26762306a36Sopenharmony_ci u32 vert_scale_factor; 26862306a36Sopenharmony_ci u32 rotation_mode; 26962306a36Sopenharmony_ci u32 rgb_mode; 27062306a36Sopenharmony_ci u32 chunk_mode; /* 0 ~ 1 */ 27162306a36Sopenharmony_ci u32 last_chunk; /* 0 ~ 1 */ 27262306a36Sopenharmony_ci u32 chunk_rows; /* 0 ~ 255 */ 27362306a36Sopenharmony_ci u32 num_bytes; 27462306a36Sopenharmony_ci u32 jpg_crop_x; 27562306a36Sopenharmony_ci u32 jpg_crop_y; 27662306a36Sopenharmony_ci u32 jpg_crop_width; 27762306a36Sopenharmony_ci u32 jpg_crop_height; 27862306a36Sopenharmony_ci u32 jpg_mjpeg_mode; 27962306a36Sopenharmony_ci u32 jpg_mjpeg_interlaced; 28062306a36Sopenharmony_ci}; 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_cistruct malone_codec_params { 28362306a36Sopenharmony_ci u32 disp_imm; 28462306a36Sopenharmony_ci u32 fourcc; 28562306a36Sopenharmony_ci u32 codec_version; 28662306a36Sopenharmony_ci u32 frame_rate; 28762306a36Sopenharmony_ci u32 dbglog_enable; 28862306a36Sopenharmony_ci u32 bsdma_lwm; 28962306a36Sopenharmony_ci u32 bbd_coring; 29062306a36Sopenharmony_ci u32 bbd_s_thr_row; 29162306a36Sopenharmony_ci u32 bbd_p_thr_row; 29262306a36Sopenharmony_ci u32 bbd_s_thr_logo_row; 29362306a36Sopenharmony_ci u32 bbd_p_thr_logo_row; 29462306a36Sopenharmony_ci u32 bbd_s_thr_col; 29562306a36Sopenharmony_ci u32 bbd_p_thr_col; 29662306a36Sopenharmony_ci u32 bbd_chr_thr_row; 29762306a36Sopenharmony_ci u32 bbd_chr_thr_col; 29862306a36Sopenharmony_ci u32 bbd_uv_mid_level; 29962306a36Sopenharmony_ci u32 bbd_excl_win_mb_left; 30062306a36Sopenharmony_ci u32 bbd_excl_win_mb_right; 30162306a36Sopenharmony_ci}; 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_cistruct malone_padding_scode { 30462306a36Sopenharmony_ci u32 scode_type; 30562306a36Sopenharmony_ci u32 pixelformat; 30662306a36Sopenharmony_ci u32 data[2]; 30762306a36Sopenharmony_ci}; 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_cistruct malone_fmt_mapping { 31062306a36Sopenharmony_ci u32 pixelformat; 31162306a36Sopenharmony_ci enum vpu_malone_format malone_format; 31262306a36Sopenharmony_ci u32 is_disabled; 31362306a36Sopenharmony_ci}; 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_cistruct malone_scode_t { 31662306a36Sopenharmony_ci struct vpu_inst *inst; 31762306a36Sopenharmony_ci struct vb2_buffer *vb; 31862306a36Sopenharmony_ci u32 wptr; 31962306a36Sopenharmony_ci u32 need_data; 32062306a36Sopenharmony_ci}; 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_cistruct malone_scode_handler { 32362306a36Sopenharmony_ci u32 pixelformat; 32462306a36Sopenharmony_ci int (*insert_scode_seq)(struct malone_scode_t *scode); 32562306a36Sopenharmony_ci int (*insert_scode_pic)(struct malone_scode_t *scode); 32662306a36Sopenharmony_ci}; 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_cistruct vpu_dec_ctrl { 32962306a36Sopenharmony_ci struct malone_codec_params *codec_param; 33062306a36Sopenharmony_ci struct malone_jpg_params *jpg; 33162306a36Sopenharmony_ci void *seq_mem; 33262306a36Sopenharmony_ci void *pic_mem; 33362306a36Sopenharmony_ci void *gop_mem; 33462306a36Sopenharmony_ci void *qmeter_mem; 33562306a36Sopenharmony_ci void *dbglog_mem; 33662306a36Sopenharmony_ci struct vpu_malone_str_buffer __iomem *str_buf[VID_API_NUM_STREAMS]; 33762306a36Sopenharmony_ci u32 buf_addr[VID_API_NUM_STREAMS]; 33862306a36Sopenharmony_ci}; 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ciu32 vpu_malone_get_data_size(void) 34162306a36Sopenharmony_ci{ 34262306a36Sopenharmony_ci return sizeof(struct vpu_dec_ctrl); 34362306a36Sopenharmony_ci} 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_civoid vpu_malone_init_rpc(struct vpu_shared_addr *shared, 34662306a36Sopenharmony_ci struct vpu_buffer *rpc, dma_addr_t boot_addr) 34762306a36Sopenharmony_ci{ 34862306a36Sopenharmony_ci struct malone_iface *iface; 34962306a36Sopenharmony_ci struct vpu_dec_ctrl *hc; 35062306a36Sopenharmony_ci unsigned long base_phy_addr; 35162306a36Sopenharmony_ci unsigned long phy_addr; 35262306a36Sopenharmony_ci unsigned long offset; 35362306a36Sopenharmony_ci unsigned int i; 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci if (rpc->phys < boot_addr) 35662306a36Sopenharmony_ci return; 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci iface = rpc->virt; 35962306a36Sopenharmony_ci base_phy_addr = rpc->phys - boot_addr; 36062306a36Sopenharmony_ci hc = shared->priv; 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci shared->iface = iface; 36362306a36Sopenharmony_ci shared->boot_addr = boot_addr; 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci iface->exec_base_addr = base_phy_addr; 36662306a36Sopenharmony_ci iface->exec_area_size = rpc->length; 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ci offset = sizeof(struct malone_iface); 36962306a36Sopenharmony_ci phy_addr = base_phy_addr + offset; 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci shared->cmd_desc = &iface->cmd_buffer_desc.buffer; 37262306a36Sopenharmony_ci shared->cmd_mem_vir = rpc->virt + offset; 37362306a36Sopenharmony_ci iface->cmd_buffer_desc.buffer.start = 37462306a36Sopenharmony_ci iface->cmd_buffer_desc.buffer.rptr = 37562306a36Sopenharmony_ci iface->cmd_buffer_desc.buffer.wptr = phy_addr; 37662306a36Sopenharmony_ci iface->cmd_buffer_desc.buffer.end = iface->cmd_buffer_desc.buffer.start + CMD_SIZE; 37762306a36Sopenharmony_ci offset += CMD_SIZE; 37862306a36Sopenharmony_ci phy_addr = base_phy_addr + offset; 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci shared->msg_desc = &iface->msg_buffer_desc.buffer; 38162306a36Sopenharmony_ci shared->msg_mem_vir = rpc->virt + offset; 38262306a36Sopenharmony_ci iface->msg_buffer_desc.buffer.start = 38362306a36Sopenharmony_ci iface->msg_buffer_desc.buffer.wptr = 38462306a36Sopenharmony_ci iface->msg_buffer_desc.buffer.rptr = phy_addr; 38562306a36Sopenharmony_ci iface->msg_buffer_desc.buffer.end = iface->msg_buffer_desc.buffer.start + MSG_SIZE; 38662306a36Sopenharmony_ci offset += MSG_SIZE; 38762306a36Sopenharmony_ci phy_addr = base_phy_addr + offset; 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ci iface->codec_param_tab_desc.array_base = phy_addr; 39062306a36Sopenharmony_ci hc->codec_param = rpc->virt + offset; 39162306a36Sopenharmony_ci offset += CODEC_SIZE; 39262306a36Sopenharmony_ci phy_addr = base_phy_addr + offset; 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci iface->jpeg_param_tab_desc.array_base = phy_addr; 39562306a36Sopenharmony_ci hc->jpg = rpc->virt + offset; 39662306a36Sopenharmony_ci offset += JPEG_SIZE; 39762306a36Sopenharmony_ci phy_addr = base_phy_addr + offset; 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci iface->seq_info_tab_desc.array_base = phy_addr; 40062306a36Sopenharmony_ci hc->seq_mem = rpc->virt + offset; 40162306a36Sopenharmony_ci offset += SEQ_SIZE; 40262306a36Sopenharmony_ci phy_addr = base_phy_addr + offset; 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci iface->pic_info_tab_desc.array_base = phy_addr; 40562306a36Sopenharmony_ci hc->pic_mem = rpc->virt + offset; 40662306a36Sopenharmony_ci offset += PIC_SIZE; 40762306a36Sopenharmony_ci phy_addr = base_phy_addr + offset; 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci iface->gop_info_tab_desc.array_base = phy_addr; 41062306a36Sopenharmony_ci hc->gop_mem = rpc->virt + offset; 41162306a36Sopenharmony_ci offset += GOP_SIZE; 41262306a36Sopenharmony_ci phy_addr = base_phy_addr + offset; 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ci iface->qmeter_info_tab_desc.array_base = phy_addr; 41562306a36Sopenharmony_ci hc->qmeter_mem = rpc->virt + offset; 41662306a36Sopenharmony_ci offset += QMETER_SIZE; 41762306a36Sopenharmony_ci phy_addr = base_phy_addr + offset; 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci iface->dbglog_desc.addr = phy_addr; 42062306a36Sopenharmony_ci iface->dbglog_desc.size = DBGLOG_SIZE; 42162306a36Sopenharmony_ci hc->dbglog_mem = rpc->virt + offset; 42262306a36Sopenharmony_ci offset += DBGLOG_SIZE; 42362306a36Sopenharmony_ci phy_addr = base_phy_addr + offset; 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_ci for (i = 0; i < VID_API_NUM_STREAMS; i++) { 42662306a36Sopenharmony_ci iface->eng_access_buff_desc[i].buffer.start = 42762306a36Sopenharmony_ci iface->eng_access_buff_desc[i].buffer.wptr = 42862306a36Sopenharmony_ci iface->eng_access_buff_desc[i].buffer.rptr = phy_addr; 42962306a36Sopenharmony_ci iface->eng_access_buff_desc[i].buffer.end = 43062306a36Sopenharmony_ci iface->eng_access_buff_desc[i].buffer.start + ENG_SIZE; 43162306a36Sopenharmony_ci offset += ENG_SIZE; 43262306a36Sopenharmony_ci phy_addr = base_phy_addr + offset; 43362306a36Sopenharmony_ci } 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ci for (i = 0; i < VID_API_NUM_STREAMS; i++) { 43662306a36Sopenharmony_ci iface->encrypt_info[i] = phy_addr; 43762306a36Sopenharmony_ci offset += sizeof(struct vpu_malone_encrypt_info); 43862306a36Sopenharmony_ci phy_addr = base_phy_addr + offset; 43962306a36Sopenharmony_ci } 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_ci rpc->bytesused = offset; 44262306a36Sopenharmony_ci} 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_civoid vpu_malone_set_log_buf(struct vpu_shared_addr *shared, 44562306a36Sopenharmony_ci struct vpu_buffer *log) 44662306a36Sopenharmony_ci{ 44762306a36Sopenharmony_ci struct malone_iface *iface = shared->iface; 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci iface->debug_buffer_desc.buffer.start = 45062306a36Sopenharmony_ci iface->debug_buffer_desc.buffer.wptr = 45162306a36Sopenharmony_ci iface->debug_buffer_desc.buffer.rptr = log->phys - shared->boot_addr; 45262306a36Sopenharmony_ci iface->debug_buffer_desc.buffer.end = iface->debug_buffer_desc.buffer.start + log->length; 45362306a36Sopenharmony_ci} 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_cistatic u32 get_str_buffer_offset(u32 instance) 45662306a36Sopenharmony_ci{ 45762306a36Sopenharmony_ci return DEC_MFD_XREG_SLV_BASE + MFD_MCX + MFD_MCX_OFF * instance; 45862306a36Sopenharmony_ci} 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_civoid vpu_malone_set_system_cfg(struct vpu_shared_addr *shared, 46162306a36Sopenharmony_ci u32 regs_base, void __iomem *regs, u32 core_id) 46262306a36Sopenharmony_ci{ 46362306a36Sopenharmony_ci struct malone_iface *iface = shared->iface; 46462306a36Sopenharmony_ci struct vpu_rpc_system_config *config = &iface->system_cfg; 46562306a36Sopenharmony_ci struct vpu_dec_ctrl *hc = shared->priv; 46662306a36Sopenharmony_ci int i; 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ci vpu_imx8q_set_system_cfg_common(config, regs_base, core_id); 46962306a36Sopenharmony_ci for (i = 0; i < VID_API_NUM_STREAMS; i++) { 47062306a36Sopenharmony_ci u32 offset = get_str_buffer_offset(i); 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_ci hc->buf_addr[i] = regs_base + offset; 47362306a36Sopenharmony_ci hc->str_buf[i] = regs + offset; 47462306a36Sopenharmony_ci } 47562306a36Sopenharmony_ci} 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_ciu32 vpu_malone_get_version(struct vpu_shared_addr *shared) 47862306a36Sopenharmony_ci{ 47962306a36Sopenharmony_ci struct malone_iface *iface = shared->iface; 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci vpu_malone_enable_format(V4L2_PIX_FMT_RV30, iface->fw_version & MALONE_DEC_FMT_RV_MASK); 48262306a36Sopenharmony_ci vpu_malone_enable_format(V4L2_PIX_FMT_RV40, iface->fw_version & MALONE_DEC_FMT_RV_MASK); 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_ci return iface->fw_version; 48562306a36Sopenharmony_ci} 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_ciint vpu_malone_get_stream_buffer_size(struct vpu_shared_addr *shared) 48862306a36Sopenharmony_ci{ 48962306a36Sopenharmony_ci return 0xc00000; 49062306a36Sopenharmony_ci} 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_ciint vpu_malone_config_stream_buffer(struct vpu_shared_addr *shared, 49362306a36Sopenharmony_ci u32 instance, 49462306a36Sopenharmony_ci struct vpu_buffer *buf) 49562306a36Sopenharmony_ci{ 49662306a36Sopenharmony_ci struct malone_iface *iface = shared->iface; 49762306a36Sopenharmony_ci struct vpu_dec_ctrl *hc = shared->priv; 49862306a36Sopenharmony_ci struct vpu_malone_str_buffer __iomem *str_buf = hc->str_buf[instance]; 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_ci writel(buf->phys, &str_buf->start); 50162306a36Sopenharmony_ci writel(buf->phys, &str_buf->rptr); 50262306a36Sopenharmony_ci writel(buf->phys, &str_buf->wptr); 50362306a36Sopenharmony_ci writel(buf->phys + buf->length, &str_buf->end); 50462306a36Sopenharmony_ci writel(0x1, &str_buf->lwm); 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_ci iface->stream_buffer_desc[instance][0] = hc->buf_addr[instance]; 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ci return 0; 50962306a36Sopenharmony_ci} 51062306a36Sopenharmony_ci 51162306a36Sopenharmony_ciint vpu_malone_get_stream_buffer_desc(struct vpu_shared_addr *shared, 51262306a36Sopenharmony_ci u32 instance, 51362306a36Sopenharmony_ci struct vpu_rpc_buffer_desc *desc) 51462306a36Sopenharmony_ci{ 51562306a36Sopenharmony_ci struct vpu_dec_ctrl *hc = shared->priv; 51662306a36Sopenharmony_ci struct vpu_malone_str_buffer __iomem *str_buf = hc->str_buf[instance]; 51762306a36Sopenharmony_ci 51862306a36Sopenharmony_ci if (desc) { 51962306a36Sopenharmony_ci desc->wptr = readl(&str_buf->wptr); 52062306a36Sopenharmony_ci desc->rptr = readl(&str_buf->rptr); 52162306a36Sopenharmony_ci desc->start = readl(&str_buf->start); 52262306a36Sopenharmony_ci desc->end = readl(&str_buf->end); 52362306a36Sopenharmony_ci } 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_ci return 0; 52662306a36Sopenharmony_ci} 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_cistatic void vpu_malone_update_wptr(struct vpu_malone_str_buffer __iomem *str_buf, u32 wptr) 52962306a36Sopenharmony_ci{ 53062306a36Sopenharmony_ci /*update wptr after data is written*/ 53162306a36Sopenharmony_ci mb(); 53262306a36Sopenharmony_ci writel(wptr, &str_buf->wptr); 53362306a36Sopenharmony_ci} 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_cistatic void vpu_malone_update_rptr(struct vpu_malone_str_buffer __iomem *str_buf, u32 rptr) 53662306a36Sopenharmony_ci{ 53762306a36Sopenharmony_ci /*update rptr after data is read*/ 53862306a36Sopenharmony_ci mb(); 53962306a36Sopenharmony_ci writel(rptr, &str_buf->rptr); 54062306a36Sopenharmony_ci} 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_ciint vpu_malone_update_stream_buffer(struct vpu_shared_addr *shared, 54362306a36Sopenharmony_ci u32 instance, u32 ptr, bool write) 54462306a36Sopenharmony_ci{ 54562306a36Sopenharmony_ci struct vpu_dec_ctrl *hc = shared->priv; 54662306a36Sopenharmony_ci struct vpu_malone_str_buffer __iomem *str_buf = hc->str_buf[instance]; 54762306a36Sopenharmony_ci 54862306a36Sopenharmony_ci if (write) 54962306a36Sopenharmony_ci vpu_malone_update_wptr(str_buf, ptr); 55062306a36Sopenharmony_ci else 55162306a36Sopenharmony_ci vpu_malone_update_rptr(str_buf, ptr); 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci return 0; 55462306a36Sopenharmony_ci} 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_cistatic struct malone_fmt_mapping fmt_mappings[] = { 55762306a36Sopenharmony_ci {V4L2_PIX_FMT_H264, MALONE_FMT_AVC}, 55862306a36Sopenharmony_ci {V4L2_PIX_FMT_H264_MVC, MALONE_FMT_AVC}, 55962306a36Sopenharmony_ci {V4L2_PIX_FMT_HEVC, MALONE_FMT_HEVC}, 56062306a36Sopenharmony_ci {V4L2_PIX_FMT_VC1_ANNEX_G, MALONE_FMT_VC1}, 56162306a36Sopenharmony_ci {V4L2_PIX_FMT_VC1_ANNEX_L, MALONE_FMT_VC1}, 56262306a36Sopenharmony_ci {V4L2_PIX_FMT_MPEG2, MALONE_FMT_MP2}, 56362306a36Sopenharmony_ci {V4L2_PIX_FMT_MPEG4, MALONE_FMT_ASP}, 56462306a36Sopenharmony_ci {V4L2_PIX_FMT_XVID, MALONE_FMT_ASP}, 56562306a36Sopenharmony_ci {V4L2_PIX_FMT_H263, MALONE_FMT_ASP}, 56662306a36Sopenharmony_ci {V4L2_PIX_FMT_JPEG, MALONE_FMT_JPG}, 56762306a36Sopenharmony_ci {V4L2_PIX_FMT_VP8, MALONE_FMT_VP8}, 56862306a36Sopenharmony_ci {V4L2_PIX_FMT_SPK, MALONE_FMT_SPK}, 56962306a36Sopenharmony_ci {V4L2_PIX_FMT_RV30, MALONE_FMT_RV}, 57062306a36Sopenharmony_ci {V4L2_PIX_FMT_RV40, MALONE_FMT_RV}, 57162306a36Sopenharmony_ci}; 57262306a36Sopenharmony_ci 57362306a36Sopenharmony_civoid vpu_malone_enable_format(u32 pixelformat, int enable) 57462306a36Sopenharmony_ci{ 57562306a36Sopenharmony_ci u32 i; 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(fmt_mappings); i++) { 57862306a36Sopenharmony_ci if (pixelformat == fmt_mappings[i].pixelformat) { 57962306a36Sopenharmony_ci fmt_mappings[i].is_disabled = enable ? 0 : 1; 58062306a36Sopenharmony_ci return; 58162306a36Sopenharmony_ci } 58262306a36Sopenharmony_ci } 58362306a36Sopenharmony_ci} 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_cistatic enum vpu_malone_format vpu_malone_format_remap(u32 pixelformat) 58662306a36Sopenharmony_ci{ 58762306a36Sopenharmony_ci u32 i; 58862306a36Sopenharmony_ci 58962306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(fmt_mappings); i++) { 59062306a36Sopenharmony_ci if (fmt_mappings[i].is_disabled) 59162306a36Sopenharmony_ci continue; 59262306a36Sopenharmony_ci if (pixelformat == fmt_mappings[i].pixelformat) 59362306a36Sopenharmony_ci return fmt_mappings[i].malone_format; 59462306a36Sopenharmony_ci } 59562306a36Sopenharmony_ci 59662306a36Sopenharmony_ci return MALONE_FMT_NULL; 59762306a36Sopenharmony_ci} 59862306a36Sopenharmony_ci 59962306a36Sopenharmony_cibool vpu_malone_check_fmt(enum vpu_core_type type, u32 pixelfmt) 60062306a36Sopenharmony_ci{ 60162306a36Sopenharmony_ci if (!vpu_imx8q_check_fmt(type, pixelfmt)) 60262306a36Sopenharmony_ci return false; 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_ci if (pixelfmt == V4L2_PIX_FMT_NV12_8L128 || pixelfmt == V4L2_PIX_FMT_NV12_10BE_8L128 || 60562306a36Sopenharmony_ci pixelfmt == V4L2_PIX_FMT_NV12M_8L128 || pixelfmt == V4L2_PIX_FMT_NV12M_10BE_8L128) 60662306a36Sopenharmony_ci return true; 60762306a36Sopenharmony_ci if (vpu_malone_format_remap(pixelfmt) == MALONE_FMT_NULL) 60862306a36Sopenharmony_ci return false; 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_ci return true; 61162306a36Sopenharmony_ci} 61262306a36Sopenharmony_ci 61362306a36Sopenharmony_cistatic void vpu_malone_set_stream_cfg(struct vpu_shared_addr *shared, 61462306a36Sopenharmony_ci u32 instance, 61562306a36Sopenharmony_ci enum vpu_malone_format malone_format) 61662306a36Sopenharmony_ci{ 61762306a36Sopenharmony_ci struct malone_iface *iface = shared->iface; 61862306a36Sopenharmony_ci u32 *curr_str_cfg = &iface->stream_config[instance]; 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci *curr_str_cfg = 0; 62162306a36Sopenharmony_ci STREAM_CONFIG_FORMAT_SET(malone_format, curr_str_cfg); 62262306a36Sopenharmony_ci STREAM_CONFIG_STRBUFIDX_SET(0, curr_str_cfg); 62362306a36Sopenharmony_ci STREAM_CONFIG_NOSEQ_SET(0, curr_str_cfg); 62462306a36Sopenharmony_ci STREAM_CONFIG_DEBLOCK_SET(0, curr_str_cfg); 62562306a36Sopenharmony_ci STREAM_CONFIG_DERING_SET(0, curr_str_cfg); 62662306a36Sopenharmony_ci STREAM_CONFIG_PLAY_MODE_SET(0x3, curr_str_cfg); 62762306a36Sopenharmony_ci STREAM_CONFIG_FS_CTRL_MODE_SET(0x1, curr_str_cfg); 62862306a36Sopenharmony_ci STREAM_CONFIG_ENABLE_DCP_SET(1, curr_str_cfg); 62962306a36Sopenharmony_ci STREAM_CONFIG_NUM_STR_BUF_SET(1, curr_str_cfg); 63062306a36Sopenharmony_ci STREAM_CONFIG_MALONE_USAGE_SET(1, curr_str_cfg); 63162306a36Sopenharmony_ci STREAM_CONFIG_MULTI_VID_SET(0, curr_str_cfg); 63262306a36Sopenharmony_ci STREAM_CONFIG_OBFUSC_EN_SET(0, curr_str_cfg); 63362306a36Sopenharmony_ci STREAM_CONFIG_RC4_EN_SET(0, curr_str_cfg); 63462306a36Sopenharmony_ci STREAM_CONFIG_MCX_SET(1, curr_str_cfg); 63562306a36Sopenharmony_ci STREAM_CONFIG_PES_SET(0, curr_str_cfg); 63662306a36Sopenharmony_ci STREAM_CONFIG_NUM_DBE_SET(1, curr_str_cfg); 63762306a36Sopenharmony_ci} 63862306a36Sopenharmony_ci 63962306a36Sopenharmony_cistatic int vpu_malone_set_params(struct vpu_shared_addr *shared, 64062306a36Sopenharmony_ci u32 instance, 64162306a36Sopenharmony_ci struct vpu_decode_params *params) 64262306a36Sopenharmony_ci{ 64362306a36Sopenharmony_ci struct malone_iface *iface = shared->iface; 64462306a36Sopenharmony_ci struct vpu_dec_ctrl *hc = shared->priv; 64562306a36Sopenharmony_ci enum vpu_malone_format malone_format; 64662306a36Sopenharmony_ci 64762306a36Sopenharmony_ci malone_format = vpu_malone_format_remap(params->codec_format); 64862306a36Sopenharmony_ci if (WARN_ON(malone_format == MALONE_FMT_NULL)) 64962306a36Sopenharmony_ci return -EINVAL; 65062306a36Sopenharmony_ci iface->udata_buffer[instance].base = params->udata.base; 65162306a36Sopenharmony_ci iface->udata_buffer[instance].slot_size = params->udata.size; 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_ci vpu_malone_set_stream_cfg(shared, instance, malone_format); 65462306a36Sopenharmony_ci 65562306a36Sopenharmony_ci if (malone_format == MALONE_FMT_JPG) { 65662306a36Sopenharmony_ci //1:JPGD_MJPEG_MODE_A; 2:JPGD_MJPEG_MODE_B 65762306a36Sopenharmony_ci hc->jpg[instance].jpg_mjpeg_mode = 1; 65862306a36Sopenharmony_ci //0: JPGD_MJPEG_PROGRESSIVE 65962306a36Sopenharmony_ci hc->jpg[instance].jpg_mjpeg_interlaced = 0; 66062306a36Sopenharmony_ci } 66162306a36Sopenharmony_ci 66262306a36Sopenharmony_ci hc->codec_param[instance].disp_imm = params->display_delay_enable ? 1 : 0; 66362306a36Sopenharmony_ci if (malone_format != MALONE_FMT_AVC) 66462306a36Sopenharmony_ci hc->codec_param[instance].disp_imm = 0; 66562306a36Sopenharmony_ci hc->codec_param[instance].dbglog_enable = 0; 66662306a36Sopenharmony_ci iface->dbglog_desc.level = 0; 66762306a36Sopenharmony_ci 66862306a36Sopenharmony_ci if (params->b_non_frame) 66962306a36Sopenharmony_ci iface->stream_buff_info[instance].stream_input_mode = NON_FRAME_LVL; 67062306a36Sopenharmony_ci else 67162306a36Sopenharmony_ci iface->stream_buff_info[instance].stream_input_mode = FRAME_LVL; 67262306a36Sopenharmony_ci iface->stream_buff_info[instance].stream_buffer_threshold = 0; 67362306a36Sopenharmony_ci iface->stream_buff_info[instance].stream_pic_input_count = 0; 67462306a36Sopenharmony_ci 67562306a36Sopenharmony_ci return 0; 67662306a36Sopenharmony_ci} 67762306a36Sopenharmony_ci 67862306a36Sopenharmony_cistatic bool vpu_malone_is_non_frame_mode(struct vpu_shared_addr *shared, u32 instance) 67962306a36Sopenharmony_ci{ 68062306a36Sopenharmony_ci struct malone_iface *iface = shared->iface; 68162306a36Sopenharmony_ci 68262306a36Sopenharmony_ci if (iface->stream_buff_info[instance].stream_input_mode == NON_FRAME_LVL) 68362306a36Sopenharmony_ci return true; 68462306a36Sopenharmony_ci 68562306a36Sopenharmony_ci return false; 68662306a36Sopenharmony_ci} 68762306a36Sopenharmony_ci 68862306a36Sopenharmony_cistatic int vpu_malone_update_params(struct vpu_shared_addr *shared, 68962306a36Sopenharmony_ci u32 instance, 69062306a36Sopenharmony_ci struct vpu_decode_params *params) 69162306a36Sopenharmony_ci{ 69262306a36Sopenharmony_ci struct malone_iface *iface = shared->iface; 69362306a36Sopenharmony_ci 69462306a36Sopenharmony_ci if (params->end_flag) 69562306a36Sopenharmony_ci iface->stream_buff_info[instance].stream_pic_end_flag = params->end_flag; 69662306a36Sopenharmony_ci params->end_flag = 0; 69762306a36Sopenharmony_ci 69862306a36Sopenharmony_ci return 0; 69962306a36Sopenharmony_ci} 70062306a36Sopenharmony_ci 70162306a36Sopenharmony_ciint vpu_malone_set_decode_params(struct vpu_shared_addr *shared, 70262306a36Sopenharmony_ci u32 instance, 70362306a36Sopenharmony_ci struct vpu_decode_params *params, 70462306a36Sopenharmony_ci u32 update) 70562306a36Sopenharmony_ci{ 70662306a36Sopenharmony_ci if (!params) 70762306a36Sopenharmony_ci return -EINVAL; 70862306a36Sopenharmony_ci 70962306a36Sopenharmony_ci if (!update) 71062306a36Sopenharmony_ci return vpu_malone_set_params(shared, instance, params); 71162306a36Sopenharmony_ci else 71262306a36Sopenharmony_ci return vpu_malone_update_params(shared, instance, params); 71362306a36Sopenharmony_ci} 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_cistatic struct vpu_pair malone_cmds[] = { 71662306a36Sopenharmony_ci {VPU_CMD_ID_NOOP, VID_API_CMD_NULL}, 71762306a36Sopenharmony_ci {VPU_CMD_ID_START, VID_API_CMD_START}, 71862306a36Sopenharmony_ci {VPU_CMD_ID_STOP, VID_API_CMD_STOP}, 71962306a36Sopenharmony_ci {VPU_CMD_ID_ABORT, VID_API_CMD_ABORT}, 72062306a36Sopenharmony_ci {VPU_CMD_ID_RST_BUF, VID_API_CMD_RST_BUF}, 72162306a36Sopenharmony_ci {VPU_CMD_ID_SNAPSHOT, VID_API_CMD_SNAPSHOT}, 72262306a36Sopenharmony_ci {VPU_CMD_ID_FIRM_RESET, VID_API_CMD_FIRM_RESET}, 72362306a36Sopenharmony_ci {VPU_CMD_ID_FS_ALLOC, VID_API_CMD_FS_ALLOC}, 72462306a36Sopenharmony_ci {VPU_CMD_ID_FS_RELEASE, VID_API_CMD_FS_RELEASE}, 72562306a36Sopenharmony_ci {VPU_CMD_ID_TIMESTAMP, VID_API_CMD_TS}, 72662306a36Sopenharmony_ci {VPU_CMD_ID_DEBUG, VID_API_CMD_FW_STATUS}, 72762306a36Sopenharmony_ci}; 72862306a36Sopenharmony_ci 72962306a36Sopenharmony_cistatic struct vpu_pair malone_msgs[] = { 73062306a36Sopenharmony_ci {VPU_MSG_ID_RESET_DONE, VID_API_EVENT_RESET_DONE}, 73162306a36Sopenharmony_ci {VPU_MSG_ID_START_DONE, VID_API_EVENT_START_DONE}, 73262306a36Sopenharmony_ci {VPU_MSG_ID_STOP_DONE, VID_API_EVENT_STOPPED}, 73362306a36Sopenharmony_ci {VPU_MSG_ID_ABORT_DONE, VID_API_EVENT_ABORT_DONE}, 73462306a36Sopenharmony_ci {VPU_MSG_ID_BUF_RST, VID_API_EVENT_STR_BUF_RST}, 73562306a36Sopenharmony_ci {VPU_MSG_ID_PIC_EOS, VID_API_EVENT_FINISHED}, 73662306a36Sopenharmony_ci {VPU_MSG_ID_SEQ_HDR_FOUND, VID_API_EVENT_SEQ_HDR_FOUND}, 73762306a36Sopenharmony_ci {VPU_MSG_ID_RES_CHANGE, VID_API_EVENT_RES_CHANGE}, 73862306a36Sopenharmony_ci {VPU_MSG_ID_PIC_HDR_FOUND, VID_API_EVENT_PIC_HDR_FOUND}, 73962306a36Sopenharmony_ci {VPU_MSG_ID_PIC_DECODED, VID_API_EVENT_PIC_DECODED}, 74062306a36Sopenharmony_ci {VPU_MSG_ID_DEC_DONE, VID_API_EVENT_FRAME_BUFF_RDY}, 74162306a36Sopenharmony_ci {VPU_MSG_ID_FRAME_REQ, VID_API_EVENT_REQ_FRAME_BUFF}, 74262306a36Sopenharmony_ci {VPU_MSG_ID_FRAME_RELEASE, VID_API_EVENT_REL_FRAME_BUFF}, 74362306a36Sopenharmony_ci {VPU_MSG_ID_FIFO_LOW, VID_API_EVENT_FIFO_LOW}, 74462306a36Sopenharmony_ci {VPU_MSG_ID_BS_ERROR, VID_API_EVENT_BS_ERROR}, 74562306a36Sopenharmony_ci {VPU_MSG_ID_UNSUPPORTED, VID_API_EVENT_UNSUPPORTED_STREAM}, 74662306a36Sopenharmony_ci {VPU_MSG_ID_FIRMWARE_XCPT, VID_API_EVENT_FIRMWARE_XCPT}, 74762306a36Sopenharmony_ci {VPU_MSG_ID_PIC_SKIPPED, VID_API_EVENT_PIC_SKIPPED}, 74862306a36Sopenharmony_ci {VPU_MSG_ID_DBG_MSG, VID_API_EVENT_DBG_MSG_DEC}, 74962306a36Sopenharmony_ci}; 75062306a36Sopenharmony_ci 75162306a36Sopenharmony_cistatic void vpu_malone_pack_fs_alloc(struct vpu_rpc_event *pkt, 75262306a36Sopenharmony_ci struct vpu_fs_info *fs) 75362306a36Sopenharmony_ci{ 75462306a36Sopenharmony_ci const u32 fs_type[] = { 75562306a36Sopenharmony_ci [MEM_RES_FRAME] = 0, 75662306a36Sopenharmony_ci [MEM_RES_MBI] = 1, 75762306a36Sopenharmony_ci [MEM_RES_DCP] = 2, 75862306a36Sopenharmony_ci }; 75962306a36Sopenharmony_ci 76062306a36Sopenharmony_ci pkt->hdr.num = 7; 76162306a36Sopenharmony_ci pkt->data[0] = fs->id | (fs->tag << 24); 76262306a36Sopenharmony_ci pkt->data[1] = fs->luma_addr; 76362306a36Sopenharmony_ci if (fs->type == MEM_RES_FRAME) { 76462306a36Sopenharmony_ci /* 76562306a36Sopenharmony_ci * if luma_addr equal to chroma_addr, 76662306a36Sopenharmony_ci * means luma(plane[0]) and chromau(plane[1]) used the 76762306a36Sopenharmony_ci * same fd -- usage of NXP codec2. Need to manually 76862306a36Sopenharmony_ci * offset chroma addr. 76962306a36Sopenharmony_ci */ 77062306a36Sopenharmony_ci if (fs->luma_addr == fs->chroma_addr) 77162306a36Sopenharmony_ci fs->chroma_addr = fs->luma_addr + fs->luma_size; 77262306a36Sopenharmony_ci pkt->data[2] = fs->luma_addr + fs->luma_size / 2; 77362306a36Sopenharmony_ci pkt->data[3] = fs->chroma_addr; 77462306a36Sopenharmony_ci pkt->data[4] = fs->chroma_addr + fs->chromau_size / 2; 77562306a36Sopenharmony_ci pkt->data[5] = fs->bytesperline; 77662306a36Sopenharmony_ci } else { 77762306a36Sopenharmony_ci pkt->data[2] = fs->luma_size; 77862306a36Sopenharmony_ci pkt->data[3] = 0; 77962306a36Sopenharmony_ci pkt->data[4] = 0; 78062306a36Sopenharmony_ci pkt->data[5] = 0; 78162306a36Sopenharmony_ci } 78262306a36Sopenharmony_ci pkt->data[6] = fs_type[fs->type]; 78362306a36Sopenharmony_ci} 78462306a36Sopenharmony_ci 78562306a36Sopenharmony_cistatic void vpu_malone_pack_fs_release(struct vpu_rpc_event *pkt, 78662306a36Sopenharmony_ci struct vpu_fs_info *fs) 78762306a36Sopenharmony_ci{ 78862306a36Sopenharmony_ci pkt->hdr.num = 1; 78962306a36Sopenharmony_ci pkt->data[0] = fs->id | (fs->tag << 24); 79062306a36Sopenharmony_ci} 79162306a36Sopenharmony_ci 79262306a36Sopenharmony_cistatic void vpu_malone_pack_timestamp(struct vpu_rpc_event *pkt, 79362306a36Sopenharmony_ci struct vpu_ts_info *info) 79462306a36Sopenharmony_ci{ 79562306a36Sopenharmony_ci struct timespec64 ts = ns_to_timespec64(info->timestamp); 79662306a36Sopenharmony_ci 79762306a36Sopenharmony_ci pkt->hdr.num = 3; 79862306a36Sopenharmony_ci 79962306a36Sopenharmony_ci pkt->data[0] = ts.tv_sec; 80062306a36Sopenharmony_ci pkt->data[1] = ts.tv_nsec; 80162306a36Sopenharmony_ci pkt->data[2] = info->size; 80262306a36Sopenharmony_ci} 80362306a36Sopenharmony_ci 80462306a36Sopenharmony_ciint vpu_malone_pack_cmd(struct vpu_rpc_event *pkt, u32 index, u32 id, void *data) 80562306a36Sopenharmony_ci{ 80662306a36Sopenharmony_ci int ret; 80762306a36Sopenharmony_ci 80862306a36Sopenharmony_ci ret = vpu_find_dst_by_src(malone_cmds, ARRAY_SIZE(malone_cmds), id); 80962306a36Sopenharmony_ci if (ret < 0) 81062306a36Sopenharmony_ci return ret; 81162306a36Sopenharmony_ci 81262306a36Sopenharmony_ci pkt->hdr.id = ret; 81362306a36Sopenharmony_ci pkt->hdr.num = 0; 81462306a36Sopenharmony_ci pkt->hdr.index = index; 81562306a36Sopenharmony_ci 81662306a36Sopenharmony_ci switch (id) { 81762306a36Sopenharmony_ci case VPU_CMD_ID_FS_ALLOC: 81862306a36Sopenharmony_ci vpu_malone_pack_fs_alloc(pkt, data); 81962306a36Sopenharmony_ci break; 82062306a36Sopenharmony_ci case VPU_CMD_ID_FS_RELEASE: 82162306a36Sopenharmony_ci vpu_malone_pack_fs_release(pkt, data); 82262306a36Sopenharmony_ci break; 82362306a36Sopenharmony_ci case VPU_CMD_ID_TIMESTAMP: 82462306a36Sopenharmony_ci vpu_malone_pack_timestamp(pkt, data); 82562306a36Sopenharmony_ci break; 82662306a36Sopenharmony_ci } 82762306a36Sopenharmony_ci 82862306a36Sopenharmony_ci pkt->hdr.index = index; 82962306a36Sopenharmony_ci return 0; 83062306a36Sopenharmony_ci} 83162306a36Sopenharmony_ci 83262306a36Sopenharmony_ciint vpu_malone_convert_msg_id(u32 id) 83362306a36Sopenharmony_ci{ 83462306a36Sopenharmony_ci return vpu_find_src_by_dst(malone_msgs, ARRAY_SIZE(malone_msgs), id); 83562306a36Sopenharmony_ci} 83662306a36Sopenharmony_ci 83762306a36Sopenharmony_cistatic void vpu_malone_fill_planes(struct vpu_dec_codec_info *info) 83862306a36Sopenharmony_ci{ 83962306a36Sopenharmony_ci u32 interlaced = info->progressive ? 0 : 1; 84062306a36Sopenharmony_ci 84162306a36Sopenharmony_ci info->bytesperline[0] = 0; 84262306a36Sopenharmony_ci info->sizeimage[0] = vpu_helper_get_plane_size(info->pixfmt, 84362306a36Sopenharmony_ci info->decoded_width, 84462306a36Sopenharmony_ci info->decoded_height, 84562306a36Sopenharmony_ci 0, 84662306a36Sopenharmony_ci info->stride, 84762306a36Sopenharmony_ci interlaced, 84862306a36Sopenharmony_ci &info->bytesperline[0]); 84962306a36Sopenharmony_ci info->bytesperline[1] = 0; 85062306a36Sopenharmony_ci info->sizeimage[1] = vpu_helper_get_plane_size(info->pixfmt, 85162306a36Sopenharmony_ci info->decoded_width, 85262306a36Sopenharmony_ci info->decoded_height, 85362306a36Sopenharmony_ci 1, 85462306a36Sopenharmony_ci info->stride, 85562306a36Sopenharmony_ci interlaced, 85662306a36Sopenharmony_ci &info->bytesperline[1]); 85762306a36Sopenharmony_ci} 85862306a36Sopenharmony_ci 85962306a36Sopenharmony_cistatic void vpu_malone_init_seq_hdr(struct vpu_dec_codec_info *info) 86062306a36Sopenharmony_ci{ 86162306a36Sopenharmony_ci u32 chunks = info->num_dfe_area >> MALONE_DCP_CHUNK_BIT; 86262306a36Sopenharmony_ci 86362306a36Sopenharmony_ci vpu_malone_fill_planes(info); 86462306a36Sopenharmony_ci 86562306a36Sopenharmony_ci info->mbi_size = (info->sizeimage[0] + info->sizeimage[1]) >> 2; 86662306a36Sopenharmony_ci info->mbi_size = ALIGN(info->mbi_size, MALONE_ALIGN_MBI); 86762306a36Sopenharmony_ci 86862306a36Sopenharmony_ci info->dcp_size = MALONE_DCP_SIZE_MAX; 86962306a36Sopenharmony_ci if (chunks) { 87062306a36Sopenharmony_ci u32 mb_num; 87162306a36Sopenharmony_ci u32 mb_w; 87262306a36Sopenharmony_ci u32 mb_h; 87362306a36Sopenharmony_ci 87462306a36Sopenharmony_ci mb_w = DIV_ROUND_UP(info->decoded_width, 16); 87562306a36Sopenharmony_ci mb_h = DIV_ROUND_UP(info->decoded_height, 16); 87662306a36Sopenharmony_ci mb_num = mb_w * mb_h; 87762306a36Sopenharmony_ci info->dcp_size = mb_num * MALONE_DCP_FIXED_MB_ALLOC * chunks; 87862306a36Sopenharmony_ci info->dcp_size = clamp_t(u32, info->dcp_size, 87962306a36Sopenharmony_ci MALONE_DCP_SIZE_MIN, MALONE_DCP_SIZE_MAX); 88062306a36Sopenharmony_ci } 88162306a36Sopenharmony_ci} 88262306a36Sopenharmony_ci 88362306a36Sopenharmony_cistatic void vpu_malone_unpack_seq_hdr(struct vpu_rpc_event *pkt, 88462306a36Sopenharmony_ci struct vpu_dec_codec_info *info) 88562306a36Sopenharmony_ci{ 88662306a36Sopenharmony_ci info->num_ref_frms = pkt->data[0]; 88762306a36Sopenharmony_ci info->num_dpb_frms = pkt->data[1]; 88862306a36Sopenharmony_ci info->num_dfe_area = pkt->data[2]; 88962306a36Sopenharmony_ci info->progressive = pkt->data[3]; 89062306a36Sopenharmony_ci info->width = pkt->data[5]; 89162306a36Sopenharmony_ci info->height = pkt->data[4]; 89262306a36Sopenharmony_ci info->decoded_width = pkt->data[12]; 89362306a36Sopenharmony_ci info->decoded_height = pkt->data[11]; 89462306a36Sopenharmony_ci info->frame_rate.numerator = 1000; 89562306a36Sopenharmony_ci info->frame_rate.denominator = pkt->data[8]; 89662306a36Sopenharmony_ci info->dsp_asp_ratio = pkt->data[9]; 89762306a36Sopenharmony_ci info->level_idc = pkt->data[10]; 89862306a36Sopenharmony_ci info->bit_depth_luma = pkt->data[13]; 89962306a36Sopenharmony_ci info->bit_depth_chroma = pkt->data[14]; 90062306a36Sopenharmony_ci info->chroma_fmt = pkt->data[15]; 90162306a36Sopenharmony_ci info->color_primaries = vpu_color_cvrt_primaries_i2v(pkt->data[16]); 90262306a36Sopenharmony_ci info->transfer_chars = vpu_color_cvrt_transfers_i2v(pkt->data[17]); 90362306a36Sopenharmony_ci info->matrix_coeffs = vpu_color_cvrt_matrix_i2v(pkt->data[18]); 90462306a36Sopenharmony_ci info->full_range = vpu_color_cvrt_full_range_i2v(pkt->data[19]); 90562306a36Sopenharmony_ci info->vui_present = pkt->data[20]; 90662306a36Sopenharmony_ci info->mvc_num_views = pkt->data[21]; 90762306a36Sopenharmony_ci info->offset_x = pkt->data[23]; 90862306a36Sopenharmony_ci info->offset_y = pkt->data[25]; 90962306a36Sopenharmony_ci info->tag = pkt->data[27]; 91062306a36Sopenharmony_ci if (info->bit_depth_luma > 8) 91162306a36Sopenharmony_ci info->pixfmt = V4L2_PIX_FMT_NV12M_10BE_8L128; 91262306a36Sopenharmony_ci else 91362306a36Sopenharmony_ci info->pixfmt = V4L2_PIX_FMT_NV12M_8L128; 91462306a36Sopenharmony_ci if (info->frame_rate.numerator && info->frame_rate.denominator) { 91562306a36Sopenharmony_ci unsigned long n, d; 91662306a36Sopenharmony_ci 91762306a36Sopenharmony_ci rational_best_approximation(info->frame_rate.numerator, 91862306a36Sopenharmony_ci info->frame_rate.denominator, 91962306a36Sopenharmony_ci info->frame_rate.numerator, 92062306a36Sopenharmony_ci info->frame_rate.denominator, 92162306a36Sopenharmony_ci &n, &d); 92262306a36Sopenharmony_ci info->frame_rate.numerator = n; 92362306a36Sopenharmony_ci info->frame_rate.denominator = d; 92462306a36Sopenharmony_ci } 92562306a36Sopenharmony_ci vpu_malone_init_seq_hdr(info); 92662306a36Sopenharmony_ci} 92762306a36Sopenharmony_ci 92862306a36Sopenharmony_cistatic void vpu_malone_unpack_pic_info(struct vpu_rpc_event *pkt, 92962306a36Sopenharmony_ci struct vpu_dec_pic_info *info) 93062306a36Sopenharmony_ci{ 93162306a36Sopenharmony_ci info->id = pkt->data[7]; 93262306a36Sopenharmony_ci info->luma = pkt->data[0]; 93362306a36Sopenharmony_ci info->start = pkt->data[10]; 93462306a36Sopenharmony_ci info->end = pkt->data[12]; 93562306a36Sopenharmony_ci info->pic_size = pkt->data[11]; 93662306a36Sopenharmony_ci info->stride = pkt->data[5]; 93762306a36Sopenharmony_ci info->consumed_count = pkt->data[13]; 93862306a36Sopenharmony_ci if (info->id == MALONE_SKIPPED_FRAME_ID) 93962306a36Sopenharmony_ci info->skipped = 1; 94062306a36Sopenharmony_ci else 94162306a36Sopenharmony_ci info->skipped = 0; 94262306a36Sopenharmony_ci} 94362306a36Sopenharmony_ci 94462306a36Sopenharmony_cistatic void vpu_malone_unpack_req_frame(struct vpu_rpc_event *pkt, 94562306a36Sopenharmony_ci struct vpu_fs_info *info) 94662306a36Sopenharmony_ci{ 94762306a36Sopenharmony_ci info->type = pkt->data[1]; 94862306a36Sopenharmony_ci} 94962306a36Sopenharmony_ci 95062306a36Sopenharmony_cistatic void vpu_malone_unpack_rel_frame(struct vpu_rpc_event *pkt, 95162306a36Sopenharmony_ci struct vpu_fs_info *info) 95262306a36Sopenharmony_ci{ 95362306a36Sopenharmony_ci info->id = pkt->data[0]; 95462306a36Sopenharmony_ci info->type = pkt->data[1]; 95562306a36Sopenharmony_ci info->not_displayed = pkt->data[2]; 95662306a36Sopenharmony_ci} 95762306a36Sopenharmony_ci 95862306a36Sopenharmony_cistatic void vpu_malone_unpack_buff_rdy(struct vpu_rpc_event *pkt, 95962306a36Sopenharmony_ci struct vpu_dec_pic_info *info) 96062306a36Sopenharmony_ci{ 96162306a36Sopenharmony_ci struct timespec64 ts = { pkt->data[9], pkt->data[10] }; 96262306a36Sopenharmony_ci 96362306a36Sopenharmony_ci info->id = pkt->data[0]; 96462306a36Sopenharmony_ci info->luma = pkt->data[1]; 96562306a36Sopenharmony_ci info->stride = pkt->data[3]; 96662306a36Sopenharmony_ci if (info->id == MALONE_SKIPPED_FRAME_ID) 96762306a36Sopenharmony_ci info->skipped = 1; 96862306a36Sopenharmony_ci else 96962306a36Sopenharmony_ci info->skipped = 0; 97062306a36Sopenharmony_ci 97162306a36Sopenharmony_ci info->timestamp = timespec64_to_ns(&ts); 97262306a36Sopenharmony_ci} 97362306a36Sopenharmony_ci 97462306a36Sopenharmony_ciint vpu_malone_unpack_msg_data(struct vpu_rpc_event *pkt, void *data) 97562306a36Sopenharmony_ci{ 97662306a36Sopenharmony_ci if (!pkt || !data) 97762306a36Sopenharmony_ci return -EINVAL; 97862306a36Sopenharmony_ci 97962306a36Sopenharmony_ci switch (pkt->hdr.id) { 98062306a36Sopenharmony_ci case VID_API_EVENT_SEQ_HDR_FOUND: 98162306a36Sopenharmony_ci vpu_malone_unpack_seq_hdr(pkt, data); 98262306a36Sopenharmony_ci break; 98362306a36Sopenharmony_ci case VID_API_EVENT_PIC_DECODED: 98462306a36Sopenharmony_ci vpu_malone_unpack_pic_info(pkt, data); 98562306a36Sopenharmony_ci break; 98662306a36Sopenharmony_ci case VID_API_EVENT_REQ_FRAME_BUFF: 98762306a36Sopenharmony_ci vpu_malone_unpack_req_frame(pkt, data); 98862306a36Sopenharmony_ci break; 98962306a36Sopenharmony_ci case VID_API_EVENT_REL_FRAME_BUFF: 99062306a36Sopenharmony_ci vpu_malone_unpack_rel_frame(pkt, data); 99162306a36Sopenharmony_ci break; 99262306a36Sopenharmony_ci case VID_API_EVENT_FRAME_BUFF_RDY: 99362306a36Sopenharmony_ci vpu_malone_unpack_buff_rdy(pkt, data); 99462306a36Sopenharmony_ci break; 99562306a36Sopenharmony_ci } 99662306a36Sopenharmony_ci 99762306a36Sopenharmony_ci return 0; 99862306a36Sopenharmony_ci} 99962306a36Sopenharmony_ci 100062306a36Sopenharmony_cistatic const struct malone_padding_scode padding_scodes[] = { 100162306a36Sopenharmony_ci {SCODE_PADDING_EOS, V4L2_PIX_FMT_H264, {0x0B010000, 0}}, 100262306a36Sopenharmony_ci {SCODE_PADDING_EOS, V4L2_PIX_FMT_H264_MVC, {0x0B010000, 0}}, 100362306a36Sopenharmony_ci {SCODE_PADDING_EOS, V4L2_PIX_FMT_HEVC, {0x4A010000, 0x20}}, 100462306a36Sopenharmony_ci {SCODE_PADDING_EOS, V4L2_PIX_FMT_VC1_ANNEX_G, {0x0a010000, 0x0}}, 100562306a36Sopenharmony_ci {SCODE_PADDING_EOS, V4L2_PIX_FMT_VC1_ANNEX_L, {0x0a010000, 0x0}}, 100662306a36Sopenharmony_ci {SCODE_PADDING_EOS, V4L2_PIX_FMT_MPEG2, {0xCC010000, 0x0}}, 100762306a36Sopenharmony_ci {SCODE_PADDING_EOS, V4L2_PIX_FMT_MPEG4, {0xb1010000, 0x0}}, 100862306a36Sopenharmony_ci {SCODE_PADDING_EOS, V4L2_PIX_FMT_XVID, {0xb1010000, 0x0}}, 100962306a36Sopenharmony_ci {SCODE_PADDING_EOS, V4L2_PIX_FMT_H263, {0xb1010000, 0x0}}, 101062306a36Sopenharmony_ci {SCODE_PADDING_EOS, V4L2_PIX_FMT_VP8, {0x34010000, 0x0}}, 101162306a36Sopenharmony_ci {SCODE_PADDING_EOS, V4L2_PIX_FMT_SPK, {0x34010000, 0x0}}, 101262306a36Sopenharmony_ci {SCODE_PADDING_EOS, V4L2_PIX_FMT_RV30, {0x34010000, 0x0}}, 101362306a36Sopenharmony_ci {SCODE_PADDING_EOS, V4L2_PIX_FMT_RV40, {0x34010000, 0x0}}, 101462306a36Sopenharmony_ci {SCODE_PADDING_EOS, V4L2_PIX_FMT_JPEG, {0xefff0000, 0x0}}, 101562306a36Sopenharmony_ci {SCODE_PADDING_ABORT, V4L2_PIX_FMT_H264, {0x0B010000, 0}}, 101662306a36Sopenharmony_ci {SCODE_PADDING_ABORT, V4L2_PIX_FMT_H264_MVC, {0x0B010000, 0}}, 101762306a36Sopenharmony_ci {SCODE_PADDING_ABORT, V4L2_PIX_FMT_HEVC, {0x4A010000, 0x20}}, 101862306a36Sopenharmony_ci {SCODE_PADDING_ABORT, V4L2_PIX_FMT_VC1_ANNEX_G, {0x0a010000, 0x0}}, 101962306a36Sopenharmony_ci {SCODE_PADDING_ABORT, V4L2_PIX_FMT_VC1_ANNEX_L, {0x0a010000, 0x0}}, 102062306a36Sopenharmony_ci {SCODE_PADDING_ABORT, V4L2_PIX_FMT_MPEG2, {0xb7010000, 0x0}}, 102162306a36Sopenharmony_ci {SCODE_PADDING_ABORT, V4L2_PIX_FMT_MPEG4, {0xb1010000, 0x0}}, 102262306a36Sopenharmony_ci {SCODE_PADDING_ABORT, V4L2_PIX_FMT_XVID, {0xb1010000, 0x0}}, 102362306a36Sopenharmony_ci {SCODE_PADDING_ABORT, V4L2_PIX_FMT_H263, {0xb1010000, 0x0}}, 102462306a36Sopenharmony_ci {SCODE_PADDING_ABORT, V4L2_PIX_FMT_VP8, {0x34010000, 0x0}}, 102562306a36Sopenharmony_ci {SCODE_PADDING_ABORT, V4L2_PIX_FMT_SPK, {0x34010000, 0x0}}, 102662306a36Sopenharmony_ci {SCODE_PADDING_ABORT, V4L2_PIX_FMT_RV30, {0x34010000, 0x0}}, 102762306a36Sopenharmony_ci {SCODE_PADDING_ABORT, V4L2_PIX_FMT_RV40, {0x34010000, 0x0}}, 102862306a36Sopenharmony_ci {SCODE_PADDING_EOS, V4L2_PIX_FMT_JPEG, {0x0, 0x0}}, 102962306a36Sopenharmony_ci {SCODE_PADDING_BUFFLUSH, V4L2_PIX_FMT_H264, {0x15010000, 0x0}}, 103062306a36Sopenharmony_ci {SCODE_PADDING_BUFFLUSH, V4L2_PIX_FMT_H264_MVC, {0x15010000, 0x0}}, 103162306a36Sopenharmony_ci}; 103262306a36Sopenharmony_ci 103362306a36Sopenharmony_cistatic const struct malone_padding_scode padding_scode_dft = {0x0, 0x0}; 103462306a36Sopenharmony_ci 103562306a36Sopenharmony_cistatic const struct malone_padding_scode *get_padding_scode(u32 type, u32 fmt) 103662306a36Sopenharmony_ci{ 103762306a36Sopenharmony_ci const struct malone_padding_scode *s; 103862306a36Sopenharmony_ci int i; 103962306a36Sopenharmony_ci 104062306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(padding_scodes); i++) { 104162306a36Sopenharmony_ci s = &padding_scodes[i]; 104262306a36Sopenharmony_ci 104362306a36Sopenharmony_ci if (s->scode_type == type && s->pixelformat == fmt) 104462306a36Sopenharmony_ci return s; 104562306a36Sopenharmony_ci } 104662306a36Sopenharmony_ci 104762306a36Sopenharmony_ci if (type != SCODE_PADDING_BUFFLUSH) 104862306a36Sopenharmony_ci return &padding_scode_dft; 104962306a36Sopenharmony_ci 105062306a36Sopenharmony_ci return NULL; 105162306a36Sopenharmony_ci} 105262306a36Sopenharmony_ci 105362306a36Sopenharmony_cistatic int vpu_malone_add_padding_scode(struct vpu_buffer *stream_buffer, 105462306a36Sopenharmony_ci struct vpu_malone_str_buffer __iomem *str_buf, 105562306a36Sopenharmony_ci u32 pixelformat, u32 scode_type) 105662306a36Sopenharmony_ci{ 105762306a36Sopenharmony_ci u32 wptr; 105862306a36Sopenharmony_ci int size; 105962306a36Sopenharmony_ci int total_size = 0; 106062306a36Sopenharmony_ci const struct malone_padding_scode *ps; 106162306a36Sopenharmony_ci const u32 padding_size = 4096; 106262306a36Sopenharmony_ci int ret; 106362306a36Sopenharmony_ci 106462306a36Sopenharmony_ci ps = get_padding_scode(scode_type, pixelformat); 106562306a36Sopenharmony_ci if (!ps) 106662306a36Sopenharmony_ci return -EINVAL; 106762306a36Sopenharmony_ci 106862306a36Sopenharmony_ci wptr = readl(&str_buf->wptr); 106962306a36Sopenharmony_ci if (wptr < stream_buffer->phys || wptr > stream_buffer->phys + stream_buffer->length) 107062306a36Sopenharmony_ci return -EINVAL; 107162306a36Sopenharmony_ci if (wptr == stream_buffer->phys + stream_buffer->length) 107262306a36Sopenharmony_ci wptr = stream_buffer->phys; 107362306a36Sopenharmony_ci size = ALIGN(wptr, 4) - wptr; 107462306a36Sopenharmony_ci if (size) 107562306a36Sopenharmony_ci vpu_helper_memset_stream_buffer(stream_buffer, &wptr, 0, size); 107662306a36Sopenharmony_ci total_size += size; 107762306a36Sopenharmony_ci 107862306a36Sopenharmony_ci size = sizeof(ps->data); 107962306a36Sopenharmony_ci ret = vpu_helper_copy_to_stream_buffer(stream_buffer, &wptr, size, (void *)ps->data); 108062306a36Sopenharmony_ci if (ret < 0) 108162306a36Sopenharmony_ci return -EINVAL; 108262306a36Sopenharmony_ci total_size += size; 108362306a36Sopenharmony_ci 108462306a36Sopenharmony_ci size = padding_size - sizeof(ps->data); 108562306a36Sopenharmony_ci vpu_helper_memset_stream_buffer(stream_buffer, &wptr, 0, size); 108662306a36Sopenharmony_ci total_size += size; 108762306a36Sopenharmony_ci 108862306a36Sopenharmony_ci vpu_malone_update_wptr(str_buf, wptr); 108962306a36Sopenharmony_ci return total_size; 109062306a36Sopenharmony_ci} 109162306a36Sopenharmony_ci 109262306a36Sopenharmony_ciint vpu_malone_add_scode(struct vpu_shared_addr *shared, 109362306a36Sopenharmony_ci u32 instance, 109462306a36Sopenharmony_ci struct vpu_buffer *stream_buffer, 109562306a36Sopenharmony_ci u32 pixelformat, 109662306a36Sopenharmony_ci u32 scode_type) 109762306a36Sopenharmony_ci{ 109862306a36Sopenharmony_ci struct vpu_dec_ctrl *hc = shared->priv; 109962306a36Sopenharmony_ci struct vpu_malone_str_buffer __iomem *str_buf = hc->str_buf[instance]; 110062306a36Sopenharmony_ci int ret = -EINVAL; 110162306a36Sopenharmony_ci 110262306a36Sopenharmony_ci switch (scode_type) { 110362306a36Sopenharmony_ci case SCODE_PADDING_EOS: 110462306a36Sopenharmony_ci case SCODE_PADDING_ABORT: 110562306a36Sopenharmony_ci case SCODE_PADDING_BUFFLUSH: 110662306a36Sopenharmony_ci ret = vpu_malone_add_padding_scode(stream_buffer, str_buf, pixelformat, scode_type); 110762306a36Sopenharmony_ci break; 110862306a36Sopenharmony_ci default: 110962306a36Sopenharmony_ci break; 111062306a36Sopenharmony_ci } 111162306a36Sopenharmony_ci 111262306a36Sopenharmony_ci return ret; 111362306a36Sopenharmony_ci} 111462306a36Sopenharmony_ci 111562306a36Sopenharmony_ci#define MALONE_PAYLOAD_HEADER_SIZE 16 111662306a36Sopenharmony_ci#define MALONE_CODEC_VERSION_ID 0x1 111762306a36Sopenharmony_ci#define MALONE_CODEC_ID_VC1_SIMPLE 0x10 111862306a36Sopenharmony_ci#define MALONE_CODEC_ID_VC1_MAIN 0x11 111962306a36Sopenharmony_ci#define MALONE_CODEC_ID_ARV8 0x28 112062306a36Sopenharmony_ci#define MALONE_CODEC_ID_ARV9 0x29 112162306a36Sopenharmony_ci#define MALONE_CODEC_ID_VP6 0x36 112262306a36Sopenharmony_ci#define MALONE_CODEC_ID_VP8 0x36 112362306a36Sopenharmony_ci#define MALONE_CODEC_ID_DIVX3 0x38 112462306a36Sopenharmony_ci#define MALONE_CODEC_ID_SPK 0x39 112562306a36Sopenharmony_ci 112662306a36Sopenharmony_ci#define MALONE_VP8_IVF_SEQ_HEADER_LEN 32 112762306a36Sopenharmony_ci#define MALONE_VP8_IVF_FRAME_HEADER_LEN 8 112862306a36Sopenharmony_ci 112962306a36Sopenharmony_ci#define MALONE_VC1_RCV_CODEC_V1_VERSION 0x85 113062306a36Sopenharmony_ci#define MALONE_VC1_RCV_CODEC_V2_VERSION 0xC5 113162306a36Sopenharmony_ci#define MALONE_VC1_RCV_NUM_FRAMES 0xFF 113262306a36Sopenharmony_ci#define MALONE_VC1_RCV_SEQ_EXT_DATA_SIZE 4 113362306a36Sopenharmony_ci#define MALONE_VC1_RCV_SEQ_HEADER_LEN 20 113462306a36Sopenharmony_ci#define MALONE_VC1_RCV_PIC_HEADER_LEN 4 113562306a36Sopenharmony_ci#define MALONE_VC1_NAL_HEADER_LEN 4 113662306a36Sopenharmony_ci#define MALONE_VC1_CONTAIN_NAL(data) (((data) & 0x00FFFFFF) == 0x00010000) 113762306a36Sopenharmony_ci 113862306a36Sopenharmony_cistatic void set_payload_hdr(u8 *dst, u32 scd_type, u32 codec_id, 113962306a36Sopenharmony_ci u32 buffer_size, u32 width, u32 height) 114062306a36Sopenharmony_ci{ 114162306a36Sopenharmony_ci unsigned int payload_size; 114262306a36Sopenharmony_ci /* payload_size = buffer_size + itself_size(16) - start_code(4) */ 114362306a36Sopenharmony_ci payload_size = buffer_size + 12; 114462306a36Sopenharmony_ci 114562306a36Sopenharmony_ci dst[0] = 0x00; 114662306a36Sopenharmony_ci dst[1] = 0x00; 114762306a36Sopenharmony_ci dst[2] = 0x01; 114862306a36Sopenharmony_ci dst[3] = scd_type; 114962306a36Sopenharmony_ci 115062306a36Sopenharmony_ci /* length */ 115162306a36Sopenharmony_ci dst[4] = ((payload_size >> 16) & 0xff); 115262306a36Sopenharmony_ci dst[5] = ((payload_size >> 8) & 0xff); 115362306a36Sopenharmony_ci dst[6] = 0x4e; 115462306a36Sopenharmony_ci dst[7] = ((payload_size >> 0) & 0xff); 115562306a36Sopenharmony_ci 115662306a36Sopenharmony_ci /* Codec ID and Version */ 115762306a36Sopenharmony_ci dst[8] = codec_id; 115862306a36Sopenharmony_ci dst[9] = MALONE_CODEC_VERSION_ID; 115962306a36Sopenharmony_ci 116062306a36Sopenharmony_ci /* width */ 116162306a36Sopenharmony_ci dst[10] = ((width >> 8) & 0xff); 116262306a36Sopenharmony_ci dst[11] = ((width >> 0) & 0xff); 116362306a36Sopenharmony_ci dst[12] = 0x58; 116462306a36Sopenharmony_ci 116562306a36Sopenharmony_ci /* height */ 116662306a36Sopenharmony_ci dst[13] = ((height >> 8) & 0xff); 116762306a36Sopenharmony_ci dst[14] = ((height >> 0) & 0xff); 116862306a36Sopenharmony_ci dst[15] = 0x50; 116962306a36Sopenharmony_ci} 117062306a36Sopenharmony_ci 117162306a36Sopenharmony_cistatic void set_vp8_ivf_seqhdr(u8 *dst, u32 width, u32 height) 117262306a36Sopenharmony_ci{ 117362306a36Sopenharmony_ci /* 0-3byte signature "DKIF" */ 117462306a36Sopenharmony_ci dst[0] = 0x44; 117562306a36Sopenharmony_ci dst[1] = 0x4b; 117662306a36Sopenharmony_ci dst[2] = 0x49; 117762306a36Sopenharmony_ci dst[3] = 0x46; 117862306a36Sopenharmony_ci /* 4-5byte version: should be 0*/ 117962306a36Sopenharmony_ci dst[4] = 0x00; 118062306a36Sopenharmony_ci dst[5] = 0x00; 118162306a36Sopenharmony_ci /* 6-7 length of Header */ 118262306a36Sopenharmony_ci dst[6] = MALONE_VP8_IVF_SEQ_HEADER_LEN; 118362306a36Sopenharmony_ci dst[7] = MALONE_VP8_IVF_SEQ_HEADER_LEN >> 8; 118462306a36Sopenharmony_ci /* 8-11 VP8 fourcc */ 118562306a36Sopenharmony_ci dst[8] = 0x56; 118662306a36Sopenharmony_ci dst[9] = 0x50; 118762306a36Sopenharmony_ci dst[10] = 0x38; 118862306a36Sopenharmony_ci dst[11] = 0x30; 118962306a36Sopenharmony_ci /* 12-13 width in pixels */ 119062306a36Sopenharmony_ci dst[12] = width; 119162306a36Sopenharmony_ci dst[13] = width >> 8; 119262306a36Sopenharmony_ci /* 14-15 height in pixels */ 119362306a36Sopenharmony_ci dst[14] = height; 119462306a36Sopenharmony_ci dst[15] = height >> 8; 119562306a36Sopenharmony_ci /* 16-19 frame rate */ 119662306a36Sopenharmony_ci dst[16] = 0xe8; 119762306a36Sopenharmony_ci dst[17] = 0x03; 119862306a36Sopenharmony_ci dst[18] = 0x00; 119962306a36Sopenharmony_ci dst[19] = 0x00; 120062306a36Sopenharmony_ci /* 20-23 time scale */ 120162306a36Sopenharmony_ci dst[20] = 0x01; 120262306a36Sopenharmony_ci dst[21] = 0x00; 120362306a36Sopenharmony_ci dst[22] = 0x00; 120462306a36Sopenharmony_ci dst[23] = 0x00; 120562306a36Sopenharmony_ci /* 24-27 number frames */ 120662306a36Sopenharmony_ci dst[24] = 0xdf; 120762306a36Sopenharmony_ci dst[25] = 0xf9; 120862306a36Sopenharmony_ci dst[26] = 0x09; 120962306a36Sopenharmony_ci dst[27] = 0x00; 121062306a36Sopenharmony_ci /* 28-31 reserved */ 121162306a36Sopenharmony_ci} 121262306a36Sopenharmony_ci 121362306a36Sopenharmony_cistatic void set_vp8_ivf_pichdr(u8 *dst, u32 frame_size) 121462306a36Sopenharmony_ci{ 121562306a36Sopenharmony_ci /* 121662306a36Sopenharmony_ci * firmware just parse 64-bit timestamp(8 bytes). 121762306a36Sopenharmony_ci * As not transfer timestamp to firmware, use default value(ZERO). 121862306a36Sopenharmony_ci * No need to do anything here 121962306a36Sopenharmony_ci */ 122062306a36Sopenharmony_ci} 122162306a36Sopenharmony_ci 122262306a36Sopenharmony_cistatic void set_vc1_rcv_seqhdr(u8 *dst, u8 *src, u32 width, u32 height) 122362306a36Sopenharmony_ci{ 122462306a36Sopenharmony_ci u32 frames = MALONE_VC1_RCV_NUM_FRAMES; 122562306a36Sopenharmony_ci u32 ext_data_size = MALONE_VC1_RCV_SEQ_EXT_DATA_SIZE; 122662306a36Sopenharmony_ci 122762306a36Sopenharmony_ci /* 0-2 Number of frames, used default value 0xFF */ 122862306a36Sopenharmony_ci dst[0] = frames; 122962306a36Sopenharmony_ci dst[1] = frames >> 8; 123062306a36Sopenharmony_ci dst[2] = frames >> 16; 123162306a36Sopenharmony_ci 123262306a36Sopenharmony_ci /* 3 RCV version, used V1 */ 123362306a36Sopenharmony_ci dst[3] = MALONE_VC1_RCV_CODEC_V1_VERSION; 123462306a36Sopenharmony_ci 123562306a36Sopenharmony_ci /* 4-7 extension data size */ 123662306a36Sopenharmony_ci dst[4] = ext_data_size; 123762306a36Sopenharmony_ci dst[5] = ext_data_size >> 8; 123862306a36Sopenharmony_ci dst[6] = ext_data_size >> 16; 123962306a36Sopenharmony_ci dst[7] = ext_data_size >> 24; 124062306a36Sopenharmony_ci /* 8-11 extension data */ 124162306a36Sopenharmony_ci dst[8] = src[0]; 124262306a36Sopenharmony_ci dst[9] = src[1]; 124362306a36Sopenharmony_ci dst[10] = src[2]; 124462306a36Sopenharmony_ci dst[11] = src[3]; 124562306a36Sopenharmony_ci 124662306a36Sopenharmony_ci /* height */ 124762306a36Sopenharmony_ci dst[12] = height; 124862306a36Sopenharmony_ci dst[13] = (height >> 8) & 0xff; 124962306a36Sopenharmony_ci dst[14] = (height >> 16) & 0xff; 125062306a36Sopenharmony_ci dst[15] = (height >> 24) & 0xff; 125162306a36Sopenharmony_ci /* width */ 125262306a36Sopenharmony_ci dst[16] = width; 125362306a36Sopenharmony_ci dst[17] = (width >> 8) & 0xff; 125462306a36Sopenharmony_ci dst[18] = (width >> 16) & 0xff; 125562306a36Sopenharmony_ci dst[19] = (width >> 24) & 0xff; 125662306a36Sopenharmony_ci} 125762306a36Sopenharmony_ci 125862306a36Sopenharmony_cistatic void set_vc1_rcv_pichdr(u8 *dst, u32 buffer_size) 125962306a36Sopenharmony_ci{ 126062306a36Sopenharmony_ci dst[0] = buffer_size; 126162306a36Sopenharmony_ci dst[1] = buffer_size >> 8; 126262306a36Sopenharmony_ci dst[2] = buffer_size >> 16; 126362306a36Sopenharmony_ci dst[3] = buffer_size >> 24; 126462306a36Sopenharmony_ci} 126562306a36Sopenharmony_ci 126662306a36Sopenharmony_cistatic void create_vc1_nal_pichdr(u8 *dst) 126762306a36Sopenharmony_ci{ 126862306a36Sopenharmony_ci /* need insert nal header: special ID */ 126962306a36Sopenharmony_ci dst[0] = 0x0; 127062306a36Sopenharmony_ci dst[1] = 0x0; 127162306a36Sopenharmony_ci dst[2] = 0x01; 127262306a36Sopenharmony_ci dst[3] = 0x0D; 127362306a36Sopenharmony_ci} 127462306a36Sopenharmony_ci 127562306a36Sopenharmony_cistatic int vpu_malone_insert_scode_seq(struct malone_scode_t *scode, u32 codec_id, u32 ext_size) 127662306a36Sopenharmony_ci{ 127762306a36Sopenharmony_ci u8 hdr[MALONE_PAYLOAD_HEADER_SIZE]; 127862306a36Sopenharmony_ci int ret; 127962306a36Sopenharmony_ci 128062306a36Sopenharmony_ci set_payload_hdr(hdr, 128162306a36Sopenharmony_ci SCODE_SEQUENCE, 128262306a36Sopenharmony_ci codec_id, 128362306a36Sopenharmony_ci ext_size, 128462306a36Sopenharmony_ci scode->inst->out_format.width, 128562306a36Sopenharmony_ci scode->inst->out_format.height); 128662306a36Sopenharmony_ci ret = vpu_helper_copy_to_stream_buffer(&scode->inst->stream_buffer, 128762306a36Sopenharmony_ci &scode->wptr, 128862306a36Sopenharmony_ci sizeof(hdr), 128962306a36Sopenharmony_ci hdr); 129062306a36Sopenharmony_ci if (ret < 0) 129162306a36Sopenharmony_ci return ret; 129262306a36Sopenharmony_ci return sizeof(hdr); 129362306a36Sopenharmony_ci} 129462306a36Sopenharmony_ci 129562306a36Sopenharmony_cistatic int vpu_malone_insert_scode_pic(struct malone_scode_t *scode, u32 codec_id, u32 ext_size) 129662306a36Sopenharmony_ci{ 129762306a36Sopenharmony_ci u8 hdr[MALONE_PAYLOAD_HEADER_SIZE]; 129862306a36Sopenharmony_ci int ret; 129962306a36Sopenharmony_ci 130062306a36Sopenharmony_ci set_payload_hdr(hdr, 130162306a36Sopenharmony_ci SCODE_PICTURE, 130262306a36Sopenharmony_ci codec_id, 130362306a36Sopenharmony_ci ext_size + vb2_get_plane_payload(scode->vb, 0), 130462306a36Sopenharmony_ci scode->inst->out_format.width, 130562306a36Sopenharmony_ci scode->inst->out_format.height); 130662306a36Sopenharmony_ci ret = vpu_helper_copy_to_stream_buffer(&scode->inst->stream_buffer, 130762306a36Sopenharmony_ci &scode->wptr, 130862306a36Sopenharmony_ci sizeof(hdr), 130962306a36Sopenharmony_ci hdr); 131062306a36Sopenharmony_ci if (ret < 0) 131162306a36Sopenharmony_ci return ret; 131262306a36Sopenharmony_ci return sizeof(hdr); 131362306a36Sopenharmony_ci} 131462306a36Sopenharmony_ci 131562306a36Sopenharmony_cistatic int vpu_malone_insert_scode_vc1_g_seq(struct malone_scode_t *scode) 131662306a36Sopenharmony_ci{ 131762306a36Sopenharmony_ci if (!scode->inst->total_input_count) 131862306a36Sopenharmony_ci return 0; 131962306a36Sopenharmony_ci if (vpu_vb_is_codecconfig(to_vb2_v4l2_buffer(scode->vb))) 132062306a36Sopenharmony_ci scode->need_data = 0; 132162306a36Sopenharmony_ci return 0; 132262306a36Sopenharmony_ci} 132362306a36Sopenharmony_ci 132462306a36Sopenharmony_cistatic int vpu_malone_insert_scode_vc1_g_pic(struct malone_scode_t *scode) 132562306a36Sopenharmony_ci{ 132662306a36Sopenharmony_ci struct vb2_v4l2_buffer *vbuf; 132762306a36Sopenharmony_ci u8 nal_hdr[MALONE_VC1_NAL_HEADER_LEN]; 132862306a36Sopenharmony_ci u32 *data = NULL; 132962306a36Sopenharmony_ci int ret; 133062306a36Sopenharmony_ci 133162306a36Sopenharmony_ci vbuf = to_vb2_v4l2_buffer(scode->vb); 133262306a36Sopenharmony_ci data = vb2_plane_vaddr(scode->vb, 0); 133362306a36Sopenharmony_ci 133462306a36Sopenharmony_ci if (scode->inst->total_input_count == 0 || vpu_vb_is_codecconfig(vbuf)) 133562306a36Sopenharmony_ci return 0; 133662306a36Sopenharmony_ci if (MALONE_VC1_CONTAIN_NAL(*data)) 133762306a36Sopenharmony_ci return 0; 133862306a36Sopenharmony_ci 133962306a36Sopenharmony_ci create_vc1_nal_pichdr(nal_hdr); 134062306a36Sopenharmony_ci ret = vpu_helper_copy_to_stream_buffer(&scode->inst->stream_buffer, 134162306a36Sopenharmony_ci &scode->wptr, 134262306a36Sopenharmony_ci sizeof(nal_hdr), 134362306a36Sopenharmony_ci nal_hdr); 134462306a36Sopenharmony_ci if (ret < 0) 134562306a36Sopenharmony_ci return ret; 134662306a36Sopenharmony_ci return sizeof(nal_hdr); 134762306a36Sopenharmony_ci} 134862306a36Sopenharmony_ci 134962306a36Sopenharmony_cistatic int vpu_malone_insert_scode_vc1_l_seq(struct malone_scode_t *scode) 135062306a36Sopenharmony_ci{ 135162306a36Sopenharmony_ci int ret; 135262306a36Sopenharmony_ci int size = 0; 135362306a36Sopenharmony_ci u8 rcv_seqhdr[MALONE_VC1_RCV_SEQ_HEADER_LEN]; 135462306a36Sopenharmony_ci 135562306a36Sopenharmony_ci if (vpu_vb_is_codecconfig(to_vb2_v4l2_buffer(scode->vb))) 135662306a36Sopenharmony_ci scode->need_data = 0; 135762306a36Sopenharmony_ci if (scode->inst->total_input_count) 135862306a36Sopenharmony_ci return 0; 135962306a36Sopenharmony_ci scode->need_data = 0; 136062306a36Sopenharmony_ci 136162306a36Sopenharmony_ci ret = vpu_malone_insert_scode_seq(scode, MALONE_CODEC_ID_VC1_SIMPLE, sizeof(rcv_seqhdr)); 136262306a36Sopenharmony_ci if (ret < 0) 136362306a36Sopenharmony_ci return ret; 136462306a36Sopenharmony_ci size = ret; 136562306a36Sopenharmony_ci 136662306a36Sopenharmony_ci set_vc1_rcv_seqhdr(rcv_seqhdr, 136762306a36Sopenharmony_ci vb2_plane_vaddr(scode->vb, 0), 136862306a36Sopenharmony_ci scode->inst->out_format.width, 136962306a36Sopenharmony_ci scode->inst->out_format.height); 137062306a36Sopenharmony_ci ret = vpu_helper_copy_to_stream_buffer(&scode->inst->stream_buffer, 137162306a36Sopenharmony_ci &scode->wptr, 137262306a36Sopenharmony_ci sizeof(rcv_seqhdr), 137362306a36Sopenharmony_ci rcv_seqhdr); 137462306a36Sopenharmony_ci 137562306a36Sopenharmony_ci if (ret < 0) 137662306a36Sopenharmony_ci return ret; 137762306a36Sopenharmony_ci size += sizeof(rcv_seqhdr); 137862306a36Sopenharmony_ci return size; 137962306a36Sopenharmony_ci} 138062306a36Sopenharmony_ci 138162306a36Sopenharmony_cistatic int vpu_malone_insert_scode_vc1_l_pic(struct malone_scode_t *scode) 138262306a36Sopenharmony_ci{ 138362306a36Sopenharmony_ci int ret; 138462306a36Sopenharmony_ci int size = 0; 138562306a36Sopenharmony_ci u8 rcv_pichdr[MALONE_VC1_RCV_PIC_HEADER_LEN]; 138662306a36Sopenharmony_ci 138762306a36Sopenharmony_ci ret = vpu_malone_insert_scode_pic(scode, MALONE_CODEC_ID_VC1_SIMPLE, 138862306a36Sopenharmony_ci sizeof(rcv_pichdr)); 138962306a36Sopenharmony_ci if (ret < 0) 139062306a36Sopenharmony_ci return ret; 139162306a36Sopenharmony_ci size = ret; 139262306a36Sopenharmony_ci 139362306a36Sopenharmony_ci set_vc1_rcv_pichdr(rcv_pichdr, vb2_get_plane_payload(scode->vb, 0)); 139462306a36Sopenharmony_ci ret = vpu_helper_copy_to_stream_buffer(&scode->inst->stream_buffer, 139562306a36Sopenharmony_ci &scode->wptr, 139662306a36Sopenharmony_ci sizeof(rcv_pichdr), 139762306a36Sopenharmony_ci rcv_pichdr); 139862306a36Sopenharmony_ci if (ret < 0) 139962306a36Sopenharmony_ci return ret; 140062306a36Sopenharmony_ci size += sizeof(rcv_pichdr); 140162306a36Sopenharmony_ci return size; 140262306a36Sopenharmony_ci} 140362306a36Sopenharmony_ci 140462306a36Sopenharmony_cistatic int vpu_malone_insert_scode_vp8_seq(struct malone_scode_t *scode) 140562306a36Sopenharmony_ci{ 140662306a36Sopenharmony_ci int ret; 140762306a36Sopenharmony_ci int size = 0; 140862306a36Sopenharmony_ci u8 ivf_hdr[MALONE_VP8_IVF_SEQ_HEADER_LEN]; 140962306a36Sopenharmony_ci 141062306a36Sopenharmony_ci ret = vpu_malone_insert_scode_seq(scode, MALONE_CODEC_ID_VP8, sizeof(ivf_hdr)); 141162306a36Sopenharmony_ci if (ret < 0) 141262306a36Sopenharmony_ci return ret; 141362306a36Sopenharmony_ci size = ret; 141462306a36Sopenharmony_ci 141562306a36Sopenharmony_ci set_vp8_ivf_seqhdr(ivf_hdr, 141662306a36Sopenharmony_ci scode->inst->out_format.width, 141762306a36Sopenharmony_ci scode->inst->out_format.height); 141862306a36Sopenharmony_ci ret = vpu_helper_copy_to_stream_buffer(&scode->inst->stream_buffer, 141962306a36Sopenharmony_ci &scode->wptr, 142062306a36Sopenharmony_ci sizeof(ivf_hdr), 142162306a36Sopenharmony_ci ivf_hdr); 142262306a36Sopenharmony_ci if (ret < 0) 142362306a36Sopenharmony_ci return ret; 142462306a36Sopenharmony_ci size += sizeof(ivf_hdr); 142562306a36Sopenharmony_ci 142662306a36Sopenharmony_ci return size; 142762306a36Sopenharmony_ci} 142862306a36Sopenharmony_ci 142962306a36Sopenharmony_cistatic int vpu_malone_insert_scode_vp8_pic(struct malone_scode_t *scode) 143062306a36Sopenharmony_ci{ 143162306a36Sopenharmony_ci int ret; 143262306a36Sopenharmony_ci int size = 0; 143362306a36Sopenharmony_ci u8 ivf_hdr[MALONE_VP8_IVF_FRAME_HEADER_LEN] = {0}; 143462306a36Sopenharmony_ci 143562306a36Sopenharmony_ci ret = vpu_malone_insert_scode_pic(scode, MALONE_CODEC_ID_VP8, sizeof(ivf_hdr)); 143662306a36Sopenharmony_ci if (ret < 0) 143762306a36Sopenharmony_ci return ret; 143862306a36Sopenharmony_ci size = ret; 143962306a36Sopenharmony_ci 144062306a36Sopenharmony_ci set_vp8_ivf_pichdr(ivf_hdr, vb2_get_plane_payload(scode->vb, 0)); 144162306a36Sopenharmony_ci ret = vpu_helper_copy_to_stream_buffer(&scode->inst->stream_buffer, 144262306a36Sopenharmony_ci &scode->wptr, 144362306a36Sopenharmony_ci sizeof(ivf_hdr), 144462306a36Sopenharmony_ci ivf_hdr); 144562306a36Sopenharmony_ci if (ret < 0) 144662306a36Sopenharmony_ci return ret; 144762306a36Sopenharmony_ci size += sizeof(ivf_hdr); 144862306a36Sopenharmony_ci 144962306a36Sopenharmony_ci return size; 145062306a36Sopenharmony_ci} 145162306a36Sopenharmony_ci 145262306a36Sopenharmony_cistatic int vpu_malone_insert_scode_spk_seq(struct malone_scode_t *scode) 145362306a36Sopenharmony_ci{ 145462306a36Sopenharmony_ci return vpu_malone_insert_scode_seq(scode, MALONE_CODEC_ID_SPK, 0); 145562306a36Sopenharmony_ci} 145662306a36Sopenharmony_ci 145762306a36Sopenharmony_cistatic int vpu_malone_insert_scode_spk_pic(struct malone_scode_t *scode) 145862306a36Sopenharmony_ci{ 145962306a36Sopenharmony_ci return vpu_malone_insert_scode_pic(scode, MALONE_CODEC_ID_SPK, 0); 146062306a36Sopenharmony_ci} 146162306a36Sopenharmony_ci 146262306a36Sopenharmony_cistatic const struct malone_scode_handler scode_handlers[] = { 146362306a36Sopenharmony_ci { 146462306a36Sopenharmony_ci /* fix me, need to swap return operation after gstreamer swap */ 146562306a36Sopenharmony_ci .pixelformat = V4L2_PIX_FMT_VC1_ANNEX_L, 146662306a36Sopenharmony_ci .insert_scode_seq = vpu_malone_insert_scode_vc1_l_seq, 146762306a36Sopenharmony_ci .insert_scode_pic = vpu_malone_insert_scode_vc1_l_pic, 146862306a36Sopenharmony_ci }, 146962306a36Sopenharmony_ci { 147062306a36Sopenharmony_ci .pixelformat = V4L2_PIX_FMT_VC1_ANNEX_G, 147162306a36Sopenharmony_ci .insert_scode_seq = vpu_malone_insert_scode_vc1_g_seq, 147262306a36Sopenharmony_ci .insert_scode_pic = vpu_malone_insert_scode_vc1_g_pic, 147362306a36Sopenharmony_ci }, 147462306a36Sopenharmony_ci { 147562306a36Sopenharmony_ci .pixelformat = V4L2_PIX_FMT_VP8, 147662306a36Sopenharmony_ci .insert_scode_seq = vpu_malone_insert_scode_vp8_seq, 147762306a36Sopenharmony_ci .insert_scode_pic = vpu_malone_insert_scode_vp8_pic, 147862306a36Sopenharmony_ci }, 147962306a36Sopenharmony_ci { 148062306a36Sopenharmony_ci .pixelformat = V4L2_PIX_FMT_SPK, 148162306a36Sopenharmony_ci .insert_scode_seq = vpu_malone_insert_scode_spk_seq, 148262306a36Sopenharmony_ci .insert_scode_pic = vpu_malone_insert_scode_spk_pic, 148362306a36Sopenharmony_ci }, 148462306a36Sopenharmony_ci}; 148562306a36Sopenharmony_ci 148662306a36Sopenharmony_cistatic const struct malone_scode_handler *get_scode_handler(u32 pixelformat) 148762306a36Sopenharmony_ci{ 148862306a36Sopenharmony_ci int i; 148962306a36Sopenharmony_ci 149062306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(scode_handlers); i++) { 149162306a36Sopenharmony_ci if (scode_handlers[i].pixelformat == pixelformat) 149262306a36Sopenharmony_ci return &scode_handlers[i]; 149362306a36Sopenharmony_ci } 149462306a36Sopenharmony_ci 149562306a36Sopenharmony_ci return NULL; 149662306a36Sopenharmony_ci} 149762306a36Sopenharmony_ci 149862306a36Sopenharmony_cistatic int vpu_malone_insert_scode(struct malone_scode_t *scode, u32 type) 149962306a36Sopenharmony_ci{ 150062306a36Sopenharmony_ci const struct malone_scode_handler *handler; 150162306a36Sopenharmony_ci int ret = 0; 150262306a36Sopenharmony_ci 150362306a36Sopenharmony_ci if (!scode || !scode->inst || !scode->vb) 150462306a36Sopenharmony_ci return 0; 150562306a36Sopenharmony_ci 150662306a36Sopenharmony_ci scode->need_data = 1; 150762306a36Sopenharmony_ci handler = get_scode_handler(scode->inst->out_format.pixfmt); 150862306a36Sopenharmony_ci if (!handler) 150962306a36Sopenharmony_ci return 0; 151062306a36Sopenharmony_ci 151162306a36Sopenharmony_ci switch (type) { 151262306a36Sopenharmony_ci case SCODE_SEQUENCE: 151362306a36Sopenharmony_ci if (handler->insert_scode_seq) 151462306a36Sopenharmony_ci ret = handler->insert_scode_seq(scode); 151562306a36Sopenharmony_ci break; 151662306a36Sopenharmony_ci case SCODE_PICTURE: 151762306a36Sopenharmony_ci if (handler->insert_scode_pic) 151862306a36Sopenharmony_ci ret = handler->insert_scode_pic(scode); 151962306a36Sopenharmony_ci break; 152062306a36Sopenharmony_ci default: 152162306a36Sopenharmony_ci break; 152262306a36Sopenharmony_ci } 152362306a36Sopenharmony_ci 152462306a36Sopenharmony_ci return ret; 152562306a36Sopenharmony_ci} 152662306a36Sopenharmony_ci 152762306a36Sopenharmony_cistatic int vpu_malone_input_frame_data(struct vpu_malone_str_buffer __iomem *str_buf, 152862306a36Sopenharmony_ci struct vpu_inst *inst, struct vb2_buffer *vb, 152962306a36Sopenharmony_ci u32 disp_imm) 153062306a36Sopenharmony_ci{ 153162306a36Sopenharmony_ci struct malone_scode_t scode; 153262306a36Sopenharmony_ci struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); 153362306a36Sopenharmony_ci u32 wptr = readl(&str_buf->wptr); 153462306a36Sopenharmony_ci int size = 0; 153562306a36Sopenharmony_ci int ret = 0; 153662306a36Sopenharmony_ci 153762306a36Sopenharmony_ci /*add scode: SCODE_SEQUENCE, SCODE_PICTURE, SCODE_SLICE*/ 153862306a36Sopenharmony_ci scode.inst = inst; 153962306a36Sopenharmony_ci scode.vb = vb; 154062306a36Sopenharmony_ci scode.wptr = wptr; 154162306a36Sopenharmony_ci scode.need_data = 1; 154262306a36Sopenharmony_ci if (vbuf->sequence == 0 || vpu_vb_is_codecconfig(vbuf)) 154362306a36Sopenharmony_ci ret = vpu_malone_insert_scode(&scode, SCODE_SEQUENCE); 154462306a36Sopenharmony_ci 154562306a36Sopenharmony_ci if (ret < 0) 154662306a36Sopenharmony_ci return -ENOMEM; 154762306a36Sopenharmony_ci size += ret; 154862306a36Sopenharmony_ci wptr = scode.wptr; 154962306a36Sopenharmony_ci if (!scode.need_data) { 155062306a36Sopenharmony_ci vpu_malone_update_wptr(str_buf, wptr); 155162306a36Sopenharmony_ci return size; 155262306a36Sopenharmony_ci } 155362306a36Sopenharmony_ci 155462306a36Sopenharmony_ci ret = vpu_malone_insert_scode(&scode, SCODE_PICTURE); 155562306a36Sopenharmony_ci if (ret < 0) 155662306a36Sopenharmony_ci return -ENOMEM; 155762306a36Sopenharmony_ci size += ret; 155862306a36Sopenharmony_ci wptr = scode.wptr; 155962306a36Sopenharmony_ci 156062306a36Sopenharmony_ci ret = vpu_helper_copy_to_stream_buffer(&inst->stream_buffer, 156162306a36Sopenharmony_ci &wptr, 156262306a36Sopenharmony_ci vb2_get_plane_payload(vb, 0), 156362306a36Sopenharmony_ci vb2_plane_vaddr(vb, 0)); 156462306a36Sopenharmony_ci if (ret < 0) 156562306a36Sopenharmony_ci return -ENOMEM; 156662306a36Sopenharmony_ci size += vb2_get_plane_payload(vb, 0); 156762306a36Sopenharmony_ci 156862306a36Sopenharmony_ci vpu_malone_update_wptr(str_buf, wptr); 156962306a36Sopenharmony_ci 157062306a36Sopenharmony_ci if (disp_imm && !vpu_vb_is_codecconfig(vbuf)) { 157162306a36Sopenharmony_ci ret = vpu_malone_add_scode(inst->core->iface, 157262306a36Sopenharmony_ci inst->id, 157362306a36Sopenharmony_ci &inst->stream_buffer, 157462306a36Sopenharmony_ci inst->out_format.pixfmt, 157562306a36Sopenharmony_ci SCODE_PADDING_BUFFLUSH); 157662306a36Sopenharmony_ci if (ret < 0) 157762306a36Sopenharmony_ci return ret; 157862306a36Sopenharmony_ci size += ret; 157962306a36Sopenharmony_ci } 158062306a36Sopenharmony_ci 158162306a36Sopenharmony_ci return size; 158262306a36Sopenharmony_ci} 158362306a36Sopenharmony_ci 158462306a36Sopenharmony_cistatic int vpu_malone_input_stream_data(struct vpu_malone_str_buffer __iomem *str_buf, 158562306a36Sopenharmony_ci struct vpu_inst *inst, struct vb2_buffer *vb) 158662306a36Sopenharmony_ci{ 158762306a36Sopenharmony_ci u32 wptr = readl(&str_buf->wptr); 158862306a36Sopenharmony_ci int ret = 0; 158962306a36Sopenharmony_ci 159062306a36Sopenharmony_ci ret = vpu_helper_copy_to_stream_buffer(&inst->stream_buffer, 159162306a36Sopenharmony_ci &wptr, 159262306a36Sopenharmony_ci vb2_get_plane_payload(vb, 0), 159362306a36Sopenharmony_ci vb2_plane_vaddr(vb, 0)); 159462306a36Sopenharmony_ci if (ret < 0) 159562306a36Sopenharmony_ci return -ENOMEM; 159662306a36Sopenharmony_ci 159762306a36Sopenharmony_ci vpu_malone_update_wptr(str_buf, wptr); 159862306a36Sopenharmony_ci 159962306a36Sopenharmony_ci return ret; 160062306a36Sopenharmony_ci} 160162306a36Sopenharmony_ci 160262306a36Sopenharmony_cistatic int vpu_malone_input_ts(struct vpu_inst *inst, s64 timestamp, u32 size) 160362306a36Sopenharmony_ci{ 160462306a36Sopenharmony_ci struct vpu_ts_info info; 160562306a36Sopenharmony_ci 160662306a36Sopenharmony_ci memset(&info, 0, sizeof(info)); 160762306a36Sopenharmony_ci info.timestamp = timestamp; 160862306a36Sopenharmony_ci info.size = size; 160962306a36Sopenharmony_ci 161062306a36Sopenharmony_ci return vpu_session_fill_timestamp(inst, &info); 161162306a36Sopenharmony_ci} 161262306a36Sopenharmony_ci 161362306a36Sopenharmony_ciint vpu_malone_input_frame(struct vpu_shared_addr *shared, 161462306a36Sopenharmony_ci struct vpu_inst *inst, struct vb2_buffer *vb) 161562306a36Sopenharmony_ci{ 161662306a36Sopenharmony_ci struct vpu_dec_ctrl *hc = shared->priv; 161762306a36Sopenharmony_ci struct vb2_v4l2_buffer *vbuf; 161862306a36Sopenharmony_ci struct vpu_malone_str_buffer __iomem *str_buf = hc->str_buf[inst->id]; 161962306a36Sopenharmony_ci u32 disp_imm = hc->codec_param[inst->id].disp_imm; 162062306a36Sopenharmony_ci u32 size; 162162306a36Sopenharmony_ci int ret; 162262306a36Sopenharmony_ci 162362306a36Sopenharmony_ci if (vpu_malone_is_non_frame_mode(shared, inst->id)) 162462306a36Sopenharmony_ci ret = vpu_malone_input_stream_data(str_buf, inst, vb); 162562306a36Sopenharmony_ci else 162662306a36Sopenharmony_ci ret = vpu_malone_input_frame_data(str_buf, inst, vb, disp_imm); 162762306a36Sopenharmony_ci if (ret < 0) 162862306a36Sopenharmony_ci return ret; 162962306a36Sopenharmony_ci size = ret; 163062306a36Sopenharmony_ci 163162306a36Sopenharmony_ci /* 163262306a36Sopenharmony_ci * if buffer only contain codec data, and the timestamp is invalid, 163362306a36Sopenharmony_ci * don't put the invalid timestamp to resync 163462306a36Sopenharmony_ci * merge the data to next frame 163562306a36Sopenharmony_ci */ 163662306a36Sopenharmony_ci vbuf = to_vb2_v4l2_buffer(vb); 163762306a36Sopenharmony_ci if (vpu_vb_is_codecconfig(vbuf)) { 163862306a36Sopenharmony_ci inst->extra_size += size; 163962306a36Sopenharmony_ci return 0; 164062306a36Sopenharmony_ci } 164162306a36Sopenharmony_ci if (inst->extra_size) { 164262306a36Sopenharmony_ci size += inst->extra_size; 164362306a36Sopenharmony_ci inst->extra_size = 0; 164462306a36Sopenharmony_ci } 164562306a36Sopenharmony_ci 164662306a36Sopenharmony_ci ret = vpu_malone_input_ts(inst, vb->timestamp, size); 164762306a36Sopenharmony_ci if (ret) 164862306a36Sopenharmony_ci return ret; 164962306a36Sopenharmony_ci 165062306a36Sopenharmony_ci return 0; 165162306a36Sopenharmony_ci} 165262306a36Sopenharmony_ci 165362306a36Sopenharmony_cistatic bool vpu_malone_check_ready(struct vpu_shared_addr *shared, u32 instance) 165462306a36Sopenharmony_ci{ 165562306a36Sopenharmony_ci struct malone_iface *iface = shared->iface; 165662306a36Sopenharmony_ci struct vpu_rpc_buffer_desc *desc = &iface->api_cmd_buffer_desc[instance]; 165762306a36Sopenharmony_ci u32 size = desc->end - desc->start; 165862306a36Sopenharmony_ci u32 rptr = desc->rptr; 165962306a36Sopenharmony_ci u32 wptr = desc->wptr; 166062306a36Sopenharmony_ci u32 used; 166162306a36Sopenharmony_ci 166262306a36Sopenharmony_ci if (!size) 166362306a36Sopenharmony_ci return true; 166462306a36Sopenharmony_ci 166562306a36Sopenharmony_ci used = (wptr + size - rptr) % size; 166662306a36Sopenharmony_ci if (used < (size / 2)) 166762306a36Sopenharmony_ci return true; 166862306a36Sopenharmony_ci 166962306a36Sopenharmony_ci return false; 167062306a36Sopenharmony_ci} 167162306a36Sopenharmony_ci 167262306a36Sopenharmony_cibool vpu_malone_is_ready(struct vpu_shared_addr *shared, u32 instance) 167362306a36Sopenharmony_ci{ 167462306a36Sopenharmony_ci u32 cnt = 0; 167562306a36Sopenharmony_ci 167662306a36Sopenharmony_ci while (!vpu_malone_check_ready(shared, instance)) { 167762306a36Sopenharmony_ci if (cnt > 30) 167862306a36Sopenharmony_ci return false; 167962306a36Sopenharmony_ci mdelay(1); 168062306a36Sopenharmony_ci cnt++; 168162306a36Sopenharmony_ci } 168262306a36Sopenharmony_ci return true; 168362306a36Sopenharmony_ci} 168462306a36Sopenharmony_ci 168562306a36Sopenharmony_ciint vpu_malone_pre_cmd(struct vpu_shared_addr *shared, u32 instance) 168662306a36Sopenharmony_ci{ 168762306a36Sopenharmony_ci if (!vpu_malone_is_ready(shared, instance)) 168862306a36Sopenharmony_ci return -EINVAL; 168962306a36Sopenharmony_ci 169062306a36Sopenharmony_ci return 0; 169162306a36Sopenharmony_ci} 169262306a36Sopenharmony_ci 169362306a36Sopenharmony_ciint vpu_malone_post_cmd(struct vpu_shared_addr *shared, u32 instance) 169462306a36Sopenharmony_ci{ 169562306a36Sopenharmony_ci struct malone_iface *iface = shared->iface; 169662306a36Sopenharmony_ci struct vpu_rpc_buffer_desc *desc = &iface->api_cmd_buffer_desc[instance]; 169762306a36Sopenharmony_ci 169862306a36Sopenharmony_ci desc->wptr++; 169962306a36Sopenharmony_ci if (desc->wptr == desc->end) 170062306a36Sopenharmony_ci desc->wptr = desc->start; 170162306a36Sopenharmony_ci 170262306a36Sopenharmony_ci return 0; 170362306a36Sopenharmony_ci} 170462306a36Sopenharmony_ci 170562306a36Sopenharmony_ciint vpu_malone_init_instance(struct vpu_shared_addr *shared, u32 instance) 170662306a36Sopenharmony_ci{ 170762306a36Sopenharmony_ci struct malone_iface *iface = shared->iface; 170862306a36Sopenharmony_ci struct vpu_rpc_buffer_desc *desc = &iface->api_cmd_buffer_desc[instance]; 170962306a36Sopenharmony_ci 171062306a36Sopenharmony_ci desc->wptr = desc->rptr; 171162306a36Sopenharmony_ci if (desc->wptr == desc->end) 171262306a36Sopenharmony_ci desc->wptr = desc->start; 171362306a36Sopenharmony_ci 171462306a36Sopenharmony_ci return 0; 171562306a36Sopenharmony_ci} 171662306a36Sopenharmony_ci 171762306a36Sopenharmony_ciu32 vpu_malone_get_max_instance_count(struct vpu_shared_addr *shared) 171862306a36Sopenharmony_ci{ 171962306a36Sopenharmony_ci struct malone_iface *iface = shared->iface; 172062306a36Sopenharmony_ci 172162306a36Sopenharmony_ci return iface->max_streams; 172262306a36Sopenharmony_ci} 1723