xref: /rockchip-linux_mpp/mpp/hal/rkenc/h265e/hal_h265e_vepu580.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2021 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_h265e_v580"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka #include <math.h>
21*437bfbebSnyanmisaka #include <limits.h>
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka #include "mpp_env.h"
24*437bfbebSnyanmisaka #include "mpp_mem.h"
25*437bfbebSnyanmisaka #include "mpp_soc.h"
26*437bfbebSnyanmisaka #include "mpp_common.h"
27*437bfbebSnyanmisaka #include "mpp_frame_impl.h"
28*437bfbebSnyanmisaka #include "mpp_packet_impl.h"
29*437bfbebSnyanmisaka #include "mpp_dmabuf.h"
30*437bfbebSnyanmisaka 
31*437bfbebSnyanmisaka #include "hal_h265e_debug.h"
32*437bfbebSnyanmisaka #include "h265e_syntax_new.h"
33*437bfbebSnyanmisaka #include "hal_h265e_stream_amend.h"
34*437bfbebSnyanmisaka #include "hal_bufs.h"
35*437bfbebSnyanmisaka #include "rkv_enc_def.h"
36*437bfbebSnyanmisaka #include "h265e_dpb.h"
37*437bfbebSnyanmisaka #include "vepu5xx_common.h"
38*437bfbebSnyanmisaka #include "vepu580_common.h"
39*437bfbebSnyanmisaka #include "hal_h265e_vepu580.h"
40*437bfbebSnyanmisaka #include "hal_h265e_vepu580_reg.h"
41*437bfbebSnyanmisaka #include "mpp_enc_cb_param.h"
42*437bfbebSnyanmisaka #include "vepu5xx.h"
43*437bfbebSnyanmisaka 
44*437bfbebSnyanmisaka #include "mpp_service.h"
45*437bfbebSnyanmisaka 
46*437bfbebSnyanmisaka #define MAX_FRAME_TASK_NUM      2
47*437bfbebSnyanmisaka #define MAX_TILE_NUM            4
48*437bfbebSnyanmisaka #define MAX_REGS_SET            ((MAX_FRAME_TASK_NUM) * (MAX_TILE_NUM))
49*437bfbebSnyanmisaka 
50*437bfbebSnyanmisaka #define hal_h265e_err(fmt, ...) \
51*437bfbebSnyanmisaka     do {\
52*437bfbebSnyanmisaka         mpp_err_f(fmt, ## __VA_ARGS__);\
53*437bfbebSnyanmisaka     } while (0)
54*437bfbebSnyanmisaka 
55*437bfbebSnyanmisaka typedef struct vepu580_h265_fbk_t {
56*437bfbebSnyanmisaka     RK_U32 hw_status; /* 0:corret, 1:error */
57*437bfbebSnyanmisaka     RK_U32 qp_sum;
58*437bfbebSnyanmisaka     RK_U32 out_strm_size;
59*437bfbebSnyanmisaka     RK_U32 out_hw_strm_size;
60*437bfbebSnyanmisaka     RK_S64 sse_sum;
61*437bfbebSnyanmisaka     RK_U32 st_lvl64_inter_num;
62*437bfbebSnyanmisaka     RK_U32 st_lvl32_inter_num;
63*437bfbebSnyanmisaka     RK_U32 st_lvl16_inter_num;
64*437bfbebSnyanmisaka     RK_U32 st_lvl8_inter_num;
65*437bfbebSnyanmisaka     RK_U32 st_lvl32_intra_num;
66*437bfbebSnyanmisaka     RK_U32 st_lvl16_intra_num;
67*437bfbebSnyanmisaka     RK_U32 st_lvl8_intra_num;
68*437bfbebSnyanmisaka     RK_U32 st_lvl4_intra_num;
69*437bfbebSnyanmisaka     RK_U32 st_cu_num_qp[52];
70*437bfbebSnyanmisaka     RK_U32 st_madp;
71*437bfbebSnyanmisaka     RK_U32 st_madi;
72*437bfbebSnyanmisaka     RK_U32 st_md_sad_b16num0;
73*437bfbebSnyanmisaka     RK_U32 st_md_sad_b16num1;
74*437bfbebSnyanmisaka     RK_U32 st_md_sad_b16num2;
75*437bfbebSnyanmisaka     RK_U32 st_md_sad_b16num3;
76*437bfbebSnyanmisaka     RK_U32 st_madi_b16num0;
77*437bfbebSnyanmisaka     RK_U32 st_madi_b16num1;
78*437bfbebSnyanmisaka     RK_U32 st_madi_b16num2;
79*437bfbebSnyanmisaka     RK_U32 st_madi_b16num3;
80*437bfbebSnyanmisaka     RK_U32 st_mb_num;
81*437bfbebSnyanmisaka     RK_U32 st_ctu_num;
82*437bfbebSnyanmisaka } Vepu580H265Fbk;
83*437bfbebSnyanmisaka 
84*437bfbebSnyanmisaka typedef struct Vepu580RoiHevcBsCfg_t {
85*437bfbebSnyanmisaka     RK_U8 amv_en        : 1;
86*437bfbebSnyanmisaka     RK_U8 qp_adj        : 1;
87*437bfbebSnyanmisaka     RK_U8 force_split   : 1;
88*437bfbebSnyanmisaka     RK_U8 force_intra   : 2;
89*437bfbebSnyanmisaka     RK_U8 force_inter   : 2;
90*437bfbebSnyanmisaka } Vepu580RoiHevcBsCfg;
91*437bfbebSnyanmisaka 
92*437bfbebSnyanmisaka typedef struct Vepu580MdInfo_t {
93*437bfbebSnyanmisaka     RK_U8 vld;
94*437bfbebSnyanmisaka     RK_U16 sad[16];
95*437bfbebSnyanmisaka } Vepu580MdInfo;
96*437bfbebSnyanmisaka 
97*437bfbebSnyanmisaka typedef struct Vepu580RoiHevcQpCfg_t {
98*437bfbebSnyanmisaka     RK_U16 reserved     : 4;
99*437bfbebSnyanmisaka     /*
100*437bfbebSnyanmisaka      * Qp area index
101*437bfbebSnyanmisaka      * The choosed qp area index.
102*437bfbebSnyanmisaka      */
103*437bfbebSnyanmisaka     RK_U16 qp_area_idx  : 4;
104*437bfbebSnyanmisaka     /*
105*437bfbebSnyanmisaka      * Qp_adj
106*437bfbebSnyanmisaka      * Qp_adj
107*437bfbebSnyanmisaka      * in absolute qp mode qp_adj is the final qp used by encoder
108*437bfbebSnyanmisaka      * in relative qp mode qp_adj is a adjustment to final qp
109*437bfbebSnyanmisaka      */
110*437bfbebSnyanmisaka     RK_S16 qp_adj       : 7;
111*437bfbebSnyanmisaka     /*
112*437bfbebSnyanmisaka      * Qp_adj_mode
113*437bfbebSnyanmisaka      * Qp adjustment mode
114*437bfbebSnyanmisaka      * 1 - absolute qp mode:
115*437bfbebSnyanmisaka      *     the 16x16 MB qp is set to the qp_adj value
116*437bfbebSnyanmisaka      * 0 - relative qp mode
117*437bfbebSnyanmisaka      *     the 16x16 MB qp is adjusted by qp_adj value
118*437bfbebSnyanmisaka      */
119*437bfbebSnyanmisaka     RK_U16 qp_adj_mode  : 1;
120*437bfbebSnyanmisaka } Vepu580RoiHevcQpCfg;
121*437bfbebSnyanmisaka 
122*437bfbebSnyanmisaka typedef struct Vepu580H265eFrmCfg_t {
123*437bfbebSnyanmisaka     RK_S32              frame_count;
124*437bfbebSnyanmisaka     RK_S32              frame_type;
125*437bfbebSnyanmisaka 
126*437bfbebSnyanmisaka     /* dchs cfg on frame parallel */
127*437bfbebSnyanmisaka     RK_S32              dchs_curr_idx;
128*437bfbebSnyanmisaka     RK_S32              dchs_prev_idx;
129*437bfbebSnyanmisaka 
130*437bfbebSnyanmisaka     /* hal dpb management slot idx */
131*437bfbebSnyanmisaka     RK_S32              hal_curr_idx;
132*437bfbebSnyanmisaka     RK_S32              hal_refr_idx;
133*437bfbebSnyanmisaka 
134*437bfbebSnyanmisaka     /* regs cfg */
135*437bfbebSnyanmisaka     H265eV580RegSet     *regs_set[MAX_TILE_NUM];
136*437bfbebSnyanmisaka     H265eV580StatusElem *regs_ret[MAX_TILE_NUM];
137*437bfbebSnyanmisaka 
138*437bfbebSnyanmisaka     /* hardware return info collection cfg */
139*437bfbebSnyanmisaka     Vepu580H265Fbk      feedback;
140*437bfbebSnyanmisaka 
141*437bfbebSnyanmisaka     /* tile buffer */
142*437bfbebSnyanmisaka     MppBuffer           hw_tile_buf[MAX_TILE_NUM];
143*437bfbebSnyanmisaka     MppBuffer           hw_tile_stream[MAX_TILE_NUM - 1];
144*437bfbebSnyanmisaka 
145*437bfbebSnyanmisaka     /* osd cfg */
146*437bfbebSnyanmisaka     Vepu5xxOsdCfg       osd_cfg;
147*437bfbebSnyanmisaka     void                *roi_data;
148*437bfbebSnyanmisaka 
149*437bfbebSnyanmisaka     /* gdr roi cfg */
150*437bfbebSnyanmisaka     MppBuffer           roi_base_cfg_buf;
151*437bfbebSnyanmisaka     void                *roi_base_cfg_sw_buf;
152*437bfbebSnyanmisaka     RK_S32              roi_base_buf_size;
153*437bfbebSnyanmisaka 
154*437bfbebSnyanmisaka     /* variable length cfg */
155*437bfbebSnyanmisaka     MppDevRegOffCfgs    *reg_cfg;
156*437bfbebSnyanmisaka } Vepu580H265eFrmCfg;
157*437bfbebSnyanmisaka 
158*437bfbebSnyanmisaka typedef struct H265eV580HalContext_t {
159*437bfbebSnyanmisaka     MppEncHalApi        api;
160*437bfbebSnyanmisaka     MppDev              dev;
161*437bfbebSnyanmisaka     Vepu580H265eFrmCfg  *frms[MAX_FRAME_TASK_NUM];
162*437bfbebSnyanmisaka 
163*437bfbebSnyanmisaka     /* current used frame config */
164*437bfbebSnyanmisaka     Vepu580H265eFrmCfg  *frm;
165*437bfbebSnyanmisaka 
166*437bfbebSnyanmisaka     /* slice split poll cfg */
167*437bfbebSnyanmisaka     RK_S32              poll_slice_max;
168*437bfbebSnyanmisaka     RK_S32              poll_cfg_size;
169*437bfbebSnyanmisaka 
170*437bfbebSnyanmisaka     /* @frame_cnt starts from ZERO */
171*437bfbebSnyanmisaka     RK_U32              frame_count;
172*437bfbebSnyanmisaka 
173*437bfbebSnyanmisaka     /* frame parallel info */
174*437bfbebSnyanmisaka     RK_S32              task_cnt;
175*437bfbebSnyanmisaka     RK_S32              task_idx;
176*437bfbebSnyanmisaka 
177*437bfbebSnyanmisaka     /* dchs cfg */
178*437bfbebSnyanmisaka     RK_S32              curr_idx;
179*437bfbebSnyanmisaka     RK_S32              prev_idx;
180*437bfbebSnyanmisaka 
181*437bfbebSnyanmisaka     /* debug cfg */
182*437bfbebSnyanmisaka     void                *dump_files;
183*437bfbebSnyanmisaka 
184*437bfbebSnyanmisaka     RK_S32              frame_type;
185*437bfbebSnyanmisaka     RK_S32              last_frame_type;
186*437bfbebSnyanmisaka 
187*437bfbebSnyanmisaka     MppBufferGroup      roi_grp;
188*437bfbebSnyanmisaka     MppBufferGroup      qpmap_grp;
189*437bfbebSnyanmisaka 
190*437bfbebSnyanmisaka     MppEncCfgSet        *cfg;
191*437bfbebSnyanmisaka     H265eSyntax_new     *syn;
192*437bfbebSnyanmisaka     H265eDpb            *dpb;
193*437bfbebSnyanmisaka 
194*437bfbebSnyanmisaka     /* single frame tile parallel info */
195*437bfbebSnyanmisaka     MppBufferGroup      tile_grp;
196*437bfbebSnyanmisaka     RK_U32              tile_num;
197*437bfbebSnyanmisaka     RK_U32              tile_parall_en;
198*437bfbebSnyanmisaka     RK_U32              tile_dump_err;
199*437bfbebSnyanmisaka 
200*437bfbebSnyanmisaka     MppBuffer           buf_pass1;
201*437bfbebSnyanmisaka 
202*437bfbebSnyanmisaka     RK_U32              enc_mode;
203*437bfbebSnyanmisaka     RK_U32              frame_size;
204*437bfbebSnyanmisaka     RK_S32              max_buf_cnt;
205*437bfbebSnyanmisaka     RK_S32              hdr_status;
206*437bfbebSnyanmisaka     void                *input_fmt;
207*437bfbebSnyanmisaka     RK_U8               *src_buf;
208*437bfbebSnyanmisaka     RK_U8               *dst_buf;
209*437bfbebSnyanmisaka     RK_S32              buf_size;
210*437bfbebSnyanmisaka     HalBufs             dpb_bufs;
211*437bfbebSnyanmisaka     RK_S32              fbc_header_len;
212*437bfbebSnyanmisaka 
213*437bfbebSnyanmisaka     MppDevPollCfg       *poll_cfgs;
214*437bfbebSnyanmisaka     MppCbCtx            *output_cb;
215*437bfbebSnyanmisaka 
216*437bfbebSnyanmisaka     /* finetune */
217*437bfbebSnyanmisaka     void                *tune;
218*437bfbebSnyanmisaka     MppBuffer           md_info_buf; /* md info buffer for deblurring */
219*437bfbebSnyanmisaka     MppBuffer           qpmap_base_cfg_buf;
220*437bfbebSnyanmisaka     MppBuffer           qpmap_qp_cfg_buf;
221*437bfbebSnyanmisaka     RK_U8*              md_flag_buf;
222*437bfbebSnyanmisaka     RK_S32              md_info_buf_size;
223*437bfbebSnyanmisaka     RK_S32              qpmap_base_cfg_size;
224*437bfbebSnyanmisaka     RK_S32              qpmap_qp_cfg_size;
225*437bfbebSnyanmisaka     RK_S32              md_flag_size;
226*437bfbebSnyanmisaka } H265eV580HalContext;
227*437bfbebSnyanmisaka 
228*437bfbebSnyanmisaka static RK_U32 aq_thd_default[16] = {
229*437bfbebSnyanmisaka     0,  0,  0,  0,
230*437bfbebSnyanmisaka     3,  3,  5,  5,
231*437bfbebSnyanmisaka     8,  8,  8,  15,
232*437bfbebSnyanmisaka     15, 20, 25, 35
233*437bfbebSnyanmisaka };
234*437bfbebSnyanmisaka 
235*437bfbebSnyanmisaka static RK_U32 h265e_mode_bias[16] = {
236*437bfbebSnyanmisaka     0,  2,  4,  6,
237*437bfbebSnyanmisaka     8,  10, 12, 14,
238*437bfbebSnyanmisaka     16, 18, 20, 24,
239*437bfbebSnyanmisaka     28, 32, 64, 128
240*437bfbebSnyanmisaka };
241*437bfbebSnyanmisaka 
242*437bfbebSnyanmisaka static RK_S32 aq_qp_dealt_default[16] = {
243*437bfbebSnyanmisaka     -8, -7, -6, -5,
244*437bfbebSnyanmisaka     -4, -3, -2, -1,
245*437bfbebSnyanmisaka     0,  1,  2,  3,
246*437bfbebSnyanmisaka     5,  7,  8,  9,
247*437bfbebSnyanmisaka };
248*437bfbebSnyanmisaka 
249*437bfbebSnyanmisaka 
250*437bfbebSnyanmisaka static RK_U16 lvl32_intra_cst_thd[4] = {2, 6, 16, 36};
251*437bfbebSnyanmisaka 
252*437bfbebSnyanmisaka static RK_U16 lvl16_intra_cst_thd[4] = {2, 6, 16, 36};
253*437bfbebSnyanmisaka 
254*437bfbebSnyanmisaka static RK_U8 lvl32_intra_cst_wgt[8] = {23, 22, 21, 20, 22, 24, 26};
255*437bfbebSnyanmisaka 
256*437bfbebSnyanmisaka static RK_U8 lvl16_intra_cst_wgt[8] = {17, 17, 17, 18, 17, 18, 18};
257*437bfbebSnyanmisaka 
258*437bfbebSnyanmisaka #include "hal_h265e_vepu580_tune.c"
259*437bfbebSnyanmisaka 
vepu580_h265_set_me_ram(H265eSyntax_new * syn,hevc_vepu580_base * regs,RK_U32 index,RK_S32 tile_start_x)260*437bfbebSnyanmisaka static void vepu580_h265_set_me_ram(H265eSyntax_new *syn, hevc_vepu580_base *regs,
261*437bfbebSnyanmisaka                                     RK_U32 index, RK_S32 tile_start_x)
262*437bfbebSnyanmisaka {
263*437bfbebSnyanmisaka     RK_S32 frm_sta = 0, frm_end = 0, pic_w = 0;
264*437bfbebSnyanmisaka     RK_S32 srch_w = regs->reg0220_me_rnge.cme_srch_h * 4;
265*437bfbebSnyanmisaka     RK_S32 srch_h = regs->reg0220_me_rnge.cme_srch_v * 4;
266*437bfbebSnyanmisaka     RK_S32 x_gmv = regs->reg0224_gmv.gmv_x;
267*437bfbebSnyanmisaka     RK_S32 y_gmv = regs->reg0224_gmv.gmv_y;
268*437bfbebSnyanmisaka     RK_U32 pic_wd64 = ((regs->reg0196_enc_rsl.pic_wd8_m1 + 1) * 8 + 63) / 64;
269*437bfbebSnyanmisaka 
270*437bfbebSnyanmisaka     if (!syn->pp.tiles_enabled_flag) {
271*437bfbebSnyanmisaka         if (x_gmv - srch_w < 0) {
272*437bfbebSnyanmisaka             frm_sta = (x_gmv - srch_w - 15) / 16;
273*437bfbebSnyanmisaka         } else {
274*437bfbebSnyanmisaka             frm_sta = (x_gmv - srch_w) / 16;
275*437bfbebSnyanmisaka         }
276*437bfbebSnyanmisaka         frm_sta = mpp_clip(frm_sta, 0, pic_wd64 - 1);
277*437bfbebSnyanmisaka         if (x_gmv + srch_w < 0) {
278*437bfbebSnyanmisaka             frm_end = pic_wd64 - 1 + (x_gmv + srch_w) / 16;
279*437bfbebSnyanmisaka         } else {
280*437bfbebSnyanmisaka             frm_end = pic_wd64 - 1 + (x_gmv + srch_w + 15) / 16;
281*437bfbebSnyanmisaka         }
282*437bfbebSnyanmisaka         frm_end = mpp_clip(frm_end, 0, pic_wd64 - 1);
283*437bfbebSnyanmisaka     } else {
284*437bfbebSnyanmisaka         RK_S32 tile_ctu_stax = tile_start_x;
285*437bfbebSnyanmisaka         RK_S32 tile_ctu_endx = tile_start_x + syn->pp.column_width_minus1[index];
286*437bfbebSnyanmisaka 
287*437bfbebSnyanmisaka         if (x_gmv - srch_w < 0) {
288*437bfbebSnyanmisaka             frm_sta = tile_ctu_stax + (x_gmv - srch_w - 15) / 16;
289*437bfbebSnyanmisaka         } else {
290*437bfbebSnyanmisaka             frm_sta = tile_ctu_stax + (x_gmv - srch_w) / 16;
291*437bfbebSnyanmisaka         }
292*437bfbebSnyanmisaka         frm_sta = mpp_clip(frm_sta, 0, pic_wd64 - 1);
293*437bfbebSnyanmisaka 
294*437bfbebSnyanmisaka         if (x_gmv + srch_w < 0) {
295*437bfbebSnyanmisaka             frm_end = tile_ctu_endx + (x_gmv + srch_w) / 16;
296*437bfbebSnyanmisaka         } else {
297*437bfbebSnyanmisaka             frm_end = tile_ctu_endx + (x_gmv + srch_w + 15) / 16;
298*437bfbebSnyanmisaka         }
299*437bfbebSnyanmisaka         frm_end = mpp_clip(frm_end, 0, pic_wd64 - 1);
300*437bfbebSnyanmisaka     }
301*437bfbebSnyanmisaka     pic_w = (frm_end - frm_sta + 1) * 64;
302*437bfbebSnyanmisaka     regs->reg0222_me_cach.cme_linebuf_w = (pic_w ? pic_w : 64) / 64;
303*437bfbebSnyanmisaka     {
304*437bfbebSnyanmisaka         RK_U32 cime_rama_max = 2464;
305*437bfbebSnyanmisaka         RK_U32 ctu_4_h = 4, ramb_h;
306*437bfbebSnyanmisaka         RK_U32 cur_srch_16_w, cur_srch_4_h, cur_srch_max;
307*437bfbebSnyanmisaka         RK_U32 cime_rama_h = ctu_4_h;
308*437bfbebSnyanmisaka 
309*437bfbebSnyanmisaka         if ((x_gmv % 16 - srch_w % 16) < 0) {
310*437bfbebSnyanmisaka             cur_srch_16_w = (16 + (x_gmv % 16 - srch_w % 16) % 16 + srch_w * 2 + 15) / 16 + 1;
311*437bfbebSnyanmisaka         } else {
312*437bfbebSnyanmisaka             cur_srch_16_w = ((x_gmv % 16 - srch_w % 16) % 16 + srch_w * 2 + 15) / 16 + 1;
313*437bfbebSnyanmisaka         }
314*437bfbebSnyanmisaka         if ((y_gmv %  4 - srch_h %  4) < 0) {
315*437bfbebSnyanmisaka             cur_srch_4_h = (4 + (y_gmv %  4 - srch_h %  4) %  4 + srch_h * 2 +  3) / 4  + ctu_4_h;
316*437bfbebSnyanmisaka         } else {
317*437bfbebSnyanmisaka             cur_srch_4_h = ((y_gmv %  4 - srch_h %  4) %  4 + srch_h * 2 +  3) / 4  + ctu_4_h;
318*437bfbebSnyanmisaka         }
319*437bfbebSnyanmisaka         cur_srch_max = MPP_ALIGN(cur_srch_4_h, 4);
320*437bfbebSnyanmisaka         if (regs->reg0222_me_cach.cme_linebuf_w < cur_srch_16_w) {
321*437bfbebSnyanmisaka             cur_srch_16_w = regs->reg0222_me_cach.cme_linebuf_w;
322*437bfbebSnyanmisaka         }
323*437bfbebSnyanmisaka         ramb_h = cur_srch_4_h;
324*437bfbebSnyanmisaka         while ((cime_rama_h < cur_srch_max) && (cime_rama_max >
325*437bfbebSnyanmisaka                                                 ((cime_rama_h - ctu_4_h) * regs->reg0222_me_cach.cme_linebuf_w * 4 + (ramb_h * 4 * cur_srch_16_w)))) {
326*437bfbebSnyanmisaka             cime_rama_h = cime_rama_h + ctu_4_h;
327*437bfbebSnyanmisaka             if (ramb_h > 2 * ctu_4_h) {
328*437bfbebSnyanmisaka                 ramb_h = ramb_h - ctu_4_h;
329*437bfbebSnyanmisaka             } else {
330*437bfbebSnyanmisaka                 ramb_h = ctu_4_h;
331*437bfbebSnyanmisaka             }
332*437bfbebSnyanmisaka         }
333*437bfbebSnyanmisaka         if (cur_srch_4_h == ctu_4_h) {
334*437bfbebSnyanmisaka             cime_rama_h = cime_rama_h + ctu_4_h;
335*437bfbebSnyanmisaka             ramb_h = 0;
336*437bfbebSnyanmisaka         }
337*437bfbebSnyanmisaka         if (cime_rama_max < ((cime_rama_h - ctu_4_h) * regs->reg0222_me_cach.cme_linebuf_w * 4 + (ramb_h * 4 * cur_srch_16_w))) {
338*437bfbebSnyanmisaka             cime_rama_h = cime_rama_h - ctu_4_h;
339*437bfbebSnyanmisaka         }
340*437bfbebSnyanmisaka         regs->reg0222_me_cach.cme_rama_h = cime_rama_h;        /* cime_rama_max */
341*437bfbebSnyanmisaka 
342*437bfbebSnyanmisaka         {
343*437bfbebSnyanmisaka             RK_U32 ram_col_h = (cime_rama_h - ctu_4_h) / ctu_4_h;
344*437bfbebSnyanmisaka             regs->reg0222_me_cach.cme_rama_max = ram_col_h * regs->reg0222_me_cach.cme_linebuf_w + cur_srch_16_w;
345*437bfbebSnyanmisaka         }
346*437bfbebSnyanmisaka 
347*437bfbebSnyanmisaka     }
348*437bfbebSnyanmisaka 
349*437bfbebSnyanmisaka     hal_h265e_dbg_detail("cime_rama_h %d, cime_rama_max %d, cime_linebuf_w %d",
350*437bfbebSnyanmisaka                          regs->reg0222_me_cach.cme_rama_h, regs->reg0222_me_cach.cme_rama_max, regs->reg0222_me_cach.cme_linebuf_w);
351*437bfbebSnyanmisaka }
352*437bfbebSnyanmisaka 
vepu580_h265_setup_hal_bufs(H265eV580HalContext * ctx)353*437bfbebSnyanmisaka static MPP_RET vepu580_h265_setup_hal_bufs(H265eV580HalContext *ctx)
354*437bfbebSnyanmisaka {
355*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
356*437bfbebSnyanmisaka     VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
357*437bfbebSnyanmisaka     RK_U32 frame_size;
358*437bfbebSnyanmisaka     RK_S32 mb_wd64, mb_h64;
359*437bfbebSnyanmisaka     MppEncRefCfg ref_cfg = ctx->cfg->ref_cfg;
360*437bfbebSnyanmisaka     MppEncPrepCfg *prep = &ctx->cfg->prep;
361*437bfbebSnyanmisaka     RK_S32 old_max_cnt = ctx->max_buf_cnt;
362*437bfbebSnyanmisaka     RK_S32 new_max_cnt = 4;
363*437bfbebSnyanmisaka 
364*437bfbebSnyanmisaka     hal_h265e_enter();
365*437bfbebSnyanmisaka 
366*437bfbebSnyanmisaka     mb_wd64 = (prep->width + 63) / 64;
367*437bfbebSnyanmisaka     mb_h64 = (prep->height + 63) / 64 + 1;
368*437bfbebSnyanmisaka 
369*437bfbebSnyanmisaka     frame_size = MPP_ALIGN(prep->width, 16) * MPP_ALIGN(prep->height, 16);
370*437bfbebSnyanmisaka     vepu5xx_set_fmt(fmt, ctx->cfg->prep.format);
371*437bfbebSnyanmisaka 
372*437bfbebSnyanmisaka     if (ref_cfg) {
373*437bfbebSnyanmisaka         MppEncCpbInfo *info = mpp_enc_ref_cfg_get_cpb_info(ref_cfg);
374*437bfbebSnyanmisaka         new_max_cnt = MPP_MAX(new_max_cnt, info->dpb_size + 1);
375*437bfbebSnyanmisaka     }
376*437bfbebSnyanmisaka 
377*437bfbebSnyanmisaka     if (frame_size > ctx->frame_size || new_max_cnt > old_max_cnt) {
378*437bfbebSnyanmisaka         size_t size[3] = {0};
379*437bfbebSnyanmisaka 
380*437bfbebSnyanmisaka         hal_bufs_deinit(ctx->dpb_bufs);
381*437bfbebSnyanmisaka         hal_bufs_init(&ctx->dpb_bufs);
382*437bfbebSnyanmisaka 
383*437bfbebSnyanmisaka         ctx->fbc_header_len = MPP_ALIGN(((mb_wd64 * mb_h64) << 6), SZ_8K);
384*437bfbebSnyanmisaka         size[0] = ctx->fbc_header_len + ((mb_wd64 * mb_h64) << 12) * 3 / 2; //fbc_h + fbc_b
385*437bfbebSnyanmisaka         size[1] = (mb_wd64 * mb_h64 << 8);
386*437bfbebSnyanmisaka         size[2] = MPP_ALIGN(mb_wd64 * mb_h64 * 16 * 6, 256);
387*437bfbebSnyanmisaka         new_max_cnt = MPP_MAX(new_max_cnt, old_max_cnt);
388*437bfbebSnyanmisaka 
389*437bfbebSnyanmisaka         hal_h265e_dbg_detail("frame size %d -> %d max count %d -> %d\n",
390*437bfbebSnyanmisaka                              ctx->frame_size, frame_size, old_max_cnt, new_max_cnt);
391*437bfbebSnyanmisaka 
392*437bfbebSnyanmisaka         hal_bufs_setup(ctx->dpb_bufs, new_max_cnt, 3, size);
393*437bfbebSnyanmisaka 
394*437bfbebSnyanmisaka         ctx->frame_size = frame_size;
395*437bfbebSnyanmisaka         ctx->max_buf_cnt = new_max_cnt;
396*437bfbebSnyanmisaka     }
397*437bfbebSnyanmisaka     hal_h265e_leave();
398*437bfbebSnyanmisaka     return ret;
399*437bfbebSnyanmisaka }
400*437bfbebSnyanmisaka 
vepu580_h265_sobel_cfg(hevc_vepu580_wgt * reg)401*437bfbebSnyanmisaka static void vepu580_h265_sobel_cfg(hevc_vepu580_wgt *reg)
402*437bfbebSnyanmisaka {
403*437bfbebSnyanmisaka     reg->pre_intra_cla0_B0.pre_intra_cla0_m0 = 10;
404*437bfbebSnyanmisaka     reg->pre_intra_cla0_B0.pre_intra_cla0_m1 = 11;
405*437bfbebSnyanmisaka     reg->pre_intra_cla0_B0.pre_intra_cla0_m2 = 12;
406*437bfbebSnyanmisaka     reg->pre_intra_cla0_B0.pre_intra_cla0_m3 = 13;
407*437bfbebSnyanmisaka     reg->pre_intra_cla0_B0.pre_intra_cla0_m4 = 14;
408*437bfbebSnyanmisaka 
409*437bfbebSnyanmisaka     reg->pre_intra_cla0_B1.pre_intra_cla0_m5 = 9;
410*437bfbebSnyanmisaka     reg->pre_intra_cla0_B1.pre_intra_cla0_m6 = 15;
411*437bfbebSnyanmisaka     reg->pre_intra_cla0_B1.pre_intra_cla0_m7 = 8;
412*437bfbebSnyanmisaka     reg->pre_intra_cla0_B1.pre_intra_cla0_m8 = 16;
413*437bfbebSnyanmisaka     reg->pre_intra_cla0_B1.pre_intra_cla0_m9 = 7;
414*437bfbebSnyanmisaka 
415*437bfbebSnyanmisaka     reg->pre_intra_cla1_B0.pre_intra_cla1_m0 = 10;
416*437bfbebSnyanmisaka     reg->pre_intra_cla1_B0.pre_intra_cla1_m1 = 9;
417*437bfbebSnyanmisaka     reg->pre_intra_cla1_B0.pre_intra_cla1_m2 = 8;
418*437bfbebSnyanmisaka     reg->pre_intra_cla1_B0.pre_intra_cla1_m3 = 7;
419*437bfbebSnyanmisaka     reg->pre_intra_cla1_B0.pre_intra_cla1_m4 = 6;
420*437bfbebSnyanmisaka     reg->pre_intra_cla1_B1.pre_intra_cla1_m5 = 11;
421*437bfbebSnyanmisaka     reg->pre_intra_cla1_B1.pre_intra_cla1_m6 = 5;
422*437bfbebSnyanmisaka     reg->pre_intra_cla1_B1.pre_intra_cla1_m7 = 12;
423*437bfbebSnyanmisaka     reg->pre_intra_cla1_B1.pre_intra_cla1_m8 = 4;
424*437bfbebSnyanmisaka     reg->pre_intra_cla1_B1.pre_intra_cla1_m9 = 13;
425*437bfbebSnyanmisaka 
426*437bfbebSnyanmisaka     reg->pre_intra_cla2_B0.pre_intra_cla2_m0 = 18;
427*437bfbebSnyanmisaka     reg->pre_intra_cla2_B0.pre_intra_cla2_m1 = 17;
428*437bfbebSnyanmisaka     reg->pre_intra_cla2_B0.pre_intra_cla2_m2 = 16;
429*437bfbebSnyanmisaka     reg->pre_intra_cla2_B0.pre_intra_cla2_m3 = 15;
430*437bfbebSnyanmisaka     reg->pre_intra_cla2_B0.pre_intra_cla2_m4 = 14;
431*437bfbebSnyanmisaka     reg->pre_intra_cla2_B1.pre_intra_cla2_m5 = 19;
432*437bfbebSnyanmisaka     reg->pre_intra_cla2_B1.pre_intra_cla2_m6 = 13;
433*437bfbebSnyanmisaka     reg->pre_intra_cla2_B1.pre_intra_cla2_m7 = 20;
434*437bfbebSnyanmisaka     reg->pre_intra_cla2_B1.pre_intra_cla2_m8 = 12;
435*437bfbebSnyanmisaka     reg->pre_intra_cla2_B1.pre_intra_cla2_m9 = 21;
436*437bfbebSnyanmisaka 
437*437bfbebSnyanmisaka     reg->pre_intra_cla3_B0.pre_intra_cla3_m0 = 18;
438*437bfbebSnyanmisaka     reg->pre_intra_cla3_B0.pre_intra_cla3_m1 = 19;
439*437bfbebSnyanmisaka     reg->pre_intra_cla3_B0.pre_intra_cla3_m2 = 20;
440*437bfbebSnyanmisaka     reg->pre_intra_cla3_B0.pre_intra_cla3_m3 = 21;
441*437bfbebSnyanmisaka     reg->pre_intra_cla3_B0.pre_intra_cla3_m4 = 22;
442*437bfbebSnyanmisaka     reg->pre_intra_cla3_B1.pre_intra_cla3_m5 = 17;
443*437bfbebSnyanmisaka     reg->pre_intra_cla3_B1.pre_intra_cla3_m6 = 23;
444*437bfbebSnyanmisaka     reg->pre_intra_cla3_B1.pre_intra_cla3_m7 = 16;
445*437bfbebSnyanmisaka     reg->pre_intra_cla3_B1.pre_intra_cla3_m8 = 24;
446*437bfbebSnyanmisaka     reg->pre_intra_cla3_B1.pre_intra_cla3_m9 = 15;
447*437bfbebSnyanmisaka 
448*437bfbebSnyanmisaka     reg->pre_intra_cla4_B0.pre_intra_cla4_m0 = 25;
449*437bfbebSnyanmisaka     reg->pre_intra_cla4_B0.pre_intra_cla4_m1 = 26;
450*437bfbebSnyanmisaka     reg->pre_intra_cla4_B0.pre_intra_cla4_m2 = 24;
451*437bfbebSnyanmisaka     reg->pre_intra_cla4_B0.pre_intra_cla4_m3 = 23;
452*437bfbebSnyanmisaka     reg->pre_intra_cla4_B0.pre_intra_cla4_m4 = 22;
453*437bfbebSnyanmisaka     reg->pre_intra_cla4_B1.pre_intra_cla4_m5 = 27;
454*437bfbebSnyanmisaka     reg->pre_intra_cla4_B1.pre_intra_cla4_m6 = 21;
455*437bfbebSnyanmisaka     reg->pre_intra_cla4_B1.pre_intra_cla4_m7 = 28;
456*437bfbebSnyanmisaka     reg->pre_intra_cla4_B1.pre_intra_cla4_m8 = 20;
457*437bfbebSnyanmisaka     reg->pre_intra_cla4_B1.pre_intra_cla4_m9 = 29;
458*437bfbebSnyanmisaka 
459*437bfbebSnyanmisaka     reg->pre_intra_cla5_B0.pre_intra_cla5_m0 = 27;
460*437bfbebSnyanmisaka     reg->pre_intra_cla5_B0.pre_intra_cla5_m1 = 26;
461*437bfbebSnyanmisaka     reg->pre_intra_cla5_B0.pre_intra_cla5_m2 = 28;
462*437bfbebSnyanmisaka     reg->pre_intra_cla5_B0.pre_intra_cla5_m3 = 29;
463*437bfbebSnyanmisaka     reg->pre_intra_cla5_B0.pre_intra_cla5_m4 = 30;
464*437bfbebSnyanmisaka     reg->pre_intra_cla5_B1.pre_intra_cla5_m5 = 25;
465*437bfbebSnyanmisaka     reg->pre_intra_cla5_B1.pre_intra_cla5_m6 = 31;
466*437bfbebSnyanmisaka     reg->pre_intra_cla5_B1.pre_intra_cla5_m7 = 24;
467*437bfbebSnyanmisaka     reg->pre_intra_cla5_B1.pre_intra_cla5_m8 = 32;
468*437bfbebSnyanmisaka     reg->pre_intra_cla5_B1.pre_intra_cla5_m9 = 23;
469*437bfbebSnyanmisaka 
470*437bfbebSnyanmisaka     reg->pre_intra_cla6_B0.pre_intra_cla6_m0 = 34;
471*437bfbebSnyanmisaka     reg->pre_intra_cla6_B0.pre_intra_cla6_m1 = 33;
472*437bfbebSnyanmisaka     reg->pre_intra_cla6_B0.pre_intra_cla6_m2 = 32;
473*437bfbebSnyanmisaka     reg->pre_intra_cla6_B0.pre_intra_cla6_m3 = 31;
474*437bfbebSnyanmisaka     reg->pre_intra_cla6_B0.pre_intra_cla6_m4 = 30;
475*437bfbebSnyanmisaka     reg->pre_intra_cla6_B1.pre_intra_cla6_m5 = 2;
476*437bfbebSnyanmisaka     reg->pre_intra_cla6_B1.pre_intra_cla6_m6 = 29;
477*437bfbebSnyanmisaka     reg->pre_intra_cla6_B1.pre_intra_cla6_m7 = 3;
478*437bfbebSnyanmisaka     reg->pre_intra_cla6_B1.pre_intra_cla6_m8 = 28;
479*437bfbebSnyanmisaka     reg->pre_intra_cla6_B1.pre_intra_cla6_m9 = 4;
480*437bfbebSnyanmisaka 
481*437bfbebSnyanmisaka     reg->pre_intra_cla7_B0.pre_intra_cla7_m0 = 34;
482*437bfbebSnyanmisaka     reg->pre_intra_cla7_B0.pre_intra_cla7_m1 = 2;
483*437bfbebSnyanmisaka     reg->pre_intra_cla7_B0.pre_intra_cla7_m2 = 3;
484*437bfbebSnyanmisaka     reg->pre_intra_cla7_B0.pre_intra_cla7_m3 = 4;
485*437bfbebSnyanmisaka     reg->pre_intra_cla7_B0.pre_intra_cla7_m4 = 5;
486*437bfbebSnyanmisaka     reg->pre_intra_cla7_B1.pre_intra_cla7_m5 = 33;
487*437bfbebSnyanmisaka     reg->pre_intra_cla7_B1.pre_intra_cla7_m6 = 6;
488*437bfbebSnyanmisaka     reg->pre_intra_cla7_B1.pre_intra_cla7_m7 = 32;
489*437bfbebSnyanmisaka     reg->pre_intra_cla7_B1.pre_intra_cla7_m8 = 7;
490*437bfbebSnyanmisaka     reg->pre_intra_cla7_B1.pre_intra_cla7_m9 = 31;
491*437bfbebSnyanmisaka 
492*437bfbebSnyanmisaka     reg->pre_intra_cla8_B0.pre_intra_cla8_m0 = 10;
493*437bfbebSnyanmisaka     reg->pre_intra_cla8_B0.pre_intra_cla8_m1 = 26;
494*437bfbebSnyanmisaka     reg->pre_intra_cla8_B0.pre_intra_cla8_m2 = 18;
495*437bfbebSnyanmisaka     reg->pre_intra_cla8_B0.pre_intra_cla8_m3 = 34;
496*437bfbebSnyanmisaka     reg->pre_intra_cla8_B0.pre_intra_cla8_m4 = 6;
497*437bfbebSnyanmisaka     reg->pre_intra_cla8_B1.pre_intra_cla8_m5 = 14;
498*437bfbebSnyanmisaka     reg->pre_intra_cla8_B1.pre_intra_cla8_m6 = 22;
499*437bfbebSnyanmisaka     reg->pre_intra_cla8_B1.pre_intra_cla8_m7 = 30;
500*437bfbebSnyanmisaka     reg->pre_intra_cla8_B1.pre_intra_cla8_m8 = 2;
501*437bfbebSnyanmisaka     reg->pre_intra_cla8_B1.pre_intra_cla8_m9 = 24;
502*437bfbebSnyanmisaka 
503*437bfbebSnyanmisaka     reg->pre_intra_cla9_B0.pre_intra_cla9_m0 = 0;
504*437bfbebSnyanmisaka     reg->pre_intra_cla9_B0.pre_intra_cla9_m1 = 0;
505*437bfbebSnyanmisaka     reg->pre_intra_cla9_B0.pre_intra_cla9_m2 = 0;
506*437bfbebSnyanmisaka     reg->pre_intra_cla9_B0.pre_intra_cla9_m3 = 0;
507*437bfbebSnyanmisaka     reg->pre_intra_cla9_B0.pre_intra_cla9_m4 = 0;
508*437bfbebSnyanmisaka     reg->pre_intra_cla9_B1.pre_intra_cla9_m5 = 0;
509*437bfbebSnyanmisaka     reg->pre_intra_cla9_B1.pre_intra_cla9_m6 = 0;
510*437bfbebSnyanmisaka     reg->pre_intra_cla9_B1.pre_intra_cla9_m7 = 0;
511*437bfbebSnyanmisaka     reg->pre_intra_cla9_B1.pre_intra_cla9_m8 = 0;
512*437bfbebSnyanmisaka     reg->pre_intra_cla9_B1.pre_intra_cla9_m9 = 0;
513*437bfbebSnyanmisaka 
514*437bfbebSnyanmisaka     reg->pre_intra_cla10_B0.pre_intra_cla10_m0 = 0;
515*437bfbebSnyanmisaka     reg->pre_intra_cla10_B0.pre_intra_cla10_m1 = 0;
516*437bfbebSnyanmisaka     reg->pre_intra_cla10_B0.pre_intra_cla10_m2 = 0;
517*437bfbebSnyanmisaka     reg->pre_intra_cla10_B0.pre_intra_cla10_m3 = 0;
518*437bfbebSnyanmisaka     reg->pre_intra_cla10_B0.pre_intra_cla10_m4 = 0;
519*437bfbebSnyanmisaka     reg->pre_intra_cla10_B1.pre_intra_cla10_m5 = 0;
520*437bfbebSnyanmisaka     reg->pre_intra_cla10_B1.pre_intra_cla10_m6 = 0;
521*437bfbebSnyanmisaka     reg->pre_intra_cla10_B1.pre_intra_cla10_m7 = 0;
522*437bfbebSnyanmisaka     reg->pre_intra_cla10_B1.pre_intra_cla10_m8 = 0;
523*437bfbebSnyanmisaka     reg->pre_intra_cla10_B1.pre_intra_cla10_m9 = 0;
524*437bfbebSnyanmisaka 
525*437bfbebSnyanmisaka     reg->pre_intra_cla11_B0.pre_intra_cla11_m0 = 0;
526*437bfbebSnyanmisaka     reg->pre_intra_cla11_B0.pre_intra_cla11_m1 = 0;
527*437bfbebSnyanmisaka     reg->pre_intra_cla11_B0.pre_intra_cla11_m2 = 0;
528*437bfbebSnyanmisaka     reg->pre_intra_cla11_B0.pre_intra_cla11_m3 = 0;
529*437bfbebSnyanmisaka     reg->pre_intra_cla11_B0.pre_intra_cla11_m4 = 0;
530*437bfbebSnyanmisaka     reg->pre_intra_cla11_B1.pre_intra_cla11_m5 = 0;
531*437bfbebSnyanmisaka     reg->pre_intra_cla11_B1.pre_intra_cla11_m6 = 0;
532*437bfbebSnyanmisaka     reg->pre_intra_cla11_B1.pre_intra_cla11_m7 = 0;
533*437bfbebSnyanmisaka     reg->pre_intra_cla11_B1.pre_intra_cla11_m8 = 0;
534*437bfbebSnyanmisaka     reg->pre_intra_cla11_B1.pre_intra_cla11_m9 = 0;
535*437bfbebSnyanmisaka 
536*437bfbebSnyanmisaka     reg->pre_intra_cla12_B0.pre_intra_cla12_m0 = 0;
537*437bfbebSnyanmisaka     reg->pre_intra_cla12_B0.pre_intra_cla12_m1 = 0;
538*437bfbebSnyanmisaka     reg->pre_intra_cla12_B0.pre_intra_cla12_m2 = 0;
539*437bfbebSnyanmisaka     reg->pre_intra_cla12_B0.pre_intra_cla12_m3 = 0;
540*437bfbebSnyanmisaka     reg->pre_intra_cla12_B0.pre_intra_cla12_m4 = 0;
541*437bfbebSnyanmisaka     reg->pre_intra_cla12_B1.pre_intra_cla12_m5 = 0;
542*437bfbebSnyanmisaka     reg->pre_intra_cla12_B1.pre_intra_cla12_m6 = 0;
543*437bfbebSnyanmisaka     reg->pre_intra_cla12_B1.pre_intra_cla12_m7 = 0;
544*437bfbebSnyanmisaka     reg->pre_intra_cla12_B1.pre_intra_cla12_m8 = 0;
545*437bfbebSnyanmisaka     reg->pre_intra_cla12_B1.pre_intra_cla12_m9 = 0;
546*437bfbebSnyanmisaka 
547*437bfbebSnyanmisaka     reg->pre_intra_cla13_B0.pre_intra_cla13_m0 = 0;
548*437bfbebSnyanmisaka     reg->pre_intra_cla13_B0.pre_intra_cla13_m1 = 0;
549*437bfbebSnyanmisaka     reg->pre_intra_cla13_B0.pre_intra_cla13_m2 = 0;
550*437bfbebSnyanmisaka     reg->pre_intra_cla13_B0.pre_intra_cla13_m3 = 0;
551*437bfbebSnyanmisaka     reg->pre_intra_cla13_B0.pre_intra_cla13_m4 = 0;
552*437bfbebSnyanmisaka     reg->pre_intra_cla13_B1.pre_intra_cla13_m5 = 0;
553*437bfbebSnyanmisaka     reg->pre_intra_cla13_B1.pre_intra_cla13_m6 = 0;
554*437bfbebSnyanmisaka     reg->pre_intra_cla13_B1.pre_intra_cla13_m7 = 0;
555*437bfbebSnyanmisaka     reg->pre_intra_cla13_B1.pre_intra_cla13_m8 = 0;
556*437bfbebSnyanmisaka     reg->pre_intra_cla13_B1.pre_intra_cla13_m9 = 0;
557*437bfbebSnyanmisaka 
558*437bfbebSnyanmisaka     reg->pre_intra_cla14_B0.pre_intra_cla14_m0 = 0;
559*437bfbebSnyanmisaka     reg->pre_intra_cla14_B0.pre_intra_cla14_m1 = 0;
560*437bfbebSnyanmisaka     reg->pre_intra_cla14_B0.pre_intra_cla14_m2 = 0;
561*437bfbebSnyanmisaka     reg->pre_intra_cla14_B0.pre_intra_cla14_m3 = 0;
562*437bfbebSnyanmisaka     reg->pre_intra_cla14_B0.pre_intra_cla14_m4 = 0;
563*437bfbebSnyanmisaka     reg->pre_intra_cla14_B1.pre_intra_cla14_m5 = 0;
564*437bfbebSnyanmisaka     reg->pre_intra_cla14_B1.pre_intra_cla14_m6 = 0;
565*437bfbebSnyanmisaka     reg->pre_intra_cla14_B1.pre_intra_cla14_m7 = 0;
566*437bfbebSnyanmisaka     reg->pre_intra_cla14_B1.pre_intra_cla14_m8 = 0;
567*437bfbebSnyanmisaka     reg->pre_intra_cla14_B1.pre_intra_cla14_m9 = 0;
568*437bfbebSnyanmisaka 
569*437bfbebSnyanmisaka     reg->pre_intra_cla15_B0.pre_intra_cla15_m0 = 0;
570*437bfbebSnyanmisaka     reg->pre_intra_cla15_B0.pre_intra_cla15_m1 = 0;
571*437bfbebSnyanmisaka     reg->pre_intra_cla15_B0.pre_intra_cla15_m2 = 0;
572*437bfbebSnyanmisaka     reg->pre_intra_cla15_B0.pre_intra_cla15_m3 = 0;
573*437bfbebSnyanmisaka     reg->pre_intra_cla15_B0.pre_intra_cla15_m4 = 0;
574*437bfbebSnyanmisaka     reg->pre_intra_cla15_B1.pre_intra_cla15_m5 = 0;
575*437bfbebSnyanmisaka     reg->pre_intra_cla15_B1.pre_intra_cla15_m6 = 0;
576*437bfbebSnyanmisaka     reg->pre_intra_cla15_B1.pre_intra_cla15_m7 = 0;
577*437bfbebSnyanmisaka     reg->pre_intra_cla15_B1.pre_intra_cla15_m8 = 0;
578*437bfbebSnyanmisaka     reg->pre_intra_cla15_B1.pre_intra_cla15_m9 = 0;
579*437bfbebSnyanmisaka 
580*437bfbebSnyanmisaka     reg->pre_intra_cla16_B0.pre_intra_cla16_m0 = 0;
581*437bfbebSnyanmisaka     reg->pre_intra_cla16_B0.pre_intra_cla16_m1 = 0;
582*437bfbebSnyanmisaka     reg->pre_intra_cla16_B0.pre_intra_cla16_m2 = 0;
583*437bfbebSnyanmisaka     reg->pre_intra_cla16_B0.pre_intra_cla16_m3 = 0;
584*437bfbebSnyanmisaka     reg->pre_intra_cla16_B0.pre_intra_cla16_m4 = 0;
585*437bfbebSnyanmisaka     reg->pre_intra_cla16_B1.pre_intra_cla16_m5 = 0;
586*437bfbebSnyanmisaka     reg->pre_intra_cla16_B1.pre_intra_cla16_m6 = 0;
587*437bfbebSnyanmisaka     reg->pre_intra_cla16_B1.pre_intra_cla16_m7 = 0;
588*437bfbebSnyanmisaka     reg->pre_intra_cla16_B1.pre_intra_cla16_m8 = 0;
589*437bfbebSnyanmisaka     reg->pre_intra_cla16_B1.pre_intra_cla16_m9 = 0;
590*437bfbebSnyanmisaka 
591*437bfbebSnyanmisaka     reg->i16_sobel_t.intra_l16_sobel_t0 = 64;
592*437bfbebSnyanmisaka     reg->i16_sobel_t.intra_l16_sobel_t1 = 200;
593*437bfbebSnyanmisaka     reg->i16_sobel_a_00.intra_l16_sobel_a0_qp0 = 32;
594*437bfbebSnyanmisaka     reg->i16_sobel_a_00.intra_l16_sobel_a0_qp1 = 32;
595*437bfbebSnyanmisaka     reg->i16_sobel_a_00.intra_l16_sobel_a0_qp2 = 32;
596*437bfbebSnyanmisaka     reg->i16_sobel_a_00.intra_l16_sobel_a0_qp3 = 32;
597*437bfbebSnyanmisaka     reg->i16_sobel_a_00.intra_l16_sobel_a0_qp4 = 32;
598*437bfbebSnyanmisaka     reg->i16_sobel_a_01.intra_l16_sobel_a0_qp5 = 32;
599*437bfbebSnyanmisaka     reg->i16_sobel_a_01.intra_l16_sobel_a0_qp6 = 32;
600*437bfbebSnyanmisaka     reg->i16_sobel_a_01.intra_l16_sobel_a0_qp7 = 32;
601*437bfbebSnyanmisaka     reg->i16_sobel_a_01.intra_l16_sobel_a0_qp8 = 32;
602*437bfbebSnyanmisaka     reg->i16_sobel_b_00.intra_l16_sobel_b0_qp0 = 0;
603*437bfbebSnyanmisaka     reg->i16_sobel_b_00.intra_l16_sobel_b0_qp1 = 0;
604*437bfbebSnyanmisaka     reg->i16_sobel_b_01.intra_l16_sobel_b0_qp2 = 0;
605*437bfbebSnyanmisaka     reg->i16_sobel_b_01.intra_l16_sobel_b0_qp3 = 0;
606*437bfbebSnyanmisaka     reg->i16_sobel_b_02.intra_l16_sobel_b0_qp4 = 0;
607*437bfbebSnyanmisaka     reg->i16_sobel_b_02.intra_l16_sobel_b0_qp5 = 0;
608*437bfbebSnyanmisaka     reg->i16_sobel_b_03.intra_l16_sobel_b0_qp6 = 0;
609*437bfbebSnyanmisaka     reg->i16_sobel_b_03.intra_l16_sobel_b0_qp7 = 0;
610*437bfbebSnyanmisaka     reg->i16_sobel_b_04.intra_l16_sobel_b0_qp8 = 0;
611*437bfbebSnyanmisaka     reg->i16_sobel_c_00.intra_l16_sobel_c0_qp0  = 13;
612*437bfbebSnyanmisaka     reg->i16_sobel_c_00.intra_l16_sobel_c0_qp1  = 13;
613*437bfbebSnyanmisaka     reg->i16_sobel_c_00.intra_l16_sobel_c0_qp2  = 13;
614*437bfbebSnyanmisaka     reg->i16_sobel_c_00.intra_l16_sobel_c0_qp3  = 13;
615*437bfbebSnyanmisaka     reg->i16_sobel_c_00.intra_l16_sobel_c0_qp4  = 13;
616*437bfbebSnyanmisaka     reg->i16_sobel_c_01.intra_l16_sobel_c0_qp5  = 13;
617*437bfbebSnyanmisaka     reg->i16_sobel_c_01.intra_l16_sobel_c0_qp6  = 13;
618*437bfbebSnyanmisaka     reg->i16_sobel_c_01.intra_l16_sobel_c0_qp7  = 13;
619*437bfbebSnyanmisaka     reg->i16_sobel_c_01.intra_l16_sobel_c0_qp8  = 13;
620*437bfbebSnyanmisaka     reg->i16_sobel_d_00.intra_l16_sobel_d0_qp0 = 23750;
621*437bfbebSnyanmisaka     reg->i16_sobel_d_00.intra_l16_sobel_d0_qp1 = 23750;
622*437bfbebSnyanmisaka     reg->i16_sobel_d_01.intra_l16_sobel_d0_qp2 = 23750;
623*437bfbebSnyanmisaka     reg->i16_sobel_d_01.intra_l16_sobel_d0_qp3 = 23750;
624*437bfbebSnyanmisaka     reg->i16_sobel_d_02.intra_l16_sobel_d0_qp4 = 23750;
625*437bfbebSnyanmisaka     reg->i16_sobel_d_02.intra_l16_sobel_d0_qp5 = 23750;
626*437bfbebSnyanmisaka     reg->i16_sobel_d_03.intra_l16_sobel_d0_qp6 = 23750;
627*437bfbebSnyanmisaka     reg->i16_sobel_d_03.intra_l16_sobel_d0_qp7 = 23750;
628*437bfbebSnyanmisaka     reg->i16_sobel_d_04.intra_l16_sobel_d0_qp8 = 23750;
629*437bfbebSnyanmisaka 
630*437bfbebSnyanmisaka     reg->intra_l16_sobel_e0_qp0_low = 20000;
631*437bfbebSnyanmisaka     reg->intra_l16_sobel_e0_qp1_low = 20000;
632*437bfbebSnyanmisaka     reg->intra_l16_sobel_e0_qp2_low = 20000;
633*437bfbebSnyanmisaka     reg->intra_l16_sobel_e0_qp3_low = 20000;
634*437bfbebSnyanmisaka     reg->intra_l16_sobel_e0_qp4_low = 20000;
635*437bfbebSnyanmisaka     reg->intra_l16_sobel_e0_qp5_low = 20000;
636*437bfbebSnyanmisaka     reg->intra_l16_sobel_e0_qp6_low = 20000;
637*437bfbebSnyanmisaka     reg->intra_l16_sobel_e0_qp7_low = 20000;
638*437bfbebSnyanmisaka     reg->intra_l16_sobel_e0_qp8_low = 20000;
639*437bfbebSnyanmisaka     reg->i16_sobel_e_01.intra_l16_sobel_e0_qp0_high = 0;
640*437bfbebSnyanmisaka     reg->i16_sobel_e_03.intra_l16_sobel_e0_qp1_high = 0;
641*437bfbebSnyanmisaka     reg->i16_sobel_e_05.intra_l16_sobel_e0_qp2_high = 0;
642*437bfbebSnyanmisaka     reg->i16_sobel_e_07.intra_l16_sobel_e0_qp3_high = 0;
643*437bfbebSnyanmisaka     reg->i16_sobel_e_09.intra_l16_sobel_e0_qp4_high = 0;
644*437bfbebSnyanmisaka     reg->i16_sobel_e_11.intra_l16_sobel_e0_qp5_high = 0;
645*437bfbebSnyanmisaka     reg->i16_sobel_e_13.intra_l16_sobel_e0_qp6_high = 0;
646*437bfbebSnyanmisaka     reg->i16_sobel_e_15.intra_l16_sobel_e0_qp7_high = 0;
647*437bfbebSnyanmisaka     reg->i16_sobel_e_17.intra_l16_sobel_e0_qp8_high = 0;
648*437bfbebSnyanmisaka 
649*437bfbebSnyanmisaka     reg->i32_sobel_t_00.intra_l32_sobel_t2 = 64;
650*437bfbebSnyanmisaka     reg->i32_sobel_t_00.intra_l32_sobel_t3 = 400;
651*437bfbebSnyanmisaka     reg->i32_sobel_t_01.intra_l32_sobel_t4 = 8;
652*437bfbebSnyanmisaka     reg->i32_sobel_t_02.intra_l32_sobel_t5 = 100;
653*437bfbebSnyanmisaka     reg->i32_sobel_t_02.intra_l32_sobel_t6 = 100;
654*437bfbebSnyanmisaka 
655*437bfbebSnyanmisaka     reg->i32_sobel_a.intra_l32_sobel_a1_qp0 = 18;
656*437bfbebSnyanmisaka     reg->i32_sobel_a.intra_l32_sobel_a1_qp1 = 18;
657*437bfbebSnyanmisaka     reg->i32_sobel_a.intra_l32_sobel_a1_qp2 = 18;
658*437bfbebSnyanmisaka     reg->i32_sobel_a.intra_l32_sobel_a1_qp3 = 18;
659*437bfbebSnyanmisaka     reg->i32_sobel_a.intra_l32_sobel_a1_qp4 = 18;
660*437bfbebSnyanmisaka 
661*437bfbebSnyanmisaka     reg->i32_sobel_b_00.intra_l32_sobel_b1_qp0 = 0;
662*437bfbebSnyanmisaka     reg->i32_sobel_b_00.intra_l32_sobel_b1_qp1 = 0;
663*437bfbebSnyanmisaka     reg->i32_sobel_b_01.intra_l32_sobel_b1_qp2 = 0;
664*437bfbebSnyanmisaka     reg->i32_sobel_b_01.intra_l32_sobel_b1_qp3 = 0;
665*437bfbebSnyanmisaka     reg->i32_sobel_b_02.intra_l32_sobel_b1_qp4 = 0;
666*437bfbebSnyanmisaka 
667*437bfbebSnyanmisaka     reg->i32_sobel_c.intra_l32_sobel_c1_qp0 = 16;
668*437bfbebSnyanmisaka     reg->i32_sobel_c.intra_l32_sobel_c1_qp1 = 16;
669*437bfbebSnyanmisaka     reg->i32_sobel_c.intra_l32_sobel_c1_qp2 = 16;
670*437bfbebSnyanmisaka     reg->i32_sobel_c.intra_l32_sobel_c1_qp3 = 16;
671*437bfbebSnyanmisaka     reg->i32_sobel_c.intra_l32_sobel_c1_qp4 = 16;
672*437bfbebSnyanmisaka 
673*437bfbebSnyanmisaka     reg->i32_sobel_d_00.intra_l32_sobel_d1_qp0 = 0;
674*437bfbebSnyanmisaka     reg->i32_sobel_d_00.intra_l32_sobel_d1_qp1 = 0;
675*437bfbebSnyanmisaka     reg->i32_sobel_d_01.intra_l32_sobel_d1_qp2 = 0;
676*437bfbebSnyanmisaka     reg->i32_sobel_d_01.intra_l32_sobel_d1_qp3 = 0;
677*437bfbebSnyanmisaka     reg->i32_sobel_d_02.intra_l32_sobel_d1_qp4 = 0;
678*437bfbebSnyanmisaka 
679*437bfbebSnyanmisaka     reg->intra_l32_sobel_e1_qp0_low = 20000;
680*437bfbebSnyanmisaka     reg->intra_l32_sobel_e1_qp1_low = 20000;
681*437bfbebSnyanmisaka     reg->intra_l32_sobel_e1_qp2_low = 20000;
682*437bfbebSnyanmisaka     reg->intra_l32_sobel_e1_qp3_low = 20000;
683*437bfbebSnyanmisaka     reg->intra_l32_sobel_e1_qp4_low = 20000;
684*437bfbebSnyanmisaka 
685*437bfbebSnyanmisaka     reg->i32_sobel_e_01.intra_l32_sobel_e1_qp0_high = 0;
686*437bfbebSnyanmisaka     reg->i32_sobel_e_03.intra_l32_sobel_e1_qp1_high = 0;
687*437bfbebSnyanmisaka     reg->i32_sobel_e_05.intra_l32_sobel_e1_qp2_high = 0;
688*437bfbebSnyanmisaka     reg->i32_sobel_e_07.intra_l32_sobel_e1_qp3_high = 0;
689*437bfbebSnyanmisaka     reg->i32_sobel_e_09.intra_l32_sobel_e1_qp4_high = 0;
690*437bfbebSnyanmisaka }
691*437bfbebSnyanmisaka 
vepu580_h265_rdo_bias_cfg(vepu580_rdo_cfg * reg,MppEncHwCfg * hw)692*437bfbebSnyanmisaka static void vepu580_h265_rdo_bias_cfg (vepu580_rdo_cfg *reg, MppEncHwCfg *hw)
693*437bfbebSnyanmisaka {
694*437bfbebSnyanmisaka     RdoAtfCfg* p_rdo_atf;
695*437bfbebSnyanmisaka     RdoAtfSkipCfg* p_rdo_atf_skip;
696*437bfbebSnyanmisaka     RK_U8 bias = h265e_mode_bias[hw->mode_bias[4]];
697*437bfbebSnyanmisaka 
698*437bfbebSnyanmisaka     p_rdo_atf = &reg->rdo_b64_inter_atf;
699*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = bias;
700*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt01  = bias;
701*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt02  = bias;
702*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt10  = bias;
703*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt11  = bias;
704*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt12  = bias;
705*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt20  = bias;
706*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt21  = bias;
707*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt22  = bias;
708*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt30  = bias;
709*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt31  = bias;
710*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt32  = bias;
711*437bfbebSnyanmisaka 
712*437bfbebSnyanmisaka     if (hw->skip_bias_en) {
713*437bfbebSnyanmisaka         bias = h265e_mode_bias[hw->skip_bias];
714*437bfbebSnyanmisaka 
715*437bfbebSnyanmisaka         p_rdo_atf_skip = &reg->rdo_b64_skip_atf;
716*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd0 = hw->skip_sad < 24 ? hw->skip_sad : 24;
717*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd1 = hw->skip_sad < 4 ? hw->skip_sad : 4;
718*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd2 = hw->skip_sad < 6 ? hw->skip_sad : 6;
719*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd3 = hw->skip_sad;
720*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd0 = bias > 24 ? bias : 24;
721*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd1 = bias < 4 ? bias : 4;
722*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd2 = bias < 6 ? bias : 6;
723*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd3 = bias < 8 ? bias : 8;
724*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = bias;
725*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt10  = bias < 10 ? bias : 10;
726*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt11  = bias < 10 ? bias : 10;
727*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt12  = bias < 10 ? bias : 10;
728*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt20  = bias < 14 ? bias : 14;
729*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt21  = bias < 14 ? bias : 14;
730*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt22  = bias < 15 ? bias : 15;
731*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt30  = bias < 15 ? bias : 15;
732*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt31  = bias < 15 ? bias : 15;
733*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt32  = bias;
734*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt40  = bias;
735*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt41  = bias;
736*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt42  = bias;
737*437bfbebSnyanmisaka     }
738*437bfbebSnyanmisaka 
739*437bfbebSnyanmisaka     bias = h265e_mode_bias[hw->mode_bias[0]];
740*437bfbebSnyanmisaka 
741*437bfbebSnyanmisaka     p_rdo_atf = &reg->rdo_b32_intra_atf;
742*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = bias > 26 ? bias : 26;
743*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt01  = bias > 25 ? bias : 25;
744*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt02  = bias > 25 ? bias : 25;
745*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt10  = bias > 25 ? bias : 25;
746*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt11  = bias > 24 ? bias : 24;
747*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt12  = bias > 23 ? bias : 23;
748*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt20  = bias > 21 ? bias : 21;
749*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt21  = bias > 19 ? bias : 19;
750*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt22  = bias > 18 ? bias : 18;
751*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt30  = bias;
752*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt31  = bias;
753*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt32  = bias;
754*437bfbebSnyanmisaka 
755*437bfbebSnyanmisaka     bias = h265e_mode_bias[hw->mode_bias[5]];
756*437bfbebSnyanmisaka 
757*437bfbebSnyanmisaka     p_rdo_atf = &reg->rdo_b32_inter_atf;
758*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = bias;
759*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt01  = bias;
760*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt02  = bias;
761*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt10  = bias;
762*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt11  = bias;
763*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt12  = bias;
764*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt20  = bias;
765*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt21  = bias;
766*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt22  = bias;
767*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt30  = bias;
768*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt31  = bias;
769*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt32  = bias;
770*437bfbebSnyanmisaka 
771*437bfbebSnyanmisaka     if (hw->skip_bias_en) {
772*437bfbebSnyanmisaka         bias = h265e_mode_bias[hw->skip_bias];
773*437bfbebSnyanmisaka 
774*437bfbebSnyanmisaka         p_rdo_atf_skip = &reg->rdo_b32_skip_atf;
775*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd0 = hw->skip_sad < 24 ? hw->skip_sad : 24;
776*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd1 = hw->skip_sad < 4 ? hw->skip_sad : 4;
777*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd2 = hw->skip_sad < 6 ? hw->skip_sad : 6;
778*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd3 = hw->skip_sad;
779*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = bias > 18 ? bias : 18;
780*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt10  = bias < 11 ? bias : 11;
781*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt11  = bias < 11 ? bias : 11;
782*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt12  = bias < 11 ? bias : 11;
783*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt20  = bias < 13 ? bias : 13;
784*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt21  = bias < 13 ? bias : 13;
785*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt22  = bias < 13 ? bias : 13;
786*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt30  = bias < 15 ? bias : 15;
787*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt31  = bias < 15 ? bias : 15;
788*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt32  = bias < 15 ? bias : 15;
789*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt40  = bias;
790*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt41  = bias;
791*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt42  = bias;
792*437bfbebSnyanmisaka     }
793*437bfbebSnyanmisaka 
794*437bfbebSnyanmisaka     bias = h265e_mode_bias[hw->mode_bias[1]];
795*437bfbebSnyanmisaka 
796*437bfbebSnyanmisaka     p_rdo_atf = &reg->rdo_b16_intra_atf;
797*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = bias > 26 ? bias : 26;
798*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt01  = bias > 25 ? bias : 25;
799*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt02  = bias > 25 ? bias : 25;
800*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt10  = bias > 25 ? bias : 25;
801*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt11  = bias > 24 ? bias : 24;
802*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt12  = bias > 23 ? bias : 23;
803*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt20  = bias > 21 ? bias : 21;
804*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt21  = bias > 19 ? bias : 19;
805*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt22  = bias > 18 ? bias : 18;
806*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt30  = bias;
807*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt31  = bias;
808*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt32  = bias;
809*437bfbebSnyanmisaka 
810*437bfbebSnyanmisaka     bias = h265e_mode_bias[hw->mode_bias[6]];
811*437bfbebSnyanmisaka 
812*437bfbebSnyanmisaka     p_rdo_atf = &reg->rdo_b16_inter_atf;
813*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = bias;
814*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt01  = bias;
815*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt02  = bias;
816*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt10  = bias;
817*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt11  = bias;
818*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt12  = bias;
819*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt20  = bias;
820*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt21  = bias;
821*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt22  = bias;
822*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt30  = bias;
823*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt31  = bias;
824*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt32  = bias;
825*437bfbebSnyanmisaka 
826*437bfbebSnyanmisaka     if (hw->skip_bias_en) {
827*437bfbebSnyanmisaka         bias = h265e_mode_bias[hw->skip_bias];
828*437bfbebSnyanmisaka 
829*437bfbebSnyanmisaka         p_rdo_atf_skip = &reg->rdo_b16_skip_atf;
830*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd0 = hw->skip_sad < 24 ? hw->skip_sad : 24;
831*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd1 = hw->skip_sad < 24 ? hw->skip_sad : 24;
832*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd2 = hw->skip_sad < 48 ? hw->skip_sad : 48;
833*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd3 = hw->skip_sad;
834*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = bias;
835*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt10  = bias;
836*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt11  = bias;
837*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt12  = bias;
838*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt20  = bias;
839*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt21  = bias;
840*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt22  = bias;
841*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt30  = bias;
842*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt31  = bias;
843*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt32  = bias;
844*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt40  = bias;
845*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt41  = bias;
846*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt42  = bias;
847*437bfbebSnyanmisaka     }
848*437bfbebSnyanmisaka 
849*437bfbebSnyanmisaka     bias = h265e_mode_bias[hw->mode_bias[2]];
850*437bfbebSnyanmisaka 
851*437bfbebSnyanmisaka     p_rdo_atf = &reg->rdo_b8_intra_atf;
852*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = bias > 26 ? bias : 26;
853*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt01  = bias > 25 ? bias : 25;
854*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt02  = bias > 25 ? bias : 25;
855*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt10  = bias > 25 ? bias : 25;
856*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt11  = bias > 24 ? bias : 24;
857*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt12  = bias > 23 ? bias : 23;
858*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt20  = bias > 21 ? bias : 21;
859*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt21  = bias > 19 ? bias : 19;
860*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt22  = bias > 18 ? bias : 18;
861*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt30  = bias;
862*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt31  = bias;
863*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt32  = bias;
864*437bfbebSnyanmisaka 
865*437bfbebSnyanmisaka     bias = h265e_mode_bias[hw->mode_bias[7]];
866*437bfbebSnyanmisaka 
867*437bfbebSnyanmisaka     p_rdo_atf = &reg->rdo_b8_inter_atf;
868*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = bias;
869*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt01  = bias;
870*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt02  = bias;
871*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt10  = bias;
872*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt11  = bias;
873*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt12  = bias;
874*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt20  = bias;
875*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt21  = bias;
876*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt22  = bias;
877*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt30  = bias;
878*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt31  = bias;
879*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt32  = bias;
880*437bfbebSnyanmisaka 
881*437bfbebSnyanmisaka     if (hw->skip_bias_en) {
882*437bfbebSnyanmisaka         bias = h265e_mode_bias[hw->skip_bias];
883*437bfbebSnyanmisaka 
884*437bfbebSnyanmisaka         p_rdo_atf_skip = &reg->rdo_b8_skip_atf;
885*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd0 = hw->skip_sad < 24 ? hw->skip_sad : 24;
886*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd1 = hw->skip_sad < 24 ? hw->skip_sad : 24;
887*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd2 = hw->skip_sad < 48 ? hw->skip_sad : 48;
888*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd3 = hw->skip_sad;
889*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = bias;
890*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt10  = bias;
891*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt11  = bias;
892*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt12  = bias;
893*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt20  = bias;
894*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt21  = bias;
895*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt22  = bias;
896*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt30  = bias;
897*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt31  = bias;
898*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt32  = bias;
899*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt40  = bias;
900*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt41  = bias;
901*437bfbebSnyanmisaka         p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt42  = bias;
902*437bfbebSnyanmisaka     }
903*437bfbebSnyanmisaka }
904*437bfbebSnyanmisaka 
vepu580_h265_rdo_cfg(vepu580_rdo_cfg * reg)905*437bfbebSnyanmisaka static void vepu580_h265_rdo_cfg (vepu580_rdo_cfg *reg)
906*437bfbebSnyanmisaka {
907*437bfbebSnyanmisaka     RdoAtfCfg* p_rdo_atf;
908*437bfbebSnyanmisaka     RdoAtfSkipCfg* p_rdo_atf_skip;
909*437bfbebSnyanmisaka     reg->rdo_sqi_cfg.rdo_segment_en = 1;
910*437bfbebSnyanmisaka     reg->rdo_sqi_cfg.rdo_smear_en = 1;
911*437bfbebSnyanmisaka     p_rdo_atf = &reg->rdo_b64_inter_atf;
912*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd0.cu_rdo_cime_thd0 = 32;
913*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd0.cu_rdo_cime_thd1 = 144;
914*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd1.cu_rdo_cime_thd2 = 300;
915*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd0.cu_rdo_var_thd00  = 31;
916*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd0.cu_rdo_var_thd01  = 400;
917*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd1.cu_rdo_var_thd10  = 31;
918*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd1.cu_rdo_var_thd11  = 400;
919*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd2.cu_rdo_var_thd20  = 31;
920*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd2.cu_rdo_var_thd21  = 400;
921*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd3.cu_rdo_var_thd30  = 31;
922*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd3.cu_rdo_var_thd31  = 400;
923*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = 16;
924*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt01  = 16;
925*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt02  = 16;
926*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt10  = 16;
927*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt11  = 16;
928*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt12  = 16;
929*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt20  = 16;
930*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt21  = 16;
931*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt22  = 16;
932*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt30  = 16;
933*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt31  = 16;
934*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt32  = 16;
935*437bfbebSnyanmisaka 
936*437bfbebSnyanmisaka     p_rdo_atf_skip = &reg->rdo_b64_skip_atf;
937*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd0 = 24;
938*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd1 = 4;
939*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd2 = 6;
940*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd3 = 8;
941*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd0.cu_rdo_var_thd10  = 31;
942*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd0.cu_rdo_var_thd11  = 400;
943*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd1.cu_rdo_var_thd20  = 31;
944*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd1.cu_rdo_var_thd21  = 400;
945*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd2.cu_rdo_var_thd30  = 31;
946*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd2.cu_rdo_var_thd31  = 400;
947*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd3.cu_rdo_var_thd40  = 31;
948*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd3.cu_rdo_var_thd41  = 400;
949*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = 16;
950*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt10  = 10;
951*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt11  = 10;
952*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt12  = 10;
953*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt20  = 14;
954*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt21  = 14;
955*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt22  = 15;
956*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt30  = 15;
957*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt31  = 15;
958*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt32  = 16;
959*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt40  = 16;
960*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt41  = 16;
961*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt42  = 16;
962*437bfbebSnyanmisaka 
963*437bfbebSnyanmisaka     p_rdo_atf = &reg->rdo_b32_intra_atf;
964*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd0.cu_rdo_cime_thd0 = 24;
965*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd0.cu_rdo_cime_thd1 = 48;
966*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd1.cu_rdo_cime_thd2 = 64;
967*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd0.cu_rdo_var_thd00  = 31;
968*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd0.cu_rdo_var_thd01  = 400;
969*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd1.cu_rdo_var_thd10  = 31;
970*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd1.cu_rdo_var_thd11  = 400;
971*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd2.cu_rdo_var_thd20  = 31;
972*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd2.cu_rdo_var_thd21  = 400;
973*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd3.cu_rdo_var_thd30  = 31;
974*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd3.cu_rdo_var_thd31  = 400;
975*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = 26;
976*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt01  = 25;
977*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt02  = 25;
978*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt10  = 25;
979*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt11  = 24;
980*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt12  = 23;
981*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt20  = 21;
982*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt21  = 19;
983*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt22  = 18;
984*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt30  = 16;
985*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt31  = 16;
986*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt32  = 16;
987*437bfbebSnyanmisaka 
988*437bfbebSnyanmisaka     p_rdo_atf = &reg->rdo_b32_inter_atf;
989*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd0.cu_rdo_cime_thd0 = 32;
990*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd0.cu_rdo_cime_thd1 = 144;
991*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd1.cu_rdo_cime_thd2 = 300;
992*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd0.cu_rdo_var_thd00  = 31;
993*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd0.cu_rdo_var_thd01  = 400;
994*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd1.cu_rdo_var_thd10  = 31;
995*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd1.cu_rdo_var_thd11  = 400;
996*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd2.cu_rdo_var_thd20  = 31;
997*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd2.cu_rdo_var_thd21  = 400;
998*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd3.cu_rdo_var_thd30  = 31;
999*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd3.cu_rdo_var_thd31  = 400;
1000*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = 16;
1001*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt01  = 16;
1002*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt02  = 16;
1003*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt10  = 16;
1004*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt11  = 16;
1005*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt12  = 16;
1006*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt20  = 16;
1007*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt21  = 16;
1008*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt22  = 16;
1009*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt30  = 16;
1010*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt31  = 16;
1011*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt32  = 16;
1012*437bfbebSnyanmisaka 
1013*437bfbebSnyanmisaka     p_rdo_atf_skip = &reg->rdo_b32_skip_atf;
1014*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd0 = 24;
1015*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd1 = 4;
1016*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd2 = 6;
1017*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd3 = 8;
1018*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd0.cu_rdo_var_thd10  = 31;
1019*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd0.cu_rdo_var_thd11  = 400;
1020*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd1.cu_rdo_var_thd20  = 31;
1021*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd1.cu_rdo_var_thd21  = 400;
1022*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd2.cu_rdo_var_thd30  = 31;
1023*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd2.cu_rdo_var_thd31  = 400;
1024*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd3.cu_rdo_var_thd40  = 31;
1025*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd3.cu_rdo_var_thd41  = 400;
1026*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = 18;
1027*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt10  = 11;
1028*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt11  = 11;
1029*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt12  = 11;
1030*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt20  = 13;
1031*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt21  = 13;
1032*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt22  = 13;
1033*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt30  = 15;
1034*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt31  = 15;
1035*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt32  = 15;
1036*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt40  = 16;
1037*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt41  = 16;
1038*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt42  = 16;
1039*437bfbebSnyanmisaka 
1040*437bfbebSnyanmisaka     p_rdo_atf = &reg->rdo_b16_intra_atf;
1041*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd0.cu_rdo_cime_thd0 = 24;
1042*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd0.cu_rdo_cime_thd1 = 48;
1043*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd1.cu_rdo_cime_thd2 = 64;
1044*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd0.cu_rdo_var_thd00  = 31;
1045*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd0.cu_rdo_var_thd01  = 400;
1046*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd1.cu_rdo_var_thd10  = 31;
1047*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd1.cu_rdo_var_thd11  = 400;
1048*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd2.cu_rdo_var_thd20  = 31;
1049*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd2.cu_rdo_var_thd21  = 400;
1050*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd3.cu_rdo_var_thd30  = 31;
1051*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd3.cu_rdo_var_thd31  = 400;
1052*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = 26;
1053*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt01  = 25;
1054*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt02  = 25;
1055*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt10  = 25;
1056*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt11  = 24;
1057*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt12  = 23;
1058*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt20  = 21;
1059*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt21  = 19;
1060*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt22  = 18;
1061*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt30  = 16;
1062*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt31  = 16;
1063*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt32  = 16;
1064*437bfbebSnyanmisaka 
1065*437bfbebSnyanmisaka     p_rdo_atf = &reg->rdo_b16_inter_atf;
1066*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd0.cu_rdo_cime_thd0 = 32;
1067*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd0.cu_rdo_cime_thd1 = 144;
1068*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd1.cu_rdo_cime_thd2 = 300;
1069*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd0.cu_rdo_var_thd00  = 31;
1070*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd0.cu_rdo_var_thd01  = 400;
1071*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd1.cu_rdo_var_thd10  = 31;
1072*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd1.cu_rdo_var_thd11  = 400;
1073*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd2.cu_rdo_var_thd20  = 31;
1074*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd2.cu_rdo_var_thd21  = 400;
1075*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd3.cu_rdo_var_thd30  = 31;
1076*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd3.cu_rdo_var_thd31  = 400;
1077*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = 16;
1078*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt01  = 16;
1079*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt02  = 16;
1080*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt10  = 16;
1081*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt11  = 16;
1082*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt12  = 16;
1083*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt20  = 16;
1084*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt21  = 16;
1085*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt22  = 16;
1086*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt30  = 16;
1087*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt31  = 16;
1088*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt32  = 16;
1089*437bfbebSnyanmisaka 
1090*437bfbebSnyanmisaka     p_rdo_atf_skip = &reg->rdo_b16_skip_atf;
1091*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd0 = 24;
1092*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd1 = 24;
1093*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd2 = 48;
1094*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd3 = 96;
1095*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd0.cu_rdo_var_thd10  = 31;
1096*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd0.cu_rdo_var_thd11  = 400;
1097*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd1.cu_rdo_var_thd20  = 31;
1098*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd1.cu_rdo_var_thd21  = 400;
1099*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd2.cu_rdo_var_thd30  = 31;
1100*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd2.cu_rdo_var_thd31  = 400;
1101*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd3.cu_rdo_var_thd40  = 31;
1102*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd3.cu_rdo_var_thd41  = 400;
1103*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = 16;
1104*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt10  = 16;
1105*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt11  = 16;
1106*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt12  = 16;
1107*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt20  = 16;
1108*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt21  = 16;
1109*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt22  = 16;
1110*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt30  = 16;
1111*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt31  = 16;
1112*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt32  = 16;
1113*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt40  = 16;
1114*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt41  = 16;
1115*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt42  = 16;
1116*437bfbebSnyanmisaka 
1117*437bfbebSnyanmisaka     p_rdo_atf = &reg->rdo_b8_intra_atf;
1118*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd0.cu_rdo_cime_thd0 = 24;
1119*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd0.cu_rdo_cime_thd1 = 48;
1120*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd1.cu_rdo_cime_thd2 = 64;
1121*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd0.cu_rdo_var_thd00  = 31;
1122*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd0.cu_rdo_var_thd01  = 400;
1123*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd1.cu_rdo_var_thd10  = 31;
1124*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd1.cu_rdo_var_thd11  = 400;
1125*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd2.cu_rdo_var_thd20  = 31;
1126*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd2.cu_rdo_var_thd21  = 400;
1127*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd3.cu_rdo_var_thd30  = 31;
1128*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd3.cu_rdo_var_thd31  = 400;
1129*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = 26;
1130*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt01  = 25;
1131*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt02  = 25;
1132*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt10  = 25;
1133*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt11  = 24;
1134*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt12  = 23;
1135*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt20  = 21;
1136*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt21  = 19;
1137*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt22  = 18;
1138*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt30  = 16;
1139*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt31  = 16;
1140*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt32  = 16;
1141*437bfbebSnyanmisaka 
1142*437bfbebSnyanmisaka     p_rdo_atf = &reg->rdo_b8_inter_atf;
1143*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd0.cu_rdo_cime_thd0 = 32;
1144*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd0.cu_rdo_cime_thd1 = 144;
1145*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_cime_thd1.cu_rdo_cime_thd2 = 300;
1146*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd0.cu_rdo_var_thd00  = 31;
1147*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd0.cu_rdo_var_thd01  = 400;
1148*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd1.cu_rdo_var_thd10  = 31;
1149*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd1.cu_rdo_var_thd11  = 400;
1150*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd2.cu_rdo_var_thd20  = 31;
1151*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd2.cu_rdo_var_thd21  = 400;
1152*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd3.cu_rdo_var_thd30  = 31;
1153*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_var_thd3.cu_rdo_var_thd31  = 400;
1154*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = 16;
1155*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt01  = 16;
1156*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt0.cu_rdo_atf_wgt02  = 16;
1157*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt10  = 16;
1158*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt11  = 16;
1159*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt1.cu_rdo_atf_wgt12  = 16;
1160*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt20  = 16;
1161*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt21  = 16;
1162*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt2.cu_rdo_atf_wgt22  = 16;
1163*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt30  = 16;
1164*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt31  = 16;
1165*437bfbebSnyanmisaka     p_rdo_atf->rdo_b_atf_wgt3.cu_rdo_atf_wgt32  = 16;
1166*437bfbebSnyanmisaka 
1167*437bfbebSnyanmisaka     p_rdo_atf_skip = &reg->rdo_b8_skip_atf;
1168*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd0 = 24;
1169*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_cime_thd0.cu_rdo_cime_thd1 = 24;
1170*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd2 = 48;
1171*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_cime_thd1.cu_rdo_cime_thd3 = 96;
1172*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd0.cu_rdo_var_thd10  = 31;
1173*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd0.cu_rdo_var_thd11  = 400;
1174*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd1.cu_rdo_var_thd20  = 31;
1175*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd1.cu_rdo_var_thd21  = 400;
1176*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd2.cu_rdo_var_thd30  = 31;
1177*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd2.cu_rdo_var_thd31  = 400;
1178*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd3.cu_rdo_var_thd40  = 31;
1179*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_var_thd3.cu_rdo_var_thd41  = 400;
1180*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt00  = 16;
1181*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt10  = 16;
1182*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt11  = 16;
1183*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt0.cu_rdo_atf_wgt12  = 16;
1184*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt20  = 16;
1185*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt21  = 16;
1186*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt1.cu_rdo_atf_wgt22  = 16;
1187*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt30  = 16;
1188*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt31  = 16;
1189*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt2.cu_rdo_atf_wgt32  = 16;
1190*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt40  = 16;
1191*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt41  = 16;
1192*437bfbebSnyanmisaka     p_rdo_atf_skip->rdo_b_atf_wgt3.cu_rdo_atf_wgt42  = 16;
1193*437bfbebSnyanmisaka 
1194*437bfbebSnyanmisaka     reg->rdo_segment_b64_thd0.rdo_segment_cu64_th0 = 160;
1195*437bfbebSnyanmisaka     reg->rdo_segment_b64_thd0.rdo_segment_cu64_th1 = 96;
1196*437bfbebSnyanmisaka     reg->rdo_segment_b64_thd1.rdo_segment_cu64_th2 = 30;
1197*437bfbebSnyanmisaka     reg->rdo_segment_b64_thd1.rdo_segment_cu64_th3 = 0;
1198*437bfbebSnyanmisaka     reg->rdo_segment_b64_thd1.rdo_segment_cu64_th4 = 1;
1199*437bfbebSnyanmisaka     reg->rdo_segment_b64_thd1.rdo_segment_cu64_th5_minus1 = 4;
1200*437bfbebSnyanmisaka     reg->rdo_segment_b64_thd1.rdo_segment_cu64_th6_minus1 = 11;
1201*437bfbebSnyanmisaka 
1202*437bfbebSnyanmisaka     reg->rdo_segment_b32_thd0.rdo_segment_cu32_th0 = 160;
1203*437bfbebSnyanmisaka     reg->rdo_segment_b32_thd0.rdo_segment_cu32_th1 = 96;
1204*437bfbebSnyanmisaka     reg->rdo_segment_b32_thd1.rdo_segment_cu32_th2 = 30;
1205*437bfbebSnyanmisaka     reg->rdo_segment_b32_thd1.rdo_segment_cu32_th3 = 0;
1206*437bfbebSnyanmisaka     reg->rdo_segment_b32_thd1.rdo_segment_cu32_th4 = 1;
1207*437bfbebSnyanmisaka     reg->rdo_segment_b32_thd1.rdo_segment_cu32_th5_minus1 = 2;
1208*437bfbebSnyanmisaka     reg->rdo_segment_b32_thd1.rdo_segment_cu32_th6_minus1 = 3;
1209*437bfbebSnyanmisaka 
1210*437bfbebSnyanmisaka     reg->rdo_segment_multi.rdo_segment_cu64_multi = 22;
1211*437bfbebSnyanmisaka     reg->rdo_segment_multi.rdo_segment_cu32_multi = 22;
1212*437bfbebSnyanmisaka     reg->rdo_segment_multi.rdo_smear_cu16_multi = 6;
1213*437bfbebSnyanmisaka 
1214*437bfbebSnyanmisaka     reg->rdo_b16_smear_thd0.rdo_smear_cu16_cime_sad_th0 = 64;
1215*437bfbebSnyanmisaka     reg->rdo_b16_smear_thd0.rdo_smear_cu16_cime_sad_th1 = 32;
1216*437bfbebSnyanmisaka     reg->rdo_b16_smear_thd1.rdo_smear_cu16_cime_sad_th2 = 36;
1217*437bfbebSnyanmisaka     reg->rdo_b16_smear_thd1.rdo_smear_cu16_cime_sad_th3 = 64;
1218*437bfbebSnyanmisaka 
1219*437bfbebSnyanmisaka 
1220*437bfbebSnyanmisaka     reg->preintra_b32_cst_var_thd.pre_intra32_cst_var_th00 = 9;
1221*437bfbebSnyanmisaka     reg->preintra_b32_cst_var_thd.pre_intra32_cst_var_th01 = 4;
1222*437bfbebSnyanmisaka     reg->preintra_b32_cst_var_thd.pre_intra32_mode_th = 5;
1223*437bfbebSnyanmisaka 
1224*437bfbebSnyanmisaka     reg->preintra_b32_cst_wgt.pre_intra32_cst_wgt00 = 31;
1225*437bfbebSnyanmisaka     reg->preintra_b32_cst_wgt.pre_intra32_cst_wgt01 = 25;
1226*437bfbebSnyanmisaka 
1227*437bfbebSnyanmisaka     reg->preintra_b16_cst_var_thd.pre_intra16_cst_var_th00 = 9;
1228*437bfbebSnyanmisaka     reg->preintra_b16_cst_var_thd.pre_intra16_cst_var_th01 = 4;
1229*437bfbebSnyanmisaka     reg->preintra_b16_cst_var_thd.pre_intra16_mode_th = 5;
1230*437bfbebSnyanmisaka 
1231*437bfbebSnyanmisaka     reg->preintra_b16_cst_wgt.pre_intra16_cst_wgt00 = 31;
1232*437bfbebSnyanmisaka     reg->preintra_b16_cst_wgt.pre_intra16_cst_wgt01 = 25;
1233*437bfbebSnyanmisaka }
1234*437bfbebSnyanmisaka 
vepu580_h265_scl_cfg(vepu580_rdo_cfg * reg)1235*437bfbebSnyanmisaka static void vepu580_h265_scl_cfg(vepu580_rdo_cfg *reg)
1236*437bfbebSnyanmisaka {
1237*437bfbebSnyanmisaka     static RK_U32 vepu580_h265_scl_tab[] = {
1238*437bfbebSnyanmisaka         /* 0x2200 */
1239*437bfbebSnyanmisaka         0x10001000, 0x10001000, 0x0e390f0f, 0x0aab0c31, 0x10001000, 0x10001000, 0x0d790f0f, 0x0a3d0ba3,
1240*437bfbebSnyanmisaka         0x10001000, 0x0e390f0f, 0x0ba30ccd, 0x08d40a3d, 0x10001000, 0x0c310e39, 0x097b0aab, 0x071c0842,
1241*437bfbebSnyanmisaka         0x0f0f0f0f, 0x0aab0ccd, 0x07500889, 0x0572063e, 0x0d790e39, 0x097b0ba3, 0x05d10750, 0x03f004be,
1242*437bfbebSnyanmisaka         0x0ba30c31, 0x08420a3d, 0x04be063e, 0x02e903a8, 0x0a3d0aab, 0x071c08d4, 0x03f00572, 0x023a02e9,
1243*437bfbebSnyanmisaka         0x10001000, 0x10001000, 0x0e390f0f, 0x0aab0c31, 0x10001000, 0x10001000, 0x0d790f0f, 0x0a3d0ba3,
1244*437bfbebSnyanmisaka         0x10001000, 0x0e390f0f, 0x0ba30ccd, 0x08d40a3d, 0x10001000, 0x0c310e39, 0x097b0aab, 0x071c0842,
1245*437bfbebSnyanmisaka         0x0f0f0f0f, 0x0aab0ccd, 0x07500889, 0x0572063e, 0x0d790e39, 0x097b0ba3, 0x05d10750, 0x03f004be,
1246*437bfbebSnyanmisaka         0x0ba30c31, 0x08420a3d, 0x04be063e, 0x02e903a8, 0x0a3d0aab, 0x071c08d4, 0x03f00572, 0x023a02e9,
1247*437bfbebSnyanmisaka         0x10001000, 0x10001000, 0x0e390f0f, 0x0aab0c31, 0x10001000, 0x10001000, 0x0d790f0f, 0x0a3d0ba3,
1248*437bfbebSnyanmisaka         0x10001000, 0x0e390f0f, 0x0ba30ccd, 0x08d40a3d, 0x10001000, 0x0c310e39, 0x097b0aab, 0x071c0842,
1249*437bfbebSnyanmisaka         0x0f0f0f0f, 0x0aab0ccd, 0x07500889, 0x0572063e, 0x0d790e39, 0x097b0ba3, 0x05d10750, 0x03f004be,
1250*437bfbebSnyanmisaka         0x0ba30c31, 0x08420a3d, 0x04be063e, 0x02e903a8, 0x0a3d0aab, 0x071c08d4, 0x03f00572, 0x023a02e9,
1251*437bfbebSnyanmisaka         0x10001000, 0x10001000, 0x0e390f0f, 0x0aab0ccd, 0x10001000, 0x0f0f1000, 0x0ccd0e39, 0x0a3d0aab,
1252*437bfbebSnyanmisaka         0x10001000, 0x0e390f0f, 0x0aab0ccd, 0x09250a3d, 0x0f0f1000, 0x0ccd0e39, 0x0a3d0aab, 0x07c20925,
1253*437bfbebSnyanmisaka         0x0e390f0f, 0x0aab0ccd, 0x09250a3d, 0x063e07c2, 0x0ccd0e39, 0x0a3d0aab, 0x07c20925, 0x04be063e,
1254*437bfbebSnyanmisaka         0x0aab0ccd, 0x09250a3d, 0x063e07c2, 0x039b04be, 0x0a3d0aab, 0x07c20925, 0x04be063e, 0x02d0039b,
1255*437bfbebSnyanmisaka         0x10001000, 0x10001000, 0x0e390f0f, 0x0aab0ccd, 0x10001000, 0x0f0f1000, 0x0ccd0e39, 0x0a3d0aab,
1256*437bfbebSnyanmisaka         0x10001000, 0x0e390f0f, 0x0aab0ccd, 0x09250a3d, 0x0f0f1000, 0x0ccd0e39, 0x0a3d0aab, 0x07c20925,
1257*437bfbebSnyanmisaka         0x0e390f0f, 0x0aab0ccd, 0x09250a3d, 0x063e07c2, 0x0ccd0e39, 0x0a3d0aab, 0x07c20925, 0x04be063e,
1258*437bfbebSnyanmisaka         0x0aab0ccd, 0x09250a3d, 0x063e07c2, 0x039b04be, 0x0a3d0aab, 0x07c20925, 0x04be063e, 0x02d0039b,
1259*437bfbebSnyanmisaka         0x10001000, 0x10001000, 0x0e390f0f, 0x0aab0ccd, 0x10001000, 0x0f0f1000, 0x0ccd0e39, 0x0a3d0aab,
1260*437bfbebSnyanmisaka         0x10001000, 0x0e390f0f, 0x0aab0ccd, 0x09250a3d, 0x0f0f1000, 0x0ccd0e39, 0x0a3d0aab, 0x07c20925,
1261*437bfbebSnyanmisaka         0x0e390f0f, 0x0aab0ccd, 0x09250a3d, 0x063e07c2, 0x0ccd0e39, 0x0a3d0aab, 0x07c20925, 0x04be063e,
1262*437bfbebSnyanmisaka         0x0aab0ccd, 0x09250a3d, 0x063e07c2, 0x039b04be, 0x0a3d0aab, 0x07c20925, 0x04be063e, 0x02d0039b,
1263*437bfbebSnyanmisaka         0x10001000, 0x10001000, 0x10001000, 0x10101010, 0x0e390f0f, 0x0aab0c31, 0x10001000, 0x18151211,
1264*437bfbebSnyanmisaka         0x10001000, 0x10001000, 0x0e390f0f, 0x10101010, 0x0d790f0f, 0x0a3d0ba3, 0x0aab0c31, 0x19161311,
1265*437bfbebSnyanmisaka         0x10001000, 0x0e390f0f, 0x10001000, 0x12111010, 0x0ba30ccd, 0x08d40a3d, 0x10001000, 0x1d191614,
1266*437bfbebSnyanmisaka         0x10001000, 0x0c310e39, 0x0d790f0f, 0x15121010, 0x097b0aab, 0x071c0842, 0x0a3d0ba3, 0x241f1b18,
1267*437bfbebSnyanmisaka         0x0f0f0f0f, 0x0aab0ccd, 0x10001000, 0x18141111, 0x07500889, 0x0572063e, 0x0e390f0f, 0x2f29231e,
1268*437bfbebSnyanmisaka         0x0d790e39, 0x097b0ba3, 0x0ba30ccd, 0x1b161312, 0x05d10750, 0x03f004be, 0x08d40a3d, 0x41362c23,
1269*437bfbebSnyanmisaka         0x0ba30c31, 0x08420a3d, 0x10001000, 0x1f191615, 0x04be063e, 0x02e903a8, 0x0c310e39, 0x58463629,
1270*437bfbebSnyanmisaka         0x0a3d0aab, 0x071c08d4, 0x097b0aab, 0x241d1918, 0x03f00572, 0x023a02e9, 0x071c0842, 0x7358412f,
1271*437bfbebSnyanmisaka         0x10001000, 0x10001000, 0x0f0f0f0f, 0x10101010, 0x0e390f0f, 0x0aab0c31, 0x0aab0ccd, 0x18151211,
1272*437bfbebSnyanmisaka         0x10001000, 0x10001000, 0x07500889, 0x10101010, 0x0d790f0f, 0x0a3d0ba3, 0x0572063e, 0x19161311,
1273*437bfbebSnyanmisaka         0x10001000, 0x0e390f0f, 0x0d790e39, 0x12111010, 0x0ba30ccd, 0x08d40a3d, 0x097b0ba3, 0x1d191614,
1274*437bfbebSnyanmisaka         0x10001000, 0x0c310e39, 0x05d10750, 0x15121010, 0x097b0aab, 0x071c0842, 0x03f004be, 0x241f1b18,
1275*437bfbebSnyanmisaka         0x0f0f0f0f, 0x0aab0ccd, 0x0ba30c31, 0x18141111, 0x07500889, 0x0572063e, 0x08420a3d, 0x2f29231e,
1276*437bfbebSnyanmisaka         0x0d790e39, 0x097b0ba3, 0x04be063e, 0x1b161312, 0x05d10750, 0x03f004be, 0x02e903a8, 0x41362c23,
1277*437bfbebSnyanmisaka         0x0ba30c31, 0x08420a3d, 0x0a3d0aab, 0x1f191615, 0x04be063e, 0x02e903a8, 0x071c08d4, 0x58463629,
1278*437bfbebSnyanmisaka         0x0a3d0aab, 0x071c08d4, 0x03f00572, 0x241d1918, 0x03f00572, 0x023a02e9, 0x023a02e9, 0x7358412f,
1279*437bfbebSnyanmisaka         0x10001000, 0x10001000, 0x10001000, 0x10101010, 0x0e390f0f, 0x0aab0c31, 0x10001000, 0x18151211,
1280*437bfbebSnyanmisaka         0x10001000, 0x10001000, 0x0e390f0f, 0x10101010, 0x0d790f0f, 0x0a3d0ba3, 0x0aab0ccd, 0x19161311,
1281*437bfbebSnyanmisaka         0x10001000, 0x0e390f0f, 0x10001000, 0x12111010, 0x0ba30ccd, 0x08d40a3d, 0x0f0f1000, 0x1d191614,
1282*437bfbebSnyanmisaka         0x10001000, 0x0c310e39, 0x0ccd0e39, 0x15121010, 0x097b0aab, 0x071c0842, 0x0a3d0aab, 0x241f1b18,
1283*437bfbebSnyanmisaka         0x0f0f0f0f, 0x0aab0ccd, 0x10001000, 0x18141111, 0x07500889, 0x0572063e, 0x0e390f0f, 0x2f29231e,
1284*437bfbebSnyanmisaka         0x0d790e39, 0x097b0ba3, 0x0aab0ccd, 0x1b161312, 0x05d10750, 0x03f004be, 0x09250a3d, 0x41362c23,
1285*437bfbebSnyanmisaka         0x0ba30c31, 0x08420a3d, 0x0f0f1000, 0x1f191615, 0x04be063e, 0x02e903a8, 0x0ccd0e39, 0x58463629,
1286*437bfbebSnyanmisaka         0x0a3d0aab, 0x071c08d4, 0x0a3d0aab, 0x241d1918, 0x03f00572, 0x023a02e9, 0x07c20925, 0x7358412f,
1287*437bfbebSnyanmisaka         0x10001000, 0x10001000, 0x0e390f0f, 0x10101010, 0x0e390f0f, 0x0aab0ccd, 0x0aab0ccd, 0x18141211,
1288*437bfbebSnyanmisaka         0x10001000, 0x0f0f1000, 0x09250a3d, 0x11101010, 0x0ccd0e39, 0x0a3d0aab, 0x063e07c2, 0x19181412,
1289*437bfbebSnyanmisaka         0x10001000, 0x0e390f0f, 0x0ccd0e39, 0x12111010, 0x0aab0ccd, 0x09250a3d, 0x0a3d0aab, 0x1c191814,
1290*437bfbebSnyanmisaka         0x0f0f1000, 0x0ccd0e39, 0x07c20925, 0x14121110, 0x0a3d0aab, 0x07c20925, 0x04be063e, 0x211c1918,
1291*437bfbebSnyanmisaka         0x0e390f0f, 0x0aab0ccd, 0x0aab0ccd, 0x18141211, 0x09250a3d, 0x063e07c2, 0x09250a3d, 0x29211c19,
1292*437bfbebSnyanmisaka         0x0ccd0e39, 0x0a3d0aab, 0x063e07c2, 0x19181412, 0x07c20925, 0x04be063e, 0x039b04be, 0x3629211c,
1293*437bfbebSnyanmisaka         0x0aab0ccd, 0x09250a3d, 0x0a3d0aab, 0x1c191814, 0x063e07c2, 0x039b04be, 0x07c20925, 0x47362921,
1294*437bfbebSnyanmisaka         0x0a3d0aab, 0x07c20925, 0x04be063e, 0x211c1918, 0x04be063e, 0x02d0039b, 0x02d0039b, 0x5b473629,
1295*437bfbebSnyanmisaka         0x10001000, 0x10001000, 0x10101010, 0x10101010, 0x0e390f0f, 0x0aab0ccd, 0x10101010, 0x18141211,
1296*437bfbebSnyanmisaka         0x10001000, 0x0f0f1000, 0x12111211, 0x11101010, 0x0ccd0e39, 0x0a3d0aab, 0x18141815, 0x19181412,
1297*437bfbebSnyanmisaka         0x10001000, 0x0e390f0f, 0x10101010, 0x12111010, 0x0aab0ccd, 0x09250a3d, 0x11101010, 0x1c191814,
1298*437bfbebSnyanmisaka         0x0f0f1000, 0x0ccd0e39, 0x14121311, 0x14121110, 0x0a3d0aab, 0x07c20925, 0x19181916, 0x211c1918,
1299*437bfbebSnyanmisaka         0x0e390f0f, 0x0aab0ccd, 0x10101010, 0x18141211, 0x09250a3d, 0x063e07c2, 0x12111211, 0x29211c19,
1300*437bfbebSnyanmisaka         0x0ccd0e39, 0x0a3d0aab, 0x18141614, 0x19181412, 0x07c20925, 0x04be063e, 0x1c191d19, 0x3629211c,
1301*437bfbebSnyanmisaka         0x0aab0ccd, 0x09250a3d, 0x11101010, 0x1c191814, 0x063e07c2, 0x039b04be, 0x14121512, 0x47362921,
1302*437bfbebSnyanmisaka         0x0a3d0aab, 0x07c20925, 0x19181b18, 0x211c1918, 0x04be063e, 0x02d0039b, 0x211c241f, 0x5b473629,
1303*437bfbebSnyanmisaka         0x10001000, 0x10001000, 0x12111111, 0x10101010, 0x0e390f0f, 0x0aab0ccd, 0x18141814, 0x18141211,
1304*437bfbebSnyanmisaka         0x10001000, 0x0f0f1000, 0x1c19231e, 0x11101010, 0x0ccd0e39, 0x0a3d0aab, 0x29212f29, 0x19181412,
1305*437bfbebSnyanmisaka         0x10001000, 0x0e390f0f, 0x14121312, 0x12111010, 0x0aab0ccd, 0x09250a3d, 0x19181b16, 0x1c191814,
1306*437bfbebSnyanmisaka         0x0f0f1000, 0x0ccd0e39, 0x211c2c23, 0x14121110, 0x0a3d0aab, 0x07c20925, 0x36294136, 0x211c1918,
1307*437bfbebSnyanmisaka         0x0e390f0f, 0x0aab0ccd, 0x18141615, 0x18141211, 0x09250a3d, 0x063e07c2, 0x1c191f19, 0x29211c19,
1308*437bfbebSnyanmisaka         0x0ccd0e39, 0x0a3d0aab, 0x29213629, 0x19181412, 0x07c20925, 0x04be063e, 0x47365846, 0x3629211c,
1309*437bfbebSnyanmisaka         0x0aab0ccd, 0x09250a3d, 0x19181918, 0x1c191814, 0x063e07c2, 0x039b04be, 0x211c241d, 0x47362921,
1310*437bfbebSnyanmisaka         0x0a3d0aab, 0x07c20925, 0x3629412f, 0x211c1918, 0x04be063e, 0x02d0039b, 0x5b477358, 0x5b473629,
1311*437bfbebSnyanmisaka         0x10101010, 0x18151211, 0x10101010, 0x18141211, 0x10101010, 0x19161311, 0x11101010, 0x19181412,
1312*437bfbebSnyanmisaka         0x12111010, 0x1d191614, 0x12111010, 0x1c191814, 0x15121010, 0x241f1b18, 0x14121110, 0x211c1918,
1313*437bfbebSnyanmisaka         0x18141111, 0x2f29231e, 0x18141211, 0x29211c19, 0x1b161312, 0x41362c23, 0x19181412, 0x3629211c,
1314*437bfbebSnyanmisaka         0x1f191615, 0x58463629, 0x1c191814, 0x47362921, 0x241d1918, 0x7358412f, 0x211c1918, 0x5b473629,
1315*437bfbebSnyanmisaka         0x10101010, 0x18151211, 0x10101010, 0x18141211, 0x10101010, 0x19161311, 0x11101010, 0x19181412,
1316*437bfbebSnyanmisaka         0x12111010, 0x1d191614, 0x12111010, 0x1c191814, 0x15121010, 0x241f1b18, 0x14121110, 0x211c1918,
1317*437bfbebSnyanmisaka         0x18141111, 0x2f29231e, 0x18141211, 0x29211c19, 0x1b161312, 0x41362c23, 0x19181412, 0x3629211c,
1318*437bfbebSnyanmisaka         0x1f191615, 0x58463629, 0x1c191814, 0x47362921, 0x241d1918, 0x7358412f, 0x211c1918, 0x5b473629,
1319*437bfbebSnyanmisaka         0x10101010, 0x18151211, 0x10101010, 0x18141211, 0x10101010, 0x19161311, 0x11101010, 0x19181412,
1320*437bfbebSnyanmisaka         0x12111010, 0x1d191614, 0x12111010, 0x1c191814, 0x15121010, 0x241f1b18, 0x14121110, 0x211c1918,
1321*437bfbebSnyanmisaka         0x18141111, 0x2f29231e, 0x18141211, 0x29211c19, 0x1b161312, 0x41362c23, 0x19181412, 0x3629211c,
1322*437bfbebSnyanmisaka         0x1f191615, 0x58463629, 0x1c191814, 0x47362921, 0x241d1918, 0x7358412f, 0x211c1918, 0x5b473629,
1323*437bfbebSnyanmisaka         0x10001000, 0x10001000, 0x10001000, 0x10001000, 0x10101010, 0x10101010,
1324*437bfbebSnyanmisaka     };
1325*437bfbebSnyanmisaka 
1326*437bfbebSnyanmisaka     hal_h265e_dbg_func("enter\n");
1327*437bfbebSnyanmisaka 
1328*437bfbebSnyanmisaka     memcpy(&reg->scaling_list_reg[0], vepu580_h265_scl_tab, sizeof(vepu580_h265_scl_tab));
1329*437bfbebSnyanmisaka 
1330*437bfbebSnyanmisaka     hal_h265e_dbg_func("leave\n");
1331*437bfbebSnyanmisaka }
vepu580_h265_global_cfg_set(H265eV580HalContext * ctx,H265eV580RegSet * regs)1332*437bfbebSnyanmisaka static void vepu580_h265_global_cfg_set(H265eV580HalContext *ctx, H265eV580RegSet *regs)
1333*437bfbebSnyanmisaka {
1334*437bfbebSnyanmisaka     MppEncHwCfg *hw = &ctx->cfg->hw;
1335*437bfbebSnyanmisaka     RK_U32 i;
1336*437bfbebSnyanmisaka     hevc_vepu580_rc_klut *rc_regs = &regs->reg_rc_klut;
1337*437bfbebSnyanmisaka     hevc_vepu580_wgt *reg_wgt = &regs->reg_wgt;
1338*437bfbebSnyanmisaka     vepu580_rdo_cfg  *reg_rdo = &regs->reg_rdo;
1339*437bfbebSnyanmisaka 
1340*437bfbebSnyanmisaka     vepu580_h265_sobel_cfg(reg_wgt);
1341*437bfbebSnyanmisaka     vepu580_h265_rdo_cfg(reg_rdo);
1342*437bfbebSnyanmisaka     vepu580_h265_rdo_bias_cfg(reg_rdo, hw);
1343*437bfbebSnyanmisaka     vepu580_h265_scl_cfg(reg_rdo);
1344*437bfbebSnyanmisaka 
1345*437bfbebSnyanmisaka     memcpy(&reg_wgt->iprd_wgt_qp_hevc_0_51[0], lamd_satd_qp, sizeof(lamd_satd_qp));
1346*437bfbebSnyanmisaka 
1347*437bfbebSnyanmisaka     if (ctx->frame_type == INTRA_FRAME) {
1348*437bfbebSnyanmisaka         for (i = 0; i < MPP_ARRAY_ELEMS(aq_thd_default); i++) {
1349*437bfbebSnyanmisaka             rc_regs->aq_tthd[i] = hw->aq_thrd_i[i];
1350*437bfbebSnyanmisaka             rc_regs->aq_step[i] = hw->aq_step_i[i] & 0x3f;
1351*437bfbebSnyanmisaka         }
1352*437bfbebSnyanmisaka         memcpy(&reg_wgt->rdo_wgta_qp_grpa_0_51[0], lamd_moda_qp, sizeof(lamd_moda_qp));
1353*437bfbebSnyanmisaka     } else {
1354*437bfbebSnyanmisaka         for (i = 0; i < MPP_ARRAY_ELEMS(aq_thd_default); i++) {
1355*437bfbebSnyanmisaka             rc_regs->aq_tthd[i] = hw->aq_thrd_p[i];
1356*437bfbebSnyanmisaka             rc_regs->aq_step[i] = hw->aq_step_p[i] & 0x3f;
1357*437bfbebSnyanmisaka         }
1358*437bfbebSnyanmisaka         memcpy(&reg_wgt->rdo_wgta_qp_grpa_0_51[0], lamd_modb_qp, sizeof(lamd_modb_qp));
1359*437bfbebSnyanmisaka     }
1360*437bfbebSnyanmisaka     //to be done
1361*437bfbebSnyanmisaka     rc_regs->madi_cfg.madi_mode    = 0;
1362*437bfbebSnyanmisaka     rc_regs->madi_cfg.madi_thd     = 25;
1363*437bfbebSnyanmisaka     rc_regs->md_sad_thd.md_sad_thd0 = 20;
1364*437bfbebSnyanmisaka     rc_regs->md_sad_thd.md_sad_thd1 = 30;
1365*437bfbebSnyanmisaka     rc_regs->md_sad_thd.md_sad_thd2 = 40;
1366*437bfbebSnyanmisaka     rc_regs->madi_thd.madi_thd0    = 25;
1367*437bfbebSnyanmisaka     rc_regs->madi_thd.madi_thd1    = 35;
1368*437bfbebSnyanmisaka     rc_regs->madi_thd.madi_thd2    = 45;
1369*437bfbebSnyanmisaka     reg_wgt->reg1484_qnt_bias_comb.qnt_bias_i = 171;
1370*437bfbebSnyanmisaka     reg_wgt->reg1484_qnt_bias_comb.qnt_bias_p = 85;
1371*437bfbebSnyanmisaka 
1372*437bfbebSnyanmisaka     memcpy(&reg_wgt->lvl32_intra_CST_THD0, lvl32_intra_cst_thd, sizeof(lvl32_intra_cst_thd));
1373*437bfbebSnyanmisaka     memcpy(&reg_wgt->lvl16_intra_CST_THD0, lvl16_intra_cst_thd, sizeof(lvl16_intra_cst_thd));
1374*437bfbebSnyanmisaka     memcpy(&reg_wgt->lvl32_intra_CST_WGT0, lvl32_intra_cst_wgt, sizeof(lvl32_intra_cst_wgt));
1375*437bfbebSnyanmisaka     memcpy(&reg_wgt->lvl16_intra_CST_WGT0, lvl16_intra_cst_wgt, sizeof(lvl16_intra_cst_wgt));
1376*437bfbebSnyanmisaka 
1377*437bfbebSnyanmisaka     reg_wgt->cime_sqi_cfg.cime_sad_mod_sel      = 0;
1378*437bfbebSnyanmisaka     reg_wgt->cime_sqi_cfg.cime_sad_use_big_block = 0;
1379*437bfbebSnyanmisaka     reg_wgt->cime_sqi_cfg.cime_pmv_set_zero     = 1;
1380*437bfbebSnyanmisaka     reg_wgt->cime_sqi_cfg.cime_pmv_num          = 3;
1381*437bfbebSnyanmisaka     reg_wgt->cime_sqi_thd.cime_mvd_th0 = 32;
1382*437bfbebSnyanmisaka     reg_wgt->cime_sqi_thd.cime_mvd_th1 = 80;
1383*437bfbebSnyanmisaka     reg_wgt->cime_sqi_thd.cime_mvd_th2 = 128;
1384*437bfbebSnyanmisaka     reg_wgt->cime_sqi_multi0.cime_multi0 = 16;
1385*437bfbebSnyanmisaka     reg_wgt->cime_sqi_multi0.cime_multi1 = 32;
1386*437bfbebSnyanmisaka     reg_wgt->cime_sqi_multi1.cime_multi2 = 96;
1387*437bfbebSnyanmisaka     reg_wgt->cime_sqi_multi1.cime_multi3 = 96;
1388*437bfbebSnyanmisaka     reg_wgt->rime_sqi_thd.cime_sad_th0 = 48;
1389*437bfbebSnyanmisaka     reg_wgt->rime_sqi_thd.rime_mvd_th0 = 3;
1390*437bfbebSnyanmisaka     reg_wgt->rime_sqi_thd.rime_mvd_th1 = 8;
1391*437bfbebSnyanmisaka     reg_wgt->rime_sqi_multi.rime_multi0 = 16;
1392*437bfbebSnyanmisaka     reg_wgt->rime_sqi_multi.rime_multi1 = 16;
1393*437bfbebSnyanmisaka     reg_wgt->rime_sqi_multi.rime_multi2 = 128;
1394*437bfbebSnyanmisaka     reg_wgt->fme_sqi_thd0.cime_sad_pu16_th = 16;
1395*437bfbebSnyanmisaka     reg_wgt->fme_sqi_thd0.cime_sad_pu32_th = 16;
1396*437bfbebSnyanmisaka     reg_wgt->fme_sqi_thd1.cime_sad_pu64_th = 16;
1397*437bfbebSnyanmisaka     reg_wgt->fme_sqi_thd1.move_lambda = 1;
1398*437bfbebSnyanmisaka }
1399*437bfbebSnyanmisaka 
hal_h265e_v580_deinit(void * hal)1400*437bfbebSnyanmisaka MPP_RET hal_h265e_v580_deinit(void *hal)
1401*437bfbebSnyanmisaka {
1402*437bfbebSnyanmisaka     H265eV580HalContext *ctx = (H265eV580HalContext *)hal;
1403*437bfbebSnyanmisaka     RK_S32 i;
1404*437bfbebSnyanmisaka 
1405*437bfbebSnyanmisaka     hal_h265e_enter();
1406*437bfbebSnyanmisaka 
1407*437bfbebSnyanmisaka     for (i = 0; i < ctx->task_cnt; i++) {
1408*437bfbebSnyanmisaka         Vepu580H265eFrmCfg *frm = ctx->frms[i];
1409*437bfbebSnyanmisaka         RK_U32 j;
1410*437bfbebSnyanmisaka 
1411*437bfbebSnyanmisaka         if (!frm)
1412*437bfbebSnyanmisaka             continue;
1413*437bfbebSnyanmisaka 
1414*437bfbebSnyanmisaka         for (j = 0; j < MAX_TILE_NUM; j++) {
1415*437bfbebSnyanmisaka             MPP_FREE(frm->regs_set[j]);
1416*437bfbebSnyanmisaka             MPP_FREE(frm->regs_ret[j]);
1417*437bfbebSnyanmisaka         }
1418*437bfbebSnyanmisaka 
1419*437bfbebSnyanmisaka         for (j = 0; j < MAX_TILE_NUM; j++) {
1420*437bfbebSnyanmisaka             if (frm->hw_tile_buf[j]) {
1421*437bfbebSnyanmisaka                 mpp_buffer_put(frm->hw_tile_buf[j]);
1422*437bfbebSnyanmisaka                 frm->hw_tile_buf[j] = NULL;
1423*437bfbebSnyanmisaka             }
1424*437bfbebSnyanmisaka         }
1425*437bfbebSnyanmisaka 
1426*437bfbebSnyanmisaka         for (j = 0; j < MAX_TILE_NUM - 1; j++) {
1427*437bfbebSnyanmisaka             if (frm->hw_tile_stream[j]) {
1428*437bfbebSnyanmisaka                 mpp_buffer_put(frm->hw_tile_stream[j]);
1429*437bfbebSnyanmisaka                 frm->hw_tile_stream[j] = NULL;
1430*437bfbebSnyanmisaka             }
1431*437bfbebSnyanmisaka         }
1432*437bfbebSnyanmisaka 
1433*437bfbebSnyanmisaka         if (frm->roi_base_cfg_buf) {
1434*437bfbebSnyanmisaka             mpp_buffer_put(frm->roi_base_cfg_buf);
1435*437bfbebSnyanmisaka             frm->roi_base_cfg_buf = NULL;
1436*437bfbebSnyanmisaka             frm->roi_base_buf_size = 0;
1437*437bfbebSnyanmisaka         }
1438*437bfbebSnyanmisaka 
1439*437bfbebSnyanmisaka         MPP_FREE(frm->roi_base_cfg_sw_buf);
1440*437bfbebSnyanmisaka 
1441*437bfbebSnyanmisaka         if (frm->reg_cfg) {
1442*437bfbebSnyanmisaka             mpp_dev_multi_offset_deinit(frm->reg_cfg);
1443*437bfbebSnyanmisaka             frm->reg_cfg = NULL;
1444*437bfbebSnyanmisaka         }
1445*437bfbebSnyanmisaka 
1446*437bfbebSnyanmisaka         MPP_FREE(ctx->frms[i]);
1447*437bfbebSnyanmisaka     }
1448*437bfbebSnyanmisaka 
1449*437bfbebSnyanmisaka     MPP_FREE(ctx->poll_cfgs);
1450*437bfbebSnyanmisaka     MPP_FREE(ctx->input_fmt);
1451*437bfbebSnyanmisaka     hal_bufs_deinit(ctx->dpb_bufs);
1452*437bfbebSnyanmisaka 
1453*437bfbebSnyanmisaka     if (ctx->tile_grp) {
1454*437bfbebSnyanmisaka         mpp_buffer_group_put(ctx->tile_grp);
1455*437bfbebSnyanmisaka         ctx->tile_grp = NULL;
1456*437bfbebSnyanmisaka     }
1457*437bfbebSnyanmisaka 
1458*437bfbebSnyanmisaka     if (ctx->roi_grp) {
1459*437bfbebSnyanmisaka         mpp_buffer_group_put(ctx->roi_grp);
1460*437bfbebSnyanmisaka         ctx->roi_grp = NULL;
1461*437bfbebSnyanmisaka     }
1462*437bfbebSnyanmisaka 
1463*437bfbebSnyanmisaka     if (ctx->buf_pass1) {
1464*437bfbebSnyanmisaka         mpp_buffer_put(ctx->buf_pass1);
1465*437bfbebSnyanmisaka         ctx->buf_pass1 = NULL;
1466*437bfbebSnyanmisaka     }
1467*437bfbebSnyanmisaka 
1468*437bfbebSnyanmisaka     if (ctx->dev) {
1469*437bfbebSnyanmisaka         mpp_dev_deinit(ctx->dev);
1470*437bfbebSnyanmisaka         ctx->dev = NULL;
1471*437bfbebSnyanmisaka     }
1472*437bfbebSnyanmisaka 
1473*437bfbebSnyanmisaka     if (ctx->tune) {
1474*437bfbebSnyanmisaka         vepu580_h265e_tune_deinit(ctx->tune);
1475*437bfbebSnyanmisaka         ctx->tune = NULL;
1476*437bfbebSnyanmisaka     }
1477*437bfbebSnyanmisaka 
1478*437bfbebSnyanmisaka     if (ctx->md_info_buf) {
1479*437bfbebSnyanmisaka         mpp_buffer_put(ctx->md_info_buf);
1480*437bfbebSnyanmisaka         ctx->md_info_buf = NULL;
1481*437bfbebSnyanmisaka     }
1482*437bfbebSnyanmisaka 
1483*437bfbebSnyanmisaka     if (ctx->qpmap_base_cfg_buf) {
1484*437bfbebSnyanmisaka         mpp_buffer_put(ctx->qpmap_base_cfg_buf);
1485*437bfbebSnyanmisaka         ctx->qpmap_base_cfg_buf = NULL;
1486*437bfbebSnyanmisaka     }
1487*437bfbebSnyanmisaka 
1488*437bfbebSnyanmisaka     if (ctx->qpmap_qp_cfg_buf) {
1489*437bfbebSnyanmisaka         mpp_buffer_put(ctx->qpmap_qp_cfg_buf);
1490*437bfbebSnyanmisaka         ctx->qpmap_qp_cfg_buf = NULL;
1491*437bfbebSnyanmisaka     }
1492*437bfbebSnyanmisaka 
1493*437bfbebSnyanmisaka     if (ctx->md_flag_buf) {
1494*437bfbebSnyanmisaka         MPP_FREE(ctx->md_flag_buf);
1495*437bfbebSnyanmisaka     }
1496*437bfbebSnyanmisaka 
1497*437bfbebSnyanmisaka     if (ctx->qpmap_grp) {
1498*437bfbebSnyanmisaka         mpp_buffer_group_put(ctx->qpmap_grp);
1499*437bfbebSnyanmisaka         ctx->qpmap_grp = NULL;
1500*437bfbebSnyanmisaka     }
1501*437bfbebSnyanmisaka 
1502*437bfbebSnyanmisaka     hal_h265e_leave();
1503*437bfbebSnyanmisaka     return MPP_OK;
1504*437bfbebSnyanmisaka }
1505*437bfbebSnyanmisaka 
hal_h265e_v580_init(void * hal,MppEncHalCfg * cfg)1506*437bfbebSnyanmisaka MPP_RET hal_h265e_v580_init(void *hal, MppEncHalCfg *cfg)
1507*437bfbebSnyanmisaka {
1508*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1509*437bfbebSnyanmisaka     H265eV580HalContext *ctx = (H265eV580HalContext *)hal;
1510*437bfbebSnyanmisaka     RK_S32 i = 0;
1511*437bfbebSnyanmisaka 
1512*437bfbebSnyanmisaka     mpp_env_get_u32("hal_h265e_debug", &hal_h265e_debug, 0);
1513*437bfbebSnyanmisaka 
1514*437bfbebSnyanmisaka     hal_h265e_enter();
1515*437bfbebSnyanmisaka 
1516*437bfbebSnyanmisaka     ctx->input_fmt     = mpp_calloc(VepuFmtCfg, 1);
1517*437bfbebSnyanmisaka     ctx->cfg           = cfg->cfg;
1518*437bfbebSnyanmisaka     hal_bufs_init(&ctx->dpb_bufs);
1519*437bfbebSnyanmisaka 
1520*437bfbebSnyanmisaka     ctx->frame_count = 0;
1521*437bfbebSnyanmisaka     ctx->enc_mode = RKV_ENC_MODE;
1522*437bfbebSnyanmisaka     cfg->type = VPU_CLIENT_RKVENC;
1523*437bfbebSnyanmisaka     ret = mpp_dev_init(&cfg->dev, cfg->type);
1524*437bfbebSnyanmisaka     if (ret) {
1525*437bfbebSnyanmisaka         mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
1526*437bfbebSnyanmisaka         goto DONE;
1527*437bfbebSnyanmisaka     }
1528*437bfbebSnyanmisaka 
1529*437bfbebSnyanmisaka     ctx->dev = cfg->dev;
1530*437bfbebSnyanmisaka     ctx->task_cnt = cfg->task_cnt;
1531*437bfbebSnyanmisaka     mpp_assert(ctx->task_cnt && ctx->task_cnt <= MAX_FRAME_TASK_NUM);
1532*437bfbebSnyanmisaka 
1533*437bfbebSnyanmisaka     if (ctx->task_cnt > MAX_FRAME_TASK_NUM)
1534*437bfbebSnyanmisaka         ctx->task_cnt = MAX_FRAME_TASK_NUM;
1535*437bfbebSnyanmisaka 
1536*437bfbebSnyanmisaka     for (i = 0; i < cfg->task_cnt; i++) {
1537*437bfbebSnyanmisaka         Vepu580H265eFrmCfg *frm_cfg = mpp_calloc(Vepu580H265eFrmCfg, 1);
1538*437bfbebSnyanmisaka 
1539*437bfbebSnyanmisaka         frm_cfg->regs_set[0] = mpp_calloc(H265eV580RegSet, 1);
1540*437bfbebSnyanmisaka         frm_cfg->regs_ret[0] = mpp_calloc(H265eV580StatusElem, 1);
1541*437bfbebSnyanmisaka 
1542*437bfbebSnyanmisaka         frm_cfg->osd_cfg.reg_base = &frm_cfg->regs_set[0]->reg_osd_cfg;
1543*437bfbebSnyanmisaka 
1544*437bfbebSnyanmisaka         /* setup osd cfg */
1545*437bfbebSnyanmisaka         frm_cfg->osd_cfg.dev = ctx->dev;
1546*437bfbebSnyanmisaka         frm_cfg->osd_cfg.plt_cfg = &ctx->cfg->plt_cfg;
1547*437bfbebSnyanmisaka         frm_cfg->osd_cfg.osd_data = NULL;
1548*437bfbebSnyanmisaka         frm_cfg->osd_cfg.osd_data2 = NULL;
1549*437bfbebSnyanmisaka         mpp_dev_multi_offset_init(&frm_cfg->reg_cfg, 24);
1550*437bfbebSnyanmisaka         frm_cfg->osd_cfg.reg_cfg = frm_cfg->reg_cfg;
1551*437bfbebSnyanmisaka 
1552*437bfbebSnyanmisaka         frm_cfg->frame_type = INTRA_FRAME;
1553*437bfbebSnyanmisaka 
1554*437bfbebSnyanmisaka         ctx->frms[i] = frm_cfg;
1555*437bfbebSnyanmisaka     }
1556*437bfbebSnyanmisaka 
1557*437bfbebSnyanmisaka     {   /* setup default hardware config */
1558*437bfbebSnyanmisaka         MppEncHwCfg *hw = &cfg->cfg->hw;
1559*437bfbebSnyanmisaka         RK_U32 j;
1560*437bfbebSnyanmisaka 
1561*437bfbebSnyanmisaka         hw->qp_delta_row_i = 2;
1562*437bfbebSnyanmisaka         hw->qp_delta_row   = 2;
1563*437bfbebSnyanmisaka         hw->qbias_i = 171;
1564*437bfbebSnyanmisaka         hw->qbias_p = 85;
1565*437bfbebSnyanmisaka         hw->qbias_en = 0;
1566*437bfbebSnyanmisaka 
1567*437bfbebSnyanmisaka         memcpy(hw->aq_thrd_i, aq_thd_default, sizeof(hw->aq_thrd_i));
1568*437bfbebSnyanmisaka         memcpy(hw->aq_thrd_p, aq_thd_default, sizeof(hw->aq_thrd_p));
1569*437bfbebSnyanmisaka         memcpy(hw->aq_step_i, aq_qp_dealt_default, sizeof(hw->aq_step_i));
1570*437bfbebSnyanmisaka         memcpy(hw->aq_step_p, aq_qp_dealt_default, sizeof(hw->aq_step_p));
1571*437bfbebSnyanmisaka 
1572*437bfbebSnyanmisaka         for (j = 0; j < MPP_ARRAY_ELEMS(hw->mode_bias); j++)
1573*437bfbebSnyanmisaka             hw->mode_bias[j] = 8;
1574*437bfbebSnyanmisaka 
1575*437bfbebSnyanmisaka         hw->skip_sad  = 8;
1576*437bfbebSnyanmisaka         hw->skip_bias = 8;
1577*437bfbebSnyanmisaka     }
1578*437bfbebSnyanmisaka 
1579*437bfbebSnyanmisaka     ctx->tune = vepu580_h265e_tune_init(ctx);
1580*437bfbebSnyanmisaka 
1581*437bfbebSnyanmisaka     {
1582*437bfbebSnyanmisaka         // check parall tile ability
1583*437bfbebSnyanmisaka         const MppServiceCmdCap *cap = mpp_get_mpp_service_cmd_cap();
1584*437bfbebSnyanmisaka 
1585*437bfbebSnyanmisaka         ctx->tile_parall_en = cap->send_cmd > MPP_CMD_SET_SESSION_FD;
1586*437bfbebSnyanmisaka     }
1587*437bfbebSnyanmisaka 
1588*437bfbebSnyanmisaka     ctx->poll_slice_max = 8;
1589*437bfbebSnyanmisaka     ctx->poll_cfg_size = (sizeof(ctx->poll_cfgs) + sizeof(RK_S32) * ctx->poll_slice_max) * 2;
1590*437bfbebSnyanmisaka     ctx->poll_cfgs = mpp_malloc_size(MppDevPollCfg, ctx->poll_cfg_size);
1591*437bfbebSnyanmisaka 
1592*437bfbebSnyanmisaka     if (NULL == ctx->poll_cfgs) {
1593*437bfbebSnyanmisaka         ret = MPP_ERR_MALLOC;
1594*437bfbebSnyanmisaka         mpp_err_f("init poll cfg buffer failed\n");
1595*437bfbebSnyanmisaka         goto DONE;
1596*437bfbebSnyanmisaka     }
1597*437bfbebSnyanmisaka     ctx->output_cb = cfg->output_cb;
1598*437bfbebSnyanmisaka     cfg->cap_recn_out = 1;
1599*437bfbebSnyanmisaka DONE:
1600*437bfbebSnyanmisaka     if (ret)
1601*437bfbebSnyanmisaka         hal_h265e_v580_deinit(hal);
1602*437bfbebSnyanmisaka 
1603*437bfbebSnyanmisaka     hal_h265e_leave();
1604*437bfbebSnyanmisaka     return ret;
1605*437bfbebSnyanmisaka }
hal_h265e_vepu580_prepare(void * hal)1606*437bfbebSnyanmisaka static MPP_RET hal_h265e_vepu580_prepare(void *hal)
1607*437bfbebSnyanmisaka {
1608*437bfbebSnyanmisaka     H265eV580HalContext *ctx = (H265eV580HalContext *)hal;
1609*437bfbebSnyanmisaka     MppEncPrepCfg *prep = &ctx->cfg->prep;
1610*437bfbebSnyanmisaka 
1611*437bfbebSnyanmisaka     hal_h265e_dbg_func("enter %p\n", hal);
1612*437bfbebSnyanmisaka 
1613*437bfbebSnyanmisaka     if (prep->change_res) {
1614*437bfbebSnyanmisaka         RK_S32 i;
1615*437bfbebSnyanmisaka 
1616*437bfbebSnyanmisaka         // pre-alloc required buffers to reduce first frame delay
1617*437bfbebSnyanmisaka         vepu580_h265_setup_hal_bufs(ctx);
1618*437bfbebSnyanmisaka         for (i = 0; i < ctx->max_buf_cnt; i++)
1619*437bfbebSnyanmisaka             hal_bufs_get_buf(ctx->dpb_bufs, i);
1620*437bfbebSnyanmisaka 
1621*437bfbebSnyanmisaka         prep->change_res = 0;
1622*437bfbebSnyanmisaka     }
1623*437bfbebSnyanmisaka 
1624*437bfbebSnyanmisaka     hal_h265e_dbg_func("leave %p\n", hal);
1625*437bfbebSnyanmisaka 
1626*437bfbebSnyanmisaka     return MPP_OK;
1627*437bfbebSnyanmisaka }
1628*437bfbebSnyanmisaka 
1629*437bfbebSnyanmisaka static MPP_RET
vepu580_h265_set_patch_info(MppDevRegOffCfgs * cfgs,H265eSyntax_new * syn,VepuFmt input_fmt,HalEncTask * task)1630*437bfbebSnyanmisaka vepu580_h265_set_patch_info(MppDevRegOffCfgs *cfgs, H265eSyntax_new *syn,
1631*437bfbebSnyanmisaka                             VepuFmt input_fmt, HalEncTask *task)
1632*437bfbebSnyanmisaka {
1633*437bfbebSnyanmisaka     MppFrameFormat fmt = mpp_frame_get_fmt(task->frame);
1634*437bfbebSnyanmisaka     RK_U32 hor_stride = syn->pp.hor_stride;
1635*437bfbebSnyanmisaka     RK_U32 ver_stride = syn->pp.ver_stride ? syn->pp.ver_stride : syn->pp.pic_height;
1636*437bfbebSnyanmisaka     RK_U32 frame_size = hor_stride * ver_stride;
1637*437bfbebSnyanmisaka     RK_U32 u_offset = 0, v_offset = 0;
1638*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1639*437bfbebSnyanmisaka 
1640*437bfbebSnyanmisaka     if (task->rc_task->frm.use_pass1)
1641*437bfbebSnyanmisaka         fmt = MPP_FMT_YUV420SP;
1642*437bfbebSnyanmisaka 
1643*437bfbebSnyanmisaka     if (MPP_FRAME_FMT_IS_FBC(fmt)) {
1644*437bfbebSnyanmisaka         u_offset = mpp_frame_get_fbc_offset(task->frame);
1645*437bfbebSnyanmisaka         v_offset = 0;
1646*437bfbebSnyanmisaka     } else {
1647*437bfbebSnyanmisaka         switch (input_fmt) {
1648*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV420P: {
1649*437bfbebSnyanmisaka             u_offset = frame_size;
1650*437bfbebSnyanmisaka             v_offset = frame_size * 5 / 4;
1651*437bfbebSnyanmisaka         } break;
1652*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV420SP:
1653*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV422SP: {
1654*437bfbebSnyanmisaka             u_offset = frame_size;
1655*437bfbebSnyanmisaka             v_offset = frame_size;
1656*437bfbebSnyanmisaka         } break;
1657*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV422P: {
1658*437bfbebSnyanmisaka             u_offset = frame_size;
1659*437bfbebSnyanmisaka             v_offset = frame_size * 3 / 2;
1660*437bfbebSnyanmisaka         } break;
1661*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV400:
1662*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUYV422:
1663*437bfbebSnyanmisaka         case VEPU5xx_FMT_UYVY422: {
1664*437bfbebSnyanmisaka             u_offset = 0;
1665*437bfbebSnyanmisaka             v_offset = 0;
1666*437bfbebSnyanmisaka         } break;
1667*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV444SP : {
1668*437bfbebSnyanmisaka             u_offset = hor_stride * ver_stride;
1669*437bfbebSnyanmisaka             v_offset = hor_stride * ver_stride;
1670*437bfbebSnyanmisaka         } break;
1671*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV444P : {
1672*437bfbebSnyanmisaka             u_offset = hor_stride * ver_stride;
1673*437bfbebSnyanmisaka             v_offset = hor_stride * ver_stride * 2;
1674*437bfbebSnyanmisaka         } break;
1675*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGR565:
1676*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGR888:
1677*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGRA8888: {
1678*437bfbebSnyanmisaka             u_offset = 0;
1679*437bfbebSnyanmisaka             v_offset = 0;
1680*437bfbebSnyanmisaka         } break;
1681*437bfbebSnyanmisaka         default: {
1682*437bfbebSnyanmisaka             hal_h265e_err("unknown color space: %d\n", input_fmt);
1683*437bfbebSnyanmisaka             u_offset = frame_size;
1684*437bfbebSnyanmisaka             v_offset = frame_size * 5 / 4;
1685*437bfbebSnyanmisaka         }
1686*437bfbebSnyanmisaka         }
1687*437bfbebSnyanmisaka     }
1688*437bfbebSnyanmisaka 
1689*437bfbebSnyanmisaka     /* input cb addr */
1690*437bfbebSnyanmisaka     ret = mpp_dev_multi_offset_update(cfgs, 161, u_offset);
1691*437bfbebSnyanmisaka     if (ret)
1692*437bfbebSnyanmisaka         mpp_err_f("set input cb addr offset failed %d\n", ret);
1693*437bfbebSnyanmisaka 
1694*437bfbebSnyanmisaka     /* input cr addr */
1695*437bfbebSnyanmisaka     ret = mpp_dev_multi_offset_update(cfgs, 162, v_offset);
1696*437bfbebSnyanmisaka     if (ret)
1697*437bfbebSnyanmisaka         mpp_err_f("set input cr addr offset failed %d\n", ret);
1698*437bfbebSnyanmisaka 
1699*437bfbebSnyanmisaka     return ret;
1700*437bfbebSnyanmisaka }
1701*437bfbebSnyanmisaka 
1702*437bfbebSnyanmisaka typedef struct refresh_area {
1703*437bfbebSnyanmisaka     RK_S32 roi_ctu_x_sta;
1704*437bfbebSnyanmisaka     RK_S32 roi_ctu_y_sta;
1705*437bfbebSnyanmisaka     RK_S32 roi_ctu_x_end;
1706*437bfbebSnyanmisaka     RK_S32 roi_ctu_y_end;
1707*437bfbebSnyanmisaka } RefreshArea;
1708*437bfbebSnyanmisaka 
cal_refresh_area(RK_S32 ctu_w,RK_S32 ctu_h,RK_U32 refresh_idx,MppEncRcRefreshMode refresh_mode,RK_U32 refresh_num,RefreshArea * area)1709*437bfbebSnyanmisaka static MPP_RET cal_refresh_area(RK_S32 ctu_w, RK_S32 ctu_h, RK_U32 refresh_idx,
1710*437bfbebSnyanmisaka                                 MppEncRcRefreshMode refresh_mode, RK_U32 refresh_num, RefreshArea *area)
1711*437bfbebSnyanmisaka {
1712*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1713*437bfbebSnyanmisaka     RK_U32 refresh_ctu_h = 0;
1714*437bfbebSnyanmisaka 
1715*437bfbebSnyanmisaka     if (refresh_mode == MPP_ENC_RC_INTRA_REFRESH_ROW) {
1716*437bfbebSnyanmisaka         area->roi_ctu_x_sta = 0;
1717*437bfbebSnyanmisaka         area->roi_ctu_x_end = ctu_w - 1;
1718*437bfbebSnyanmisaka 
1719*437bfbebSnyanmisaka         if (refresh_idx > 0) {
1720*437bfbebSnyanmisaka             refresh_ctu_h = refresh_num + 1;
1721*437bfbebSnyanmisaka             area->roi_ctu_y_sta = refresh_num * refresh_idx - 1;
1722*437bfbebSnyanmisaka         } else {
1723*437bfbebSnyanmisaka             refresh_ctu_h = refresh_num;
1724*437bfbebSnyanmisaka             area->roi_ctu_y_sta = 0;
1725*437bfbebSnyanmisaka         }
1726*437bfbebSnyanmisaka 
1727*437bfbebSnyanmisaka         area->roi_ctu_y_end = area->roi_ctu_y_sta + refresh_ctu_h - 1;
1728*437bfbebSnyanmisaka     } else {
1729*437bfbebSnyanmisaka         area->roi_ctu_y_sta = 0;
1730*437bfbebSnyanmisaka         area->roi_ctu_y_end = ctu_h - 1;
1731*437bfbebSnyanmisaka 
1732*437bfbebSnyanmisaka         if (refresh_idx > 0) {
1733*437bfbebSnyanmisaka             refresh_ctu_h = refresh_num + 1;
1734*437bfbebSnyanmisaka             area->roi_ctu_x_sta = refresh_num * refresh_idx - 1;
1735*437bfbebSnyanmisaka         } else {
1736*437bfbebSnyanmisaka             refresh_ctu_h = refresh_num;
1737*437bfbebSnyanmisaka             area->roi_ctu_x_sta = 0;
1738*437bfbebSnyanmisaka         }
1739*437bfbebSnyanmisaka 
1740*437bfbebSnyanmisaka         area->roi_ctu_x_end = area->roi_ctu_x_sta + refresh_ctu_h - 1;
1741*437bfbebSnyanmisaka     }
1742*437bfbebSnyanmisaka 
1743*437bfbebSnyanmisaka     area->roi_ctu_x_end = MPP_MIN(area->roi_ctu_x_end, ctu_w - 1);
1744*437bfbebSnyanmisaka     area->roi_ctu_y_end = MPP_MIN(area->roi_ctu_y_end, ctu_h - 1);
1745*437bfbebSnyanmisaka     area->roi_ctu_x_sta = MPP_MAX(area->roi_ctu_x_sta, 0);
1746*437bfbebSnyanmisaka     area->roi_ctu_y_sta = MPP_MAX(area->roi_ctu_y_sta, 0);
1747*437bfbebSnyanmisaka 
1748*437bfbebSnyanmisaka     hal_h265e_dbg_detail("size in ctu : %d x %d, refresh_num %d, refresh_idx %d, area x[%d, %d], y[%d, %d]",
1749*437bfbebSnyanmisaka                          ctu_w, ctu_h, refresh_num, refresh_idx,
1750*437bfbebSnyanmisaka                          area->roi_ctu_x_sta, area->roi_ctu_x_end,
1751*437bfbebSnyanmisaka                          area->roi_ctu_y_sta, area->roi_ctu_y_end);
1752*437bfbebSnyanmisaka 
1753*437bfbebSnyanmisaka     return ret;
1754*437bfbebSnyanmisaka }
1755*437bfbebSnyanmisaka 
setup_intra_refresh(H265eV580HalContext * ctx,RK_U32 refresh_idx)1756*437bfbebSnyanmisaka static MPP_RET setup_intra_refresh(H265eV580HalContext *ctx, RK_U32 refresh_idx)
1757*437bfbebSnyanmisaka {
1758*437bfbebSnyanmisaka     Vepu580H265eFrmCfg *frm = ctx->frm;
1759*437bfbebSnyanmisaka     H265eV580RegSet *regs = frm->regs_set[0];
1760*437bfbebSnyanmisaka     RK_U32 w = ctx->cfg->prep.width;
1761*437bfbebSnyanmisaka     RK_U32 h = ctx->cfg->prep.height;
1762*437bfbebSnyanmisaka     RK_S32 ctu_w = MPP_ALIGN(w, 64) / 64;
1763*437bfbebSnyanmisaka     RK_S32 ctu_h = MPP_ALIGN(h, 64) / 64;
1764*437bfbebSnyanmisaka     RK_S32 roi_base_cfg_buf_size = ctu_w * ctu_h * 64;
1765*437bfbebSnyanmisaka     MppEncROICfg2 *external_roi_cfg = (MppEncROICfg2 *)frm->roi_data;
1766*437bfbebSnyanmisaka     RK_U8 *roi_base_cfg_hw_ptr = NULL;
1767*437bfbebSnyanmisaka     RK_S32 roi_base_cfg_buf_fd = 0;
1768*437bfbebSnyanmisaka     RefreshArea cur_area;
1769*437bfbebSnyanmisaka     RK_S32 j, k;
1770*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1771*437bfbebSnyanmisaka 
1772*437bfbebSnyanmisaka     hal_h265e_dbg_func("enter\n");
1773*437bfbebSnyanmisaka 
1774*437bfbebSnyanmisaka     if (!ctx->cfg->rc.refresh_en) {
1775*437bfbebSnyanmisaka         ret = MPP_ERR_VALUE;
1776*437bfbebSnyanmisaka         goto __RET;
1777*437bfbebSnyanmisaka     }
1778*437bfbebSnyanmisaka 
1779*437bfbebSnyanmisaka     if (frm->roi_data) {
1780*437bfbebSnyanmisaka         roi_base_cfg_hw_ptr = mpp_buffer_get_ptr(external_roi_cfg->base_cfg_buf);
1781*437bfbebSnyanmisaka         roi_base_cfg_buf_fd = mpp_buffer_get_fd(external_roi_cfg->base_cfg_buf);
1782*437bfbebSnyanmisaka     } else {
1783*437bfbebSnyanmisaka         if (frm->roi_base_buf_size < roi_base_cfg_buf_size) {
1784*437bfbebSnyanmisaka             if (NULL == ctx->roi_grp)
1785*437bfbebSnyanmisaka                 mpp_buffer_group_get_internal(&ctx->roi_grp, MPP_BUFFER_TYPE_ION);
1786*437bfbebSnyanmisaka             if (frm->roi_base_cfg_buf)
1787*437bfbebSnyanmisaka                 mpp_buffer_put(frm->roi_base_cfg_buf);
1788*437bfbebSnyanmisaka             MPP_FREE(frm->roi_base_cfg_sw_buf);
1789*437bfbebSnyanmisaka             frm->roi_base_cfg_sw_buf = mpp_malloc(RK_U8, roi_base_cfg_buf_size);
1790*437bfbebSnyanmisaka             mpp_buffer_get(ctx->roi_grp, &frm->roi_base_cfg_buf, roi_base_cfg_buf_size);
1791*437bfbebSnyanmisaka         }
1792*437bfbebSnyanmisaka         roi_base_cfg_hw_ptr = mpp_buffer_get_ptr(frm->roi_base_cfg_buf);
1793*437bfbebSnyanmisaka         roi_base_cfg_buf_fd = mpp_buffer_get_fd(frm->roi_base_cfg_buf);
1794*437bfbebSnyanmisaka     }
1795*437bfbebSnyanmisaka 
1796*437bfbebSnyanmisaka     frm->roi_base_buf_size = roi_base_cfg_buf_size;
1797*437bfbebSnyanmisaka 
1798*437bfbebSnyanmisaka     memset(frm->roi_base_cfg_sw_buf, 0, roi_base_cfg_buf_size);
1799*437bfbebSnyanmisaka 
1800*437bfbebSnyanmisaka     if (MPP_OK != cal_refresh_area(ctu_w, ctu_h, refresh_idx, ctx->cfg->rc.refresh_mode, ctx->cfg->rc.refresh_num, &cur_area)) {
1801*437bfbebSnyanmisaka         ret = MPP_ERR_VALUE;
1802*437bfbebSnyanmisaka         mpp_err_f("setting refresh area out of range");
1803*437bfbebSnyanmisaka         goto __RET;
1804*437bfbebSnyanmisaka     }
1805*437bfbebSnyanmisaka 
1806*437bfbebSnyanmisaka     RK_U8 *ptr = frm->roi_base_cfg_sw_buf;
1807*437bfbebSnyanmisaka     for (j = 0; j < ctu_h; j++) {
1808*437bfbebSnyanmisaka         for (k = 0; k < ctu_w; k++) {
1809*437bfbebSnyanmisaka             if (j <= cur_area.roi_ctu_y_end && j >= cur_area.roi_ctu_y_sta &&
1810*437bfbebSnyanmisaka                 k <= cur_area.roi_ctu_x_end && k >= cur_area.roi_ctu_x_sta) {
1811*437bfbebSnyanmisaka 
1812*437bfbebSnyanmisaka                 memset(ptr + 22, 0x55, 20); //176~336
1813*437bfbebSnyanmisaka                 *(ptr + 21) = 0x54; //170~175
1814*437bfbebSnyanmisaka                 *(ptr + 42) = 0x05; //336~339
1815*437bfbebSnyanmisaka             }
1816*437bfbebSnyanmisaka             ptr += 64;
1817*437bfbebSnyanmisaka         }
1818*437bfbebSnyanmisaka     }
1819*437bfbebSnyanmisaka 
1820*437bfbebSnyanmisaka     memcpy(roi_base_cfg_hw_ptr, frm->roi_base_cfg_sw_buf, roi_base_cfg_buf_size);
1821*437bfbebSnyanmisaka 
1822*437bfbebSnyanmisaka     if (ctx->cfg->rc.refresh_mode == MPP_ENC_RC_INTRA_REFRESH_ROW)
1823*437bfbebSnyanmisaka         regs->reg_base.reg0220_me_rnge.cme_srch_v = 1;
1824*437bfbebSnyanmisaka     else if (ctx->cfg->rc.refresh_mode == MPP_ENC_RC_INTRA_REFRESH_COL)
1825*437bfbebSnyanmisaka         regs->reg_base.reg0220_me_rnge.cme_srch_h = 1;
1826*437bfbebSnyanmisaka 
1827*437bfbebSnyanmisaka     regs->reg_base.reg0192_enc_pic.roi_en = 1;
1828*437bfbebSnyanmisaka     regs->reg_base.reg0178_roi_addr = roi_base_cfg_buf_fd;
1829*437bfbebSnyanmisaka     mpp_buffer_sync_end(frm->roi_base_cfg_buf);
1830*437bfbebSnyanmisaka 
1831*437bfbebSnyanmisaka __RET:
1832*437bfbebSnyanmisaka     hal_h265e_dbg_func("leave, ret %d\n", ret);
1833*437bfbebSnyanmisaka     return ret;
1834*437bfbebSnyanmisaka }
1835*437bfbebSnyanmisaka 
1836*437bfbebSnyanmisaka 
vepu580_h265_set_roi_regs(H265eV580HalContext * ctx,hevc_vepu580_base * regs)1837*437bfbebSnyanmisaka static MPP_RET vepu580_h265_set_roi_regs(H265eV580HalContext *ctx, hevc_vepu580_base *regs)
1838*437bfbebSnyanmisaka {
1839*437bfbebSnyanmisaka     Vepu580H265eFrmCfg *frm = ctx->frm;
1840*437bfbebSnyanmisaka 
1841*437bfbebSnyanmisaka     /* memset register on start so do not clear registers again here */
1842*437bfbebSnyanmisaka     if (frm->roi_data) {
1843*437bfbebSnyanmisaka         /* roi setup */
1844*437bfbebSnyanmisaka         RK_U32 ctu_w = MPP_ALIGN(ctx->cfg->prep.width, 64) / 64;
1845*437bfbebSnyanmisaka         RK_U32 ctu_h  = MPP_ALIGN(ctx->cfg->prep.height, 64) / 64;
1846*437bfbebSnyanmisaka         RK_U32 base_cfg_size = ctu_w * ctu_h * 64;
1847*437bfbebSnyanmisaka         RK_U32 qp_cfg_size   = ctu_w * ctu_h * 256;
1848*437bfbebSnyanmisaka         RK_U32 amv_cfg_size  = ctu_w * ctu_h * 512;
1849*437bfbebSnyanmisaka         RK_U32 mv_cfg_size   = ctu_w * ctu_h * 4;
1850*437bfbebSnyanmisaka         MppEncROICfg2 *cfg   = (MppEncROICfg2 *)frm->roi_data;
1851*437bfbebSnyanmisaka 
1852*437bfbebSnyanmisaka         if (mpp_buffer_get_size(cfg->base_cfg_buf) >= base_cfg_size) {
1853*437bfbebSnyanmisaka             regs->reg0192_enc_pic.roi_en = 1;
1854*437bfbebSnyanmisaka             regs->reg0178_roi_addr = mpp_buffer_get_fd(cfg->base_cfg_buf);
1855*437bfbebSnyanmisaka         } else {
1856*437bfbebSnyanmisaka             mpp_err("roi base cfg buf not enough, roi is invalid");
1857*437bfbebSnyanmisaka         }
1858*437bfbebSnyanmisaka 
1859*437bfbebSnyanmisaka         if (cfg->roi_qp_en) {
1860*437bfbebSnyanmisaka             if (mpp_buffer_get_size(cfg->qp_cfg_buf) >= qp_cfg_size) {
1861*437bfbebSnyanmisaka                 regs->reg0179_roi_qp_addr = mpp_buffer_get_fd(cfg->qp_cfg_buf);
1862*437bfbebSnyanmisaka                 regs->reg0228_roi_en.roi_qp_en = 1;
1863*437bfbebSnyanmisaka             } else {
1864*437bfbebSnyanmisaka                 mpp_err("roi qp cfg buf not enough, roi is invalid");
1865*437bfbebSnyanmisaka             }
1866*437bfbebSnyanmisaka         }
1867*437bfbebSnyanmisaka 
1868*437bfbebSnyanmisaka         if (cfg->roi_amv_en) {
1869*437bfbebSnyanmisaka             if (mpp_buffer_get_size(cfg->amv_cfg_buf) >= amv_cfg_size) {
1870*437bfbebSnyanmisaka                 regs->reg0180_roi_amv_addr = mpp_buffer_get_fd(cfg->amv_cfg_buf);
1871*437bfbebSnyanmisaka                 regs->reg0228_roi_en.roi_amv_en = 1;
1872*437bfbebSnyanmisaka             } else {
1873*437bfbebSnyanmisaka                 mpp_err("roi amv cfg buf not enough, roi is invalid");
1874*437bfbebSnyanmisaka             }
1875*437bfbebSnyanmisaka         }
1876*437bfbebSnyanmisaka 
1877*437bfbebSnyanmisaka         if (cfg->roi_mv_en) {
1878*437bfbebSnyanmisaka             if (mpp_buffer_get_size(cfg->mv_cfg_buf) >= mv_cfg_size) {
1879*437bfbebSnyanmisaka                 regs->reg0181_roi_mv_addr = mpp_buffer_get_fd(cfg->mv_cfg_buf);
1880*437bfbebSnyanmisaka                 regs->reg0228_roi_en.roi_mv_en = 1;
1881*437bfbebSnyanmisaka             } else {
1882*437bfbebSnyanmisaka                 mpp_err("roi mv cfg buf not enough, roi is invalid");
1883*437bfbebSnyanmisaka             }
1884*437bfbebSnyanmisaka         }
1885*437bfbebSnyanmisaka     }
1886*437bfbebSnyanmisaka 
1887*437bfbebSnyanmisaka     return MPP_OK;
1888*437bfbebSnyanmisaka }
1889*437bfbebSnyanmisaka 
vepu580_h265_set_rc_regs(H265eV580HalContext * ctx,H265eV580RegSet * regs,HalEncTask * task)1890*437bfbebSnyanmisaka static MPP_RET vepu580_h265_set_rc_regs(H265eV580HalContext *ctx, H265eV580RegSet *regs, HalEncTask *task)
1891*437bfbebSnyanmisaka {
1892*437bfbebSnyanmisaka     H265eSyntax_new *syn = ctx->syn;
1893*437bfbebSnyanmisaka     EncRcTaskInfo *rc_cfg = &task->rc_task->info;
1894*437bfbebSnyanmisaka     hevc_vepu580_base *reg_base = &regs->reg_base;
1895*437bfbebSnyanmisaka     hevc_vepu580_rc_klut *reg_rc = &regs->reg_rc_klut;
1896*437bfbebSnyanmisaka     MppEncCfgSet *cfg = ctx->cfg;
1897*437bfbebSnyanmisaka     MppEncRcCfg *rc = &cfg->rc;
1898*437bfbebSnyanmisaka     MppEncHwCfg *hw = &cfg->hw;
1899*437bfbebSnyanmisaka     MppEncH265Cfg *h265 = &cfg->h265;
1900*437bfbebSnyanmisaka     RK_S32 mb_wd64, mb_h64;
1901*437bfbebSnyanmisaka     mb_wd64 = (syn->pp.pic_width + 63) / 64;
1902*437bfbebSnyanmisaka     mb_h64 = (syn->pp.pic_height + 63) / 64;
1903*437bfbebSnyanmisaka 
1904*437bfbebSnyanmisaka     RK_U32 ctu_target_bits_mul_16 = (rc_cfg->bit_target << 4) / (mb_wd64 * mb_h64);
1905*437bfbebSnyanmisaka     RK_U32 ctu_target_bits;
1906*437bfbebSnyanmisaka     RK_S32 negative_bits_thd, positive_bits_thd;
1907*437bfbebSnyanmisaka 
1908*437bfbebSnyanmisaka     if (rc->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
1909*437bfbebSnyanmisaka         reg_base->reg0192_enc_pic.pic_qp    = rc_cfg->quality_target;
1910*437bfbebSnyanmisaka         reg_base->reg0240_synt_sli1.sli_qp  = rc_cfg->quality_target;
1911*437bfbebSnyanmisaka 
1912*437bfbebSnyanmisaka         reg_base->reg213_rc_qp.rc_max_qp   = rc_cfg->quality_target;
1913*437bfbebSnyanmisaka         reg_base->reg213_rc_qp.rc_min_qp   = rc_cfg->quality_target;
1914*437bfbebSnyanmisaka     } else {
1915*437bfbebSnyanmisaka         if (ctu_target_bits_mul_16 >= 0x100000) {
1916*437bfbebSnyanmisaka             ctu_target_bits_mul_16 = 0x50000;
1917*437bfbebSnyanmisaka         }
1918*437bfbebSnyanmisaka         ctu_target_bits = (ctu_target_bits_mul_16 * mb_wd64) >> 4;
1919*437bfbebSnyanmisaka         negative_bits_thd = 0 - 5 * ctu_target_bits / 16;
1920*437bfbebSnyanmisaka         positive_bits_thd = 5 * ctu_target_bits / 16;
1921*437bfbebSnyanmisaka 
1922*437bfbebSnyanmisaka         reg_base->reg0192_enc_pic.pic_qp    = rc_cfg->quality_target;
1923*437bfbebSnyanmisaka         reg_base->reg0240_synt_sli1.sli_qp  = rc_cfg->quality_target;
1924*437bfbebSnyanmisaka         reg_base->reg212_rc_cfg.rc_en      = 1;
1925*437bfbebSnyanmisaka         reg_base->reg212_rc_cfg.aq_en  = 1;
1926*437bfbebSnyanmisaka         reg_base->reg212_rc_cfg.aq_mode    = 1;
1927*437bfbebSnyanmisaka         reg_base->reg212_rc_cfg.rc_ctu_num = mb_wd64;
1928*437bfbebSnyanmisaka         reg_base->reg213_rc_qp.rc_qp_range = (ctx->frame_type == INTRA_FRAME) ?
1929*437bfbebSnyanmisaka                                              hw->qp_delta_row_i : hw->qp_delta_row;
1930*437bfbebSnyanmisaka         reg_base->reg213_rc_qp.rc_max_qp   = rc_cfg->quality_max;
1931*437bfbebSnyanmisaka         reg_base->reg213_rc_qp.rc_min_qp   = rc_cfg->quality_min;
1932*437bfbebSnyanmisaka         reg_base->reg214_rc_tgt.ctu_ebit  = ctu_target_bits_mul_16;
1933*437bfbebSnyanmisaka 
1934*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[0] = 2 * negative_bits_thd;
1935*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[1] = negative_bits_thd;
1936*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[2] = positive_bits_thd;
1937*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[3] = 2 * positive_bits_thd;
1938*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[4] = 0x7FFFFFFF;
1939*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[5] = 0x7FFFFFFF;
1940*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[6] = 0x7FFFFFFF;
1941*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[7] = 0x7FFFFFFF;
1942*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[8] = 0x7FFFFFFF;
1943*437bfbebSnyanmisaka 
1944*437bfbebSnyanmisaka         reg_rc->rc_adj0.qp_adj0    = -2;
1945*437bfbebSnyanmisaka         reg_rc->rc_adj0.qp_adj1    = -1;
1946*437bfbebSnyanmisaka         reg_rc->rc_adj0.qp_adj2    = 0;
1947*437bfbebSnyanmisaka         reg_rc->rc_adj0.qp_adj3    = 1;
1948*437bfbebSnyanmisaka         reg_rc->rc_adj0.qp_adj4    = 2;
1949*437bfbebSnyanmisaka         reg_rc->rc_adj1.qp_adj5    = 0;
1950*437bfbebSnyanmisaka         reg_rc->rc_adj1.qp_adj6    = 0;
1951*437bfbebSnyanmisaka         reg_rc->rc_adj1.qp_adj7    = 0;
1952*437bfbebSnyanmisaka         reg_rc->rc_adj1.qp_adj8    = 0;
1953*437bfbebSnyanmisaka 
1954*437bfbebSnyanmisaka         if (rc->rc_mode == MPP_ENC_RC_MODE_SMTRC) {
1955*437bfbebSnyanmisaka             reg_base->reg213_rc_qp.rc_qp_range = 0;
1956*437bfbebSnyanmisaka         }
1957*437bfbebSnyanmisaka     }
1958*437bfbebSnyanmisaka 
1959*437bfbebSnyanmisaka     reg_rc->roi_qthd0.qpmin_area0 = h265->qpmin_map[0] > 0 ? h265->qpmin_map[0] : rc_cfg->quality_min;
1960*437bfbebSnyanmisaka     reg_rc->roi_qthd0.qpmax_area0 = h265->qpmax_map[0] > 0 ? h265->qpmax_map[0] : rc_cfg->quality_max;
1961*437bfbebSnyanmisaka     reg_rc->roi_qthd0.qpmin_area1 = h265->qpmin_map[1] > 0 ? h265->qpmin_map[1] : rc_cfg->quality_min;
1962*437bfbebSnyanmisaka     reg_rc->roi_qthd0.qpmax_area1 = h265->qpmax_map[1] > 0 ? h265->qpmax_map[1] : rc_cfg->quality_max;
1963*437bfbebSnyanmisaka     reg_rc->roi_qthd0.qpmin_area2 = h265->qpmin_map[2] > 0 ? h265->qpmin_map[2] : rc_cfg->quality_min;
1964*437bfbebSnyanmisaka     reg_rc->roi_qthd1.qpmax_area2 = h265->qpmax_map[2] > 0 ? h265->qpmax_map[2] : rc_cfg->quality_max;
1965*437bfbebSnyanmisaka     reg_rc->roi_qthd1.qpmin_area3 = h265->qpmin_map[3] > 0 ? h265->qpmin_map[3] : rc_cfg->quality_min;
1966*437bfbebSnyanmisaka     reg_rc->roi_qthd1.qpmax_area3 = h265->qpmax_map[3] > 0 ? h265->qpmax_map[3] : rc_cfg->quality_max;
1967*437bfbebSnyanmisaka     reg_rc->roi_qthd1.qpmin_area4 = h265->qpmin_map[4] > 0 ? h265->qpmin_map[4] : rc_cfg->quality_min;
1968*437bfbebSnyanmisaka     reg_rc->roi_qthd1.qpmax_area4 = h265->qpmax_map[4] > 0 ? h265->qpmax_map[4] : rc_cfg->quality_max;
1969*437bfbebSnyanmisaka     reg_rc->roi_qthd2.qpmin_area5 = h265->qpmin_map[5] > 0 ? h265->qpmin_map[5] : rc_cfg->quality_min;
1970*437bfbebSnyanmisaka     reg_rc->roi_qthd2.qpmax_area5 = h265->qpmax_map[5] > 0 ? h265->qpmax_map[5] : rc_cfg->quality_max;
1971*437bfbebSnyanmisaka     reg_rc->roi_qthd2.qpmin_area6 = h265->qpmin_map[6] > 0 ? h265->qpmin_map[6] : rc_cfg->quality_min;
1972*437bfbebSnyanmisaka     reg_rc->roi_qthd2.qpmax_area6 = h265->qpmax_map[6] > 0 ? h265->qpmax_map[6] : rc_cfg->quality_max;
1973*437bfbebSnyanmisaka     reg_rc->roi_qthd2.qpmin_area7 = h265->qpmin_map[7] > 0 ? h265->qpmin_map[7] : rc_cfg->quality_min;
1974*437bfbebSnyanmisaka     reg_rc->roi_qthd3.qpmax_area7 = h265->qpmax_map[7] > 0 ? h265->qpmax_map[7] : rc_cfg->quality_max;
1975*437bfbebSnyanmisaka     reg_rc->roi_qthd3.qpmap_mode  = h265->qpmap_mode;
1976*437bfbebSnyanmisaka 
1977*437bfbebSnyanmisaka     return MPP_OK;
1978*437bfbebSnyanmisaka }
1979*437bfbebSnyanmisaka 
vepu580_h265_set_pp_regs(H265eV580RegSet * regs,VepuFmtCfg * fmt,MppEncPrepCfg * prep_cfg,HalEncTask * task)1980*437bfbebSnyanmisaka static MPP_RET vepu580_h265_set_pp_regs(H265eV580RegSet *regs, VepuFmtCfg *fmt,
1981*437bfbebSnyanmisaka                                         MppEncPrepCfg *prep_cfg, HalEncTask *task)
1982*437bfbebSnyanmisaka {
1983*437bfbebSnyanmisaka     hevc_vepu580_control_cfg *reg_ctl = &regs->reg_ctl;
1984*437bfbebSnyanmisaka     hevc_vepu580_base        *reg_base = &regs->reg_base;
1985*437bfbebSnyanmisaka     RK_S32 stridey = 0;
1986*437bfbebSnyanmisaka     RK_S32 stridec = 0;
1987*437bfbebSnyanmisaka 
1988*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.src_bus_edin = fmt->src_endian;
1989*437bfbebSnyanmisaka     reg_base->reg0198_src_fmt.src_cfmt = fmt->format;
1990*437bfbebSnyanmisaka     reg_base->reg0198_src_fmt.alpha_swap = fmt->alpha_swap;
1991*437bfbebSnyanmisaka     reg_base->reg0198_src_fmt.rbuv_swap = fmt->rbuv_swap;
1992*437bfbebSnyanmisaka     reg_base->reg0198_src_fmt.out_fmt = (prep_cfg->format == MPP_FMT_YUV400) ? 0 : 1;
1993*437bfbebSnyanmisaka     reg_base->reg0203_src_proc.src_mirr = prep_cfg->mirroring > 0;
1994*437bfbebSnyanmisaka     reg_base->reg0203_src_proc.src_rot = prep_cfg->rotation;
1995*437bfbebSnyanmisaka 
1996*437bfbebSnyanmisaka     if (MPP_FRAME_FMT_IS_YUV(prep_cfg->format))
1997*437bfbebSnyanmisaka         reg_base->reg0198_src_fmt.src_range = 1;
1998*437bfbebSnyanmisaka     else
1999*437bfbebSnyanmisaka         reg_base->reg0198_src_fmt.src_range = (prep_cfg->range == MPP_FRAME_RANGE_JPEG) ? 1 : 0;
2000*437bfbebSnyanmisaka 
2001*437bfbebSnyanmisaka     if (MPP_FRAME_FMT_IS_FBC(prep_cfg->format)) {
2002*437bfbebSnyanmisaka         stridey = mpp_frame_get_fbc_hdr_stride(task->frame);
2003*437bfbebSnyanmisaka         if (!stridey)
2004*437bfbebSnyanmisaka             stridey = MPP_ALIGN(prep_cfg->width, 16);
2005*437bfbebSnyanmisaka     } else if (prep_cfg->hor_stride) {
2006*437bfbebSnyanmisaka         stridey = prep_cfg->hor_stride;
2007*437bfbebSnyanmisaka     } else {
2008*437bfbebSnyanmisaka         if (fmt->format == VEPU5xx_FMT_BGRA8888 )
2009*437bfbebSnyanmisaka             stridey = prep_cfg->width * 4;
2010*437bfbebSnyanmisaka         else if (fmt->format == VEPU5xx_FMT_BGR888 )
2011*437bfbebSnyanmisaka             stridey = prep_cfg->width * 3;
2012*437bfbebSnyanmisaka         else if (fmt->format == VEPU5xx_FMT_BGR565 ||
2013*437bfbebSnyanmisaka                  fmt->format == VEPU5xx_FMT_YUYV422 ||
2014*437bfbebSnyanmisaka                  fmt->format == VEPU5xx_FMT_UYVY422)
2015*437bfbebSnyanmisaka             stridey = prep_cfg->width * 2;
2016*437bfbebSnyanmisaka         else
2017*437bfbebSnyanmisaka             stridey = prep_cfg->width;
2018*437bfbebSnyanmisaka     }
2019*437bfbebSnyanmisaka 
2020*437bfbebSnyanmisaka     switch (fmt->format) {
2021*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV444SP : {
2022*437bfbebSnyanmisaka         stridec = stridey * 2;
2023*437bfbebSnyanmisaka     } break;
2024*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV422SP :
2025*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV420SP :
2026*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV444P : {
2027*437bfbebSnyanmisaka         stridec = stridey;
2028*437bfbebSnyanmisaka     } break;
2029*437bfbebSnyanmisaka     default : {
2030*437bfbebSnyanmisaka         stridec = stridey / 2;
2031*437bfbebSnyanmisaka     } break;
2032*437bfbebSnyanmisaka     }
2033*437bfbebSnyanmisaka 
2034*437bfbebSnyanmisaka     if (reg_base->reg0198_src_fmt.src_cfmt < VEPU5xx_FMT_ARGB1555) {
2035*437bfbebSnyanmisaka         const VepuRgb2YuvCfg *cfg_coeffs = cfg_coeffs = get_rgb2yuv_cfg(prep_cfg->range, prep_cfg->color);
2036*437bfbebSnyanmisaka 
2037*437bfbebSnyanmisaka         hal_h265e_dbg_simple("input color range %d colorspace %d", prep_cfg->range, prep_cfg->color);
2038*437bfbebSnyanmisaka 
2039*437bfbebSnyanmisaka         reg_base->reg0199_src_udfy.csc_wgt_r2y = cfg_coeffs->_2y.r_coeff;
2040*437bfbebSnyanmisaka         reg_base->reg0199_src_udfy.csc_wgt_g2y = cfg_coeffs->_2y.g_coeff;
2041*437bfbebSnyanmisaka         reg_base->reg0199_src_udfy.csc_wgt_b2y = cfg_coeffs->_2y.b_coeff;
2042*437bfbebSnyanmisaka 
2043*437bfbebSnyanmisaka         reg_base->reg0200_src_udfu.csc_wgt_r2u = cfg_coeffs->_2u.r_coeff;
2044*437bfbebSnyanmisaka         reg_base->reg0200_src_udfu.csc_wgt_g2u = cfg_coeffs->_2u.g_coeff;
2045*437bfbebSnyanmisaka         reg_base->reg0200_src_udfu.csc_wgt_b2u = cfg_coeffs->_2u.b_coeff;
2046*437bfbebSnyanmisaka 
2047*437bfbebSnyanmisaka         reg_base->reg0201_src_udfv.csc_wgt_r2v = cfg_coeffs->_2v.r_coeff;
2048*437bfbebSnyanmisaka         reg_base->reg0201_src_udfv.csc_wgt_g2v = cfg_coeffs->_2v.g_coeff;
2049*437bfbebSnyanmisaka         reg_base->reg0201_src_udfv.csc_wgt_b2v = cfg_coeffs->_2v.b_coeff;
2050*437bfbebSnyanmisaka 
2051*437bfbebSnyanmisaka         reg_base->reg0202_src_udfo.csc_ofst_y = cfg_coeffs->_2y.offset;
2052*437bfbebSnyanmisaka         reg_base->reg0202_src_udfo.csc_ofst_u = cfg_coeffs->_2u.offset;
2053*437bfbebSnyanmisaka         reg_base->reg0202_src_udfo.csc_ofst_v = cfg_coeffs->_2v.offset;
2054*437bfbebSnyanmisaka 
2055*437bfbebSnyanmisaka         hal_h265e_dbg_simple("use color range %d colorspace %d", cfg_coeffs->dst_range, cfg_coeffs->color);
2056*437bfbebSnyanmisaka     }
2057*437bfbebSnyanmisaka 
2058*437bfbebSnyanmisaka     reg_base->reg0205_src_strd0.src_strd0  = stridey;
2059*437bfbebSnyanmisaka     reg_base->reg0206_src_strd1.src_strd1  = stridec;
2060*437bfbebSnyanmisaka 
2061*437bfbebSnyanmisaka     return MPP_OK;
2062*437bfbebSnyanmisaka }
2063*437bfbebSnyanmisaka 
vepu580_h265_set_slice_regs(H265eSyntax_new * syn,hevc_vepu580_base * regs)2064*437bfbebSnyanmisaka static void vepu580_h265_set_slice_regs(H265eSyntax_new *syn, hevc_vepu580_base *regs)
2065*437bfbebSnyanmisaka {
2066*437bfbebSnyanmisaka     regs->reg0237_synt_sps.smpl_adpt_ofst_e    = syn->pp.sample_adaptive_offset_enabled_flag;//slice->m_sps->m_bUseSAO;
2067*437bfbebSnyanmisaka     regs->reg0237_synt_sps.num_st_ref_pic       = syn->pp.num_short_term_ref_pic_sets;
2068*437bfbebSnyanmisaka     regs->reg0237_synt_sps.num_lt_ref_pic       = syn->pp.num_long_term_ref_pics_sps;
2069*437bfbebSnyanmisaka     regs->reg0237_synt_sps.lt_ref_pic_prsnt     = syn->pp.long_term_ref_pics_present_flag;
2070*437bfbebSnyanmisaka     regs->reg0237_synt_sps.tmpl_mvp_e          = syn->pp.sps_temporal_mvp_enabled_flag;
2071*437bfbebSnyanmisaka     regs->reg0237_synt_sps.log2_max_poc_lsb     = syn->pp.log2_max_pic_order_cnt_lsb_minus4;
2072*437bfbebSnyanmisaka     regs->reg0237_synt_sps.strg_intra_smth      = syn->pp.strong_intra_smoothing_enabled_flag;
2073*437bfbebSnyanmisaka 
2074*437bfbebSnyanmisaka     regs->reg0238_synt_pps.dpdnt_sli_seg_en     = syn->pp.dependent_slice_segments_enabled_flag;
2075*437bfbebSnyanmisaka     regs->reg0238_synt_pps.out_flg_prsnt_flg    = syn->pp.output_flag_present_flag;
2076*437bfbebSnyanmisaka     regs->reg0238_synt_pps.num_extr_sli_hdr     = syn->pp.num_extra_slice_header_bits;
2077*437bfbebSnyanmisaka     regs->reg0238_synt_pps.sgn_dat_hid_en       = syn->pp.sign_data_hiding_enabled_flag;
2078*437bfbebSnyanmisaka     regs->reg0238_synt_pps.cbc_init_prsnt_flg   = syn->pp.cabac_init_present_flag;
2079*437bfbebSnyanmisaka     regs->reg0238_synt_pps.pic_init_qp          = syn->pp.init_qp_minus26 + 26;
2080*437bfbebSnyanmisaka     regs->reg0238_synt_pps.cu_qp_dlt_en         = syn->pp.cu_qp_delta_enabled_flag;
2081*437bfbebSnyanmisaka     regs->reg0238_synt_pps.chrm_qp_ofst_prsn    = syn->pp.pps_slice_chroma_qp_offsets_present_flag;
2082*437bfbebSnyanmisaka     regs->reg0238_synt_pps.lp_fltr_acrs_sli     = syn->pp.pps_loop_filter_across_slices_enabled_flag;
2083*437bfbebSnyanmisaka     regs->reg0238_synt_pps.dblk_fltr_ovrd_en    = syn->pp.deblocking_filter_override_enabled_flag;
2084*437bfbebSnyanmisaka     regs->reg0238_synt_pps.lst_mdfy_prsnt_flg   = syn->pp.lists_modification_present_flag;
2085*437bfbebSnyanmisaka     regs->reg0238_synt_pps.sli_seg_hdr_extn     = syn->pp.slice_segment_header_extension_present_flag;
2086*437bfbebSnyanmisaka     regs->reg0238_synt_pps.cu_qp_dlt_depth      = syn->pp.diff_cu_qp_delta_depth;
2087*437bfbebSnyanmisaka     regs->reg0238_synt_pps.lpf_fltr_acrs_til    = syn->pp.loop_filter_across_tiles_enabled_flag;
2088*437bfbebSnyanmisaka 
2089*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.cbc_init_flg        = syn->sp.cbc_init_flg;
2090*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.mvd_l1_zero_flg     = syn->sp.mvd_l1_zero_flg;
2091*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.mrg_up_flg          = syn->sp.merge_up_flag;
2092*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.mrg_lft_flg         = syn->sp.merge_left_flag;
2093*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.ref_pic_lst_mdf_l0  = syn->sp.ref_pic_lst_mdf_l0;
2094*437bfbebSnyanmisaka 
2095*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.num_refidx_l1_act   = syn->sp.num_refidx_l1_act;
2096*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.num_refidx_l0_act   = syn->sp.num_refidx_l0_act;
2097*437bfbebSnyanmisaka 
2098*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.num_refidx_act_ovrd = syn->sp.num_refidx_act_ovrd;
2099*437bfbebSnyanmisaka 
2100*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.sli_sao_chrm_flg    = syn->sp.sli_sao_chrm_flg;
2101*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.sli_sao_luma_flg    = syn->sp.sli_sao_luma_flg;
2102*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.sli_tmprl_mvp_e     = syn->sp.sli_tmprl_mvp_en;
2103*437bfbebSnyanmisaka     regs->reg0192_enc_pic.num_pic_tot_cur       = syn->sp.tot_poc_num;
2104*437bfbebSnyanmisaka 
2105*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.pic_out_flg         = syn->sp.pic_out_flg;
2106*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.sli_type            = syn->sp.slice_type;
2107*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.sli_rsrv_flg        = syn->sp.slice_rsrv_flg;
2108*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.dpdnt_sli_seg_flg   = syn->sp.dpdnt_sli_seg_flg;
2109*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.sli_pps_id          = syn->sp.sli_pps_id;
2110*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.no_out_pri_pic      = syn->sp.no_out_pri_pic;
2111*437bfbebSnyanmisaka 
2112*437bfbebSnyanmisaka 
2113*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.sp_tc_ofst_div2       = syn->sp.sli_tc_ofst_div2;
2114*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.sp_beta_ofst_div2     = syn->sp.sli_beta_ofst_div2;
2115*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.sli_lp_fltr_acrs_sli  = syn->sp.sli_lp_fltr_acrs_sli;
2116*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.sp_dblk_fltr_dis      = syn->sp.sli_dblk_fltr_dis;
2117*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.dblk_fltr_ovrd_flg    = syn->sp.dblk_fltr_ovrd_flg;
2118*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.sli_cb_qp_ofst        = syn->pp.pps_slice_chroma_qp_offsets_present_flag ?
2119*437bfbebSnyanmisaka                                                     syn->sp.sli_cb_qp_ofst : syn->pp.pps_cb_qp_offset;
2120*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.max_mrg_cnd           = syn->sp.max_mrg_cnd;
2121*437bfbebSnyanmisaka 
2122*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.col_ref_idx           = syn->sp.col_ref_idx;
2123*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.col_frm_l0_flg        = syn->sp.col_frm_l0_flg;
2124*437bfbebSnyanmisaka     regs->reg0241_synt_sli2.sli_poc_lsb           = syn->sp.sli_poc_lsb;
2125*437bfbebSnyanmisaka     regs->reg0241_synt_sli2.sli_hdr_ext_len       = syn->sp.sli_hdr_ext_len;
2126*437bfbebSnyanmisaka 
2127*437bfbebSnyanmisaka }
2128*437bfbebSnyanmisaka 
vepu580_h265_set_ref_regs(H265eSyntax_new * syn,hevc_vepu580_base * regs)2129*437bfbebSnyanmisaka static void vepu580_h265_set_ref_regs(H265eSyntax_new *syn, hevc_vepu580_base *regs)
2130*437bfbebSnyanmisaka {
2131*437bfbebSnyanmisaka     regs->reg0242_synt_refm0.st_ref_pic_flg = syn->sp.st_ref_pic_flg;
2132*437bfbebSnyanmisaka     regs->reg0242_synt_refm0.poc_lsb_lt0 = syn->sp.poc_lsb_lt0;
2133*437bfbebSnyanmisaka     regs->reg0242_synt_refm0.num_lt_pic = syn->sp.num_lt_pic;
2134*437bfbebSnyanmisaka 
2135*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.dlt_poc_msb_prsnt0 = syn->sp.dlt_poc_msb_prsnt0;
2136*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.dlt_poc_msb_cycl0 = syn->sp.dlt_poc_msb_cycl0;
2137*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.used_by_lt_flg0 = syn->sp.used_by_lt_flg0;
2138*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.used_by_lt_flg1 = syn->sp.used_by_lt_flg1;
2139*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.used_by_lt_flg2 = syn->sp.used_by_lt_flg2;
2140*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.dlt_poc_msb_prsnt0 = syn->sp.dlt_poc_msb_prsnt0;
2141*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.dlt_poc_msb_cycl0 = syn->sp.dlt_poc_msb_cycl0;
2142*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.dlt_poc_msb_prsnt1 = syn->sp.dlt_poc_msb_prsnt1;
2143*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.num_negative_pics = syn->sp.num_neg_pic;
2144*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.num_pos_pic = syn->sp.num_pos_pic;
2145*437bfbebSnyanmisaka 
2146*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.used_by_s0_flg = syn->sp.used_by_s0_flg;
2147*437bfbebSnyanmisaka     regs->reg0244_synt_refm2.dlt_poc_s0_m10 = syn->sp.dlt_poc_s0_m10;
2148*437bfbebSnyanmisaka     regs->reg0244_synt_refm2.dlt_poc_s0_m11 = syn->sp.dlt_poc_s0_m11;
2149*437bfbebSnyanmisaka     regs->reg0245_synt_refm3.dlt_poc_s0_m12 = syn->sp.dlt_poc_s0_m12;
2150*437bfbebSnyanmisaka     regs->reg0245_synt_refm3.dlt_poc_s0_m13 = syn->sp.dlt_poc_s0_m13;
2151*437bfbebSnyanmisaka 
2152*437bfbebSnyanmisaka     regs->reg0246_synt_long_refm0.poc_lsb_lt1 = syn->sp.poc_lsb_lt1;
2153*437bfbebSnyanmisaka     regs->reg0247_synt_long_refm1.dlt_poc_msb_cycl1 = syn->sp.dlt_poc_msb_cycl1;
2154*437bfbebSnyanmisaka     regs->reg0246_synt_long_refm0.poc_lsb_lt2 = syn->sp.poc_lsb_lt2;
2155*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.dlt_poc_msb_prsnt2 = syn->sp.dlt_poc_msb_prsnt2;
2156*437bfbebSnyanmisaka     regs->reg0247_synt_long_refm1.dlt_poc_msb_cycl2 = syn->sp.dlt_poc_msb_cycl2;
2157*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.lst_entry_l0 = syn->sp.lst_entry_l0;
2158*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.ref_pic_lst_mdf_l0 = syn->sp.ref_pic_lst_mdf_l0;
2159*437bfbebSnyanmisaka 
2160*437bfbebSnyanmisaka     return;
2161*437bfbebSnyanmisaka }
2162*437bfbebSnyanmisaka 
hal_h265e_v580_send_regs(MppDev dev,H265eV580RegSet * hw_regs,H265eV580StatusElem * reg_out)2163*437bfbebSnyanmisaka static MPP_RET hal_h265e_v580_send_regs(MppDev dev, H265eV580RegSet *hw_regs, H265eV580StatusElem *reg_out)
2164*437bfbebSnyanmisaka {
2165*437bfbebSnyanmisaka     RK_U32 *regs = (RK_U32*)hw_regs;
2166*437bfbebSnyanmisaka     MppDevRegWrCfg cfg;
2167*437bfbebSnyanmisaka     MppDevRegRdCfg cfg1;
2168*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
2169*437bfbebSnyanmisaka     RK_U32 i;
2170*437bfbebSnyanmisaka 
2171*437bfbebSnyanmisaka     cfg.reg = (RK_U32*)&hw_regs->reg_ctl;
2172*437bfbebSnyanmisaka     cfg.size = sizeof(hevc_vepu580_control_cfg);
2173*437bfbebSnyanmisaka     cfg.offset = VEPU580_CTL_OFFSET;
2174*437bfbebSnyanmisaka 
2175*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(dev, MPP_DEV_REG_WR, &cfg);
2176*437bfbebSnyanmisaka     if (ret) {
2177*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
2178*437bfbebSnyanmisaka         goto FAILE;
2179*437bfbebSnyanmisaka     }
2180*437bfbebSnyanmisaka 
2181*437bfbebSnyanmisaka     if (hal_h265e_debug & HAL_H265E_DBG_CTL_REGS) {
2182*437bfbebSnyanmisaka         regs = (RK_U32*)&hw_regs->reg_ctl;
2183*437bfbebSnyanmisaka         for (i = 0; i < sizeof(hevc_vepu580_control_cfg) / 4; i++) {
2184*437bfbebSnyanmisaka             hal_h265e_dbg_ctl("ctl reg[%04x]: 0%08x\n", i * 4, regs[i]);
2185*437bfbebSnyanmisaka         }
2186*437bfbebSnyanmisaka     }
2187*437bfbebSnyanmisaka 
2188*437bfbebSnyanmisaka     cfg.reg = &hw_regs->reg_base;
2189*437bfbebSnyanmisaka     cfg.size = sizeof(hevc_vepu580_base);
2190*437bfbebSnyanmisaka     cfg.offset = VEPU580_BASE_OFFSET;
2191*437bfbebSnyanmisaka 
2192*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(dev, MPP_DEV_REG_WR, &cfg);
2193*437bfbebSnyanmisaka     if (ret) {
2194*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
2195*437bfbebSnyanmisaka         goto FAILE;
2196*437bfbebSnyanmisaka     }
2197*437bfbebSnyanmisaka 
2198*437bfbebSnyanmisaka     if (hal_h265e_debug & HAL_H265E_DBG_REGS) {
2199*437bfbebSnyanmisaka         regs = (RK_U32*)(&hw_regs->reg_base);
2200*437bfbebSnyanmisaka         for (i = 0; i < 32; i++) {
2201*437bfbebSnyanmisaka             hal_h265e_dbg_regs("hw add cfg reg[%04x]: 0%08x\n", i * 4, regs[i]);
2202*437bfbebSnyanmisaka         }
2203*437bfbebSnyanmisaka         regs += 32;
2204*437bfbebSnyanmisaka         for (i = 0; i < (sizeof(hevc_vepu580_base) - 128) / 4; i++) {
2205*437bfbebSnyanmisaka             hal_h265e_dbg_regs("set reg[%04x]: 0%08x\n", i * 4, regs[i]);
2206*437bfbebSnyanmisaka         }
2207*437bfbebSnyanmisaka     }
2208*437bfbebSnyanmisaka 
2209*437bfbebSnyanmisaka     cfg.reg = &hw_regs->reg_rc_klut;
2210*437bfbebSnyanmisaka     cfg.size = sizeof(hevc_vepu580_rc_klut);
2211*437bfbebSnyanmisaka     cfg.offset = VEPU580_RCKULT_OFFSET;
2212*437bfbebSnyanmisaka 
2213*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(dev, MPP_DEV_REG_WR, &cfg);
2214*437bfbebSnyanmisaka 
2215*437bfbebSnyanmisaka     if (hal_h265e_debug & HAL_H265E_DBG_RCKUT_REGS) {
2216*437bfbebSnyanmisaka         regs = (RK_U32*)&hw_regs->reg_rc_klut;
2217*437bfbebSnyanmisaka         for (i = 0; i < sizeof(hevc_vepu580_rc_klut) / 4; i++) {
2218*437bfbebSnyanmisaka             hal_h265e_dbg_rckut("set reg[%04x]: 0%08x\n", i * 4, regs[i]);
2219*437bfbebSnyanmisaka         }
2220*437bfbebSnyanmisaka     }
2221*437bfbebSnyanmisaka 
2222*437bfbebSnyanmisaka     if (ret) {
2223*437bfbebSnyanmisaka         mpp_err_f("set rc kult  write failed %d\n", ret);
2224*437bfbebSnyanmisaka         goto FAILE;
2225*437bfbebSnyanmisaka     }
2226*437bfbebSnyanmisaka 
2227*437bfbebSnyanmisaka     cfg.reg = &hw_regs->reg_wgt;
2228*437bfbebSnyanmisaka     cfg.size = sizeof(hevc_vepu580_wgt);
2229*437bfbebSnyanmisaka     cfg.offset = VEPU580_WEG_OFFSET;
2230*437bfbebSnyanmisaka 
2231*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(dev, MPP_DEV_REG_WR, &cfg);
2232*437bfbebSnyanmisaka     if (ret) {
2233*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
2234*437bfbebSnyanmisaka         goto FAILE;
2235*437bfbebSnyanmisaka     }
2236*437bfbebSnyanmisaka 
2237*437bfbebSnyanmisaka     if (hal_h265e_debug & HAL_H265E_DBG_WGT_REGS) {
2238*437bfbebSnyanmisaka         regs = (RK_U32*)&hw_regs->reg_wgt;
2239*437bfbebSnyanmisaka         for (i = 0; i < sizeof(hevc_vepu580_wgt) / 4; i++) {
2240*437bfbebSnyanmisaka             hal_h265e_dbg_wgt("set reg[%04x]: 0%08x\n", i * 4, regs[i]);
2241*437bfbebSnyanmisaka         }
2242*437bfbebSnyanmisaka     }
2243*437bfbebSnyanmisaka 
2244*437bfbebSnyanmisaka     cfg.reg = &hw_regs->reg_rdo;
2245*437bfbebSnyanmisaka     cfg.size = sizeof(vepu580_rdo_cfg);
2246*437bfbebSnyanmisaka     cfg.offset = VEPU580_RDOCFG_OFFSET;
2247*437bfbebSnyanmisaka 
2248*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(dev, MPP_DEV_REG_WR, &cfg);
2249*437bfbebSnyanmisaka     if (ret) {
2250*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
2251*437bfbebSnyanmisaka         goto FAILE;
2252*437bfbebSnyanmisaka     }
2253*437bfbebSnyanmisaka 
2254*437bfbebSnyanmisaka     cfg.reg = &hw_regs->reg_osd_cfg;
2255*437bfbebSnyanmisaka     cfg.size = sizeof(vepu580_osd_cfg);
2256*437bfbebSnyanmisaka     cfg.offset = VEPU580_OSD_OFFSET;
2257*437bfbebSnyanmisaka 
2258*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(dev, MPP_DEV_REG_WR, &cfg);
2259*437bfbebSnyanmisaka     if (ret) {
2260*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
2261*437bfbebSnyanmisaka         goto FAILE;
2262*437bfbebSnyanmisaka     }
2263*437bfbebSnyanmisaka 
2264*437bfbebSnyanmisaka     cfg1.reg = &reg_out->hw_status;
2265*437bfbebSnyanmisaka     cfg1.size = sizeof(RK_U32);
2266*437bfbebSnyanmisaka     cfg1.offset = VEPU580_REG_BASE_HW_STATUS;
2267*437bfbebSnyanmisaka 
2268*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(dev, MPP_DEV_REG_RD, &cfg1);
2269*437bfbebSnyanmisaka     if (ret) {
2270*437bfbebSnyanmisaka         mpp_err_f("set register read failed %d\n", ret);
2271*437bfbebSnyanmisaka         goto FAILE;
2272*437bfbebSnyanmisaka     }
2273*437bfbebSnyanmisaka 
2274*437bfbebSnyanmisaka     cfg1.reg = &reg_out->st;
2275*437bfbebSnyanmisaka     cfg1.size = sizeof(H265eV580StatusElem) - 4;
2276*437bfbebSnyanmisaka     cfg1.offset = VEPU580_STATUS_OFFSET;
2277*437bfbebSnyanmisaka 
2278*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(dev, MPP_DEV_REG_RD, &cfg1);
2279*437bfbebSnyanmisaka     if (ret) {
2280*437bfbebSnyanmisaka         mpp_err_f("set register read failed %d\n", ret);
2281*437bfbebSnyanmisaka         goto FAILE;
2282*437bfbebSnyanmisaka     }
2283*437bfbebSnyanmisaka FAILE:
2284*437bfbebSnyanmisaka     return ret;
2285*437bfbebSnyanmisaka }
2286*437bfbebSnyanmisaka 
setup_vepu580_dual_core(H265eV580HalContext * ctx)2287*437bfbebSnyanmisaka static MPP_RET setup_vepu580_dual_core(H265eV580HalContext *ctx)
2288*437bfbebSnyanmisaka {
2289*437bfbebSnyanmisaka     Vepu580H265eFrmCfg *frm = ctx->frm;
2290*437bfbebSnyanmisaka     H265eV580RegSet *regs = frm->regs_set[0];
2291*437bfbebSnyanmisaka     hevc_vepu580_base *reg_base = &regs->reg_base;
2292*437bfbebSnyanmisaka     RK_U32 dchs_ofst = 9;
2293*437bfbebSnyanmisaka     RK_U32 dchs_rxe  = 1;
2294*437bfbebSnyanmisaka 
2295*437bfbebSnyanmisaka     if (frm->frame_type == INTRA_FRAME) {
2296*437bfbebSnyanmisaka         ctx->curr_idx = 0;
2297*437bfbebSnyanmisaka         ctx->prev_idx = 0;
2298*437bfbebSnyanmisaka         dchs_rxe = 0;
2299*437bfbebSnyanmisaka     }
2300*437bfbebSnyanmisaka 
2301*437bfbebSnyanmisaka     reg_base->reg0193_dual_core.dchs_txid = ctx->curr_idx;
2302*437bfbebSnyanmisaka     reg_base->reg0193_dual_core.dchs_rxid = ctx->prev_idx;
2303*437bfbebSnyanmisaka     reg_base->reg0193_dual_core.dchs_txe = 1;
2304*437bfbebSnyanmisaka     reg_base->reg0193_dual_core.dchs_rxe = dchs_rxe;
2305*437bfbebSnyanmisaka     reg_base->reg0193_dual_core.dchs_ofst = dchs_ofst;
2306*437bfbebSnyanmisaka 
2307*437bfbebSnyanmisaka     ctx->prev_idx = ctx->curr_idx++;
2308*437bfbebSnyanmisaka     if (ctx->curr_idx > 3)
2309*437bfbebSnyanmisaka         ctx->curr_idx = 0;
2310*437bfbebSnyanmisaka 
2311*437bfbebSnyanmisaka     return MPP_OK;
2312*437bfbebSnyanmisaka }
2313*437bfbebSnyanmisaka 
vepu580_h265_set_me_regs(H265eV580HalContext * ctx,H265eSyntax_new * syn,hevc_vepu580_base * regs)2314*437bfbebSnyanmisaka static void vepu580_h265_set_me_regs(H265eV580HalContext *ctx, H265eSyntax_new *syn, hevc_vepu580_base *regs)
2315*437bfbebSnyanmisaka {
2316*437bfbebSnyanmisaka 
2317*437bfbebSnyanmisaka     RK_U32 cime_w = 11, cime_h = 7;
2318*437bfbebSnyanmisaka     RK_S32 merangx = (cime_w + 1) * 32;
2319*437bfbebSnyanmisaka     RK_S32 merangy = (cime_h + 1) * 32;
2320*437bfbebSnyanmisaka     RK_S32 pic_wd64 = MPP_ALIGN(syn->pp.pic_width, 64) >> 6;
2321*437bfbebSnyanmisaka 
2322*437bfbebSnyanmisaka     if (merangx > 384) {
2323*437bfbebSnyanmisaka         merangx = 384;
2324*437bfbebSnyanmisaka     }
2325*437bfbebSnyanmisaka     if (merangy > 320) {
2326*437bfbebSnyanmisaka         merangy = 320;
2327*437bfbebSnyanmisaka     }
2328*437bfbebSnyanmisaka 
2329*437bfbebSnyanmisaka     if (syn->pp.pic_width  < merangx + 60 || syn->pp.pic_width  <= 352) {
2330*437bfbebSnyanmisaka         if (merangx > syn->pp.pic_width ) {
2331*437bfbebSnyanmisaka             merangx = syn->pp.pic_width;
2332*437bfbebSnyanmisaka         }
2333*437bfbebSnyanmisaka         merangx = merangx / 4 * 2;
2334*437bfbebSnyanmisaka     }
2335*437bfbebSnyanmisaka 
2336*437bfbebSnyanmisaka     if (syn->pp.pic_height < merangy + 60 || syn->pp.pic_height <= 288) {
2337*437bfbebSnyanmisaka         if (merangy > syn->pp.pic_height) {
2338*437bfbebSnyanmisaka             merangy = syn->pp.pic_height;
2339*437bfbebSnyanmisaka         }
2340*437bfbebSnyanmisaka         merangy = merangy / 4 * 2;
2341*437bfbebSnyanmisaka     }
2342*437bfbebSnyanmisaka 
2343*437bfbebSnyanmisaka     {
2344*437bfbebSnyanmisaka         RK_S32 merange_x = merangx / 2;
2345*437bfbebSnyanmisaka         RK_S32 merange_y = merangy / 2;
2346*437bfbebSnyanmisaka         RK_S32 mxneg = ((-(merange_x << 2)) >> 2) / 4;
2347*437bfbebSnyanmisaka         RK_S32 myneg = ((-(merange_y << 2)) >> 2) / 4;
2348*437bfbebSnyanmisaka         RK_S32 mxpos = (((merange_x << 2) - 4) >> 2) / 4;
2349*437bfbebSnyanmisaka         RK_S32 mypos = (((merange_y << 2) - 4) >> 2) / 4;
2350*437bfbebSnyanmisaka 
2351*437bfbebSnyanmisaka         mxneg = MPP_MIN(abs(mxneg), mxpos) * 4;
2352*437bfbebSnyanmisaka         myneg = MPP_MIN(abs(myneg), mypos) * 4;
2353*437bfbebSnyanmisaka 
2354*437bfbebSnyanmisaka         merangx = mxneg * 2;
2355*437bfbebSnyanmisaka         merangy = myneg * 2;
2356*437bfbebSnyanmisaka     }
2357*437bfbebSnyanmisaka     regs->reg0220_me_rnge.cme_srch_h    = merangx / 32;
2358*437bfbebSnyanmisaka     regs->reg0220_me_rnge.cme_srch_v    = merangy / 32;
2359*437bfbebSnyanmisaka 
2360*437bfbebSnyanmisaka     regs->reg0220_me_rnge.rme_srch_h    = 7;
2361*437bfbebSnyanmisaka     regs->reg0220_me_rnge.rme_srch_v    = 5;
2362*437bfbebSnyanmisaka     regs->reg0220_me_rnge.dlt_frm_num    = 0x1;
2363*437bfbebSnyanmisaka 
2364*437bfbebSnyanmisaka     regs->reg0221_me_cfg.pmv_mdst_h    = 5;
2365*437bfbebSnyanmisaka     regs->reg0221_me_cfg.pmv_mdst_v    = 5;
2366*437bfbebSnyanmisaka     regs->reg0221_me_cfg.mv_limit      = 0;
2367*437bfbebSnyanmisaka     regs->reg0221_me_cfg.pmv_num        = 2;
2368*437bfbebSnyanmisaka 
2369*437bfbebSnyanmisaka     //regs->reg0221_me_cfg.rme_dis      = 0;
2370*437bfbebSnyanmisaka     // regs->reg0221_me_cfg.rme_dis        = 2;
2371*437bfbebSnyanmisaka 
2372*437bfbebSnyanmisaka 
2373*437bfbebSnyanmisaka 
2374*437bfbebSnyanmisaka     if (syn->pp.sps_temporal_mvp_enabled_flag &&
2375*437bfbebSnyanmisaka         (ctx->frame_type != INTRA_FRAME)) {
2376*437bfbebSnyanmisaka         if (ctx->last_frame_type == INTRA_FRAME) {
2377*437bfbebSnyanmisaka             regs->reg0221_me_cfg.colmv_load    = 0;
2378*437bfbebSnyanmisaka         } else {
2379*437bfbebSnyanmisaka             regs->reg0221_me_cfg.colmv_load    = 1;
2380*437bfbebSnyanmisaka         }
2381*437bfbebSnyanmisaka         regs->reg0221_me_cfg.colmv_stor   = 1;
2382*437bfbebSnyanmisaka     }
2383*437bfbebSnyanmisaka 
2384*437bfbebSnyanmisaka     if (syn->pp.pic_width > 2688) {
2385*437bfbebSnyanmisaka         regs->reg0222_me_cach.cme_rama_h = 12;
2386*437bfbebSnyanmisaka     } else if (syn->pp.pic_width > 2048) {
2387*437bfbebSnyanmisaka         regs->reg0222_me_cach.cme_rama_h = 16;
2388*437bfbebSnyanmisaka     } else {
2389*437bfbebSnyanmisaka         regs->reg0222_me_cach.cme_rama_h = 20;
2390*437bfbebSnyanmisaka     }
2391*437bfbebSnyanmisaka 
2392*437bfbebSnyanmisaka     {
2393*437bfbebSnyanmisaka         RK_S32 swin_scope_wd16 = (regs->reg0220_me_rnge.cme_srch_h  + 3 + 1) / 4 * 2 + 1;
2394*437bfbebSnyanmisaka         RK_S32 tmpMin = (regs->reg0220_me_rnge.cme_srch_v + 3) / 4 * 2 + 1;
2395*437bfbebSnyanmisaka         if (regs->reg0222_me_cach.cme_rama_h / 4 < tmpMin) {
2396*437bfbebSnyanmisaka             tmpMin = regs->reg0222_me_cach.cme_rama_h / 4;
2397*437bfbebSnyanmisaka         }
2398*437bfbebSnyanmisaka         regs->reg0222_me_cach.cme_rama_max =
2399*437bfbebSnyanmisaka             (pic_wd64 * (tmpMin - 1)) + ((pic_wd64 >= swin_scope_wd16) ? swin_scope_wd16 : pic_wd64 * 2);
2400*437bfbebSnyanmisaka     }
2401*437bfbebSnyanmisaka     regs->reg0222_me_cach.cach_l2_tag      = 0x0;
2402*437bfbebSnyanmisaka 
2403*437bfbebSnyanmisaka     pic_wd64 = pic_wd64 << 6;
2404*437bfbebSnyanmisaka 
2405*437bfbebSnyanmisaka     if (pic_wd64 <= 512)
2406*437bfbebSnyanmisaka         regs->reg0222_me_cach.cach_l2_tag  = 0x0;
2407*437bfbebSnyanmisaka     else if (pic_wd64 <= 1024)
2408*437bfbebSnyanmisaka         regs->reg0222_me_cach.cach_l2_tag  = 0x1;
2409*437bfbebSnyanmisaka     else if (pic_wd64 <= 2048)
2410*437bfbebSnyanmisaka         regs->reg0222_me_cach.cach_l2_tag  = 0x2;
2411*437bfbebSnyanmisaka     else if (pic_wd64 <= 4096)
2412*437bfbebSnyanmisaka         regs->reg0222_me_cach.cach_l2_tag  = 0x3;
2413*437bfbebSnyanmisaka 
2414*437bfbebSnyanmisaka }
2415*437bfbebSnyanmisaka 
vepu580_h265_get_md_info_buf(H265eV580HalContext * ctx)2416*437bfbebSnyanmisaka static MppBuffer vepu580_h265_get_md_info_buf(H265eV580HalContext *ctx)
2417*437bfbebSnyanmisaka {
2418*437bfbebSnyanmisaka     RK_S32 w = ctx->cfg->prep.width;
2419*437bfbebSnyanmisaka     RK_S32 h = ctx->cfg->prep.height;
2420*437bfbebSnyanmisaka     RK_S32 buf_size = (MPP_ALIGN(w, 64) >> 6) * (MPP_ALIGN(h, 64) >> 6) * 32;
2421*437bfbebSnyanmisaka 
2422*437bfbebSnyanmisaka     /* prepare md info internal buffer when deblur is enabled */
2423*437bfbebSnyanmisaka     if (ctx->cfg->tune.deblur_en && (buf_size > ctx->md_info_buf_size)) {
2424*437bfbebSnyanmisaka         if (ctx->md_info_buf) {
2425*437bfbebSnyanmisaka             mpp_buffer_put(ctx->md_info_buf);
2426*437bfbebSnyanmisaka             ctx->md_info_buf = NULL;
2427*437bfbebSnyanmisaka         }
2428*437bfbebSnyanmisaka 
2429*437bfbebSnyanmisaka         if (!ctx->qpmap_grp)
2430*437bfbebSnyanmisaka             mpp_buffer_group_get_internal(&ctx->qpmap_grp, MPP_BUFFER_TYPE_ION);
2431*437bfbebSnyanmisaka 
2432*437bfbebSnyanmisaka         mpp_buffer_get(ctx->qpmap_grp, &ctx->md_info_buf, buf_size);
2433*437bfbebSnyanmisaka         if (!ctx->md_info_buf)
2434*437bfbebSnyanmisaka             mpp_err_f("failed to get md info buffer\n");
2435*437bfbebSnyanmisaka         else {
2436*437bfbebSnyanmisaka             hal_h265e_dbg_flow("get md info internal buffer %p size %d %d\n",
2437*437bfbebSnyanmisaka                                ctx->md_info_buf, buf_size, ctx->md_info_buf_size);
2438*437bfbebSnyanmisaka             ctx->md_info_buf_size = buf_size;
2439*437bfbebSnyanmisaka         }
2440*437bfbebSnyanmisaka     }
2441*437bfbebSnyanmisaka 
2442*437bfbebSnyanmisaka     return ctx->md_info_buf;
2443*437bfbebSnyanmisaka }
2444*437bfbebSnyanmisaka 
vepu580_h265_set_hw_address(H265eV580HalContext * ctx,HalEncTask * task)2445*437bfbebSnyanmisaka void vepu580_h265_set_hw_address(H265eV580HalContext *ctx, HalEncTask *task)
2446*437bfbebSnyanmisaka {
2447*437bfbebSnyanmisaka     Vepu580H265eFrmCfg *frm = ctx->frm;
2448*437bfbebSnyanmisaka     hevc_vepu580_base *regs = &frm->regs_set[0]->reg_base;
2449*437bfbebSnyanmisaka     HalEncTask *enc_task = task;
2450*437bfbebSnyanmisaka     HalBuf *recon_buf, *ref_buf;
2451*437bfbebSnyanmisaka     H265eSyntax_new *syn = ctx->syn;
2452*437bfbebSnyanmisaka 
2453*437bfbebSnyanmisaka     hal_h265e_enter();
2454*437bfbebSnyanmisaka 
2455*437bfbebSnyanmisaka     regs->reg0160_adr_src0     = mpp_buffer_get_fd(enc_task->input);
2456*437bfbebSnyanmisaka     regs->reg0161_adr_src1     = regs->reg0160_adr_src0;
2457*437bfbebSnyanmisaka     regs->reg0162_adr_src2     = regs->reg0160_adr_src0;
2458*437bfbebSnyanmisaka 
2459*437bfbebSnyanmisaka     recon_buf = hal_bufs_get_buf(ctx->dpb_bufs, frm->hal_curr_idx);
2460*437bfbebSnyanmisaka     ref_buf = hal_bufs_get_buf(ctx->dpb_bufs, frm->hal_refr_idx);
2461*437bfbebSnyanmisaka 
2462*437bfbebSnyanmisaka     if (!syn->sp.non_reference_flag) {
2463*437bfbebSnyanmisaka         regs->reg0163_rfpw_h_addr  = mpp_buffer_get_fd(recon_buf->buf[0]);
2464*437bfbebSnyanmisaka         regs->reg0164_rfpw_b_addr  = regs->reg0163_rfpw_h_addr;
2465*437bfbebSnyanmisaka 
2466*437bfbebSnyanmisaka         mpp_dev_multi_offset_update(frm->reg_cfg, 164, ctx->fbc_header_len);
2467*437bfbebSnyanmisaka     }
2468*437bfbebSnyanmisaka     regs->reg0165_rfpr_h_addr = mpp_buffer_get_fd(ref_buf->buf[0]);
2469*437bfbebSnyanmisaka     regs->reg0166_rfpr_b_addr = regs->reg0165_rfpr_h_addr;
2470*437bfbebSnyanmisaka     regs->reg0167_cmvw_addr = mpp_buffer_get_fd(recon_buf->buf[2]);
2471*437bfbebSnyanmisaka     regs->reg0168_cmvr_addr = mpp_buffer_get_fd(ref_buf->buf[2]);
2472*437bfbebSnyanmisaka     regs->reg0169_dspw_addr = mpp_buffer_get_fd(recon_buf->buf[1]);
2473*437bfbebSnyanmisaka     regs->reg0170_dspr_addr = mpp_buffer_get_fd(ref_buf->buf[1]);
2474*437bfbebSnyanmisaka 
2475*437bfbebSnyanmisaka     mpp_dev_multi_offset_update(frm->reg_cfg, 166, ctx->fbc_header_len);
2476*437bfbebSnyanmisaka 
2477*437bfbebSnyanmisaka     if (syn->pp.tiles_enabled_flag) {
2478*437bfbebSnyanmisaka         RK_U32 tile_num = (syn->pp.num_tile_columns_minus1 + 1) * (syn->pp.num_tile_rows_minus1 + 1);
2479*437bfbebSnyanmisaka         RK_U32 i = 0;
2480*437bfbebSnyanmisaka         RK_U32 max_tile_buf_size = MPP_ALIGN(((MPP_ALIGN(syn->pp.pic_height, 64) + 64) << 5), 256);
2481*437bfbebSnyanmisaka 
2482*437bfbebSnyanmisaka         if (NULL == ctx->tile_grp)
2483*437bfbebSnyanmisaka             mpp_buffer_group_get_internal(&ctx->tile_grp, MPP_BUFFER_TYPE_ION);
2484*437bfbebSnyanmisaka 
2485*437bfbebSnyanmisaka         mpp_assert(ctx->tile_grp);
2486*437bfbebSnyanmisaka 
2487*437bfbebSnyanmisaka         for (i = 0; i < MAX_TILE_NUM; i++) {
2488*437bfbebSnyanmisaka             if (NULL == frm->hw_tile_buf[i]) {
2489*437bfbebSnyanmisaka                 mpp_buffer_get(ctx->tile_grp, &frm->hw_tile_buf[i], max_tile_buf_size);
2490*437bfbebSnyanmisaka             }
2491*437bfbebSnyanmisaka         }
2492*437bfbebSnyanmisaka 
2493*437bfbebSnyanmisaka         if (NULL == frm->hw_tile_stream[0]) {
2494*437bfbebSnyanmisaka             mpp_buffer_get(ctx->tile_grp, &frm->hw_tile_stream[0], ctx->frame_size / tile_num);
2495*437bfbebSnyanmisaka         }
2496*437bfbebSnyanmisaka 
2497*437bfbebSnyanmisaka         if (tile_num > 2) {
2498*437bfbebSnyanmisaka             if (NULL == frm->hw_tile_stream[1]) {
2499*437bfbebSnyanmisaka                 mpp_buffer_get(ctx->tile_grp, &frm->hw_tile_stream[1], ctx->frame_size / tile_num);
2500*437bfbebSnyanmisaka             }
2501*437bfbebSnyanmisaka             if (NULL == frm->hw_tile_stream[2]) {
2502*437bfbebSnyanmisaka                 mpp_buffer_get(ctx->tile_grp, &frm->hw_tile_stream[2], ctx->frame_size / tile_num);
2503*437bfbebSnyanmisaka             }
2504*437bfbebSnyanmisaka         }
2505*437bfbebSnyanmisaka 
2506*437bfbebSnyanmisaka         regs->reg0176_lpfw_addr  = mpp_buffer_get_fd(frm->hw_tile_buf[0]);
2507*437bfbebSnyanmisaka         regs->reg0177_lpfr_addr  = mpp_buffer_get_fd(frm->hw_tile_buf[1]);
2508*437bfbebSnyanmisaka     }
2509*437bfbebSnyanmisaka 
2510*437bfbebSnyanmisaka     {
2511*437bfbebSnyanmisaka         if (!enc_task->md_info)
2512*437bfbebSnyanmisaka             enc_task->md_info = vepu580_h265_get_md_info_buf(ctx);
2513*437bfbebSnyanmisaka 
2514*437bfbebSnyanmisaka         if (enc_task->md_info) {
2515*437bfbebSnyanmisaka             regs->reg0192_enc_pic.mei_stor    = 1;
2516*437bfbebSnyanmisaka             regs->reg0171_meiw_addr = mpp_buffer_get_fd(enc_task->md_info);
2517*437bfbebSnyanmisaka         } else {
2518*437bfbebSnyanmisaka             regs->reg0192_enc_pic.mei_stor    = 0;
2519*437bfbebSnyanmisaka             regs->reg0171_meiw_addr = 0;
2520*437bfbebSnyanmisaka         }
2521*437bfbebSnyanmisaka     }
2522*437bfbebSnyanmisaka 
2523*437bfbebSnyanmisaka     regs->reg0172_bsbt_addr = mpp_buffer_get_fd(enc_task->output);
2524*437bfbebSnyanmisaka     /* TODO: stream size relative with syntax */
2525*437bfbebSnyanmisaka     regs->reg0173_bsbb_addr = regs->reg0172_bsbt_addr;
2526*437bfbebSnyanmisaka     regs->reg0174_bsbr_addr = regs->reg0172_bsbt_addr;
2527*437bfbebSnyanmisaka     regs->reg0175_adr_bsbs  = regs->reg0172_bsbt_addr;
2528*437bfbebSnyanmisaka 
2529*437bfbebSnyanmisaka     mpp_dev_multi_offset_update(frm->reg_cfg, 175, mpp_packet_get_length(task->packet));
2530*437bfbebSnyanmisaka     mpp_dev_multi_offset_update(frm->reg_cfg, 172, mpp_buffer_get_size(enc_task->output));
2531*437bfbebSnyanmisaka 
2532*437bfbebSnyanmisaka     regs->reg0204_pic_ofst.pic_ofst_y = mpp_frame_get_offset_y(task->frame);
2533*437bfbebSnyanmisaka     regs->reg0204_pic_ofst.pic_ofst_x = mpp_frame_get_offset_x(task->frame);
2534*437bfbebSnyanmisaka }
2535*437bfbebSnyanmisaka 
vepu580_h265e_save_pass1_patch(H265eV580RegSet * regs,H265eV580HalContext * ctx,RK_S32 tiles_enabled_flag)2536*437bfbebSnyanmisaka static MPP_RET vepu580_h265e_save_pass1_patch(H265eV580RegSet *regs, H265eV580HalContext *ctx,
2537*437bfbebSnyanmisaka                                               RK_S32 tiles_enabled_flag)
2538*437bfbebSnyanmisaka {
2539*437bfbebSnyanmisaka     Vepu580H265eFrmCfg *frm = ctx->frm;
2540*437bfbebSnyanmisaka     hevc_vepu580_base *reg_base = &regs->reg_base;
2541*437bfbebSnyanmisaka     RK_S32 width = ctx->cfg->prep.width;
2542*437bfbebSnyanmisaka     RK_S32 height = ctx->cfg->prep.height;
2543*437bfbebSnyanmisaka     RK_S32 width_align = MPP_ALIGN(width, 64);
2544*437bfbebSnyanmisaka     RK_S32 height_align = MPP_ALIGN(height, 16);
2545*437bfbebSnyanmisaka 
2546*437bfbebSnyanmisaka     if (NULL == ctx->buf_pass1) {
2547*437bfbebSnyanmisaka         mpp_buffer_get(NULL, &ctx->buf_pass1, width_align * height_align * 3 / 2);
2548*437bfbebSnyanmisaka         if (!ctx->buf_pass1) {
2549*437bfbebSnyanmisaka             mpp_err("buf_pass1 malloc fail, debreath invaild");
2550*437bfbebSnyanmisaka             return MPP_NOK;
2551*437bfbebSnyanmisaka         }
2552*437bfbebSnyanmisaka     }
2553*437bfbebSnyanmisaka 
2554*437bfbebSnyanmisaka     reg_base->reg0192_enc_pic.cur_frm_ref = 1;
2555*437bfbebSnyanmisaka     reg_base->reg0163_rfpw_h_addr = mpp_buffer_get_fd(ctx->buf_pass1);
2556*437bfbebSnyanmisaka     reg_base->reg0164_rfpw_b_addr = reg_base->reg0163_rfpw_h_addr;
2557*437bfbebSnyanmisaka     reg_base->reg0192_enc_pic.rec_fbc_dis = 1;
2558*437bfbebSnyanmisaka 
2559*437bfbebSnyanmisaka     if (tiles_enabled_flag)
2560*437bfbebSnyanmisaka         reg_base->reg0238_synt_pps.lpf_fltr_acrs_til = 0;
2561*437bfbebSnyanmisaka 
2562*437bfbebSnyanmisaka     mpp_dev_multi_offset_update(frm->reg_cfg, 164, width_align * height_align);
2563*437bfbebSnyanmisaka 
2564*437bfbebSnyanmisaka     /* NOTE: disable split to avoid lowdelay slice output */
2565*437bfbebSnyanmisaka     regs->reg_base.reg0216_sli_splt.sli_splt = 0;
2566*437bfbebSnyanmisaka     regs->reg_base.reg0192_enc_pic.slen_fifo = 0;
2567*437bfbebSnyanmisaka 
2568*437bfbebSnyanmisaka     return MPP_OK;
2569*437bfbebSnyanmisaka }
2570*437bfbebSnyanmisaka 
vepu580_h265e_use_pass1_patch(H265eV580RegSet * regs,H265eV580HalContext * ctx)2571*437bfbebSnyanmisaka static MPP_RET vepu580_h265e_use_pass1_patch(H265eV580RegSet *regs, H265eV580HalContext *ctx)
2572*437bfbebSnyanmisaka {
2573*437bfbebSnyanmisaka     Vepu580H265eFrmCfg *frm = ctx->frm;
2574*437bfbebSnyanmisaka     hevc_vepu580_control_cfg *reg_ctl = &regs->reg_ctl;
2575*437bfbebSnyanmisaka     hevc_vepu580_base *reg_base = &regs->reg_base;
2576*437bfbebSnyanmisaka     RK_U32 hor_stride = MPP_ALIGN(ctx->cfg->prep.width, 64);
2577*437bfbebSnyanmisaka     RK_U32 ver_stride = MPP_ALIGN(ctx->cfg->prep.height, 16);
2578*437bfbebSnyanmisaka     RK_U32 frame_size = hor_stride * ver_stride;
2579*437bfbebSnyanmisaka     VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
2580*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
2581*437bfbebSnyanmisaka 
2582*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.src_bus_edin = fmt->src_endian;
2583*437bfbebSnyanmisaka     reg_base->reg0198_src_fmt.src_cfmt = VEPU5xx_FMT_YUV420SP;
2584*437bfbebSnyanmisaka     reg_base->reg0198_src_fmt.alpha_swap = 0;
2585*437bfbebSnyanmisaka     reg_base->reg0198_src_fmt.rbuv_swap = 0;
2586*437bfbebSnyanmisaka     reg_base->reg0198_src_fmt.out_fmt = 1;
2587*437bfbebSnyanmisaka     reg_base->reg0203_src_proc.afbcd_en = 0;
2588*437bfbebSnyanmisaka     reg_base->reg0205_src_strd0.src_strd0 = hor_stride;
2589*437bfbebSnyanmisaka     reg_base->reg0206_src_strd1.src_strd1 = hor_stride;
2590*437bfbebSnyanmisaka     reg_base->reg0203_src_proc.src_mirr = 0;
2591*437bfbebSnyanmisaka     reg_base->reg0203_src_proc.src_rot = 0;
2592*437bfbebSnyanmisaka     reg_base->reg0204_pic_ofst.pic_ofst_x = 0;
2593*437bfbebSnyanmisaka     reg_base->reg0204_pic_ofst.pic_ofst_y = 0;
2594*437bfbebSnyanmisaka     reg_base->reg0160_adr_src0 = mpp_buffer_get_fd(ctx->buf_pass1);
2595*437bfbebSnyanmisaka     reg_base->reg0161_adr_src1 = reg_base->reg0160_adr_src0;
2596*437bfbebSnyanmisaka     reg_base->reg0162_adr_src2 = reg_base->reg0160_adr_src0;
2597*437bfbebSnyanmisaka 
2598*437bfbebSnyanmisaka     /* input cb addr */
2599*437bfbebSnyanmisaka     ret = mpp_dev_multi_offset_update(frm->reg_cfg, 161, frame_size);
2600*437bfbebSnyanmisaka     if (ret)
2601*437bfbebSnyanmisaka         mpp_err_f("set input cb addr offset failed %d\n", ret);
2602*437bfbebSnyanmisaka 
2603*437bfbebSnyanmisaka     /* input cr addr */
2604*437bfbebSnyanmisaka     ret = mpp_dev_multi_offset_update(frm->reg_cfg, 162, frame_size);
2605*437bfbebSnyanmisaka     if (ret)
2606*437bfbebSnyanmisaka         mpp_err_f("set input cr addr offset failed %d\n", ret);
2607*437bfbebSnyanmisaka 
2608*437bfbebSnyanmisaka     return MPP_OK;
2609*437bfbebSnyanmisaka }
2610*437bfbebSnyanmisaka 
vepu580_setup_split(H265eV580RegSet * regs,MppEncCfgSet * enc_cfg,RK_U32 title_en)2611*437bfbebSnyanmisaka static void vepu580_setup_split(H265eV580RegSet *regs, MppEncCfgSet *enc_cfg, RK_U32 title_en)
2612*437bfbebSnyanmisaka {
2613*437bfbebSnyanmisaka     MppEncSliceSplit *cfg = &enc_cfg->split;
2614*437bfbebSnyanmisaka 
2615*437bfbebSnyanmisaka     hal_h265e_dbg_func("enter\n");
2616*437bfbebSnyanmisaka 
2617*437bfbebSnyanmisaka     switch (cfg->split_mode) {
2618*437bfbebSnyanmisaka     case MPP_ENC_SPLIT_NONE : {
2619*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt = 0;
2620*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt_mode = 0;
2621*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt_cpst = 0;
2622*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_max_num_m1 = 0;
2623*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_flsh = 0;
2624*437bfbebSnyanmisaka         regs->reg_base.reg0218_sli_cnum.sli_splt_cnum_m1 = 0;
2625*437bfbebSnyanmisaka 
2626*437bfbebSnyanmisaka         regs->reg_base.reg0217_sli_byte.sli_splt_byte = 0;
2627*437bfbebSnyanmisaka         regs->reg_base.reg0192_enc_pic.slen_fifo = 0;
2628*437bfbebSnyanmisaka     } break;
2629*437bfbebSnyanmisaka     case MPP_ENC_SPLIT_BY_BYTE : {
2630*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt = 1;
2631*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt_mode = 0;
2632*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt_cpst = 0;
2633*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_max_num_m1 = 500;
2634*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_flsh = 1;
2635*437bfbebSnyanmisaka         regs->reg_base.reg0218_sli_cnum.sli_splt_cnum_m1 = 0;
2636*437bfbebSnyanmisaka 
2637*437bfbebSnyanmisaka         regs->reg_base.reg0217_sli_byte.sli_splt_byte = cfg->split_arg;
2638*437bfbebSnyanmisaka         regs->reg_base.reg0192_enc_pic.slen_fifo = cfg->split_out ? 1 : 0;
2639*437bfbebSnyanmisaka         regs->reg_ctl.reg0008_int_en.slc_done_en = regs->reg_base.reg0192_enc_pic.slen_fifo;
2640*437bfbebSnyanmisaka     } break;
2641*437bfbebSnyanmisaka     case MPP_ENC_SPLIT_BY_CTU : {
2642*437bfbebSnyanmisaka         RK_U32 mb_w = MPP_ALIGN(enc_cfg->prep.width, 64) / 64;
2643*437bfbebSnyanmisaka         RK_U32 mb_h = MPP_ALIGN(enc_cfg->prep.height, 64) / 64;
2644*437bfbebSnyanmisaka         RK_U32 slice_num = 0;
2645*437bfbebSnyanmisaka 
2646*437bfbebSnyanmisaka         if (title_en)
2647*437bfbebSnyanmisaka             mb_w = mb_w / 2;
2648*437bfbebSnyanmisaka 
2649*437bfbebSnyanmisaka         slice_num = (mb_w * mb_h + cfg->split_arg - 1) / cfg->split_arg;
2650*437bfbebSnyanmisaka 
2651*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt = 1;
2652*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt_mode = 1;
2653*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt_cpst = 0;
2654*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_max_num_m1 = 500;
2655*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_flsh = 1;
2656*437bfbebSnyanmisaka         regs->reg_base.reg0218_sli_cnum.sli_splt_cnum_m1 = cfg->split_arg - 1;
2657*437bfbebSnyanmisaka 
2658*437bfbebSnyanmisaka         regs->reg_base.reg0217_sli_byte.sli_splt_byte = 0;
2659*437bfbebSnyanmisaka         regs->reg_base.reg0192_enc_pic.slen_fifo = cfg->split_out ? 1 : 0;
2660*437bfbebSnyanmisaka 
2661*437bfbebSnyanmisaka         if ((cfg->split_out & MPP_ENC_SPLIT_OUT_LOWDELAY) ||
2662*437bfbebSnyanmisaka             (regs->reg_base.reg0192_enc_pic.slen_fifo && (slice_num > VEPU580_SLICE_FIFO_LEN)))
2663*437bfbebSnyanmisaka             regs->reg_ctl.reg0008_int_en.slc_done_en = 1 ;
2664*437bfbebSnyanmisaka     } break;
2665*437bfbebSnyanmisaka     default : {
2666*437bfbebSnyanmisaka         mpp_log_f("invalide slice split mode %d\n", cfg->split_mode);
2667*437bfbebSnyanmisaka     } break;
2668*437bfbebSnyanmisaka     }
2669*437bfbebSnyanmisaka 
2670*437bfbebSnyanmisaka     hal_h265e_dbg_func("leave\n");
2671*437bfbebSnyanmisaka }
2672*437bfbebSnyanmisaka 
hal_h265e_v580_gen_regs(void * hal,HalEncTask * task)2673*437bfbebSnyanmisaka MPP_RET hal_h265e_v580_gen_regs(void *hal, HalEncTask *task)
2674*437bfbebSnyanmisaka {
2675*437bfbebSnyanmisaka     H265eV580HalContext *ctx = (H265eV580HalContext *)hal;
2676*437bfbebSnyanmisaka     HalEncTask *enc_task = task;
2677*437bfbebSnyanmisaka     EncRcTask *rc_task = enc_task->rc_task;
2678*437bfbebSnyanmisaka     EncFrmStatus *frm = &rc_task->frm;
2679*437bfbebSnyanmisaka     H265eSyntax_new *syn = ctx->syn;
2680*437bfbebSnyanmisaka     Vepu580H265eFrmCfg *frm_cfg = ctx->frm;
2681*437bfbebSnyanmisaka     H265eV580RegSet *regs = frm_cfg->regs_set[0];
2682*437bfbebSnyanmisaka     RK_U32 pic_width_align8, pic_height_align8;
2683*437bfbebSnyanmisaka     RK_S32 pic_wd64, pic_h64;
2684*437bfbebSnyanmisaka     VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
2685*437bfbebSnyanmisaka     hevc_vepu580_control_cfg *reg_ctl = &regs->reg_ctl;
2686*437bfbebSnyanmisaka     hevc_vepu580_base        *reg_base = &regs->reg_base;
2687*437bfbebSnyanmisaka     hevc_vepu580_rc_klut *reg_klut = &regs->reg_rc_klut;
2688*437bfbebSnyanmisaka     MppEncCfgSet *cfg = ctx->cfg;
2689*437bfbebSnyanmisaka 
2690*437bfbebSnyanmisaka     hal_h265e_enter();
2691*437bfbebSnyanmisaka     pic_width_align8 = (syn->pp.pic_width + 7) & (~7);
2692*437bfbebSnyanmisaka     pic_height_align8 = (syn->pp.pic_height + 7) & (~7);
2693*437bfbebSnyanmisaka     pic_wd64 = (syn->pp.pic_width + 63) / 64;
2694*437bfbebSnyanmisaka     pic_h64 = (syn->pp.pic_height + 63) / 64;
2695*437bfbebSnyanmisaka 
2696*437bfbebSnyanmisaka     hal_h265e_dbg_simple("frame %d | type %d | start gen regs",
2697*437bfbebSnyanmisaka                          frm_cfg->frame_count, ctx->frame_type);
2698*437bfbebSnyanmisaka 
2699*437bfbebSnyanmisaka     memset(regs, 0, sizeof(H265eV580RegSet));
2700*437bfbebSnyanmisaka 
2701*437bfbebSnyanmisaka     if (ctx->task_cnt > 1)
2702*437bfbebSnyanmisaka         setup_vepu580_dual_core(ctx);
2703*437bfbebSnyanmisaka 
2704*437bfbebSnyanmisaka     reg_ctl->reg0004_enc_strt.lkt_num      = 0;
2705*437bfbebSnyanmisaka     reg_ctl->reg0004_enc_strt.vepu_cmd     = ctx->enc_mode;
2706*437bfbebSnyanmisaka     reg_ctl->reg0005_enc_clr.safe_clr      = 0x0;
2707*437bfbebSnyanmisaka     reg_ctl->reg0005_enc_clr.force_clr     = 0x0;
2708*437bfbebSnyanmisaka 
2709*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.enc_done_en         = 1;
2710*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.lkt_node_done_en    = 1;
2711*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.sclr_done_en        = 1;
2712*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.slc_done_en         = 0;
2713*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.bsf_oflw_en         = 1;
2714*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.brsp_otsd_en        = 1;
2715*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.wbus_err_en         = 1;
2716*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.rbus_err_en         = 1;
2717*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.wdg_en              = 1;
2718*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.lkt_err_int_en      = 0;
2719*437bfbebSnyanmisaka 
2720*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.lpfw_bus_ordr    = 0x0;
2721*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.cmvw_bus_ordr    = 0x0;
2722*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.dspw_bus_ordr    = 0x0;
2723*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.rfpw_bus_ordr    = 0x0;
2724*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.src_bus_edin     = 0x0;
2725*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.meiw_bus_edin    = 0x0;
2726*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.bsw_bus_edin     = 0x7;
2727*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.lktr_bus_edin    = 0x0;
2728*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.roir_bus_edin    = 0x0;
2729*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.lktw_bus_edin    = 0x0;
2730*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.afbc_bsize       = 0x1;
2731*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.ebufw_bus_ordr   = 0x0;
2732*437bfbebSnyanmisaka 
2733*437bfbebSnyanmisaka     reg_ctl->reg0013_dtrns_cfg.dspr_otsd        = (ctx->frame_type == INTER_P_FRAME);
2734*437bfbebSnyanmisaka     reg_ctl->reg0013_dtrns_cfg.axi_brsp_cke     = 0x0;
2735*437bfbebSnyanmisaka     reg_ctl->reg0014_enc_wdg.vs_load_thd        = 0x1fffff;
2736*437bfbebSnyanmisaka     reg_ctl->reg0014_enc_wdg.rfp_load_thd       = 0;
2737*437bfbebSnyanmisaka 
2738*437bfbebSnyanmisaka     reg_ctl->reg0021_func_en.cke                = 1;
2739*437bfbebSnyanmisaka     reg_ctl->reg0021_func_en.resetn_hw_en       = 1;
2740*437bfbebSnyanmisaka     reg_ctl->reg0021_func_en.enc_done_tmvp_en   = 1;
2741*437bfbebSnyanmisaka 
2742*437bfbebSnyanmisaka     reg_base->reg0196_enc_rsl.pic_wd8_m1    = pic_width_align8 / 8 - 1;
2743*437bfbebSnyanmisaka     reg_base->reg0197_src_fill.pic_wfill    = (syn->pp.pic_width & 0x7)
2744*437bfbebSnyanmisaka                                               ? (8 - (syn->pp.pic_width & 0x7)) : 0;
2745*437bfbebSnyanmisaka     reg_base->reg0196_enc_rsl.pic_hd8_m1    = pic_height_align8 / 8 - 1;
2746*437bfbebSnyanmisaka     reg_base->reg0197_src_fill.pic_hfill    = (syn->pp.pic_height & 0x7)
2747*437bfbebSnyanmisaka                                               ? (8 - (syn->pp.pic_height & 0x7)) : 0;
2748*437bfbebSnyanmisaka 
2749*437bfbebSnyanmisaka     reg_base->reg0192_enc_pic.enc_stnd      = 1; //H265
2750*437bfbebSnyanmisaka     reg_base->reg0192_enc_pic.cur_frm_ref   = !syn->sp.non_reference_flag; //current frame will be refered
2751*437bfbebSnyanmisaka     reg_base->reg0192_enc_pic.bs_scp        = 1;
2752*437bfbebSnyanmisaka     reg_base->reg0192_enc_pic.log2_ctu_num  = ceil(log2((double)pic_wd64 * pic_h64));
2753*437bfbebSnyanmisaka 
2754*437bfbebSnyanmisaka     reg_base->reg0203_src_proc.src_mirr = 0;
2755*437bfbebSnyanmisaka     reg_base->reg0203_src_proc.src_rot  = 0;
2756*437bfbebSnyanmisaka     reg_base->reg0203_src_proc.txa_en   = 1;
2757*437bfbebSnyanmisaka     reg_base->reg0203_src_proc.afbcd_en = (MPP_FRAME_FMT_IS_FBC(syn->pp.mpp_format)) ? 1 : 0;
2758*437bfbebSnyanmisaka 
2759*437bfbebSnyanmisaka     reg_klut->klut_ofst.chrm_klut_ofst = (ctx->frame_type == INTRA_FRAME) ? 0 : 3;
2760*437bfbebSnyanmisaka     memcpy(&reg_klut->klut_wgt0, &klut_weight[0], sizeof(klut_weight));
2761*437bfbebSnyanmisaka 
2762*437bfbebSnyanmisaka     vepu580_h265_set_me_regs(ctx, syn, reg_base);
2763*437bfbebSnyanmisaka 
2764*437bfbebSnyanmisaka     reg_base->reg0232_rdo_cfg.chrm_spcl   = 1;
2765*437bfbebSnyanmisaka     reg_base->reg0232_rdo_cfg.cu_inter_e    = 0x06db;
2766*437bfbebSnyanmisaka     reg_base->reg0232_rdo_cfg.cu_intra_e    = 0xf;
2767*437bfbebSnyanmisaka 
2768*437bfbebSnyanmisaka     if (syn->pp.num_long_term_ref_pics_sps) {
2769*437bfbebSnyanmisaka         reg_base->reg0232_rdo_cfg.ltm_col   = 0;
2770*437bfbebSnyanmisaka         reg_base->reg0232_rdo_cfg.ltm_idx0l0 = 1;
2771*437bfbebSnyanmisaka     } else {
2772*437bfbebSnyanmisaka         reg_base->reg0232_rdo_cfg.ltm_col   = 0;
2773*437bfbebSnyanmisaka         reg_base->reg0232_rdo_cfg.ltm_idx0l0 = 0;
2774*437bfbebSnyanmisaka     }
2775*437bfbebSnyanmisaka 
2776*437bfbebSnyanmisaka     reg_base->reg0232_rdo_cfg.ccwa_e = 1;
2777*437bfbebSnyanmisaka     reg_base->reg0232_rdo_cfg.scl_lst_sel = syn->pp.scaling_list_enabled_flag;
2778*437bfbebSnyanmisaka     reg_base->reg0236_synt_nal.nal_unit_type = h265e_get_nal_type(&syn->sp, ctx->frame_type);
2779*437bfbebSnyanmisaka 
2780*437bfbebSnyanmisaka     vepu580_h265_set_hw_address(ctx, task);
2781*437bfbebSnyanmisaka     vepu580_h265_set_pp_regs(regs, fmt, &ctx->cfg->prep, task);
2782*437bfbebSnyanmisaka     vepu580_h265_set_rc_regs(ctx, regs, task);
2783*437bfbebSnyanmisaka     vepu580_h265_set_slice_regs(syn, reg_base);
2784*437bfbebSnyanmisaka     vepu580_h265_set_ref_regs(syn, reg_base);
2785*437bfbebSnyanmisaka 
2786*437bfbebSnyanmisaka     vepu580_set_osd(&ctx->frm->osd_cfg);
2787*437bfbebSnyanmisaka     /* ROI configure */
2788*437bfbebSnyanmisaka     vepu580_h265_set_roi_regs(ctx, reg_base);
2789*437bfbebSnyanmisaka     if (frm->is_i_refresh)
2790*437bfbebSnyanmisaka         setup_intra_refresh(ctx, frm->seq_idx % ctx->cfg->rc.gop);
2791*437bfbebSnyanmisaka 
2792*437bfbebSnyanmisaka     if (cfg->tune.deblur_en && (!rc_task->info.complex_scene) &&
2793*437bfbebSnyanmisaka         cfg->rc.rc_mode == MPP_ENC_RC_MODE_SMTRC && task->md_info &&
2794*437bfbebSnyanmisaka         cfg->tune.scene_mode == MPP_ENC_SCENE_MODE_IPC) {
2795*437bfbebSnyanmisaka         if (MPP_OK != vepu580_setup_qpmap_buf(ctx))
2796*437bfbebSnyanmisaka             mpp_err("qpmap malloc buffer failed!\n");
2797*437bfbebSnyanmisaka     }
2798*437bfbebSnyanmisaka 
2799*437bfbebSnyanmisaka     /*paramet cfg*/
2800*437bfbebSnyanmisaka     vepu580_h265_global_cfg_set(ctx, regs);
2801*437bfbebSnyanmisaka 
2802*437bfbebSnyanmisaka     vepu580_h265e_tune_reg_patch(ctx->tune);
2803*437bfbebSnyanmisaka 
2804*437bfbebSnyanmisaka     vepu580_setup_split(regs, cfg, syn->pp.tiles_enabled_flag);
2805*437bfbebSnyanmisaka 
2806*437bfbebSnyanmisaka     hal_h265e_leave();
2807*437bfbebSnyanmisaka     return MPP_OK;
2808*437bfbebSnyanmisaka }
2809*437bfbebSnyanmisaka 
hal_h265e_v580_set_uniform_tile(hevc_vepu580_base * regs,H265eSyntax_new * syn,RK_U32 index,RK_S32 tile_start_x)2810*437bfbebSnyanmisaka void hal_h265e_v580_set_uniform_tile(hevc_vepu580_base *regs, H265eSyntax_new *syn,
2811*437bfbebSnyanmisaka                                      RK_U32 index, RK_S32 tile_start_x)
2812*437bfbebSnyanmisaka {
2813*437bfbebSnyanmisaka     if (syn->pp.tiles_enabled_flag) {
2814*437bfbebSnyanmisaka         RK_S32 mb_h = MPP_ALIGN(syn->pp.pic_height, 64) / 64;
2815*437bfbebSnyanmisaka         RK_S32 tile_width = syn->pp.column_width_minus1[index] + 1;
2816*437bfbebSnyanmisaka 
2817*437bfbebSnyanmisaka         if (!regs->reg0192_enc_pic.cur_frm_ref &&
2818*437bfbebSnyanmisaka             !(regs->reg0238_synt_pps.lpf_fltr_acrs_til &&
2819*437bfbebSnyanmisaka               regs->reg0238_synt_pps.lp_fltr_acrs_sli &&
2820*437bfbebSnyanmisaka               regs->reg0240_synt_sli1.sli_lp_fltr_acrs_sli &&
2821*437bfbebSnyanmisaka               regs->reg0237_synt_sps.smpl_adpt_ofst_e &&
2822*437bfbebSnyanmisaka               (regs->reg0239_synt_sli0.sli_sao_luma_flg ||
2823*437bfbebSnyanmisaka                (regs->reg0239_synt_sli0.sli_sao_chrm_flg && regs->reg0198_src_fmt.out_fmt)))) {
2824*437bfbebSnyanmisaka             regs->reg0193_dual_core.dchs_txe = 0;
2825*437bfbebSnyanmisaka             regs->reg0193_dual_core.dchs_rxe = 0;
2826*437bfbebSnyanmisaka         } else if (index > 0) {
2827*437bfbebSnyanmisaka             regs->reg0193_dual_core.dchs_txid = index;
2828*437bfbebSnyanmisaka             regs->reg0193_dual_core.dchs_rxid = index - 1;
2829*437bfbebSnyanmisaka             regs->reg0193_dual_core.dchs_txe = 1;
2830*437bfbebSnyanmisaka             regs->reg0193_dual_core.dchs_rxe = 1;
2831*437bfbebSnyanmisaka         } else {
2832*437bfbebSnyanmisaka             regs->reg0193_dual_core.dchs_txid = index;
2833*437bfbebSnyanmisaka             regs->reg0193_dual_core.dchs_rxid = 0;
2834*437bfbebSnyanmisaka             regs->reg0193_dual_core.dchs_txe = 1;
2835*437bfbebSnyanmisaka             regs->reg0193_dual_core.dchs_rxe = 0;
2836*437bfbebSnyanmisaka         }
2837*437bfbebSnyanmisaka         /* dual core runtime offset should set to 2 to avoid data access conflict */
2838*437bfbebSnyanmisaka         regs->reg0193_dual_core.dchs_ofst = 2;
2839*437bfbebSnyanmisaka 
2840*437bfbebSnyanmisaka         if (index == syn->pp.num_tile_columns_minus1) {
2841*437bfbebSnyanmisaka             regs->reg0193_dual_core.dchs_txid = 0;
2842*437bfbebSnyanmisaka             regs->reg0193_dual_core.dchs_txe = 0;
2843*437bfbebSnyanmisaka         }
2844*437bfbebSnyanmisaka         regs->reg0252_tile_cfg.tile_w_m1 = tile_width - 1;
2845*437bfbebSnyanmisaka         regs->reg0252_tile_cfg.tile_h_m1 = mb_h - 1;
2846*437bfbebSnyanmisaka         regs->reg212_rc_cfg.rc_ctu_num   = tile_width;
2847*437bfbebSnyanmisaka         regs->reg0252_tile_cfg.tile_en = syn->pp.tiles_enabled_flag;
2848*437bfbebSnyanmisaka         regs->reg0253_tile_pos.tile_x = tile_start_x;
2849*437bfbebSnyanmisaka         regs->reg0253_tile_pos.tile_y = 0;
2850*437bfbebSnyanmisaka 
2851*437bfbebSnyanmisaka         hal_h265e_dbg_detail("tile_x %d, rc_ctu_num %d, tile_width_m1 %d",
2852*437bfbebSnyanmisaka                              regs->reg0253_tile_pos.tile_x, regs->reg212_rc_cfg.rc_ctu_num,
2853*437bfbebSnyanmisaka                              regs->reg0252_tile_cfg.tile_w_m1);
2854*437bfbebSnyanmisaka     }
2855*437bfbebSnyanmisaka }
2856*437bfbebSnyanmisaka 
hal_h265e_v580_start(void * hal,HalEncTask * enc_task)2857*437bfbebSnyanmisaka MPP_RET hal_h265e_v580_start(void *hal, HalEncTask *enc_task)
2858*437bfbebSnyanmisaka {
2859*437bfbebSnyanmisaka     H265eV580HalContext *ctx = (H265eV580HalContext *)hal;
2860*437bfbebSnyanmisaka     H265eSyntax_new *syn = ctx->syn;
2861*437bfbebSnyanmisaka     RK_U32 tile_num = (syn->pp.num_tile_columns_minus1 + 1) * (syn->pp.num_tile_rows_minus1 + 1);
2862*437bfbebSnyanmisaka     RK_U32 stream_len = 0;
2863*437bfbebSnyanmisaka     VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
2864*437bfbebSnyanmisaka     Vepu580H265eFrmCfg *frm = ctx->frm;
2865*437bfbebSnyanmisaka     RK_U32 k = 0;
2866*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
2867*437bfbebSnyanmisaka     RK_S32 tile_start_x = 0;
2868*437bfbebSnyanmisaka 
2869*437bfbebSnyanmisaka     hal_h265e_enter();
2870*437bfbebSnyanmisaka 
2871*437bfbebSnyanmisaka     ctx->tile_num = tile_num;
2872*437bfbebSnyanmisaka 
2873*437bfbebSnyanmisaka     if (enc_task->flags.err) {
2874*437bfbebSnyanmisaka         hal_h265e_err("enc_task->flags.err %08x, return e arly",
2875*437bfbebSnyanmisaka                       enc_task->flags.err);
2876*437bfbebSnyanmisaka         return MPP_NOK;
2877*437bfbebSnyanmisaka     }
2878*437bfbebSnyanmisaka 
2879*437bfbebSnyanmisaka     if (tile_num > MAX_TILE_NUM) {
2880*437bfbebSnyanmisaka         mpp_log("tile_num big then support %d, max %d", tile_num, MAX_TILE_NUM);
2881*437bfbebSnyanmisaka         return MPP_NOK;
2882*437bfbebSnyanmisaka     }
2883*437bfbebSnyanmisaka 
2884*437bfbebSnyanmisaka     for (k = 0; k < tile_num; k++) {
2885*437bfbebSnyanmisaka         H265eV580RegSet *hw_regs = frm->regs_set[k];
2886*437bfbebSnyanmisaka         hevc_vepu580_base *reg_base = NULL;
2887*437bfbebSnyanmisaka         H265eV580StatusElem *reg_out = frm->regs_ret[k];
2888*437bfbebSnyanmisaka 
2889*437bfbebSnyanmisaka         if (!hw_regs) {
2890*437bfbebSnyanmisaka             hw_regs = mpp_malloc(H265eV580RegSet, 1);
2891*437bfbebSnyanmisaka             frm->regs_set[k] = hw_regs;
2892*437bfbebSnyanmisaka         }
2893*437bfbebSnyanmisaka         if (!reg_out) {
2894*437bfbebSnyanmisaka             reg_out = mpp_malloc(H265eV580StatusElem, 1);
2895*437bfbebSnyanmisaka             frm->regs_ret[k] = reg_out;
2896*437bfbebSnyanmisaka         }
2897*437bfbebSnyanmisaka 
2898*437bfbebSnyanmisaka         reg_base = &hw_regs->reg_base;
2899*437bfbebSnyanmisaka 
2900*437bfbebSnyanmisaka         if (k)
2901*437bfbebSnyanmisaka             memcpy(hw_regs, frm->regs_set[0], sizeof(*hw_regs));
2902*437bfbebSnyanmisaka 
2903*437bfbebSnyanmisaka         vepu580_h265_set_me_ram(syn, reg_base, k, tile_start_x);
2904*437bfbebSnyanmisaka 
2905*437bfbebSnyanmisaka         /* set input info */
2906*437bfbebSnyanmisaka         vepu580_h265_set_patch_info(frm->reg_cfg, syn, (VepuFmt)fmt->format, enc_task);
2907*437bfbebSnyanmisaka         if (tile_num > 1)
2908*437bfbebSnyanmisaka             hal_h265e_v580_set_uniform_tile(reg_base, syn, k, tile_start_x);
2909*437bfbebSnyanmisaka 
2910*437bfbebSnyanmisaka         if (k) {
2911*437bfbebSnyanmisaka             RK_U32 offset = 0;
2912*437bfbebSnyanmisaka 
2913*437bfbebSnyanmisaka             reg_base->reg0176_lpfw_addr  = mpp_buffer_get_fd(frm->hw_tile_buf[k]);
2914*437bfbebSnyanmisaka             reg_base->reg0177_lpfr_addr  = mpp_buffer_get_fd(frm->hw_tile_buf[k - 1]);
2915*437bfbebSnyanmisaka 
2916*437bfbebSnyanmisaka             if (!ctx->tile_parall_en) {
2917*437bfbebSnyanmisaka                 offset = mpp_packet_get_length(enc_task->packet);
2918*437bfbebSnyanmisaka                 offset += stream_len;
2919*437bfbebSnyanmisaka 
2920*437bfbebSnyanmisaka                 reg_base->reg0173_bsbb_addr = mpp_buffer_get_fd(enc_task->output);
2921*437bfbebSnyanmisaka 
2922*437bfbebSnyanmisaka                 mpp_dev_multi_offset_update(frm->reg_cfg, 175, offset);
2923*437bfbebSnyanmisaka                 mpp_dev_multi_offset_update(frm->reg_cfg, 172, mpp_buffer_get_size(enc_task->output));
2924*437bfbebSnyanmisaka             } else {
2925*437bfbebSnyanmisaka                 reg_base->reg0172_bsbt_addr = mpp_buffer_get_fd(frm->hw_tile_stream[k - 1]);
2926*437bfbebSnyanmisaka                 /* TODO: stream size relative with syntax */
2927*437bfbebSnyanmisaka                 reg_base->reg0173_bsbb_addr = reg_base->reg0172_bsbt_addr;
2928*437bfbebSnyanmisaka                 reg_base->reg0174_bsbr_addr = reg_base->reg0172_bsbt_addr;
2929*437bfbebSnyanmisaka                 reg_base->reg0175_adr_bsbs  = reg_base->reg0172_bsbt_addr;
2930*437bfbebSnyanmisaka 
2931*437bfbebSnyanmisaka                 mpp_dev_multi_offset_update(frm->reg_cfg, 175, 0);
2932*437bfbebSnyanmisaka                 mpp_dev_multi_offset_update(frm->reg_cfg, 172, mpp_buffer_get_size(frm->hw_tile_stream[k - 1]));
2933*437bfbebSnyanmisaka             }
2934*437bfbebSnyanmisaka 
2935*437bfbebSnyanmisaka             offset = ctx->fbc_header_len;
2936*437bfbebSnyanmisaka 
2937*437bfbebSnyanmisaka             mpp_dev_multi_offset_update(frm->reg_cfg, 166, offset);
2938*437bfbebSnyanmisaka             mpp_dev_multi_offset_update(frm->reg_cfg, 164, offset);
2939*437bfbebSnyanmisaka         }
2940*437bfbebSnyanmisaka 
2941*437bfbebSnyanmisaka         if (enc_task->rc_task->frm.save_pass1)
2942*437bfbebSnyanmisaka             vepu580_h265e_save_pass1_patch(hw_regs, ctx, syn->pp.tiles_enabled_flag);
2943*437bfbebSnyanmisaka 
2944*437bfbebSnyanmisaka         if (enc_task->rc_task->frm.use_pass1)
2945*437bfbebSnyanmisaka             vepu580_h265e_use_pass1_patch(hw_regs, ctx);
2946*437bfbebSnyanmisaka 
2947*437bfbebSnyanmisaka         hal_h265e_v580_send_regs(ctx->dev, hw_regs, reg_out);
2948*437bfbebSnyanmisaka 
2949*437bfbebSnyanmisaka         mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_OFFS, frm->reg_cfg);
2950*437bfbebSnyanmisaka 
2951*437bfbebSnyanmisaka         if (k < tile_num - 1) {
2952*437bfbebSnyanmisaka             if (!ctx->tile_parall_en) {
2953*437bfbebSnyanmisaka                 Vepu580H265Fbk *fb = &frm->feedback;
2954*437bfbebSnyanmisaka 
2955*437bfbebSnyanmisaka                 ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
2956*437bfbebSnyanmisaka                 if (ret) {
2957*437bfbebSnyanmisaka                     mpp_err_f("send cmd failed %d\n", ret);
2958*437bfbebSnyanmisaka                 }
2959*437bfbebSnyanmisaka 
2960*437bfbebSnyanmisaka                 ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
2961*437bfbebSnyanmisaka                 if (ret) {
2962*437bfbebSnyanmisaka                     mpp_err_f("poll cmd failed %d\n", ret);
2963*437bfbebSnyanmisaka                     ret = MPP_ERR_VPUHW;
2964*437bfbebSnyanmisaka                 }
2965*437bfbebSnyanmisaka                 stream_len += reg_out->st.bs_lgth_l32;
2966*437bfbebSnyanmisaka                 fb->qp_sum += reg_out->st.qp_sum;
2967*437bfbebSnyanmisaka                 fb->out_strm_size += reg_out->st.bs_lgth_l32;
2968*437bfbebSnyanmisaka                 fb->sse_sum += (RK_S64)(reg_out->st.sse_h32 << 16) +
2969*437bfbebSnyanmisaka                                (reg_out->st.st_sse_bsl.sse_l16 & 0xffff);
2970*437bfbebSnyanmisaka                 fb->st_madi += reg_out->st.madi;
2971*437bfbebSnyanmisaka                 fb->st_madp += reg_out->st.madp;
2972*437bfbebSnyanmisaka                 fb->st_mb_num += reg_out->st.st_bnum_b16.num_b16;
2973*437bfbebSnyanmisaka                 fb->st_ctu_num += reg_out->st.st_bnum_cme.num_ctu;
2974*437bfbebSnyanmisaka             } else
2975*437bfbebSnyanmisaka                 mpp_dev_ioctl(ctx->dev, MPP_DEV_DELIMIT, NULL);
2976*437bfbebSnyanmisaka         }
2977*437bfbebSnyanmisaka         tile_start_x += (syn->pp.column_width_minus1[k] + 1);
2978*437bfbebSnyanmisaka     }
2979*437bfbebSnyanmisaka 
2980*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
2981*437bfbebSnyanmisaka     if (ret) {
2982*437bfbebSnyanmisaka         mpp_err_f("send cmd failed %d\n", ret);
2983*437bfbebSnyanmisaka     }
2984*437bfbebSnyanmisaka     hal_h265e_leave();
2985*437bfbebSnyanmisaka     return ret;
2986*437bfbebSnyanmisaka }
2987*437bfbebSnyanmisaka 
vepu580_h265_set_feedback(H265eV580HalContext * ctx,HalEncTask * enc_task,RK_U32 index)2988*437bfbebSnyanmisaka static MPP_RET vepu580_h265_set_feedback(H265eV580HalContext *ctx, HalEncTask *enc_task, RK_U32 index)
2989*437bfbebSnyanmisaka {
2990*437bfbebSnyanmisaka     EncRcTaskInfo *hal_rc_ret = (EncRcTaskInfo *)&enc_task->rc_task->info;
2991*437bfbebSnyanmisaka     Vepu580H265eFrmCfg *frm = ctx->frms[enc_task->flags.reg_idx];
2992*437bfbebSnyanmisaka     Vepu580H265Fbk *fb = &frm->feedback;
2993*437bfbebSnyanmisaka     MppEncCfgSet *cfg = ctx->cfg;
2994*437bfbebSnyanmisaka     RK_S32 mb64_num = ((cfg->prep.width + 63) / 64) * ((cfg->prep.height + 63) / 64);
2995*437bfbebSnyanmisaka     RK_S32 mb8_num = (mb64_num << 6);
2996*437bfbebSnyanmisaka     RK_S32 mb4_num = (mb8_num << 2);
2997*437bfbebSnyanmisaka 
2998*437bfbebSnyanmisaka     hal_h265e_enter();
2999*437bfbebSnyanmisaka     H265eV580StatusElem *elem = frm->regs_ret[index];
3000*437bfbebSnyanmisaka     RK_U32 hw_status = elem->hw_status;
3001*437bfbebSnyanmisaka 
3002*437bfbebSnyanmisaka     fb->qp_sum += elem->st.qp_sum;
3003*437bfbebSnyanmisaka 
3004*437bfbebSnyanmisaka     fb->out_strm_size += elem->st.bs_lgth_l32;
3005*437bfbebSnyanmisaka 
3006*437bfbebSnyanmisaka     fb->sse_sum += (RK_S64)(elem->st.sse_h32 << 16) +
3007*437bfbebSnyanmisaka                    (elem->st.st_sse_bsl.sse_l16 & 0xffff);
3008*437bfbebSnyanmisaka 
3009*437bfbebSnyanmisaka     fb->hw_status = hw_status;
3010*437bfbebSnyanmisaka     hal_h265e_dbg_detail("hw_status: 0x%08x", hw_status);
3011*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_LINKTABLE_FINISH)
3012*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_LINKTABLE_FINISH");
3013*437bfbebSnyanmisaka 
3014*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_ONE_FRAME_FINISH)
3015*437bfbebSnyanmisaka         hal_h265e_dbg_detail("RKV_ENC_INT_ONE_FRAME_FINISH");
3016*437bfbebSnyanmisaka 
3017*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_ONE_SLICE_FINISH)
3018*437bfbebSnyanmisaka         hal_h265e_dbg_detail("RKV_ENC_INT_ONE_SLICE_FINISH");
3019*437bfbebSnyanmisaka 
3020*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_SAFE_CLEAR_FINISH)
3021*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_SAFE_CLEAR_FINISH");
3022*437bfbebSnyanmisaka 
3023*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_BIT_STREAM_OVERFLOW)
3024*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_BIT_STREAM_OVERFLOW");
3025*437bfbebSnyanmisaka 
3026*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_BUS_WRITE_FULL)
3027*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_BUS_WRITE_FULL");
3028*437bfbebSnyanmisaka 
3029*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_BUS_WRITE_ERROR)
3030*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_BUS_WRITE_ERROR");
3031*437bfbebSnyanmisaka 
3032*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_BUS_READ_ERROR)
3033*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_BUS_READ_ERROR");
3034*437bfbebSnyanmisaka 
3035*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_TIMEOUT_ERROR)
3036*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_TIMEOUT_ERROR");
3037*437bfbebSnyanmisaka 
3038*437bfbebSnyanmisaka     fb->st_madi += elem->st.madi;
3039*437bfbebSnyanmisaka     fb->st_madp += elem->st.madp;
3040*437bfbebSnyanmisaka     fb->st_mb_num += elem->st.st_bnum_b16.num_b16;
3041*437bfbebSnyanmisaka     fb->st_ctu_num += elem->st.st_bnum_cme.num_ctu;
3042*437bfbebSnyanmisaka 
3043*437bfbebSnyanmisaka     fb->st_lvl64_inter_num += elem->st.st_pnum_p64.pnum_p64;
3044*437bfbebSnyanmisaka     fb->st_lvl32_inter_num += elem->st.st_pnum_p32.pnum_p32;
3045*437bfbebSnyanmisaka     fb->st_lvl32_intra_num += elem->st.st_pnum_i32.pnum_i32;
3046*437bfbebSnyanmisaka     fb->st_lvl16_inter_num += elem->st.st_pnum_p16.pnum_p16;
3047*437bfbebSnyanmisaka     fb->st_lvl16_intra_num += elem->st.st_pnum_i16.pnum_i16;
3048*437bfbebSnyanmisaka     fb->st_lvl8_inter_num  += elem->st.st_pnum_p8.pnum_p8;
3049*437bfbebSnyanmisaka     fb->st_lvl8_intra_num  += elem->st.st_pnum_i8.pnum_i8;
3050*437bfbebSnyanmisaka     fb->st_lvl4_intra_num  += elem->st.st_pnum_i4.pnum_i4;
3051*437bfbebSnyanmisaka     memcpy(&fb->st_cu_num_qp[0], &elem->st.st_b8_qp0, 52 * sizeof(RK_U32));
3052*437bfbebSnyanmisaka 
3053*437bfbebSnyanmisaka     if (index == (ctx->tile_num - 1)) {
3054*437bfbebSnyanmisaka         hal_rc_ret->bit_real += fb->out_strm_size * 8;
3055*437bfbebSnyanmisaka 
3056*437bfbebSnyanmisaka         if (fb->st_mb_num) {
3057*437bfbebSnyanmisaka             fb->st_madi = fb->st_madi / fb->st_mb_num;
3058*437bfbebSnyanmisaka         } else {
3059*437bfbebSnyanmisaka             fb->st_madi = 0;
3060*437bfbebSnyanmisaka         }
3061*437bfbebSnyanmisaka         if (fb->st_ctu_num) {
3062*437bfbebSnyanmisaka             fb->st_madp = fb->st_madp / fb->st_ctu_num;
3063*437bfbebSnyanmisaka         } else {
3064*437bfbebSnyanmisaka             fb->st_madp = 0;
3065*437bfbebSnyanmisaka         }
3066*437bfbebSnyanmisaka 
3067*437bfbebSnyanmisaka         if (mb4_num > 0)
3068*437bfbebSnyanmisaka             hal_rc_ret->iblk4_prop = ((((fb->st_lvl4_intra_num + fb->st_lvl8_intra_num) << 2) +
3069*437bfbebSnyanmisaka                                        (fb->st_lvl16_intra_num << 4) +
3070*437bfbebSnyanmisaka                                        (fb->st_lvl32_intra_num << 6)) << 8) / mb4_num;
3071*437bfbebSnyanmisaka 
3072*437bfbebSnyanmisaka         if (mb64_num > 0) {
3073*437bfbebSnyanmisaka             /*
3074*437bfbebSnyanmisaka             hal_cfg[k].inter_lv8_prop = ((fb->st_lvl8_inter_num + (fb->st_lvl16_inter_num << 2) +
3075*437bfbebSnyanmisaka                                           (fb->st_lvl32_inter_num << 4) +
3076*437bfbebSnyanmisaka                                           (fb->st_lvl64_inter_num << 6)) << 8) / mb8_num;*/
3077*437bfbebSnyanmisaka 
3078*437bfbebSnyanmisaka             hal_rc_ret->quality_real = fb->qp_sum / mb8_num;
3079*437bfbebSnyanmisaka             // hal_cfg[k].sse          = fb->sse_sum / mb64_num;
3080*437bfbebSnyanmisaka         }
3081*437bfbebSnyanmisaka 
3082*437bfbebSnyanmisaka         hal_rc_ret->madi += fb->st_madi;
3083*437bfbebSnyanmisaka         hal_rc_ret->madp += fb->st_madp;
3084*437bfbebSnyanmisaka     }
3085*437bfbebSnyanmisaka     hal_h265e_leave();
3086*437bfbebSnyanmisaka     return MPP_OK;
3087*437bfbebSnyanmisaka }
3088*437bfbebSnyanmisaka 
save_to_file(char * name,void * ptr,size_t size)3089*437bfbebSnyanmisaka void save_to_file(char *name, void *ptr, size_t size)
3090*437bfbebSnyanmisaka {
3091*437bfbebSnyanmisaka     FILE *fp = fopen(name, "w+b");
3092*437bfbebSnyanmisaka     if (fp) {
3093*437bfbebSnyanmisaka         fwrite(ptr, 1, size, fp);
3094*437bfbebSnyanmisaka         fclose(fp);
3095*437bfbebSnyanmisaka     } else
3096*437bfbebSnyanmisaka         mpp_err("create file %s failed\n", name);
3097*437bfbebSnyanmisaka }
3098*437bfbebSnyanmisaka 
dump_files(H265eV580HalContext * ctx,HalEncTask * enc_task)3099*437bfbebSnyanmisaka void dump_files(H265eV580HalContext *ctx, HalEncTask *enc_task)
3100*437bfbebSnyanmisaka {
3101*437bfbebSnyanmisaka     H265eSyntax_new *syn = ctx->syn;
3102*437bfbebSnyanmisaka     HalBuf *hal_buf = hal_bufs_get_buf(ctx->dpb_bufs, syn->sp.ref_pic.slot_idx);
3103*437bfbebSnyanmisaka     size_t buf_size = mpp_buffer_get_size(hal_buf->buf[0]);
3104*437bfbebSnyanmisaka     size_t dws_size = mpp_buffer_get_size(hal_buf->buf[1]);
3105*437bfbebSnyanmisaka     void *ptr = mpp_buffer_get_ptr(hal_buf->buf[0]);
3106*437bfbebSnyanmisaka     void *dws_ptr = mpp_buffer_get_ptr(hal_buf->buf[1]);
3107*437bfbebSnyanmisaka     RK_U32 frm_num = ctx->frms[enc_task->flags.reg_idx]->frame_count;
3108*437bfbebSnyanmisaka     RK_S32 pid = getpid();
3109*437bfbebSnyanmisaka     char name[128];
3110*437bfbebSnyanmisaka     size_t name_len = sizeof(name) - 1;
3111*437bfbebSnyanmisaka 
3112*437bfbebSnyanmisaka     snprintf(name, name_len, "/data/refr_fbd_%d_frm%d.bin", pid, frm_num);
3113*437bfbebSnyanmisaka     save_to_file(name, ptr + ctx->fbc_header_len, buf_size - ctx->fbc_header_len);
3114*437bfbebSnyanmisaka 
3115*437bfbebSnyanmisaka     snprintf(name, name_len, "/data/refr_fbh_%d_frm%d.bin", pid, frm_num);
3116*437bfbebSnyanmisaka     save_to_file(name, ptr, ctx->fbc_header_len);
3117*437bfbebSnyanmisaka 
3118*437bfbebSnyanmisaka     snprintf(name, name_len, "/data/refr_dsp_%d_frm%d.bin", pid, frm_num);
3119*437bfbebSnyanmisaka     save_to_file(name, dws_ptr, dws_size);
3120*437bfbebSnyanmisaka 
3121*437bfbebSnyanmisaka     hal_buf = hal_bufs_get_buf(ctx->dpb_bufs, syn->sp.recon_pic.slot_idx);
3122*437bfbebSnyanmisaka     buf_size = mpp_buffer_get_size(hal_buf->buf[0]);
3123*437bfbebSnyanmisaka     dws_size = mpp_buffer_get_size(hal_buf->buf[1]);
3124*437bfbebSnyanmisaka     ptr = mpp_buffer_get_ptr(hal_buf->buf[0]);
3125*437bfbebSnyanmisaka     dws_ptr = mpp_buffer_get_ptr(hal_buf->buf[1]);
3126*437bfbebSnyanmisaka 
3127*437bfbebSnyanmisaka     snprintf(name, name_len, "/data/recn_fbd_%d_frm%d.bin", pid, frm_num);
3128*437bfbebSnyanmisaka     save_to_file(name, ptr + ctx->fbc_header_len, buf_size - ctx->fbc_header_len);
3129*437bfbebSnyanmisaka 
3130*437bfbebSnyanmisaka     snprintf(name, name_len, "/data/recn_fbh_%d_frm%d.bin", pid, frm_num);
3131*437bfbebSnyanmisaka     save_to_file(name, ptr, ctx->fbc_header_len);
3132*437bfbebSnyanmisaka 
3133*437bfbebSnyanmisaka     snprintf(name, name_len, "/data/recn_dsp_%d_frm%d.bin", pid, frm_num);
3134*437bfbebSnyanmisaka     save_to_file(name, dws_ptr, dws_size);
3135*437bfbebSnyanmisaka }
3136*437bfbebSnyanmisaka 
hal_h265e_vepu580_status_check(RK_U32 hw_status)3137*437bfbebSnyanmisaka static MPP_RET hal_h265e_vepu580_status_check(RK_U32 hw_status)
3138*437bfbebSnyanmisaka {
3139*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
3140*437bfbebSnyanmisaka 
3141*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_LINKTABLE_FINISH)
3142*437bfbebSnyanmisaka         hal_h265e_dbg_detail("RKV_ENC_INT_LINKTABLE_FINISH");
3143*437bfbebSnyanmisaka 
3144*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_ONE_FRAME_FINISH)
3145*437bfbebSnyanmisaka         hal_h265e_dbg_detail("RKV_ENC_INT_ONE_FRAME_FINISH");
3146*437bfbebSnyanmisaka 
3147*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_ONE_SLICE_FINISH)
3148*437bfbebSnyanmisaka         hal_h265e_dbg_detail("RKV_ENC_INT_ONE_SLICE_FINISH");
3149*437bfbebSnyanmisaka 
3150*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_SAFE_CLEAR_FINISH)
3151*437bfbebSnyanmisaka         hal_h265e_dbg_detail("RKV_ENC_INT_SAFE_CLEAR_FINISH");
3152*437bfbebSnyanmisaka 
3153*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_BIT_STREAM_OVERFLOW)
3154*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_BIT_STREAM_OVERFLOW");
3155*437bfbebSnyanmisaka 
3156*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_BUS_WRITE_FULL) {
3157*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_BUS_WRITE_FULL");
3158*437bfbebSnyanmisaka         ret = MPP_NOK;
3159*437bfbebSnyanmisaka     }
3160*437bfbebSnyanmisaka 
3161*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_BUS_WRITE_ERROR) {
3162*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_BUS_WRITE_ERROR");
3163*437bfbebSnyanmisaka         ret = MPP_NOK;
3164*437bfbebSnyanmisaka     }
3165*437bfbebSnyanmisaka 
3166*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_BUS_READ_ERROR) {
3167*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_BUS_READ_ERROR");
3168*437bfbebSnyanmisaka         ret = MPP_NOK;
3169*437bfbebSnyanmisaka     }
3170*437bfbebSnyanmisaka 
3171*437bfbebSnyanmisaka     if (hw_status & RKV_ENC_INT_TIMEOUT_ERROR) {
3172*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_TIMEOUT_ERROR");
3173*437bfbebSnyanmisaka         ret = MPP_NOK;
3174*437bfbebSnyanmisaka     }
3175*437bfbebSnyanmisaka 
3176*437bfbebSnyanmisaka     return ret;
3177*437bfbebSnyanmisaka }
3178*437bfbebSnyanmisaka 
hal_h265e_v580_wait(void * hal,HalEncTask * task)3179*437bfbebSnyanmisaka MPP_RET hal_h265e_v580_wait(void *hal, HalEncTask *task)
3180*437bfbebSnyanmisaka {
3181*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
3182*437bfbebSnyanmisaka     H265eV580HalContext *ctx = (H265eV580HalContext *)hal;
3183*437bfbebSnyanmisaka     HalEncTask *enc_task = task;
3184*437bfbebSnyanmisaka     RK_U32 split_out = ctx->cfg->split.split_out;
3185*437bfbebSnyanmisaka     RK_S32 task_idx = task->flags.reg_idx;
3186*437bfbebSnyanmisaka     Vepu580H265eFrmCfg *frm = ctx->frms[task_idx];
3187*437bfbebSnyanmisaka 
3188*437bfbebSnyanmisaka     hal_h265e_enter();
3189*437bfbebSnyanmisaka 
3190*437bfbebSnyanmisaka     if (enc_task->flags.err) {
3191*437bfbebSnyanmisaka         hal_h265e_err("enc_task->flags.err %08x, return early",
3192*437bfbebSnyanmisaka                       enc_task->flags.err);
3193*437bfbebSnyanmisaka         return MPP_NOK;
3194*437bfbebSnyanmisaka     }
3195*437bfbebSnyanmisaka 
3196*437bfbebSnyanmisaka     /* if pass1 mode, it will disable split mode and the split out need to be disable */
3197*437bfbebSnyanmisaka     if (enc_task->rc_task->frm.save_pass1)
3198*437bfbebSnyanmisaka         split_out = 0;
3199*437bfbebSnyanmisaka 
3200*437bfbebSnyanmisaka     if (split_out) {
3201*437bfbebSnyanmisaka         EncOutParam param;
3202*437bfbebSnyanmisaka         RK_U32 slice_len = 0;
3203*437bfbebSnyanmisaka         RK_U32 slice_last = 0;
3204*437bfbebSnyanmisaka         RK_U32 finish_cnt = 0;
3205*437bfbebSnyanmisaka         RK_U32 tile1_offset = 0;
3206*437bfbebSnyanmisaka         MppPacket pkt = enc_task->packet;
3207*437bfbebSnyanmisaka         RK_U32 offset = mpp_packet_get_length(pkt);
3208*437bfbebSnyanmisaka         RK_U32 seg_offset = offset;
3209*437bfbebSnyanmisaka         void* ptr = mpp_packet_get_pos(pkt);
3210*437bfbebSnyanmisaka         H265eV580RegSet *regs = frm->regs_set[0];
3211*437bfbebSnyanmisaka         hevc_vepu580_base *reg_base = &regs->reg_base;
3212*437bfbebSnyanmisaka         RK_U32 type = reg_base->reg0236_synt_nal.nal_unit_type;
3213*437bfbebSnyanmisaka         MppDevPollCfg *poll_cfg = (MppDevPollCfg *)((char *)ctx->poll_cfgs);
3214*437bfbebSnyanmisaka 
3215*437bfbebSnyanmisaka         param.task = task;
3216*437bfbebSnyanmisaka         param.base = mpp_packet_get_data(task->packet);
3217*437bfbebSnyanmisaka 
3218*437bfbebSnyanmisaka         do {
3219*437bfbebSnyanmisaka             RK_S32 i = 0;
3220*437bfbebSnyanmisaka             poll_cfg->poll_type = 0;
3221*437bfbebSnyanmisaka             poll_cfg->poll_ret  = 0;
3222*437bfbebSnyanmisaka             poll_cfg->count_max = split_out & MPP_ENC_SPLIT_OUT_LOWDELAY ? 1 : ctx->poll_slice_max;
3223*437bfbebSnyanmisaka             poll_cfg->count_ret = 0;
3224*437bfbebSnyanmisaka 
3225*437bfbebSnyanmisaka             ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, poll_cfg);
3226*437bfbebSnyanmisaka 
3227*437bfbebSnyanmisaka             for (i = 0; i < poll_cfg->count_ret; i++) {
3228*437bfbebSnyanmisaka                 slice_last = poll_cfg->slice_info[i].last;
3229*437bfbebSnyanmisaka                 slice_len = poll_cfg->slice_info[i].length;
3230*437bfbebSnyanmisaka                 param.length = slice_len;
3231*437bfbebSnyanmisaka 
3232*437bfbebSnyanmisaka                 if (finish_cnt > 0) {
3233*437bfbebSnyanmisaka                     MppBuffer buf = frm->hw_tile_stream[finish_cnt - 1];
3234*437bfbebSnyanmisaka                     void *tile1_ptr  = mpp_buffer_get_ptr(buf);
3235*437bfbebSnyanmisaka 
3236*437bfbebSnyanmisaka                     mpp_buffer_sync_ro_partial_begin(buf, tile1_offset, slice_len);
3237*437bfbebSnyanmisaka                     memcpy(ptr + seg_offset, tile1_ptr + tile1_offset, slice_len);
3238*437bfbebSnyanmisaka                     tile1_offset += slice_len;
3239*437bfbebSnyanmisaka                 } else {
3240*437bfbebSnyanmisaka                     MppBuffer buf = enc_task->output;
3241*437bfbebSnyanmisaka 
3242*437bfbebSnyanmisaka                     mpp_buffer_sync_ro_partial_begin(buf, offset, slice_len);
3243*437bfbebSnyanmisaka                 }
3244*437bfbebSnyanmisaka 
3245*437bfbebSnyanmisaka                 ctx->output_cb->cmd = ENC_OUTPUT_SLICE;
3246*437bfbebSnyanmisaka                 if (slice_last) {
3247*437bfbebSnyanmisaka                     finish_cnt++;
3248*437bfbebSnyanmisaka                     tile1_offset = 0;
3249*437bfbebSnyanmisaka                     if (ctx->tile_parall_en) {
3250*437bfbebSnyanmisaka                         if (finish_cnt + 1 > ctx->tile_num) {
3251*437bfbebSnyanmisaka                             ctx->output_cb->cmd = ENC_OUTPUT_FINISH;
3252*437bfbebSnyanmisaka                         }
3253*437bfbebSnyanmisaka                     }
3254*437bfbebSnyanmisaka                 }
3255*437bfbebSnyanmisaka 
3256*437bfbebSnyanmisaka                 mpp_packet_add_segment_info(pkt, type, seg_offset, slice_len);
3257*437bfbebSnyanmisaka 
3258*437bfbebSnyanmisaka                 if (split_out & MPP_ENC_SPLIT_OUT_LOWDELAY)
3259*437bfbebSnyanmisaka                     mpp_callback(ctx->output_cb, &param);
3260*437bfbebSnyanmisaka 
3261*437bfbebSnyanmisaka                 seg_offset += slice_len;
3262*437bfbebSnyanmisaka             }
3263*437bfbebSnyanmisaka 
3264*437bfbebSnyanmisaka             if (ctx->tile_parall_en) {
3265*437bfbebSnyanmisaka                 if (finish_cnt + 1 > ctx->tile_num) {
3266*437bfbebSnyanmisaka                     break;
3267*437bfbebSnyanmisaka                 }
3268*437bfbebSnyanmisaka             } else if (slice_last) {
3269*437bfbebSnyanmisaka                 break;
3270*437bfbebSnyanmisaka             }
3271*437bfbebSnyanmisaka         } while (1);
3272*437bfbebSnyanmisaka     } else {
3273*437bfbebSnyanmisaka         H265eV580StatusElem *elem = frm->regs_ret[0];
3274*437bfbebSnyanmisaka         H265eV580RegSet *regs = frm->regs_set[0];
3275*437bfbebSnyanmisaka         hevc_vepu580_base *reg_base = &regs->reg_base;
3276*437bfbebSnyanmisaka         RK_U32 type = reg_base->reg0236_synt_nal.nal_unit_type;
3277*437bfbebSnyanmisaka         MppPacket pkt = enc_task->packet;
3278*437bfbebSnyanmisaka         RK_U32 offset = mpp_packet_get_length(pkt);
3279*437bfbebSnyanmisaka         RK_U32 i = 0;
3280*437bfbebSnyanmisaka 
3281*437bfbebSnyanmisaka         if (ctx->tile_parall_en) {
3282*437bfbebSnyanmisaka             for (i = 0; i < ctx->tile_num; i ++)
3283*437bfbebSnyanmisaka                 ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
3284*437bfbebSnyanmisaka         } else {
3285*437bfbebSnyanmisaka             ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
3286*437bfbebSnyanmisaka         }
3287*437bfbebSnyanmisaka 
3288*437bfbebSnyanmisaka         for (i = 0; i < ctx->tile_num; i++) {
3289*437bfbebSnyanmisaka             H265eV580StatusElem *elem_ret = frm->regs_ret[i];
3290*437bfbebSnyanmisaka             RK_U32 hw_status = elem_ret->hw_status;
3291*437bfbebSnyanmisaka             RK_U32 tile_size = elem_ret->st.bs_lgth_l32;
3292*437bfbebSnyanmisaka 
3293*437bfbebSnyanmisaka             ret = hal_h265e_vepu580_status_check(hw_status);
3294*437bfbebSnyanmisaka             if (ret)
3295*437bfbebSnyanmisaka                 break;
3296*437bfbebSnyanmisaka             mpp_packet_add_segment_info(pkt, type, offset, tile_size);
3297*437bfbebSnyanmisaka             offset += tile_size;
3298*437bfbebSnyanmisaka 
3299*437bfbebSnyanmisaka             if (ctx->tile_dump_err &&
3300*437bfbebSnyanmisaka                 (hw_status & (RKV_ENC_INT_BUS_WRITE_ERROR | RKV_ENC_INT_BUS_READ_ERROR))) {
3301*437bfbebSnyanmisaka                 dump_files(ctx, enc_task);
3302*437bfbebSnyanmisaka                 break;
3303*437bfbebSnyanmisaka             }
3304*437bfbebSnyanmisaka         }
3305*437bfbebSnyanmisaka 
3306*437bfbebSnyanmisaka         if (ret)
3307*437bfbebSnyanmisaka             mpp_err_f("poll cmd failed %d status %d \n", ret, elem->hw_status);
3308*437bfbebSnyanmisaka     }
3309*437bfbebSnyanmisaka 
3310*437bfbebSnyanmisaka     hal_h265e_leave();
3311*437bfbebSnyanmisaka 
3312*437bfbebSnyanmisaka     return ret;
3313*437bfbebSnyanmisaka }
3314*437bfbebSnyanmisaka 
hal_h265e_v580_get_task(void * hal,HalEncTask * task)3315*437bfbebSnyanmisaka MPP_RET hal_h265e_v580_get_task(void *hal, HalEncTask *task)
3316*437bfbebSnyanmisaka {
3317*437bfbebSnyanmisaka     H265eV580HalContext *ctx = (H265eV580HalContext *)hal;
3318*437bfbebSnyanmisaka     Vepu580H265eFrmCfg *frm_cfg = NULL;
3319*437bfbebSnyanmisaka     EncFrmStatus  *frm_status = &task->rc_task->frm;
3320*437bfbebSnyanmisaka     MppFrame frame = task->frame;
3321*437bfbebSnyanmisaka     RK_S32 task_idx = ctx->task_idx;
3322*437bfbebSnyanmisaka 
3323*437bfbebSnyanmisaka     hal_h265e_enter();
3324*437bfbebSnyanmisaka 
3325*437bfbebSnyanmisaka     task->part_first = 1;
3326*437bfbebSnyanmisaka     task->part_last = 0;
3327*437bfbebSnyanmisaka     task->flags.reg_idx = task_idx;
3328*437bfbebSnyanmisaka 
3329*437bfbebSnyanmisaka     if (!frm_status->reencode) {
3330*437bfbebSnyanmisaka         ctx->syn = (H265eSyntax_new *)task->syntax.data;
3331*437bfbebSnyanmisaka         ctx->dpb = (H265eDpb*)ctx->syn->dpb;
3332*437bfbebSnyanmisaka 
3333*437bfbebSnyanmisaka         if (vepu580_h265_setup_hal_bufs(ctx)) {
3334*437bfbebSnyanmisaka             hal_h265e_err("vepu541_h265_allocate_buffers failed, free buffers and return\n");
3335*437bfbebSnyanmisaka             task->flags.err |= HAL_ENC_TASK_ERR_ALLOC;
3336*437bfbebSnyanmisaka             return MPP_ERR_MALLOC;
3337*437bfbebSnyanmisaka         }
3338*437bfbebSnyanmisaka 
3339*437bfbebSnyanmisaka         ctx->last_frame_type = ctx->frame_type;
3340*437bfbebSnyanmisaka 
3341*437bfbebSnyanmisaka         frm_cfg = ctx->frms[task_idx];
3342*437bfbebSnyanmisaka         ctx->frm = frm_cfg;
3343*437bfbebSnyanmisaka 
3344*437bfbebSnyanmisaka         if (mpp_frame_has_meta(task->frame)) {
3345*437bfbebSnyanmisaka             MppMeta meta = mpp_frame_get_meta(frame);
3346*437bfbebSnyanmisaka 
3347*437bfbebSnyanmisaka             mpp_meta_get_ptr_d(meta, KEY_ROI_DATA2, (void **)&frm_cfg->roi_data, NULL);
3348*437bfbebSnyanmisaka             mpp_meta_get_ptr_d(meta, KEY_OSD_DATA, (void **)&frm_cfg->osd_cfg.osd_data, NULL);
3349*437bfbebSnyanmisaka             mpp_meta_get_ptr_d(meta, KEY_OSD_DATA2, (void **)&frm_cfg->osd_cfg.osd_data2, NULL);
3350*437bfbebSnyanmisaka         } else {
3351*437bfbebSnyanmisaka             frm_cfg->roi_data = NULL;
3352*437bfbebSnyanmisaka             frm_cfg->osd_cfg.osd_data = NULL;
3353*437bfbebSnyanmisaka             frm_cfg->osd_cfg.osd_data2 = NULL;
3354*437bfbebSnyanmisaka         }
3355*437bfbebSnyanmisaka 
3356*437bfbebSnyanmisaka         frm_cfg->frame_count = ctx->frame_count++;
3357*437bfbebSnyanmisaka 
3358*437bfbebSnyanmisaka         ctx->task_idx++;
3359*437bfbebSnyanmisaka         if (ctx->task_idx >= ctx->task_cnt)
3360*437bfbebSnyanmisaka             ctx->task_idx = 0;
3361*437bfbebSnyanmisaka 
3362*437bfbebSnyanmisaka         frm_cfg->hal_curr_idx = ctx->syn->sp.recon_pic.slot_idx;
3363*437bfbebSnyanmisaka         frm_cfg->hal_refr_idx = ctx->syn->sp.ref_pic.slot_idx;
3364*437bfbebSnyanmisaka     } else {
3365*437bfbebSnyanmisaka         /* reencode path may change the frame type */
3366*437bfbebSnyanmisaka         frm_cfg = ctx->frm;
3367*437bfbebSnyanmisaka     }
3368*437bfbebSnyanmisaka 
3369*437bfbebSnyanmisaka     h265e_dpb_hal_start(ctx->dpb, frm_cfg->hal_curr_idx);
3370*437bfbebSnyanmisaka     h265e_dpb_hal_start(ctx->dpb, frm_cfg->hal_refr_idx);
3371*437bfbebSnyanmisaka 
3372*437bfbebSnyanmisaka     ctx->frame_type = (frm_status->is_intra) ? INTRA_FRAME : INTER_P_FRAME;
3373*437bfbebSnyanmisaka     frm_cfg->frame_type = ctx->frame_type;
3374*437bfbebSnyanmisaka     mpp_dev_multi_offset_reset(frm_cfg->reg_cfg);
3375*437bfbebSnyanmisaka     memset(&frm_cfg->feedback, 0, sizeof(frm_cfg->feedback));
3376*437bfbebSnyanmisaka 
3377*437bfbebSnyanmisaka     hal_h265e_leave();
3378*437bfbebSnyanmisaka     return MPP_OK;
3379*437bfbebSnyanmisaka }
3380*437bfbebSnyanmisaka 
hal_h265e_v580_ret_task(void * hal,HalEncTask * task)3381*437bfbebSnyanmisaka MPP_RET hal_h265e_v580_ret_task(void *hal, HalEncTask *task)
3382*437bfbebSnyanmisaka {
3383*437bfbebSnyanmisaka     H265eV580HalContext *ctx = (H265eV580HalContext *)hal;
3384*437bfbebSnyanmisaka     EncRcTaskInfo *rc_info = &task->rc_task->info;
3385*437bfbebSnyanmisaka     HalEncTask *enc_task = task;
3386*437bfbebSnyanmisaka     RK_S32 task_idx = task->flags.reg_idx;
3387*437bfbebSnyanmisaka     Vepu580H265eFrmCfg *frm = ctx->frms[task_idx];
3388*437bfbebSnyanmisaka     Vepu580H265Fbk *fb = &frm->feedback;
3389*437bfbebSnyanmisaka     H265eSyntax_new *syn = (H265eSyntax_new *) enc_task->syntax.data;
3390*437bfbebSnyanmisaka     RK_U32 offset = mpp_packet_get_length(enc_task->packet);
3391*437bfbebSnyanmisaka 
3392*437bfbebSnyanmisaka     hal_h265e_enter();
3393*437bfbebSnyanmisaka 
3394*437bfbebSnyanmisaka     if (ctx->tile_parall_en) {
3395*437bfbebSnyanmisaka         RK_U32 i = 0, stream_len = 0;
3396*437bfbebSnyanmisaka         void* ptr = mpp_packet_get_pos(enc_task->packet);
3397*437bfbebSnyanmisaka 
3398*437bfbebSnyanmisaka         for (i = 0; i < ctx->tile_num; i ++) {
3399*437bfbebSnyanmisaka             vepu580_h265_set_feedback(ctx, enc_task, i);
3400*437bfbebSnyanmisaka             if (!ctx->cfg->split.split_out) {
3401*437bfbebSnyanmisaka                 if (i) {  //copy tile 1 stream
3402*437bfbebSnyanmisaka                     RK_U32 len = fb->out_strm_size - stream_len;
3403*437bfbebSnyanmisaka                     MppBuffer buf = frm->hw_tile_stream[i - 1];
3404*437bfbebSnyanmisaka                     RK_U8 *tile1_ptr  = mpp_buffer_get_ptr(buf);
3405*437bfbebSnyanmisaka 
3406*437bfbebSnyanmisaka                     mpp_buffer_sync_partial_begin(buf, 0, len);
3407*437bfbebSnyanmisaka 
3408*437bfbebSnyanmisaka                     if (syn->sp.temporal_id && len > 5)
3409*437bfbebSnyanmisaka                         tile1_ptr[5] = (tile1_ptr[5] & 0xf8) | ((syn->sp.temporal_id + 1) & 0x7);
3410*437bfbebSnyanmisaka 
3411*437bfbebSnyanmisaka                     memcpy(ptr + stream_len + offset, tile1_ptr, len);
3412*437bfbebSnyanmisaka                 } else {
3413*437bfbebSnyanmisaka                     MppBuffer buf = enc_task->output;
3414*437bfbebSnyanmisaka                     RK_U32 len = fb->out_strm_size;
3415*437bfbebSnyanmisaka                     RK_U8 *stream_ptr = (RK_U8 *) ptr;
3416*437bfbebSnyanmisaka 
3417*437bfbebSnyanmisaka                     mpp_buffer_sync_partial_begin(buf, offset, len);
3418*437bfbebSnyanmisaka 
3419*437bfbebSnyanmisaka                     if (syn->sp.temporal_id) {
3420*437bfbebSnyanmisaka                         stream_ptr[5] = (stream_ptr[5] & 0xf8) | ((syn->sp.temporal_id + 1) & 0x7);
3421*437bfbebSnyanmisaka                     }
3422*437bfbebSnyanmisaka                 }
3423*437bfbebSnyanmisaka                 stream_len = fb->out_strm_size;
3424*437bfbebSnyanmisaka             }
3425*437bfbebSnyanmisaka         }
3426*437bfbebSnyanmisaka     } else {
3427*437bfbebSnyanmisaka         vepu580_h265_set_feedback(ctx, enc_task, ctx->tile_num - 1);
3428*437bfbebSnyanmisaka         mpp_buffer_sync_partial_begin(enc_task->output, offset, fb->out_strm_size);
3429*437bfbebSnyanmisaka         hal_h265e_amend_temporal_id(task, fb->out_strm_size);
3430*437bfbebSnyanmisaka     }
3431*437bfbebSnyanmisaka 
3432*437bfbebSnyanmisaka     rc_info->sse = fb->sse_sum;
3433*437bfbebSnyanmisaka     rc_info->lvl64_inter_num = fb->st_lvl64_inter_num;
3434*437bfbebSnyanmisaka     rc_info->lvl32_inter_num = fb->st_lvl32_inter_num;
3435*437bfbebSnyanmisaka     rc_info->lvl16_inter_num = fb->st_lvl16_inter_num;
3436*437bfbebSnyanmisaka     rc_info->lvl8_inter_num  = fb->st_lvl8_inter_num;
3437*437bfbebSnyanmisaka     rc_info->lvl32_intra_num = fb->st_lvl32_intra_num;
3438*437bfbebSnyanmisaka     rc_info->lvl16_intra_num = fb->st_lvl16_intra_num;
3439*437bfbebSnyanmisaka     rc_info->lvl8_intra_num  = fb->st_lvl8_intra_num;
3440*437bfbebSnyanmisaka     rc_info->lvl4_intra_num  = fb->st_lvl4_intra_num;
3441*437bfbebSnyanmisaka 
3442*437bfbebSnyanmisaka     enc_task->hw_length = fb->out_strm_size;
3443*437bfbebSnyanmisaka     enc_task->length += fb->out_strm_size;
3444*437bfbebSnyanmisaka 
3445*437bfbebSnyanmisaka     vepu580_h265e_tune_stat_update(ctx->tune, rc_info);
3446*437bfbebSnyanmisaka 
3447*437bfbebSnyanmisaka     h265e_dpb_hal_end(ctx->dpb, frm->hal_curr_idx);
3448*437bfbebSnyanmisaka     h265e_dpb_hal_end(ctx->dpb, frm->hal_refr_idx);
3449*437bfbebSnyanmisaka 
3450*437bfbebSnyanmisaka     hal_h265e_dbg_detail("output stream size %d\n", fb->out_strm_size);
3451*437bfbebSnyanmisaka 
3452*437bfbebSnyanmisaka     hal_h265e_leave();
3453*437bfbebSnyanmisaka     return MPP_OK;
3454*437bfbebSnyanmisaka }
3455*437bfbebSnyanmisaka 
3456*437bfbebSnyanmisaka const MppEncHalApi hal_h265e_vepu580 = {
3457*437bfbebSnyanmisaka     "hal_h265e_v580",
3458*437bfbebSnyanmisaka     MPP_VIDEO_CodingHEVC,
3459*437bfbebSnyanmisaka     sizeof(H265eV580HalContext),
3460*437bfbebSnyanmisaka     0,
3461*437bfbebSnyanmisaka     hal_h265e_v580_init,
3462*437bfbebSnyanmisaka     hal_h265e_v580_deinit,
3463*437bfbebSnyanmisaka     hal_h265e_vepu580_prepare,
3464*437bfbebSnyanmisaka     hal_h265e_v580_get_task,
3465*437bfbebSnyanmisaka     hal_h265e_v580_gen_regs,
3466*437bfbebSnyanmisaka     hal_h265e_v580_start,
3467*437bfbebSnyanmisaka     hal_h265e_v580_wait,
3468*437bfbebSnyanmisaka     NULL,
3469*437bfbebSnyanmisaka     NULL,
3470*437bfbebSnyanmisaka     hal_h265e_v580_ret_task,
3471*437bfbebSnyanmisaka };
3472