xref: /rockchip-linux_mpp/mpp/hal/rkenc/jpege/hal_jpege_vpu720.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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 = &regs->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 = &regs->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 = &regs->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 = &regs->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 = &regs->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