1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka * Copyright 2022 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka *
4*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka * You may obtain a copy of the License at
7*437bfbebSnyanmisaka *
8*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka *
10*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka * limitations under the License.
15*437bfbebSnyanmisaka */
16*437bfbebSnyanmisaka
17*437bfbebSnyanmisaka #define MODULE_TAG "hal_jpege_v540c"
18*437bfbebSnyanmisaka
19*437bfbebSnyanmisaka #include <linux/string.h>
20*437bfbebSnyanmisaka
21*437bfbebSnyanmisaka #include <string.h>
22*437bfbebSnyanmisaka #include <math.h>
23*437bfbebSnyanmisaka #include <limits.h>
24*437bfbebSnyanmisaka
25*437bfbebSnyanmisaka #include "mpp_env.h"
26*437bfbebSnyanmisaka #include "mpp_mem.h"
27*437bfbebSnyanmisaka #include "mpp_soc.h"
28*437bfbebSnyanmisaka #include "mpp_common.h"
29*437bfbebSnyanmisaka #include "mpp_frame_impl.h"
30*437bfbebSnyanmisaka
31*437bfbebSnyanmisaka #include "hal_jpege_debug.h"
32*437bfbebSnyanmisaka #include "jpege_syntax.h"
33*437bfbebSnyanmisaka #include "hal_bufs.h"
34*437bfbebSnyanmisaka #include "rkv_enc_def.h"
35*437bfbebSnyanmisaka #include "vepu5xx_common.h"
36*437bfbebSnyanmisaka #include "vepu540c_common.h"
37*437bfbebSnyanmisaka #include "hal_jpege_vepu540c.h"
38*437bfbebSnyanmisaka #include "hal_jpege_vepu540c_reg.h"
39*437bfbebSnyanmisaka #include "hal_jpege_hdr.h"
40*437bfbebSnyanmisaka
41*437bfbebSnyanmisaka typedef struct jpegeV540cHalContext_t {
42*437bfbebSnyanmisaka MppEncHalApi api;
43*437bfbebSnyanmisaka MppDev dev;
44*437bfbebSnyanmisaka void *regs;
45*437bfbebSnyanmisaka void *reg_out;
46*437bfbebSnyanmisaka
47*437bfbebSnyanmisaka void *dump_files;
48*437bfbebSnyanmisaka
49*437bfbebSnyanmisaka RK_S32 frame_type;
50*437bfbebSnyanmisaka RK_S32 last_frame_type;
51*437bfbebSnyanmisaka
52*437bfbebSnyanmisaka /* @frame_cnt starts from ZERO */
53*437bfbebSnyanmisaka RK_U32 frame_cnt;
54*437bfbebSnyanmisaka void *roi_data;
55*437bfbebSnyanmisaka MppEncCfgSet *cfg;
56*437bfbebSnyanmisaka
57*437bfbebSnyanmisaka RK_U32 enc_mode;
58*437bfbebSnyanmisaka RK_U32 frame_size;
59*437bfbebSnyanmisaka RK_S32 max_buf_cnt;
60*437bfbebSnyanmisaka RK_S32 hdr_status;
61*437bfbebSnyanmisaka void *input_fmt;
62*437bfbebSnyanmisaka RK_U8 *src_buf;
63*437bfbebSnyanmisaka RK_U8 *dst_buf;
64*437bfbebSnyanmisaka RK_S32 buf_size;
65*437bfbebSnyanmisaka RK_U32 frame_num;
66*437bfbebSnyanmisaka RK_S32 fbc_header_len;
67*437bfbebSnyanmisaka RK_U32 title_num;
68*437bfbebSnyanmisaka
69*437bfbebSnyanmisaka JpegeBits bits;
70*437bfbebSnyanmisaka JpegeSyntax syntax;
71*437bfbebSnyanmisaka HalJpegeRc hal_rc;
72*437bfbebSnyanmisaka } jpegeV540cHalContext;
73*437bfbebSnyanmisaka
hal_jpege_v540c_init(void * hal,MppEncHalCfg * cfg)74*437bfbebSnyanmisaka MPP_RET hal_jpege_v540c_init(void *hal, MppEncHalCfg *cfg)
75*437bfbebSnyanmisaka {
76*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
77*437bfbebSnyanmisaka jpegeV540cHalContext *ctx = (jpegeV540cHalContext *)hal;
78*437bfbebSnyanmisaka
79*437bfbebSnyanmisaka mpp_env_get_u32("hal_jpege_debug", &hal_jpege_debug, 0);
80*437bfbebSnyanmisaka
81*437bfbebSnyanmisaka hal_jpege_enter();
82*437bfbebSnyanmisaka
83*437bfbebSnyanmisaka ctx->reg_out = mpp_calloc(JpegV540cStatus, 1);
84*437bfbebSnyanmisaka ctx->regs = mpp_calloc(JpegV540cRegSet, 1);
85*437bfbebSnyanmisaka ctx->input_fmt = mpp_calloc(VepuFmtCfg, 1);
86*437bfbebSnyanmisaka ctx->cfg = cfg->cfg;
87*437bfbebSnyanmisaka
88*437bfbebSnyanmisaka ctx->frame_cnt = 0;
89*437bfbebSnyanmisaka ctx->enc_mode = 1;
90*437bfbebSnyanmisaka cfg->type = VPU_CLIENT_RKVENC;
91*437bfbebSnyanmisaka ret = mpp_dev_init(&cfg->dev, cfg->type);
92*437bfbebSnyanmisaka if (ret) {
93*437bfbebSnyanmisaka mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
94*437bfbebSnyanmisaka return ret;
95*437bfbebSnyanmisaka }
96*437bfbebSnyanmisaka
97*437bfbebSnyanmisaka ctx->dev = cfg->dev;
98*437bfbebSnyanmisaka jpege_bits_init(&ctx->bits);
99*437bfbebSnyanmisaka mpp_assert(ctx->bits);
100*437bfbebSnyanmisaka hal_jpege_rc_init(&ctx->hal_rc);
101*437bfbebSnyanmisaka
102*437bfbebSnyanmisaka hal_jpege_leave();
103*437bfbebSnyanmisaka return ret;
104*437bfbebSnyanmisaka }
105*437bfbebSnyanmisaka
hal_jpege_v540c_deinit(void * hal)106*437bfbebSnyanmisaka MPP_RET hal_jpege_v540c_deinit(void *hal)
107*437bfbebSnyanmisaka {
108*437bfbebSnyanmisaka jpegeV540cHalContext *ctx = (jpegeV540cHalContext *)hal;
109*437bfbebSnyanmisaka
110*437bfbebSnyanmisaka hal_jpege_enter();
111*437bfbebSnyanmisaka jpege_bits_deinit(ctx->bits);
112*437bfbebSnyanmisaka MPP_FREE(ctx->regs);
113*437bfbebSnyanmisaka
114*437bfbebSnyanmisaka MPP_FREE(ctx->reg_out);
115*437bfbebSnyanmisaka
116*437bfbebSnyanmisaka MPP_FREE(ctx->input_fmt);
117*437bfbebSnyanmisaka
118*437bfbebSnyanmisaka if (ctx->dev) {
119*437bfbebSnyanmisaka mpp_dev_deinit(ctx->dev);
120*437bfbebSnyanmisaka ctx->dev = NULL;
121*437bfbebSnyanmisaka }
122*437bfbebSnyanmisaka hal_jpege_leave();
123*437bfbebSnyanmisaka return MPP_OK;
124*437bfbebSnyanmisaka }
125*437bfbebSnyanmisaka
hal_jpege_vepu540c_prepare(void * hal)126*437bfbebSnyanmisaka static MPP_RET hal_jpege_vepu540c_prepare(void *hal)
127*437bfbebSnyanmisaka {
128*437bfbebSnyanmisaka jpegeV540cHalContext *ctx = (jpegeV540cHalContext *)hal;
129*437bfbebSnyanmisaka
130*437bfbebSnyanmisaka hal_jpege_dbg_func("enter %p\n", hal);
131*437bfbebSnyanmisaka VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
132*437bfbebSnyanmisaka vepu5xx_set_fmt(fmt, ctx->cfg->prep.format);
133*437bfbebSnyanmisaka
134*437bfbebSnyanmisaka hal_jpege_dbg_func("leave %p\n", hal);
135*437bfbebSnyanmisaka
136*437bfbebSnyanmisaka return MPP_OK;
137*437bfbebSnyanmisaka }
138*437bfbebSnyanmisaka
hal_jpege_v540c_gen_regs(void * hal,HalEncTask * task)139*437bfbebSnyanmisaka MPP_RET hal_jpege_v540c_gen_regs(void *hal, HalEncTask *task)
140*437bfbebSnyanmisaka {
141*437bfbebSnyanmisaka jpegeV540cHalContext *ctx = (jpegeV540cHalContext *)hal;
142*437bfbebSnyanmisaka JpegV540cRegSet *regs = ctx->regs;
143*437bfbebSnyanmisaka jpeg_vepu540c_control_cfg *reg_ctl = ®s->reg_ctl;
144*437bfbebSnyanmisaka jpeg_vepu540c_base *reg_base = ®s->reg_base;
145*437bfbebSnyanmisaka JpegeBits bits = ctx->bits;
146*437bfbebSnyanmisaka size_t length = mpp_packet_get_length(task->packet);
147*437bfbebSnyanmisaka RK_U8 *buf = mpp_buffer_get_ptr(task->output);
148*437bfbebSnyanmisaka size_t size = mpp_buffer_get_size(task->output);
149*437bfbebSnyanmisaka JpegeSyntax *syntax = &ctx->syntax;
150*437bfbebSnyanmisaka Vepu540cJpegCfg cfg;
151*437bfbebSnyanmisaka RK_S32 bitpos;
152*437bfbebSnyanmisaka
153*437bfbebSnyanmisaka hal_jpege_enter();
154*437bfbebSnyanmisaka cfg.enc_task = task;
155*437bfbebSnyanmisaka cfg.jpeg_reg_base = ®_base->jpegReg;
156*437bfbebSnyanmisaka cfg.dev = ctx->dev;
157*437bfbebSnyanmisaka cfg.input_fmt = ctx->input_fmt;
158*437bfbebSnyanmisaka
159*437bfbebSnyanmisaka memset(regs, 0, sizeof(JpegV540cRegSet));
160*437bfbebSnyanmisaka
161*437bfbebSnyanmisaka if (syntax->q_mode == JPEG_QFACTOR) {
162*437bfbebSnyanmisaka syntax->q_factor = 100 - task->rc_task->info.quality_target;
163*437bfbebSnyanmisaka hal_jpege_rc_update(&ctx->hal_rc, syntax);
164*437bfbebSnyanmisaka }
165*437bfbebSnyanmisaka
166*437bfbebSnyanmisaka /* write header to output buffer */
167*437bfbebSnyanmisaka jpege_bits_setup(bits, buf, (RK_U32)size);
168*437bfbebSnyanmisaka /* seek length bytes data */
169*437bfbebSnyanmisaka jpege_seek_bits(bits, length << 3);
170*437bfbebSnyanmisaka /* NOTE: write header will update qtable */
171*437bfbebSnyanmisaka write_jpeg_header(bits, syntax, &ctx->hal_rc);
172*437bfbebSnyanmisaka
173*437bfbebSnyanmisaka bitpos = jpege_bits_get_bitpos(bits);
174*437bfbebSnyanmisaka task->length = (bitpos + 7) >> 3;
175*437bfbebSnyanmisaka mpp_buffer_sync_partial_end(task->output, 0, task->length);
176*437bfbebSnyanmisaka mpp_packet_set_length(task->packet, task->length);
177*437bfbebSnyanmisaka reg_ctl->reg0004_enc_strt.lkt_num = 0;
178*437bfbebSnyanmisaka reg_ctl->reg0004_enc_strt.vepu_cmd = ctx->enc_mode;
179*437bfbebSnyanmisaka reg_ctl->reg0005_enc_clr.safe_clr = 0x0;
180*437bfbebSnyanmisaka reg_ctl->reg0005_enc_clr.force_clr = 0x0;
181*437bfbebSnyanmisaka
182*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.enc_done_en = 1;
183*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.lkt_node_done_en = 1;
184*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.sclr_done_en = 1;
185*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.slc_done_en = 1;
186*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.bsf_oflw_en = 1;
187*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.brsp_otsd_en = 1;
188*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.wbus_err_en = 1;
189*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.rbus_err_en = 1;
190*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.wdg_en = 1;
191*437bfbebSnyanmisaka reg_ctl->reg0008_int_en.lkt_err_int_en = 0;
192*437bfbebSnyanmisaka
193*437bfbebSnyanmisaka reg_ctl->reg0012_dtrns_map.jpeg_bus_edin = 0x7;
194*437bfbebSnyanmisaka reg_ctl->reg0012_dtrns_map.src_bus_edin = 0x0;
195*437bfbebSnyanmisaka reg_ctl->reg0012_dtrns_map.meiw_bus_edin = 0x0;
196*437bfbebSnyanmisaka reg_ctl->reg0012_dtrns_map.bsw_bus_edin = 0x0;
197*437bfbebSnyanmisaka reg_ctl->reg0012_dtrns_map.lktr_bus_edin = 0x0;
198*437bfbebSnyanmisaka reg_ctl->reg0012_dtrns_map.roir_bus_edin = 0x0;
199*437bfbebSnyanmisaka reg_ctl->reg0012_dtrns_map.lktw_bus_edin = 0x0;
200*437bfbebSnyanmisaka reg_ctl->reg0012_dtrns_map.rec_nfbc_bus_edin = 0x0;
201*437bfbebSnyanmisaka reg_base->reg0192_enc_pic.enc_stnd = 2; // disable h264 or hevc
202*437bfbebSnyanmisaka
203*437bfbebSnyanmisaka reg_ctl->reg0013_dtrns_cfg.axi_brsp_cke = 0x0;
204*437bfbebSnyanmisaka reg_ctl->reg0014_enc_wdg.vs_load_thd = 0x1fffff;
205*437bfbebSnyanmisaka reg_ctl->reg0014_enc_wdg.rfp_load_thd = 0;
206*437bfbebSnyanmisaka
207*437bfbebSnyanmisaka vepu540c_set_jpeg_reg(&cfg);
208*437bfbebSnyanmisaka {
209*437bfbebSnyanmisaka RK_U16 *tbl = ®s->jpeg_table.qua_tab0[0];
210*437bfbebSnyanmisaka RK_U32 i, j;
211*437bfbebSnyanmisaka
212*437bfbebSnyanmisaka for ( i = 0; i < 8; i++) {
213*437bfbebSnyanmisaka for ( j = 0; j < 8; j++) {
214*437bfbebSnyanmisaka tbl[i * 8 + j] = 0x8000 / ctx->hal_rc.qtables[0][j * 8 + i];
215*437bfbebSnyanmisaka }
216*437bfbebSnyanmisaka }
217*437bfbebSnyanmisaka tbl += 64;
218*437bfbebSnyanmisaka for ( i = 0; i < 8; i++) {
219*437bfbebSnyanmisaka for ( j = 0; j < 8; j++) {
220*437bfbebSnyanmisaka tbl[i * 8 + j] = 0x8000 / ctx->hal_rc.qtables[1][j * 8 + i];
221*437bfbebSnyanmisaka }
222*437bfbebSnyanmisaka }
223*437bfbebSnyanmisaka tbl += 64;
224*437bfbebSnyanmisaka for ( i = 0; i < 8; i++) {
225*437bfbebSnyanmisaka for ( j = 0; j < 8; j++) {
226*437bfbebSnyanmisaka tbl[i * 8 + j] = 0x8000 / ctx->hal_rc.qtables[1][j * 8 + i];
227*437bfbebSnyanmisaka }
228*437bfbebSnyanmisaka }
229*437bfbebSnyanmisaka }
230*437bfbebSnyanmisaka ctx->frame_num++;
231*437bfbebSnyanmisaka
232*437bfbebSnyanmisaka hal_jpege_leave();
233*437bfbebSnyanmisaka return MPP_OK;
234*437bfbebSnyanmisaka }
235*437bfbebSnyanmisaka
hal_jpege_v540c_start(void * hal,HalEncTask * enc_task)236*437bfbebSnyanmisaka MPP_RET hal_jpege_v540c_start(void *hal, HalEncTask *enc_task)
237*437bfbebSnyanmisaka {
238*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
239*437bfbebSnyanmisaka jpegeV540cHalContext *ctx = (jpegeV540cHalContext *)hal;
240*437bfbebSnyanmisaka JpegV540cRegSet *hw_regs = ctx->regs;
241*437bfbebSnyanmisaka JpegV540cStatus *reg_out = ctx->reg_out;
242*437bfbebSnyanmisaka MppDevRegWrCfg cfg;
243*437bfbebSnyanmisaka MppDevRegRdCfg cfg1;
244*437bfbebSnyanmisaka hal_jpege_enter();
245*437bfbebSnyanmisaka
246*437bfbebSnyanmisaka if (enc_task->flags.err) {
247*437bfbebSnyanmisaka mpp_err_f("enc_task->flags.err %08x, return e arly",
248*437bfbebSnyanmisaka enc_task->flags.err);
249*437bfbebSnyanmisaka return MPP_NOK;
250*437bfbebSnyanmisaka }
251*437bfbebSnyanmisaka
252*437bfbebSnyanmisaka cfg.reg = (RK_U32*)&hw_regs->reg_ctl;
253*437bfbebSnyanmisaka cfg.size = sizeof(jpeg_vepu540c_control_cfg);
254*437bfbebSnyanmisaka cfg.offset = VEPU540C_CTL_OFFSET;
255*437bfbebSnyanmisaka
256*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
257*437bfbebSnyanmisaka if (ret) {
258*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
259*437bfbebSnyanmisaka return ret;
260*437bfbebSnyanmisaka }
261*437bfbebSnyanmisaka
262*437bfbebSnyanmisaka cfg.reg = &hw_regs->jpeg_table;
263*437bfbebSnyanmisaka cfg.size = sizeof(vepu540c_jpeg_tab);
264*437bfbebSnyanmisaka cfg.offset = VEPU540C_JPEGTAB_OFFSET;
265*437bfbebSnyanmisaka
266*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
267*437bfbebSnyanmisaka if (ret) {
268*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
269*437bfbebSnyanmisaka return ret;
270*437bfbebSnyanmisaka }
271*437bfbebSnyanmisaka
272*437bfbebSnyanmisaka cfg.reg = &hw_regs->reg_base;
273*437bfbebSnyanmisaka cfg.size = sizeof(jpeg_vepu540c_base);
274*437bfbebSnyanmisaka cfg.offset = VEPU540C_BASE_OFFSET;
275*437bfbebSnyanmisaka
276*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
277*437bfbebSnyanmisaka if (ret) {
278*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
279*437bfbebSnyanmisaka return ret;
280*437bfbebSnyanmisaka }
281*437bfbebSnyanmisaka
282*437bfbebSnyanmisaka cfg1.reg = ®_out->hw_status;
283*437bfbebSnyanmisaka cfg1.size = sizeof(RK_U32);
284*437bfbebSnyanmisaka cfg1.offset = VEPU540C_REG_BASE_HW_STATUS;
285*437bfbebSnyanmisaka
286*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg1);
287*437bfbebSnyanmisaka if (ret) {
288*437bfbebSnyanmisaka mpp_err_f("set register read failed %d\n", ret);
289*437bfbebSnyanmisaka return ret;
290*437bfbebSnyanmisaka }
291*437bfbebSnyanmisaka
292*437bfbebSnyanmisaka cfg1.reg = ®_out->st;
293*437bfbebSnyanmisaka cfg1.size = sizeof(JpegV540cStatus) - 4;
294*437bfbebSnyanmisaka cfg1.offset = VEPU540C_STATUS_OFFSET;
295*437bfbebSnyanmisaka
296*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg1);
297*437bfbebSnyanmisaka if (ret) {
298*437bfbebSnyanmisaka mpp_err_f("set register read failed %d\n", ret);
299*437bfbebSnyanmisaka return ret;
300*437bfbebSnyanmisaka }
301*437bfbebSnyanmisaka
302*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
303*437bfbebSnyanmisaka if (ret) {
304*437bfbebSnyanmisaka mpp_err_f("send cmd failed %d\n", ret);
305*437bfbebSnyanmisaka }
306*437bfbebSnyanmisaka hal_jpege_leave();
307*437bfbebSnyanmisaka return ret;
308*437bfbebSnyanmisaka }
309*437bfbebSnyanmisaka
310*437bfbebSnyanmisaka //#define DUMP_DATA
hal_jpege_vepu540c_status_check(void * hal)311*437bfbebSnyanmisaka static MPP_RET hal_jpege_vepu540c_status_check(void *hal)
312*437bfbebSnyanmisaka {
313*437bfbebSnyanmisaka jpegeV540cHalContext *ctx = (jpegeV540cHalContext *)hal;
314*437bfbebSnyanmisaka JpegV540cStatus *elem = (JpegV540cStatus *)ctx->reg_out;
315*437bfbebSnyanmisaka
316*437bfbebSnyanmisaka vepu540c_hw_status hw_status = elem->hw_status;
317*437bfbebSnyanmisaka
318*437bfbebSnyanmisaka hal_jpege_dbg_detail("hw_status: 0x%08x", hw_status.val);
319*437bfbebSnyanmisaka if (hw_status.int_sta.enc_done_sta)
320*437bfbebSnyanmisaka hal_jpege_dbg_detail("RKV_ENC_INT_ENC_DONE");
321*437bfbebSnyanmisaka
322*437bfbebSnyanmisaka if (hw_status.int_sta.wdg_sta)
323*437bfbebSnyanmisaka mpp_err_f("RKV_ENC_INT_WDG_TIMEOUT");
324*437bfbebSnyanmisaka
325*437bfbebSnyanmisaka if (hw_status.int_sta.jslc_done_sta)
326*437bfbebSnyanmisaka hal_jpege_dbg_detail("RKV_ENC_INT_JSL_DONE");
327*437bfbebSnyanmisaka
328*437bfbebSnyanmisaka if (hw_status.int_sta.jbsf_oflw_sta)
329*437bfbebSnyanmisaka mpp_err_f("RKV_ENC_INT_JBSF_OFLOW");
330*437bfbebSnyanmisaka
331*437bfbebSnyanmisaka
332*437bfbebSnyanmisaka return MPP_OK;
333*437bfbebSnyanmisaka }
334*437bfbebSnyanmisaka
335*437bfbebSnyanmisaka
336*437bfbebSnyanmisaka
hal_jpege_v540c_wait(void * hal,HalEncTask * task)337*437bfbebSnyanmisaka MPP_RET hal_jpege_v540c_wait(void *hal, HalEncTask *task)
338*437bfbebSnyanmisaka {
339*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
340*437bfbebSnyanmisaka jpegeV540cHalContext *ctx = (jpegeV540cHalContext *)hal;
341*437bfbebSnyanmisaka HalEncTask *enc_task = task;
342*437bfbebSnyanmisaka JpegV540cStatus *elem = (JpegV540cStatus *)ctx->reg_out;
343*437bfbebSnyanmisaka hal_jpege_enter();
344*437bfbebSnyanmisaka
345*437bfbebSnyanmisaka if (enc_task->flags.err) {
346*437bfbebSnyanmisaka mpp_err_f("enc_task->flags.err %08x, return early",
347*437bfbebSnyanmisaka enc_task->flags.err);
348*437bfbebSnyanmisaka return MPP_NOK;
349*437bfbebSnyanmisaka }
350*437bfbebSnyanmisaka
351*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
352*437bfbebSnyanmisaka if (ret) {
353*437bfbebSnyanmisaka mpp_err_f("poll cmd failed %d\n", ret);
354*437bfbebSnyanmisaka ret = MPP_ERR_VPUHW;
355*437bfbebSnyanmisaka } else {
356*437bfbebSnyanmisaka hal_jpege_vepu540c_status_check(hal);
357*437bfbebSnyanmisaka task->hw_length += elem->st.jpeg_head_bits_l32;
358*437bfbebSnyanmisaka }
359*437bfbebSnyanmisaka
360*437bfbebSnyanmisaka hal_jpege_leave();
361*437bfbebSnyanmisaka return ret;
362*437bfbebSnyanmisaka }
363*437bfbebSnyanmisaka
hal_jpege_v540c_get_task(void * hal,HalEncTask * task)364*437bfbebSnyanmisaka MPP_RET hal_jpege_v540c_get_task(void *hal, HalEncTask *task)
365*437bfbebSnyanmisaka {
366*437bfbebSnyanmisaka jpegeV540cHalContext *ctx = (jpegeV540cHalContext *)hal;
367*437bfbebSnyanmisaka MppFrame frame = task->frame;
368*437bfbebSnyanmisaka EncFrmStatus *frm_status = &task->rc_task->frm;
369*437bfbebSnyanmisaka JpegeSyntax *syntax = (JpegeSyntax *)task->syntax.data;
370*437bfbebSnyanmisaka
371*437bfbebSnyanmisaka hal_jpege_enter();
372*437bfbebSnyanmisaka
373*437bfbebSnyanmisaka memcpy(&ctx->syntax, syntax, sizeof(ctx->syntax));
374*437bfbebSnyanmisaka
375*437bfbebSnyanmisaka ctx->last_frame_type = ctx->frame_type;
376*437bfbebSnyanmisaka
377*437bfbebSnyanmisaka if (!frm_status->reencode && mpp_frame_has_meta(task->frame)) {
378*437bfbebSnyanmisaka MppMeta meta = mpp_frame_get_meta(frame);
379*437bfbebSnyanmisaka
380*437bfbebSnyanmisaka mpp_meta_get_ptr(meta, KEY_ROI_DATA, (void **)&ctx->roi_data);
381*437bfbebSnyanmisaka }
382*437bfbebSnyanmisaka
383*437bfbebSnyanmisaka if (ctx->cfg->jpeg.update) {
384*437bfbebSnyanmisaka hal_jpege_rc_update(&ctx->hal_rc, syntax);
385*437bfbebSnyanmisaka ctx->cfg->jpeg.update = 0;
386*437bfbebSnyanmisaka }
387*437bfbebSnyanmisaka task->rc_task->frm.is_intra = 1;
388*437bfbebSnyanmisaka
389*437bfbebSnyanmisaka hal_jpege_leave();
390*437bfbebSnyanmisaka return MPP_OK;
391*437bfbebSnyanmisaka }
392*437bfbebSnyanmisaka
hal_jpege_v540c_ret_task(void * hal,HalEncTask * task)393*437bfbebSnyanmisaka MPP_RET hal_jpege_v540c_ret_task(void *hal, HalEncTask *task)
394*437bfbebSnyanmisaka {
395*437bfbebSnyanmisaka (void)hal;
396*437bfbebSnyanmisaka EncRcTaskInfo *rc_info = &task->rc_task->info;
397*437bfbebSnyanmisaka hal_jpege_enter();
398*437bfbebSnyanmisaka
399*437bfbebSnyanmisaka task->length += task->hw_length;
400*437bfbebSnyanmisaka
401*437bfbebSnyanmisaka // setup bit length for rate control
402*437bfbebSnyanmisaka rc_info->bit_real = task->hw_length * 8;
403*437bfbebSnyanmisaka rc_info->quality_real = rc_info->quality_target;
404*437bfbebSnyanmisaka
405*437bfbebSnyanmisaka hal_jpege_leave();
406*437bfbebSnyanmisaka return MPP_OK;
407*437bfbebSnyanmisaka }
408*437bfbebSnyanmisaka
409*437bfbebSnyanmisaka const MppEncHalApi hal_jpege_vepu540c = {
410*437bfbebSnyanmisaka "hal_jpege_v540c",
411*437bfbebSnyanmisaka MPP_VIDEO_CodingMJPEG,
412*437bfbebSnyanmisaka sizeof(jpegeV540cHalContext),
413*437bfbebSnyanmisaka 0,
414*437bfbebSnyanmisaka hal_jpege_v540c_init,
415*437bfbebSnyanmisaka hal_jpege_v540c_deinit,
416*437bfbebSnyanmisaka hal_jpege_vepu540c_prepare,
417*437bfbebSnyanmisaka hal_jpege_v540c_get_task,
418*437bfbebSnyanmisaka hal_jpege_v540c_gen_regs,
419*437bfbebSnyanmisaka hal_jpege_v540c_start,
420*437bfbebSnyanmisaka hal_jpege_v540c_wait,
421*437bfbebSnyanmisaka NULL,
422*437bfbebSnyanmisaka NULL,
423*437bfbebSnyanmisaka hal_jpege_v540c_ret_task,
424*437bfbebSnyanmisaka };
425