xref: /rockchip-linux_mpp/mpp/hal/rkenc/h264e/hal_h264e_vepu540c.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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_h264e_vepu540c"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include "mpp_env.h"
22*437bfbebSnyanmisaka #include "mpp_mem.h"
23*437bfbebSnyanmisaka #include "mpp_common.h"
24*437bfbebSnyanmisaka #include "mpp_frame_impl.h"
25*437bfbebSnyanmisaka #include "mpp_rc.h"
26*437bfbebSnyanmisaka #include "mpp_packet_impl.h"
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka #include "h264e_sps.h"
29*437bfbebSnyanmisaka #include "h264e_pps.h"
30*437bfbebSnyanmisaka #include "h264e_slice.h"
31*437bfbebSnyanmisaka 
32*437bfbebSnyanmisaka #include "hal_h264e_debug.h"
33*437bfbebSnyanmisaka #include "hal_bufs.h"
34*437bfbebSnyanmisaka #include "mpp_enc_hal.h"
35*437bfbebSnyanmisaka #include "vepu5xx_common.h"
36*437bfbebSnyanmisaka #include "vepu540c_common.h"
37*437bfbebSnyanmisaka 
38*437bfbebSnyanmisaka #include "hal_h264e_vepu540c_reg.h"
39*437bfbebSnyanmisaka #include "hal_h264e_stream_amend.h"
40*437bfbebSnyanmisaka 
41*437bfbebSnyanmisaka #define DUMP_REG 0
42*437bfbebSnyanmisaka #define MAX_CORE_NUM 2
43*437bfbebSnyanmisaka 
44*437bfbebSnyanmisaka typedef struct vepu540c_h264e_reg_ctx_t {
45*437bfbebSnyanmisaka     void                    *reg;
46*437bfbebSnyanmisaka     RK_U32                  used;
47*437bfbebSnyanmisaka } Vepu540cH264eRegCtx;
48*437bfbebSnyanmisaka 
49*437bfbebSnyanmisaka typedef struct HalH264eVepu540cCtx_t {
50*437bfbebSnyanmisaka     MppEncCfgSet            *cfg;
51*437bfbebSnyanmisaka 
52*437bfbebSnyanmisaka     MppDev                  dev;
53*437bfbebSnyanmisaka     RK_S32                  frame_cnt;
54*437bfbebSnyanmisaka 
55*437bfbebSnyanmisaka     /* buffers management */
56*437bfbebSnyanmisaka     HalBufs                 hw_recn;
57*437bfbebSnyanmisaka     RK_S32                  pixel_buf_fbc_hdr_size;
58*437bfbebSnyanmisaka     RK_S32                  pixel_buf_fbc_bdy_size;
59*437bfbebSnyanmisaka     RK_S32                  pixel_buf_size;
60*437bfbebSnyanmisaka     RK_S32                  thumb_buf_size;
61*437bfbebSnyanmisaka     RK_S32                  max_buf_cnt;
62*437bfbebSnyanmisaka 
63*437bfbebSnyanmisaka     /* syntax for input from enc_impl */
64*437bfbebSnyanmisaka     RK_U32                  updated;
65*437bfbebSnyanmisaka     H264eSps                *sps;
66*437bfbebSnyanmisaka     H264ePps                *pps;
67*437bfbebSnyanmisaka     H264eSlice              *slice;
68*437bfbebSnyanmisaka     H264eFrmInfo            *frms;
69*437bfbebSnyanmisaka     H264eReorderInfo        *reorder;
70*437bfbebSnyanmisaka     H264eMarkingInfo        *marking;
71*437bfbebSnyanmisaka     H264ePrefixNal          *prefix;
72*437bfbebSnyanmisaka     HalH264eVepuStreamAmend  amend;
73*437bfbebSnyanmisaka 
74*437bfbebSnyanmisaka     /* syntax for output to enc_impl */
75*437bfbebSnyanmisaka     EncRcTaskInfo           hal_rc_cfg;
76*437bfbebSnyanmisaka 
77*437bfbebSnyanmisaka     /* roi */
78*437bfbebSnyanmisaka     void                    *roi_data;
79*437bfbebSnyanmisaka 
80*437bfbebSnyanmisaka     /* register */
81*437bfbebSnyanmisaka     HalVepu540cRegSet       *regs_set;
82*437bfbebSnyanmisaka 
83*437bfbebSnyanmisaka     /* external line buffer over 3K */
84*437bfbebSnyanmisaka     MppBufferGroup          ext_line_buf_grp;
85*437bfbebSnyanmisaka     RK_S32                  ext_line_buf_size;
86*437bfbebSnyanmisaka     MppBuffer               ext_line_buf;
87*437bfbebSnyanmisaka } HalH264eVepu540cCtx;
88*437bfbebSnyanmisaka 
89*437bfbebSnyanmisaka static RK_S32 h264_aq_tthd_default[16] = {
90*437bfbebSnyanmisaka     0,  0,  0,  0,
91*437bfbebSnyanmisaka     3,  3,  5,  5,
92*437bfbebSnyanmisaka     8,  8,  8,  15,
93*437bfbebSnyanmisaka     15, 20, 25, 25,
94*437bfbebSnyanmisaka };
95*437bfbebSnyanmisaka 
96*437bfbebSnyanmisaka static RK_S32 h264_P_aq_step_default[16] = {
97*437bfbebSnyanmisaka     -8, -7, -6, -5,
98*437bfbebSnyanmisaka     -4, -3, -2, -1,
99*437bfbebSnyanmisaka     0,  1,  2,  3,
100*437bfbebSnyanmisaka     4,  5,  7,  8,
101*437bfbebSnyanmisaka };
102*437bfbebSnyanmisaka 
103*437bfbebSnyanmisaka static RK_S32 h264_I_aq_step_default[16] = {
104*437bfbebSnyanmisaka     -8, -7, -6, -5,
105*437bfbebSnyanmisaka     -4, -3, -2, -1,
106*437bfbebSnyanmisaka     0,  1,  2,  3,
107*437bfbebSnyanmisaka     4,  5,  8,  8,
108*437bfbebSnyanmisaka };
109*437bfbebSnyanmisaka 
hal_h264e_vepu540c_deinit(void * hal)110*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu540c_deinit(void *hal)
111*437bfbebSnyanmisaka {
112*437bfbebSnyanmisaka     HalH264eVepu540cCtx *p = (HalH264eVepu540cCtx *)hal;
113*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter %p\n", p);
114*437bfbebSnyanmisaka 
115*437bfbebSnyanmisaka     h264e_vepu_stream_amend_deinit(&p->amend);
116*437bfbebSnyanmisaka 
117*437bfbebSnyanmisaka     if (p->dev) {
118*437bfbebSnyanmisaka         mpp_dev_deinit(p->dev);
119*437bfbebSnyanmisaka         p->dev = NULL;
120*437bfbebSnyanmisaka     }
121*437bfbebSnyanmisaka 
122*437bfbebSnyanmisaka     if (p->ext_line_buf) {
123*437bfbebSnyanmisaka         mpp_buffer_put(p->ext_line_buf);
124*437bfbebSnyanmisaka         p->ext_line_buf = NULL;
125*437bfbebSnyanmisaka     }
126*437bfbebSnyanmisaka 
127*437bfbebSnyanmisaka     if (p->ext_line_buf_grp) {
128*437bfbebSnyanmisaka         mpp_buffer_group_put(p->ext_line_buf_grp);
129*437bfbebSnyanmisaka         p->ext_line_buf_grp = NULL;
130*437bfbebSnyanmisaka     }
131*437bfbebSnyanmisaka 
132*437bfbebSnyanmisaka     if (p->hw_recn) {
133*437bfbebSnyanmisaka         hal_bufs_deinit(p->hw_recn);
134*437bfbebSnyanmisaka         p->hw_recn = NULL;
135*437bfbebSnyanmisaka     }
136*437bfbebSnyanmisaka 
137*437bfbebSnyanmisaka     MPP_FREE(p->regs_set);
138*437bfbebSnyanmisaka 
139*437bfbebSnyanmisaka 
140*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave %p\n", p);
141*437bfbebSnyanmisaka 
142*437bfbebSnyanmisaka     return MPP_OK;
143*437bfbebSnyanmisaka }
144*437bfbebSnyanmisaka 
hal_h264e_vepu540c_init(void * hal,MppEncHalCfg * cfg)145*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu540c_init(void *hal, MppEncHalCfg *cfg)
146*437bfbebSnyanmisaka {
147*437bfbebSnyanmisaka     HalH264eVepu540cCtx *p = (HalH264eVepu540cCtx *)hal;
148*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
149*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter %p\n", p);
150*437bfbebSnyanmisaka 
151*437bfbebSnyanmisaka     p->cfg = cfg->cfg;
152*437bfbebSnyanmisaka 
153*437bfbebSnyanmisaka     /* update output to MppEnc */
154*437bfbebSnyanmisaka     cfg->type = VPU_CLIENT_RKVENC;
155*437bfbebSnyanmisaka     ret = mpp_dev_init(&cfg->dev, cfg->type);
156*437bfbebSnyanmisaka     if (ret) {
157*437bfbebSnyanmisaka         mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
158*437bfbebSnyanmisaka         goto DONE;
159*437bfbebSnyanmisaka     }
160*437bfbebSnyanmisaka     p->dev = cfg->dev;
161*437bfbebSnyanmisaka 
162*437bfbebSnyanmisaka     ret = hal_bufs_init(&p->hw_recn);
163*437bfbebSnyanmisaka     if (ret) {
164*437bfbebSnyanmisaka         mpp_err_f("init vepu buffer failed ret: %d\n", ret);
165*437bfbebSnyanmisaka         goto DONE;
166*437bfbebSnyanmisaka     }
167*437bfbebSnyanmisaka 
168*437bfbebSnyanmisaka     {   /* setup default hardware config */
169*437bfbebSnyanmisaka         MppEncHwCfg *hw = &cfg->cfg->hw;
170*437bfbebSnyanmisaka 
171*437bfbebSnyanmisaka         hw->qp_delta_row_i  = 1;
172*437bfbebSnyanmisaka         hw->qp_delta_row    = 2;
173*437bfbebSnyanmisaka         hw->qbias_i = 683;
174*437bfbebSnyanmisaka         hw->qbias_p = 341;
175*437bfbebSnyanmisaka         hw->qbias_en = 0;
176*437bfbebSnyanmisaka 
177*437bfbebSnyanmisaka         memcpy(hw->aq_thrd_i, h264_aq_tthd_default, sizeof(hw->aq_thrd_i));
178*437bfbebSnyanmisaka         memcpy(hw->aq_thrd_p, h264_aq_tthd_default, sizeof(hw->aq_thrd_p));
179*437bfbebSnyanmisaka         memcpy(hw->aq_step_i, h264_I_aq_step_default, sizeof(hw->aq_step_i));
180*437bfbebSnyanmisaka         memcpy(hw->aq_step_p, h264_P_aq_step_default, sizeof(hw->aq_step_p));
181*437bfbebSnyanmisaka     }
182*437bfbebSnyanmisaka 
183*437bfbebSnyanmisaka     p->regs_set = mpp_calloc(HalVepu540cRegSet, 1);
184*437bfbebSnyanmisaka 
185*437bfbebSnyanmisaka     if (!p->regs_set) {
186*437bfbebSnyanmisaka         mpp_err("HalVepu540cRegSet alloc fail");
187*437bfbebSnyanmisaka         return MPP_ERR_MALLOC;
188*437bfbebSnyanmisaka     }
189*437bfbebSnyanmisaka 
190*437bfbebSnyanmisaka DONE:
191*437bfbebSnyanmisaka     if (ret)
192*437bfbebSnyanmisaka         hal_h264e_vepu540c_deinit(hal);
193*437bfbebSnyanmisaka 
194*437bfbebSnyanmisaka     h264e_vepu_stream_amend_init(&p->amend);
195*437bfbebSnyanmisaka 
196*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave %p\n", p);
197*437bfbebSnyanmisaka     return ret;
198*437bfbebSnyanmisaka }
199*437bfbebSnyanmisaka 
setup_hal_bufs(HalH264eVepu540cCtx * ctx)200*437bfbebSnyanmisaka static void setup_hal_bufs(HalH264eVepu540cCtx *ctx)
201*437bfbebSnyanmisaka {
202*437bfbebSnyanmisaka     MppEncCfgSet *cfg = ctx->cfg;
203*437bfbebSnyanmisaka     MppEncPrepCfg *prep = &cfg->prep;
204*437bfbebSnyanmisaka     RK_S32 alignment = 64;
205*437bfbebSnyanmisaka     RK_S32 aligned_w = MPP_ALIGN(prep->width,  alignment);
206*437bfbebSnyanmisaka     RK_S32 aligned_h = MPP_ALIGN(prep->height, alignment);
207*437bfbebSnyanmisaka     RK_S32 pixel_buf_fbc_hdr_size = MPP_ALIGN(aligned_w * aligned_h / 64, SZ_8K);
208*437bfbebSnyanmisaka     RK_S32 pixel_buf_fbc_bdy_size = aligned_w * aligned_h * 3 / 2;
209*437bfbebSnyanmisaka     RK_S32 pixel_buf_size = pixel_buf_fbc_hdr_size + pixel_buf_fbc_bdy_size;
210*437bfbebSnyanmisaka     RK_S32 thumb_buf_size = MPP_ALIGN(aligned_w / 64 * aligned_h / 64 * 256, SZ_8K);
211*437bfbebSnyanmisaka     RK_S32 old_max_cnt = ctx->max_buf_cnt;
212*437bfbebSnyanmisaka     RK_S32 new_max_cnt = 2;
213*437bfbebSnyanmisaka     MppEncRefCfg ref_cfg = cfg->ref_cfg;
214*437bfbebSnyanmisaka 
215*437bfbebSnyanmisaka     if (ref_cfg) {
216*437bfbebSnyanmisaka         MppEncCpbInfo *info = mpp_enc_ref_cfg_get_cpb_info(ref_cfg);
217*437bfbebSnyanmisaka         if (new_max_cnt < MPP_MAX(new_max_cnt, info->dpb_size + 1))
218*437bfbebSnyanmisaka             new_max_cnt = MPP_MAX(new_max_cnt, info->dpb_size + 1);
219*437bfbebSnyanmisaka     }
220*437bfbebSnyanmisaka 
221*437bfbebSnyanmisaka     if (aligned_w > (3 * SZ_1K)) {
222*437bfbebSnyanmisaka         RK_S32 ext_line_buf_size = (aligned_w / 64 - 36) * 56 * 16;
223*437bfbebSnyanmisaka 
224*437bfbebSnyanmisaka         if (NULL == ctx->ext_line_buf_grp)
225*437bfbebSnyanmisaka             mpp_buffer_group_get_internal(&ctx->ext_line_buf_grp, MPP_BUFFER_TYPE_ION);
226*437bfbebSnyanmisaka         else if (ext_line_buf_size != ctx->ext_line_buf_size) {
227*437bfbebSnyanmisaka             mpp_buffer_put(ctx->ext_line_buf);
228*437bfbebSnyanmisaka             ctx->ext_line_buf = NULL;
229*437bfbebSnyanmisaka             mpp_buffer_group_clear(ctx->ext_line_buf_grp);
230*437bfbebSnyanmisaka         }
231*437bfbebSnyanmisaka 
232*437bfbebSnyanmisaka         mpp_assert(ctx->ext_line_buf_grp);
233*437bfbebSnyanmisaka 
234*437bfbebSnyanmisaka         if (NULL == ctx->ext_line_buf)
235*437bfbebSnyanmisaka             mpp_buffer_get(ctx->ext_line_buf_grp, &ctx->ext_line_buf, ext_line_buf_size);
236*437bfbebSnyanmisaka 
237*437bfbebSnyanmisaka         ctx->ext_line_buf_size = ext_line_buf_size;
238*437bfbebSnyanmisaka     } else {
239*437bfbebSnyanmisaka         if (ctx->ext_line_buf) {
240*437bfbebSnyanmisaka             mpp_buffer_put(ctx->ext_line_buf);
241*437bfbebSnyanmisaka             ctx->ext_line_buf = NULL;
242*437bfbebSnyanmisaka         }
243*437bfbebSnyanmisaka 
244*437bfbebSnyanmisaka         if (ctx->ext_line_buf_grp) {
245*437bfbebSnyanmisaka             mpp_buffer_group_clear(ctx->ext_line_buf_grp);
246*437bfbebSnyanmisaka             mpp_buffer_group_put(ctx->ext_line_buf_grp);
247*437bfbebSnyanmisaka             ctx->ext_line_buf_grp = NULL;
248*437bfbebSnyanmisaka         }
249*437bfbebSnyanmisaka         ctx->ext_line_buf_size = 0;
250*437bfbebSnyanmisaka     }
251*437bfbebSnyanmisaka 
252*437bfbebSnyanmisaka     if ((ctx->pixel_buf_fbc_hdr_size != pixel_buf_fbc_hdr_size) ||
253*437bfbebSnyanmisaka         (ctx->pixel_buf_fbc_bdy_size != pixel_buf_fbc_bdy_size) ||
254*437bfbebSnyanmisaka         (ctx->pixel_buf_size != pixel_buf_size) ||
255*437bfbebSnyanmisaka         (ctx->thumb_buf_size != thumb_buf_size) ||
256*437bfbebSnyanmisaka         (new_max_cnt > old_max_cnt)) {
257*437bfbebSnyanmisaka         size_t sizes[2];
258*437bfbebSnyanmisaka 
259*437bfbebSnyanmisaka         hal_h264e_dbg_detail("frame size %d -> %d max count %d -> %d\n",
260*437bfbebSnyanmisaka                              ctx->pixel_buf_size, pixel_buf_size,
261*437bfbebSnyanmisaka                              old_max_cnt, new_max_cnt);
262*437bfbebSnyanmisaka 
263*437bfbebSnyanmisaka         /* pixel buffer */
264*437bfbebSnyanmisaka         sizes[0] = pixel_buf_size;
265*437bfbebSnyanmisaka         /* thumb buffer */
266*437bfbebSnyanmisaka         sizes[1] = thumb_buf_size;
267*437bfbebSnyanmisaka         new_max_cnt = MPP_MAX(new_max_cnt, old_max_cnt);
268*437bfbebSnyanmisaka 
269*437bfbebSnyanmisaka         hal_bufs_setup(ctx->hw_recn, new_max_cnt, 2, sizes);
270*437bfbebSnyanmisaka 
271*437bfbebSnyanmisaka         ctx->pixel_buf_fbc_hdr_size = pixel_buf_fbc_hdr_size;
272*437bfbebSnyanmisaka         ctx->pixel_buf_fbc_bdy_size = pixel_buf_fbc_bdy_size;
273*437bfbebSnyanmisaka         ctx->pixel_buf_size = pixel_buf_size;
274*437bfbebSnyanmisaka         ctx->thumb_buf_size = thumb_buf_size;
275*437bfbebSnyanmisaka         ctx->max_buf_cnt = new_max_cnt;
276*437bfbebSnyanmisaka     }
277*437bfbebSnyanmisaka }
278*437bfbebSnyanmisaka 
hal_h264e_vepu540c_prepare(void * hal)279*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu540c_prepare(void *hal)
280*437bfbebSnyanmisaka {
281*437bfbebSnyanmisaka     HalH264eVepu540cCtx *ctx = (HalH264eVepu540cCtx *)hal;
282*437bfbebSnyanmisaka     MppEncPrepCfg *prep = &ctx->cfg->prep;
283*437bfbebSnyanmisaka 
284*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter %p\n", hal);
285*437bfbebSnyanmisaka 
286*437bfbebSnyanmisaka     if (prep->change_res) {
287*437bfbebSnyanmisaka         RK_S32 i;
288*437bfbebSnyanmisaka 
289*437bfbebSnyanmisaka         // pre-alloc required buffers to reduce first frame delay
290*437bfbebSnyanmisaka         setup_hal_bufs(ctx);
291*437bfbebSnyanmisaka         for (i = 0; i < ctx->max_buf_cnt; i++)
292*437bfbebSnyanmisaka             hal_bufs_get_buf(ctx->hw_recn, i);
293*437bfbebSnyanmisaka 
294*437bfbebSnyanmisaka         prep->change_res = 0;
295*437bfbebSnyanmisaka     }
296*437bfbebSnyanmisaka 
297*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave %p\n", hal);
298*437bfbebSnyanmisaka 
299*437bfbebSnyanmisaka     return MPP_OK;
300*437bfbebSnyanmisaka }
301*437bfbebSnyanmisaka 
update_vepu540c_syntax(HalH264eVepu540cCtx * ctx,MppSyntax * syntax)302*437bfbebSnyanmisaka static RK_U32 update_vepu540c_syntax(HalH264eVepu540cCtx *ctx, MppSyntax *syntax)
303*437bfbebSnyanmisaka {
304*437bfbebSnyanmisaka     H264eSyntaxDesc *desc = syntax->data;
305*437bfbebSnyanmisaka     RK_S32 syn_num = syntax->number;
306*437bfbebSnyanmisaka     RK_U32 updated = 0;
307*437bfbebSnyanmisaka     RK_S32 i;
308*437bfbebSnyanmisaka 
309*437bfbebSnyanmisaka     for (i = 0; i < syn_num; i++, desc++) {
310*437bfbebSnyanmisaka         switch (desc->type) {
311*437bfbebSnyanmisaka         case H264E_SYN_CFG : {
312*437bfbebSnyanmisaka             hal_h264e_dbg_detail("update cfg");
313*437bfbebSnyanmisaka             ctx->cfg = desc->p;
314*437bfbebSnyanmisaka         } break;
315*437bfbebSnyanmisaka         case H264E_SYN_SPS : {
316*437bfbebSnyanmisaka             hal_h264e_dbg_detail("update sps");
317*437bfbebSnyanmisaka             ctx->sps = desc->p;
318*437bfbebSnyanmisaka         } break;
319*437bfbebSnyanmisaka         case H264E_SYN_PPS : {
320*437bfbebSnyanmisaka             hal_h264e_dbg_detail("update pps");
321*437bfbebSnyanmisaka             ctx->pps = desc->p;
322*437bfbebSnyanmisaka         } break;
323*437bfbebSnyanmisaka         case H264E_SYN_DPB : {
324*437bfbebSnyanmisaka             hal_h264e_dbg_detail("update dpb");
325*437bfbebSnyanmisaka         } break;
326*437bfbebSnyanmisaka         case H264E_SYN_SLICE : {
327*437bfbebSnyanmisaka             hal_h264e_dbg_detail("update slice");
328*437bfbebSnyanmisaka             ctx->slice = desc->p;
329*437bfbebSnyanmisaka         } break;
330*437bfbebSnyanmisaka         case H264E_SYN_FRAME : {
331*437bfbebSnyanmisaka             hal_h264e_dbg_detail("update frames");
332*437bfbebSnyanmisaka             ctx->frms = desc->p;
333*437bfbebSnyanmisaka         } break;
334*437bfbebSnyanmisaka         case H264E_SYN_PREFIX : {
335*437bfbebSnyanmisaka             hal_h264e_dbg_detail("update prefix nal");
336*437bfbebSnyanmisaka             ctx->prefix = desc->p;
337*437bfbebSnyanmisaka         } break;
338*437bfbebSnyanmisaka         default : {
339*437bfbebSnyanmisaka             mpp_log_f("invalid syntax type %d\n", desc->type);
340*437bfbebSnyanmisaka         } break;
341*437bfbebSnyanmisaka         }
342*437bfbebSnyanmisaka 
343*437bfbebSnyanmisaka         updated |= SYN_TYPE_FLAG(desc->type);
344*437bfbebSnyanmisaka     }
345*437bfbebSnyanmisaka 
346*437bfbebSnyanmisaka     return updated;
347*437bfbebSnyanmisaka }
348*437bfbebSnyanmisaka 
hal_h264e_vepu540c_get_task(void * hal,HalEncTask * task)349*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu540c_get_task(void *hal, HalEncTask *task)
350*437bfbebSnyanmisaka {
351*437bfbebSnyanmisaka     HalH264eVepu540cCtx *ctx = (HalH264eVepu540cCtx *)hal;
352*437bfbebSnyanmisaka     MppEncH264HwCfg *hw_cfg = &ctx->cfg->h264.hw_cfg;
353*437bfbebSnyanmisaka     RK_U32 updated = update_vepu540c_syntax(ctx, &task->syntax);
354*437bfbebSnyanmisaka     EncFrmStatus *frm_status = &task->rc_task->frm;
355*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter %p\n", hal);
356*437bfbebSnyanmisaka 
357*437bfbebSnyanmisaka     if (updated & SYN_TYPE_FLAG(H264E_SYN_CFG))
358*437bfbebSnyanmisaka         setup_hal_bufs(ctx);
359*437bfbebSnyanmisaka 
360*437bfbebSnyanmisaka 
361*437bfbebSnyanmisaka     if (!frm_status->reencode && mpp_frame_has_meta(task->frame)) {
362*437bfbebSnyanmisaka         MppMeta meta = mpp_frame_get_meta(task->frame);
363*437bfbebSnyanmisaka 
364*437bfbebSnyanmisaka         mpp_meta_get_ptr(meta, KEY_ROI_DATA, (void **)&ctx->roi_data);
365*437bfbebSnyanmisaka     }
366*437bfbebSnyanmisaka 
367*437bfbebSnyanmisaka     /* if not VEPU1/2, update log2_max_frame_num_minus4 in hw_cfg */
368*437bfbebSnyanmisaka     hw_cfg->hw_log2_max_frame_num_minus4 = ctx->sps->log2_max_frame_num_minus4;
369*437bfbebSnyanmisaka 
370*437bfbebSnyanmisaka     h264e_vepu_stream_amend_config(&ctx->amend, task->packet, ctx->cfg,
371*437bfbebSnyanmisaka                                    ctx->slice, ctx->prefix);
372*437bfbebSnyanmisaka 
373*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave %p\n", hal);
374*437bfbebSnyanmisaka 
375*437bfbebSnyanmisaka     return MPP_OK;
376*437bfbebSnyanmisaka }
377*437bfbebSnyanmisaka 
setup_vepu540c_normal(HalVepu540cRegSet * regs)378*437bfbebSnyanmisaka static void setup_vepu540c_normal(HalVepu540cRegSet *regs)
379*437bfbebSnyanmisaka {
380*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
381*437bfbebSnyanmisaka     /* reg000 VERSION is read only */
382*437bfbebSnyanmisaka 
383*437bfbebSnyanmisaka     /* reg001 ENC_STRT */
384*437bfbebSnyanmisaka     regs->reg_ctl.enc_strt.lkt_num           = 0;
385*437bfbebSnyanmisaka     regs->reg_ctl.enc_strt.vepu_cmd          = 1;
386*437bfbebSnyanmisaka 
387*437bfbebSnyanmisaka     regs->reg_ctl.func_en.cke                = 1;
388*437bfbebSnyanmisaka     regs->reg_ctl.func_en.resetn_hw_en       = 1;
389*437bfbebSnyanmisaka     regs->reg_ctl.func_en.enc_done_tmvp_en   = 1;
390*437bfbebSnyanmisaka 
391*437bfbebSnyanmisaka     /* reg002 ENC_CLR */
392*437bfbebSnyanmisaka     regs->reg_ctl.enc_clr.safe_clr           = 0;
393*437bfbebSnyanmisaka     regs->reg_ctl.enc_clr.force_clr          = 0;
394*437bfbebSnyanmisaka 
395*437bfbebSnyanmisaka     /* reg003 LKT_ADDR */
396*437bfbebSnyanmisaka     // regs->reg_ctl.lkt_addr           = 0;
397*437bfbebSnyanmisaka 
398*437bfbebSnyanmisaka     /* reg004 INT_EN */
399*437bfbebSnyanmisaka     regs->reg_ctl.int_en.enc_done_en        = 1;
400*437bfbebSnyanmisaka     regs->reg_ctl.int_en.lkt_node_done_en   = 1;
401*437bfbebSnyanmisaka     regs->reg_ctl.int_en.sclr_done_en       = 1;
402*437bfbebSnyanmisaka     regs->reg_ctl.int_en.vslc_done_en       = 0;
403*437bfbebSnyanmisaka     regs->reg_ctl.int_en.vbsf_oflw_en       = 1;
404*437bfbebSnyanmisaka     regs->reg_ctl.int_en.vbuf_lens_en       = 1;
405*437bfbebSnyanmisaka     regs->reg_ctl.int_en.enc_err_en         = 1;
406*437bfbebSnyanmisaka     regs->reg_ctl.int_en.dvbm_fcfg_en       = 1;
407*437bfbebSnyanmisaka     regs->reg_ctl.int_en.wdg_en             = 1;
408*437bfbebSnyanmisaka     regs->reg_ctl.int_en.lkt_err_int_en     = 1;
409*437bfbebSnyanmisaka     regs->reg_ctl.int_en.lkt_err_stop_en    = 1;
410*437bfbebSnyanmisaka     regs->reg_ctl.int_en.lkt_force_stop_en  = 1;
411*437bfbebSnyanmisaka     regs->reg_ctl.int_en.jslc_done_en       = 1;
412*437bfbebSnyanmisaka     regs->reg_ctl.int_en.jbsf_oflw_en       = 1;
413*437bfbebSnyanmisaka     regs->reg_ctl.int_en.jbuf_lens_en       = 1;
414*437bfbebSnyanmisaka     regs->reg_ctl.int_en.dvbm_dcnt_en       = 1;
415*437bfbebSnyanmisaka 
416*437bfbebSnyanmisaka     /* reg005 INT_MSK */
417*437bfbebSnyanmisaka     regs->reg_ctl.int_msk.enc_done_msk        = 0;
418*437bfbebSnyanmisaka     regs->reg_ctl.int_msk.lkt_node_done_msk   = 0;
419*437bfbebSnyanmisaka     regs->reg_ctl.int_msk.sclr_done_msk       = 0;
420*437bfbebSnyanmisaka     regs->reg_ctl.int_msk.vslc_done_msk       = 0;
421*437bfbebSnyanmisaka     regs->reg_ctl.int_msk.vbsf_oflw_msk       = 0;
422*437bfbebSnyanmisaka     regs->reg_ctl.int_msk.vbuf_lens_msk       = 0;
423*437bfbebSnyanmisaka     regs->reg_ctl.int_msk.enc_err_msk         = 0;
424*437bfbebSnyanmisaka     regs->reg_ctl.int_msk.dvbm_fcfg_msk       = 0;
425*437bfbebSnyanmisaka     regs->reg_ctl.int_msk.wdg_msk             = 0;
426*437bfbebSnyanmisaka     regs->reg_ctl.int_msk.lkt_err_int_msk     = 0;
427*437bfbebSnyanmisaka     regs->reg_ctl.int_msk.lkt_err_stop_msk    = 0;
428*437bfbebSnyanmisaka     regs->reg_ctl.int_msk.lkt_force_stop_msk  = 0;
429*437bfbebSnyanmisaka     regs->reg_ctl.int_msk.jslc_done_msk       = 0;
430*437bfbebSnyanmisaka     regs->reg_ctl.int_msk.jbsf_oflw_msk       = 0;
431*437bfbebSnyanmisaka     regs->reg_ctl.int_msk.jbuf_lens_msk       = 0;
432*437bfbebSnyanmisaka     regs->reg_ctl.int_msk.dvbm_dcnt_msk       = 0;
433*437bfbebSnyanmisaka 
434*437bfbebSnyanmisaka     /* reg006 INT_CLR is not set */
435*437bfbebSnyanmisaka     /* reg007 INT_STA is read only */
436*437bfbebSnyanmisaka     /* reg008 ~ reg0011 gap */
437*437bfbebSnyanmisaka     regs->reg_ctl.enc_wdg.vs_load_thd        = 0x5ffff;
438*437bfbebSnyanmisaka     regs->reg_ctl.enc_wdg.rfp_load_thd       = 0;//xff;
439*437bfbebSnyanmisaka 
440*437bfbebSnyanmisaka     /* reg015 DTRNS_MAP */
441*437bfbebSnyanmisaka     regs->reg_ctl.dtrns_map.jpeg_bus_edin      = 0;
442*437bfbebSnyanmisaka     regs->reg_ctl.dtrns_map.src_bus_edin       = 0;
443*437bfbebSnyanmisaka     regs->reg_ctl.dtrns_map.meiw_bus_edin      = 0;
444*437bfbebSnyanmisaka     regs->reg_ctl.dtrns_map.bsw_bus_edin       = 7;
445*437bfbebSnyanmisaka     regs->reg_ctl.dtrns_map.lktr_bus_edin      = 0;
446*437bfbebSnyanmisaka     regs->reg_ctl.dtrns_map.roir_bus_edin      = 0;
447*437bfbebSnyanmisaka     regs->reg_ctl.dtrns_map.lktw_bus_edin      = 0;
448*437bfbebSnyanmisaka     regs->reg_ctl.dtrns_map.rec_nfbc_bus_edin  = 0;
449*437bfbebSnyanmisaka 
450*437bfbebSnyanmisaka     regs->reg_ctl.dtrns_cfg.axi_brsp_cke   = 0;
451*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
452*437bfbebSnyanmisaka }
453*437bfbebSnyanmisaka 
setup_vepu540c_prep(HalVepu540cRegSet * regs,MppEncPrepCfg * prep)454*437bfbebSnyanmisaka static MPP_RET setup_vepu540c_prep(HalVepu540cRegSet *regs, MppEncPrepCfg *prep)
455*437bfbebSnyanmisaka {
456*437bfbebSnyanmisaka     VepuFmtCfg cfg;
457*437bfbebSnyanmisaka     MppFrameFormat fmt = prep->format;
458*437bfbebSnyanmisaka     MPP_RET ret = vepu5xx_set_fmt(&cfg, fmt);
459*437bfbebSnyanmisaka     RK_U32 hw_fmt = cfg.format;
460*437bfbebSnyanmisaka     RK_S32 y_stride;
461*437bfbebSnyanmisaka     RK_S32 c_stride;
462*437bfbebSnyanmisaka 
463*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
464*437bfbebSnyanmisaka 
465*437bfbebSnyanmisaka     /* do nothing when color format is not supported */
466*437bfbebSnyanmisaka     if (ret)
467*437bfbebSnyanmisaka         return ret;
468*437bfbebSnyanmisaka 
469*437bfbebSnyanmisaka     regs->reg_base.enc_rsl.pic_wd8_m1 = MPP_ALIGN(prep->width, 16) / 8 - 1;
470*437bfbebSnyanmisaka     regs->reg_base.src_fill.pic_wfill = MPP_ALIGN(prep->width, 16) - prep->width;
471*437bfbebSnyanmisaka     regs->reg_base.enc_rsl.pic_hd8_m1 = MPP_ALIGN(prep->height, 16) / 8 - 1;
472*437bfbebSnyanmisaka     regs->reg_base.src_fill.pic_hfill = MPP_ALIGN(prep->height, 16) - prep->height;
473*437bfbebSnyanmisaka 
474*437bfbebSnyanmisaka     regs->reg_ctl.dtrns_map.src_bus_edin = cfg.src_endian;
475*437bfbebSnyanmisaka 
476*437bfbebSnyanmisaka     regs->reg_base.src_fmt.src_cfmt   = hw_fmt;
477*437bfbebSnyanmisaka     regs->reg_base.src_fmt.alpha_swap = cfg.alpha_swap;
478*437bfbebSnyanmisaka     regs->reg_base.src_fmt.rbuv_swap  = cfg.rbuv_swap;
479*437bfbebSnyanmisaka     regs->reg_base.src_fmt.out_fmt    = (fmt == MPP_FMT_YUV400) ? 0 : 1;
480*437bfbebSnyanmisaka 
481*437bfbebSnyanmisaka     y_stride = (MPP_FRAME_FMT_IS_FBC(fmt)) ? (MPP_ALIGN(prep->width, 16)) :
482*437bfbebSnyanmisaka                (prep->hor_stride) ? (prep->hor_stride) : (prep->width);
483*437bfbebSnyanmisaka 
484*437bfbebSnyanmisaka     c_stride = (hw_fmt == VEPU5xx_FMT_YUV422SP || hw_fmt == VEPU5xx_FMT_YUV420SP) ?
485*437bfbebSnyanmisaka                y_stride : y_stride / 2;
486*437bfbebSnyanmisaka 
487*437bfbebSnyanmisaka     if (hw_fmt < VEPU5xx_FMT_ARGB1555) {
488*437bfbebSnyanmisaka         const VepuRgb2YuvCfg *cfg_coeffs = get_rgb2yuv_cfg(prep->range, prep->color);
489*437bfbebSnyanmisaka 
490*437bfbebSnyanmisaka         hal_h264e_dbg_flow("input color range %d colorspace %d", prep->range, prep->color);
491*437bfbebSnyanmisaka 
492*437bfbebSnyanmisaka         regs->reg_base.src_udfy.csc_wgt_b2y = cfg_coeffs->_2y.b_coeff;
493*437bfbebSnyanmisaka         regs->reg_base.src_udfy.csc_wgt_g2y = cfg_coeffs->_2y.g_coeff;
494*437bfbebSnyanmisaka         regs->reg_base.src_udfy.csc_wgt_r2y = cfg_coeffs->_2y.r_coeff;
495*437bfbebSnyanmisaka 
496*437bfbebSnyanmisaka         regs->reg_base.src_udfu.csc_wgt_b2u = cfg_coeffs->_2u.b_coeff;
497*437bfbebSnyanmisaka         regs->reg_base.src_udfu.csc_wgt_g2u = cfg_coeffs->_2u.g_coeff;
498*437bfbebSnyanmisaka         regs->reg_base.src_udfu.csc_wgt_r2u = cfg_coeffs->_2u.r_coeff;
499*437bfbebSnyanmisaka 
500*437bfbebSnyanmisaka         regs->reg_base.src_udfv.csc_wgt_b2v = cfg_coeffs->_2v.b_coeff;
501*437bfbebSnyanmisaka         regs->reg_base.src_udfv.csc_wgt_g2v = cfg_coeffs->_2v.g_coeff;
502*437bfbebSnyanmisaka         regs->reg_base.src_udfv.csc_wgt_r2v = cfg_coeffs->_2v.r_coeff;
503*437bfbebSnyanmisaka 
504*437bfbebSnyanmisaka         regs->reg_base.src_udfo.csc_ofst_y  = cfg_coeffs->_2y.offset;
505*437bfbebSnyanmisaka         regs->reg_base.src_udfo.csc_ofst_u  = cfg_coeffs->_2u.offset;
506*437bfbebSnyanmisaka         regs->reg_base.src_udfo.csc_ofst_v  = cfg_coeffs->_2v.offset;
507*437bfbebSnyanmisaka 
508*437bfbebSnyanmisaka         hal_h264e_dbg_flow("use color range %d colorspace %d", cfg_coeffs->dst_range, cfg_coeffs->color);
509*437bfbebSnyanmisaka     } else {
510*437bfbebSnyanmisaka         regs->reg_base.src_udfy.csc_wgt_b2y = cfg.weight[0];
511*437bfbebSnyanmisaka         regs->reg_base.src_udfy.csc_wgt_g2y = cfg.weight[1];
512*437bfbebSnyanmisaka         regs->reg_base.src_udfy.csc_wgt_r2y = cfg.weight[2];
513*437bfbebSnyanmisaka 
514*437bfbebSnyanmisaka         regs->reg_base.src_udfu.csc_wgt_b2u = cfg.weight[3];
515*437bfbebSnyanmisaka         regs->reg_base.src_udfu.csc_wgt_g2u = cfg.weight[4];
516*437bfbebSnyanmisaka         regs->reg_base.src_udfu.csc_wgt_r2u = cfg.weight[5];
517*437bfbebSnyanmisaka 
518*437bfbebSnyanmisaka         regs->reg_base.src_udfv.csc_wgt_b2v = cfg.weight[6];
519*437bfbebSnyanmisaka         regs->reg_base.src_udfv.csc_wgt_g2v = cfg.weight[7];
520*437bfbebSnyanmisaka         regs->reg_base.src_udfv.csc_wgt_r2v = cfg.weight[8];
521*437bfbebSnyanmisaka 
522*437bfbebSnyanmisaka         regs->reg_base.src_udfo.csc_ofst_y  = cfg.offset[0];
523*437bfbebSnyanmisaka         regs->reg_base.src_udfo.csc_ofst_u  = cfg.offset[1];
524*437bfbebSnyanmisaka         regs->reg_base.src_udfo.csc_ofst_v  = cfg.offset[2];
525*437bfbebSnyanmisaka     }
526*437bfbebSnyanmisaka 
527*437bfbebSnyanmisaka     regs->reg_base.src_strd0.src_strd0  = y_stride;
528*437bfbebSnyanmisaka     regs->reg_base.src_strd1.src_strd1  = c_stride;
529*437bfbebSnyanmisaka 
530*437bfbebSnyanmisaka     regs->reg_base.src_proc.src_mirr   = prep->mirroring > 0;
531*437bfbebSnyanmisaka     regs->reg_base.src_proc.src_rot    = prep->rotation;
532*437bfbebSnyanmisaka     //  regs->reg_base.src_proc.txa_en     = 0;
533*437bfbebSnyanmisaka 
534*437bfbebSnyanmisaka     regs->reg_base.sli_cfg.mv_v_lmt_thd = 0;
535*437bfbebSnyanmisaka     regs->reg_base.sli_cfg.mv_v_lmt_en = 0;
536*437bfbebSnyanmisaka 
537*437bfbebSnyanmisaka     regs->reg_base.pic_ofst.pic_ofst_y = 0;
538*437bfbebSnyanmisaka     regs->reg_base.pic_ofst.pic_ofst_x = 0;
539*437bfbebSnyanmisaka 
540*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
541*437bfbebSnyanmisaka 
542*437bfbebSnyanmisaka     return ret;
543*437bfbebSnyanmisaka }
544*437bfbebSnyanmisaka 
setup_vepu540c_codec(HalVepu540cRegSet * regs,H264eSps * sps,H264ePps * pps,H264eSlice * slice)545*437bfbebSnyanmisaka static void setup_vepu540c_codec(HalVepu540cRegSet *regs, H264eSps *sps,
546*437bfbebSnyanmisaka                                  H264ePps *pps, H264eSlice *slice)
547*437bfbebSnyanmisaka {
548*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
549*437bfbebSnyanmisaka 
550*437bfbebSnyanmisaka     regs->reg_base.enc_pic.enc_stnd       = 0;
551*437bfbebSnyanmisaka     regs->reg_base.enc_pic.cur_frm_ref    = slice->nal_reference_idc > 0;
552*437bfbebSnyanmisaka     regs->reg_base.enc_pic.bs_scp         = 1;
553*437bfbebSnyanmisaka 
554*437bfbebSnyanmisaka     regs->reg_base.synt_nal.nal_ref_idc    = slice->nal_reference_idc;
555*437bfbebSnyanmisaka     regs->reg_base.synt_nal.nal_unit_type  = slice->nalu_type;
556*437bfbebSnyanmisaka 
557*437bfbebSnyanmisaka     regs->reg_base.synt_sps.max_fnum       = sps->log2_max_frame_num_minus4;
558*437bfbebSnyanmisaka     regs->reg_base.synt_sps.drct_8x8       = sps->direct8x8_inference;
559*437bfbebSnyanmisaka     regs->reg_base.synt_sps.mpoc_lm4       = sps->log2_max_poc_lsb_minus4;
560*437bfbebSnyanmisaka 
561*437bfbebSnyanmisaka     regs->reg_base.synt_pps.etpy_mode      = pps->entropy_coding_mode;
562*437bfbebSnyanmisaka     regs->reg_base.synt_pps.trns_8x8       = pps->transform_8x8_mode;
563*437bfbebSnyanmisaka     regs->reg_base.synt_pps.csip_flag      = pps->constrained_intra_pred;
564*437bfbebSnyanmisaka     regs->reg_base.synt_pps.num_ref0_idx   = pps->num_ref_idx_l0_default_active - 1;
565*437bfbebSnyanmisaka     regs->reg_base.synt_pps.num_ref1_idx   = pps->num_ref_idx_l1_default_active - 1;
566*437bfbebSnyanmisaka     regs->reg_base.synt_pps.pic_init_qp    = pps->pic_init_qp;
567*437bfbebSnyanmisaka     regs->reg_base.synt_pps.cb_ofst        = pps->chroma_qp_index_offset;
568*437bfbebSnyanmisaka     regs->reg_base.synt_pps.cr_ofst        = pps->second_chroma_qp_index_offset;
569*437bfbebSnyanmisaka     regs->reg_base.synt_pps.dbf_cp_flg     = pps->deblocking_filter_control;
570*437bfbebSnyanmisaka 
571*437bfbebSnyanmisaka     regs->reg_base.synt_sli0.sli_type       = (slice->slice_type == H264_I_SLICE) ? (2) : (0);
572*437bfbebSnyanmisaka     regs->reg_base.synt_sli0.pps_id         = slice->pic_parameter_set_id;
573*437bfbebSnyanmisaka     regs->reg_base.synt_sli0.drct_smvp      = 0;
574*437bfbebSnyanmisaka     regs->reg_base.synt_sli0.num_ref_ovrd   = slice->num_ref_idx_override;
575*437bfbebSnyanmisaka     regs->reg_base.synt_sli0.cbc_init_idc   = slice->cabac_init_idc;
576*437bfbebSnyanmisaka     regs->reg_base.synt_sli0.frm_num        = slice->frame_num;
577*437bfbebSnyanmisaka 
578*437bfbebSnyanmisaka     regs->reg_base.synt_sli1.idr_pid        = (slice->slice_type == H264_I_SLICE) ? slice->idr_pic_id : (RK_U32)(-1);
579*437bfbebSnyanmisaka     regs->reg_base.synt_sli1.poc_lsb        = slice->pic_order_cnt_lsb;
580*437bfbebSnyanmisaka 
581*437bfbebSnyanmisaka 
582*437bfbebSnyanmisaka     regs->reg_base.synt_sli2.dis_dblk_idc   = slice->disable_deblocking_filter_idc;
583*437bfbebSnyanmisaka     regs->reg_base.synt_sli2.sli_alph_ofst  = slice->slice_alpha_c0_offset_div2;
584*437bfbebSnyanmisaka 
585*437bfbebSnyanmisaka     h264e_reorder_rd_rewind(slice->reorder);
586*437bfbebSnyanmisaka     {   /* reorder process */
587*437bfbebSnyanmisaka         H264eRplmo rplmo;
588*437bfbebSnyanmisaka         MPP_RET ret = h264e_reorder_rd_op(slice->reorder, &rplmo);
589*437bfbebSnyanmisaka 
590*437bfbebSnyanmisaka         if (MPP_OK == ret) {
591*437bfbebSnyanmisaka             regs->reg_base.synt_sli2.ref_list0_rodr = 1;
592*437bfbebSnyanmisaka             regs->reg_base.synt_sli2.rodr_pic_idx   = rplmo.modification_of_pic_nums_idc;
593*437bfbebSnyanmisaka 
594*437bfbebSnyanmisaka             switch (rplmo.modification_of_pic_nums_idc) {
595*437bfbebSnyanmisaka             case 0 :
596*437bfbebSnyanmisaka             case 1 : {
597*437bfbebSnyanmisaka                 regs->reg_base.synt_sli2.rodr_pic_num   = rplmo.abs_diff_pic_num_minus1;
598*437bfbebSnyanmisaka             } break;
599*437bfbebSnyanmisaka             case 2 : {
600*437bfbebSnyanmisaka                 regs->reg_base.synt_sli2.rodr_pic_num   = rplmo.long_term_pic_idx;
601*437bfbebSnyanmisaka             } break;
602*437bfbebSnyanmisaka             default : {
603*437bfbebSnyanmisaka                 mpp_err_f("invalid modification_of_pic_nums_idc %d\n",
604*437bfbebSnyanmisaka                           rplmo.modification_of_pic_nums_idc);
605*437bfbebSnyanmisaka             } break;
606*437bfbebSnyanmisaka             }
607*437bfbebSnyanmisaka         } else {
608*437bfbebSnyanmisaka             // slice->ref_pic_list_modification_flag;
609*437bfbebSnyanmisaka             regs->reg_base.synt_sli2.ref_list0_rodr = 0;
610*437bfbebSnyanmisaka             regs->reg_base.synt_sli2.rodr_pic_idx   = 0;
611*437bfbebSnyanmisaka             regs->reg_base.synt_sli2.rodr_pic_num   = 0;
612*437bfbebSnyanmisaka         }
613*437bfbebSnyanmisaka     }
614*437bfbebSnyanmisaka 
615*437bfbebSnyanmisaka     /* clear all mmco arg first */
616*437bfbebSnyanmisaka     regs->reg_base.synt_refm0.nopp_flg               = 0;
617*437bfbebSnyanmisaka     regs->reg_base.synt_refm0.ltrf_flg               = 0;
618*437bfbebSnyanmisaka     regs->reg_base.synt_refm0.arpm_flg               = 0;
619*437bfbebSnyanmisaka     regs->reg_base.synt_refm0.mmco4_pre              = 0;
620*437bfbebSnyanmisaka     regs->reg_base.synt_refm0.mmco_type0             = 0;
621*437bfbebSnyanmisaka     regs->reg_base.synt_refm0.mmco_parm0             = 0;
622*437bfbebSnyanmisaka     regs->reg_base.synt_refm0.mmco_type1             = 0;
623*437bfbebSnyanmisaka     regs->reg_base.synt_refm1.mmco_parm1             = 0;
624*437bfbebSnyanmisaka     regs->reg_base.synt_refm0.mmco_type2             = 0;
625*437bfbebSnyanmisaka     regs->reg_base.synt_refm1.mmco_parm2             = 0;
626*437bfbebSnyanmisaka     regs->reg_base.synt_refm2.long_term_frame_idx0   = 0;
627*437bfbebSnyanmisaka     regs->reg_base.synt_refm2.long_term_frame_idx1   = 0;
628*437bfbebSnyanmisaka     regs->reg_base.synt_refm2.long_term_frame_idx2   = 0;
629*437bfbebSnyanmisaka 
630*437bfbebSnyanmisaka     h264e_marking_rd_rewind(slice->marking);
631*437bfbebSnyanmisaka 
632*437bfbebSnyanmisaka     /* only update used parameter */
633*437bfbebSnyanmisaka     if (slice->slice_type == H264_I_SLICE) {
634*437bfbebSnyanmisaka         regs->reg_base.synt_refm0.nopp_flg       = slice->no_output_of_prior_pics;
635*437bfbebSnyanmisaka         regs->reg_base.synt_refm0.ltrf_flg       = slice->long_term_reference_flag;
636*437bfbebSnyanmisaka     } else {
637*437bfbebSnyanmisaka         if (!h264e_marking_is_empty(slice->marking)) {
638*437bfbebSnyanmisaka             H264eMmco mmco;
639*437bfbebSnyanmisaka 
640*437bfbebSnyanmisaka             regs->reg_base.synt_refm0.arpm_flg       = 1;
641*437bfbebSnyanmisaka 
642*437bfbebSnyanmisaka             /* max 3 mmco */
643*437bfbebSnyanmisaka             do {
644*437bfbebSnyanmisaka                 RK_S32 type = 0;
645*437bfbebSnyanmisaka                 RK_S32 param_0 = 0;
646*437bfbebSnyanmisaka                 RK_S32 param_1 = 0;
647*437bfbebSnyanmisaka 
648*437bfbebSnyanmisaka                 h264e_marking_rd_op(slice->marking, &mmco);
649*437bfbebSnyanmisaka                 type = mmco.mmco;
650*437bfbebSnyanmisaka                 switch (type) {
651*437bfbebSnyanmisaka                 case 1 : {
652*437bfbebSnyanmisaka                     param_0 = mmco.difference_of_pic_nums_minus1;
653*437bfbebSnyanmisaka                 } break;
654*437bfbebSnyanmisaka                 case 2 : {
655*437bfbebSnyanmisaka                     param_0 = mmco.long_term_pic_num;
656*437bfbebSnyanmisaka                 } break;
657*437bfbebSnyanmisaka                 case 3 : {
658*437bfbebSnyanmisaka                     param_0 = mmco.difference_of_pic_nums_minus1;
659*437bfbebSnyanmisaka                     param_1 = mmco.long_term_frame_idx;
660*437bfbebSnyanmisaka                 } break;
661*437bfbebSnyanmisaka                 case 4 : {
662*437bfbebSnyanmisaka                     param_0 = mmco.max_long_term_frame_idx_plus1;
663*437bfbebSnyanmisaka                 } break;
664*437bfbebSnyanmisaka                 case 5 : {
665*437bfbebSnyanmisaka                 } break;
666*437bfbebSnyanmisaka                 case 6 : {
667*437bfbebSnyanmisaka                     param_0 = mmco.long_term_frame_idx;
668*437bfbebSnyanmisaka                 } break;
669*437bfbebSnyanmisaka                 default : {
670*437bfbebSnyanmisaka                     mpp_err_f("unsupported mmco 0 %d\n", type);
671*437bfbebSnyanmisaka                     type = 0;
672*437bfbebSnyanmisaka                 } break;
673*437bfbebSnyanmisaka                 }
674*437bfbebSnyanmisaka 
675*437bfbebSnyanmisaka                 regs->reg_base.synt_refm0.mmco_type0 = type;
676*437bfbebSnyanmisaka                 regs->reg_base.synt_refm0.mmco_parm0 = param_0;
677*437bfbebSnyanmisaka                 regs->reg_base.synt_refm2.long_term_frame_idx0 = param_1;
678*437bfbebSnyanmisaka 
679*437bfbebSnyanmisaka                 if (h264e_marking_is_empty(slice->marking))
680*437bfbebSnyanmisaka                     break;
681*437bfbebSnyanmisaka 
682*437bfbebSnyanmisaka                 h264e_marking_rd_op(slice->marking, &mmco);
683*437bfbebSnyanmisaka                 type = mmco.mmco;
684*437bfbebSnyanmisaka                 param_0 = 0;
685*437bfbebSnyanmisaka                 param_1 = 0;
686*437bfbebSnyanmisaka                 switch (type) {
687*437bfbebSnyanmisaka                 case 1 : {
688*437bfbebSnyanmisaka                     param_0 = mmco.difference_of_pic_nums_minus1;
689*437bfbebSnyanmisaka                 } break;
690*437bfbebSnyanmisaka                 case 2 : {
691*437bfbebSnyanmisaka                     param_0 = mmco.long_term_pic_num;
692*437bfbebSnyanmisaka                 } break;
693*437bfbebSnyanmisaka                 case 3 : {
694*437bfbebSnyanmisaka                     param_0 = mmco.difference_of_pic_nums_minus1;
695*437bfbebSnyanmisaka                     param_1 = mmco.long_term_frame_idx;
696*437bfbebSnyanmisaka                 } break;
697*437bfbebSnyanmisaka                 case 4 : {
698*437bfbebSnyanmisaka                     param_0 = mmco.max_long_term_frame_idx_plus1;
699*437bfbebSnyanmisaka                 } break;
700*437bfbebSnyanmisaka                 case 5 : {
701*437bfbebSnyanmisaka                 } break;
702*437bfbebSnyanmisaka                 case 6 : {
703*437bfbebSnyanmisaka                     param_0 = mmco.long_term_frame_idx;
704*437bfbebSnyanmisaka                 } break;
705*437bfbebSnyanmisaka                 default : {
706*437bfbebSnyanmisaka                     mpp_err_f("unsupported mmco 0 %d\n", type);
707*437bfbebSnyanmisaka                     type = 0;
708*437bfbebSnyanmisaka                 } break;
709*437bfbebSnyanmisaka                 }
710*437bfbebSnyanmisaka 
711*437bfbebSnyanmisaka                 regs->reg_base.synt_refm0.mmco_type1 = type;
712*437bfbebSnyanmisaka                 regs->reg_base.synt_refm1.mmco_parm1 = param_0;
713*437bfbebSnyanmisaka                 regs->reg_base.synt_refm2.long_term_frame_idx1 = param_1;
714*437bfbebSnyanmisaka 
715*437bfbebSnyanmisaka                 if (h264e_marking_is_empty(slice->marking))
716*437bfbebSnyanmisaka                     break;
717*437bfbebSnyanmisaka 
718*437bfbebSnyanmisaka                 h264e_marking_rd_op(slice->marking, &mmco);
719*437bfbebSnyanmisaka                 type = mmco.mmco;
720*437bfbebSnyanmisaka                 param_0 = 0;
721*437bfbebSnyanmisaka                 param_1 = 0;
722*437bfbebSnyanmisaka                 switch (type) {
723*437bfbebSnyanmisaka                 case 1 : {
724*437bfbebSnyanmisaka                     param_0 = mmco.difference_of_pic_nums_minus1;
725*437bfbebSnyanmisaka                 } break;
726*437bfbebSnyanmisaka                 case 2 : {
727*437bfbebSnyanmisaka                     param_0 = mmco.long_term_pic_num;
728*437bfbebSnyanmisaka                 } break;
729*437bfbebSnyanmisaka                 case 3 : {
730*437bfbebSnyanmisaka                     param_0 = mmco.difference_of_pic_nums_minus1;
731*437bfbebSnyanmisaka                     param_1 = mmco.long_term_frame_idx;
732*437bfbebSnyanmisaka                 } break;
733*437bfbebSnyanmisaka                 case 4 : {
734*437bfbebSnyanmisaka                     param_0 = mmco.max_long_term_frame_idx_plus1;
735*437bfbebSnyanmisaka                 } break;
736*437bfbebSnyanmisaka                 case 5 : {
737*437bfbebSnyanmisaka                 } break;
738*437bfbebSnyanmisaka                 case 6 : {
739*437bfbebSnyanmisaka                     param_0 = mmco.long_term_frame_idx;
740*437bfbebSnyanmisaka                 } break;
741*437bfbebSnyanmisaka                 default : {
742*437bfbebSnyanmisaka                     mpp_err_f("unsupported mmco 0 %d\n", type);
743*437bfbebSnyanmisaka                     type = 0;
744*437bfbebSnyanmisaka                 } break;
745*437bfbebSnyanmisaka                 }
746*437bfbebSnyanmisaka 
747*437bfbebSnyanmisaka                 regs->reg_base.synt_refm0.mmco_type2 = type;
748*437bfbebSnyanmisaka                 regs->reg_base.synt_refm1.mmco_parm2 = param_0;
749*437bfbebSnyanmisaka                 regs->reg_base.synt_refm2.long_term_frame_idx2 = param_1;
750*437bfbebSnyanmisaka             } while (0);
751*437bfbebSnyanmisaka         }
752*437bfbebSnyanmisaka     }
753*437bfbebSnyanmisaka 
754*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
755*437bfbebSnyanmisaka }
756*437bfbebSnyanmisaka 
setup_vepu540c_rdo_pred(HalVepu540cRegSet * regs,H264eSps * sps,H264ePps * pps,H264eSlice * slice)757*437bfbebSnyanmisaka static void setup_vepu540c_rdo_pred(HalVepu540cRegSet *regs, H264eSps *sps,
758*437bfbebSnyanmisaka                                     H264ePps *pps, H264eSlice *slice)
759*437bfbebSnyanmisaka {
760*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
761*437bfbebSnyanmisaka 
762*437bfbebSnyanmisaka     if (slice->slice_type == H264_I_SLICE) {
763*437bfbebSnyanmisaka         regs->reg_rc_roi.klut_ofst.chrm_klut_ofst = 6;
764*437bfbebSnyanmisaka     } else {
765*437bfbebSnyanmisaka         regs->reg_rc_roi.klut_ofst.chrm_klut_ofst = 9;
766*437bfbebSnyanmisaka     }
767*437bfbebSnyanmisaka 
768*437bfbebSnyanmisaka     regs->reg_base.rdo_cfg.rect_size      = (sps->profile_idc == H264_PROFILE_BASELINE &&
769*437bfbebSnyanmisaka                                              sps->level_idc <= H264_LEVEL_3_0) ? 1 : 0;
770*437bfbebSnyanmisaka     regs->reg_base.rdo_cfg.vlc_lmt        = (sps->profile_idc < H264_PROFILE_MAIN) &&
771*437bfbebSnyanmisaka                                             !pps->entropy_coding_mode;
772*437bfbebSnyanmisaka     regs->reg_base.rdo_cfg.chrm_spcl      = 1;
773*437bfbebSnyanmisaka     regs->reg_base.rdo_cfg.ccwa_e         = 1;
774*437bfbebSnyanmisaka     regs->reg_base.rdo_cfg.scl_lst_sel    = pps->pic_scaling_matrix_present;
775*437bfbebSnyanmisaka     regs->reg_base.rdo_cfg.atf_e          = 1;
776*437bfbebSnyanmisaka     regs->reg_base.rdo_cfg.atr_e          = 1;
777*437bfbebSnyanmisaka     regs->reg_base.rdo_cfg.intra_cost_e   = 1;
778*437bfbebSnyanmisaka     regs->reg_base.iprd_csts.rdo_mark_mode       = 0x100;
779*437bfbebSnyanmisaka 
780*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
781*437bfbebSnyanmisaka }
782*437bfbebSnyanmisaka 
setup_vepu540c_rdo_cfg(vepu540c_rdo_cfg * reg)783*437bfbebSnyanmisaka static void setup_vepu540c_rdo_cfg(vepu540c_rdo_cfg *reg)
784*437bfbebSnyanmisaka {
785*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
786*437bfbebSnyanmisaka     rdo_skip_par *p_rdo_skip = NULL;
787*437bfbebSnyanmisaka     rdo_noskip_par *p_rdo_noskip = NULL;
788*437bfbebSnyanmisaka 
789*437bfbebSnyanmisaka     reg->rdo_smear_cfg_comb.rdo_smear_en      =  0;
790*437bfbebSnyanmisaka     reg->rdo_smear_cfg_comb.rdo_smear_lvl16_multi = 9;
791*437bfbebSnyanmisaka     reg->rdo_smear_cfg_comb.rdo_smear_dlt_qp      = 0 ;
792*437bfbebSnyanmisaka     reg->rdo_smear_cfg_comb.rdo_smear_order_state = 0;
793*437bfbebSnyanmisaka     reg->rdo_smear_cfg_comb.stated_mode           = 0;
794*437bfbebSnyanmisaka     reg->rdo_smear_cfg_comb.online_en             = 0;
795*437bfbebSnyanmisaka     reg->rdo_smear_cfg_comb.smear_stride          = 0;
796*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd0_comb.rdo_smear_madp_cur_thd0 =  0;
797*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd0_comb.rdo_smear_madp_cur_thd1 =  24;
798*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd1_comb.rdo_smear_madp_cur_thd2 =  48;
799*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd1_comb.rdo_smear_madp_cur_thd3 =  64;
800*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd2_comb.rdo_smear_madp_around_thd0 = 16;
801*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd2_comb.rdo_smear_madp_around_thd1 = 32;
802*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd3_comb.rdo_smear_madp_around_thd2 = 48;
803*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd3_comb.rdo_smear_madp_around_thd3 = 96;
804*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd4_comb.rdo_smear_madp_around_thd4 = 48;
805*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd4_comb.rdo_smear_madp_around_thd5 = 24;
806*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd5_comb.rdo_smear_madp_ref_thd0 =  96;
807*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd5_comb.rdo_smear_madp_ref_thd1 =  48;
808*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd0_comb.rdo_smear_cnt_cur_thd0    = 1;
809*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd0_comb.rdo_smear_cnt_cur_thd1    = 3;
810*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd0_comb.rdo_smear_cnt_cur_thd2    = 1;
811*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd0_comb.rdo_smear_cnt_cur_thd3    = 3;
812*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd1_comb.rdo_smear_cnt_around_thd0 = 1;
813*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd1_comb.rdo_smear_cnt_around_thd1 = 4;
814*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd1_comb.rdo_smear_cnt_around_thd2 = 1;
815*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd1_comb.rdo_smear_cnt_around_thd3 = 4;
816*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd2_comb.rdo_smear_cnt_around_thd4 = 0;
817*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd2_comb.rdo_smear_cnt_around_thd5 = 3;
818*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd2_comb.rdo_smear_cnt_around_thd6 = 0;
819*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd2_comb.rdo_smear_cnt_around_thd7 = 3;
820*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd3_comb.rdo_smear_cnt_ref_thd0    = 1 ;
821*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd3_comb.rdo_smear_cnt_ref_thd1    = 3;
822*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd0_comb.rdo_smear_resi_small_cur_th0    = 6;
823*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd0_comb.rdo_smear_resi_big_cur_th0      = 9;
824*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd0_comb.rdo_smear_resi_small_cur_th1    = 6;
825*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd0_comb.rdo_smear_resi_big_cur_th1      = 9;
826*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd1_comb.rdo_smear_resi_small_around_th0 = 6;
827*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd1_comb.rdo_smear_resi_big_around_th0   = 11;
828*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd1_comb.rdo_smear_resi_small_around_th1 = 6;
829*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd1_comb.rdo_smear_resi_big_around_th1   = 8;
830*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd2_comb.rdo_smear_resi_small_around_th2 = 9;
831*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd2_comb.rdo_smear_resi_big_around_th2   = 20;
832*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd2_comb.rdo_smear_resi_small_around_th3 = 6;
833*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd2_comb.rdo_smear_resi_big_around_th3  = 20;
834*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd3_comb.rdo_smear_resi_small_ref_th0  = 7;
835*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd3_comb.rdo_smear_resi_big_ref_th0 = 16;
836*437bfbebSnyanmisaka     reg->rdo_smear_st_thd0_comb.rdo_smear_resi_th0 = 10;
837*437bfbebSnyanmisaka     reg->rdo_smear_st_thd0_comb.rdo_smear_resi_th1 = 6;
838*437bfbebSnyanmisaka     reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th0 = 1;
839*437bfbebSnyanmisaka     reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th1 = 5;
840*437bfbebSnyanmisaka     reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th2 = 1;
841*437bfbebSnyanmisaka     reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th3 = 3;
842*437bfbebSnyanmisaka     reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th4 = 9;
843*437bfbebSnyanmisaka     reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th5 = 10;
844*437bfbebSnyanmisaka 
845*437bfbebSnyanmisaka     p_rdo_skip = &reg->rdo_b16_skip;
846*437bfbebSnyanmisaka     p_rdo_skip->atf_thd0.madp_thd0 = 1;
847*437bfbebSnyanmisaka     p_rdo_skip->atf_thd0.madp_thd1 = 10;
848*437bfbebSnyanmisaka     p_rdo_skip->atf_thd1.madp_thd2 = 15;
849*437bfbebSnyanmisaka     p_rdo_skip->atf_thd1.madp_thd3 = 25;
850*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt0.wgt0 = 20;
851*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt0.wgt1 = 16;
852*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt0.wgt2 = 16;
853*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt0.wgt3 = 16;
854*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt1.wgt4 = 16;
855*437bfbebSnyanmisaka 
856*437bfbebSnyanmisaka     p_rdo_noskip = &reg->rdo_b16_inter;
857*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd0 = 20;
858*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd1 = 40;
859*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd1.madp_thd2 = 72;
860*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt0 =        16;
861*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt1 =        16;
862*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt2 =        16;
863*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt3 =        16;
864*437bfbebSnyanmisaka 
865*437bfbebSnyanmisaka     p_rdo_noskip = &reg->rdo_b16_intra;
866*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd0 = 20;
867*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd1 = 40;
868*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd1.madp_thd2 = 72;
869*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt0 =        27;
870*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt1 =        25;
871*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt2 =        20;
872*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt3 =        16;
873*437bfbebSnyanmisaka 
874*437bfbebSnyanmisaka     reg->rdo_b16_intra_atf_cnt_thd_comb.thd0 = 1;
875*437bfbebSnyanmisaka     reg->rdo_b16_intra_atf_cnt_thd_comb.thd1 = 4;
876*437bfbebSnyanmisaka     reg->rdo_b16_intra_atf_cnt_thd_comb.thd2 = 1;
877*437bfbebSnyanmisaka     reg->rdo_b16_intra_atf_cnt_thd_comb.thd3 = 4;
878*437bfbebSnyanmisaka     reg->rdo_atf_resi_thd_comb.big_th0     = 16;
879*437bfbebSnyanmisaka     reg->rdo_atf_resi_thd_comb.big_th1     = 16;
880*437bfbebSnyanmisaka     reg->rdo_atf_resi_thd_comb.small_th0   = 8;
881*437bfbebSnyanmisaka     reg->rdo_atf_resi_thd_comb.small_th1   = 8;
882*437bfbebSnyanmisaka 
883*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
884*437bfbebSnyanmisaka }
885*437bfbebSnyanmisaka 
setup_vepu540c_rc_base(HalVepu540cRegSet * regs,HalH264eVepu540cCtx * ctx,EncRcTask * rc_task)886*437bfbebSnyanmisaka static void setup_vepu540c_rc_base(HalVepu540cRegSet *regs, HalH264eVepu540cCtx *ctx, EncRcTask *rc_task)
887*437bfbebSnyanmisaka {
888*437bfbebSnyanmisaka     H264eSps *sps = ctx->sps;
889*437bfbebSnyanmisaka     H264eSlice *slice = ctx->slice;
890*437bfbebSnyanmisaka     MppEncCfgSet *cfg = ctx->cfg;
891*437bfbebSnyanmisaka     MppEncRcCfg *rc = &cfg->rc;
892*437bfbebSnyanmisaka     MppEncHwCfg *hw = &cfg->hw;
893*437bfbebSnyanmisaka     EncRcTaskInfo *rc_info = &rc_task->info;
894*437bfbebSnyanmisaka     RK_S32 mb_w = sps->pic_width_in_mbs;
895*437bfbebSnyanmisaka     RK_S32 mb_h = sps->pic_height_in_mbs;
896*437bfbebSnyanmisaka     RK_U32 qp_target = rc_info->quality_target;
897*437bfbebSnyanmisaka     RK_U32 qp_min = rc_info->quality_min;
898*437bfbebSnyanmisaka     RK_U32 qp_max = rc_info->quality_max;
899*437bfbebSnyanmisaka     RK_U32 qpmap_mode = 1;
900*437bfbebSnyanmisaka     RK_S32 mb_target_bits_mul_16 = (rc_info->bit_target << 4) / (mb_w * mb_h);
901*437bfbebSnyanmisaka     RK_S32 mb_target_bits;
902*437bfbebSnyanmisaka     RK_S32 negative_bits_thd;
903*437bfbebSnyanmisaka     RK_S32 positive_bits_thd;
904*437bfbebSnyanmisaka 
905*437bfbebSnyanmisaka     hal_h264e_dbg_rc("bittarget %d qp [%d %d %d]\n", rc_info->bit_target,
906*437bfbebSnyanmisaka                      qp_min, qp_target, qp_max);
907*437bfbebSnyanmisaka 
908*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
909*437bfbebSnyanmisaka 
910*437bfbebSnyanmisaka     regs->reg_rc_roi.roi_qthd0.qpmin_area0    = qp_min;
911*437bfbebSnyanmisaka     regs->reg_rc_roi.roi_qthd0.qpmax_area0    = qp_max;
912*437bfbebSnyanmisaka     regs->reg_rc_roi.roi_qthd0.qpmin_area1    = qp_min;
913*437bfbebSnyanmisaka     regs->reg_rc_roi.roi_qthd0.qpmax_area1    = qp_max;
914*437bfbebSnyanmisaka     regs->reg_rc_roi.roi_qthd0.qpmin_area2    = qp_min;
915*437bfbebSnyanmisaka 
916*437bfbebSnyanmisaka     regs->reg_rc_roi.roi_qthd1.qpmax_area2    = qp_max;
917*437bfbebSnyanmisaka     regs->reg_rc_roi.roi_qthd1.qpmin_area3    = qp_min;
918*437bfbebSnyanmisaka     regs->reg_rc_roi.roi_qthd1.qpmax_area3    = qp_max;
919*437bfbebSnyanmisaka     regs->reg_rc_roi.roi_qthd1.qpmin_area4    = qp_min;
920*437bfbebSnyanmisaka     regs->reg_rc_roi.roi_qthd1.qpmax_area4    = qp_max;
921*437bfbebSnyanmisaka 
922*437bfbebSnyanmisaka     regs->reg_rc_roi.roi_qthd2.qpmin_area5    = qp_min;
923*437bfbebSnyanmisaka     regs->reg_rc_roi.roi_qthd2.qpmax_area5    = qp_max;
924*437bfbebSnyanmisaka     regs->reg_rc_roi.roi_qthd2.qpmin_area6    = qp_min;
925*437bfbebSnyanmisaka     regs->reg_rc_roi.roi_qthd2.qpmax_area6    = qp_max;
926*437bfbebSnyanmisaka     regs->reg_rc_roi.roi_qthd2.qpmin_area7    = qp_min;
927*437bfbebSnyanmisaka 
928*437bfbebSnyanmisaka     regs->reg_rc_roi.roi_qthd3.qpmax_area7    = qp_max;
929*437bfbebSnyanmisaka     regs->reg_rc_roi.roi_qthd3.qpmap_mode     = qpmap_mode;
930*437bfbebSnyanmisaka 
931*437bfbebSnyanmisaka     if (rc->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
932*437bfbebSnyanmisaka         regs->reg_base.enc_pic.pic_qp    = rc_info->quality_target;
933*437bfbebSnyanmisaka         regs->reg_base.rc_qp.rc_max_qp   = rc_info->quality_target;
934*437bfbebSnyanmisaka         regs->reg_base.rc_qp.rc_min_qp   = rc_info->quality_target;
935*437bfbebSnyanmisaka 
936*437bfbebSnyanmisaka         return;
937*437bfbebSnyanmisaka     }
938*437bfbebSnyanmisaka 
939*437bfbebSnyanmisaka     if (mb_target_bits_mul_16 >= 0x100000)
940*437bfbebSnyanmisaka         mb_target_bits_mul_16 = 0x50000;
941*437bfbebSnyanmisaka 
942*437bfbebSnyanmisaka     mb_target_bits = (mb_target_bits_mul_16 * mb_w) >> 4;
943*437bfbebSnyanmisaka     negative_bits_thd = 0 - 5 * mb_target_bits / 16;
944*437bfbebSnyanmisaka     positive_bits_thd = 5 * mb_target_bits / 16;
945*437bfbebSnyanmisaka 
946*437bfbebSnyanmisaka     regs->reg_base.enc_pic.pic_qp         = qp_target;
947*437bfbebSnyanmisaka 
948*437bfbebSnyanmisaka     regs->reg_base.rc_cfg.rc_en          = 1;
949*437bfbebSnyanmisaka     regs->reg_base.rc_cfg.aq_en          = 1;
950*437bfbebSnyanmisaka     regs->reg_base.rc_cfg.aq_mode        = 0;
951*437bfbebSnyanmisaka     regs->reg_base.rc_cfg.rc_ctu_num     = mb_w;
952*437bfbebSnyanmisaka 
953*437bfbebSnyanmisaka     regs->reg_base.rc_qp.rc_qp_range    = (slice->slice_type == H264_I_SLICE) ?
954*437bfbebSnyanmisaka                                           hw->qp_delta_row_i : hw->qp_delta_row;
955*437bfbebSnyanmisaka     regs->reg_base.rc_qp.rc_max_qp      = qp_max;
956*437bfbebSnyanmisaka     regs->reg_base.rc_qp.rc_min_qp      = qp_min;
957*437bfbebSnyanmisaka 
958*437bfbebSnyanmisaka     regs->reg_base.rc_tgt.ctu_ebit       = mb_target_bits_mul_16;
959*437bfbebSnyanmisaka 
960*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_adj0.qp_adj0        = -2;
961*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_adj0.qp_adj1        = -1;
962*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_adj0.qp_adj2        = 0;
963*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_adj0.qp_adj3        = 1;
964*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_adj0.qp_adj4        = 2;
965*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_adj1.qp_adj5        = 0;
966*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_adj1.qp_adj6        = 0;
967*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_adj1.qp_adj7        = 0;
968*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_adj1.qp_adj8        = 0;
969*437bfbebSnyanmisaka 
970*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_dthd_0_8[0] = 4 * negative_bits_thd;
971*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_dthd_0_8[1] = negative_bits_thd;
972*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_dthd_0_8[2] = positive_bits_thd;
973*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_dthd_0_8[3] = 4 * positive_bits_thd;
974*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_dthd_0_8[4] = 0x7FFFFFFF;
975*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_dthd_0_8[5] = 0x7FFFFFFF;
976*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_dthd_0_8[6] = 0x7FFFFFFF;
977*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_dthd_0_8[7] = 0x7FFFFFFF;
978*437bfbebSnyanmisaka     regs->reg_rc_roi.rc_dthd_0_8[8] = 0x7FFFFFFF;
979*437bfbebSnyanmisaka 
980*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
981*437bfbebSnyanmisaka }
982*437bfbebSnyanmisaka 
setup_vepu540c_io_buf(HalVepu540cRegSet * regs,MppDev dev,HalEncTask * task)983*437bfbebSnyanmisaka static void setup_vepu540c_io_buf(HalVepu540cRegSet *regs, MppDev dev,
984*437bfbebSnyanmisaka                                   HalEncTask *task)
985*437bfbebSnyanmisaka {
986*437bfbebSnyanmisaka     MppFrame frm = task->frame;
987*437bfbebSnyanmisaka     MppPacket pkt = task->packet;
988*437bfbebSnyanmisaka     MppBuffer buf_in = mpp_frame_get_buffer(frm);
989*437bfbebSnyanmisaka     MppBuffer buf_out = task->output;
990*437bfbebSnyanmisaka     MppFrameFormat fmt = mpp_frame_get_fmt(frm);
991*437bfbebSnyanmisaka     RK_S32 hor_stride = mpp_frame_get_hor_stride(frm);
992*437bfbebSnyanmisaka     RK_S32 ver_stride = mpp_frame_get_ver_stride(frm);
993*437bfbebSnyanmisaka     RK_S32 fd_in = mpp_buffer_get_fd(buf_in);
994*437bfbebSnyanmisaka     RK_U32 off_in[2] = {0};
995*437bfbebSnyanmisaka     RK_U32 off_out = mpp_packet_get_length(pkt);
996*437bfbebSnyanmisaka     size_t siz_out = mpp_buffer_get_size(buf_out);
997*437bfbebSnyanmisaka     RK_S32 fd_out = mpp_buffer_get_fd(buf_out);
998*437bfbebSnyanmisaka 
999*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
1000*437bfbebSnyanmisaka 
1001*437bfbebSnyanmisaka     regs->reg_base.adr_src0   = fd_in;
1002*437bfbebSnyanmisaka     regs->reg_base.adr_src1   = fd_in;
1003*437bfbebSnyanmisaka     regs->reg_base.adr_src2   = fd_in;
1004*437bfbebSnyanmisaka 
1005*437bfbebSnyanmisaka     regs->reg_base.bsbt_addr  = fd_out;
1006*437bfbebSnyanmisaka     regs->reg_base.bsbb_addr  = fd_out;
1007*437bfbebSnyanmisaka     regs->reg_base.adr_bsbs   = fd_out;
1008*437bfbebSnyanmisaka     regs->reg_base.bsbr_addr  = fd_out;
1009*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(dev, 172, siz_out);
1010*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(dev, 174, off_out);
1011*437bfbebSnyanmisaka 
1012*437bfbebSnyanmisaka     regs->reg_base.rfpt_h_addr = 0xffffffff;
1013*437bfbebSnyanmisaka     regs->reg_base.rfpb_h_addr = 0;
1014*437bfbebSnyanmisaka     regs->reg_base.rfpt_b_addr = 0xffffffff;
1015*437bfbebSnyanmisaka     regs->reg_base.adr_rfpb_b  = 0;
1016*437bfbebSnyanmisaka     if (MPP_FRAME_FMT_IS_FBC(fmt)) {
1017*437bfbebSnyanmisaka         off_in[0] = mpp_frame_get_fbc_offset(frm);;
1018*437bfbebSnyanmisaka         off_in[1] = 0;
1019*437bfbebSnyanmisaka     } else if (MPP_FRAME_FMT_IS_YUV(fmt)) {
1020*437bfbebSnyanmisaka         VepuFmtCfg cfg;
1021*437bfbebSnyanmisaka 
1022*437bfbebSnyanmisaka         vepu5xx_set_fmt(&cfg, fmt);
1023*437bfbebSnyanmisaka         switch (cfg.format) {
1024*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGRA8888 :
1025*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGR888 :
1026*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGR565 : {
1027*437bfbebSnyanmisaka             off_in[0] = 0;
1028*437bfbebSnyanmisaka             off_in[1] = 0;
1029*437bfbebSnyanmisaka         } break;
1030*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV420SP :
1031*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV422SP : {
1032*437bfbebSnyanmisaka             off_in[0] = hor_stride * ver_stride;
1033*437bfbebSnyanmisaka             off_in[1] = hor_stride * ver_stride;
1034*437bfbebSnyanmisaka         } break;
1035*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV422P : {
1036*437bfbebSnyanmisaka             off_in[0] = hor_stride * ver_stride;
1037*437bfbebSnyanmisaka             off_in[1] = hor_stride * ver_stride * 3 / 2;
1038*437bfbebSnyanmisaka         } break;
1039*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV420P : {
1040*437bfbebSnyanmisaka             off_in[0] = hor_stride * ver_stride;
1041*437bfbebSnyanmisaka             off_in[1] = hor_stride * ver_stride * 5 / 4;
1042*437bfbebSnyanmisaka         } break;
1043*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV400 :
1044*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUYV422 :
1045*437bfbebSnyanmisaka         case VEPU5xx_FMT_UYVY422 : {
1046*437bfbebSnyanmisaka             off_in[0] = 0;
1047*437bfbebSnyanmisaka             off_in[1] = 0;
1048*437bfbebSnyanmisaka         } break;
1049*437bfbebSnyanmisaka         default : {
1050*437bfbebSnyanmisaka             off_in[0] = 0;
1051*437bfbebSnyanmisaka             off_in[1] = 0;
1052*437bfbebSnyanmisaka         } break;
1053*437bfbebSnyanmisaka         }
1054*437bfbebSnyanmisaka     }
1055*437bfbebSnyanmisaka 
1056*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(dev, 161, off_in[0]);
1057*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(dev, 162, off_in[1]);
1058*437bfbebSnyanmisaka 
1059*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
1060*437bfbebSnyanmisaka }
1061*437bfbebSnyanmisaka 
setup_vepu540c_recn_refr(HalH264eVepu540cCtx * ctx,HalVepu540cRegSet * regs)1062*437bfbebSnyanmisaka static void setup_vepu540c_recn_refr(HalH264eVepu540cCtx *ctx, HalVepu540cRegSet *regs)
1063*437bfbebSnyanmisaka {
1064*437bfbebSnyanmisaka 
1065*437bfbebSnyanmisaka     MppDev dev = ctx->dev;
1066*437bfbebSnyanmisaka     H264eFrmInfo *frms = ctx->frms;
1067*437bfbebSnyanmisaka     HalBufs bufs = ctx->hw_recn;
1068*437bfbebSnyanmisaka     RK_S32 fbc_hdr_size = ctx->pixel_buf_fbc_hdr_size;
1069*437bfbebSnyanmisaka 
1070*437bfbebSnyanmisaka     HalBuf *curr = hal_bufs_get_buf(bufs, frms->curr_idx);
1071*437bfbebSnyanmisaka     HalBuf *refr = hal_bufs_get_buf(bufs, frms->refr_idx);
1072*437bfbebSnyanmisaka 
1073*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
1074*437bfbebSnyanmisaka 
1075*437bfbebSnyanmisaka     if (curr && curr->cnt) {
1076*437bfbebSnyanmisaka         MppBuffer buf_pixel = curr->buf[0];
1077*437bfbebSnyanmisaka         MppBuffer buf_thumb = curr->buf[1];
1078*437bfbebSnyanmisaka         RK_S32 fd = mpp_buffer_get_fd(buf_pixel);
1079*437bfbebSnyanmisaka 
1080*437bfbebSnyanmisaka         mpp_assert(buf_pixel);
1081*437bfbebSnyanmisaka         mpp_assert(buf_thumb);
1082*437bfbebSnyanmisaka 
1083*437bfbebSnyanmisaka         regs->reg_base.rfpw_h_addr = fd;
1084*437bfbebSnyanmisaka         regs->reg_base.rfpw_b_addr = fd;
1085*437bfbebSnyanmisaka         regs->reg_base.dspw_addr = mpp_buffer_get_fd(buf_thumb);
1086*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(dev, 164, fbc_hdr_size);
1087*437bfbebSnyanmisaka     }
1088*437bfbebSnyanmisaka 
1089*437bfbebSnyanmisaka     if (refr && refr->cnt) {
1090*437bfbebSnyanmisaka         MppBuffer buf_pixel = refr->buf[0];
1091*437bfbebSnyanmisaka         MppBuffer buf_thumb = refr->buf[1];
1092*437bfbebSnyanmisaka         RK_S32 fd = mpp_buffer_get_fd(buf_pixel);
1093*437bfbebSnyanmisaka 
1094*437bfbebSnyanmisaka         mpp_assert(buf_pixel);
1095*437bfbebSnyanmisaka         mpp_assert(buf_thumb);
1096*437bfbebSnyanmisaka 
1097*437bfbebSnyanmisaka         regs->reg_base.rfpr_h_addr = fd;
1098*437bfbebSnyanmisaka         regs->reg_base.rfpr_b_addr = fd;
1099*437bfbebSnyanmisaka         regs->reg_base.dspr_addr = mpp_buffer_get_fd(buf_thumb);
1100*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(dev, 166, fbc_hdr_size);
1101*437bfbebSnyanmisaka     }
1102*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
1103*437bfbebSnyanmisaka }
1104*437bfbebSnyanmisaka 
setup_vepu540c_split(HalVepu540cRegSet * regs,MppEncCfgSet * cfg)1105*437bfbebSnyanmisaka static void setup_vepu540c_split(HalVepu540cRegSet *regs, MppEncCfgSet *cfg)
1106*437bfbebSnyanmisaka {
1107*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
1108*437bfbebSnyanmisaka 
1109*437bfbebSnyanmisaka     switch (cfg->split.split_mode) {
1110*437bfbebSnyanmisaka     case MPP_ENC_SPLIT_NONE : {
1111*437bfbebSnyanmisaka         regs->reg_base.sli_splt.sli_splt = 0;
1112*437bfbebSnyanmisaka         regs->reg_base.sli_splt.sli_splt_mode = 0;
1113*437bfbebSnyanmisaka         regs->reg_base.sli_splt.sli_splt_cpst = 0;
1114*437bfbebSnyanmisaka         regs->reg_base.sli_splt.sli_max_num_m1 = 0;
1115*437bfbebSnyanmisaka         regs->reg_base.sli_splt.sli_flsh = 0;
1116*437bfbebSnyanmisaka         regs->reg_base.sli_cnum.sli_splt_cnum_m1 = 0;
1117*437bfbebSnyanmisaka 
1118*437bfbebSnyanmisaka         regs->reg_base.sli_byte.sli_splt_byte = 0;
1119*437bfbebSnyanmisaka         regs->reg_base.enc_pic.slen_fifo = 0;
1120*437bfbebSnyanmisaka     } break;
1121*437bfbebSnyanmisaka     case MPP_ENC_SPLIT_BY_BYTE : {
1122*437bfbebSnyanmisaka         regs->reg_base.sli_splt.sli_splt = 1;
1123*437bfbebSnyanmisaka         regs->reg_base.sli_splt.sli_splt_mode = 0;
1124*437bfbebSnyanmisaka         regs->reg_base.sli_splt.sli_splt_cpst = 0;
1125*437bfbebSnyanmisaka         regs->reg_base.sli_splt.sli_max_num_m1 = 500;
1126*437bfbebSnyanmisaka         regs->reg_base.sli_splt.sli_flsh = 1;
1127*437bfbebSnyanmisaka         regs->reg_base.sli_cnum.sli_splt_cnum_m1 = 0;
1128*437bfbebSnyanmisaka 
1129*437bfbebSnyanmisaka         regs->reg_base.sli_byte.sli_splt_byte = cfg->split.split_arg;
1130*437bfbebSnyanmisaka         regs->reg_base.enc_pic.slen_fifo = 0;
1131*437bfbebSnyanmisaka         regs->reg_base.enc_pic.slen_fifo = cfg->split.split_out ? 1 : 0;
1132*437bfbebSnyanmisaka         regs->reg_ctl.int_en.vslc_done_en = regs->reg_base.enc_pic.slen_fifo;
1133*437bfbebSnyanmisaka     } break;
1134*437bfbebSnyanmisaka     case MPP_ENC_SPLIT_BY_CTU : {
1135*437bfbebSnyanmisaka         RK_U32 mb_w = MPP_ALIGN(cfg->prep.width, 16) / 16;
1136*437bfbebSnyanmisaka         RK_U32 mb_h = MPP_ALIGN(cfg->prep.height, 16) / 16;
1137*437bfbebSnyanmisaka         RK_U32 slice_num = (mb_w * mb_h + cfg->split.split_arg - 1) / cfg->split.split_arg;
1138*437bfbebSnyanmisaka 
1139*437bfbebSnyanmisaka         regs->reg_base.sli_splt.sli_splt = 1;
1140*437bfbebSnyanmisaka         regs->reg_base.sli_splt.sli_splt_mode = 1;
1141*437bfbebSnyanmisaka         regs->reg_base.sli_splt.sli_splt_cpst = 0;
1142*437bfbebSnyanmisaka         regs->reg_base.sli_splt.sli_max_num_m1 = 500;
1143*437bfbebSnyanmisaka         regs->reg_base.sli_splt.sli_flsh = 1;
1144*437bfbebSnyanmisaka         regs->reg_base.sli_cnum.sli_splt_cnum_m1 = cfg->split.split_arg - 1;
1145*437bfbebSnyanmisaka 
1146*437bfbebSnyanmisaka         regs->reg_base.sli_byte.sli_splt_byte = 0;
1147*437bfbebSnyanmisaka         regs->reg_base.enc_pic.slen_fifo = cfg->split.split_out ? 1 : 0;
1148*437bfbebSnyanmisaka         if ((cfg->split.split_out & MPP_ENC_SPLIT_OUT_LOWDELAY) ||
1149*437bfbebSnyanmisaka             (regs->reg_base.enc_pic.slen_fifo && (slice_num > VEPU540C_SLICE_FIFO_LEN)))
1150*437bfbebSnyanmisaka             regs->reg_ctl.int_en.vslc_done_en = 1;
1151*437bfbebSnyanmisaka     } break;
1152*437bfbebSnyanmisaka     default : {
1153*437bfbebSnyanmisaka         mpp_log_f("invalide slice split mode %d\n", cfg->split.split_mode);
1154*437bfbebSnyanmisaka     } break;
1155*437bfbebSnyanmisaka     }
1156*437bfbebSnyanmisaka 
1157*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
1158*437bfbebSnyanmisaka }
1159*437bfbebSnyanmisaka 
calc_cime_parameter(HalVepu540cRegSet * regs)1160*437bfbebSnyanmisaka static void calc_cime_parameter(HalVepu540cRegSet *regs)
1161*437bfbebSnyanmisaka {
1162*437bfbebSnyanmisaka     Vepu540cBaseCfg *base_regs = &regs->reg_base;
1163*437bfbebSnyanmisaka     RK_S32 x_gmv = 0;
1164*437bfbebSnyanmisaka     RK_S32 y_gmv = 0;
1165*437bfbebSnyanmisaka     RK_S32 srch_lftw , srch_rgtw, srch_uph, srch_dwnh;
1166*437bfbebSnyanmisaka     RK_S32 frm_sta = 0, frm_end = 0, pic_w = 0;
1167*437bfbebSnyanmisaka     RK_S32 pic_wdt_align =  ((base_regs->enc_rsl.pic_wd8_m1 + 1) * 8 + 63) / 64 * 2;
1168*437bfbebSnyanmisaka 
1169*437bfbebSnyanmisaka 
1170*437bfbebSnyanmisaka     srch_lftw = base_regs->me_rnge.cime_srch_lftw * 4;
1171*437bfbebSnyanmisaka     srch_rgtw = base_regs->me_rnge.cime_srch_rgtw * 4;
1172*437bfbebSnyanmisaka     srch_uph = base_regs->me_rnge.cime_srch_uph * 2;
1173*437bfbebSnyanmisaka     srch_dwnh =  base_regs->me_rnge.cime_srch_dwnh * 2;
1174*437bfbebSnyanmisaka 
1175*437bfbebSnyanmisaka     // calc cime_linebuf_w
1176*437bfbebSnyanmisaka     {
1177*437bfbebSnyanmisaka         {
1178*437bfbebSnyanmisaka             if (x_gmv - srch_lftw < 0) {
1179*437bfbebSnyanmisaka                 frm_sta = 0;
1180*437bfbebSnyanmisaka             } else {
1181*437bfbebSnyanmisaka                 frm_sta = (x_gmv - srch_lftw) / 16;
1182*437bfbebSnyanmisaka             }
1183*437bfbebSnyanmisaka             if (x_gmv + srch_rgtw < 0) {
1184*437bfbebSnyanmisaka                 frm_end = pic_wdt_align - 1 + (x_gmv + srch_rgtw) / 16;
1185*437bfbebSnyanmisaka             } else {
1186*437bfbebSnyanmisaka                 frm_end = pic_wdt_align - 1 + (x_gmv + srch_rgtw + 15) / 16;
1187*437bfbebSnyanmisaka             }
1188*437bfbebSnyanmisaka         }
1189*437bfbebSnyanmisaka         if (frm_sta < 0) {
1190*437bfbebSnyanmisaka             frm_sta = 0;
1191*437bfbebSnyanmisaka         } else if (frm_sta > pic_wdt_align - 1) {
1192*437bfbebSnyanmisaka             frm_sta = pic_wdt_align - 1;
1193*437bfbebSnyanmisaka         }
1194*437bfbebSnyanmisaka         frm_end = mpp_clip(frm_end, 0, pic_wdt_align - 1);
1195*437bfbebSnyanmisaka         pic_w = (frm_end - frm_sta + 1) * 32;
1196*437bfbebSnyanmisaka         base_regs->me_cach.cme_linebuf_w = pic_w / 32;
1197*437bfbebSnyanmisaka     }
1198*437bfbebSnyanmisaka 
1199*437bfbebSnyanmisaka     // calc cime_rama_h and cime_rama_max
1200*437bfbebSnyanmisaka     {
1201*437bfbebSnyanmisaka         RK_U32 rama_size = 1796;
1202*437bfbebSnyanmisaka         RK_U32 ramb_h;
1203*437bfbebSnyanmisaka         RK_U32 ctu_2_h = 2;
1204*437bfbebSnyanmisaka         RK_U32 cur_srch_8_w, cur_srch_2_h, cur_srch_h;
1205*437bfbebSnyanmisaka 
1206*437bfbebSnyanmisaka 
1207*437bfbebSnyanmisaka         if ((y_gmv % 4 - srch_uph % 4) < 0) {
1208*437bfbebSnyanmisaka             cur_srch_2_h = (4 + (y_gmv % 4 - srch_uph % 4) % 4 + srch_uph + srch_dwnh) / 2 + ctu_2_h;
1209*437bfbebSnyanmisaka         } else {
1210*437bfbebSnyanmisaka             cur_srch_2_h = ((y_gmv % 4 - srch_uph % 4) % 4 + srch_uph + srch_dwnh) / 2 + ctu_2_h;
1211*437bfbebSnyanmisaka         }
1212*437bfbebSnyanmisaka         base_regs->me_cach.cime_size_rama = (cur_srch_2_h + 1) / 2 * 2;
1213*437bfbebSnyanmisaka 
1214*437bfbebSnyanmisaka         if ((x_gmv % 16 - srch_lftw % 16) < 0) {
1215*437bfbebSnyanmisaka             cur_srch_8_w = ((16 + (x_gmv % 16 - srch_lftw % 16) % 16 + srch_lftw + srch_rgtw + 15) / 16 + 1) * 2;
1216*437bfbebSnyanmisaka         } else {
1217*437bfbebSnyanmisaka             cur_srch_8_w = (((x_gmv % 16 - srch_lftw % 16) % 16 + srch_lftw + srch_rgtw + 15) / 16 + 1) * 2;
1218*437bfbebSnyanmisaka         }
1219*437bfbebSnyanmisaka 
1220*437bfbebSnyanmisaka         cur_srch_h = ctu_2_h;
1221*437bfbebSnyanmisaka         ramb_h = cur_srch_2_h;
1222*437bfbebSnyanmisaka         while ((rama_size > ((cur_srch_h - ctu_2_h) * base_regs->me_cach.cme_linebuf_w + (ramb_h * cur_srch_8_w)))
1223*437bfbebSnyanmisaka                && (cur_srch_h < base_regs->me_cach.cime_size_rama)) {
1224*437bfbebSnyanmisaka             cur_srch_h = cur_srch_h + ctu_2_h;
1225*437bfbebSnyanmisaka             if (ramb_h > ctu_2_h * 2) {
1226*437bfbebSnyanmisaka                 ramb_h = ramb_h - ctu_2_h;
1227*437bfbebSnyanmisaka             } else {
1228*437bfbebSnyanmisaka                 ramb_h = ctu_2_h;
1229*437bfbebSnyanmisaka             }
1230*437bfbebSnyanmisaka         }
1231*437bfbebSnyanmisaka 
1232*437bfbebSnyanmisaka         if (cur_srch_2_h == ctu_2_h * 2) {
1233*437bfbebSnyanmisaka             cur_srch_h = cur_srch_h + ctu_2_h;
1234*437bfbebSnyanmisaka             ramb_h = ctu_2_h;
1235*437bfbebSnyanmisaka         }
1236*437bfbebSnyanmisaka         if (rama_size < ((cur_srch_h - ctu_2_h) * base_regs->me_cach.cme_linebuf_w + (ramb_h * cur_srch_8_w))) {
1237*437bfbebSnyanmisaka             cur_srch_h = cur_srch_h - ctu_2_h;
1238*437bfbebSnyanmisaka         }
1239*437bfbebSnyanmisaka         base_regs->me_cach.cime_size_rama = ((cur_srch_h - ctu_2_h) * base_regs->me_cach.cme_linebuf_w + ctu_2_h * cur_srch_8_w) / 2;
1240*437bfbebSnyanmisaka         base_regs->me_cach.cime_hgt_rama = cur_srch_h / 2;
1241*437bfbebSnyanmisaka     }
1242*437bfbebSnyanmisaka 
1243*437bfbebSnyanmisaka }
1244*437bfbebSnyanmisaka 
setup_vepu540c_me(HalVepu540cRegSet * regs,H264eSps * sps,H264eSlice * slice)1245*437bfbebSnyanmisaka static void setup_vepu540c_me(HalVepu540cRegSet *regs, H264eSps *sps,
1246*437bfbebSnyanmisaka                               H264eSlice *slice)
1247*437bfbebSnyanmisaka {
1248*437bfbebSnyanmisaka     (void)sps;
1249*437bfbebSnyanmisaka     (void)slice;
1250*437bfbebSnyanmisaka     regs->reg_base.me_rnge.cime_srch_dwnh = 15;
1251*437bfbebSnyanmisaka     regs->reg_base.me_rnge.cime_srch_uph = 14;
1252*437bfbebSnyanmisaka     regs->reg_base.me_rnge.cime_srch_rgtw = 12;
1253*437bfbebSnyanmisaka     regs->reg_base.me_rnge.cime_srch_lftw = 12;
1254*437bfbebSnyanmisaka     regs->reg_base.me_cfg.rme_srch_h    = 3;
1255*437bfbebSnyanmisaka     regs->reg_base.me_cfg.rme_srch_v    = 3;
1256*437bfbebSnyanmisaka 
1257*437bfbebSnyanmisaka     regs->reg_base.me_cfg.srgn_max_num    = 72;
1258*437bfbebSnyanmisaka     regs->reg_base.me_cfg.cime_dist_thre    = 1024;
1259*437bfbebSnyanmisaka     regs->reg_base.me_cfg.rme_dis      = 0;
1260*437bfbebSnyanmisaka     regs->reg_base.me_cfg.fme_dis        = 0;
1261*437bfbebSnyanmisaka     regs->reg_base.me_rnge.dlt_frm_num    = 0x0;
1262*437bfbebSnyanmisaka     calc_cime_parameter(regs);
1263*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
1264*437bfbebSnyanmisaka }
1265*437bfbebSnyanmisaka 
1266*437bfbebSnyanmisaka #define H264E_LAMBDA_TAB_SIZE       (52 * sizeof(RK_U32))
1267*437bfbebSnyanmisaka 
1268*437bfbebSnyanmisaka static RK_U32 h264e_lambda_default[58] = {
1269*437bfbebSnyanmisaka     0x00000003, 0x00000005, 0x00000006, 0x00000007,
1270*437bfbebSnyanmisaka     0x00000009, 0x0000000b, 0x0000000e, 0x00000012,
1271*437bfbebSnyanmisaka     0x00000016, 0x0000001c, 0x00000024, 0x0000002d,
1272*437bfbebSnyanmisaka     0x00000039, 0x00000048, 0x0000005b, 0x00000073,
1273*437bfbebSnyanmisaka     0x00000091, 0x000000b6, 0x000000e6, 0x00000122,
1274*437bfbebSnyanmisaka     0x0000016d, 0x000001cc, 0x00000244, 0x000002db,
1275*437bfbebSnyanmisaka     0x00000399, 0x00000489, 0x000005b6, 0x00000733,
1276*437bfbebSnyanmisaka     0x00000912, 0x00000b6d, 0x00000e66, 0x00001224,
1277*437bfbebSnyanmisaka     0x000016db, 0x00001ccc, 0x00002449, 0x00002db7,
1278*437bfbebSnyanmisaka     0x00003999, 0x00004892, 0x00005b6f, 0x00007333,
1279*437bfbebSnyanmisaka     0x00009124, 0x0000b6de, 0x0000e666, 0x00012249,
1280*437bfbebSnyanmisaka     0x00016dbc, 0x0001cccc, 0x00024492, 0x0002db79,
1281*437bfbebSnyanmisaka     0x00039999, 0x00048924, 0x0005b6f2, 0x00073333,
1282*437bfbebSnyanmisaka     0x00091249, 0x000b6de5, 0x000e6666, 0x00122492,
1283*437bfbebSnyanmisaka     0x0016dbcb, 0x001ccccc,
1284*437bfbebSnyanmisaka };
1285*437bfbebSnyanmisaka 
setup_vepu540c_l2(HalVepu540cRegSet * regs,H264eSlice * slice,MppEncHwCfg * hw)1286*437bfbebSnyanmisaka static void setup_vepu540c_l2(HalVepu540cRegSet *regs, H264eSlice *slice, MppEncHwCfg *hw)
1287*437bfbebSnyanmisaka {
1288*437bfbebSnyanmisaka     RK_U32 i;
1289*437bfbebSnyanmisaka 
1290*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
1291*437bfbebSnyanmisaka 
1292*437bfbebSnyanmisaka     memcpy(regs->reg_s3.rdo_wgta_qp_grpa_0_51, &h264e_lambda_default[6], H264E_LAMBDA_TAB_SIZE);
1293*437bfbebSnyanmisaka 
1294*437bfbebSnyanmisaka     if (hw->qbias_en) {
1295*437bfbebSnyanmisaka         regs->reg_s3.RDO_QUANT.quant_f_bias_I = hw->qbias_i;
1296*437bfbebSnyanmisaka         regs->reg_s3.RDO_QUANT.quant_f_bias_P = hw->qbias_p;
1297*437bfbebSnyanmisaka     } else {
1298*437bfbebSnyanmisaka         regs->reg_s3.RDO_QUANT.quant_f_bias_I = 683;
1299*437bfbebSnyanmisaka         regs->reg_s3.RDO_QUANT.quant_f_bias_P = 341;
1300*437bfbebSnyanmisaka     }
1301*437bfbebSnyanmisaka     regs->reg_s3.iprd_tthdy4_0.iprd_tthdy4_0 = 1;
1302*437bfbebSnyanmisaka     regs->reg_s3.iprd_tthdy4_0.iprd_tthdy4_1 = 3;
1303*437bfbebSnyanmisaka     regs->reg_s3.iprd_tthdy4_1.iprd_tthdy4_2 = 6;
1304*437bfbebSnyanmisaka     regs->reg_s3.iprd_tthdy4_1.iprd_tthdy4_3 = 8;
1305*437bfbebSnyanmisaka     regs->reg_s3.iprd_tthdc8_0.iprd_tthdc8_0 = 1;
1306*437bfbebSnyanmisaka     regs->reg_s3.iprd_tthdc8_0.iprd_tthdc8_1 = 3;
1307*437bfbebSnyanmisaka     regs->reg_s3.iprd_tthdc8_1.iprd_tthdc8_2 = 6;
1308*437bfbebSnyanmisaka     regs->reg_s3.iprd_tthdc8_1.iprd_tthdc8_3 = 8;
1309*437bfbebSnyanmisaka     regs->reg_s3.iprd_tthdy8_0.iprd_tthdy8_0 = 1;
1310*437bfbebSnyanmisaka     regs->reg_s3.iprd_tthdy8_0.iprd_tthdy8_1 = 3;
1311*437bfbebSnyanmisaka     regs->reg_s3.iprd_tthdy8_1.iprd_tthdy8_2 = 6;
1312*437bfbebSnyanmisaka     regs->reg_s3.iprd_tthdy8_1.iprd_tthdy8_3 = 8;
1313*437bfbebSnyanmisaka     regs->reg_s3.iprd_tthd_ul.iprd_tthd_ul = 4;
1314*437bfbebSnyanmisaka     regs->reg_s3.iprd_wgty8.iprd_wgty8_0 = 22;
1315*437bfbebSnyanmisaka     regs->reg_s3.iprd_wgty8.iprd_wgty8_1 = 23;
1316*437bfbebSnyanmisaka     regs->reg_s3.iprd_wgty8.iprd_wgty8_2 = 20;
1317*437bfbebSnyanmisaka     regs->reg_s3.iprd_wgty8.iprd_wgty8_3 = 22;
1318*437bfbebSnyanmisaka     regs->reg_s3.iprd_wgty4.iprd_wgty4_0 = 22;
1319*437bfbebSnyanmisaka     regs->reg_s3.iprd_wgty4.iprd_wgty4_1 = 26;
1320*437bfbebSnyanmisaka     regs->reg_s3.iprd_wgty4.iprd_wgty4_2 = 20;
1321*437bfbebSnyanmisaka     regs->reg_s3.iprd_wgty4.iprd_wgty4_3 = 22;
1322*437bfbebSnyanmisaka     regs->reg_s3.iprd_wgty16.iprd_wgty16_0 = 22;
1323*437bfbebSnyanmisaka     regs->reg_s3.iprd_wgty16.iprd_wgty16_1 = 26;
1324*437bfbebSnyanmisaka     regs->reg_s3.iprd_wgty16.iprd_wgty16_2 = 20;
1325*437bfbebSnyanmisaka     regs->reg_s3.iprd_wgty16.iprd_wgty16_3 = 22;
1326*437bfbebSnyanmisaka     regs->reg_s3.iprd_wgtc8.iprd_wgtc8_0 = 18;
1327*437bfbebSnyanmisaka     regs->reg_s3.iprd_wgtc8.iprd_wgtc8_1 = 21;
1328*437bfbebSnyanmisaka     regs->reg_s3.iprd_wgtc8.iprd_wgtc8_2 = 20;
1329*437bfbebSnyanmisaka     regs->reg_s3.iprd_wgtc8.iprd_wgtc8_3 = 19;
1330*437bfbebSnyanmisaka 
1331*437bfbebSnyanmisaka 
1332*437bfbebSnyanmisaka     if (slice->slice_type == H264_I_SLICE) {
1333*437bfbebSnyanmisaka         regs->reg_s3.ATR_THD0.atr_thd0 = 1;
1334*437bfbebSnyanmisaka         regs->reg_s3.ATR_THD0.atr_thd1 = 2;
1335*437bfbebSnyanmisaka         regs->reg_s3.ATR_THD1.atr_thd2 = 6;
1336*437bfbebSnyanmisaka     } else {
1337*437bfbebSnyanmisaka         regs->reg_s3.ATR_THD0.atr_thd0 = 2;
1338*437bfbebSnyanmisaka         regs->reg_s3.ATR_THD0.atr_thd1 = 4;
1339*437bfbebSnyanmisaka         regs->reg_s3.ATR_THD1.atr_thd2 = 9;
1340*437bfbebSnyanmisaka     }
1341*437bfbebSnyanmisaka     regs->reg_s3.ATR_THD1.atr_thdqp = 32;
1342*437bfbebSnyanmisaka 
1343*437bfbebSnyanmisaka     if (slice->slice_type == H264_I_SLICE) {
1344*437bfbebSnyanmisaka         regs->reg_s3.Lvl16_ATR_WGT.lvl16_atr_wgt0 = 16;
1345*437bfbebSnyanmisaka         regs->reg_s3.Lvl16_ATR_WGT.lvl16_atr_wgt1 = 16;
1346*437bfbebSnyanmisaka         regs->reg_s3.Lvl16_ATR_WGT.lvl16_atr_wgt2 = 16;
1347*437bfbebSnyanmisaka 
1348*437bfbebSnyanmisaka         regs->reg_s3.Lvl8_ATR_WGT.lvl8_atr_wgt0 = 22;
1349*437bfbebSnyanmisaka         regs->reg_s3.Lvl8_ATR_WGT.lvl8_atr_wgt1 = 21;
1350*437bfbebSnyanmisaka         regs->reg_s3.Lvl8_ATR_WGT.lvl8_atr_wgt2 = 20;
1351*437bfbebSnyanmisaka 
1352*437bfbebSnyanmisaka         regs->reg_s3.Lvl4_ATR_WGT.lvl4_atr_wgt0 = 20;
1353*437bfbebSnyanmisaka         regs->reg_s3.Lvl4_ATR_WGT.lvl4_atr_wgt1 = 18;
1354*437bfbebSnyanmisaka         regs->reg_s3.Lvl4_ATR_WGT.lvl4_atr_wgt2 = 16;
1355*437bfbebSnyanmisaka     } else {
1356*437bfbebSnyanmisaka         regs->reg_s3.Lvl16_ATR_WGT.lvl16_atr_wgt0 = 25;
1357*437bfbebSnyanmisaka         regs->reg_s3.Lvl16_ATR_WGT.lvl16_atr_wgt1 = 20;
1358*437bfbebSnyanmisaka         regs->reg_s3.Lvl16_ATR_WGT.lvl16_atr_wgt2 = 16;
1359*437bfbebSnyanmisaka 
1360*437bfbebSnyanmisaka         regs->reg_s3.Lvl8_ATR_WGT.lvl8_atr_wgt0 = 25;
1361*437bfbebSnyanmisaka         regs->reg_s3.Lvl8_ATR_WGT.lvl8_atr_wgt1 = 20;
1362*437bfbebSnyanmisaka         regs->reg_s3.Lvl8_ATR_WGT.lvl8_atr_wgt2 = 18;
1363*437bfbebSnyanmisaka 
1364*437bfbebSnyanmisaka         regs->reg_s3.Lvl4_ATR_WGT.lvl4_atr_wgt0 = 25;
1365*437bfbebSnyanmisaka         regs->reg_s3.Lvl4_ATR_WGT.lvl4_atr_wgt1 = 20;
1366*437bfbebSnyanmisaka         regs->reg_s3.Lvl4_ATR_WGT.lvl4_atr_wgt2 = 16;
1367*437bfbebSnyanmisaka     }
1368*437bfbebSnyanmisaka     /* CIME */
1369*437bfbebSnyanmisaka     {
1370*437bfbebSnyanmisaka         /* 0x1760 */
1371*437bfbebSnyanmisaka         regs->reg_s3.cime_sqi_cfg.cime_pmv_num = 1;
1372*437bfbebSnyanmisaka         regs->reg_s3.cime_sqi_cfg.cime_fuse   = 1;
1373*437bfbebSnyanmisaka         regs->reg_s3.cime_sqi_cfg.itp_mode    = 0;
1374*437bfbebSnyanmisaka         regs->reg_s3.cime_sqi_cfg.move_lambda = 0;
1375*437bfbebSnyanmisaka         regs->reg_s3.cime_sqi_cfg.rime_lvl_mrg     = 0;
1376*437bfbebSnyanmisaka         regs->reg_s3.cime_sqi_cfg.rime_prelvl_en   = 0;
1377*437bfbebSnyanmisaka         regs->reg_s3.cime_sqi_cfg.rime_prersu_en   = 0;
1378*437bfbebSnyanmisaka 
1379*437bfbebSnyanmisaka         /* 0x1764 */
1380*437bfbebSnyanmisaka         regs->reg_s3.cime_mvd_th.cime_mvd_th0 = 16;
1381*437bfbebSnyanmisaka         regs->reg_s3.cime_mvd_th.cime_mvd_th1 = 48;
1382*437bfbebSnyanmisaka         regs->reg_s3.cime_mvd_th.cime_mvd_th2 = 80;
1383*437bfbebSnyanmisaka 
1384*437bfbebSnyanmisaka         /* 0x1768 */
1385*437bfbebSnyanmisaka         regs->reg_s3.cime_madp_th.cime_madp_th = 16;
1386*437bfbebSnyanmisaka 
1387*437bfbebSnyanmisaka         /* 0x176c */
1388*437bfbebSnyanmisaka         regs->reg_s3.cime_multi.cime_multi0 = 8;
1389*437bfbebSnyanmisaka         regs->reg_s3.cime_multi.cime_multi1 = 12;
1390*437bfbebSnyanmisaka         regs->reg_s3.cime_multi.cime_multi2 = 16;
1391*437bfbebSnyanmisaka         regs->reg_s3.cime_multi.cime_multi3 = 20;
1392*437bfbebSnyanmisaka     }
1393*437bfbebSnyanmisaka 
1394*437bfbebSnyanmisaka     /* RIME && FME */
1395*437bfbebSnyanmisaka     {
1396*437bfbebSnyanmisaka         /* 0x1770 */
1397*437bfbebSnyanmisaka         regs->reg_s3.rime_mvd_th.rime_mvd_th0  = 1;
1398*437bfbebSnyanmisaka         regs->reg_s3.rime_mvd_th.rime_mvd_th1  = 2;
1399*437bfbebSnyanmisaka         regs->reg_s3.rime_mvd_th.fme_madp_th   = 0;
1400*437bfbebSnyanmisaka 
1401*437bfbebSnyanmisaka         /* 0x1774 */
1402*437bfbebSnyanmisaka         regs->reg_s3.rime_madp_th.rime_madp_th0 = 8;
1403*437bfbebSnyanmisaka         regs->reg_s3.rime_madp_th.rime_madp_th1 = 16;
1404*437bfbebSnyanmisaka 
1405*437bfbebSnyanmisaka         /* 0x1778 */
1406*437bfbebSnyanmisaka         regs->reg_s3.rime_multi.rime_multi0 = 4;
1407*437bfbebSnyanmisaka         regs->reg_s3.rime_multi.rime_multi1 = 8;
1408*437bfbebSnyanmisaka         regs->reg_s3.rime_multi.rime_multi2 = 12;
1409*437bfbebSnyanmisaka 
1410*437bfbebSnyanmisaka         /* 0x177C */
1411*437bfbebSnyanmisaka         regs->reg_s3.cmv_st_th.cmv_th0 = 64;
1412*437bfbebSnyanmisaka         regs->reg_s3.cmv_st_th.cmv_th1 = 96;
1413*437bfbebSnyanmisaka         regs->reg_s3.cmv_st_th.cmv_th2 = 128;
1414*437bfbebSnyanmisaka     }
1415*437bfbebSnyanmisaka     /* madi and madp */
1416*437bfbebSnyanmisaka     {
1417*437bfbebSnyanmisaka         /* 0x1064 */
1418*437bfbebSnyanmisaka         regs->reg_rc_roi.madi_st_thd.madi_th0 = 5;
1419*437bfbebSnyanmisaka         regs->reg_rc_roi.madi_st_thd.madi_th1 = 12;
1420*437bfbebSnyanmisaka         regs->reg_rc_roi.madi_st_thd.madi_th2 = 20;
1421*437bfbebSnyanmisaka         /* 0x1068 */
1422*437bfbebSnyanmisaka         regs->reg_rc_roi.madp_st_thd0.madp_th0 = 4 << 4;
1423*437bfbebSnyanmisaka         regs->reg_rc_roi.madp_st_thd0.madp_th1 = 9 << 4;
1424*437bfbebSnyanmisaka         /* 0x106C */
1425*437bfbebSnyanmisaka         regs->reg_rc_roi.madp_st_thd1.madp_th2 = 15 << 4;
1426*437bfbebSnyanmisaka     }
1427*437bfbebSnyanmisaka 
1428*437bfbebSnyanmisaka     if (slice->slice_type == H264_I_SLICE) {
1429*437bfbebSnyanmisaka         for (i = 0; i < MPP_ARRAY_ELEMS(h264_aq_tthd_default); i++) {
1430*437bfbebSnyanmisaka             regs->reg_rc_roi.aq_tthd[i] = hw->aq_thrd_i[i];
1431*437bfbebSnyanmisaka             regs->reg_rc_roi.aq_step[i] = hw->aq_step_i[i] & 0x3f;
1432*437bfbebSnyanmisaka         }
1433*437bfbebSnyanmisaka     } else {
1434*437bfbebSnyanmisaka         for (i = 0; i < MPP_ARRAY_ELEMS(h264_P_aq_step_default); i++) {
1435*437bfbebSnyanmisaka             regs->reg_rc_roi.aq_tthd[i] = hw->aq_thrd_p[i];
1436*437bfbebSnyanmisaka             regs->reg_rc_roi.aq_step[i] = hw->aq_step_p[i] & 0x3f;
1437*437bfbebSnyanmisaka         }
1438*437bfbebSnyanmisaka     }
1439*437bfbebSnyanmisaka 
1440*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
1441*437bfbebSnyanmisaka }
1442*437bfbebSnyanmisaka 
setup_vepu540c_ext_line_buf(HalVepu540cRegSet * regs,HalH264eVepu540cCtx * ctx)1443*437bfbebSnyanmisaka static void setup_vepu540c_ext_line_buf(HalVepu540cRegSet *regs, HalH264eVepu540cCtx *ctx)
1444*437bfbebSnyanmisaka {
1445*437bfbebSnyanmisaka     if (ctx->ext_line_buf) {
1446*437bfbebSnyanmisaka         RK_S32 fd = mpp_buffer_get_fd(ctx->ext_line_buf);
1447*437bfbebSnyanmisaka 
1448*437bfbebSnyanmisaka         regs->reg_base.ebuft_addr = fd;
1449*437bfbebSnyanmisaka         regs->reg_base.ebufb_addr = fd;
1450*437bfbebSnyanmisaka 
1451*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(ctx->dev, 178, ctx->ext_line_buf_size);
1452*437bfbebSnyanmisaka     } else {
1453*437bfbebSnyanmisaka         regs->reg_base.ebuft_addr = 0;
1454*437bfbebSnyanmisaka         regs->reg_base.ebufb_addr = 0;
1455*437bfbebSnyanmisaka     }
1456*437bfbebSnyanmisaka }
1457*437bfbebSnyanmisaka 
hal_h264e_vepu540c_gen_regs(void * hal,HalEncTask * task)1458*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu540c_gen_regs(void *hal, HalEncTask *task)
1459*437bfbebSnyanmisaka {
1460*437bfbebSnyanmisaka     HalH264eVepu540cCtx *ctx = (HalH264eVepu540cCtx *)hal;
1461*437bfbebSnyanmisaka     HalVepu540cRegSet *regs = ctx->regs_set;
1462*437bfbebSnyanmisaka     MppEncCfgSet *cfg = ctx->cfg;
1463*437bfbebSnyanmisaka     H264eSps *sps = ctx->sps;
1464*437bfbebSnyanmisaka     H264ePps *pps = ctx->pps;
1465*437bfbebSnyanmisaka     H264eSlice *slice = ctx->slice;
1466*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1467*437bfbebSnyanmisaka 
1468*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter %p\n", hal);
1469*437bfbebSnyanmisaka     hal_h264e_dbg_detail("frame %d generate regs now", ctx->frms->seq_idx);
1470*437bfbebSnyanmisaka 
1471*437bfbebSnyanmisaka     /* register setup */
1472*437bfbebSnyanmisaka     memset(regs, 0, sizeof(*regs));
1473*437bfbebSnyanmisaka 
1474*437bfbebSnyanmisaka     setup_vepu540c_normal(regs);
1475*437bfbebSnyanmisaka     ret = setup_vepu540c_prep(regs, &ctx->cfg->prep);
1476*437bfbebSnyanmisaka     if (ret)
1477*437bfbebSnyanmisaka         return ret;
1478*437bfbebSnyanmisaka 
1479*437bfbebSnyanmisaka     setup_vepu540c_codec(regs, sps, pps, slice);
1480*437bfbebSnyanmisaka     setup_vepu540c_rdo_pred(regs, sps, pps, slice);
1481*437bfbebSnyanmisaka     setup_vepu540c_rdo_cfg(&regs->reg_rdo);
1482*437bfbebSnyanmisaka 
1483*437bfbebSnyanmisaka     // scl cfg
1484*437bfbebSnyanmisaka     memcpy(&regs->reg_scl.q_intra_y8, vepu580_540_h264_flat_scl_tab, sizeof(vepu580_540_h264_flat_scl_tab));
1485*437bfbebSnyanmisaka 
1486*437bfbebSnyanmisaka     setup_vepu540c_rc_base(regs, ctx, task->rc_task);
1487*437bfbebSnyanmisaka     setup_vepu540c_io_buf(regs, ctx->dev, task);
1488*437bfbebSnyanmisaka     setup_vepu540c_recn_refr(ctx, regs);
1489*437bfbebSnyanmisaka 
1490*437bfbebSnyanmisaka     regs->reg_base.meiw_addr = task->md_info ? mpp_buffer_get_fd(task->md_info) : 0;
1491*437bfbebSnyanmisaka 
1492*437bfbebSnyanmisaka     regs->reg_base.pic_ofst.pic_ofst_y = mpp_frame_get_offset_y(task->frame);
1493*437bfbebSnyanmisaka     regs->reg_base.pic_ofst.pic_ofst_x = mpp_frame_get_offset_x(task->frame);
1494*437bfbebSnyanmisaka 
1495*437bfbebSnyanmisaka     setup_vepu540c_split(regs, cfg);
1496*437bfbebSnyanmisaka     setup_vepu540c_me(regs, sps, slice);
1497*437bfbebSnyanmisaka 
1498*437bfbebSnyanmisaka     setup_vepu540c_l2(ctx->regs_set, slice, &cfg->hw);
1499*437bfbebSnyanmisaka     setup_vepu540c_ext_line_buf(regs, ctx);
1500*437bfbebSnyanmisaka 
1501*437bfbebSnyanmisaka     if (ctx->roi_data)
1502*437bfbebSnyanmisaka         vepu540c_set_roi(&ctx->regs_set->reg_rc_roi.roi_cfg, ctx->roi_data,
1503*437bfbebSnyanmisaka                          ctx->cfg->prep.width, ctx->cfg->prep.height);
1504*437bfbebSnyanmisaka 
1505*437bfbebSnyanmisaka     ctx->frame_cnt++;
1506*437bfbebSnyanmisaka 
1507*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave %p\n", hal);
1508*437bfbebSnyanmisaka     return MPP_OK;
1509*437bfbebSnyanmisaka }
1510*437bfbebSnyanmisaka 
hal_h264e_vepu540c_start(void * hal,HalEncTask * task)1511*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu540c_start(void *hal, HalEncTask *task)
1512*437bfbebSnyanmisaka {
1513*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1514*437bfbebSnyanmisaka     HalH264eVepu540cCtx *ctx = (HalH264eVepu540cCtx *)hal;
1515*437bfbebSnyanmisaka 
1516*437bfbebSnyanmisaka     (void) task;
1517*437bfbebSnyanmisaka 
1518*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter %p\n", hal);
1519*437bfbebSnyanmisaka 
1520*437bfbebSnyanmisaka     do {
1521*437bfbebSnyanmisaka         MppDevRegWrCfg wr_cfg;
1522*437bfbebSnyanmisaka         MppDevRegRdCfg rd_cfg;
1523*437bfbebSnyanmisaka 
1524*437bfbebSnyanmisaka         wr_cfg.reg = &ctx->regs_set->reg_ctl;
1525*437bfbebSnyanmisaka         wr_cfg.size = sizeof(ctx->regs_set->reg_ctl);
1526*437bfbebSnyanmisaka         wr_cfg.offset = VEPU540C_CTL_OFFSET;
1527*437bfbebSnyanmisaka #if DUMP_REG
1528*437bfbebSnyanmisaka         {
1529*437bfbebSnyanmisaka             RK_U32 i;
1530*437bfbebSnyanmisaka             RK_U32 *reg = (RK_U32)wr_cfg.reg;
1531*437bfbebSnyanmisaka             for ( i = 0; i < sizeof(ctx->regs_set->reg_ctl) / sizeof(RK_U32); i++) {
1532*437bfbebSnyanmisaka                 /* code */
1533*437bfbebSnyanmisaka                 mpp_log("reg[%d] = 0x%08x\n", i, reg[i]);
1534*437bfbebSnyanmisaka             }
1535*437bfbebSnyanmisaka 
1536*437bfbebSnyanmisaka         }
1537*437bfbebSnyanmisaka #endif
1538*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
1539*437bfbebSnyanmisaka         if (ret) {
1540*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
1541*437bfbebSnyanmisaka             break;
1542*437bfbebSnyanmisaka         }
1543*437bfbebSnyanmisaka         wr_cfg.reg = &ctx->regs_set->reg_base;
1544*437bfbebSnyanmisaka         wr_cfg.size = sizeof(ctx->regs_set->reg_base);
1545*437bfbebSnyanmisaka         wr_cfg.offset = VEPU540C_BASE_OFFSET;
1546*437bfbebSnyanmisaka 
1547*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
1548*437bfbebSnyanmisaka         if (ret) {
1549*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
1550*437bfbebSnyanmisaka             break;
1551*437bfbebSnyanmisaka         }
1552*437bfbebSnyanmisaka         wr_cfg.reg = &ctx->regs_set->reg_rc_roi;
1553*437bfbebSnyanmisaka         wr_cfg.size = sizeof(ctx->regs_set->reg_rc_roi);
1554*437bfbebSnyanmisaka         wr_cfg.offset = VEPU540C_RCROI_OFFSET;
1555*437bfbebSnyanmisaka 
1556*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
1557*437bfbebSnyanmisaka         if (ret) {
1558*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
1559*437bfbebSnyanmisaka             break;
1560*437bfbebSnyanmisaka         }
1561*437bfbebSnyanmisaka         wr_cfg.reg = &ctx->regs_set->reg_s3;
1562*437bfbebSnyanmisaka         wr_cfg.size = sizeof(ctx->regs_set->reg_s3);
1563*437bfbebSnyanmisaka         wr_cfg.offset = VEPU540C_WEG_OFFSET;
1564*437bfbebSnyanmisaka 
1565*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
1566*437bfbebSnyanmisaka         if (ret) {
1567*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
1568*437bfbebSnyanmisaka             break;
1569*437bfbebSnyanmisaka         }
1570*437bfbebSnyanmisaka         wr_cfg.reg = &ctx->regs_set->reg_rdo;
1571*437bfbebSnyanmisaka         wr_cfg.size = sizeof(ctx->regs_set->reg_rdo);
1572*437bfbebSnyanmisaka         wr_cfg.offset = VEPU540C_RDOCFG_OFFSET;
1573*437bfbebSnyanmisaka 
1574*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
1575*437bfbebSnyanmisaka         if (ret) {
1576*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
1577*437bfbebSnyanmisaka             break;
1578*437bfbebSnyanmisaka         }
1579*437bfbebSnyanmisaka 
1580*437bfbebSnyanmisaka         wr_cfg.reg = &ctx->regs_set->reg_scl;
1581*437bfbebSnyanmisaka         wr_cfg.size = sizeof(ctx->regs_set->reg_scl);
1582*437bfbebSnyanmisaka         wr_cfg.offset = VEPU540C_SCLCFG_OFFSET;
1583*437bfbebSnyanmisaka 
1584*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
1585*437bfbebSnyanmisaka         if (ret) {
1586*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
1587*437bfbebSnyanmisaka             break;
1588*437bfbebSnyanmisaka         }
1589*437bfbebSnyanmisaka 
1590*437bfbebSnyanmisaka         rd_cfg.reg = &ctx->regs_set->reg_st;
1591*437bfbebSnyanmisaka         rd_cfg.size = sizeof(ctx->regs_set->reg_st);
1592*437bfbebSnyanmisaka         rd_cfg.offset = VEPU540C_STATUS_OFFSET;
1593*437bfbebSnyanmisaka 
1594*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &rd_cfg);
1595*437bfbebSnyanmisaka         if (ret) {
1596*437bfbebSnyanmisaka             mpp_err_f("set register read failed %d\n", ret);
1597*437bfbebSnyanmisaka             break;
1598*437bfbebSnyanmisaka         }
1599*437bfbebSnyanmisaka         /* send request to hardware */
1600*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
1601*437bfbebSnyanmisaka 
1602*437bfbebSnyanmisaka         if (ret) {
1603*437bfbebSnyanmisaka             mpp_err_f("send cmd failed %d\n", ret);
1604*437bfbebSnyanmisaka             break;
1605*437bfbebSnyanmisaka         }
1606*437bfbebSnyanmisaka     } while (0);
1607*437bfbebSnyanmisaka 
1608*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave %p\n", hal);
1609*437bfbebSnyanmisaka 
1610*437bfbebSnyanmisaka     return ret;
1611*437bfbebSnyanmisaka }
1612*437bfbebSnyanmisaka 
hal_h264e_vepu540c_status_check(void * hal)1613*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu540c_status_check(void *hal)
1614*437bfbebSnyanmisaka {
1615*437bfbebSnyanmisaka     HalH264eVepu540cCtx *ctx = (HalH264eVepu540cCtx *)hal;
1616*437bfbebSnyanmisaka     HalVepu540cRegSet *regs_set = ctx->regs_set;
1617*437bfbebSnyanmisaka 
1618*437bfbebSnyanmisaka     if (regs_set->reg_ctl.int_sta.lkt_node_done_sta)
1619*437bfbebSnyanmisaka         hal_h264e_dbg_detail("lkt_done finish");
1620*437bfbebSnyanmisaka 
1621*437bfbebSnyanmisaka     if (regs_set->reg_ctl.int_sta.enc_done_sta)
1622*437bfbebSnyanmisaka         hal_h264e_dbg_detail("enc_done finish");
1623*437bfbebSnyanmisaka 
1624*437bfbebSnyanmisaka     if (regs_set->reg_ctl.int_sta.vslc_done_sta)
1625*437bfbebSnyanmisaka         hal_h264e_dbg_detail("enc_slice finsh");
1626*437bfbebSnyanmisaka 
1627*437bfbebSnyanmisaka     if (regs_set->reg_ctl.int_sta.sclr_done_sta)
1628*437bfbebSnyanmisaka         hal_h264e_dbg_detail("safe clear finsh");
1629*437bfbebSnyanmisaka 
1630*437bfbebSnyanmisaka     if (regs_set->reg_ctl.int_sta.vbsf_oflw_sta)
1631*437bfbebSnyanmisaka         mpp_err_f("bit stream overflow");
1632*437bfbebSnyanmisaka 
1633*437bfbebSnyanmisaka     if (regs_set->reg_ctl.int_sta.vbuf_lens_sta)
1634*437bfbebSnyanmisaka         mpp_err_f("bus write full");
1635*437bfbebSnyanmisaka 
1636*437bfbebSnyanmisaka     if (regs_set->reg_ctl.int_sta.enc_err_sta)
1637*437bfbebSnyanmisaka         mpp_err_f("bus error");
1638*437bfbebSnyanmisaka 
1639*437bfbebSnyanmisaka     if (regs_set->reg_ctl.int_sta.wdg_sta)
1640*437bfbebSnyanmisaka         mpp_err_f("wdg timeout");
1641*437bfbebSnyanmisaka 
1642*437bfbebSnyanmisaka     return MPP_OK;
1643*437bfbebSnyanmisaka }
1644*437bfbebSnyanmisaka 
hal_h264e_vepu540c_wait(void * hal,HalEncTask * task)1645*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu540c_wait(void *hal, HalEncTask *task)
1646*437bfbebSnyanmisaka {
1647*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1648*437bfbebSnyanmisaka     HalH264eVepu540cCtx *ctx = (HalH264eVepu540cCtx *)hal;
1649*437bfbebSnyanmisaka     HalVepu540cRegSet *regs_set = ctx->regs_set;
1650*437bfbebSnyanmisaka     H264NaluType type = task->rc_task->frm.is_idr ?  H264_NALU_TYPE_IDR : H264_NALU_TYPE_SLICE;
1651*437bfbebSnyanmisaka     MppPacket pkt = task->packet;
1652*437bfbebSnyanmisaka     RK_S32 offset = mpp_packet_get_length(pkt);
1653*437bfbebSnyanmisaka 
1654*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter %p\n", hal);
1655*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
1656*437bfbebSnyanmisaka     if (ret) {
1657*437bfbebSnyanmisaka         mpp_err_f("poll cmd failed %d\n", ret);
1658*437bfbebSnyanmisaka         ret = MPP_ERR_VPUHW;
1659*437bfbebSnyanmisaka     } else {
1660*437bfbebSnyanmisaka         hal_h264e_vepu540c_status_check(hal);
1661*437bfbebSnyanmisaka         task->hw_length += regs_set->reg_st.bs_lgth_l32;
1662*437bfbebSnyanmisaka     }
1663*437bfbebSnyanmisaka 
1664*437bfbebSnyanmisaka     mpp_packet_add_segment_info(pkt, type, offset, regs_set->reg_st.bs_lgth_l32);
1665*437bfbebSnyanmisaka 
1666*437bfbebSnyanmisaka     {
1667*437bfbebSnyanmisaka         HalH264eVepuStreamAmend *amend = &ctx->amend;
1668*437bfbebSnyanmisaka 
1669*437bfbebSnyanmisaka         if (amend->enable) {
1670*437bfbebSnyanmisaka             amend->old_length = task->hw_length;
1671*437bfbebSnyanmisaka             amend->slice->is_multi_slice = (ctx->cfg->split.split_mode > 0);
1672*437bfbebSnyanmisaka             h264e_vepu_stream_amend_proc(amend, &ctx->cfg->h264.hw_cfg);
1673*437bfbebSnyanmisaka             task->hw_length = amend->new_length;
1674*437bfbebSnyanmisaka         } else if (amend->prefix) {
1675*437bfbebSnyanmisaka             /* check prefix value */
1676*437bfbebSnyanmisaka             amend->old_length = task->hw_length;
1677*437bfbebSnyanmisaka             h264e_vepu_stream_amend_sync_ref_idc(amend);
1678*437bfbebSnyanmisaka         }
1679*437bfbebSnyanmisaka     }
1680*437bfbebSnyanmisaka 
1681*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave %p\n", hal);
1682*437bfbebSnyanmisaka 
1683*437bfbebSnyanmisaka     return ret;
1684*437bfbebSnyanmisaka }
1685*437bfbebSnyanmisaka 
hal_h264e_vepu540c_ret_task(void * hal,HalEncTask * task)1686*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu540c_ret_task(void *hal, HalEncTask *task)
1687*437bfbebSnyanmisaka {
1688*437bfbebSnyanmisaka     HalH264eVepu540cCtx *ctx = (HalH264eVepu540cCtx *)hal;
1689*437bfbebSnyanmisaka     EncRcTaskInfo *rc_info = &task->rc_task->info;
1690*437bfbebSnyanmisaka     RK_U32 mb_w = ctx->sps->pic_width_in_mbs;
1691*437bfbebSnyanmisaka     RK_U32 mb_h = ctx->sps->pic_height_in_mbs;
1692*437bfbebSnyanmisaka     RK_U32 mbs = mb_w * mb_h;
1693*437bfbebSnyanmisaka     HalVepu540cRegSet *regs_set = (HalVepu540cRegSet *)ctx->regs_set;
1694*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter %p\n", hal);
1695*437bfbebSnyanmisaka 
1696*437bfbebSnyanmisaka     // update total hardware length
1697*437bfbebSnyanmisaka     task->length += task->hw_length;
1698*437bfbebSnyanmisaka 
1699*437bfbebSnyanmisaka     // setup bit length for rate control
1700*437bfbebSnyanmisaka     rc_info->bit_real = task->hw_length * 8;
1701*437bfbebSnyanmisaka     rc_info->quality_real = regs_set->reg_st.qp_sum / mbs;
1702*437bfbebSnyanmisaka     /*
1703*437bfbebSnyanmisaka         rc_info->madi = (!regs_set->reg_st.st_bnum_b16.num_b16) ? 0 :
1704*437bfbebSnyanmisaka                         regs_set->reg_st.madi /  regs_set->reg_st.st_bnum_b16.num_b16;
1705*437bfbebSnyanmisaka         rc_info->madp = (!regs_set->reg_st.st_bnum_cme.num_ctu) ? 0 :
1706*437bfbebSnyanmisaka                         regs_set->reg_st.madi / regs_set->reg_st.st_bnum_cme.num_ctu;*/
1707*437bfbebSnyanmisaka 
1708*437bfbebSnyanmisaka     rc_info->iblk4_prop = (regs_set->reg_st.st_pnum_i4.pnum_i4 +
1709*437bfbebSnyanmisaka                            regs_set->reg_st.st_pnum_i8.pnum_i8 +
1710*437bfbebSnyanmisaka                            regs_set->reg_st.st_pnum_i16.pnum_i16) * 256 / mbs;
1711*437bfbebSnyanmisaka 
1712*437bfbebSnyanmisaka     rc_info->sse = ((RK_S64)regs_set->reg_st.sse_h32 << 16) +
1713*437bfbebSnyanmisaka                    (regs_set->reg_st.st_sse_bsl.sse_l16 & 0xffff);
1714*437bfbebSnyanmisaka     rc_info->lvl16_inter_num = regs_set->reg_st.st_pnum_p16.pnum_p16;
1715*437bfbebSnyanmisaka     rc_info->lvl8_inter_num  = regs_set->reg_st.st_pnum_p8.pnum_p8;
1716*437bfbebSnyanmisaka     rc_info->lvl16_intra_num = regs_set->reg_st.st_pnum_i16.pnum_i16;
1717*437bfbebSnyanmisaka     rc_info->lvl8_intra_num  = regs_set->reg_st.st_pnum_i8.pnum_i8;
1718*437bfbebSnyanmisaka     rc_info->lvl4_intra_num  = regs_set->reg_st.st_pnum_i4.pnum_i4;
1719*437bfbebSnyanmisaka 
1720*437bfbebSnyanmisaka     ctx->hal_rc_cfg.bit_real = rc_info->bit_real;
1721*437bfbebSnyanmisaka     ctx->hal_rc_cfg.quality_real = rc_info->quality_real;
1722*437bfbebSnyanmisaka     ctx->hal_rc_cfg.iblk4_prop = rc_info->iblk4_prop;
1723*437bfbebSnyanmisaka 
1724*437bfbebSnyanmisaka     task->hal_ret.data   = &ctx->hal_rc_cfg;
1725*437bfbebSnyanmisaka     task->hal_ret.number = 1;
1726*437bfbebSnyanmisaka 
1727*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave %p\n", hal);
1728*437bfbebSnyanmisaka 
1729*437bfbebSnyanmisaka     return MPP_OK;
1730*437bfbebSnyanmisaka }
1731*437bfbebSnyanmisaka 
1732*437bfbebSnyanmisaka const MppEncHalApi hal_h264e_vepu540c = {
1733*437bfbebSnyanmisaka     .name       = "hal_h264e_vepu540c",
1734*437bfbebSnyanmisaka     .coding     = MPP_VIDEO_CodingAVC,
1735*437bfbebSnyanmisaka     .ctx_size   = sizeof(HalH264eVepu540cCtx),
1736*437bfbebSnyanmisaka     .flag       = 0,
1737*437bfbebSnyanmisaka     .init       = hal_h264e_vepu540c_init,
1738*437bfbebSnyanmisaka     .deinit     = hal_h264e_vepu540c_deinit,
1739*437bfbebSnyanmisaka     .prepare    = hal_h264e_vepu540c_prepare,
1740*437bfbebSnyanmisaka     .get_task   = hal_h264e_vepu540c_get_task,
1741*437bfbebSnyanmisaka     .gen_regs   = hal_h264e_vepu540c_gen_regs,
1742*437bfbebSnyanmisaka     .start      = hal_h264e_vepu540c_start,
1743*437bfbebSnyanmisaka     .wait       = hal_h264e_vepu540c_wait,
1744*437bfbebSnyanmisaka     .part_start = NULL,
1745*437bfbebSnyanmisaka     .part_wait  = NULL,
1746*437bfbebSnyanmisaka     .ret_task   = hal_h264e_vepu540c_ret_task,
1747*437bfbebSnyanmisaka };
1748