xref: /rockchip-linux_mpp/mpp/hal/rkenc/h264e/hal_h264e_vepu541.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2015 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_vepu541"
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_soc.h"
24*437bfbebSnyanmisaka #include "mpp_frame.h"
25*437bfbebSnyanmisaka #include "mpp_common.h"
26*437bfbebSnyanmisaka #include "mpp_device.h"
27*437bfbebSnyanmisaka #include "mpp_frame_impl.h"
28*437bfbebSnyanmisaka #include "mpp_rc.h"
29*437bfbebSnyanmisaka #include "mpp_packet_impl.h"
30*437bfbebSnyanmisaka 
31*437bfbebSnyanmisaka #include "hal_h264e_debug.h"
32*437bfbebSnyanmisaka #include "h264e_sps.h"
33*437bfbebSnyanmisaka #include "h264e_pps.h"
34*437bfbebSnyanmisaka #include "h264e_slice.h"
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka #include "hal_bufs.h"
37*437bfbebSnyanmisaka #include "hal_h264e_vepu541.h"
38*437bfbebSnyanmisaka #include "hal_h264e_vepu541_reg.h"
39*437bfbebSnyanmisaka #include "hal_h264e_vepu541_reg_l2.h"
40*437bfbebSnyanmisaka #include "hal_h264e_stream_amend.h"
41*437bfbebSnyanmisaka #include "vepu541_common.h"
42*437bfbebSnyanmisaka #include "vepu5xx_common.h"
43*437bfbebSnyanmisaka 
44*437bfbebSnyanmisaka typedef struct HalH264eVepu541Ctx_t {
45*437bfbebSnyanmisaka     MppEncCfgSet            *cfg;
46*437bfbebSnyanmisaka 
47*437bfbebSnyanmisaka     MppDev                  dev;
48*437bfbebSnyanmisaka     RK_U32                  is_vepu540;
49*437bfbebSnyanmisaka     RK_S32                  frame_cnt;
50*437bfbebSnyanmisaka 
51*437bfbebSnyanmisaka     /* buffers management */
52*437bfbebSnyanmisaka     HalBufs                 hw_recn;
53*437bfbebSnyanmisaka     RK_S32                  pixel_buf_fbc_hdr_size;
54*437bfbebSnyanmisaka     RK_S32                  pixel_buf_fbc_bdy_size;
55*437bfbebSnyanmisaka     RK_S32                  pixel_buf_size;
56*437bfbebSnyanmisaka     RK_S32                  thumb_buf_size;
57*437bfbebSnyanmisaka     RK_S32                  max_buf_cnt;
58*437bfbebSnyanmisaka 
59*437bfbebSnyanmisaka     /* syntax for input from enc_impl */
60*437bfbebSnyanmisaka     RK_U32                  updated;
61*437bfbebSnyanmisaka     H264eSps                *sps;
62*437bfbebSnyanmisaka     H264ePps                *pps;
63*437bfbebSnyanmisaka     H264eSlice              *slice;
64*437bfbebSnyanmisaka     H264eFrmInfo            *frms;
65*437bfbebSnyanmisaka     H264eReorderInfo        *reorder;
66*437bfbebSnyanmisaka     H264eMarkingInfo        *marking;
67*437bfbebSnyanmisaka     H264ePrefixNal          *prefix;
68*437bfbebSnyanmisaka     HalH264eVepuStreamAmend  amend;
69*437bfbebSnyanmisaka 
70*437bfbebSnyanmisaka     /* syntax for output to enc_impl */
71*437bfbebSnyanmisaka     EncRcTaskInfo           hal_rc_cfg;
72*437bfbebSnyanmisaka 
73*437bfbebSnyanmisaka     /* roi */
74*437bfbebSnyanmisaka     MppEncROICfg            *roi_data;
75*437bfbebSnyanmisaka     MppEncROICfg2           *roi_data2;
76*437bfbebSnyanmisaka     MppBufferGroup          roi_grp;
77*437bfbebSnyanmisaka     MppBuffer               roi_buf;
78*437bfbebSnyanmisaka     RK_S32                  roi_buf_size;
79*437bfbebSnyanmisaka     MppBuffer               qpmap;
80*437bfbebSnyanmisaka 
81*437bfbebSnyanmisaka     /* osd */
82*437bfbebSnyanmisaka     Vepu5xxOsdCfg           osd_cfg;
83*437bfbebSnyanmisaka 
84*437bfbebSnyanmisaka     /* register */
85*437bfbebSnyanmisaka     Vepu541H264eRegSet      regs_set;
86*437bfbebSnyanmisaka     Vepu541H264eRegL2Set    regs_l2_set;
87*437bfbebSnyanmisaka     Vepu541H264eRegRet      regs_ret;
88*437bfbebSnyanmisaka } HalH264eVepu541Ctx;
89*437bfbebSnyanmisaka 
90*437bfbebSnyanmisaka #define CHROMA_KLUT_TAB_SIZE    (24 * sizeof(RK_U32))
91*437bfbebSnyanmisaka 
92*437bfbebSnyanmisaka static RK_U32 h264e_klut_weight[30] = {
93*437bfbebSnyanmisaka     0x0a000010, 0x00064000, 0x14000020, 0x000c8000,
94*437bfbebSnyanmisaka     0x28000040, 0x00194000, 0x50800080, 0x0032c000,
95*437bfbebSnyanmisaka     0xa1000100, 0x00658000, 0x42800200, 0x00cb0001,
96*437bfbebSnyanmisaka     0x85000400, 0x01964002, 0x0a000800, 0x032c8005,
97*437bfbebSnyanmisaka     0x14001000, 0x0659400a, 0x28802000, 0x0cb2c014,
98*437bfbebSnyanmisaka     0x51004000, 0x1965c028, 0xa2808000, 0x32cbc050,
99*437bfbebSnyanmisaka     0x4500ffff, 0x659780a1, 0x8a81fffe, 0xCC000142,
100*437bfbebSnyanmisaka     0xFF83FFFF, 0x000001FF,
101*437bfbebSnyanmisaka };
102*437bfbebSnyanmisaka 
103*437bfbebSnyanmisaka static RK_U32 dump_l1_reg = 0;
104*437bfbebSnyanmisaka static RK_U32 dump_l2_reg = 0;
105*437bfbebSnyanmisaka 
106*437bfbebSnyanmisaka static RK_S32 h264_aq_tthd_default[16] = {
107*437bfbebSnyanmisaka     0,  0,  0,  0,
108*437bfbebSnyanmisaka     3,  3,  5,  5,
109*437bfbebSnyanmisaka     8,  8,  8,  15,
110*437bfbebSnyanmisaka     15, 20, 25, 25,
111*437bfbebSnyanmisaka };
112*437bfbebSnyanmisaka 
113*437bfbebSnyanmisaka static RK_S32 h264_P_aq_step_default[16] = {
114*437bfbebSnyanmisaka     -8, -7, -6, -5,
115*437bfbebSnyanmisaka     -4, -3, -2, -1,
116*437bfbebSnyanmisaka     0,  1,  2,  3,
117*437bfbebSnyanmisaka     4,  5,  7,  8,
118*437bfbebSnyanmisaka };
119*437bfbebSnyanmisaka 
120*437bfbebSnyanmisaka static RK_S32 h264_I_aq_step_default[16] = {
121*437bfbebSnyanmisaka     -8, -7, -6, -5,
122*437bfbebSnyanmisaka     -4, -3, -2, -1,
123*437bfbebSnyanmisaka     0,  1,  3,  3,
124*437bfbebSnyanmisaka     4,  5,  8,  8,
125*437bfbebSnyanmisaka };
126*437bfbebSnyanmisaka 
hal_h264e_vepu541_deinit(void * hal)127*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu541_deinit(void *hal)
128*437bfbebSnyanmisaka {
129*437bfbebSnyanmisaka     HalH264eVepu541Ctx *p = (HalH264eVepu541Ctx *)hal;
130*437bfbebSnyanmisaka 
131*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter %p\n", p);
132*437bfbebSnyanmisaka 
133*437bfbebSnyanmisaka     h264e_vepu_stream_amend_deinit(&p->amend);
134*437bfbebSnyanmisaka 
135*437bfbebSnyanmisaka     if (p->dev) {
136*437bfbebSnyanmisaka         mpp_dev_deinit(p->dev);
137*437bfbebSnyanmisaka         p->dev = NULL;
138*437bfbebSnyanmisaka     }
139*437bfbebSnyanmisaka 
140*437bfbebSnyanmisaka     if (p->roi_buf) {
141*437bfbebSnyanmisaka         mpp_buffer_put(p->roi_buf);
142*437bfbebSnyanmisaka         p->roi_buf = NULL;
143*437bfbebSnyanmisaka     }
144*437bfbebSnyanmisaka 
145*437bfbebSnyanmisaka     if (p->roi_grp) {
146*437bfbebSnyanmisaka         mpp_buffer_group_put(p->roi_grp);
147*437bfbebSnyanmisaka         p->roi_grp = NULL;
148*437bfbebSnyanmisaka     }
149*437bfbebSnyanmisaka 
150*437bfbebSnyanmisaka     if (p->hw_recn) {
151*437bfbebSnyanmisaka         hal_bufs_deinit(p->hw_recn);
152*437bfbebSnyanmisaka         p->hw_recn = NULL;
153*437bfbebSnyanmisaka     }
154*437bfbebSnyanmisaka 
155*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave %p\n", p);
156*437bfbebSnyanmisaka 
157*437bfbebSnyanmisaka     return MPP_OK;
158*437bfbebSnyanmisaka }
159*437bfbebSnyanmisaka 
hal_h264e_vepu541_init(void * hal,MppEncHalCfg * cfg)160*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu541_init(void *hal, MppEncHalCfg *cfg)
161*437bfbebSnyanmisaka {
162*437bfbebSnyanmisaka     HalH264eVepu541Ctx *p = (HalH264eVepu541Ctx *)hal;
163*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
164*437bfbebSnyanmisaka 
165*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter %p\n", p);
166*437bfbebSnyanmisaka 
167*437bfbebSnyanmisaka     p->cfg = cfg->cfg;
168*437bfbebSnyanmisaka 
169*437bfbebSnyanmisaka     /* update output to MppEnc */
170*437bfbebSnyanmisaka     cfg->type = VPU_CLIENT_RKVENC;
171*437bfbebSnyanmisaka     ret = mpp_dev_init(&cfg->dev, cfg->type);
172*437bfbebSnyanmisaka     if (ret) {
173*437bfbebSnyanmisaka         mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
174*437bfbebSnyanmisaka         goto DONE;
175*437bfbebSnyanmisaka     }
176*437bfbebSnyanmisaka     p->dev = cfg->dev;
177*437bfbebSnyanmisaka 
178*437bfbebSnyanmisaka     {
179*437bfbebSnyanmisaka         RockchipSocType soc_type = mpp_get_soc_type();
180*437bfbebSnyanmisaka 
181*437bfbebSnyanmisaka         if (soc_type == ROCKCHIP_SOC_RK3566 || soc_type == ROCKCHIP_SOC_RK3568)
182*437bfbebSnyanmisaka             p->is_vepu540 = 1;
183*437bfbebSnyanmisaka         else
184*437bfbebSnyanmisaka             p->is_vepu540 = 0;
185*437bfbebSnyanmisaka     }
186*437bfbebSnyanmisaka 
187*437bfbebSnyanmisaka     ret = hal_bufs_init(&p->hw_recn);
188*437bfbebSnyanmisaka     if (ret) {
189*437bfbebSnyanmisaka         mpp_err_f("init vepu buffer failed ret: %d\n", ret);
190*437bfbebSnyanmisaka         goto DONE;
191*437bfbebSnyanmisaka     }
192*437bfbebSnyanmisaka 
193*437bfbebSnyanmisaka     p->osd_cfg.reg_base = &p->regs_set;
194*437bfbebSnyanmisaka     p->osd_cfg.dev = p->dev;
195*437bfbebSnyanmisaka     p->osd_cfg.reg_cfg = NULL;
196*437bfbebSnyanmisaka     p->osd_cfg.plt_cfg = &p->cfg->plt_cfg;
197*437bfbebSnyanmisaka     p->osd_cfg.osd_data = NULL;
198*437bfbebSnyanmisaka     p->osd_cfg.osd_data2 = NULL;
199*437bfbebSnyanmisaka 
200*437bfbebSnyanmisaka     {   /* setup default hardware config */
201*437bfbebSnyanmisaka         MppEncHwCfg *hw = &cfg->cfg->hw;
202*437bfbebSnyanmisaka 
203*437bfbebSnyanmisaka         hw->qp_delta_row_i  = 0;
204*437bfbebSnyanmisaka         hw->qp_delta_row    = 2;
205*437bfbebSnyanmisaka         hw->qbias_i         = 683;
206*437bfbebSnyanmisaka         hw->qbias_p         = 341;
207*437bfbebSnyanmisaka         hw->qbias_en        = 0;
208*437bfbebSnyanmisaka 
209*437bfbebSnyanmisaka         memcpy(hw->aq_thrd_i, h264_aq_tthd_default, sizeof(hw->aq_thrd_i));
210*437bfbebSnyanmisaka         memcpy(hw->aq_thrd_p, h264_aq_tthd_default, sizeof(hw->aq_thrd_p));
211*437bfbebSnyanmisaka         memcpy(hw->aq_step_i, h264_I_aq_step_default, sizeof(hw->aq_step_i));
212*437bfbebSnyanmisaka         memcpy(hw->aq_step_p, h264_P_aq_step_default, sizeof(hw->aq_step_p));
213*437bfbebSnyanmisaka     }
214*437bfbebSnyanmisaka 
215*437bfbebSnyanmisaka DONE:
216*437bfbebSnyanmisaka     if (ret)
217*437bfbebSnyanmisaka         hal_h264e_vepu541_deinit(hal);
218*437bfbebSnyanmisaka 
219*437bfbebSnyanmisaka     h264e_vepu_stream_amend_init(&p->amend);
220*437bfbebSnyanmisaka 
221*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave %p\n", p);
222*437bfbebSnyanmisaka     return ret;
223*437bfbebSnyanmisaka }
224*437bfbebSnyanmisaka 
setup_hal_bufs(HalH264eVepu541Ctx * ctx)225*437bfbebSnyanmisaka static void setup_hal_bufs(HalH264eVepu541Ctx *ctx)
226*437bfbebSnyanmisaka {
227*437bfbebSnyanmisaka     MppEncCfgSet *cfg = ctx->cfg;
228*437bfbebSnyanmisaka     MppEncPrepCfg *prep = &cfg->prep;
229*437bfbebSnyanmisaka     RK_S32 alignment = 64;
230*437bfbebSnyanmisaka     RK_S32 aligned_w = MPP_ALIGN(prep->width,  alignment);
231*437bfbebSnyanmisaka     RK_S32 aligned_h = MPP_ALIGN(prep->height, alignment) + 16;
232*437bfbebSnyanmisaka     RK_S32 pixel_buf_fbc_hdr_size = MPP_ALIGN(aligned_w * aligned_h / 64, SZ_8K);
233*437bfbebSnyanmisaka     RK_S32 pixel_buf_fbc_bdy_size = aligned_w * aligned_h * 3 / 2;
234*437bfbebSnyanmisaka     RK_S32 pixel_buf_size = pixel_buf_fbc_hdr_size + pixel_buf_fbc_bdy_size;
235*437bfbebSnyanmisaka     RK_S32 thumb_buf_size = MPP_ALIGN(aligned_w / 64 * aligned_h / 64 * 256, SZ_8K);
236*437bfbebSnyanmisaka     RK_S32 old_max_cnt = ctx->max_buf_cnt;
237*437bfbebSnyanmisaka     RK_S32 new_max_cnt = 2;
238*437bfbebSnyanmisaka     MppEncRefCfg ref_cfg = cfg->ref_cfg;
239*437bfbebSnyanmisaka     if (ref_cfg) {
240*437bfbebSnyanmisaka         MppEncCpbInfo *info = mpp_enc_ref_cfg_get_cpb_info(ref_cfg);
241*437bfbebSnyanmisaka         if (new_max_cnt < MPP_MAX(new_max_cnt, info->dpb_size + 1))
242*437bfbebSnyanmisaka             new_max_cnt = MPP_MAX(new_max_cnt, info->dpb_size + 1);
243*437bfbebSnyanmisaka     }
244*437bfbebSnyanmisaka 
245*437bfbebSnyanmisaka     if ((ctx->pixel_buf_fbc_hdr_size != pixel_buf_fbc_hdr_size) ||
246*437bfbebSnyanmisaka         (ctx->pixel_buf_fbc_bdy_size != pixel_buf_fbc_bdy_size) ||
247*437bfbebSnyanmisaka         (ctx->pixel_buf_size != pixel_buf_size) ||
248*437bfbebSnyanmisaka         (ctx->thumb_buf_size != thumb_buf_size) ||
249*437bfbebSnyanmisaka         (new_max_cnt > old_max_cnt)) {
250*437bfbebSnyanmisaka         size_t sizes[2];
251*437bfbebSnyanmisaka 
252*437bfbebSnyanmisaka         hal_h264e_dbg_detail("frame size %d -> %d max count %d -> %d\n",
253*437bfbebSnyanmisaka                              ctx->pixel_buf_size, pixel_buf_size,
254*437bfbebSnyanmisaka                              old_max_cnt, new_max_cnt);
255*437bfbebSnyanmisaka 
256*437bfbebSnyanmisaka         /* pixel buffer */
257*437bfbebSnyanmisaka         sizes[0] = pixel_buf_size;
258*437bfbebSnyanmisaka         /* thumb buffer */
259*437bfbebSnyanmisaka         sizes[1] = thumb_buf_size;
260*437bfbebSnyanmisaka         new_max_cnt = MPP_MAX(new_max_cnt, old_max_cnt);
261*437bfbebSnyanmisaka 
262*437bfbebSnyanmisaka         hal_bufs_setup(ctx->hw_recn, new_max_cnt, 2, sizes);
263*437bfbebSnyanmisaka 
264*437bfbebSnyanmisaka         ctx->pixel_buf_fbc_hdr_size = pixel_buf_fbc_hdr_size;
265*437bfbebSnyanmisaka         ctx->pixel_buf_fbc_bdy_size = pixel_buf_fbc_bdy_size;
266*437bfbebSnyanmisaka         ctx->pixel_buf_size = pixel_buf_size;
267*437bfbebSnyanmisaka         ctx->thumb_buf_size = thumb_buf_size;
268*437bfbebSnyanmisaka         ctx->max_buf_cnt = new_max_cnt;
269*437bfbebSnyanmisaka     }
270*437bfbebSnyanmisaka }
271*437bfbebSnyanmisaka 
hal_h264e_vepu541_prepare(void * hal)272*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu541_prepare(void *hal)
273*437bfbebSnyanmisaka {
274*437bfbebSnyanmisaka     HalH264eVepu541Ctx *ctx = (HalH264eVepu541Ctx *)hal;
275*437bfbebSnyanmisaka     MppEncPrepCfg *prep = &ctx->cfg->prep;
276*437bfbebSnyanmisaka 
277*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter %p\n", hal);
278*437bfbebSnyanmisaka 
279*437bfbebSnyanmisaka     if (prep->change_res) {
280*437bfbebSnyanmisaka         RK_S32 i;
281*437bfbebSnyanmisaka 
282*437bfbebSnyanmisaka         // pre-alloc required buffers to reduce first frame delay
283*437bfbebSnyanmisaka         setup_hal_bufs(ctx);
284*437bfbebSnyanmisaka         for (i = 0; i < ctx->max_buf_cnt; i++)
285*437bfbebSnyanmisaka             hal_bufs_get_buf(ctx->hw_recn, i);
286*437bfbebSnyanmisaka 
287*437bfbebSnyanmisaka         prep->change_res = 0;
288*437bfbebSnyanmisaka     }
289*437bfbebSnyanmisaka 
290*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave %p\n", hal);
291*437bfbebSnyanmisaka 
292*437bfbebSnyanmisaka     return MPP_OK;
293*437bfbebSnyanmisaka }
294*437bfbebSnyanmisaka 
update_vepu541_syntax(HalH264eVepu541Ctx * ctx,MppSyntax * syntax)295*437bfbebSnyanmisaka static RK_U32 update_vepu541_syntax(HalH264eVepu541Ctx *ctx, MppSyntax *syntax)
296*437bfbebSnyanmisaka {
297*437bfbebSnyanmisaka     H264eSyntaxDesc *desc = syntax->data;
298*437bfbebSnyanmisaka     RK_S32 syn_num = syntax->number;
299*437bfbebSnyanmisaka     RK_U32 updated = 0;
300*437bfbebSnyanmisaka     RK_S32 i;
301*437bfbebSnyanmisaka 
302*437bfbebSnyanmisaka     for (i = 0; i < syn_num; i++, desc++) {
303*437bfbebSnyanmisaka         switch (desc->type) {
304*437bfbebSnyanmisaka         case H264E_SYN_CFG : {
305*437bfbebSnyanmisaka             hal_h264e_dbg_detail("update cfg");
306*437bfbebSnyanmisaka             ctx->cfg = desc->p;
307*437bfbebSnyanmisaka         } break;
308*437bfbebSnyanmisaka         case H264E_SYN_SPS : {
309*437bfbebSnyanmisaka             hal_h264e_dbg_detail("update sps");
310*437bfbebSnyanmisaka             ctx->sps = desc->p;
311*437bfbebSnyanmisaka         } break;
312*437bfbebSnyanmisaka         case H264E_SYN_PPS : {
313*437bfbebSnyanmisaka             hal_h264e_dbg_detail("update pps");
314*437bfbebSnyanmisaka             ctx->pps = desc->p;
315*437bfbebSnyanmisaka         } break;
316*437bfbebSnyanmisaka         case H264E_SYN_DPB : {
317*437bfbebSnyanmisaka             hal_h264e_dbg_detail("update dpb");
318*437bfbebSnyanmisaka         } break;
319*437bfbebSnyanmisaka         case H264E_SYN_SLICE : {
320*437bfbebSnyanmisaka             hal_h264e_dbg_detail("update slice");
321*437bfbebSnyanmisaka             ctx->slice = desc->p;
322*437bfbebSnyanmisaka         } break;
323*437bfbebSnyanmisaka         case H264E_SYN_FRAME : {
324*437bfbebSnyanmisaka             hal_h264e_dbg_detail("update frames");
325*437bfbebSnyanmisaka             ctx->frms = desc->p;
326*437bfbebSnyanmisaka         } break;
327*437bfbebSnyanmisaka         case H264E_SYN_PREFIX : {
328*437bfbebSnyanmisaka             hal_h264e_dbg_detail("update prefix nal");
329*437bfbebSnyanmisaka             ctx->prefix = desc->p;
330*437bfbebSnyanmisaka         } break;
331*437bfbebSnyanmisaka         default : {
332*437bfbebSnyanmisaka             mpp_log_f("invalid syntax type %d\n", desc->type);
333*437bfbebSnyanmisaka         } break;
334*437bfbebSnyanmisaka         }
335*437bfbebSnyanmisaka 
336*437bfbebSnyanmisaka         updated |= SYN_TYPE_FLAG(desc->type);
337*437bfbebSnyanmisaka     }
338*437bfbebSnyanmisaka 
339*437bfbebSnyanmisaka     return updated;
340*437bfbebSnyanmisaka }
341*437bfbebSnyanmisaka 
hal_h264e_vepu541_get_task(void * hal,HalEncTask * task)342*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu541_get_task(void *hal, HalEncTask *task)
343*437bfbebSnyanmisaka {
344*437bfbebSnyanmisaka     HalH264eVepu541Ctx *ctx = (HalH264eVepu541Ctx *)hal;
345*437bfbebSnyanmisaka     MppEncH264HwCfg *hw_cfg = &ctx->cfg->h264.hw_cfg;
346*437bfbebSnyanmisaka     RK_U32 updated = update_vepu541_syntax(ctx, &task->syntax);
347*437bfbebSnyanmisaka     EncFrmStatus *frm_status = &task->rc_task->frm;
348*437bfbebSnyanmisaka 
349*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter %p\n", hal);
350*437bfbebSnyanmisaka 
351*437bfbebSnyanmisaka     if (updated & SYN_TYPE_FLAG(H264E_SYN_CFG))
352*437bfbebSnyanmisaka         setup_hal_bufs(ctx);
353*437bfbebSnyanmisaka 
354*437bfbebSnyanmisaka     if (!frm_status->reencode && mpp_frame_has_meta(task->frame)) {
355*437bfbebSnyanmisaka         MppMeta meta = mpp_frame_get_meta(task->frame);
356*437bfbebSnyanmisaka 
357*437bfbebSnyanmisaka         mpp_meta_get_ptr_d(meta, KEY_ROI_DATA, (void **)&ctx->roi_data, NULL);
358*437bfbebSnyanmisaka         mpp_meta_get_ptr_d(meta, KEY_ROI_DATA2, (void **)&ctx->roi_data2, NULL);
359*437bfbebSnyanmisaka         mpp_meta_get_ptr_d(meta, KEY_OSD_DATA, (void **)&ctx->osd_cfg.osd_data, NULL);
360*437bfbebSnyanmisaka         mpp_meta_get_ptr_d(meta, KEY_OSD_DATA2, (void **)&ctx->osd_cfg.osd_data2, NULL);
361*437bfbebSnyanmisaka         mpp_meta_get_buffer_d(meta, KEY_QPMAP0, &ctx->qpmap, NULL);
362*437bfbebSnyanmisaka     }
363*437bfbebSnyanmisaka 
364*437bfbebSnyanmisaka     /* if not VEPU1/2, update log2_max_frame_num_minus4 in hw_cfg */
365*437bfbebSnyanmisaka     hw_cfg->hw_log2_max_frame_num_minus4 = ctx->sps->log2_max_frame_num_minus4;
366*437bfbebSnyanmisaka 
367*437bfbebSnyanmisaka     h264e_vepu_stream_amend_config(&ctx->amend, task->packet, ctx->cfg,
368*437bfbebSnyanmisaka                                    ctx->slice, ctx->prefix);
369*437bfbebSnyanmisaka 
370*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave %p\n", hal);
371*437bfbebSnyanmisaka 
372*437bfbebSnyanmisaka     return MPP_OK;
373*437bfbebSnyanmisaka }
374*437bfbebSnyanmisaka 
setup_vepu541_normal(Vepu541H264eRegSet * regs,RK_U32 is_vepu540)375*437bfbebSnyanmisaka static void setup_vepu541_normal(Vepu541H264eRegSet *regs, RK_U32 is_vepu540)
376*437bfbebSnyanmisaka {
377*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
378*437bfbebSnyanmisaka     /* reg000 VERSION is read only */
379*437bfbebSnyanmisaka 
380*437bfbebSnyanmisaka     /* reg001 ENC_STRT */
381*437bfbebSnyanmisaka     regs->reg001.lkt_num            = 0;
382*437bfbebSnyanmisaka     regs->reg001.rkvenc_cmd         = 1;
383*437bfbebSnyanmisaka     regs->reg001.clk_gate_en        = 1;
384*437bfbebSnyanmisaka     regs->reg001.resetn_hw_en       = 0;
385*437bfbebSnyanmisaka     regs->reg001.enc_done_tmvp_en   = 1;
386*437bfbebSnyanmisaka 
387*437bfbebSnyanmisaka     /* reg002 ENC_CLR */
388*437bfbebSnyanmisaka     regs->reg002.safe_clr           = 0;
389*437bfbebSnyanmisaka     regs->reg002.force_clr          = 0;
390*437bfbebSnyanmisaka 
391*437bfbebSnyanmisaka     /* reg003 LKT_ADDR */
392*437bfbebSnyanmisaka     regs->reg003.lkt_addr           = 0;
393*437bfbebSnyanmisaka 
394*437bfbebSnyanmisaka     /* reg004 INT_EN */
395*437bfbebSnyanmisaka     regs->reg004.enc_done_en        = 1;
396*437bfbebSnyanmisaka     regs->reg004.lkt_done_en        = 1;
397*437bfbebSnyanmisaka     regs->reg004.sclr_done_en       = 1;
398*437bfbebSnyanmisaka     regs->reg004.enc_slice_done_en  = 1;
399*437bfbebSnyanmisaka     regs->reg004.oflw_done_en       = 1;
400*437bfbebSnyanmisaka     regs->reg004.brsp_done_en       = 1;
401*437bfbebSnyanmisaka     regs->reg004.berr_done_en       = 1;
402*437bfbebSnyanmisaka     regs->reg004.rerr_done_en       = 1;
403*437bfbebSnyanmisaka     regs->reg004.wdg_done_en        = 0;
404*437bfbebSnyanmisaka 
405*437bfbebSnyanmisaka     /* reg005 INT_MSK */
406*437bfbebSnyanmisaka     regs->reg005.enc_done_msk       = 0;
407*437bfbebSnyanmisaka     regs->reg005.lkt_done_msk       = 0;
408*437bfbebSnyanmisaka     regs->reg005.sclr_done_msk      = 0;
409*437bfbebSnyanmisaka     regs->reg005.enc_slice_done_msk = 0;
410*437bfbebSnyanmisaka     regs->reg005.oflw_done_msk      = 0;
411*437bfbebSnyanmisaka     regs->reg005.brsp_done_msk      = 0;
412*437bfbebSnyanmisaka     regs->reg005.berr_done_msk      = 0;
413*437bfbebSnyanmisaka     regs->reg005.rerr_done_msk      = 0;
414*437bfbebSnyanmisaka     regs->reg005.wdg_done_msk       = 0;
415*437bfbebSnyanmisaka 
416*437bfbebSnyanmisaka     /* reg006 INT_CLR is not set */
417*437bfbebSnyanmisaka     /* reg007 INT_STA is read only */
418*437bfbebSnyanmisaka     /* reg008 ~ reg0011 gap */
419*437bfbebSnyanmisaka     regs->reg014.vs_load_thd        = 0;
420*437bfbebSnyanmisaka     regs->reg014.rfp_load_thrd      = 0;
421*437bfbebSnyanmisaka 
422*437bfbebSnyanmisaka     /* reg015 DTRNS_MAP */
423*437bfbebSnyanmisaka     regs->reg015.cmvw_bus_ordr      = 0;
424*437bfbebSnyanmisaka     regs->reg015.dspw_bus_ordr      = 0;
425*437bfbebSnyanmisaka     regs->reg015.rfpw_bus_ordr      = 0;
426*437bfbebSnyanmisaka     regs->reg015.src_bus_edin       = 0;
427*437bfbebSnyanmisaka     regs->reg015.meiw_bus_edin      = 0;
428*437bfbebSnyanmisaka     regs->reg015.bsw_bus_edin       = 7;
429*437bfbebSnyanmisaka     regs->reg015.lktr_bus_edin      = 0;
430*437bfbebSnyanmisaka     regs->reg015.roir_bus_edin      = 0;
431*437bfbebSnyanmisaka     regs->reg015.lktw_bus_edin      = 0;
432*437bfbebSnyanmisaka     regs->reg015.afbc_bsize         = 1;
433*437bfbebSnyanmisaka 
434*437bfbebSnyanmisaka     /* reg016 DTRNS_CFG */
435*437bfbebSnyanmisaka     if (is_vepu540) {
436*437bfbebSnyanmisaka         /* vepu540 */
437*437bfbebSnyanmisaka         regs->reg016.vepu540.axi_brsp_cke   = 0;
438*437bfbebSnyanmisaka         regs->reg016.vepu540.dspr_otsd      = 1;
439*437bfbebSnyanmisaka     } else {
440*437bfbebSnyanmisaka         /* vepu541 */
441*437bfbebSnyanmisaka         regs->reg016.vepu541.axi_brsp_cke   = 0;
442*437bfbebSnyanmisaka         regs->reg016.vepu541.dspr_otsd      = 1;
443*437bfbebSnyanmisaka     }
444*437bfbebSnyanmisaka 
445*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
446*437bfbebSnyanmisaka }
447*437bfbebSnyanmisaka 
setup_vepu541_prep(Vepu541H264eRegSet * regs,HalH264eVepu541Ctx * ctx,HalEncTask * task)448*437bfbebSnyanmisaka static MPP_RET setup_vepu541_prep(Vepu541H264eRegSet *regs, HalH264eVepu541Ctx *ctx,
449*437bfbebSnyanmisaka                                   HalEncTask *task)
450*437bfbebSnyanmisaka {
451*437bfbebSnyanmisaka     VepuFmtCfg cfg;
452*437bfbebSnyanmisaka     MppEncPrepCfg *prep = &ctx->cfg->prep;
453*437bfbebSnyanmisaka     MppFrameFormat fmt = prep->format;
454*437bfbebSnyanmisaka     MPP_RET ret = vepu5xx_set_fmt(&cfg, fmt);
455*437bfbebSnyanmisaka     RK_U32 hw_fmt = cfg.format;
456*437bfbebSnyanmisaka     RK_S32 y_stride;
457*437bfbebSnyanmisaka     RK_S32 c_stride;
458*437bfbebSnyanmisaka 
459*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
460*437bfbebSnyanmisaka 
461*437bfbebSnyanmisaka     /* do nothing when color format is not supported */
462*437bfbebSnyanmisaka     if (ret)
463*437bfbebSnyanmisaka         return ret;
464*437bfbebSnyanmisaka 
465*437bfbebSnyanmisaka     /* reg012 ENC_RSL */
466*437bfbebSnyanmisaka     regs->reg012.pic_wd8_m1 = MPP_ALIGN(prep->width, 16) / 8 - 1;
467*437bfbebSnyanmisaka     regs->reg012.pic_wfill  = MPP_ALIGN(prep->width, 16) - prep->width;
468*437bfbebSnyanmisaka     regs->reg012.pic_hd8_m1 = MPP_ALIGN(prep->height, 16) / 8 - 1;
469*437bfbebSnyanmisaka     regs->reg012.pic_hfill  = MPP_ALIGN(prep->height, 16) - prep->height;
470*437bfbebSnyanmisaka 
471*437bfbebSnyanmisaka     /* reg015 DTRNS_MAP */
472*437bfbebSnyanmisaka     regs->reg015.src_bus_edin = cfg.src_endian;
473*437bfbebSnyanmisaka 
474*437bfbebSnyanmisaka     /* reg022 SRC_PROC */
475*437bfbebSnyanmisaka     regs->reg017.src_cfmt   = hw_fmt;
476*437bfbebSnyanmisaka     regs->reg017.alpha_swap = cfg.alpha_swap;
477*437bfbebSnyanmisaka     regs->reg017.rbuv_swap  = cfg.rbuv_swap;
478*437bfbebSnyanmisaka     regs->reg017.src_range  = cfg.src_range;
479*437bfbebSnyanmisaka     regs->reg017.out_fmt_cfg = (fmt == MPP_FMT_YUV400) ? 1 : 0;
480*437bfbebSnyanmisaka 
481*437bfbebSnyanmisaka     if (!ctx->frame_cnt && (fmt == MPP_FMT_YUV420SP_VU || fmt == MPP_FMT_YUV422SP_VU))
482*437bfbebSnyanmisaka         mpp_logw("Warning: nv21/nv42 fmt not supported, will encode as nv12/nv24.\n");
483*437bfbebSnyanmisaka 
484*437bfbebSnyanmisaka     if (MPP_FRAME_FMT_IS_FBC(fmt)) {
485*437bfbebSnyanmisaka         y_stride = mpp_frame_get_fbc_hdr_stride(task->frame);
486*437bfbebSnyanmisaka         if (!y_stride)
487*437bfbebSnyanmisaka             y_stride = MPP_ALIGN(prep->hor_stride, 16);
488*437bfbebSnyanmisaka     } else
489*437bfbebSnyanmisaka         y_stride = (prep->hor_stride) ? (prep->hor_stride) : (prep->width);
490*437bfbebSnyanmisaka 
491*437bfbebSnyanmisaka 
492*437bfbebSnyanmisaka     c_stride = (hw_fmt == VEPU5xx_FMT_YUV422SP || hw_fmt == VEPU5xx_FMT_YUV420SP) ?
493*437bfbebSnyanmisaka                y_stride : y_stride / 2;
494*437bfbebSnyanmisaka 
495*437bfbebSnyanmisaka     if (hw_fmt < VEPU5xx_FMT_ARGB1555) {
496*437bfbebSnyanmisaka         const VepuRgb2YuvCfg *cfg_coeffs = get_rgb2yuv_cfg(prep->range, prep->color);
497*437bfbebSnyanmisaka 
498*437bfbebSnyanmisaka         hal_h264e_dbg_flow("input color range %d colorspace %d", prep->range, prep->color);
499*437bfbebSnyanmisaka 
500*437bfbebSnyanmisaka         regs->reg018.csc_wgt_b2y = cfg_coeffs->_2y.b_coeff;
501*437bfbebSnyanmisaka         regs->reg018.csc_wgt_g2y = cfg_coeffs->_2y.g_coeff;
502*437bfbebSnyanmisaka         regs->reg018.csc_wgt_r2y = cfg_coeffs->_2y.r_coeff;
503*437bfbebSnyanmisaka 
504*437bfbebSnyanmisaka         regs->reg019.csc_wgt_b2u = cfg_coeffs->_2u.b_coeff;
505*437bfbebSnyanmisaka         regs->reg019.csc_wgt_g2u = cfg_coeffs->_2u.g_coeff;
506*437bfbebSnyanmisaka         regs->reg019.csc_wgt_r2u = cfg_coeffs->_2u.r_coeff;
507*437bfbebSnyanmisaka 
508*437bfbebSnyanmisaka         regs->reg020.csc_wgt_b2v = cfg_coeffs->_2v.b_coeff;
509*437bfbebSnyanmisaka         regs->reg020.csc_wgt_g2v = cfg_coeffs->_2v.g_coeff;
510*437bfbebSnyanmisaka         regs->reg020.csc_wgt_r2v = cfg_coeffs->_2v.r_coeff;
511*437bfbebSnyanmisaka 
512*437bfbebSnyanmisaka         regs->reg021.csc_ofst_y  = cfg_coeffs->_2y.offset;
513*437bfbebSnyanmisaka         regs->reg021.csc_ofst_u  = cfg_coeffs->_2u.offset;
514*437bfbebSnyanmisaka         regs->reg021.csc_ofst_v  = cfg_coeffs->_2v.offset;
515*437bfbebSnyanmisaka 
516*437bfbebSnyanmisaka         hal_h264e_dbg_flow("use color range %d colorspace %d", cfg_coeffs->dst_range, cfg_coeffs->color);
517*437bfbebSnyanmisaka     } else {
518*437bfbebSnyanmisaka         regs->reg018.csc_wgt_b2y = cfg.weight[0];
519*437bfbebSnyanmisaka         regs->reg018.csc_wgt_g2y = cfg.weight[1];
520*437bfbebSnyanmisaka         regs->reg018.csc_wgt_r2y = cfg.weight[2];
521*437bfbebSnyanmisaka 
522*437bfbebSnyanmisaka         regs->reg019.csc_wgt_b2u = cfg.weight[3];
523*437bfbebSnyanmisaka         regs->reg019.csc_wgt_g2u = cfg.weight[4];
524*437bfbebSnyanmisaka         regs->reg019.csc_wgt_r2u = cfg.weight[5];
525*437bfbebSnyanmisaka 
526*437bfbebSnyanmisaka         regs->reg020.csc_wgt_b2v = cfg.weight[6];
527*437bfbebSnyanmisaka         regs->reg020.csc_wgt_g2v = cfg.weight[7];
528*437bfbebSnyanmisaka         regs->reg020.csc_wgt_r2v = cfg.weight[8];
529*437bfbebSnyanmisaka 
530*437bfbebSnyanmisaka         regs->reg021.csc_ofst_y  = cfg.offset[0];
531*437bfbebSnyanmisaka         regs->reg021.csc_ofst_u  = cfg.offset[1];
532*437bfbebSnyanmisaka         regs->reg021.csc_ofst_v  = cfg.offset[2];
533*437bfbebSnyanmisaka     }
534*437bfbebSnyanmisaka 
535*437bfbebSnyanmisaka     regs->reg022.afbcd_en   = MPP_FRAME_FMT_IS_FBC(fmt) ? 1 : 0;
536*437bfbebSnyanmisaka     regs->reg069.src_strd0  = y_stride;
537*437bfbebSnyanmisaka     regs->reg069.src_strd1  = c_stride;
538*437bfbebSnyanmisaka 
539*437bfbebSnyanmisaka     regs->reg022.src_mirr   = prep->mirroring > 0;
540*437bfbebSnyanmisaka     regs->reg022.src_rot    = prep->rotation;
541*437bfbebSnyanmisaka     regs->reg022.txa_en     = 1;
542*437bfbebSnyanmisaka 
543*437bfbebSnyanmisaka     regs->reg023.sli_crs_en = 1;
544*437bfbebSnyanmisaka 
545*437bfbebSnyanmisaka     regs->reg068.pic_ofst_y = 0;
546*437bfbebSnyanmisaka     regs->reg068.pic_ofst_x = 0;
547*437bfbebSnyanmisaka 
548*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
549*437bfbebSnyanmisaka 
550*437bfbebSnyanmisaka     return ret;
551*437bfbebSnyanmisaka }
552*437bfbebSnyanmisaka 
setup_vepu541_codec(Vepu541H264eRegSet * regs,H264eSps * sps,H264ePps * pps,H264eSlice * slice)553*437bfbebSnyanmisaka static void setup_vepu541_codec(Vepu541H264eRegSet *regs, H264eSps *sps,
554*437bfbebSnyanmisaka                                 H264ePps *pps, H264eSlice *slice)
555*437bfbebSnyanmisaka {
556*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
557*437bfbebSnyanmisaka 
558*437bfbebSnyanmisaka     regs->reg013.enc_stnd       = 0;
559*437bfbebSnyanmisaka     regs->reg013.cur_frm_ref    = slice->nal_reference_idc > 0;
560*437bfbebSnyanmisaka     regs->reg013.bs_scp         = 1;
561*437bfbebSnyanmisaka     regs->reg013.lamb_mod_sel   = (slice->slice_type == H264_I_SLICE) ? 0 : 1;
562*437bfbebSnyanmisaka     regs->reg013.atr_thd_sel    = 0;
563*437bfbebSnyanmisaka     regs->reg013.node_int       = 0;
564*437bfbebSnyanmisaka 
565*437bfbebSnyanmisaka     regs->reg103.nal_ref_idc    = slice->nal_reference_idc;
566*437bfbebSnyanmisaka     regs->reg103.nal_unit_type  = slice->nalu_type;
567*437bfbebSnyanmisaka 
568*437bfbebSnyanmisaka     regs->reg104.max_fnum       = sps->log2_max_frame_num_minus4;
569*437bfbebSnyanmisaka     regs->reg104.drct_8x8       = sps->direct8x8_inference;
570*437bfbebSnyanmisaka     regs->reg104.mpoc_lm4       = sps->log2_max_poc_lsb_minus4;
571*437bfbebSnyanmisaka 
572*437bfbebSnyanmisaka     regs->reg105.etpy_mode      = pps->entropy_coding_mode;
573*437bfbebSnyanmisaka     regs->reg105.trns_8x8       = pps->transform_8x8_mode;
574*437bfbebSnyanmisaka     regs->reg105.csip_flag      = pps->constrained_intra_pred;
575*437bfbebSnyanmisaka     regs->reg105.num_ref0_idx   = pps->num_ref_idx_l0_default_active - 1;
576*437bfbebSnyanmisaka     regs->reg105.num_ref1_idx   = pps->num_ref_idx_l1_default_active - 1;
577*437bfbebSnyanmisaka     regs->reg105.pic_init_qp    = pps->pic_init_qp;
578*437bfbebSnyanmisaka     regs->reg105.cb_ofst        = pps->chroma_qp_index_offset;
579*437bfbebSnyanmisaka     regs->reg105.cr_ofst        = pps->second_chroma_qp_index_offset;
580*437bfbebSnyanmisaka     regs->reg105.wght_pred      = pps->weighted_pred;
581*437bfbebSnyanmisaka     regs->reg105.dbf_cp_flg     = pps->deblocking_filter_control;
582*437bfbebSnyanmisaka 
583*437bfbebSnyanmisaka     regs->reg106.sli_type       = (slice->slice_type == H264_I_SLICE) ? (2) : (0);
584*437bfbebSnyanmisaka     regs->reg106.pps_id         = slice->pic_parameter_set_id;
585*437bfbebSnyanmisaka     regs->reg106.drct_smvp      = 0;
586*437bfbebSnyanmisaka     regs->reg106.num_ref_ovrd   = slice->num_ref_idx_override;
587*437bfbebSnyanmisaka     regs->reg106.cbc_init_idc   = slice->cabac_init_idc;
588*437bfbebSnyanmisaka     regs->reg106.frm_num        = slice->frame_num;
589*437bfbebSnyanmisaka 
590*437bfbebSnyanmisaka     regs->reg107.idr_pic_id     = (slice->slice_type == H264_I_SLICE) ? slice->idr_pic_id : (RK_U32)(-1);
591*437bfbebSnyanmisaka     regs->reg107.poc_lsb        = slice->pic_order_cnt_lsb;
592*437bfbebSnyanmisaka 
593*437bfbebSnyanmisaka 
594*437bfbebSnyanmisaka     regs->reg108.dis_dblk_idc   = slice->disable_deblocking_filter_idc;
595*437bfbebSnyanmisaka     regs->reg108.sli_alph_ofst  = slice->slice_alpha_c0_offset_div2;
596*437bfbebSnyanmisaka 
597*437bfbebSnyanmisaka     h264e_reorder_rd_rewind(slice->reorder);
598*437bfbebSnyanmisaka     {   /* reorder process */
599*437bfbebSnyanmisaka         H264eRplmo rplmo;
600*437bfbebSnyanmisaka         MPP_RET ret = h264e_reorder_rd_op(slice->reorder, &rplmo);
601*437bfbebSnyanmisaka 
602*437bfbebSnyanmisaka         if (MPP_OK == ret) {
603*437bfbebSnyanmisaka             regs->reg108.ref_list0_rodr = 1;
604*437bfbebSnyanmisaka             regs->reg108.rodr_pic_idx   = rplmo.modification_of_pic_nums_idc;
605*437bfbebSnyanmisaka 
606*437bfbebSnyanmisaka             switch (rplmo.modification_of_pic_nums_idc) {
607*437bfbebSnyanmisaka             case 0 :
608*437bfbebSnyanmisaka             case 1 : {
609*437bfbebSnyanmisaka                 regs->reg108.rodr_pic_num   = rplmo.abs_diff_pic_num_minus1;
610*437bfbebSnyanmisaka             } break;
611*437bfbebSnyanmisaka             case 2 : {
612*437bfbebSnyanmisaka                 regs->reg108.rodr_pic_num   = rplmo.long_term_pic_idx;
613*437bfbebSnyanmisaka             } break;
614*437bfbebSnyanmisaka             default : {
615*437bfbebSnyanmisaka                 mpp_err_f("invalid modification_of_pic_nums_idc %d\n",
616*437bfbebSnyanmisaka                           rplmo.modification_of_pic_nums_idc);
617*437bfbebSnyanmisaka             } break;
618*437bfbebSnyanmisaka             }
619*437bfbebSnyanmisaka         } else {
620*437bfbebSnyanmisaka             // slice->ref_pic_list_modification_flag;
621*437bfbebSnyanmisaka             regs->reg108.ref_list0_rodr = 0;
622*437bfbebSnyanmisaka             regs->reg108.rodr_pic_idx   = 0;
623*437bfbebSnyanmisaka             regs->reg108.rodr_pic_num   = 0;
624*437bfbebSnyanmisaka         }
625*437bfbebSnyanmisaka     }
626*437bfbebSnyanmisaka 
627*437bfbebSnyanmisaka     /* clear all mmco arg first */
628*437bfbebSnyanmisaka     regs->reg109.nopp_flg               = 0;
629*437bfbebSnyanmisaka     regs->reg109.ltrf_flg               = 0;
630*437bfbebSnyanmisaka     regs->reg109.arpm_flg               = 0;
631*437bfbebSnyanmisaka     regs->reg109.mmco4_pre              = 0;
632*437bfbebSnyanmisaka     regs->reg109.mmco_type0             = 0;
633*437bfbebSnyanmisaka     regs->reg109.mmco_parm0             = 0;
634*437bfbebSnyanmisaka     regs->reg109.mmco_type1             = 0;
635*437bfbebSnyanmisaka     regs->reg110.mmco_parm1             = 0;
636*437bfbebSnyanmisaka     regs->reg109.mmco_type2             = 0;
637*437bfbebSnyanmisaka     regs->reg110.mmco_parm2             = 0;
638*437bfbebSnyanmisaka     regs->reg114.long_term_frame_idx0   = 0;
639*437bfbebSnyanmisaka     regs->reg114.long_term_frame_idx1   = 0;
640*437bfbebSnyanmisaka     regs->reg114.long_term_frame_idx2   = 0;
641*437bfbebSnyanmisaka 
642*437bfbebSnyanmisaka     h264e_marking_rd_rewind(slice->marking);
643*437bfbebSnyanmisaka 
644*437bfbebSnyanmisaka     /* only update used parameter */
645*437bfbebSnyanmisaka     if (slice->slice_type == H264_I_SLICE) {
646*437bfbebSnyanmisaka         regs->reg109.nopp_flg       = slice->no_output_of_prior_pics;
647*437bfbebSnyanmisaka         regs->reg109.ltrf_flg       = slice->long_term_reference_flag;
648*437bfbebSnyanmisaka     } else {
649*437bfbebSnyanmisaka         if (!h264e_marking_is_empty(slice->marking)) {
650*437bfbebSnyanmisaka             H264eMmco mmco;
651*437bfbebSnyanmisaka 
652*437bfbebSnyanmisaka             regs->reg109.arpm_flg       = 1;
653*437bfbebSnyanmisaka 
654*437bfbebSnyanmisaka             /* max 3 mmco */
655*437bfbebSnyanmisaka             do {
656*437bfbebSnyanmisaka                 RK_S32 type = 0;
657*437bfbebSnyanmisaka                 RK_S32 param_0 = 0;
658*437bfbebSnyanmisaka                 RK_S32 param_1 = 0;
659*437bfbebSnyanmisaka 
660*437bfbebSnyanmisaka                 h264e_marking_rd_op(slice->marking, &mmco);
661*437bfbebSnyanmisaka                 type = mmco.mmco;
662*437bfbebSnyanmisaka                 switch (type) {
663*437bfbebSnyanmisaka                 case 1 : {
664*437bfbebSnyanmisaka                     param_0 = mmco.difference_of_pic_nums_minus1;
665*437bfbebSnyanmisaka                 } break;
666*437bfbebSnyanmisaka                 case 2 : {
667*437bfbebSnyanmisaka                     param_0 = mmco.long_term_pic_num;
668*437bfbebSnyanmisaka                 } break;
669*437bfbebSnyanmisaka                 case 3 : {
670*437bfbebSnyanmisaka                     param_0 = mmco.difference_of_pic_nums_minus1;
671*437bfbebSnyanmisaka                     param_1 = mmco.long_term_frame_idx;
672*437bfbebSnyanmisaka                 } break;
673*437bfbebSnyanmisaka                 case 4 : {
674*437bfbebSnyanmisaka                     param_0 = mmco.max_long_term_frame_idx_plus1;
675*437bfbebSnyanmisaka                 } break;
676*437bfbebSnyanmisaka                 case 5 : {
677*437bfbebSnyanmisaka                 } break;
678*437bfbebSnyanmisaka                 case 6 : {
679*437bfbebSnyanmisaka                     param_0 = mmco.long_term_frame_idx;
680*437bfbebSnyanmisaka                 } break;
681*437bfbebSnyanmisaka                 default : {
682*437bfbebSnyanmisaka                     mpp_err_f("unsupported mmco 0 %d\n", type);
683*437bfbebSnyanmisaka                     type = 0;
684*437bfbebSnyanmisaka                 } break;
685*437bfbebSnyanmisaka                 }
686*437bfbebSnyanmisaka 
687*437bfbebSnyanmisaka                 regs->reg109.mmco_type0 = type;
688*437bfbebSnyanmisaka                 regs->reg109.mmco_parm0 = param_0;
689*437bfbebSnyanmisaka                 regs->reg114.long_term_frame_idx0 = param_1;
690*437bfbebSnyanmisaka 
691*437bfbebSnyanmisaka                 if (h264e_marking_is_empty(slice->marking))
692*437bfbebSnyanmisaka                     break;
693*437bfbebSnyanmisaka 
694*437bfbebSnyanmisaka                 h264e_marking_rd_op(slice->marking, &mmco);
695*437bfbebSnyanmisaka                 type = mmco.mmco;
696*437bfbebSnyanmisaka                 param_0 = 0;
697*437bfbebSnyanmisaka                 param_1 = 0;
698*437bfbebSnyanmisaka                 switch (type) {
699*437bfbebSnyanmisaka                 case 1 : {
700*437bfbebSnyanmisaka                     param_0 = mmco.difference_of_pic_nums_minus1;
701*437bfbebSnyanmisaka                 } break;
702*437bfbebSnyanmisaka                 case 2 : {
703*437bfbebSnyanmisaka                     param_0 = mmco.long_term_pic_num;
704*437bfbebSnyanmisaka                 } break;
705*437bfbebSnyanmisaka                 case 3 : {
706*437bfbebSnyanmisaka                     param_0 = mmco.difference_of_pic_nums_minus1;
707*437bfbebSnyanmisaka                     param_1 = mmco.long_term_frame_idx;
708*437bfbebSnyanmisaka                 } break;
709*437bfbebSnyanmisaka                 case 4 : {
710*437bfbebSnyanmisaka                     param_0 = mmco.max_long_term_frame_idx_plus1;
711*437bfbebSnyanmisaka                 } break;
712*437bfbebSnyanmisaka                 case 5 : {
713*437bfbebSnyanmisaka                 } break;
714*437bfbebSnyanmisaka                 case 6 : {
715*437bfbebSnyanmisaka                     param_0 = mmco.long_term_frame_idx;
716*437bfbebSnyanmisaka                 } break;
717*437bfbebSnyanmisaka                 default : {
718*437bfbebSnyanmisaka                     mpp_err_f("unsupported mmco 0 %d\n", type);
719*437bfbebSnyanmisaka                     type = 0;
720*437bfbebSnyanmisaka                 } break;
721*437bfbebSnyanmisaka                 }
722*437bfbebSnyanmisaka 
723*437bfbebSnyanmisaka                 regs->reg109.mmco_type1 = type;
724*437bfbebSnyanmisaka                 regs->reg110.mmco_parm1 = param_0;
725*437bfbebSnyanmisaka                 regs->reg114.long_term_frame_idx1 = param_1;
726*437bfbebSnyanmisaka 
727*437bfbebSnyanmisaka                 if (h264e_marking_is_empty(slice->marking))
728*437bfbebSnyanmisaka                     break;
729*437bfbebSnyanmisaka 
730*437bfbebSnyanmisaka                 h264e_marking_rd_op(slice->marking, &mmco);
731*437bfbebSnyanmisaka                 type = mmco.mmco;
732*437bfbebSnyanmisaka                 param_0 = 0;
733*437bfbebSnyanmisaka                 param_1 = 0;
734*437bfbebSnyanmisaka                 switch (type) {
735*437bfbebSnyanmisaka                 case 1 : {
736*437bfbebSnyanmisaka                     param_0 = mmco.difference_of_pic_nums_minus1;
737*437bfbebSnyanmisaka                 } break;
738*437bfbebSnyanmisaka                 case 2 : {
739*437bfbebSnyanmisaka                     param_0 = mmco.long_term_pic_num;
740*437bfbebSnyanmisaka                 } break;
741*437bfbebSnyanmisaka                 case 3 : {
742*437bfbebSnyanmisaka                     param_0 = mmco.difference_of_pic_nums_minus1;
743*437bfbebSnyanmisaka                     param_1 = mmco.long_term_frame_idx;
744*437bfbebSnyanmisaka                 } break;
745*437bfbebSnyanmisaka                 case 4 : {
746*437bfbebSnyanmisaka                     param_0 = mmco.max_long_term_frame_idx_plus1;
747*437bfbebSnyanmisaka                 } break;
748*437bfbebSnyanmisaka                 case 5 : {
749*437bfbebSnyanmisaka                 } break;
750*437bfbebSnyanmisaka                 case 6 : {
751*437bfbebSnyanmisaka                     param_0 = mmco.long_term_frame_idx;
752*437bfbebSnyanmisaka                 } break;
753*437bfbebSnyanmisaka                 default : {
754*437bfbebSnyanmisaka                     mpp_err_f("unsupported mmco 0 %d\n", type);
755*437bfbebSnyanmisaka                     type = 0;
756*437bfbebSnyanmisaka                 } break;
757*437bfbebSnyanmisaka                 }
758*437bfbebSnyanmisaka 
759*437bfbebSnyanmisaka                 regs->reg109.mmco_type2 = type;
760*437bfbebSnyanmisaka                 regs->reg110.mmco_parm2 = param_0;
761*437bfbebSnyanmisaka                 regs->reg114.long_term_frame_idx2 = param_1;
762*437bfbebSnyanmisaka             } while (0);
763*437bfbebSnyanmisaka         }
764*437bfbebSnyanmisaka     }
765*437bfbebSnyanmisaka 
766*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
767*437bfbebSnyanmisaka }
768*437bfbebSnyanmisaka 
setup_vepu541_rdo_pred(Vepu541H264eRegSet * regs,H264eSps * sps,H264ePps * pps,H264eSlice * slice,MppEncCfgSet * cfg)769*437bfbebSnyanmisaka static void setup_vepu541_rdo_pred(Vepu541H264eRegSet *regs, H264eSps *sps,
770*437bfbebSnyanmisaka                                    H264ePps *pps, H264eSlice *slice, MppEncCfgSet *cfg)
771*437bfbebSnyanmisaka {
772*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
773*437bfbebSnyanmisaka 
774*437bfbebSnyanmisaka     if (slice->slice_type == H264_I_SLICE) {
775*437bfbebSnyanmisaka         regs->reg025.chrm_klut_ofst = 0;
776*437bfbebSnyanmisaka         memcpy(&regs->reg026, &h264e_klut_weight[0], CHROMA_KLUT_TAB_SIZE);
777*437bfbebSnyanmisaka     } else {
778*437bfbebSnyanmisaka         regs->reg025.chrm_klut_ofst = 3;
779*437bfbebSnyanmisaka         if (cfg->tune.scene_mode == MPP_ENC_SCENE_MODE_IPC)
780*437bfbebSnyanmisaka             memcpy(&regs->reg026, &h264e_klut_weight[3], CHROMA_KLUT_TAB_SIZE);
781*437bfbebSnyanmisaka         else
782*437bfbebSnyanmisaka             memcpy(&regs->reg026, &h264e_klut_weight[0], CHROMA_KLUT_TAB_SIZE);
783*437bfbebSnyanmisaka     }
784*437bfbebSnyanmisaka 
785*437bfbebSnyanmisaka     if (cfg->tune.scene_mode == MPP_ENC_SCENE_MODE_IPC) {
786*437bfbebSnyanmisaka         regs->reg101.vthd_y         = 9;
787*437bfbebSnyanmisaka         regs->reg101.vthd_c         = 63;
788*437bfbebSnyanmisaka         regs->reg102.inter_4x4      = 0;
789*437bfbebSnyanmisaka         regs->reg102.rdo_mask       = 24;
790*437bfbebSnyanmisaka         regs->reg102.atf_intra_e    = 1;
791*437bfbebSnyanmisaka     } else {
792*437bfbebSnyanmisaka         regs->reg101.vthd_y         = 2501;
793*437bfbebSnyanmisaka         regs->reg101.vthd_c         = 2501;
794*437bfbebSnyanmisaka         regs->reg102.inter_4x4      = 1;
795*437bfbebSnyanmisaka         regs->reg102.rdo_mask       = 0;
796*437bfbebSnyanmisaka         regs->reg102.atf_intra_e    = 0;
797*437bfbebSnyanmisaka     }
798*437bfbebSnyanmisaka 
799*437bfbebSnyanmisaka     regs->reg102.rect_size      = (sps->profile_idc == H264_PROFILE_BASELINE &&
800*437bfbebSnyanmisaka                                    sps->level_idc <= H264_LEVEL_3_0) ? 1 : 0;
801*437bfbebSnyanmisaka 
802*437bfbebSnyanmisaka     regs->reg102.vlc_lmt        = (sps->profile_idc < H264_PROFILE_MAIN) &&
803*437bfbebSnyanmisaka                                   !pps->entropy_coding_mode;
804*437bfbebSnyanmisaka     regs->reg102.chrm_spcl      = 1;
805*437bfbebSnyanmisaka     regs->reg102.ccwa_e         = 1;
806*437bfbebSnyanmisaka     regs->reg102.scl_lst_sel    = pps->pic_scaling_matrix_present;
807*437bfbebSnyanmisaka     regs->reg102.scl_lst_sel_   = pps->pic_scaling_matrix_present;
808*437bfbebSnyanmisaka     regs->reg102.atr_e          = 1;
809*437bfbebSnyanmisaka     regs->reg102.atf_edg        = 0;
810*437bfbebSnyanmisaka     regs->reg102.atf_lvl_e      = 0;
811*437bfbebSnyanmisaka     regs->reg102.satd_byps_flg  = 0;
812*437bfbebSnyanmisaka 
813*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
814*437bfbebSnyanmisaka }
815*437bfbebSnyanmisaka 
setup_vepu541_rc_base(Vepu541H264eRegSet * regs,H264eSps * sps,H264eSlice * slice,MppEncHwCfg * hw,EncRcTask * rc_task)816*437bfbebSnyanmisaka static void setup_vepu541_rc_base(Vepu541H264eRegSet *regs, H264eSps *sps,
817*437bfbebSnyanmisaka                                   H264eSlice *slice, MppEncHwCfg *hw,
818*437bfbebSnyanmisaka                                   EncRcTask *rc_task)
819*437bfbebSnyanmisaka {
820*437bfbebSnyanmisaka     EncRcTaskInfo *rc_info = &rc_task->info;
821*437bfbebSnyanmisaka     RK_S32 mb_w = sps->pic_width_in_mbs;
822*437bfbebSnyanmisaka     RK_S32 mb_h = sps->pic_height_in_mbs;
823*437bfbebSnyanmisaka     RK_U32 qp_target = rc_info->quality_target;
824*437bfbebSnyanmisaka     RK_U32 qp_min = rc_info->quality_min;
825*437bfbebSnyanmisaka     RK_U32 qp_max = rc_info->quality_max;
826*437bfbebSnyanmisaka     RK_U32 qpmap_mode = 1;
827*437bfbebSnyanmisaka     RK_S32 mb_target_bits_mul_16 = (rc_info->bit_target << 4) / (mb_w * mb_h);
828*437bfbebSnyanmisaka     RK_S32 mb_target_bits;
829*437bfbebSnyanmisaka     RK_S32 negative_bits_thd;
830*437bfbebSnyanmisaka     RK_S32 positive_bits_thd;
831*437bfbebSnyanmisaka 
832*437bfbebSnyanmisaka     hal_h264e_dbg_rc("bittarget %d qp [%d %d %d]\n", rc_info->bit_target,
833*437bfbebSnyanmisaka                      qp_min, qp_target, qp_max);
834*437bfbebSnyanmisaka 
835*437bfbebSnyanmisaka     if (mb_target_bits_mul_16 >= 0x100000) {
836*437bfbebSnyanmisaka         mb_target_bits_mul_16 = 0x50000;
837*437bfbebSnyanmisaka     }
838*437bfbebSnyanmisaka 
839*437bfbebSnyanmisaka     mb_target_bits = (mb_target_bits_mul_16 * mb_w) >> 4;
840*437bfbebSnyanmisaka     negative_bits_thd = 0 - mb_target_bits  * 5 / 16;
841*437bfbebSnyanmisaka     positive_bits_thd = mb_target_bits  * 5 / 16;
842*437bfbebSnyanmisaka 
843*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
844*437bfbebSnyanmisaka 
845*437bfbebSnyanmisaka     regs->reg013.pic_qp         = qp_target;
846*437bfbebSnyanmisaka 
847*437bfbebSnyanmisaka     regs->reg050.rc_en          = 1;
848*437bfbebSnyanmisaka     regs->reg050.aq_en          = 1;
849*437bfbebSnyanmisaka     regs->reg050.aq_mode        = 0;
850*437bfbebSnyanmisaka     regs->reg050.rc_ctu_num     = mb_w;
851*437bfbebSnyanmisaka 
852*437bfbebSnyanmisaka     regs->reg051.rc_qp_range    = (slice->slice_type == H264_I_SLICE) ?
853*437bfbebSnyanmisaka                                   hw->qp_delta_row_i : hw->qp_delta_row;
854*437bfbebSnyanmisaka     regs->reg051.rc_max_qp      = qp_max;
855*437bfbebSnyanmisaka     regs->reg051.rc_min_qp      = qp_min;
856*437bfbebSnyanmisaka 
857*437bfbebSnyanmisaka     regs->reg052.ctu_ebit       = mb_target_bits_mul_16;
858*437bfbebSnyanmisaka 
859*437bfbebSnyanmisaka     regs->reg053.qp_adj0        = -2;
860*437bfbebSnyanmisaka     regs->reg053.qp_adj1        = -1;
861*437bfbebSnyanmisaka     regs->reg053.qp_adj2        = 0;
862*437bfbebSnyanmisaka     regs->reg053.qp_adj3        = 1;
863*437bfbebSnyanmisaka     regs->reg053.qp_adj4        = 2;
864*437bfbebSnyanmisaka     regs->reg054.qp_adj5        = 0;
865*437bfbebSnyanmisaka     regs->reg054.qp_adj6        = 0;
866*437bfbebSnyanmisaka     regs->reg054.qp_adj7        = 0;
867*437bfbebSnyanmisaka     regs->reg054.qp_adj8        = 0;
868*437bfbebSnyanmisaka 
869*437bfbebSnyanmisaka     regs->reg055_063.rc_dthd[0] = 2 * negative_bits_thd;
870*437bfbebSnyanmisaka     regs->reg055_063.rc_dthd[1] = negative_bits_thd;
871*437bfbebSnyanmisaka     regs->reg055_063.rc_dthd[2] = positive_bits_thd;
872*437bfbebSnyanmisaka     regs->reg055_063.rc_dthd[3] = 2 * positive_bits_thd;
873*437bfbebSnyanmisaka     regs->reg055_063.rc_dthd[4] = 0x7fffffff;
874*437bfbebSnyanmisaka     regs->reg055_063.rc_dthd[5] = 0x7fffffff;
875*437bfbebSnyanmisaka     regs->reg055_063.rc_dthd[6] = 0x7fffffff;
876*437bfbebSnyanmisaka     regs->reg055_063.rc_dthd[7] = 0x7fffffff;
877*437bfbebSnyanmisaka     regs->reg055_063.rc_dthd[8] = 0x7fffffff;
878*437bfbebSnyanmisaka 
879*437bfbebSnyanmisaka     regs->reg064.qpmin_area0    = qp_min;
880*437bfbebSnyanmisaka     regs->reg064.qpmax_area0    = qp_max;
881*437bfbebSnyanmisaka     regs->reg064.qpmin_area1    = qp_min;
882*437bfbebSnyanmisaka     regs->reg064.qpmax_area1    = qp_max;
883*437bfbebSnyanmisaka     regs->reg064.qpmin_area2    = qp_min;
884*437bfbebSnyanmisaka 
885*437bfbebSnyanmisaka     regs->reg065.qpmax_area2    = qp_max;
886*437bfbebSnyanmisaka     regs->reg065.qpmin_area3    = qp_min;
887*437bfbebSnyanmisaka     regs->reg065.qpmax_area3    = qp_max;
888*437bfbebSnyanmisaka     regs->reg065.qpmin_area4    = qp_min;
889*437bfbebSnyanmisaka     regs->reg065.qpmax_area4    = qp_max;
890*437bfbebSnyanmisaka 
891*437bfbebSnyanmisaka     regs->reg066.qpmin_area5    = qp_min;
892*437bfbebSnyanmisaka     regs->reg066.qpmax_area5    = qp_max;
893*437bfbebSnyanmisaka     regs->reg066.qpmin_area6    = qp_min;
894*437bfbebSnyanmisaka     regs->reg066.qpmax_area6    = qp_max;
895*437bfbebSnyanmisaka     regs->reg066.qpmin_area7    = qp_min;
896*437bfbebSnyanmisaka 
897*437bfbebSnyanmisaka     regs->reg067.qpmax_area7    = qp_max;
898*437bfbebSnyanmisaka     regs->reg067.qpmap_mode     = qpmap_mode;
899*437bfbebSnyanmisaka 
900*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
901*437bfbebSnyanmisaka }
902*437bfbebSnyanmisaka 
setup_vepu541_io_buf(Vepu541H264eRegSet * regs,MppDev dev,HalEncTask * task)903*437bfbebSnyanmisaka static void setup_vepu541_io_buf(Vepu541H264eRegSet *regs, MppDev dev,
904*437bfbebSnyanmisaka                                  HalEncTask *task)
905*437bfbebSnyanmisaka {
906*437bfbebSnyanmisaka     MppFrame frm = task->frame;
907*437bfbebSnyanmisaka     MppPacket pkt = task->packet;
908*437bfbebSnyanmisaka     MppBuffer buf_in = mpp_frame_get_buffer(frm);
909*437bfbebSnyanmisaka     MppBuffer buf_out = task->output;
910*437bfbebSnyanmisaka     MppFrameFormat fmt = mpp_frame_get_fmt(frm);
911*437bfbebSnyanmisaka     RK_S32 hor_stride = mpp_frame_get_hor_stride(frm);
912*437bfbebSnyanmisaka     RK_S32 ver_stride = mpp_frame_get_ver_stride(frm);
913*437bfbebSnyanmisaka     RK_S32 fd_in = mpp_buffer_get_fd(buf_in);
914*437bfbebSnyanmisaka     RK_U32 off_in[2] = {0};
915*437bfbebSnyanmisaka     RK_U32 off_out = mpp_packet_get_length(pkt);
916*437bfbebSnyanmisaka     size_t siz_out = mpp_buffer_get_size(buf_out);
917*437bfbebSnyanmisaka     RK_S32 fd_out = mpp_buffer_get_fd(buf_out);
918*437bfbebSnyanmisaka 
919*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
920*437bfbebSnyanmisaka 
921*437bfbebSnyanmisaka     regs->reg070.adr_src0   = fd_in;
922*437bfbebSnyanmisaka     regs->reg071.adr_src1   = fd_in;
923*437bfbebSnyanmisaka     regs->reg072.adr_src2   = fd_in;
924*437bfbebSnyanmisaka 
925*437bfbebSnyanmisaka     regs->reg084.bsbb_addr  = fd_out;
926*437bfbebSnyanmisaka     regs->reg085.bsbr_addr  = fd_out;
927*437bfbebSnyanmisaka     regs->reg086.adr_bsbs   = fd_out;
928*437bfbebSnyanmisaka     regs->reg083.bsbt_addr  = fd_out;
929*437bfbebSnyanmisaka 
930*437bfbebSnyanmisaka     if (MPP_FRAME_FMT_IS_FBC(fmt)) {
931*437bfbebSnyanmisaka         off_in[0] = mpp_frame_get_fbc_offset(frm);;
932*437bfbebSnyanmisaka         off_in[1] = 0;
933*437bfbebSnyanmisaka     } else if (MPP_FRAME_FMT_IS_YUV(fmt)) {
934*437bfbebSnyanmisaka         VepuFmtCfg cfg;
935*437bfbebSnyanmisaka 
936*437bfbebSnyanmisaka         vepu5xx_set_fmt(&cfg, fmt);
937*437bfbebSnyanmisaka         switch (cfg.format) {
938*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGRA8888 :
939*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGR888 :
940*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGR565 : {
941*437bfbebSnyanmisaka             off_in[0] = 0;
942*437bfbebSnyanmisaka             off_in[1] = 0;
943*437bfbebSnyanmisaka         } break;
944*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV420SP :
945*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV422SP : {
946*437bfbebSnyanmisaka             off_in[0] = hor_stride * ver_stride;
947*437bfbebSnyanmisaka             off_in[1] = hor_stride * ver_stride;
948*437bfbebSnyanmisaka         } break;
949*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV422P : {
950*437bfbebSnyanmisaka             off_in[0] = hor_stride * ver_stride;
951*437bfbebSnyanmisaka             off_in[1] = hor_stride * ver_stride * 3 / 2;
952*437bfbebSnyanmisaka         } break;
953*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV420P : {
954*437bfbebSnyanmisaka             off_in[0] = hor_stride * ver_stride;
955*437bfbebSnyanmisaka             off_in[1] = hor_stride * ver_stride * 5 / 4;
956*437bfbebSnyanmisaka         } break;
957*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV400 :
958*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUYV422 :
959*437bfbebSnyanmisaka         case VEPU5xx_FMT_UYVY422 : {
960*437bfbebSnyanmisaka             off_in[0] = 0;
961*437bfbebSnyanmisaka             off_in[1] = 0;
962*437bfbebSnyanmisaka         } break;
963*437bfbebSnyanmisaka         default : {
964*437bfbebSnyanmisaka             off_in[0] = 0;
965*437bfbebSnyanmisaka             off_in[1] = 0;
966*437bfbebSnyanmisaka         } break;
967*437bfbebSnyanmisaka         }
968*437bfbebSnyanmisaka     }
969*437bfbebSnyanmisaka 
970*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(dev, 71, off_in[0]);
971*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(dev, 72, off_in[1]);
972*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(dev, 83, siz_out);
973*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(dev, 86, off_out);
974*437bfbebSnyanmisaka 
975*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
976*437bfbebSnyanmisaka }
977*437bfbebSnyanmisaka 
setup_vepu541_intra_refresh(Vepu541H264eRegSet * regs,HalH264eVepu541Ctx * ctx,RK_U32 refresh_idx)978*437bfbebSnyanmisaka static MPP_RET setup_vepu541_intra_refresh(Vepu541H264eRegSet *regs, HalH264eVepu541Ctx *ctx, RK_U32 refresh_idx)
979*437bfbebSnyanmisaka {
980*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
981*437bfbebSnyanmisaka     RK_U32 w = ctx->sps->pic_width_in_mbs * 16;
982*437bfbebSnyanmisaka     RK_U32 h = ctx->sps->pic_height_in_mbs * 16;
983*437bfbebSnyanmisaka     MppEncROIRegion *region = NULL;
984*437bfbebSnyanmisaka     RK_U32 refresh_num = ctx->cfg->rc.refresh_num;
985*437bfbebSnyanmisaka     RK_U32 stride_h = MPP_ALIGN(w / 16, 4);
986*437bfbebSnyanmisaka     RK_U32 stride_v = MPP_ALIGN(h / 16, 4);
987*437bfbebSnyanmisaka     RK_U32 i = 0;
988*437bfbebSnyanmisaka     RK_S32 roi_buf_size;
989*437bfbebSnyanmisaka 
990*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
991*437bfbebSnyanmisaka 
992*437bfbebSnyanmisaka     if (!ctx->cfg->rc.refresh_en) {
993*437bfbebSnyanmisaka         ret = MPP_ERR_VALUE;
994*437bfbebSnyanmisaka         goto RET;
995*437bfbebSnyanmisaka     }
996*437bfbebSnyanmisaka 
997*437bfbebSnyanmisaka     roi_buf_size = vepu541_get_roi_buf_size(w, h);
998*437bfbebSnyanmisaka     if (ctx->roi_buf_size < roi_buf_size) {
999*437bfbebSnyanmisaka         if (NULL == ctx->roi_grp)
1000*437bfbebSnyanmisaka             mpp_buffer_group_get_internal(&ctx->roi_grp, MPP_BUFFER_TYPE_ION);
1001*437bfbebSnyanmisaka         if (ctx->roi_buf)
1002*437bfbebSnyanmisaka             mpp_buffer_put(ctx->roi_buf);
1003*437bfbebSnyanmisaka 
1004*437bfbebSnyanmisaka         mpp_buffer_get(ctx->roi_grp, &ctx->roi_buf, roi_buf_size);
1005*437bfbebSnyanmisaka         ctx->roi_buf_size = roi_buf_size;
1006*437bfbebSnyanmisaka     }
1007*437bfbebSnyanmisaka 
1008*437bfbebSnyanmisaka     mpp_assert(ctx->roi_buf);
1009*437bfbebSnyanmisaka     RK_S32 fd = mpp_buffer_get_fd(ctx->roi_buf);
1010*437bfbebSnyanmisaka     void *buf = mpp_buffer_get_ptr(ctx->roi_buf);
1011*437bfbebSnyanmisaka     Vepu541RoiCfg cfg;
1012*437bfbebSnyanmisaka     Vepu541RoiCfg *ptr = (Vepu541RoiCfg *)buf;
1013*437bfbebSnyanmisaka     cfg.force_intra = 0;
1014*437bfbebSnyanmisaka     cfg.reserved    = 0;
1015*437bfbebSnyanmisaka     cfg.qp_area_idx = 0;
1016*437bfbebSnyanmisaka     cfg.qp_area_en  = 1;
1017*437bfbebSnyanmisaka     cfg.qp_adj      = 0;
1018*437bfbebSnyanmisaka     cfg.qp_adj_mode = 0;
1019*437bfbebSnyanmisaka 
1020*437bfbebSnyanmisaka     for (i = 0; i < stride_h * stride_v; i++, ptr++)
1021*437bfbebSnyanmisaka         memcpy(ptr, &cfg, sizeof(cfg));
1022*437bfbebSnyanmisaka 
1023*437bfbebSnyanmisaka     region = mpp_calloc(MppEncROIRegion, 1);
1024*437bfbebSnyanmisaka 
1025*437bfbebSnyanmisaka     if (NULL == region) {
1026*437bfbebSnyanmisaka         mpp_err_f("Failed to calloc for MppEncROIRegion !\n");
1027*437bfbebSnyanmisaka         ret = MPP_ERR_MALLOC;
1028*437bfbebSnyanmisaka     }
1029*437bfbebSnyanmisaka 
1030*437bfbebSnyanmisaka     if (ctx->cfg->rc.refresh_mode == MPP_ENC_RC_INTRA_REFRESH_ROW) {
1031*437bfbebSnyanmisaka         region->x = 0;
1032*437bfbebSnyanmisaka         region->w = w;
1033*437bfbebSnyanmisaka         if (refresh_idx > 0) {
1034*437bfbebSnyanmisaka             region->y = refresh_idx * 16 * refresh_num - 32;
1035*437bfbebSnyanmisaka             region->h = 16 * refresh_num + 32;
1036*437bfbebSnyanmisaka         } else {
1037*437bfbebSnyanmisaka             region->y = refresh_idx * 16 * refresh_num;
1038*437bfbebSnyanmisaka             region->h = 16 * refresh_num;
1039*437bfbebSnyanmisaka         }
1040*437bfbebSnyanmisaka         regs->reg089.cme_srch_v = 1;
1041*437bfbebSnyanmisaka     } else if (ctx->cfg->rc.refresh_mode == MPP_ENC_RC_INTRA_REFRESH_COL) {
1042*437bfbebSnyanmisaka         region->y = 0;
1043*437bfbebSnyanmisaka         region->h = h;
1044*437bfbebSnyanmisaka         if (refresh_idx > 0) {
1045*437bfbebSnyanmisaka             region->x = refresh_idx * 16 * refresh_num - 32;
1046*437bfbebSnyanmisaka             region->w = 16 * refresh_num + 32;
1047*437bfbebSnyanmisaka         } else {
1048*437bfbebSnyanmisaka             region->x = refresh_idx * 16 * refresh_num;
1049*437bfbebSnyanmisaka             region->w = 16 * refresh_num;
1050*437bfbebSnyanmisaka         }
1051*437bfbebSnyanmisaka         regs->reg089.cme_srch_h = 1;
1052*437bfbebSnyanmisaka     }
1053*437bfbebSnyanmisaka 
1054*437bfbebSnyanmisaka     region->intra = 1;
1055*437bfbebSnyanmisaka     region->quality = -ctx->cfg->rc.qp_delta_ip;
1056*437bfbebSnyanmisaka 
1057*437bfbebSnyanmisaka     region->area_map_en = 1;
1058*437bfbebSnyanmisaka     region->qp_area_idx = 1;
1059*437bfbebSnyanmisaka     region->abs_qp_en = 0;
1060*437bfbebSnyanmisaka 
1061*437bfbebSnyanmisaka     regs->reg013.roi_enc = 1;
1062*437bfbebSnyanmisaka     regs->reg073.roi_addr = fd;
1063*437bfbebSnyanmisaka     vepu541_set_one_roi(buf, region, w, h);
1064*437bfbebSnyanmisaka     mpp_free(region);
1065*437bfbebSnyanmisaka     mpp_buffer_sync_end(ctx->roi_buf);
1066*437bfbebSnyanmisaka 
1067*437bfbebSnyanmisaka RET:
1068*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave, ret %d\n", ret);
1069*437bfbebSnyanmisaka     return ret;
1070*437bfbebSnyanmisaka }
1071*437bfbebSnyanmisaka 
setup_vepu541_roi(Vepu541H264eRegSet * regs,HalH264eVepu541Ctx * ctx)1072*437bfbebSnyanmisaka static void setup_vepu541_roi(Vepu541H264eRegSet *regs, HalH264eVepu541Ctx *ctx)
1073*437bfbebSnyanmisaka {
1074*437bfbebSnyanmisaka 
1075*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
1076*437bfbebSnyanmisaka 
1077*437bfbebSnyanmisaka     if (ctx->roi_data2) {
1078*437bfbebSnyanmisaka         MppEncROICfg2 *cfg = ( MppEncROICfg2 *)ctx->roi_data2;
1079*437bfbebSnyanmisaka 
1080*437bfbebSnyanmisaka         regs->reg013.roi_enc = 1;
1081*437bfbebSnyanmisaka         regs->reg073.roi_addr = mpp_buffer_get_fd(cfg->base_cfg_buf);
1082*437bfbebSnyanmisaka     } else if (ctx->qpmap) {
1083*437bfbebSnyanmisaka         regs->reg013.roi_enc = 1;
1084*437bfbebSnyanmisaka         regs->reg073.roi_addr = mpp_buffer_get_fd(ctx->qpmap);
1085*437bfbebSnyanmisaka     } else {
1086*437bfbebSnyanmisaka         MppEncROICfg *roi = ctx->roi_data;
1087*437bfbebSnyanmisaka         RK_U32 w = ctx->sps->pic_width_in_mbs * 16;
1088*437bfbebSnyanmisaka         RK_U32 h = ctx->sps->pic_height_in_mbs * 16;
1089*437bfbebSnyanmisaka 
1090*437bfbebSnyanmisaka         /* roi setup */
1091*437bfbebSnyanmisaka         if (roi && roi->number && roi->regions) {
1092*437bfbebSnyanmisaka             RK_S32 roi_buf_size = vepu541_get_roi_buf_size(w, h);
1093*437bfbebSnyanmisaka 
1094*437bfbebSnyanmisaka             if (!ctx->roi_buf || roi_buf_size != ctx->roi_buf_size) {
1095*437bfbebSnyanmisaka                 if (NULL == ctx->roi_grp)
1096*437bfbebSnyanmisaka                     mpp_buffer_group_get_internal(&ctx->roi_grp, MPP_BUFFER_TYPE_ION);
1097*437bfbebSnyanmisaka                 else if (roi_buf_size != ctx->roi_buf_size) {
1098*437bfbebSnyanmisaka                     if (ctx->roi_buf) {
1099*437bfbebSnyanmisaka                         mpp_buffer_put(ctx->roi_buf);
1100*437bfbebSnyanmisaka                         ctx->roi_buf = NULL;
1101*437bfbebSnyanmisaka                     }
1102*437bfbebSnyanmisaka                     mpp_buffer_group_clear(ctx->roi_grp);
1103*437bfbebSnyanmisaka                 }
1104*437bfbebSnyanmisaka 
1105*437bfbebSnyanmisaka                 mpp_assert(ctx->roi_grp);
1106*437bfbebSnyanmisaka 
1107*437bfbebSnyanmisaka                 if (NULL == ctx->roi_buf)
1108*437bfbebSnyanmisaka                     mpp_buffer_get(ctx->roi_grp, &ctx->roi_buf, roi_buf_size);
1109*437bfbebSnyanmisaka 
1110*437bfbebSnyanmisaka                 ctx->roi_buf_size = roi_buf_size;
1111*437bfbebSnyanmisaka             }
1112*437bfbebSnyanmisaka 
1113*437bfbebSnyanmisaka             mpp_assert(ctx->roi_buf);
1114*437bfbebSnyanmisaka             RK_S32 fd = mpp_buffer_get_fd(ctx->roi_buf);
1115*437bfbebSnyanmisaka             void *buf = mpp_buffer_get_ptr(ctx->roi_buf);
1116*437bfbebSnyanmisaka 
1117*437bfbebSnyanmisaka             regs->reg013.roi_enc = 1;
1118*437bfbebSnyanmisaka             regs->reg073.roi_addr = fd;
1119*437bfbebSnyanmisaka 
1120*437bfbebSnyanmisaka             vepu541_set_roi(buf, roi, w, h);
1121*437bfbebSnyanmisaka             mpp_buffer_sync_end(ctx->roi_buf);
1122*437bfbebSnyanmisaka         } else {
1123*437bfbebSnyanmisaka             regs->reg013.roi_enc = 0;
1124*437bfbebSnyanmisaka             regs->reg073.roi_addr = 0;
1125*437bfbebSnyanmisaka         }
1126*437bfbebSnyanmisaka     }
1127*437bfbebSnyanmisaka 
1128*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
1129*437bfbebSnyanmisaka }
1130*437bfbebSnyanmisaka 
setup_vepu541_recn_refr(Vepu541H264eRegSet * regs,MppDev dev,H264eFrmInfo * frms,HalBufs bufs,RK_S32 fbc_hdr_size)1131*437bfbebSnyanmisaka static void setup_vepu541_recn_refr(Vepu541H264eRegSet *regs, MppDev dev,
1132*437bfbebSnyanmisaka                                     H264eFrmInfo *frms, HalBufs bufs,
1133*437bfbebSnyanmisaka                                     RK_S32 fbc_hdr_size)
1134*437bfbebSnyanmisaka {
1135*437bfbebSnyanmisaka     HalBuf *curr = hal_bufs_get_buf(bufs, frms->curr_idx);
1136*437bfbebSnyanmisaka     HalBuf *refr = hal_bufs_get_buf(bufs, frms->refr_idx);
1137*437bfbebSnyanmisaka 
1138*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
1139*437bfbebSnyanmisaka 
1140*437bfbebSnyanmisaka     if (curr && curr->cnt) {
1141*437bfbebSnyanmisaka         MppBuffer buf_pixel = curr->buf[0];
1142*437bfbebSnyanmisaka         MppBuffer buf_thumb = curr->buf[1];
1143*437bfbebSnyanmisaka         RK_S32 fd = mpp_buffer_get_fd(buf_pixel);
1144*437bfbebSnyanmisaka 
1145*437bfbebSnyanmisaka         mpp_assert(buf_pixel);
1146*437bfbebSnyanmisaka         mpp_assert(buf_thumb);
1147*437bfbebSnyanmisaka 
1148*437bfbebSnyanmisaka         regs->reg074.rfpw_h_addr = fd;
1149*437bfbebSnyanmisaka         regs->reg075.rfpw_b_addr = fd;
1150*437bfbebSnyanmisaka         regs->reg080.dspw_addr = mpp_buffer_get_fd(buf_thumb);
1151*437bfbebSnyanmisaka 
1152*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(dev, 75, fbc_hdr_size);
1153*437bfbebSnyanmisaka     }
1154*437bfbebSnyanmisaka 
1155*437bfbebSnyanmisaka     if (refr && refr->cnt) {
1156*437bfbebSnyanmisaka         MppBuffer buf_pixel = refr->buf[0];
1157*437bfbebSnyanmisaka         MppBuffer buf_thumb = refr->buf[1];
1158*437bfbebSnyanmisaka         RK_S32 fd = mpp_buffer_get_fd(buf_pixel);
1159*437bfbebSnyanmisaka 
1160*437bfbebSnyanmisaka         mpp_assert(buf_pixel);
1161*437bfbebSnyanmisaka         mpp_assert(buf_thumb);
1162*437bfbebSnyanmisaka 
1163*437bfbebSnyanmisaka         regs->reg076.rfpr_h_addr = fd;
1164*437bfbebSnyanmisaka         regs->reg077.rfpr_b_addr = fd;
1165*437bfbebSnyanmisaka         regs->reg081.dspr_addr = mpp_buffer_get_fd(buf_thumb);
1166*437bfbebSnyanmisaka 
1167*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(dev, 77, fbc_hdr_size);
1168*437bfbebSnyanmisaka     }
1169*437bfbebSnyanmisaka 
1170*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
1171*437bfbebSnyanmisaka }
1172*437bfbebSnyanmisaka 
setup_vepu541_split(Vepu541H264eRegSet * regs,MppEncSliceSplit * cfg)1173*437bfbebSnyanmisaka static void setup_vepu541_split(Vepu541H264eRegSet *regs, MppEncSliceSplit *cfg)
1174*437bfbebSnyanmisaka {
1175*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
1176*437bfbebSnyanmisaka 
1177*437bfbebSnyanmisaka     switch (cfg->split_mode) {
1178*437bfbebSnyanmisaka     case MPP_ENC_SPLIT_NONE : {
1179*437bfbebSnyanmisaka         regs->reg087.sli_splt = 0;
1180*437bfbebSnyanmisaka         regs->reg087.sli_splt_mode = 0;
1181*437bfbebSnyanmisaka         regs->reg087.sli_splt_cpst = 0;
1182*437bfbebSnyanmisaka         regs->reg087.sli_max_num_m1 = 0;
1183*437bfbebSnyanmisaka         regs->reg087.sli_flsh = 0;
1184*437bfbebSnyanmisaka         regs->reg087.sli_splt_cnum_m1 = 0;
1185*437bfbebSnyanmisaka 
1186*437bfbebSnyanmisaka         regs->reg088.sli_splt_byte = 0;
1187*437bfbebSnyanmisaka         regs->reg013.slen_fifo = 0;
1188*437bfbebSnyanmisaka     } break;
1189*437bfbebSnyanmisaka     case MPP_ENC_SPLIT_BY_BYTE : {
1190*437bfbebSnyanmisaka         regs->reg087.sli_splt = 1;
1191*437bfbebSnyanmisaka         regs->reg087.sli_splt_mode = 0;
1192*437bfbebSnyanmisaka         regs->reg087.sli_splt_cpst = 0;
1193*437bfbebSnyanmisaka         regs->reg087.sli_max_num_m1 = 500;
1194*437bfbebSnyanmisaka         regs->reg087.sli_flsh = 1;
1195*437bfbebSnyanmisaka         regs->reg087.sli_splt_cnum_m1 = 0;
1196*437bfbebSnyanmisaka 
1197*437bfbebSnyanmisaka         regs->reg088.sli_splt_byte = cfg->split_arg;
1198*437bfbebSnyanmisaka         regs->reg013.slen_fifo = 0;
1199*437bfbebSnyanmisaka     } break;
1200*437bfbebSnyanmisaka     case MPP_ENC_SPLIT_BY_CTU : {
1201*437bfbebSnyanmisaka         regs->reg087.sli_splt = 1;
1202*437bfbebSnyanmisaka         regs->reg087.sli_splt_mode = 1;
1203*437bfbebSnyanmisaka         regs->reg087.sli_splt_cpst = 0;
1204*437bfbebSnyanmisaka         regs->reg087.sli_max_num_m1 = 500;
1205*437bfbebSnyanmisaka         regs->reg087.sli_flsh = 1;
1206*437bfbebSnyanmisaka         regs->reg087.sli_splt_cnum_m1 = cfg->split_arg - 1;
1207*437bfbebSnyanmisaka 
1208*437bfbebSnyanmisaka         regs->reg088.sli_splt_byte = 0;
1209*437bfbebSnyanmisaka         regs->reg013.slen_fifo = 0;
1210*437bfbebSnyanmisaka     } break;
1211*437bfbebSnyanmisaka     default : {
1212*437bfbebSnyanmisaka         mpp_log_f("invalide slice split mode %d\n", cfg->split_mode);
1213*437bfbebSnyanmisaka     } break;
1214*437bfbebSnyanmisaka     }
1215*437bfbebSnyanmisaka 
1216*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
1217*437bfbebSnyanmisaka }
1218*437bfbebSnyanmisaka 
setup_vepu540_force_slice_split(Vepu541H264eRegSet * regs,RK_S32 width)1219*437bfbebSnyanmisaka static void setup_vepu540_force_slice_split(Vepu541H264eRegSet *regs, RK_S32 width)
1220*437bfbebSnyanmisaka {
1221*437bfbebSnyanmisaka     RK_S32 mb_w = MPP_ALIGN(width, 16) >> 4;
1222*437bfbebSnyanmisaka 
1223*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
1224*437bfbebSnyanmisaka 
1225*437bfbebSnyanmisaka     regs->reg087.sli_splt = 1;
1226*437bfbebSnyanmisaka     regs->reg087.sli_splt_mode = 1;
1227*437bfbebSnyanmisaka     regs->reg087.sli_splt_cpst = 0;
1228*437bfbebSnyanmisaka     regs->reg087.sli_max_num_m1 = 500;
1229*437bfbebSnyanmisaka     regs->reg087.sli_flsh = 1;
1230*437bfbebSnyanmisaka     regs->reg087.sli_splt_cnum_m1 = mb_w - 1;
1231*437bfbebSnyanmisaka 
1232*437bfbebSnyanmisaka     regs->reg088.sli_splt_byte = 0;
1233*437bfbebSnyanmisaka     regs->reg013.slen_fifo = 0;
1234*437bfbebSnyanmisaka     regs->reg023.sli_crs_en = 0;
1235*437bfbebSnyanmisaka 
1236*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
1237*437bfbebSnyanmisaka }
1238*437bfbebSnyanmisaka 
setup_vepu541_me(Vepu541H264eRegSet * regs,H264eSps * sps,H264eSlice * slice,RK_U32 is_vepu540)1239*437bfbebSnyanmisaka static void setup_vepu541_me(Vepu541H264eRegSet *regs, H264eSps *sps,
1240*437bfbebSnyanmisaka                              H264eSlice *slice, RK_U32 is_vepu540)
1241*437bfbebSnyanmisaka {
1242*437bfbebSnyanmisaka     RK_S32 level_idc = sps->level_idc;
1243*437bfbebSnyanmisaka     RK_S32 pic_w = sps->pic_width_in_mbs * 16;
1244*437bfbebSnyanmisaka     RK_S32 pic_wd64 = (pic_w + 63) / 64;
1245*437bfbebSnyanmisaka     RK_S32 cime_w = 176;
1246*437bfbebSnyanmisaka     RK_S32 cime_h = 112;
1247*437bfbebSnyanmisaka     RK_S32 cime_blk_w_max = 44;
1248*437bfbebSnyanmisaka     RK_S32 cime_blk_h_max = 28;
1249*437bfbebSnyanmisaka 
1250*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
1251*437bfbebSnyanmisaka     /*
1252*437bfbebSnyanmisaka      * Step 1. limit the mv range by level_idc
1253*437bfbebSnyanmisaka      * For level 1 and level 1b the vertical MV range is [-64,+63.75]
1254*437bfbebSnyanmisaka      * For level 1.1, 1.2, 1.3 and 2 the vertical MV range is [-128,+127.75]
1255*437bfbebSnyanmisaka      */
1256*437bfbebSnyanmisaka     switch (level_idc) {
1257*437bfbebSnyanmisaka     case H264_LEVEL_1_0 :
1258*437bfbebSnyanmisaka     case H264_LEVEL_1_b : {
1259*437bfbebSnyanmisaka         cime_blk_h_max = 12;
1260*437bfbebSnyanmisaka     } break;
1261*437bfbebSnyanmisaka     case H264_LEVEL_1_1 :
1262*437bfbebSnyanmisaka     case H264_LEVEL_1_2 :
1263*437bfbebSnyanmisaka     case H264_LEVEL_1_3 :
1264*437bfbebSnyanmisaka     case H264_LEVEL_2_0 : {
1265*437bfbebSnyanmisaka         cime_blk_h_max = 28;
1266*437bfbebSnyanmisaka     } break;
1267*437bfbebSnyanmisaka     default : {
1268*437bfbebSnyanmisaka         cime_blk_h_max = 28;
1269*437bfbebSnyanmisaka     } break;
1270*437bfbebSnyanmisaka     }
1271*437bfbebSnyanmisaka 
1272*437bfbebSnyanmisaka     if (cime_w < cime_blk_w_max * 4)
1273*437bfbebSnyanmisaka         cime_blk_w_max = cime_w / 4;
1274*437bfbebSnyanmisaka 
1275*437bfbebSnyanmisaka     if (cime_h < cime_blk_h_max * 4)
1276*437bfbebSnyanmisaka         cime_blk_h_max = cime_h / 4;
1277*437bfbebSnyanmisaka 
1278*437bfbebSnyanmisaka     /*
1279*437bfbebSnyanmisaka      * Step 2. limit the mv range by image size
1280*437bfbebSnyanmisaka      */
1281*437bfbebSnyanmisaka     if (cime_blk_w_max / 4 * 2 > (sps->pic_width_in_mbs * 2 + 1) / 2)
1282*437bfbebSnyanmisaka         cime_blk_w_max = (sps->pic_width_in_mbs * 2 + 1) / 2 / 2 * 4;
1283*437bfbebSnyanmisaka 
1284*437bfbebSnyanmisaka     if (cime_blk_h_max / 4 > MPP_ALIGN(sps->pic_height_in_mbs * 16, 64) / 128 * 4)
1285*437bfbebSnyanmisaka         cime_blk_h_max = MPP_ALIGN(sps->pic_height_in_mbs * 16, 64) / 128 * 16;
1286*437bfbebSnyanmisaka 
1287*437bfbebSnyanmisaka     regs->reg089.cme_srch_h     = cime_blk_w_max / 4;
1288*437bfbebSnyanmisaka     regs->reg089.cme_srch_v     = cime_blk_h_max / 4;
1289*437bfbebSnyanmisaka     regs->reg089.rme_srch_h     = 7;
1290*437bfbebSnyanmisaka     regs->reg089.rme_srch_v     = 5;
1291*437bfbebSnyanmisaka     regs->reg089.dlt_frm_num    = 0;
1292*437bfbebSnyanmisaka 
1293*437bfbebSnyanmisaka     if (slice->slice_type == H264_I_SLICE) {
1294*437bfbebSnyanmisaka         regs->reg090.pmv_mdst_h = 0;
1295*437bfbebSnyanmisaka         regs->reg090.pmv_mdst_v = 0;
1296*437bfbebSnyanmisaka     } else {
1297*437bfbebSnyanmisaka         regs->reg090.pmv_mdst_h = 5;
1298*437bfbebSnyanmisaka         regs->reg090.pmv_mdst_v = 5;
1299*437bfbebSnyanmisaka     }
1300*437bfbebSnyanmisaka     regs->reg090.mv_limit       = 2;
1301*437bfbebSnyanmisaka     regs->reg090.pmv_num        = 2;
1302*437bfbebSnyanmisaka 
1303*437bfbebSnyanmisaka     if (is_vepu540) {
1304*437bfbebSnyanmisaka         RK_S32 w_temp = 1296;
1305*437bfbebSnyanmisaka         RK_S32 h_temp = 1;
1306*437bfbebSnyanmisaka         RK_S32 h_val_0 = 1;
1307*437bfbebSnyanmisaka         RK_S32 h_val_1 = 18;
1308*437bfbebSnyanmisaka         RK_S32 temp0, temp1;
1309*437bfbebSnyanmisaka         RK_U32 pic_temp = ((regs->reg012.pic_wd8_m1 + 1) * 8 + 63) / 64 * 64;
1310*437bfbebSnyanmisaka         RK_S32 cime_linebuf_w =  pic_temp / 64;
1311*437bfbebSnyanmisaka 
1312*437bfbebSnyanmisaka         regs->reg091.cme_linebuf_w = cime_linebuf_w;
1313*437bfbebSnyanmisaka 
1314*437bfbebSnyanmisaka         while ((w_temp > ((h_temp - h_val_0)*cime_linebuf_w * 4 + ((h_val_1 - h_temp) * 4 * 7)))
1315*437bfbebSnyanmisaka                && (h_temp < 17)) {
1316*437bfbebSnyanmisaka             h_temp = h_temp + h_val_0;
1317*437bfbebSnyanmisaka         }
1318*437bfbebSnyanmisaka         if (w_temp < ((h_temp - h_val_0)*cime_linebuf_w * 4 + ((h_val_1 - h_temp) * 4 * 7)))
1319*437bfbebSnyanmisaka             h_temp = h_temp - h_val_0;
1320*437bfbebSnyanmisaka 
1321*437bfbebSnyanmisaka         regs->reg091.cme_rama_h = h_temp;
1322*437bfbebSnyanmisaka 
1323*437bfbebSnyanmisaka         RK_S32 swin_scope_wd16 = (regs->reg089.cme_srch_h + 3) / 4 * 2 + 1;
1324*437bfbebSnyanmisaka 
1325*437bfbebSnyanmisaka         temp0 = 2 * regs->reg089.cme_srch_v + 1;
1326*437bfbebSnyanmisaka         if (temp0 > regs->reg091.cme_rama_h)
1327*437bfbebSnyanmisaka             temp0 = regs->reg091.cme_rama_h;
1328*437bfbebSnyanmisaka 
1329*437bfbebSnyanmisaka         temp1 = 0;
1330*437bfbebSnyanmisaka         if (pic_wd64 >= swin_scope_wd16)
1331*437bfbebSnyanmisaka             temp1 = swin_scope_wd16;
1332*437bfbebSnyanmisaka         else
1333*437bfbebSnyanmisaka             temp1 = pic_wd64 * 2;
1334*437bfbebSnyanmisaka         regs->reg091.cme_rama_max = pic_wd64 * (temp0 - 1) + temp1;
1335*437bfbebSnyanmisaka     } else {
1336*437bfbebSnyanmisaka         if (pic_w > 3584) {
1337*437bfbebSnyanmisaka             regs->reg091.cme_rama_h = 8;
1338*437bfbebSnyanmisaka         } else if (pic_w > 3136) {
1339*437bfbebSnyanmisaka             regs->reg091.cme_rama_h = 9;
1340*437bfbebSnyanmisaka         } else if (pic_w > 2816) {
1341*437bfbebSnyanmisaka             regs->reg091.cme_rama_h = 10;
1342*437bfbebSnyanmisaka         } else if (pic_w > 2560) {
1343*437bfbebSnyanmisaka             regs->reg091.cme_rama_h = 11;
1344*437bfbebSnyanmisaka         } else if (pic_w > 2368) {
1345*437bfbebSnyanmisaka             regs->reg091.cme_rama_h = 12;
1346*437bfbebSnyanmisaka         } else if (pic_w > 2176) {
1347*437bfbebSnyanmisaka             regs->reg091.cme_rama_h = 13;
1348*437bfbebSnyanmisaka         } else if (pic_w > 2048) {
1349*437bfbebSnyanmisaka             regs->reg091.cme_rama_h = 14;
1350*437bfbebSnyanmisaka         } else if (pic_w > 1856) {
1351*437bfbebSnyanmisaka             regs->reg091.cme_rama_h = 15;
1352*437bfbebSnyanmisaka         } else if (pic_w > 1792) {
1353*437bfbebSnyanmisaka             regs->reg091.cme_rama_h = 16;
1354*437bfbebSnyanmisaka         } else {
1355*437bfbebSnyanmisaka             regs->reg091.cme_rama_h = 17;
1356*437bfbebSnyanmisaka         }
1357*437bfbebSnyanmisaka 
1358*437bfbebSnyanmisaka         {
1359*437bfbebSnyanmisaka             RK_S32 swin_all_4_ver = 2 * regs->reg089.cme_srch_v + 1;
1360*437bfbebSnyanmisaka             RK_S32 swin_all_16_hor = (regs->reg089.cme_srch_h * 4 + 15) / 16 * 2 + 1;
1361*437bfbebSnyanmisaka 
1362*437bfbebSnyanmisaka             if (swin_all_4_ver < regs->reg091.cme_rama_h)
1363*437bfbebSnyanmisaka                 regs->reg091.cme_rama_max = (swin_all_4_ver - 1) * pic_wd64 + swin_all_16_hor;
1364*437bfbebSnyanmisaka             else
1365*437bfbebSnyanmisaka                 regs->reg091.cme_rama_max = (regs->reg091.cme_rama_h - 1) * pic_wd64 + swin_all_16_hor;
1366*437bfbebSnyanmisaka         }
1367*437bfbebSnyanmisaka     }
1368*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
1369*437bfbebSnyanmisaka }
1370*437bfbebSnyanmisaka 
1371*437bfbebSnyanmisaka #define H264E_LAMBDA_TAB_SIZE       (52 * sizeof(RK_U32))
1372*437bfbebSnyanmisaka 
1373*437bfbebSnyanmisaka static RK_U32 h264e_lambda_default[58] = {
1374*437bfbebSnyanmisaka     0x00000003, 0x00000005, 0x00000006, 0x00000007,
1375*437bfbebSnyanmisaka     0x00000009, 0x0000000b, 0x0000000e, 0x00000012,
1376*437bfbebSnyanmisaka     0x00000016, 0x0000001c, 0x00000024, 0x0000002d,
1377*437bfbebSnyanmisaka     0x00000039, 0x00000048, 0x0000005b, 0x00000073,
1378*437bfbebSnyanmisaka     0x00000091, 0x000000b6, 0x000000e6, 0x00000122,
1379*437bfbebSnyanmisaka     0x0000016d, 0x000001cc, 0x00000244, 0x000002db,
1380*437bfbebSnyanmisaka     0x00000399, 0x00000489, 0x000005b6, 0x00000733,
1381*437bfbebSnyanmisaka     0x00000912, 0x00000b6d, 0x00000e66, 0x00001224,
1382*437bfbebSnyanmisaka     0x000016db, 0x00001ccc, 0x00002449, 0x00002db7,
1383*437bfbebSnyanmisaka     0x00003999, 0x00004892, 0x00005b6f, 0x00007333,
1384*437bfbebSnyanmisaka     0x00009124, 0x0000b6de, 0x0000e666, 0x00012249,
1385*437bfbebSnyanmisaka     0x00016dbc, 0x0001cccc, 0x00024492, 0x0002db79,
1386*437bfbebSnyanmisaka     0x00039999, 0x00048924, 0x0005b6f2, 0x00073333,
1387*437bfbebSnyanmisaka     0x00091249, 0x000b6de5, 0x000e6666, 0x00122492,
1388*437bfbebSnyanmisaka     0x0016dbcb, 0x001ccccc,
1389*437bfbebSnyanmisaka };
1390*437bfbebSnyanmisaka 
setup_vepu541_l2(Vepu541H264eRegL2Set * regs,H264eSlice * slice,MppEncHwCfg * hw,MppEncCfgSet * cfg)1391*437bfbebSnyanmisaka static void setup_vepu541_l2(Vepu541H264eRegL2Set *regs, H264eSlice *slice, MppEncHwCfg *hw, MppEncCfgSet *cfg)
1392*437bfbebSnyanmisaka {
1393*437bfbebSnyanmisaka     RK_U32 i;
1394*437bfbebSnyanmisaka 
1395*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter\n");
1396*437bfbebSnyanmisaka 
1397*437bfbebSnyanmisaka     memset(regs, 0, sizeof(*regs));
1398*437bfbebSnyanmisaka 
1399*437bfbebSnyanmisaka     regs->iprd_tthdy4[0] = 1;
1400*437bfbebSnyanmisaka     regs->iprd_tthdy4[1] = 4;
1401*437bfbebSnyanmisaka     regs->iprd_tthdy4[2] = 9;
1402*437bfbebSnyanmisaka     regs->iprd_tthdy4[3] = 36;
1403*437bfbebSnyanmisaka 
1404*437bfbebSnyanmisaka     regs->iprd_tthdc8[0] = 1;
1405*437bfbebSnyanmisaka     regs->iprd_tthdc8[1] = 4;
1406*437bfbebSnyanmisaka     regs->iprd_tthdc8[2] = 9;
1407*437bfbebSnyanmisaka     regs->iprd_tthdc8[3] = 36;
1408*437bfbebSnyanmisaka 
1409*437bfbebSnyanmisaka     regs->iprd_tthdy8[0] = 1;
1410*437bfbebSnyanmisaka     regs->iprd_tthdy8[1] = 4;
1411*437bfbebSnyanmisaka     regs->iprd_tthdy8[2] = 9;
1412*437bfbebSnyanmisaka     regs->iprd_tthdy8[3] = 36;
1413*437bfbebSnyanmisaka 
1414*437bfbebSnyanmisaka     regs->iprd_wgty8[0] = 0x30;
1415*437bfbebSnyanmisaka     regs->iprd_wgty8[1] = 0x3c;
1416*437bfbebSnyanmisaka     regs->iprd_wgty8[2] = 0x28;
1417*437bfbebSnyanmisaka     regs->iprd_wgty8[3] = 0x30;
1418*437bfbebSnyanmisaka 
1419*437bfbebSnyanmisaka     regs->iprd_wgty4[0] = 0x30;
1420*437bfbebSnyanmisaka     regs->iprd_wgty4[1] = 0x3c;
1421*437bfbebSnyanmisaka     regs->iprd_wgty4[2] = 0x28;
1422*437bfbebSnyanmisaka     regs->iprd_wgty4[3] = 0x30;
1423*437bfbebSnyanmisaka 
1424*437bfbebSnyanmisaka     regs->iprd_wgty16[0] = 0x30;
1425*437bfbebSnyanmisaka     regs->iprd_wgty16[1] = 0x3c;
1426*437bfbebSnyanmisaka     regs->iprd_wgty16[2] = 0x28;
1427*437bfbebSnyanmisaka     regs->iprd_wgty16[3] = 0x30;
1428*437bfbebSnyanmisaka 
1429*437bfbebSnyanmisaka     regs->iprd_wgtc8[0] = 0x24;
1430*437bfbebSnyanmisaka     regs->iprd_wgtc8[1] = 0x2a;
1431*437bfbebSnyanmisaka     regs->iprd_wgtc8[2] = 0x1c;
1432*437bfbebSnyanmisaka     regs->iprd_wgtc8[3] = 0x20;
1433*437bfbebSnyanmisaka 
1434*437bfbebSnyanmisaka     if (cfg->tune.scene_mode == MPP_ENC_SCENE_MODE_IPC) {
1435*437bfbebSnyanmisaka         regs->iprd_tthd_ul = 0x0;
1436*437bfbebSnyanmisaka         regs->rme_mvd_penalty.mvd_pnlt_e    = 1;
1437*437bfbebSnyanmisaka         regs->rme_mvd_penalty.mvd_pnlt_coef = 1;
1438*437bfbebSnyanmisaka         if (slice->slice_type == H264_I_SLICE) {
1439*437bfbebSnyanmisaka             regs->qnt_bias_comb.qnt_bias_i = 683;
1440*437bfbebSnyanmisaka             regs->atr_thd1_h264.atr_thd2 = 36;
1441*437bfbebSnyanmisaka             regs->atr_wgt16_h264.atr_lv16_wgt0 = 16;
1442*437bfbebSnyanmisaka             regs->atr_wgt16_h264.atr_lv16_wgt1 = 16;
1443*437bfbebSnyanmisaka             regs->atr_wgt16_h264.atr_lv16_wgt2 = 16;
1444*437bfbebSnyanmisaka 
1445*437bfbebSnyanmisaka             regs->atr_wgt8_h264.atr_lv8_wgt0 = 32;
1446*437bfbebSnyanmisaka             regs->atr_wgt8_h264.atr_lv8_wgt1 = 32;
1447*437bfbebSnyanmisaka             regs->atr_wgt8_h264.atr_lv8_wgt2 = 32;
1448*437bfbebSnyanmisaka 
1449*437bfbebSnyanmisaka             regs->atr_wgt4_h264.atr_lv4_wgt0 = 20;
1450*437bfbebSnyanmisaka             regs->atr_wgt4_h264.atr_lv4_wgt1 = 18;
1451*437bfbebSnyanmisaka             regs->atr_wgt4_h264.atr_lv4_wgt2 = 16;
1452*437bfbebSnyanmisaka         } else {
1453*437bfbebSnyanmisaka             regs->qnt_bias_comb.qnt_bias_i = 583;
1454*437bfbebSnyanmisaka             regs->atr_thd1_h264.atr_thd2 = 81;
1455*437bfbebSnyanmisaka             regs->atr_wgt16_h264.atr_lv16_wgt0 = 28;
1456*437bfbebSnyanmisaka             regs->atr_wgt16_h264.atr_lv16_wgt1 = 27;
1457*437bfbebSnyanmisaka             regs->atr_wgt16_h264.atr_lv16_wgt2 = 23;
1458*437bfbebSnyanmisaka 
1459*437bfbebSnyanmisaka             regs->atr_wgt8_h264.atr_lv8_wgt0 = 32;
1460*437bfbebSnyanmisaka             regs->atr_wgt8_h264.atr_lv8_wgt1 = 32;
1461*437bfbebSnyanmisaka             regs->atr_wgt8_h264.atr_lv8_wgt2 = 32;
1462*437bfbebSnyanmisaka 
1463*437bfbebSnyanmisaka             regs->atr_wgt4_h264.atr_lv4_wgt0 = 28;
1464*437bfbebSnyanmisaka             regs->atr_wgt4_h264.atr_lv4_wgt1 = 27;
1465*437bfbebSnyanmisaka             regs->atr_wgt4_h264.atr_lv4_wgt2 = 23;
1466*437bfbebSnyanmisaka         }
1467*437bfbebSnyanmisaka     } else {
1468*437bfbebSnyanmisaka         regs->iprd_tthd_ul = 0x9c5;
1469*437bfbebSnyanmisaka         regs->rme_mvd_penalty.mvd_pnlt_e    = 0;
1470*437bfbebSnyanmisaka         regs->rme_mvd_penalty.mvd_pnlt_coef = 0;
1471*437bfbebSnyanmisaka         if (slice->slice_type == H264_I_SLICE) {
1472*437bfbebSnyanmisaka             regs->qnt_bias_comb.qnt_bias_i = 683;
1473*437bfbebSnyanmisaka             regs->atr_thd1_h264.atr_thd2 = 36;
1474*437bfbebSnyanmisaka             regs->atr_wgt16_h264.atr_lv16_wgt0 = 16;
1475*437bfbebSnyanmisaka             regs->atr_wgt16_h264.atr_lv16_wgt1 = 16;
1476*437bfbebSnyanmisaka             regs->atr_wgt16_h264.atr_lv16_wgt2 = 16;
1477*437bfbebSnyanmisaka 
1478*437bfbebSnyanmisaka             regs->atr_wgt8_h264.atr_lv8_wgt0 = 20;
1479*437bfbebSnyanmisaka             regs->atr_wgt8_h264.atr_lv8_wgt1 = 20;
1480*437bfbebSnyanmisaka             regs->atr_wgt8_h264.atr_lv8_wgt2 = 20;
1481*437bfbebSnyanmisaka 
1482*437bfbebSnyanmisaka             regs->atr_wgt4_h264.atr_lv4_wgt0 = 20;
1483*437bfbebSnyanmisaka             regs->atr_wgt4_h264.atr_lv4_wgt1 = 18;
1484*437bfbebSnyanmisaka             regs->atr_wgt4_h264.atr_lv4_wgt2 = 16;
1485*437bfbebSnyanmisaka         } else {
1486*437bfbebSnyanmisaka             regs->qnt_bias_comb.qnt_bias_i = 583;
1487*437bfbebSnyanmisaka             regs->atr_thd1_h264.atr_thd2 = 81;
1488*437bfbebSnyanmisaka             regs->atr_wgt16_h264.atr_lv16_wgt0 = 18;
1489*437bfbebSnyanmisaka             regs->atr_wgt16_h264.atr_lv16_wgt1 = 17;
1490*437bfbebSnyanmisaka             regs->atr_wgt16_h264.atr_lv16_wgt2 = 16;
1491*437bfbebSnyanmisaka 
1492*437bfbebSnyanmisaka             regs->atr_wgt8_h264.atr_lv8_wgt0 = 20;
1493*437bfbebSnyanmisaka             regs->atr_wgt8_h264.atr_lv8_wgt1 = 20;
1494*437bfbebSnyanmisaka             regs->atr_wgt8_h264.atr_lv8_wgt2 = 20;
1495*437bfbebSnyanmisaka 
1496*437bfbebSnyanmisaka             regs->atr_wgt4_h264.atr_lv4_wgt0 = 18;
1497*437bfbebSnyanmisaka             regs->atr_wgt4_h264.atr_lv4_wgt1 = 17;
1498*437bfbebSnyanmisaka             regs->atr_wgt4_h264.atr_lv4_wgt2 = 16;
1499*437bfbebSnyanmisaka         }
1500*437bfbebSnyanmisaka     }
1501*437bfbebSnyanmisaka 
1502*437bfbebSnyanmisaka     /* 000556ab */
1503*437bfbebSnyanmisaka     regs->qnt_bias_comb.qnt_bias_p = 171;
1504*437bfbebSnyanmisaka     if (hw->qbias_en) {
1505*437bfbebSnyanmisaka         regs->qnt_bias_comb.qnt_bias_i = hw->qbias_i;
1506*437bfbebSnyanmisaka         regs->qnt_bias_comb.qnt_bias_p = hw->qbias_p;
1507*437bfbebSnyanmisaka     }
1508*437bfbebSnyanmisaka 
1509*437bfbebSnyanmisaka     regs->atr_thd0_h264.atr_thd0 = 1;
1510*437bfbebSnyanmisaka     regs->atr_thd0_h264.atr_thd1 = 4;
1511*437bfbebSnyanmisaka     regs->atr_thd1_h264.atr_qp = 45;
1512*437bfbebSnyanmisaka     regs->atf_tthd[0] = 0;
1513*437bfbebSnyanmisaka     regs->atf_tthd[1] = 64;
1514*437bfbebSnyanmisaka     regs->atf_tthd[2] = 144;
1515*437bfbebSnyanmisaka     regs->atf_tthd[3] = 2500;
1516*437bfbebSnyanmisaka 
1517*437bfbebSnyanmisaka     regs->atf_sthd0_h264.atf_sthd_10 = 80;
1518*437bfbebSnyanmisaka     regs->atf_sthd0_h264.atf_sthd_max = 280;
1519*437bfbebSnyanmisaka 
1520*437bfbebSnyanmisaka     regs->atf_sthd1_h264.atf_sthd_11 = 144;
1521*437bfbebSnyanmisaka     regs->atf_sthd1_h264.atf_sthd_20 = 192;
1522*437bfbebSnyanmisaka 
1523*437bfbebSnyanmisaka     regs->atf_wgt0_h264.atf_wgt10 = 26;
1524*437bfbebSnyanmisaka     regs->atf_wgt0_h264.atf_wgt11 = 24;
1525*437bfbebSnyanmisaka 
1526*437bfbebSnyanmisaka     regs->atf_wgt1_h264.atf_wgt12 = 19;
1527*437bfbebSnyanmisaka     regs->atf_wgt1_h264.atf_wgt20 = 22;
1528*437bfbebSnyanmisaka 
1529*437bfbebSnyanmisaka     regs->atf_wgt2_h264.atf_wgt21 = 19;
1530*437bfbebSnyanmisaka     regs->atf_wgt2_h264.atf_wgt30 = 19;
1531*437bfbebSnyanmisaka 
1532*437bfbebSnyanmisaka     regs->atf_ofst0_h264.atf_ofst10 = 3500;
1533*437bfbebSnyanmisaka     regs->atf_ofst0_h264.atf_ofst11 = 3500;
1534*437bfbebSnyanmisaka 
1535*437bfbebSnyanmisaka     regs->atf_ofst1_h264.atf_ofst12 = 0;
1536*437bfbebSnyanmisaka     regs->atf_ofst1_h264.atf_ofst20 = 3500;
1537*437bfbebSnyanmisaka 
1538*437bfbebSnyanmisaka     regs->atf_ofst2_h264.atf_ofst21 = 1000;
1539*437bfbebSnyanmisaka     regs->atf_ofst2_h264.atf_ofst30 = 0;
1540*437bfbebSnyanmisaka 
1541*437bfbebSnyanmisaka     regs->iprd_wgt_qp[0]  = 0;
1542*437bfbebSnyanmisaka     /* ~ */
1543*437bfbebSnyanmisaka     regs->iprd_wgt_qp[51] = 0;
1544*437bfbebSnyanmisaka 
1545*437bfbebSnyanmisaka     memcpy(regs->wgt_qp_grpa, &h264e_lambda_default[6], H264E_LAMBDA_TAB_SIZE);
1546*437bfbebSnyanmisaka     memcpy(regs->wgt_qp_grpb, &h264e_lambda_default[5], H264E_LAMBDA_TAB_SIZE);
1547*437bfbebSnyanmisaka 
1548*437bfbebSnyanmisaka     regs->madi_mode = 0;
1549*437bfbebSnyanmisaka 
1550*437bfbebSnyanmisaka     memcpy(regs->aq_tthd, h264_aq_tthd_default, sizeof(regs->aq_tthd));
1551*437bfbebSnyanmisaka 
1552*437bfbebSnyanmisaka     if (slice->slice_type == H264_I_SLICE) {
1553*437bfbebSnyanmisaka         for (i = 0; i < MPP_ARRAY_ELEMS(regs->aq_step); i++) {
1554*437bfbebSnyanmisaka             regs->aq_tthd[i] = hw->aq_thrd_i[i];
1555*437bfbebSnyanmisaka             regs->aq_step[i] = hw->aq_step_i[i] & 0x3f;
1556*437bfbebSnyanmisaka         }
1557*437bfbebSnyanmisaka     } else {
1558*437bfbebSnyanmisaka         for (i = 0; i < MPP_ARRAY_ELEMS(regs->aq_step); i++) {
1559*437bfbebSnyanmisaka             regs->aq_tthd[i] = hw->aq_thrd_p[i];
1560*437bfbebSnyanmisaka             regs->aq_step[i] = hw->aq_step_p[i] & 0x3f;
1561*437bfbebSnyanmisaka         }
1562*437bfbebSnyanmisaka     }
1563*437bfbebSnyanmisaka 
1564*437bfbebSnyanmisaka     regs->rme_mvd_penalty.mvd_pnlt_cnst = 16000;
1565*437bfbebSnyanmisaka     regs->rme_mvd_penalty.mvd_pnlt_lthd = 0;
1566*437bfbebSnyanmisaka     regs->rme_mvd_penalty.mvd_pnlt_hthd = 0;
1567*437bfbebSnyanmisaka 
1568*437bfbebSnyanmisaka     regs->atr1_thd0_h264.atr1_thd0 = 1;
1569*437bfbebSnyanmisaka     regs->atr1_thd0_h264.atr1_thd1 = 4;
1570*437bfbebSnyanmisaka     regs->atr1_thd1_h264.atr1_thd2 = 49;
1571*437bfbebSnyanmisaka 
1572*437bfbebSnyanmisaka     mpp_env_get_u32("dump_l2_reg", &dump_l2_reg, 0);
1573*437bfbebSnyanmisaka 
1574*437bfbebSnyanmisaka     if (dump_l2_reg) {
1575*437bfbebSnyanmisaka         mpp_log("L2 reg dump start:\n");
1576*437bfbebSnyanmisaka         RK_U32 *p = (RK_U32 *)regs;
1577*437bfbebSnyanmisaka 
1578*437bfbebSnyanmisaka         for (i = 0; i < (sizeof(*regs) / sizeof(RK_U32)); i++)
1579*437bfbebSnyanmisaka             mpp_log("%04x %08x\n", 4 + i * 4, p[i]);
1580*437bfbebSnyanmisaka 
1581*437bfbebSnyanmisaka         mpp_log("L2 reg done\n");
1582*437bfbebSnyanmisaka     }
1583*437bfbebSnyanmisaka 
1584*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave\n");
1585*437bfbebSnyanmisaka }
1586*437bfbebSnyanmisaka 
hal_h264e_vepu541_gen_regs(void * hal,HalEncTask * task)1587*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu541_gen_regs(void *hal, HalEncTask *task)
1588*437bfbebSnyanmisaka {
1589*437bfbebSnyanmisaka     HalH264eVepu541Ctx *ctx = (HalH264eVepu541Ctx *)hal;
1590*437bfbebSnyanmisaka     Vepu541H264eRegSet *regs = &ctx->regs_set;
1591*437bfbebSnyanmisaka     MppEncCfgSet *cfg = ctx->cfg;
1592*437bfbebSnyanmisaka     MppEncPrepCfg *prep = &cfg->prep;
1593*437bfbebSnyanmisaka     H264eSps *sps = ctx->sps;
1594*437bfbebSnyanmisaka     H264ePps *pps = ctx->pps;
1595*437bfbebSnyanmisaka     H264eSlice *slice = ctx->slice;
1596*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1597*437bfbebSnyanmisaka     EncFrmStatus *frm_status = &task->rc_task->frm;
1598*437bfbebSnyanmisaka 
1599*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter %p\n", hal);
1600*437bfbebSnyanmisaka     hal_h264e_dbg_detail("frame %d generate regs now", ctx->frms->seq_idx);
1601*437bfbebSnyanmisaka 
1602*437bfbebSnyanmisaka     /* register setup */
1603*437bfbebSnyanmisaka     memset(regs, 0, sizeof(*regs));
1604*437bfbebSnyanmisaka 
1605*437bfbebSnyanmisaka     setup_vepu541_normal(regs, ctx->is_vepu540);
1606*437bfbebSnyanmisaka     ret = setup_vepu541_prep(regs, ctx, task);
1607*437bfbebSnyanmisaka     if (ret)
1608*437bfbebSnyanmisaka         return ret;
1609*437bfbebSnyanmisaka 
1610*437bfbebSnyanmisaka     setup_vepu541_codec(regs, sps, pps, slice);
1611*437bfbebSnyanmisaka     setup_vepu541_rdo_pred(regs, sps, pps, slice, cfg);
1612*437bfbebSnyanmisaka     setup_vepu541_rc_base(regs, sps, slice, &cfg->hw, task->rc_task);
1613*437bfbebSnyanmisaka     setup_vepu541_io_buf(regs, ctx->dev, task);
1614*437bfbebSnyanmisaka     setup_vepu541_roi(regs, ctx);
1615*437bfbebSnyanmisaka     setup_vepu541_recn_refr(regs, ctx->dev, ctx->frms, ctx->hw_recn,
1616*437bfbebSnyanmisaka                             ctx->pixel_buf_fbc_hdr_size);
1617*437bfbebSnyanmisaka 
1618*437bfbebSnyanmisaka     regs->reg082.meiw_addr = task->md_info ? mpp_buffer_get_fd(task->md_info) : 0;
1619*437bfbebSnyanmisaka 
1620*437bfbebSnyanmisaka     regs->reg068.pic_ofst_y = mpp_frame_get_offset_y(task->frame);
1621*437bfbebSnyanmisaka     regs->reg068.pic_ofst_x = mpp_frame_get_offset_x(task->frame);
1622*437bfbebSnyanmisaka 
1623*437bfbebSnyanmisaka     setup_vepu541_split(regs, &cfg->split);
1624*437bfbebSnyanmisaka     if (ctx->is_vepu540 && prep->width > 1920)
1625*437bfbebSnyanmisaka         setup_vepu540_force_slice_split(regs, prep->width);
1626*437bfbebSnyanmisaka 
1627*437bfbebSnyanmisaka     setup_vepu541_me(regs, sps, slice, ctx->is_vepu540);
1628*437bfbebSnyanmisaka 
1629*437bfbebSnyanmisaka     if (frm_status->is_i_refresh)
1630*437bfbebSnyanmisaka         setup_vepu541_intra_refresh(regs, ctx, frm_status->seq_idx % cfg->rc.gop);
1631*437bfbebSnyanmisaka 
1632*437bfbebSnyanmisaka     if (ctx->is_vepu540)
1633*437bfbebSnyanmisaka         vepu540_set_osd(&ctx->osd_cfg);
1634*437bfbebSnyanmisaka     else
1635*437bfbebSnyanmisaka         vepu541_set_osd(&ctx->osd_cfg);
1636*437bfbebSnyanmisaka 
1637*437bfbebSnyanmisaka     setup_vepu541_l2(&ctx->regs_l2_set, slice, &cfg->hw, cfg);
1638*437bfbebSnyanmisaka 
1639*437bfbebSnyanmisaka     mpp_env_get_u32("dump_l1_reg", &dump_l1_reg, 0);
1640*437bfbebSnyanmisaka 
1641*437bfbebSnyanmisaka     if (dump_l1_reg) {
1642*437bfbebSnyanmisaka         mpp_log("L1 reg dump start:\n");
1643*437bfbebSnyanmisaka         RK_U32 *p = (RK_U32 *)regs;
1644*437bfbebSnyanmisaka         RK_S32 n = 0x1D0 / sizeof(RK_U32);
1645*437bfbebSnyanmisaka         RK_S32 i;
1646*437bfbebSnyanmisaka 
1647*437bfbebSnyanmisaka         for (i = 0; i < n; i++)
1648*437bfbebSnyanmisaka             mpp_log("%04x %08x\n", i * 4, p[i]);
1649*437bfbebSnyanmisaka 
1650*437bfbebSnyanmisaka         mpp_log("L1 reg done\n");
1651*437bfbebSnyanmisaka     }
1652*437bfbebSnyanmisaka 
1653*437bfbebSnyanmisaka     ctx->frame_cnt++;
1654*437bfbebSnyanmisaka 
1655*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave %p\n", hal);
1656*437bfbebSnyanmisaka     return MPP_OK;
1657*437bfbebSnyanmisaka }
1658*437bfbebSnyanmisaka 
hal_h264e_vepu541_start(void * hal,HalEncTask * task)1659*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu541_start(void *hal, HalEncTask *task)
1660*437bfbebSnyanmisaka {
1661*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1662*437bfbebSnyanmisaka     HalH264eVepu541Ctx *ctx = (HalH264eVepu541Ctx *)hal;
1663*437bfbebSnyanmisaka 
1664*437bfbebSnyanmisaka     (void) task;
1665*437bfbebSnyanmisaka 
1666*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter %p\n", hal);
1667*437bfbebSnyanmisaka 
1668*437bfbebSnyanmisaka     do {
1669*437bfbebSnyanmisaka         MppDevRegWrCfg wr_cfg;
1670*437bfbebSnyanmisaka         MppDevRegRdCfg rd_cfg;
1671*437bfbebSnyanmisaka 
1672*437bfbebSnyanmisaka         /* write L2 registers */
1673*437bfbebSnyanmisaka         wr_cfg.reg = &ctx->regs_l2_set;
1674*437bfbebSnyanmisaka         wr_cfg.size = sizeof(Vepu541H264eRegL2Set);
1675*437bfbebSnyanmisaka         wr_cfg.offset = VEPU541_REG_BASE_L2;
1676*437bfbebSnyanmisaka 
1677*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
1678*437bfbebSnyanmisaka         if (ret) {
1679*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
1680*437bfbebSnyanmisaka             break;
1681*437bfbebSnyanmisaka         }
1682*437bfbebSnyanmisaka 
1683*437bfbebSnyanmisaka         /* write L1 registers */
1684*437bfbebSnyanmisaka         wr_cfg.reg = &ctx->regs_set;
1685*437bfbebSnyanmisaka         wr_cfg.size = sizeof(Vepu541H264eRegSet);
1686*437bfbebSnyanmisaka         wr_cfg.offset = 0;
1687*437bfbebSnyanmisaka 
1688*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
1689*437bfbebSnyanmisaka         if (ret) {
1690*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
1691*437bfbebSnyanmisaka             break;
1692*437bfbebSnyanmisaka         }
1693*437bfbebSnyanmisaka 
1694*437bfbebSnyanmisaka         /* set output request */
1695*437bfbebSnyanmisaka         rd_cfg.reg = &ctx->regs_ret.hw_status;
1696*437bfbebSnyanmisaka         rd_cfg.size = sizeof(RK_U32);
1697*437bfbebSnyanmisaka         rd_cfg.offset = VEPU541_REG_BASE_HW_STATUS;
1698*437bfbebSnyanmisaka 
1699*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &rd_cfg);
1700*437bfbebSnyanmisaka         if (ret) {
1701*437bfbebSnyanmisaka             mpp_err_f("set register read failed %d\n", ret);
1702*437bfbebSnyanmisaka             break;
1703*437bfbebSnyanmisaka         }
1704*437bfbebSnyanmisaka 
1705*437bfbebSnyanmisaka         rd_cfg.reg = &ctx->regs_ret.st_bsl;
1706*437bfbebSnyanmisaka         rd_cfg.size = sizeof(ctx->regs_ret) - 4;
1707*437bfbebSnyanmisaka         rd_cfg.offset = VEPU541_REG_BASE_STATISTICS;
1708*437bfbebSnyanmisaka 
1709*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &rd_cfg);
1710*437bfbebSnyanmisaka         if (ret) {
1711*437bfbebSnyanmisaka             mpp_err_f("set register read failed %d\n", ret);
1712*437bfbebSnyanmisaka             break;
1713*437bfbebSnyanmisaka         }
1714*437bfbebSnyanmisaka 
1715*437bfbebSnyanmisaka         /* send request to hardware */
1716*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
1717*437bfbebSnyanmisaka         if (ret) {
1718*437bfbebSnyanmisaka             mpp_err_f("send cmd failed %d\n", ret);
1719*437bfbebSnyanmisaka             break;
1720*437bfbebSnyanmisaka         }
1721*437bfbebSnyanmisaka     } while (0);
1722*437bfbebSnyanmisaka 
1723*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave %p\n", hal);
1724*437bfbebSnyanmisaka 
1725*437bfbebSnyanmisaka     return ret;
1726*437bfbebSnyanmisaka }
1727*437bfbebSnyanmisaka 
hal_h264e_vepu541_status_check(void * hal)1728*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu541_status_check(void *hal)
1729*437bfbebSnyanmisaka {
1730*437bfbebSnyanmisaka     HalH264eVepu541Ctx *ctx = (HalH264eVepu541Ctx *)hal;
1731*437bfbebSnyanmisaka     Vepu541H264eRegRet *regs_ret = &ctx->regs_ret;
1732*437bfbebSnyanmisaka 
1733*437bfbebSnyanmisaka     if (regs_ret->hw_status.lkt_done_sta)
1734*437bfbebSnyanmisaka         hal_h264e_dbg_detail("lkt_done finish");
1735*437bfbebSnyanmisaka 
1736*437bfbebSnyanmisaka     if (regs_ret->hw_status.enc_done_sta)
1737*437bfbebSnyanmisaka         hal_h264e_dbg_detail("enc_done finish");
1738*437bfbebSnyanmisaka 
1739*437bfbebSnyanmisaka     if (regs_ret->hw_status.enc_slice_done_sta)
1740*437bfbebSnyanmisaka         hal_h264e_dbg_detail("enc_slice finsh");
1741*437bfbebSnyanmisaka 
1742*437bfbebSnyanmisaka     if (regs_ret->hw_status.sclr_done_sta)
1743*437bfbebSnyanmisaka         hal_h264e_dbg_detail("safe clear finsh");
1744*437bfbebSnyanmisaka 
1745*437bfbebSnyanmisaka     if (regs_ret->hw_status.oflw_done_sta)
1746*437bfbebSnyanmisaka         mpp_err_f("bit stream overflow");
1747*437bfbebSnyanmisaka 
1748*437bfbebSnyanmisaka     if (regs_ret->hw_status.brsp_done_sta)
1749*437bfbebSnyanmisaka         mpp_err_f("bus write full");
1750*437bfbebSnyanmisaka 
1751*437bfbebSnyanmisaka     if (regs_ret->hw_status.berr_done_sta)
1752*437bfbebSnyanmisaka         mpp_err_f("bus write error");
1753*437bfbebSnyanmisaka 
1754*437bfbebSnyanmisaka     if (regs_ret->hw_status.rerr_done_sta)
1755*437bfbebSnyanmisaka         mpp_err_f("bus read error");
1756*437bfbebSnyanmisaka 
1757*437bfbebSnyanmisaka     if (regs_ret->hw_status.wdg_done_sta)
1758*437bfbebSnyanmisaka         mpp_err_f("wdg timeout");
1759*437bfbebSnyanmisaka 
1760*437bfbebSnyanmisaka     return MPP_OK;
1761*437bfbebSnyanmisaka }
1762*437bfbebSnyanmisaka 
hal_h264e_vepu541_wait(void * hal,HalEncTask * task)1763*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu541_wait(void *hal, HalEncTask *task)
1764*437bfbebSnyanmisaka {
1765*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1766*437bfbebSnyanmisaka     HalH264eVepu541Ctx *ctx = (HalH264eVepu541Ctx *)hal;
1767*437bfbebSnyanmisaka     H264NaluType type = task->rc_task->frm.is_idr ?  H264_NALU_TYPE_IDR : H264_NALU_TYPE_SLICE;
1768*437bfbebSnyanmisaka     MppPacket pkt = task->packet;
1769*437bfbebSnyanmisaka     RK_S32 offset = mpp_packet_get_length(pkt);
1770*437bfbebSnyanmisaka 
1771*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter %p\n", hal);
1772*437bfbebSnyanmisaka 
1773*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
1774*437bfbebSnyanmisaka     if (ret) {
1775*437bfbebSnyanmisaka         mpp_err_f("poll cmd failed %d\n", ret);
1776*437bfbebSnyanmisaka         ret = MPP_ERR_VPUHW;
1777*437bfbebSnyanmisaka     } else {
1778*437bfbebSnyanmisaka         hal_h264e_vepu541_status_check(hal);
1779*437bfbebSnyanmisaka         task->hw_length += ctx->regs_ret.st_bsl.bs_lgth;
1780*437bfbebSnyanmisaka     }
1781*437bfbebSnyanmisaka 
1782*437bfbebSnyanmisaka     mpp_packet_add_segment_info(pkt, type, offset, ctx->regs_ret.st_bsl.bs_lgth);
1783*437bfbebSnyanmisaka 
1784*437bfbebSnyanmisaka     {
1785*437bfbebSnyanmisaka         HalH264eVepuStreamAmend *amend = &ctx->amend;
1786*437bfbebSnyanmisaka 
1787*437bfbebSnyanmisaka         if (amend->enable) {
1788*437bfbebSnyanmisaka             amend->old_length = task->hw_length;
1789*437bfbebSnyanmisaka             amend->slice->is_multi_slice = (ctx->cfg->split.split_mode > 0);
1790*437bfbebSnyanmisaka             h264e_vepu_stream_amend_proc(amend, &ctx->cfg->h264.hw_cfg);
1791*437bfbebSnyanmisaka             task->hw_length = amend->new_length;
1792*437bfbebSnyanmisaka         } else if (amend->prefix) {
1793*437bfbebSnyanmisaka             /* check prefix value */
1794*437bfbebSnyanmisaka             amend->old_length = task->hw_length;
1795*437bfbebSnyanmisaka             h264e_vepu_stream_amend_sync_ref_idc(amend);
1796*437bfbebSnyanmisaka         }
1797*437bfbebSnyanmisaka     }
1798*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave %p\n", hal);
1799*437bfbebSnyanmisaka 
1800*437bfbebSnyanmisaka     return ret;
1801*437bfbebSnyanmisaka }
1802*437bfbebSnyanmisaka 
hal_h264e_vepu541_ret_task(void * hal,HalEncTask * task)1803*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu541_ret_task(void *hal, HalEncTask *task)
1804*437bfbebSnyanmisaka {
1805*437bfbebSnyanmisaka     HalH264eVepu541Ctx *ctx = (HalH264eVepu541Ctx *)hal;
1806*437bfbebSnyanmisaka     EncRcTaskInfo *rc_info = &task->rc_task->info;
1807*437bfbebSnyanmisaka     RK_U32 mb_w = ctx->sps->pic_width_in_mbs;
1808*437bfbebSnyanmisaka     RK_U32 mb_h = ctx->sps->pic_height_in_mbs;
1809*437bfbebSnyanmisaka     RK_U32 mbs = mb_w * mb_h;
1810*437bfbebSnyanmisaka 
1811*437bfbebSnyanmisaka     hal_h264e_dbg_func("enter %p\n", hal);
1812*437bfbebSnyanmisaka 
1813*437bfbebSnyanmisaka     // update total hardware length
1814*437bfbebSnyanmisaka     task->length += task->hw_length;
1815*437bfbebSnyanmisaka 
1816*437bfbebSnyanmisaka     // setup bit length for rate control
1817*437bfbebSnyanmisaka     rc_info->bit_real = task->hw_length * 8;
1818*437bfbebSnyanmisaka     rc_info->quality_real = ctx->regs_ret.st_sse_qp.qp_sum / mbs;
1819*437bfbebSnyanmisaka     rc_info->madi = (!ctx->regs_ret.st_mb_num) ? 0 :
1820*437bfbebSnyanmisaka                     ctx->regs_ret.st_madi /  ctx->regs_ret.st_mb_num;
1821*437bfbebSnyanmisaka     rc_info->madp = (!ctx->regs_ret.st_ctu_num) ? 0 :
1822*437bfbebSnyanmisaka                     ctx->regs_ret.st_madp / ctx->regs_ret.st_ctu_num;
1823*437bfbebSnyanmisaka     rc_info->iblk4_prop = (ctx->regs_ret.st_lvl4_intra_num +
1824*437bfbebSnyanmisaka                            ctx->regs_ret.st_lvl8_intra_num +
1825*437bfbebSnyanmisaka                            ctx->regs_ret.st_lvl16_intra_num) * 256 / mbs;
1826*437bfbebSnyanmisaka 
1827*437bfbebSnyanmisaka     rc_info->sse = ((RK_S64)(ctx->regs_ret.st_sse_qp.sse_h8 & 0xff) << 32) +
1828*437bfbebSnyanmisaka                    ctx->regs_ret.st_sse_l32.sse_l32;
1829*437bfbebSnyanmisaka     rc_info->lvl16_inter_num = ctx->regs_ret.st_lvl16_inter_num;
1830*437bfbebSnyanmisaka     rc_info->lvl8_inter_num  = ctx->regs_ret.st_lvl8_inter_num;
1831*437bfbebSnyanmisaka     rc_info->lvl16_intra_num = ctx->regs_ret.st_lvl16_intra_num;
1832*437bfbebSnyanmisaka     rc_info->lvl8_intra_num  = ctx->regs_ret.st_lvl8_intra_num;
1833*437bfbebSnyanmisaka     rc_info->lvl4_intra_num  = ctx->regs_ret.st_lvl4_intra_num;
1834*437bfbebSnyanmisaka 
1835*437bfbebSnyanmisaka     ctx->hal_rc_cfg.bit_real = rc_info->bit_real;
1836*437bfbebSnyanmisaka     ctx->hal_rc_cfg.quality_real = rc_info->quality_real;
1837*437bfbebSnyanmisaka     ctx->hal_rc_cfg.iblk4_prop = rc_info->iblk4_prop;
1838*437bfbebSnyanmisaka 
1839*437bfbebSnyanmisaka     task->hal_ret.data   = &ctx->hal_rc_cfg;
1840*437bfbebSnyanmisaka     task->hal_ret.number = 1;
1841*437bfbebSnyanmisaka 
1842*437bfbebSnyanmisaka     hal_h264e_dbg_func("leave %p\n", hal);
1843*437bfbebSnyanmisaka 
1844*437bfbebSnyanmisaka     return MPP_OK;
1845*437bfbebSnyanmisaka }
1846*437bfbebSnyanmisaka 
1847*437bfbebSnyanmisaka const MppEncHalApi hal_h264e_vepu541 = {
1848*437bfbebSnyanmisaka     .name       = "hal_h264e_vepu541",
1849*437bfbebSnyanmisaka     .coding     = MPP_VIDEO_CodingAVC,
1850*437bfbebSnyanmisaka     .ctx_size   = sizeof(HalH264eVepu541Ctx),
1851*437bfbebSnyanmisaka     .flag       = 0,
1852*437bfbebSnyanmisaka     .init       = hal_h264e_vepu541_init,
1853*437bfbebSnyanmisaka     .deinit     = hal_h264e_vepu541_deinit,
1854*437bfbebSnyanmisaka     .prepare    = hal_h264e_vepu541_prepare,
1855*437bfbebSnyanmisaka     .get_task   = hal_h264e_vepu541_get_task,
1856*437bfbebSnyanmisaka     .gen_regs   = hal_h264e_vepu541_gen_regs,
1857*437bfbebSnyanmisaka     .start      = hal_h264e_vepu541_start,
1858*437bfbebSnyanmisaka     .wait       = hal_h264e_vepu541_wait,
1859*437bfbebSnyanmisaka     .part_start = NULL,
1860*437bfbebSnyanmisaka     .part_wait  = NULL,
1861*437bfbebSnyanmisaka     .ret_task   = hal_h264e_vepu541_ret_task,
1862*437bfbebSnyanmisaka };
1863