1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka * Copyright (c) 2024 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka */
5*437bfbebSnyanmisaka
6*437bfbebSnyanmisaka #define MODULE_TAG "hal_jpege_vpu720"
7*437bfbebSnyanmisaka
8*437bfbebSnyanmisaka #include <string.h>
9*437bfbebSnyanmisaka
10*437bfbebSnyanmisaka #include "mpp_mem.h"
11*437bfbebSnyanmisaka #include "mpp_env.h"
12*437bfbebSnyanmisaka #include "mpp_common.h"
13*437bfbebSnyanmisaka #include "mpp_buffer_impl.h"
14*437bfbebSnyanmisaka #include "mpp_enc_hal.h"
15*437bfbebSnyanmisaka
16*437bfbebSnyanmisaka #include "jpege_syntax.h"
17*437bfbebSnyanmisaka #include "hal_jpege_hdr.h"
18*437bfbebSnyanmisaka #include "hal_jpege_debug.h"
19*437bfbebSnyanmisaka #include "hal_jpege_vpu720.h"
20*437bfbebSnyanmisaka #include "hal_jpege_vpu720_reg.h"
21*437bfbebSnyanmisaka
22*437bfbebSnyanmisaka typedef enum JpegeVpu720InFmt_e {
23*437bfbebSnyanmisaka JPEGE_VPU720_IN_FMT_TILE_400,
24*437bfbebSnyanmisaka JPEGE_VPU720_IN_FMT_TILE_420,
25*437bfbebSnyanmisaka JPEGE_VPU720_IN_FMT_TILE_422,
26*437bfbebSnyanmisaka JPEGE_VPU720_IN_FMT_TILE_444,
27*437bfbebSnyanmisaka JPEGE_VPU720_IN_FMT_YUV422SP,
28*437bfbebSnyanmisaka JPEGE_VPU720_IN_FMT_YUV422P,
29*437bfbebSnyanmisaka JPEGE_VPU720_IN_FMT_YUV420SP,
30*437bfbebSnyanmisaka JPEGE_VPU720_IN_FMT_YUV420P,
31*437bfbebSnyanmisaka JPEGE_VPU720_IN_FMT_YUYV,
32*437bfbebSnyanmisaka JPEGE_VPU720_IN_FMT_UYVY,
33*437bfbebSnyanmisaka JPEGE_VPU720_IN_FMT_YUV400,
34*437bfbebSnyanmisaka JPEGE_VPU720_IN_FMT_RESERVED,
35*437bfbebSnyanmisaka JPEGE_VPU720_IN_FMT_YUV444SP,
36*437bfbebSnyanmisaka JPEGE_VPU720_IN_FMT_YUV444P,
37*437bfbebSnyanmisaka } JpegeVpu720InFmt;
38*437bfbebSnyanmisaka
39*437bfbebSnyanmisaka typedef enum JpegeVpu720OutFmt_e {
40*437bfbebSnyanmisaka JPEGE_VPU720_OUT_FMT_400 = 0,
41*437bfbebSnyanmisaka JPEGE_VPU720_OUT_FMT_420 = 1,
42*437bfbebSnyanmisaka JPEGE_VPU720_OUT_FMT_422 = 2,
43*437bfbebSnyanmisaka JPEGE_VPU720_OUT_FMT_444 = 3,
44*437bfbebSnyanmisaka } JpegeVpu720OutFmt;
45*437bfbebSnyanmisaka
46*437bfbebSnyanmisaka typedef enum JpegeVpu720EncCmd_e {
47*437bfbebSnyanmisaka JPEG_VPU720_ENC_MODE_NONE,
48*437bfbebSnyanmisaka JPEG_VPU720_ENC_MODE_ONE_FRAME,
49*437bfbebSnyanmisaka JPEG_VPU720_ENC_MODE_MULTI_FRAME_START,
50*437bfbebSnyanmisaka JPEG_VPU720_ENC_MODE_MULTI_FRAME_UPDATE,
51*437bfbebSnyanmisaka JPEG_VPU720_ENC_MODE_LKT_FORCE_PAUSE,
52*437bfbebSnyanmisaka JPEG_VPU720_ENC_MODE_LKT_CONTINUE,
53*437bfbebSnyanmisaka JPEG_VPU720_ENC_MODE_SAFE_CLR,
54*437bfbebSnyanmisaka JPEG_VPU720_ENC_MODE_FORCE_CLR,
55*437bfbebSnyanmisaka JPEG_VPU720_ENC_MODE_FORCE_BUTT,
56*437bfbebSnyanmisaka } JpegeVpu720EncCmd;
57*437bfbebSnyanmisaka
58*437bfbebSnyanmisaka typedef enum JPEGVpu720ColorRangeTrans_t {
59*437bfbebSnyanmisaka JPEG_VPU720_COLOR_RANGE_FULL_TO_LIMIT,
60*437bfbebSnyanmisaka JPEG_VPU720_COLOR_RANGE_LIMIT_TO_FULL,
61*437bfbebSnyanmisaka } JPEGVpu720ColorRangeTrans;
62*437bfbebSnyanmisaka
63*437bfbebSnyanmisaka typedef enum JPEGVpu720ChromaDownSampleMode_t {
64*437bfbebSnyanmisaka JPEG_VPU720_CHROMA_DOWN_SAMPLE_MODE_Average,
65*437bfbebSnyanmisaka JPEG_VPU720_CHROMA_DOWN_SAMPLE_MODE_Discard,
66*437bfbebSnyanmisaka } JPEGVpu720ChromaDownSampleMode;
67*437bfbebSnyanmisaka
68*437bfbebSnyanmisaka typedef struct JpegeVpu720FmtCfg_t {
69*437bfbebSnyanmisaka JpegeVpu720InFmt input_format;
70*437bfbebSnyanmisaka JpegeVpu720OutFmt out_format;
71*437bfbebSnyanmisaka MppFrameColorRange src_range;
72*437bfbebSnyanmisaka MppFrameColorRange dst_range;
73*437bfbebSnyanmisaka JPEGVpu720ChromaDownSampleMode chroma_ds_mode;
74*437bfbebSnyanmisaka RK_U32 uv_swap;
75*437bfbebSnyanmisaka RK_U32 mirror;
76*437bfbebSnyanmisaka RK_U32 fix_chroma_en;
77*437bfbebSnyanmisaka RK_U32 fix_chroma_u;
78*437bfbebSnyanmisaka RK_U32 fix_chroma_v;
79*437bfbebSnyanmisaka RK_U32 out_nb_comp;
80*437bfbebSnyanmisaka RK_U32 y_stride;
81*437bfbebSnyanmisaka RK_U32 uv_stride;
82*437bfbebSnyanmisaka RK_U32 u_offset;
83*437bfbebSnyanmisaka RK_U32 v_offset;
84*437bfbebSnyanmisaka } JpegeVpu720FmtCfg;
85*437bfbebSnyanmisaka
86*437bfbebSnyanmisaka typedef struct JpegeVpu720HalCtx_t {
87*437bfbebSnyanmisaka MppEncHalApi api;
88*437bfbebSnyanmisaka MppDev dev;
89*437bfbebSnyanmisaka void *regs;
90*437bfbebSnyanmisaka
91*437bfbebSnyanmisaka /* @frame_cnt starts from ZERO */
92*437bfbebSnyanmisaka RK_U32 frame_cnt;
93*437bfbebSnyanmisaka MppEncCfgSet *cfg;
94*437bfbebSnyanmisaka
95*437bfbebSnyanmisaka RK_U32 enc_mode;
96*437bfbebSnyanmisaka RK_U32 frame_size;
97*437bfbebSnyanmisaka RK_S32 max_buf_cnt;
98*437bfbebSnyanmisaka RK_S32 hdr_status;
99*437bfbebSnyanmisaka JpegeVpu720FmtCfg fmt_cfg;
100*437bfbebSnyanmisaka RK_U8 *src_buf;
101*437bfbebSnyanmisaka RK_U8 *dst_buf;
102*437bfbebSnyanmisaka RK_S32 buf_size;
103*437bfbebSnyanmisaka RK_U32 frame_num;
104*437bfbebSnyanmisaka
105*437bfbebSnyanmisaka JpegeBits bits;
106*437bfbebSnyanmisaka JpegeSyntax syntax;
107*437bfbebSnyanmisaka RK_S32 hal_start_pos;
108*437bfbebSnyanmisaka
109*437bfbebSnyanmisaka MppBufferGroup group;
110*437bfbebSnyanmisaka MppBuffer qtbl_buffer;
111*437bfbebSnyanmisaka RK_U16 *qtbl_sw_buf;
112*437bfbebSnyanmisaka HalJpegeRc hal_rc;
113*437bfbebSnyanmisaka } JpegeVpu720HalCtx;
114*437bfbebSnyanmisaka
115*437bfbebSnyanmisaka #define JPEGE_VPU720_QTABLE_SIZE (64 * 3)
116*437bfbebSnyanmisaka
hal_jpege_vpu720_init(void * hal,MppEncHalCfg * cfg)117*437bfbebSnyanmisaka static MPP_RET hal_jpege_vpu720_init(void *hal, MppEncHalCfg *cfg)
118*437bfbebSnyanmisaka {
119*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
120*437bfbebSnyanmisaka JpegeVpu720HalCtx *ctx = (JpegeVpu720HalCtx *)hal;
121*437bfbebSnyanmisaka
122*437bfbebSnyanmisaka mpp_env_get_u32("hal_jpege_debug", &hal_jpege_debug, 0);
123*437bfbebSnyanmisaka
124*437bfbebSnyanmisaka hal_jpege_enter();
125*437bfbebSnyanmisaka
126*437bfbebSnyanmisaka ctx->regs = mpp_calloc(JpegeVpu720Reg, 1);
127*437bfbebSnyanmisaka ctx->cfg = cfg->cfg;
128*437bfbebSnyanmisaka
129*437bfbebSnyanmisaka ctx->frame_cnt = 0;
130*437bfbebSnyanmisaka ctx->enc_mode = JPEG_VPU720_ENC_MODE_ONE_FRAME;
131*437bfbebSnyanmisaka cfg->type = VPU_CLIENT_JPEG_ENC;
132*437bfbebSnyanmisaka ret = mpp_dev_init(&cfg->dev, cfg->type);
133*437bfbebSnyanmisaka if (ret) {
134*437bfbebSnyanmisaka mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
135*437bfbebSnyanmisaka return ret;
136*437bfbebSnyanmisaka }
137*437bfbebSnyanmisaka
138*437bfbebSnyanmisaka ctx->dev = cfg->dev;
139*437bfbebSnyanmisaka jpege_bits_init(&ctx->bits);
140*437bfbebSnyanmisaka mpp_assert(ctx->bits);
141*437bfbebSnyanmisaka if (ctx->group == NULL) {
142*437bfbebSnyanmisaka ret = mpp_buffer_group_get_internal(&ctx->group, MPP_BUFFER_TYPE_ION);
143*437bfbebSnyanmisaka if (ret) {
144*437bfbebSnyanmisaka mpp_err_f("mpp_buffer_group_get failed ret %d\n", ret);
145*437bfbebSnyanmisaka return ret;
146*437bfbebSnyanmisaka }
147*437bfbebSnyanmisaka }
148*437bfbebSnyanmisaka
149*437bfbebSnyanmisaka ret = mpp_buffer_get(ctx->group, &ctx->qtbl_buffer, JPEGE_VPU720_QTABLE_SIZE * sizeof(RK_U16));
150*437bfbebSnyanmisaka mpp_buffer_attach_dev(ctx->qtbl_buffer, ctx->dev);
151*437bfbebSnyanmisaka ctx->qtbl_sw_buf = (RK_U16 *)mpp_calloc(RK_U16, JPEGE_VPU720_QTABLE_SIZE);
152*437bfbebSnyanmisaka hal_jpege_rc_init(&ctx->hal_rc);
153*437bfbebSnyanmisaka
154*437bfbebSnyanmisaka hal_jpege_leave();
155*437bfbebSnyanmisaka return ret;
156*437bfbebSnyanmisaka }
157*437bfbebSnyanmisaka
hal_jpege_vpu720_deinit(void * hal)158*437bfbebSnyanmisaka static MPP_RET hal_jpege_vpu720_deinit(void *hal)
159*437bfbebSnyanmisaka {
160*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
161*437bfbebSnyanmisaka JpegeVpu720HalCtx *ctx = (JpegeVpu720HalCtx *)hal;
162*437bfbebSnyanmisaka
163*437bfbebSnyanmisaka hal_jpege_enter();
164*437bfbebSnyanmisaka jpege_bits_deinit(ctx->bits);
165*437bfbebSnyanmisaka
166*437bfbebSnyanmisaka MPP_FREE(ctx->regs);
167*437bfbebSnyanmisaka MPP_FREE(ctx->qtbl_sw_buf);
168*437bfbebSnyanmisaka
169*437bfbebSnyanmisaka if (ctx->dev) {
170*437bfbebSnyanmisaka mpp_dev_deinit(ctx->dev);
171*437bfbebSnyanmisaka ctx->dev = NULL;
172*437bfbebSnyanmisaka }
173*437bfbebSnyanmisaka
174*437bfbebSnyanmisaka if (ctx->qtbl_buffer) {
175*437bfbebSnyanmisaka ret = mpp_buffer_put(ctx->qtbl_buffer);
176*437bfbebSnyanmisaka if (ret) {
177*437bfbebSnyanmisaka mpp_err_f("put qtbl buffer failed\n");
178*437bfbebSnyanmisaka }
179*437bfbebSnyanmisaka }
180*437bfbebSnyanmisaka
181*437bfbebSnyanmisaka if (ctx->group) {
182*437bfbebSnyanmisaka ret = mpp_buffer_group_put(ctx->group);
183*437bfbebSnyanmisaka if (ret) {
184*437bfbebSnyanmisaka mpp_err_f("group free buffer failed\n");
185*437bfbebSnyanmisaka }
186*437bfbebSnyanmisaka }
187*437bfbebSnyanmisaka
188*437bfbebSnyanmisaka hal_jpege_leave();
189*437bfbebSnyanmisaka return MPP_OK;
190*437bfbebSnyanmisaka }
191*437bfbebSnyanmisaka
jpege_vpu720_setup_format(void * hal,HalEncTask * task)192*437bfbebSnyanmisaka static MPP_RET jpege_vpu720_setup_format(void *hal, HalEncTask *task)
193*437bfbebSnyanmisaka {
194*437bfbebSnyanmisaka JpegeVpu720HalCtx *ctx = (JpegeVpu720HalCtx *) hal;
195*437bfbebSnyanmisaka MppFrameFormat in_fmt = ctx->cfg->prep.format & MPP_FRAME_FMT_MASK;
196*437bfbebSnyanmisaka JpegeVpu720FmtCfg *fmt_cfg = &ctx->fmt_cfg;
197*437bfbebSnyanmisaka JpegeSyntax *syntax = &ctx->syntax;
198*437bfbebSnyanmisaka MppFrameChromaFormat out_fmt = syntax->format_out;
199*437bfbebSnyanmisaka RK_U32 hor_stride = mpp_frame_get_hor_stride(task->frame);
200*437bfbebSnyanmisaka RK_U32 ver_stride = mpp_frame_get_ver_stride(task->frame);
201*437bfbebSnyanmisaka
202*437bfbebSnyanmisaka hal_jpege_enter();
203*437bfbebSnyanmisaka
204*437bfbebSnyanmisaka memset(fmt_cfg, 0, sizeof(JpegeVpu720FmtCfg));
205*437bfbebSnyanmisaka
206*437bfbebSnyanmisaka if (MPP_FRAME_FMT_IS_TILE(ctx->cfg->prep.format)) {
207*437bfbebSnyanmisaka switch (in_fmt) {
208*437bfbebSnyanmisaka case MPP_FMT_YUV400:
209*437bfbebSnyanmisaka fmt_cfg->input_format = JPEGE_VPU720_IN_FMT_TILE_400;
210*437bfbebSnyanmisaka fmt_cfg->y_stride = hor_stride * 4;
211*437bfbebSnyanmisaka fmt_cfg->out_format = JPEGE_VPU720_OUT_FMT_400;
212*437bfbebSnyanmisaka break;
213*437bfbebSnyanmisaka case MPP_FMT_YUV420P:
214*437bfbebSnyanmisaka case MPP_FMT_YUV420SP:
215*437bfbebSnyanmisaka fmt_cfg->input_format = JPEGE_VPU720_IN_FMT_TILE_420;
216*437bfbebSnyanmisaka fmt_cfg->y_stride = hor_stride * 4 * 3 / 2;
217*437bfbebSnyanmisaka break;
218*437bfbebSnyanmisaka case MPP_FMT_YUV422P:
219*437bfbebSnyanmisaka case MPP_FMT_YUV422SP:
220*437bfbebSnyanmisaka fmt_cfg->input_format = JPEGE_VPU720_IN_FMT_TILE_422;
221*437bfbebSnyanmisaka fmt_cfg->y_stride = hor_stride * 4 * 2;
222*437bfbebSnyanmisaka break;
223*437bfbebSnyanmisaka case MPP_FMT_YUV444P:
224*437bfbebSnyanmisaka case MPP_FMT_YUV444SP:
225*437bfbebSnyanmisaka fmt_cfg->input_format = JPEGE_VPU720_IN_FMT_TILE_444;
226*437bfbebSnyanmisaka fmt_cfg->y_stride = hor_stride * 4 * 3;
227*437bfbebSnyanmisaka break;
228*437bfbebSnyanmisaka default:
229*437bfbebSnyanmisaka mpp_err("Unsupported input format 0x%08x, with TILE mask.\n", in_fmt);
230*437bfbebSnyanmisaka return MPP_ERR_VALUE;
231*437bfbebSnyanmisaka break;
232*437bfbebSnyanmisaka }
233*437bfbebSnyanmisaka } else {
234*437bfbebSnyanmisaka switch (in_fmt) {
235*437bfbebSnyanmisaka case MPP_FMT_YUV400:
236*437bfbebSnyanmisaka fmt_cfg->input_format = JPEGE_VPU720_IN_FMT_YUV400;
237*437bfbebSnyanmisaka fmt_cfg->y_stride = hor_stride;
238*437bfbebSnyanmisaka fmt_cfg->out_format = JPEGE_VPU720_OUT_FMT_400;
239*437bfbebSnyanmisaka break;
240*437bfbebSnyanmisaka case MPP_FMT_YUV420P:
241*437bfbebSnyanmisaka fmt_cfg->input_format = JPEGE_VPU720_IN_FMT_YUV420P;
242*437bfbebSnyanmisaka fmt_cfg->y_stride = hor_stride;
243*437bfbebSnyanmisaka fmt_cfg->uv_stride = hor_stride >> 1;
244*437bfbebSnyanmisaka fmt_cfg->u_offset = hor_stride * ver_stride;
245*437bfbebSnyanmisaka fmt_cfg->v_offset = fmt_cfg->u_offset + fmt_cfg->uv_stride * (ver_stride >> 1);
246*437bfbebSnyanmisaka break;
247*437bfbebSnyanmisaka case MPP_FMT_YUV420SP:
248*437bfbebSnyanmisaka fmt_cfg->input_format = JPEGE_VPU720_IN_FMT_YUV420SP;
249*437bfbebSnyanmisaka fmt_cfg->y_stride = hor_stride;
250*437bfbebSnyanmisaka fmt_cfg->uv_stride = hor_stride;
251*437bfbebSnyanmisaka fmt_cfg->u_offset = hor_stride * ver_stride;
252*437bfbebSnyanmisaka break;
253*437bfbebSnyanmisaka case MPP_FMT_YUV420SP_VU:
254*437bfbebSnyanmisaka fmt_cfg->input_format = JPEGE_VPU720_IN_FMT_YUV420SP;
255*437bfbebSnyanmisaka fmt_cfg->y_stride = hor_stride;
256*437bfbebSnyanmisaka fmt_cfg->uv_stride = hor_stride;
257*437bfbebSnyanmisaka fmt_cfg->u_offset = hor_stride * ver_stride;
258*437bfbebSnyanmisaka fmt_cfg->uv_swap = 1;
259*437bfbebSnyanmisaka break;
260*437bfbebSnyanmisaka case MPP_FMT_YUV422P:
261*437bfbebSnyanmisaka fmt_cfg->input_format = JPEGE_VPU720_IN_FMT_YUV422P;
262*437bfbebSnyanmisaka fmt_cfg->y_stride = hor_stride;
263*437bfbebSnyanmisaka fmt_cfg->uv_stride = hor_stride >> 1;
264*437bfbebSnyanmisaka fmt_cfg->u_offset = hor_stride * ver_stride;
265*437bfbebSnyanmisaka fmt_cfg->v_offset = fmt_cfg->u_offset + fmt_cfg->uv_stride * ver_stride;
266*437bfbebSnyanmisaka break;
267*437bfbebSnyanmisaka case MPP_FMT_YUV422SP:
268*437bfbebSnyanmisaka fmt_cfg->input_format = JPEGE_VPU720_IN_FMT_YUV422SP;
269*437bfbebSnyanmisaka fmt_cfg->y_stride = hor_stride;
270*437bfbebSnyanmisaka fmt_cfg->uv_stride = hor_stride;
271*437bfbebSnyanmisaka fmt_cfg->u_offset = hor_stride * ver_stride;
272*437bfbebSnyanmisaka break;
273*437bfbebSnyanmisaka case MPP_FMT_YUV422SP_VU:
274*437bfbebSnyanmisaka fmt_cfg->input_format = JPEGE_VPU720_IN_FMT_YUV422SP;
275*437bfbebSnyanmisaka fmt_cfg->y_stride = hor_stride;
276*437bfbebSnyanmisaka fmt_cfg->uv_stride = hor_stride;
277*437bfbebSnyanmisaka fmt_cfg->u_offset = hor_stride * ver_stride;
278*437bfbebSnyanmisaka fmt_cfg->uv_swap = 1;
279*437bfbebSnyanmisaka break;
280*437bfbebSnyanmisaka case MPP_FMT_YUV422_YUYV:
281*437bfbebSnyanmisaka fmt_cfg->input_format = JPEGE_VPU720_IN_FMT_YUYV;
282*437bfbebSnyanmisaka fmt_cfg->y_stride = hor_stride;
283*437bfbebSnyanmisaka break;
284*437bfbebSnyanmisaka case MPP_FMT_YUV422_UYVY:
285*437bfbebSnyanmisaka fmt_cfg->input_format = JPEGE_VPU720_IN_FMT_UYVY;
286*437bfbebSnyanmisaka fmt_cfg->y_stride = hor_stride;
287*437bfbebSnyanmisaka break;
288*437bfbebSnyanmisaka case MPP_FMT_YUV422_YVYU:
289*437bfbebSnyanmisaka fmt_cfg->input_format = JPEGE_VPU720_IN_FMT_YUYV;
290*437bfbebSnyanmisaka fmt_cfg->y_stride = hor_stride;
291*437bfbebSnyanmisaka fmt_cfg->uv_swap = 1;
292*437bfbebSnyanmisaka break;
293*437bfbebSnyanmisaka case MPP_FMT_YUV422_VYUY:
294*437bfbebSnyanmisaka fmt_cfg->input_format = JPEGE_VPU720_IN_FMT_UYVY;
295*437bfbebSnyanmisaka fmt_cfg->y_stride = hor_stride;
296*437bfbebSnyanmisaka fmt_cfg->uv_swap = 1;
297*437bfbebSnyanmisaka break;
298*437bfbebSnyanmisaka case MPP_FMT_YUV444SP:
299*437bfbebSnyanmisaka fmt_cfg->input_format = JPEGE_VPU720_IN_FMT_YUV444SP;
300*437bfbebSnyanmisaka fmt_cfg->y_stride = hor_stride;
301*437bfbebSnyanmisaka fmt_cfg->uv_stride = hor_stride << 1;
302*437bfbebSnyanmisaka fmt_cfg->u_offset = hor_stride * ver_stride;
303*437bfbebSnyanmisaka break;
304*437bfbebSnyanmisaka case MPP_FMT_YUV444P:
305*437bfbebSnyanmisaka fmt_cfg->input_format = JPEGE_VPU720_IN_FMT_YUV444P;
306*437bfbebSnyanmisaka fmt_cfg->y_stride = hor_stride;
307*437bfbebSnyanmisaka fmt_cfg->uv_stride = hor_stride;
308*437bfbebSnyanmisaka fmt_cfg->u_offset = hor_stride * ver_stride;
309*437bfbebSnyanmisaka fmt_cfg->v_offset = fmt_cfg->u_offset << 1;
310*437bfbebSnyanmisaka break;
311*437bfbebSnyanmisaka default :
312*437bfbebSnyanmisaka mpp_err("Unsupported input format 0x%08x\n", in_fmt);
313*437bfbebSnyanmisaka return MPP_ERR_VALUE;
314*437bfbebSnyanmisaka break;
315*437bfbebSnyanmisaka }
316*437bfbebSnyanmisaka }
317*437bfbebSnyanmisaka
318*437bfbebSnyanmisaka switch (out_fmt) {
319*437bfbebSnyanmisaka case MPP_CHROMA_400:
320*437bfbebSnyanmisaka ctx->fmt_cfg.out_format = JPEGE_VPU720_OUT_FMT_400;
321*437bfbebSnyanmisaka break;
322*437bfbebSnyanmisaka case MPP_CHROMA_420:
323*437bfbebSnyanmisaka ctx->fmt_cfg.out_format = JPEGE_VPU720_OUT_FMT_420;
324*437bfbebSnyanmisaka break;
325*437bfbebSnyanmisaka case MPP_CHROMA_422:
326*437bfbebSnyanmisaka ctx->fmt_cfg.out_format = JPEGE_VPU720_OUT_FMT_422;
327*437bfbebSnyanmisaka break;
328*437bfbebSnyanmisaka case MPP_CHROMA_444:
329*437bfbebSnyanmisaka ctx->fmt_cfg.out_format = JPEGE_VPU720_OUT_FMT_444;
330*437bfbebSnyanmisaka break;
331*437bfbebSnyanmisaka default:
332*437bfbebSnyanmisaka ctx->fmt_cfg.out_format = JPEGE_VPU720_OUT_FMT_420;
333*437bfbebSnyanmisaka break;
334*437bfbebSnyanmisaka }
335*437bfbebSnyanmisaka ctx->fmt_cfg.out_nb_comp = ctx->syntax.nb_components;
336*437bfbebSnyanmisaka
337*437bfbebSnyanmisaka switch (ctx->cfg->prep.chroma_ds_mode) {
338*437bfbebSnyanmisaka case MPP_FRAME_CHORMA_DOWN_SAMPLE_MODE_AVERAGE:
339*437bfbebSnyanmisaka ctx->fmt_cfg.chroma_ds_mode = JPEG_VPU720_CHROMA_DOWN_SAMPLE_MODE_Average;
340*437bfbebSnyanmisaka break;
341*437bfbebSnyanmisaka case MPP_FRAME_CHORMA_DOWN_SAMPLE_MODE_DISCARD:
342*437bfbebSnyanmisaka ctx->fmt_cfg.chroma_ds_mode = JPEG_VPU720_CHROMA_DOWN_SAMPLE_MODE_Discard;
343*437bfbebSnyanmisaka break;
344*437bfbebSnyanmisaka default:
345*437bfbebSnyanmisaka ctx->fmt_cfg.chroma_ds_mode = JPEG_VPU720_CHROMA_DOWN_SAMPLE_MODE_Average;
346*437bfbebSnyanmisaka break;
347*437bfbebSnyanmisaka }
348*437bfbebSnyanmisaka
349*437bfbebSnyanmisaka hal_jpege_dbg_detail("JPEG format: in 0x%x out 0x%x, hw in_fmt %d, out_fmt %d, ds_mode %d\n",
350*437bfbebSnyanmisaka ctx->cfg->prep.format, ctx->cfg->prep.format_out,
351*437bfbebSnyanmisaka ctx->fmt_cfg.input_format, ctx->fmt_cfg.out_format,
352*437bfbebSnyanmisaka ctx->fmt_cfg.chroma_ds_mode);
353*437bfbebSnyanmisaka
354*437bfbebSnyanmisaka if (ctx->cfg->prep.mirroring)
355*437bfbebSnyanmisaka ctx->fmt_cfg.mirror = 1;
356*437bfbebSnyanmisaka
357*437bfbebSnyanmisaka if (ctx->cfg->prep.fix_chroma_en) {
358*437bfbebSnyanmisaka ctx->fmt_cfg.fix_chroma_en = 1;
359*437bfbebSnyanmisaka ctx->fmt_cfg.fix_chroma_u = ctx->cfg->prep.fix_chroma_u & 0xff;
360*437bfbebSnyanmisaka ctx->fmt_cfg.fix_chroma_v = ctx->cfg->prep.fix_chroma_v & 0xff;
361*437bfbebSnyanmisaka }
362*437bfbebSnyanmisaka
363*437bfbebSnyanmisaka ctx->fmt_cfg.src_range = (ctx->cfg->prep.range == MPP_FRAME_RANGE_UNSPECIFIED) ?
364*437bfbebSnyanmisaka MPP_FRAME_RANGE_JPEG : ctx->cfg->prep.range;
365*437bfbebSnyanmisaka ctx->fmt_cfg.dst_range = (ctx->cfg->prep.range_out == MPP_FRAME_RANGE_UNSPECIFIED) ?
366*437bfbebSnyanmisaka MPP_FRAME_RANGE_JPEG : ctx->cfg->prep.range_out;
367*437bfbebSnyanmisaka hal_jpege_leave();
368*437bfbebSnyanmisaka return MPP_OK;
369*437bfbebSnyanmisaka }
370*437bfbebSnyanmisaka
hal_jpege_vpu720_gen_regs(void * hal,HalEncTask * task)371*437bfbebSnyanmisaka MPP_RET hal_jpege_vpu720_gen_regs(void *hal, HalEncTask *task)
372*437bfbebSnyanmisaka {
373*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
374*437bfbebSnyanmisaka JpegeVpu720HalCtx *ctx = (JpegeVpu720HalCtx *) hal;
375*437bfbebSnyanmisaka JpegeVpu720Reg *regs = ctx->regs;
376*437bfbebSnyanmisaka JpegeVpu720BaseReg *reg_base = ®s->reg_base;
377*437bfbebSnyanmisaka JpegeBits bits = ctx->bits;
378*437bfbebSnyanmisaka size_t length = mpp_packet_get_length(task->packet);
379*437bfbebSnyanmisaka RK_U8 *buf = mpp_buffer_get_ptr(task->output);
380*437bfbebSnyanmisaka size_t size = mpp_buffer_get_size(task->output);
381*437bfbebSnyanmisaka JpegeSyntax *syntax = &ctx->syntax;
382*437bfbebSnyanmisaka RK_U8 *qtbl_base = (RK_U8 *)mpp_buffer_get_ptr(ctx->qtbl_buffer);
383*437bfbebSnyanmisaka RK_S32 bitpos;
384*437bfbebSnyanmisaka RK_U32 i, j;
385*437bfbebSnyanmisaka RK_U32 encode_width;
386*437bfbebSnyanmisaka RK_U32 encode_height;
387*437bfbebSnyanmisaka
388*437bfbebSnyanmisaka hal_jpege_enter();
389*437bfbebSnyanmisaka
390*437bfbebSnyanmisaka jpege_vpu720_setup_format(hal, task);
391*437bfbebSnyanmisaka
392*437bfbebSnyanmisaka memset(regs, 0, sizeof(JpegeVpu720Reg));
393*437bfbebSnyanmisaka
394*437bfbebSnyanmisaka mpp_buffer_sync_begin(task->output);
395*437bfbebSnyanmisaka
396*437bfbebSnyanmisaka if (syntax->q_mode == JPEG_QFACTOR) {
397*437bfbebSnyanmisaka syntax->q_factor = 100 - task->rc_task->info.quality_target;
398*437bfbebSnyanmisaka hal_jpege_rc_update(&ctx->hal_rc, syntax);
399*437bfbebSnyanmisaka }
400*437bfbebSnyanmisaka
401*437bfbebSnyanmisaka jpege_bits_setup(bits, buf, (RK_U32)size);
402*437bfbebSnyanmisaka jpege_seek_bits(bits, length << 3);
403*437bfbebSnyanmisaka write_jpeg_header(bits, syntax, &ctx->hal_rc);
404*437bfbebSnyanmisaka mpp_buffer_sync_end(task->output);
405*437bfbebSnyanmisaka
406*437bfbebSnyanmisaka bitpos = jpege_bits_get_bitpos(bits);
407*437bfbebSnyanmisaka task->length = (bitpos + 7) >> 3;
408*437bfbebSnyanmisaka
409*437bfbebSnyanmisaka mpp_packet_set_length(task->packet, task->length);
410*437bfbebSnyanmisaka
411*437bfbebSnyanmisaka reg_base->reg001_enc_strt.lkt_num = 0;
412*437bfbebSnyanmisaka reg_base->reg001_enc_strt.vepu_cmd = ctx->enc_mode;
413*437bfbebSnyanmisaka
414*437bfbebSnyanmisaka // interupt
415*437bfbebSnyanmisaka reg_base->reg004_int_en.fenc_done_en = 1;
416*437bfbebSnyanmisaka reg_base->reg004_int_en.lkt_node_done_en = 1;
417*437bfbebSnyanmisaka reg_base->reg004_int_en.sclr_done_en = 1;
418*437bfbebSnyanmisaka reg_base->reg004_int_en.vslc_done_en = 1;
419*437bfbebSnyanmisaka reg_base->reg004_int_en.vbsb_oflw_en = 1;
420*437bfbebSnyanmisaka reg_base->reg004_int_en.vbsb_sct_en = 1;
421*437bfbebSnyanmisaka reg_base->reg004_int_en.fenc_err_en = 1;
422*437bfbebSnyanmisaka reg_base->reg004_int_en.wdg_en = 1;
423*437bfbebSnyanmisaka reg_base->reg004_int_en.lkt_oerr_en = 1;
424*437bfbebSnyanmisaka reg_base->reg004_int_en.lkt_estp_en = 1;
425*437bfbebSnyanmisaka reg_base->reg004_int_en.lkt_fstp_en = 1;
426*437bfbebSnyanmisaka reg_base->reg004_int_en.lkt_note_stp_en = 1;
427*437bfbebSnyanmisaka reg_base->reg004_int_en.lkt_data_error_en = 1;
428*437bfbebSnyanmisaka
429*437bfbebSnyanmisaka reg_base->reg005_int_msk.fenc_done_msk = 1;
430*437bfbebSnyanmisaka reg_base->reg005_int_msk.lkt_node_done_msk = 1;
431*437bfbebSnyanmisaka reg_base->reg005_int_msk.sclr_done_msk = 1;
432*437bfbebSnyanmisaka reg_base->reg005_int_msk.vslc_done_msk = 1;
433*437bfbebSnyanmisaka reg_base->reg005_int_msk.vbsb_oflw_msk = 1;
434*437bfbebSnyanmisaka reg_base->reg005_int_msk.vbsb_sct_msk = 1;
435*437bfbebSnyanmisaka reg_base->reg005_int_msk.fenc_err_msk = 1;
436*437bfbebSnyanmisaka reg_base->reg005_int_msk.wdg_msk = 1;
437*437bfbebSnyanmisaka reg_base->reg005_int_msk.lkt_oerr_msk = 1;
438*437bfbebSnyanmisaka reg_base->reg005_int_msk.lkt_estp_msk = 1;
439*437bfbebSnyanmisaka reg_base->reg005_int_msk.lkt_fstp_msk = 1;
440*437bfbebSnyanmisaka reg_base->reg005_int_msk.lkt_note_stp_msk = 1;
441*437bfbebSnyanmisaka reg_base->reg005_int_msk.lkt_data_error_msk = 1;
442*437bfbebSnyanmisaka
443*437bfbebSnyanmisaka reg_base->reg008_cru_ctrl.resetn_hw_en = 1;
444*437bfbebSnyanmisaka reg_base->reg008_cru_ctrl.sram_ckg_en = 1;
445*437bfbebSnyanmisaka reg_base->reg008_cru_ctrl.cke = 1;
446*437bfbebSnyanmisaka
447*437bfbebSnyanmisaka reg_base->reg042_dbus_endn.jbsw_bus_edin = 0xf;
448*437bfbebSnyanmisaka reg_base->reg042_dbus_endn.vsl_bus_edin = 0;
449*437bfbebSnyanmisaka reg_base->reg042_dbus_endn.ecs_len_edin = 0xf;
450*437bfbebSnyanmisaka reg_base->reg042_dbus_endn.sw_qtbl_edin = 0;
451*437bfbebSnyanmisaka
452*437bfbebSnyanmisaka reg_base->reg011_wdg_jpeg = syntax->mcu_cnt * 1000;
453*437bfbebSnyanmisaka
454*437bfbebSnyanmisaka reg_base->reg026_axi_perf_ctrl0.perf_work_e = 1;
455*437bfbebSnyanmisaka reg_base->reg026_axi_perf_ctrl0.perf_clr_e = 1;
456*437bfbebSnyanmisaka
457*437bfbebSnyanmisaka for (i = 0; i < 8; i++) {
458*437bfbebSnyanmisaka for (j = 0; j < 8; j++) {
459*437bfbebSnyanmisaka ctx->qtbl_sw_buf[i * 8 + j] = 0x8000 / ctx->hal_rc.qtables[0][j * 8 + i];
460*437bfbebSnyanmisaka ctx->qtbl_sw_buf[64 + i * 8 + j] = 0x8000 / ctx->hal_rc.qtables[1][j * 8 + i];
461*437bfbebSnyanmisaka }
462*437bfbebSnyanmisaka }
463*437bfbebSnyanmisaka
464*437bfbebSnyanmisaka memcpy(&ctx->qtbl_sw_buf[64 * 2], &ctx->qtbl_sw_buf[64], sizeof(RK_U16) * 64);
465*437bfbebSnyanmisaka
466*437bfbebSnyanmisaka encode_width = MPP_ALIGN(syntax->width, syntax->mcu_width);
467*437bfbebSnyanmisaka encode_height = MPP_ALIGN(syntax->height, syntax->mcu_height);
468*437bfbebSnyanmisaka reg_base->reg029_sw_enc_rsl.pic_wd8_m1 = encode_width / 8 - 1;
469*437bfbebSnyanmisaka reg_base->reg029_sw_enc_rsl.pic_hd8_m1 = encode_height / 8 - 1;
470*437bfbebSnyanmisaka reg_base->reg030_sw_src_fill.pic_wfill_jpeg = encode_width - syntax->width;
471*437bfbebSnyanmisaka reg_base->reg030_sw_src_fill.pic_hfill_jpeg = encode_height - syntax->height;
472*437bfbebSnyanmisaka
473*437bfbebSnyanmisaka reg_base->reg032_sw_src_fmt.src_fmt = ctx->fmt_cfg.input_format;
474*437bfbebSnyanmisaka reg_base->reg032_sw_src_fmt.out_fmt = ctx->fmt_cfg.out_format;
475*437bfbebSnyanmisaka reg_base->reg032_sw_src_fmt.rbuv_swap_jpeg = ctx->fmt_cfg.uv_swap;
476*437bfbebSnyanmisaka reg_base->reg032_sw_src_fmt.chroma_ds_mode = ctx->fmt_cfg.chroma_ds_mode;
477*437bfbebSnyanmisaka reg_base->reg032_sw_src_fmt.src_mirr_jpeg = ctx->fmt_cfg.mirror;
478*437bfbebSnyanmisaka reg_base->reg032_sw_src_fmt.chroma_force_en = ctx->fmt_cfg.fix_chroma_en;
479*437bfbebSnyanmisaka reg_base->reg032_sw_src_fmt.u_force_value = ctx->fmt_cfg.fix_chroma_u;
480*437bfbebSnyanmisaka reg_base->reg032_sw_src_fmt.v_force_value = ctx->fmt_cfg.fix_chroma_v;
481*437bfbebSnyanmisaka
482*437bfbebSnyanmisaka if (ctx->fmt_cfg.src_range != ctx->fmt_cfg.dst_range) {
483*437bfbebSnyanmisaka reg_base->reg032_sw_src_fmt.src_range_trns_en = 1;
484*437bfbebSnyanmisaka if (ctx->fmt_cfg.src_range == MPP_FRAME_RANGE_MPEG)
485*437bfbebSnyanmisaka reg_base->reg032_sw_src_fmt.src_range_trns_sel = JPEG_VPU720_COLOR_RANGE_LIMIT_TO_FULL;
486*437bfbebSnyanmisaka else
487*437bfbebSnyanmisaka reg_base->reg032_sw_src_fmt.src_range_trns_sel = JPEG_VPU720_COLOR_RANGE_FULL_TO_LIMIT;
488*437bfbebSnyanmisaka }
489*437bfbebSnyanmisaka
490*437bfbebSnyanmisaka reg_base->reg033_sw_pic_ofst.pic_ofst_x = mpp_frame_get_offset_x(task->frame);
491*437bfbebSnyanmisaka reg_base->reg033_sw_pic_ofst.pic_ofst_y = mpp_frame_get_offset_y(task->frame);
492*437bfbebSnyanmisaka
493*437bfbebSnyanmisaka reg_base->reg034_sw_src_strd_0.src_strd_0 = ctx->fmt_cfg.y_stride;
494*437bfbebSnyanmisaka reg_base->reg035_sw_src_strd_1.src_strd_1 = ctx->fmt_cfg.uv_stride;
495*437bfbebSnyanmisaka
496*437bfbebSnyanmisaka reg_base->reg036_sw_jpeg_enc_cfg.rst_intv = syntax->restart_ri;
497*437bfbebSnyanmisaka reg_base->reg036_sw_jpeg_enc_cfg.rst_m = 0;
498*437bfbebSnyanmisaka reg_base->reg036_sw_jpeg_enc_cfg.pic_last_ecs = 1;
499*437bfbebSnyanmisaka
500*437bfbebSnyanmisaka reg_base->reg022_adr_src0 = mpp_buffer_get_fd(task->input);
501*437bfbebSnyanmisaka reg_base->reg023_adr_src1 = reg_base->reg022_adr_src0;
502*437bfbebSnyanmisaka reg_base->reg024_adr_src2 = reg_base->reg022_adr_src0;
503*437bfbebSnyanmisaka
504*437bfbebSnyanmisaka reg_base->reg017_adr_bsbt = mpp_buffer_get_fd(task->output);
505*437bfbebSnyanmisaka reg_base->reg018_adr_bsbb = reg_base->reg017_adr_bsbt;
506*437bfbebSnyanmisaka reg_base->reg019_adr_bsbr = reg_base->reg017_adr_bsbt;
507*437bfbebSnyanmisaka reg_base->reg020_adr_bsbs = reg_base->reg017_adr_bsbt;
508*437bfbebSnyanmisaka
509*437bfbebSnyanmisaka reg_base->reg016_adr_qtbl = mpp_buffer_get_fd(ctx->qtbl_buffer);
510*437bfbebSnyanmisaka memcpy(qtbl_base, ctx->qtbl_sw_buf, JPEGE_VPU720_QTABLE_SIZE * sizeof(RK_U16));
511*437bfbebSnyanmisaka mpp_buffer_sync_end(ctx->qtbl_buffer);
512*437bfbebSnyanmisaka
513*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 20, mpp_packet_get_length(task->packet));
514*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 17, mpp_buffer_get_size(task->output));
515*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 23, ctx->fmt_cfg.u_offset);
516*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 24, ctx->fmt_cfg.v_offset);
517*437bfbebSnyanmisaka
518*437bfbebSnyanmisaka ctx->frame_num++;
519*437bfbebSnyanmisaka
520*437bfbebSnyanmisaka hal_jpege_leave();
521*437bfbebSnyanmisaka return ret;
522*437bfbebSnyanmisaka }
523*437bfbebSnyanmisaka
hal_jpege_vpu720_start(void * hal,HalEncTask * task)524*437bfbebSnyanmisaka MPP_RET hal_jpege_vpu720_start(void *hal, HalEncTask *task)
525*437bfbebSnyanmisaka {
526*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
527*437bfbebSnyanmisaka JpegeVpu720HalCtx *ctx = (JpegeVpu720HalCtx *) hal;
528*437bfbebSnyanmisaka JpegeVpu720Reg *regs = ctx->regs;
529*437bfbebSnyanmisaka MppDevRegWrCfg cfg_base;
530*437bfbebSnyanmisaka MppDevRegRdCfg cfg_st;
531*437bfbebSnyanmisaka
532*437bfbebSnyanmisaka hal_jpege_enter();
533*437bfbebSnyanmisaka
534*437bfbebSnyanmisaka if (task->flags.err) {
535*437bfbebSnyanmisaka mpp_err_f("task->flags.err 0x%08x, return early\n", task->flags.err);
536*437bfbebSnyanmisaka return MPP_NOK;
537*437bfbebSnyanmisaka }
538*437bfbebSnyanmisaka
539*437bfbebSnyanmisaka if (hal_jpege_debug & HAL_JPEGE_DBG_DETAIL) {
540*437bfbebSnyanmisaka RK_U32 i = 0;
541*437bfbebSnyanmisaka RK_U32 *reg = (RK_U32 *)regs;
542*437bfbebSnyanmisaka
543*437bfbebSnyanmisaka for (i = 0; i < 43; i++) {
544*437bfbebSnyanmisaka mpp_log_f("set reg[%03d] : %04x : 0x%08x\n", i, i * 4, reg[i]);
545*437bfbebSnyanmisaka }
546*437bfbebSnyanmisaka }
547*437bfbebSnyanmisaka
548*437bfbebSnyanmisaka cfg_base.reg = ®s->reg_base;
549*437bfbebSnyanmisaka cfg_base.size = sizeof(JpegeVpu720BaseReg);
550*437bfbebSnyanmisaka cfg_base.offset = 0;
551*437bfbebSnyanmisaka
552*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg_base);
553*437bfbebSnyanmisaka if (ret) {
554*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
555*437bfbebSnyanmisaka return ret;
556*437bfbebSnyanmisaka }
557*437bfbebSnyanmisaka
558*437bfbebSnyanmisaka cfg_st.reg = ®s->int_state;
559*437bfbebSnyanmisaka cfg_st.size = sizeof(RK_U32);
560*437bfbebSnyanmisaka cfg_st.offset = JPEGE_VPU720_REG_BASE_INT_STATE;
561*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg_st);
562*437bfbebSnyanmisaka if (ret) {
563*437bfbebSnyanmisaka mpp_err_f("set register to read int state failed %d\n", ret);
564*437bfbebSnyanmisaka }
565*437bfbebSnyanmisaka cfg_st.reg = ®s->reg_st;
566*437bfbebSnyanmisaka cfg_st.size = sizeof(JpegeVpu720StatusReg);
567*437bfbebSnyanmisaka cfg_st.offset = JPEGE_VPU720_REG_STATUS_OFFSET;
568*437bfbebSnyanmisaka
569*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg_st);
570*437bfbebSnyanmisaka
571*437bfbebSnyanmisaka if (ret) {
572*437bfbebSnyanmisaka mpp_err_f("set register to read hw status failed %d\n", ret);
573*437bfbebSnyanmisaka }
574*437bfbebSnyanmisaka
575*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
576*437bfbebSnyanmisaka if (ret) {
577*437bfbebSnyanmisaka mpp_err_f("send cmd failed %d\n", ret);
578*437bfbebSnyanmisaka }
579*437bfbebSnyanmisaka
580*437bfbebSnyanmisaka hal_jpege_leave();
581*437bfbebSnyanmisaka return MPP_OK;
582*437bfbebSnyanmisaka }
583*437bfbebSnyanmisaka
hal_jpege_vpu720_wait(void * hal,HalEncTask * task)584*437bfbebSnyanmisaka MPP_RET hal_jpege_vpu720_wait(void *hal, HalEncTask *task)
585*437bfbebSnyanmisaka {
586*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
587*437bfbebSnyanmisaka JpegeVpu720HalCtx *ctx = (JpegeVpu720HalCtx *) hal;
588*437bfbebSnyanmisaka JpegeVpu720Reg *regs = (JpegeVpu720Reg *)ctx->regs;
589*437bfbebSnyanmisaka JpegeVpu720StatusReg *reg_st = ®s->reg_st;
590*437bfbebSnyanmisaka RK_U32 int_state = regs->int_state;
591*437bfbebSnyanmisaka
592*437bfbebSnyanmisaka hal_jpege_enter();
593*437bfbebSnyanmisaka
594*437bfbebSnyanmisaka if (task->flags.err) {
595*437bfbebSnyanmisaka mpp_err_f("task->flags.err 0x%08x, return earyl\n", task->flags.err);
596*437bfbebSnyanmisaka return ret = MPP_NOK;
597*437bfbebSnyanmisaka }
598*437bfbebSnyanmisaka
599*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
600*437bfbebSnyanmisaka if (ret) {
601*437bfbebSnyanmisaka mpp_err_f("poll cmd failed %d\n", ret);
602*437bfbebSnyanmisaka return ret = MPP_ERR_VPUHW;
603*437bfbebSnyanmisaka } else {
604*437bfbebSnyanmisaka if (int_state & 0x170)
605*437bfbebSnyanmisaka mpp_err_f("JPEG encoder hw error 0x%08x\n", int_state);
606*437bfbebSnyanmisaka else
607*437bfbebSnyanmisaka hal_jpege_dbg_simple("JPEG encoder int state 0x%08x\n", int_state);
608*437bfbebSnyanmisaka
609*437bfbebSnyanmisaka hal_jpege_dbg_detail("hw length %d, cycle %d\n",
610*437bfbebSnyanmisaka reg_st->st_bsl_l32_jpeg_head_bits,
611*437bfbebSnyanmisaka reg_st->st_perf_working_cnt);
612*437bfbebSnyanmisaka task->hw_length += reg_st->st_bsl_l32_jpeg_head_bits;
613*437bfbebSnyanmisaka }
614*437bfbebSnyanmisaka
615*437bfbebSnyanmisaka hal_jpege_leave();
616*437bfbebSnyanmisaka return MPP_OK;
617*437bfbebSnyanmisaka }
618*437bfbebSnyanmisaka
hal_jpege_vpu720_get_task(void * hal,HalEncTask * task)619*437bfbebSnyanmisaka MPP_RET hal_jpege_vpu720_get_task(void *hal, HalEncTask *task)
620*437bfbebSnyanmisaka {
621*437bfbebSnyanmisaka JpegeVpu720HalCtx *ctx = (JpegeVpu720HalCtx *) hal;
622*437bfbebSnyanmisaka JpegeSyntax *syntax = (JpegeSyntax *) task->syntax.data;
623*437bfbebSnyanmisaka
624*437bfbebSnyanmisaka hal_jpege_enter();
625*437bfbebSnyanmisaka memcpy(&ctx->syntax, syntax, sizeof(ctx->syntax));
626*437bfbebSnyanmisaka
627*437bfbebSnyanmisaka if (ctx->cfg->jpeg.update) {
628*437bfbebSnyanmisaka hal_jpege_rc_update(&ctx->hal_rc, syntax);
629*437bfbebSnyanmisaka ctx->cfg->jpeg.update = 0;
630*437bfbebSnyanmisaka }
631*437bfbebSnyanmisaka
632*437bfbebSnyanmisaka task->rc_task->frm.is_intra = 1;
633*437bfbebSnyanmisaka
634*437bfbebSnyanmisaka // TODO config rc
635*437bfbebSnyanmisaka hal_jpege_leave();
636*437bfbebSnyanmisaka return MPP_OK;
637*437bfbebSnyanmisaka }
638*437bfbebSnyanmisaka
hal_jpege_vpu720_ret_task(void * hal,HalEncTask * task)639*437bfbebSnyanmisaka MPP_RET hal_jpege_vpu720_ret_task(void *hal, HalEncTask *task)
640*437bfbebSnyanmisaka {
641*437bfbebSnyanmisaka (void)hal;
642*437bfbebSnyanmisaka EncRcTaskInfo * rc_info = &task->rc_task->info;
643*437bfbebSnyanmisaka
644*437bfbebSnyanmisaka hal_jpege_enter();
645*437bfbebSnyanmisaka
646*437bfbebSnyanmisaka task->length += task->hw_length;
647*437bfbebSnyanmisaka
648*437bfbebSnyanmisaka // setup bit length for rate control
649*437bfbebSnyanmisaka rc_info->bit_real = task->hw_length * 8;
650*437bfbebSnyanmisaka rc_info->quality_real = rc_info->quality_target;
651*437bfbebSnyanmisaka mpp_buffer_sync_ro_begin(task->output);
652*437bfbebSnyanmisaka
653*437bfbebSnyanmisaka hal_jpege_leave();
654*437bfbebSnyanmisaka return MPP_OK;
655*437bfbebSnyanmisaka }
656*437bfbebSnyanmisaka const MppEncHalApi hal_jpege_vpu720 = {
657*437bfbebSnyanmisaka .name = "hal_jpege_vpu720",
658*437bfbebSnyanmisaka .coding = MPP_VIDEO_CodingMJPEG,
659*437bfbebSnyanmisaka .ctx_size = sizeof(JpegeVpu720HalCtx),
660*437bfbebSnyanmisaka .flag = 0,
661*437bfbebSnyanmisaka .init = hal_jpege_vpu720_init,
662*437bfbebSnyanmisaka .deinit = hal_jpege_vpu720_deinit,
663*437bfbebSnyanmisaka .prepare = NULL,
664*437bfbebSnyanmisaka .get_task = hal_jpege_vpu720_get_task,
665*437bfbebSnyanmisaka .gen_regs = hal_jpege_vpu720_gen_regs,
666*437bfbebSnyanmisaka .start = hal_jpege_vpu720_start,
667*437bfbebSnyanmisaka .wait = hal_jpege_vpu720_wait,
668*437bfbebSnyanmisaka .part_start = NULL,
669*437bfbebSnyanmisaka .part_wait = NULL,
670*437bfbebSnyanmisaka .ret_task = hal_jpege_vpu720_ret_task,
671*437bfbebSnyanmisaka };
672