xref: /rockchip-linux_mpp/mpp/hal/rkenc/h265e/hal_h265e_vepu540c.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2022 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #define MODULE_TAG  "hal_h265e_v540c"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <linux/string.h>
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include <string.h>
22*437bfbebSnyanmisaka #include <math.h>
23*437bfbebSnyanmisaka #include <limits.h>
24*437bfbebSnyanmisaka 
25*437bfbebSnyanmisaka #include "mpp_env.h"
26*437bfbebSnyanmisaka #include "mpp_mem.h"
27*437bfbebSnyanmisaka #include "mpp_soc.h"
28*437bfbebSnyanmisaka #include "mpp_common.h"
29*437bfbebSnyanmisaka #include "mpp_frame_impl.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 "vepu5xx_common.h"
37*437bfbebSnyanmisaka #include "vepu540c_common.h"
38*437bfbebSnyanmisaka #include "hal_h265e_vepu540c.h"
39*437bfbebSnyanmisaka #include "hal_h265e_vepu540c_reg.h"
40*437bfbebSnyanmisaka 
41*437bfbebSnyanmisaka #define  MAX_TITLE_NUM 2
42*437bfbebSnyanmisaka 
43*437bfbebSnyanmisaka #define hal_h265e_err(fmt, ...) \
44*437bfbebSnyanmisaka     do {\
45*437bfbebSnyanmisaka         mpp_err_f(fmt, ## __VA_ARGS__);\
46*437bfbebSnyanmisaka     } while (0)
47*437bfbebSnyanmisaka 
48*437bfbebSnyanmisaka typedef struct vepu540c_h265_fbk_t {
49*437bfbebSnyanmisaka     vepu540c_hw_status hw_status;
50*437bfbebSnyanmisaka     RK_U32 qp_sum;
51*437bfbebSnyanmisaka     RK_U32 out_strm_size;
52*437bfbebSnyanmisaka     RK_U32 out_hw_strm_size;
53*437bfbebSnyanmisaka     RK_S64 sse_sum;
54*437bfbebSnyanmisaka     RK_U32 st_lvl64_inter_num;
55*437bfbebSnyanmisaka     RK_U32 st_lvl32_inter_num;
56*437bfbebSnyanmisaka     RK_U32 st_lvl16_inter_num;
57*437bfbebSnyanmisaka     RK_U32 st_lvl8_inter_num;
58*437bfbebSnyanmisaka     RK_U32 st_lvl32_intra_num;
59*437bfbebSnyanmisaka     RK_U32 st_lvl16_intra_num;
60*437bfbebSnyanmisaka     RK_U32 st_lvl8_intra_num;
61*437bfbebSnyanmisaka     RK_U32 st_lvl4_intra_num;
62*437bfbebSnyanmisaka     RK_U32 st_cu_num_qp[52];
63*437bfbebSnyanmisaka     RK_U32 st_madp;
64*437bfbebSnyanmisaka     RK_U32 st_madi;
65*437bfbebSnyanmisaka     RK_U32 st_mb_num;
66*437bfbebSnyanmisaka     RK_U32 st_ctu_num;
67*437bfbebSnyanmisaka } vepu540c_h265_fbk;
68*437bfbebSnyanmisaka 
69*437bfbebSnyanmisaka typedef struct H265eV540cHalContext_t {
70*437bfbebSnyanmisaka     MppEncHalApi        api;
71*437bfbebSnyanmisaka     MppDev              dev;
72*437bfbebSnyanmisaka     void                *regs;
73*437bfbebSnyanmisaka     void                *reg_out[MAX_TITLE_NUM];
74*437bfbebSnyanmisaka 
75*437bfbebSnyanmisaka     vepu540c_h265_fbk    feedback;
76*437bfbebSnyanmisaka     void                *dump_files;
77*437bfbebSnyanmisaka     RK_U32              frame_cnt_gen_ready;
78*437bfbebSnyanmisaka 
79*437bfbebSnyanmisaka     RK_S32              frame_type;
80*437bfbebSnyanmisaka     RK_S32              last_frame_type;
81*437bfbebSnyanmisaka 
82*437bfbebSnyanmisaka     /* @frame_cnt starts from ZERO */
83*437bfbebSnyanmisaka     RK_U32              frame_cnt;
84*437bfbebSnyanmisaka     void                *roi_data;
85*437bfbebSnyanmisaka     MppEncCfgSet        *cfg;
86*437bfbebSnyanmisaka 
87*437bfbebSnyanmisaka     RK_U32              enc_mode;
88*437bfbebSnyanmisaka     RK_U32              frame_size;
89*437bfbebSnyanmisaka     RK_S32              max_buf_cnt;
90*437bfbebSnyanmisaka     RK_S32              hdr_status;
91*437bfbebSnyanmisaka     void                *input_fmt;
92*437bfbebSnyanmisaka     RK_U8               *src_buf;
93*437bfbebSnyanmisaka     RK_U8               *dst_buf;
94*437bfbebSnyanmisaka     RK_S32              buf_size;
95*437bfbebSnyanmisaka     RK_U32              frame_num;
96*437bfbebSnyanmisaka     HalBufs             dpb_bufs;
97*437bfbebSnyanmisaka     RK_S32              fbc_header_len;
98*437bfbebSnyanmisaka     RK_U32              title_num;
99*437bfbebSnyanmisaka 
100*437bfbebSnyanmisaka     /* external line buffer over 3K */
101*437bfbebSnyanmisaka     MppBufferGroup          ext_line_buf_grp;
102*437bfbebSnyanmisaka     RK_S32                  ext_line_buf_size;
103*437bfbebSnyanmisaka     MppBuffer               ext_line_buf;
104*437bfbebSnyanmisaka } H265eV540cHalContext;
105*437bfbebSnyanmisaka 
106*437bfbebSnyanmisaka #define TILE_BUF_SIZE  MPP_ALIGN(128 * 1024, 256)
107*437bfbebSnyanmisaka 
108*437bfbebSnyanmisaka static RK_U32 aq_thd_default[16] = {
109*437bfbebSnyanmisaka     0,  0,  0,  0,
110*437bfbebSnyanmisaka     3,  3,  5,  5,
111*437bfbebSnyanmisaka     8,  8,  8,  15,
112*437bfbebSnyanmisaka     15, 20, 25, 25
113*437bfbebSnyanmisaka };
114*437bfbebSnyanmisaka 
115*437bfbebSnyanmisaka static RK_S32 aq_qp_dealt_default[16] = {
116*437bfbebSnyanmisaka     -8, -7, -6, -5,
117*437bfbebSnyanmisaka     -4, -3, -2, -1,
118*437bfbebSnyanmisaka     0,  1,  2,  3,
119*437bfbebSnyanmisaka     4,  5,  6,  8,
120*437bfbebSnyanmisaka };
121*437bfbebSnyanmisaka 
vepu540c_h265_setup_hal_bufs(H265eV540cHalContext * ctx)122*437bfbebSnyanmisaka static MPP_RET vepu540c_h265_setup_hal_bufs(H265eV540cHalContext *ctx)
123*437bfbebSnyanmisaka {
124*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
125*437bfbebSnyanmisaka     VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
126*437bfbebSnyanmisaka     RK_U32 frame_size;
127*437bfbebSnyanmisaka     VepuFmt input_fmt = VEPU5xx_FMT_YUV420P;
128*437bfbebSnyanmisaka     RK_S32 mb_wd64, mb_h64;
129*437bfbebSnyanmisaka     MppEncRefCfg ref_cfg = ctx->cfg->ref_cfg;
130*437bfbebSnyanmisaka     MppEncPrepCfg *prep = &ctx->cfg->prep;
131*437bfbebSnyanmisaka     RK_S32 old_max_cnt = ctx->max_buf_cnt;
132*437bfbebSnyanmisaka     RK_S32 new_max_cnt = 2;
133*437bfbebSnyanmisaka     RK_S32 alignment = 32;
134*437bfbebSnyanmisaka     RK_S32 aligned_w = MPP_ALIGN(prep->width,  alignment);
135*437bfbebSnyanmisaka 
136*437bfbebSnyanmisaka     hal_h265e_enter();
137*437bfbebSnyanmisaka 
138*437bfbebSnyanmisaka     mb_wd64 = (prep->width + 63) / 64;
139*437bfbebSnyanmisaka     mb_h64 = (prep->height + 63) / 64;
140*437bfbebSnyanmisaka 
141*437bfbebSnyanmisaka     frame_size = MPP_ALIGN(prep->width, 16) * MPP_ALIGN(prep->height, 16);
142*437bfbebSnyanmisaka     vepu5xx_set_fmt(fmt, ctx->cfg->prep.format);
143*437bfbebSnyanmisaka     input_fmt = (VepuFmt)fmt->format;
144*437bfbebSnyanmisaka     switch (input_fmt) {
145*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV400:
146*437bfbebSnyanmisaka         break;
147*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV420P:
148*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV420SP: {
149*437bfbebSnyanmisaka         frame_size = frame_size * 3 / 2;
150*437bfbebSnyanmisaka     } break;
151*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV422P:
152*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUV422SP:
153*437bfbebSnyanmisaka     case VEPU5xx_FMT_YUYV422:
154*437bfbebSnyanmisaka     case VEPU5xx_FMT_UYVY422:
155*437bfbebSnyanmisaka     case VEPU5xx_FMT_BGR565: {
156*437bfbebSnyanmisaka         frame_size *= 2;
157*437bfbebSnyanmisaka     } break;
158*437bfbebSnyanmisaka     case VEPU5xx_FMT_BGR888: {
159*437bfbebSnyanmisaka         frame_size *= 3;
160*437bfbebSnyanmisaka     } break;
161*437bfbebSnyanmisaka     case VEPU5xx_FMT_BGRA8888: {
162*437bfbebSnyanmisaka         frame_size *= 4;
163*437bfbebSnyanmisaka     } break;
164*437bfbebSnyanmisaka     default: {
165*437bfbebSnyanmisaka         hal_h265e_err("invalid src color space: %d\n", input_fmt);
166*437bfbebSnyanmisaka         return MPP_NOK;
167*437bfbebSnyanmisaka     }
168*437bfbebSnyanmisaka     }
169*437bfbebSnyanmisaka 
170*437bfbebSnyanmisaka     if (ref_cfg) {
171*437bfbebSnyanmisaka         MppEncCpbInfo *info = mpp_enc_ref_cfg_get_cpb_info(ref_cfg);
172*437bfbebSnyanmisaka         new_max_cnt = MPP_MAX(new_max_cnt, info->dpb_size + 1);
173*437bfbebSnyanmisaka     }
174*437bfbebSnyanmisaka 
175*437bfbebSnyanmisaka     if (aligned_w > (3 * SZ_1K)) {
176*437bfbebSnyanmisaka         RK_S32 ext_line_buf_size = (aligned_w / 32 - 91) * 26 * 16;
177*437bfbebSnyanmisaka 
178*437bfbebSnyanmisaka         if (NULL == ctx->ext_line_buf_grp)
179*437bfbebSnyanmisaka             mpp_buffer_group_get_internal(&ctx->ext_line_buf_grp, MPP_BUFFER_TYPE_ION);
180*437bfbebSnyanmisaka         else if (ext_line_buf_size != ctx->ext_line_buf_size) {
181*437bfbebSnyanmisaka             mpp_buffer_put(ctx->ext_line_buf);
182*437bfbebSnyanmisaka             ctx->ext_line_buf = NULL;
183*437bfbebSnyanmisaka             mpp_buffer_group_clear(ctx->ext_line_buf_grp);
184*437bfbebSnyanmisaka         }
185*437bfbebSnyanmisaka 
186*437bfbebSnyanmisaka         mpp_assert(ctx->ext_line_buf_grp);
187*437bfbebSnyanmisaka 
188*437bfbebSnyanmisaka         if (NULL == ctx->ext_line_buf)
189*437bfbebSnyanmisaka             mpp_buffer_get(ctx->ext_line_buf_grp, &ctx->ext_line_buf, ext_line_buf_size);
190*437bfbebSnyanmisaka 
191*437bfbebSnyanmisaka         ctx->ext_line_buf_size = ext_line_buf_size;
192*437bfbebSnyanmisaka     } else {
193*437bfbebSnyanmisaka         if (ctx->ext_line_buf) {
194*437bfbebSnyanmisaka             mpp_buffer_put(ctx->ext_line_buf);
195*437bfbebSnyanmisaka             ctx->ext_line_buf = NULL;
196*437bfbebSnyanmisaka         }
197*437bfbebSnyanmisaka 
198*437bfbebSnyanmisaka         if (ctx->ext_line_buf_grp) {
199*437bfbebSnyanmisaka             mpp_buffer_group_clear(ctx->ext_line_buf_grp);
200*437bfbebSnyanmisaka             mpp_buffer_group_put(ctx->ext_line_buf_grp);
201*437bfbebSnyanmisaka             ctx->ext_line_buf_grp = NULL;
202*437bfbebSnyanmisaka         }
203*437bfbebSnyanmisaka         ctx->ext_line_buf_size = 0;
204*437bfbebSnyanmisaka     }
205*437bfbebSnyanmisaka 
206*437bfbebSnyanmisaka     if (frame_size > ctx->frame_size || new_max_cnt > old_max_cnt) {
207*437bfbebSnyanmisaka         size_t size[3] = {0};
208*437bfbebSnyanmisaka 
209*437bfbebSnyanmisaka         hal_bufs_deinit(ctx->dpb_bufs);
210*437bfbebSnyanmisaka         hal_bufs_init(&ctx->dpb_bufs);
211*437bfbebSnyanmisaka 
212*437bfbebSnyanmisaka         ctx->fbc_header_len = MPP_ALIGN(((mb_wd64 * mb_h64) << 6), SZ_8K);
213*437bfbebSnyanmisaka         size[0] = ctx->fbc_header_len + ((mb_wd64 * mb_h64) << 12) * 3 / 2; //fbc_h + fbc_b
214*437bfbebSnyanmisaka         size[1] = (mb_wd64 * mb_h64 << 8);
215*437bfbebSnyanmisaka         size[2] = MPP_ALIGN(mb_wd64 * mb_h64 * 16 * 4, 256) * 16;
216*437bfbebSnyanmisaka         new_max_cnt = MPP_MAX(new_max_cnt, old_max_cnt);
217*437bfbebSnyanmisaka 
218*437bfbebSnyanmisaka         hal_h265e_dbg_detail("frame size %d -> %d max count %d -> %d\n",
219*437bfbebSnyanmisaka                              ctx->frame_size, frame_size, old_max_cnt, new_max_cnt);
220*437bfbebSnyanmisaka 
221*437bfbebSnyanmisaka         hal_bufs_setup(ctx->dpb_bufs, new_max_cnt, 3, size);
222*437bfbebSnyanmisaka 
223*437bfbebSnyanmisaka         ctx->frame_size = frame_size;
224*437bfbebSnyanmisaka         ctx->max_buf_cnt = new_max_cnt;
225*437bfbebSnyanmisaka     }
226*437bfbebSnyanmisaka     hal_h265e_leave();
227*437bfbebSnyanmisaka     return ret;
228*437bfbebSnyanmisaka }
229*437bfbebSnyanmisaka 
vepu540c_h265_rdo_cfg(vepu540c_rdo_cfg * reg)230*437bfbebSnyanmisaka static void vepu540c_h265_rdo_cfg (vepu540c_rdo_cfg *reg)
231*437bfbebSnyanmisaka {
232*437bfbebSnyanmisaka     rdo_skip_par *p_rdo_skip = NULL;
233*437bfbebSnyanmisaka     rdo_noskip_par *p_rdo_noskip = NULL;
234*437bfbebSnyanmisaka     pre_cst_par    *p_pre_cst = NULL;
235*437bfbebSnyanmisaka 
236*437bfbebSnyanmisaka     reg->rdo_segment_cfg.rdo_segment_multi    = 28;
237*437bfbebSnyanmisaka     reg->rdo_segment_cfg.rdo_segment_en       = 1;
238*437bfbebSnyanmisaka     reg->rdo_smear_cfg_comb.rdo_smear_en      =  0;
239*437bfbebSnyanmisaka     reg->rdo_smear_cfg_comb.rdo_smear_lvl16_multi = 9;
240*437bfbebSnyanmisaka     reg->rdo_segment_cfg.rdo_smear_lvl8_multi     = 8;
241*437bfbebSnyanmisaka     reg->rdo_segment_cfg.rdo_smear_lvl4_multi     = 8;
242*437bfbebSnyanmisaka     reg->rdo_smear_cfg_comb.rdo_smear_dlt_qp      = 0 ;
243*437bfbebSnyanmisaka     reg->rdo_smear_cfg_comb.rdo_smear_order_state = 0;
244*437bfbebSnyanmisaka     reg->rdo_smear_cfg_comb.stated_mode           = 0;
245*437bfbebSnyanmisaka     reg->rdo_smear_cfg_comb.online_en             = 0;
246*437bfbebSnyanmisaka     reg->rdo_smear_cfg_comb.smear_stride          = 0;
247*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd0_comb.rdo_smear_madp_cur_thd0 =  0 ;
248*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd0_comb.rdo_smear_madp_cur_thd1 =  24;
249*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd1_comb.rdo_smear_madp_cur_thd2 =  48;
250*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd1_comb.rdo_smear_madp_cur_thd3 =  64;
251*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd2_comb.rdo_smear_madp_around_thd0 = 16;
252*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd2_comb.rdo_smear_madp_around_thd1 = 32;
253*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd3_comb.rdo_smear_madp_around_thd2 = 48;
254*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd3_comb.rdo_smear_madp_around_thd3 = 96;
255*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd4_comb.rdo_smear_madp_around_thd4 = 48;
256*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd4_comb.rdo_smear_madp_around_thd5 = 24;
257*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd5_comb.rdo_smear_madp_ref_thd0 =  96;
258*437bfbebSnyanmisaka     reg->rdo_smear_madp_thd5_comb.rdo_smear_madp_ref_thd1 =  48;
259*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd0_comb.rdo_smear_cnt_cur_thd0    = 1 ;
260*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd0_comb.rdo_smear_cnt_cur_thd1    = 3;
261*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd0_comb.rdo_smear_cnt_cur_thd2    = 1 ;
262*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd0_comb.rdo_smear_cnt_cur_thd3    = 3;
263*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd1_comb.rdo_smear_cnt_around_thd0 = 1 ;
264*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd1_comb.rdo_smear_cnt_around_thd1 = 4 ;
265*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd1_comb.rdo_smear_cnt_around_thd2 = 1 ;
266*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd1_comb.rdo_smear_cnt_around_thd3 = 4 ;
267*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd2_comb.rdo_smear_cnt_around_thd4 = 0;
268*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd2_comb.rdo_smear_cnt_around_thd5 = 3;
269*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd2_comb.rdo_smear_cnt_around_thd6 = 0;
270*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd2_comb.rdo_smear_cnt_around_thd7 = 3;
271*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd3_comb.rdo_smear_cnt_ref_thd0    = 1;
272*437bfbebSnyanmisaka     reg->rdo_smear_cnt_thd3_comb.rdo_smear_cnt_ref_thd1    = 3;
273*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd0_comb.rdo_smear_resi_small_cur_th0    = 6;
274*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd0_comb.rdo_smear_resi_big_cur_th0      = 9;
275*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd0_comb.rdo_smear_resi_small_cur_th1    = 6;
276*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd0_comb.rdo_smear_resi_big_cur_th1      = 9;
277*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd1_comb.rdo_smear_resi_small_around_th0 = 6;
278*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd1_comb.rdo_smear_resi_big_around_th0   = 11;
279*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd1_comb.rdo_smear_resi_small_around_th1 = 6;
280*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd1_comb.rdo_smear_resi_big_around_th1   = 8;
281*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd2_comb.rdo_smear_resi_small_around_th2 = 9;
282*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd2_comb.rdo_smear_resi_big_around_th2   = 20;
283*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd2_comb.rdo_smear_resi_small_around_th3 = 6;
284*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd2_comb.rdo_smear_resi_big_around_th3  = 20;
285*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd3_comb.rdo_smear_resi_small_ref_th0  = 7;
286*437bfbebSnyanmisaka     reg->rdo_smear_resi_thd3_comb.rdo_smear_resi_big_ref_th0 = 16;
287*437bfbebSnyanmisaka     reg->rdo_smear_st_thd0_comb.rdo_smear_resi_th0 = 9;
288*437bfbebSnyanmisaka     reg->rdo_smear_st_thd0_comb.rdo_smear_resi_th1 = 6;
289*437bfbebSnyanmisaka     reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th0 = 1;
290*437bfbebSnyanmisaka     reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th1 = 5;
291*437bfbebSnyanmisaka     reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th2 = 1;
292*437bfbebSnyanmisaka     reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th3 = 3;
293*437bfbebSnyanmisaka     reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th4 = 1;
294*437bfbebSnyanmisaka     reg->rdo_smear_st_thd1_comb.rdo_smear_madp_cnt_th5 = 2;
295*437bfbebSnyanmisaka 
296*437bfbebSnyanmisaka     p_rdo_skip = &reg->rdo_b32_skip;
297*437bfbebSnyanmisaka     p_rdo_skip->atf_thd0.madp_thd0 = 5  ;
298*437bfbebSnyanmisaka     p_rdo_skip->atf_thd0.madp_thd1 = 10 ;
299*437bfbebSnyanmisaka     p_rdo_skip->atf_thd1.madp_thd2 = 15 ;
300*437bfbebSnyanmisaka     p_rdo_skip->atf_thd1.madp_thd3 = 72;
301*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt0.wgt0 =      20;
302*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt0.wgt1 =      16;
303*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt0.wgt2 =      16;
304*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt0.wgt3 =      16;
305*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt1.wgt4 =      16;
306*437bfbebSnyanmisaka 
307*437bfbebSnyanmisaka     p_rdo_noskip = &reg->rdo_b32_inter;
308*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd0 = 20;
309*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd1 = 40;
310*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd1.madp_thd2 = 72;
311*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt0 =        16;
312*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt1 =        16;
313*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt2 =        16;
314*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt3 =        16;
315*437bfbebSnyanmisaka 
316*437bfbebSnyanmisaka     p_rdo_noskip = &reg->rdo_b32_intra;
317*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd0 = 20;
318*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd1 = 40;
319*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd1.madp_thd2 = 72;
320*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt0 =        27;
321*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt1 =        25;
322*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt2 =        20;
323*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt3 =        19;
324*437bfbebSnyanmisaka 
325*437bfbebSnyanmisaka     p_rdo_skip = &reg->rdo_b16_skip;
326*437bfbebSnyanmisaka     p_rdo_skip->atf_thd0.madp_thd0 = 1;
327*437bfbebSnyanmisaka     p_rdo_skip->atf_thd0.madp_thd1 = 10 ;
328*437bfbebSnyanmisaka     p_rdo_skip->atf_thd1.madp_thd2 = 15 ;
329*437bfbebSnyanmisaka     p_rdo_skip->atf_thd1.madp_thd3 = 25 ;
330*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt0.wgt0 =      20 ;
331*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt0.wgt1 =      16;
332*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt0.wgt2 =      16;
333*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt0.wgt3 =      16;
334*437bfbebSnyanmisaka     p_rdo_skip->atf_wgt1.wgt4 =      16;
335*437bfbebSnyanmisaka 
336*437bfbebSnyanmisaka     p_rdo_noskip = &reg->rdo_b16_inter;
337*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd0 = 20;
338*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd1 = 40;
339*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd1.madp_thd2 = 72;
340*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt0 =        16;
341*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt1 =        16;
342*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt2 =        16;
343*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt3 =        16;
344*437bfbebSnyanmisaka 
345*437bfbebSnyanmisaka     p_rdo_noskip = &reg->rdo_b16_intra;
346*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd0 = 20;
347*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd0.madp_thd1 = 40;
348*437bfbebSnyanmisaka     p_rdo_noskip->ratf_thd1.madp_thd2 = 72;
349*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt0 =        27;
350*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt1 =        25;
351*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt2 =        20;
352*437bfbebSnyanmisaka     p_rdo_noskip->atf_wgt.wgt3 =        16;
353*437bfbebSnyanmisaka 
354*437bfbebSnyanmisaka     reg->rdo_b32_intra_atf_cnt_thd.thd0      = 1;
355*437bfbebSnyanmisaka     reg->rdo_b32_intra_atf_cnt_thd.thd1      = 4;
356*437bfbebSnyanmisaka     reg->rdo_b32_intra_atf_cnt_thd.thd2      = 1;
357*437bfbebSnyanmisaka     reg->rdo_b32_intra_atf_cnt_thd.thd3      = 4;
358*437bfbebSnyanmisaka 
359*437bfbebSnyanmisaka     reg->rdo_b16_intra_atf_cnt_thd_comb.thd0 = 1;
360*437bfbebSnyanmisaka     reg->rdo_b16_intra_atf_cnt_thd_comb.thd1 = 4;
361*437bfbebSnyanmisaka     reg->rdo_b16_intra_atf_cnt_thd_comb.thd2 = 1;
362*437bfbebSnyanmisaka     reg->rdo_b16_intra_atf_cnt_thd_comb.thd3 = 4;
363*437bfbebSnyanmisaka     reg->rdo_atf_resi_thd_comb.big_th0     = 16;
364*437bfbebSnyanmisaka     reg->rdo_atf_resi_thd_comb.big_th1     = 16;
365*437bfbebSnyanmisaka     reg->rdo_atf_resi_thd_comb.small_th0   = 8;
366*437bfbebSnyanmisaka     reg->rdo_atf_resi_thd_comb.small_th1   = 8;
367*437bfbebSnyanmisaka 
368*437bfbebSnyanmisaka     p_pre_cst = &reg->preintra32_cst;
369*437bfbebSnyanmisaka     p_pre_cst->cst_madi_thd0.madi_thd0 = 5;
370*437bfbebSnyanmisaka     p_pre_cst->cst_madi_thd0.madi_thd1 = 3;
371*437bfbebSnyanmisaka     p_pre_cst->cst_madi_thd0.madi_thd2 = 3;
372*437bfbebSnyanmisaka     p_pre_cst->cst_madi_thd0.madi_thd3 = 6;
373*437bfbebSnyanmisaka     p_pre_cst->cst_madi_thd1.madi_thd4 = 7;
374*437bfbebSnyanmisaka     p_pre_cst->cst_madi_thd1.madi_thd5 = 10;
375*437bfbebSnyanmisaka     p_pre_cst->cst_wgt0.wgt0          =  20;
376*437bfbebSnyanmisaka     p_pre_cst->cst_wgt0.wgt1          =  18;
377*437bfbebSnyanmisaka     p_pre_cst->cst_wgt0.wgt2          =  19;
378*437bfbebSnyanmisaka     p_pre_cst->cst_wgt0.wgt3          =  18;
379*437bfbebSnyanmisaka     p_pre_cst->cst_wgt1.wgt4          =  6;
380*437bfbebSnyanmisaka     p_pre_cst->cst_wgt1.wgt5          =  9;
381*437bfbebSnyanmisaka     p_pre_cst->cst_wgt1.wgt6          =  14;
382*437bfbebSnyanmisaka     p_pre_cst->cst_wgt1.wgt7          =  18;
383*437bfbebSnyanmisaka     p_pre_cst->cst_wgt2.wgt8          =  17;
384*437bfbebSnyanmisaka     p_pre_cst->cst_wgt2.wgt9          =  17;
385*437bfbebSnyanmisaka     p_pre_cst->cst_wgt2.mode_th       =  5;
386*437bfbebSnyanmisaka 
387*437bfbebSnyanmisaka     p_pre_cst = &reg->preintra16_cst;
388*437bfbebSnyanmisaka     p_pre_cst->cst_madi_thd0.madi_thd0 = 5;
389*437bfbebSnyanmisaka     p_pre_cst->cst_madi_thd0.madi_thd1 = 3;
390*437bfbebSnyanmisaka     p_pre_cst->cst_madi_thd0.madi_thd2 = 3;
391*437bfbebSnyanmisaka     p_pre_cst->cst_madi_thd0.madi_thd3 = 6;
392*437bfbebSnyanmisaka     p_pre_cst->cst_madi_thd1.madi_thd4 = 5;
393*437bfbebSnyanmisaka     p_pre_cst->cst_madi_thd1.madi_thd5 = 7;
394*437bfbebSnyanmisaka     p_pre_cst->cst_wgt0.wgt0          =  20;
395*437bfbebSnyanmisaka     p_pre_cst->cst_wgt0.wgt1          =  18;
396*437bfbebSnyanmisaka     p_pre_cst->cst_wgt0.wgt2          =  19;
397*437bfbebSnyanmisaka     p_pre_cst->cst_wgt0.wgt3          =  18;
398*437bfbebSnyanmisaka     p_pre_cst->cst_wgt1.wgt4          =  6;
399*437bfbebSnyanmisaka     p_pre_cst->cst_wgt1.wgt5          =  9;
400*437bfbebSnyanmisaka     p_pre_cst->cst_wgt1.wgt6          =  14;
401*437bfbebSnyanmisaka     p_pre_cst->cst_wgt1.wgt7          =  18;
402*437bfbebSnyanmisaka     p_pre_cst->cst_wgt2.wgt8          =  17;
403*437bfbebSnyanmisaka     p_pre_cst->cst_wgt2.wgt9          =  17;
404*437bfbebSnyanmisaka     p_pre_cst->cst_wgt2.mode_th       =  5;
405*437bfbebSnyanmisaka 
406*437bfbebSnyanmisaka     reg->preintra_sqi_cfg.pre_intra_qp_thd          = 28;
407*437bfbebSnyanmisaka     reg->preintra_sqi_cfg.pre_intra4_lambda_mv_bit  = 3;
408*437bfbebSnyanmisaka     reg->preintra_sqi_cfg.pre_intra8_lambda_mv_bit  = 4;
409*437bfbebSnyanmisaka     reg->preintra_sqi_cfg.pre_intra16_lambda_mv_bit = 4;
410*437bfbebSnyanmisaka     reg->preintra_sqi_cfg.pre_intra32_lambda_mv_bit = 5;
411*437bfbebSnyanmisaka     reg->rdo_atr_i_cu32_madi_cfg0.i_cu32_madi_thd0 = 3;
412*437bfbebSnyanmisaka     reg->rdo_atr_i_cu32_madi_cfg0.i_cu32_madi_thd1 = 35;
413*437bfbebSnyanmisaka     reg->rdo_atr_i_cu32_madi_cfg0.i_cu32_madi_thd2 = 25;
414*437bfbebSnyanmisaka     reg->rdo_atr_i_cu32_madi_cfg1.i_cu32_madi_cnt_thd3   = 0;
415*437bfbebSnyanmisaka     reg->rdo_atr_i_cu32_madi_cfg1.i_cu32_madi_thd4       = 20;
416*437bfbebSnyanmisaka     reg->rdo_atr_i_cu32_madi_cfg1.i_cu32_madi_cost_multi = 24;
417*437bfbebSnyanmisaka     reg->rdo_atr_i_cu16_madi_cfg0.i_cu16_madi_thd0       = 4;
418*437bfbebSnyanmisaka     reg->rdo_atr_i_cu16_madi_cfg0.i_cu16_madi_thd1       = 6;
419*437bfbebSnyanmisaka     reg->rdo_atr_i_cu16_madi_cfg0.i_cu16_madi_cost_multi = 24;
420*437bfbebSnyanmisaka 
421*437bfbebSnyanmisaka }
422*437bfbebSnyanmisaka 
vepu540c_h265_global_cfg_set(H265eV540cHalContext * ctx,H265eV540cRegSet * regs)423*437bfbebSnyanmisaka static void vepu540c_h265_global_cfg_set(H265eV540cHalContext *ctx, H265eV540cRegSet *regs)
424*437bfbebSnyanmisaka {
425*437bfbebSnyanmisaka     MppEncHwCfg *hw = &ctx->cfg->hw;
426*437bfbebSnyanmisaka     RK_U32 i;
427*437bfbebSnyanmisaka     hevc_vepu540c_rc_roi *rc_regs =  &regs->reg_rc_roi;
428*437bfbebSnyanmisaka     hevc_vepu540c_wgt *reg_wgt = &regs->reg_wgt;
429*437bfbebSnyanmisaka     vepu540c_rdo_cfg  *reg_rdo = &regs->reg_rdo;
430*437bfbebSnyanmisaka     vepu540c_h265_rdo_cfg(reg_rdo);
431*437bfbebSnyanmisaka 
432*437bfbebSnyanmisaka     if (ctx->frame_type == INTRA_FRAME) {
433*437bfbebSnyanmisaka         for (i = 0; i < MPP_ARRAY_ELEMS(aq_thd_default); i++) {
434*437bfbebSnyanmisaka             rc_regs->aq_tthd[i]  = hw->aq_thrd_i[i];
435*437bfbebSnyanmisaka             rc_regs->aq_step[i] = hw->aq_step_i[i] & 0x3f;
436*437bfbebSnyanmisaka         }
437*437bfbebSnyanmisaka         reg_wgt->iprd_lamb_satd_ofst.lambda_satd_offset = 11;
438*437bfbebSnyanmisaka         memcpy(&reg_wgt->rdo_wgta_qp_grpa_0_51[0], lamd_moda_qp, sizeof(lamd_moda_qp));
439*437bfbebSnyanmisaka     } else {
440*437bfbebSnyanmisaka         for (i = 0; i < MPP_ARRAY_ELEMS(aq_thd_default); i++) {
441*437bfbebSnyanmisaka             rc_regs->aq_tthd[i] = hw->aq_thrd_p[i];
442*437bfbebSnyanmisaka             rc_regs->aq_step[i] = hw->aq_step_p[i] & 0x3f;
443*437bfbebSnyanmisaka         }
444*437bfbebSnyanmisaka         reg_wgt->iprd_lamb_satd_ofst.lambda_satd_offset = 11;
445*437bfbebSnyanmisaka         memcpy(&reg_wgt->rdo_wgta_qp_grpa_0_51[0], lamd_modb_qp, sizeof(lamd_modb_qp));
446*437bfbebSnyanmisaka     }
447*437bfbebSnyanmisaka     reg_wgt->reg1484_qnt_bias_comb.qnt_bias_i = 171;
448*437bfbebSnyanmisaka     reg_wgt->reg1484_qnt_bias_comb.qnt_bias_p = 85;
449*437bfbebSnyanmisaka     if (hw->qbias_en) {
450*437bfbebSnyanmisaka         reg_wgt->reg1484_qnt_bias_comb.qnt_bias_i = hw->qbias_i;
451*437bfbebSnyanmisaka         reg_wgt->reg1484_qnt_bias_comb.qnt_bias_p = hw->qbias_p;
452*437bfbebSnyanmisaka     }
453*437bfbebSnyanmisaka     /* CIME */
454*437bfbebSnyanmisaka     {
455*437bfbebSnyanmisaka         /* 0x1760 */
456*437bfbebSnyanmisaka         regs->reg_wgt.me_sqi_cfg.cime_pmv_num = 1;
457*437bfbebSnyanmisaka         regs->reg_wgt.me_sqi_cfg.cime_fuse   = 1;
458*437bfbebSnyanmisaka         regs->reg_wgt.me_sqi_cfg.itp_mode    = 0;
459*437bfbebSnyanmisaka         regs->reg_wgt.me_sqi_cfg.move_lambda = 2;
460*437bfbebSnyanmisaka         regs->reg_wgt.me_sqi_cfg.rime_lvl_mrg     = 0;
461*437bfbebSnyanmisaka         regs->reg_wgt.me_sqi_cfg.rime_prelvl_en   = 3;
462*437bfbebSnyanmisaka         regs->reg_wgt.me_sqi_cfg.rime_prersu_en   = 3;
463*437bfbebSnyanmisaka 
464*437bfbebSnyanmisaka         /* 0x1764 */
465*437bfbebSnyanmisaka         regs->reg_wgt.cime_mvd_th.cime_mvd_th0 = 8;
466*437bfbebSnyanmisaka         regs->reg_wgt.cime_mvd_th.cime_mvd_th1 = 20;
467*437bfbebSnyanmisaka         regs->reg_wgt.cime_mvd_th.cime_mvd_th2 = 32;
468*437bfbebSnyanmisaka 
469*437bfbebSnyanmisaka         /* 0x1768 */
470*437bfbebSnyanmisaka         regs->reg_wgt.cime_madp_th.cime_madp_th = 16;
471*437bfbebSnyanmisaka 
472*437bfbebSnyanmisaka         /* 0x176c */
473*437bfbebSnyanmisaka         regs->reg_wgt.cime_multi.cime_multi0 = 8;
474*437bfbebSnyanmisaka         regs->reg_wgt.cime_multi.cime_multi1 = 12;
475*437bfbebSnyanmisaka         regs->reg_wgt.cime_multi.cime_multi2 = 16;
476*437bfbebSnyanmisaka         regs->reg_wgt.cime_multi.cime_multi3 = 20;
477*437bfbebSnyanmisaka     }
478*437bfbebSnyanmisaka 
479*437bfbebSnyanmisaka     /* RIME && FME */
480*437bfbebSnyanmisaka     {
481*437bfbebSnyanmisaka         /* 0x1770 */
482*437bfbebSnyanmisaka         regs->reg_wgt.rime_mvd_th.rime_mvd_th0  = 1;
483*437bfbebSnyanmisaka         regs->reg_wgt.rime_mvd_th.rime_mvd_th1  = 2;
484*437bfbebSnyanmisaka         regs->reg_wgt.rime_mvd_th.fme_madp_th   = 0;
485*437bfbebSnyanmisaka 
486*437bfbebSnyanmisaka         /* 0x1774 */
487*437bfbebSnyanmisaka         regs->reg_wgt.rime_madp_th.rime_madp_th0 = 8;
488*437bfbebSnyanmisaka         regs->reg_wgt.rime_madp_th.rime_madp_th1 = 16;
489*437bfbebSnyanmisaka 
490*437bfbebSnyanmisaka         /* 0x1778 */
491*437bfbebSnyanmisaka         regs->reg_wgt.rime_multi.rime_multi0 = 4;
492*437bfbebSnyanmisaka         regs->reg_wgt.rime_multi.rime_multi1 = 8;
493*437bfbebSnyanmisaka         regs->reg_wgt.rime_multi.rime_multi2 = 12;
494*437bfbebSnyanmisaka 
495*437bfbebSnyanmisaka         /* 0x177C */
496*437bfbebSnyanmisaka         regs->reg_wgt.cmv_st_th.cmv_th0 = 64;
497*437bfbebSnyanmisaka         regs->reg_wgt.cmv_st_th.cmv_th1 = 96;
498*437bfbebSnyanmisaka         regs->reg_wgt.cmv_st_th.cmv_th2 = 128;
499*437bfbebSnyanmisaka     }
500*437bfbebSnyanmisaka }
501*437bfbebSnyanmisaka 
hal_h265e_v540c_init(void * hal,MppEncHalCfg * cfg)502*437bfbebSnyanmisaka MPP_RET hal_h265e_v540c_init(void *hal, MppEncHalCfg *cfg)
503*437bfbebSnyanmisaka {
504*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
505*437bfbebSnyanmisaka     H265eV540cHalContext *ctx = (H265eV540cHalContext *)hal;
506*437bfbebSnyanmisaka     RK_U32 i = 0;
507*437bfbebSnyanmisaka 
508*437bfbebSnyanmisaka     mpp_env_get_u32("hal_h265e_debug", &hal_h265e_debug, 0);
509*437bfbebSnyanmisaka 
510*437bfbebSnyanmisaka     hal_h265e_enter();
511*437bfbebSnyanmisaka 
512*437bfbebSnyanmisaka     for ( i = 0; i < MAX_TITLE_NUM; i++) {
513*437bfbebSnyanmisaka         ctx->reg_out[i]  = mpp_calloc(H265eV540cStatusElem, 1);
514*437bfbebSnyanmisaka     }
515*437bfbebSnyanmisaka 
516*437bfbebSnyanmisaka     ctx->regs           = mpp_calloc(H265eV540cRegSet, 1);
517*437bfbebSnyanmisaka     ctx->input_fmt      = mpp_calloc(VepuFmtCfg, 1);
518*437bfbebSnyanmisaka     ctx->cfg            = cfg->cfg;
519*437bfbebSnyanmisaka     hal_bufs_init(&ctx->dpb_bufs);
520*437bfbebSnyanmisaka 
521*437bfbebSnyanmisaka     ctx->frame_cnt = 0;
522*437bfbebSnyanmisaka     ctx->frame_cnt_gen_ready = 0;
523*437bfbebSnyanmisaka     ctx->enc_mode = 1;
524*437bfbebSnyanmisaka     cfg->type = VPU_CLIENT_RKVENC;
525*437bfbebSnyanmisaka     ret = mpp_dev_init(&cfg->dev, cfg->type);
526*437bfbebSnyanmisaka     if (ret) {
527*437bfbebSnyanmisaka         mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
528*437bfbebSnyanmisaka         return ret;
529*437bfbebSnyanmisaka     }
530*437bfbebSnyanmisaka 
531*437bfbebSnyanmisaka     ctx->dev = cfg->dev;
532*437bfbebSnyanmisaka     ctx->frame_type = INTRA_FRAME;
533*437bfbebSnyanmisaka 
534*437bfbebSnyanmisaka     {   /* setup default hardware config */
535*437bfbebSnyanmisaka         MppEncHwCfg *hw = &cfg->cfg->hw;
536*437bfbebSnyanmisaka 
537*437bfbebSnyanmisaka         hw->qp_delta_row_i  = 2;
538*437bfbebSnyanmisaka         hw->qp_delta_row    = 2;
539*437bfbebSnyanmisaka         hw->qbias_i         = 171;
540*437bfbebSnyanmisaka         hw->qbias_p         = 85;
541*437bfbebSnyanmisaka         hw->qbias_en        = 0;
542*437bfbebSnyanmisaka 
543*437bfbebSnyanmisaka         memcpy(hw->aq_thrd_i, aq_thd_default, sizeof(hw->aq_thrd_i));
544*437bfbebSnyanmisaka         memcpy(hw->aq_thrd_p, aq_thd_default, sizeof(hw->aq_thrd_p));
545*437bfbebSnyanmisaka         memcpy(hw->aq_step_i, aq_qp_dealt_default, sizeof(hw->aq_step_i));
546*437bfbebSnyanmisaka         memcpy(hw->aq_step_p, aq_qp_dealt_default, sizeof(hw->aq_step_p));
547*437bfbebSnyanmisaka     }
548*437bfbebSnyanmisaka 
549*437bfbebSnyanmisaka     hal_h265e_leave();
550*437bfbebSnyanmisaka     return ret;
551*437bfbebSnyanmisaka }
552*437bfbebSnyanmisaka 
hal_h265e_v540c_deinit(void * hal)553*437bfbebSnyanmisaka MPP_RET hal_h265e_v540c_deinit(void *hal)
554*437bfbebSnyanmisaka {
555*437bfbebSnyanmisaka     H265eV540cHalContext *ctx = (H265eV540cHalContext *)hal;
556*437bfbebSnyanmisaka     RK_U32 i = 0;
557*437bfbebSnyanmisaka 
558*437bfbebSnyanmisaka     hal_h265e_enter();
559*437bfbebSnyanmisaka     MPP_FREE(ctx->regs);
560*437bfbebSnyanmisaka 
561*437bfbebSnyanmisaka     for ( i = 0; i < MAX_TITLE_NUM; i++) {
562*437bfbebSnyanmisaka         MPP_FREE(ctx->reg_out[i]);
563*437bfbebSnyanmisaka     }
564*437bfbebSnyanmisaka 
565*437bfbebSnyanmisaka     MPP_FREE(ctx->input_fmt);
566*437bfbebSnyanmisaka     hal_bufs_deinit(ctx->dpb_bufs);
567*437bfbebSnyanmisaka 
568*437bfbebSnyanmisaka     if (ctx->ext_line_buf) {
569*437bfbebSnyanmisaka         mpp_buffer_put(ctx->ext_line_buf);
570*437bfbebSnyanmisaka         ctx->ext_line_buf = NULL;
571*437bfbebSnyanmisaka     }
572*437bfbebSnyanmisaka 
573*437bfbebSnyanmisaka     if (ctx->ext_line_buf_grp) {
574*437bfbebSnyanmisaka         mpp_buffer_group_put(ctx->ext_line_buf_grp);
575*437bfbebSnyanmisaka         ctx->ext_line_buf_grp = NULL;
576*437bfbebSnyanmisaka     }
577*437bfbebSnyanmisaka 
578*437bfbebSnyanmisaka     if (ctx->dev) {
579*437bfbebSnyanmisaka         mpp_dev_deinit(ctx->dev);
580*437bfbebSnyanmisaka         ctx->dev = NULL;
581*437bfbebSnyanmisaka     }
582*437bfbebSnyanmisaka     hal_h265e_leave();
583*437bfbebSnyanmisaka     return MPP_OK;
584*437bfbebSnyanmisaka }
585*437bfbebSnyanmisaka 
hal_h265e_vepu540c_prepare(void * hal)586*437bfbebSnyanmisaka static MPP_RET hal_h265e_vepu540c_prepare(void *hal)
587*437bfbebSnyanmisaka {
588*437bfbebSnyanmisaka     H265eV540cHalContext *ctx = (H265eV540cHalContext *)hal;
589*437bfbebSnyanmisaka     MppEncPrepCfg *prep = &ctx->cfg->prep;
590*437bfbebSnyanmisaka 
591*437bfbebSnyanmisaka     hal_h265e_dbg_func("enter %p\n", hal);
592*437bfbebSnyanmisaka 
593*437bfbebSnyanmisaka     if (prep->change_res) {
594*437bfbebSnyanmisaka         RK_S32 i;
595*437bfbebSnyanmisaka 
596*437bfbebSnyanmisaka         // pre-alloc required buffers to reduce first frame delay
597*437bfbebSnyanmisaka         vepu540c_h265_setup_hal_bufs(ctx);
598*437bfbebSnyanmisaka         for (i = 0; i < ctx->max_buf_cnt; i++)
599*437bfbebSnyanmisaka             hal_bufs_get_buf(ctx->dpb_bufs, i);
600*437bfbebSnyanmisaka 
601*437bfbebSnyanmisaka         prep->change_res = 0;
602*437bfbebSnyanmisaka     }
603*437bfbebSnyanmisaka 
604*437bfbebSnyanmisaka     hal_h265e_dbg_func("leave %p\n", hal);
605*437bfbebSnyanmisaka 
606*437bfbebSnyanmisaka     return MPP_OK;
607*437bfbebSnyanmisaka }
608*437bfbebSnyanmisaka 
609*437bfbebSnyanmisaka static MPP_RET
vepu540c_h265_set_patch_info(MppDev dev,H265eSyntax_new * syn,VepuFmt input_fmt,HalEncTask * task)610*437bfbebSnyanmisaka vepu540c_h265_set_patch_info(MppDev dev, H265eSyntax_new *syn, VepuFmt input_fmt, HalEncTask *task)
611*437bfbebSnyanmisaka {
612*437bfbebSnyanmisaka     RK_U32 hor_stride = syn->pp.hor_stride;
613*437bfbebSnyanmisaka     RK_U32 ver_stride = syn->pp.ver_stride ? syn->pp.ver_stride : syn->pp.pic_height;
614*437bfbebSnyanmisaka     RK_U32 frame_size = hor_stride * ver_stride;
615*437bfbebSnyanmisaka     RK_U32 u_offset = 0, v_offset = 0;
616*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
617*437bfbebSnyanmisaka 
618*437bfbebSnyanmisaka 
619*437bfbebSnyanmisaka     if (MPP_FRAME_FMT_IS_FBC(mpp_frame_get_fmt(task->frame))) {
620*437bfbebSnyanmisaka         u_offset = mpp_frame_get_fbc_offset(task->frame);
621*437bfbebSnyanmisaka         v_offset = 0;
622*437bfbebSnyanmisaka         mpp_log("fbc case u_offset = %d", u_offset);
623*437bfbebSnyanmisaka     } else {
624*437bfbebSnyanmisaka         switch (input_fmt) {
625*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV420P: {
626*437bfbebSnyanmisaka             u_offset = frame_size;
627*437bfbebSnyanmisaka             v_offset = frame_size * 5 / 4;
628*437bfbebSnyanmisaka         } break;
629*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV420SP:
630*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV422SP: {
631*437bfbebSnyanmisaka             u_offset = frame_size;
632*437bfbebSnyanmisaka             v_offset = frame_size;
633*437bfbebSnyanmisaka         } break;
634*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV422P: {
635*437bfbebSnyanmisaka             u_offset = frame_size;
636*437bfbebSnyanmisaka             v_offset = frame_size * 3 / 2;
637*437bfbebSnyanmisaka         } break;
638*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUV400:
639*437bfbebSnyanmisaka         case VEPU5xx_FMT_YUYV422:
640*437bfbebSnyanmisaka         case VEPU5xx_FMT_UYVY422: {
641*437bfbebSnyanmisaka             u_offset = 0;
642*437bfbebSnyanmisaka             v_offset = 0;
643*437bfbebSnyanmisaka         } break;
644*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGR565:
645*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGR888:
646*437bfbebSnyanmisaka         case VEPU5xx_FMT_BGRA8888: {
647*437bfbebSnyanmisaka             u_offset = 0;
648*437bfbebSnyanmisaka             v_offset = 0;
649*437bfbebSnyanmisaka         } break;
650*437bfbebSnyanmisaka         default: {
651*437bfbebSnyanmisaka             hal_h265e_err("unknown color space: %d\n", input_fmt);
652*437bfbebSnyanmisaka             u_offset = frame_size;
653*437bfbebSnyanmisaka             v_offset = frame_size * 5 / 4;
654*437bfbebSnyanmisaka         }
655*437bfbebSnyanmisaka         }
656*437bfbebSnyanmisaka     }
657*437bfbebSnyanmisaka 
658*437bfbebSnyanmisaka     /* input cb addr */
659*437bfbebSnyanmisaka     if (u_offset) {
660*437bfbebSnyanmisaka         ret = mpp_dev_set_reg_offset(dev, 161, u_offset);
661*437bfbebSnyanmisaka         if (ret)
662*437bfbebSnyanmisaka             mpp_err_f("set input cb addr offset failed %d\n", ret);
663*437bfbebSnyanmisaka     }
664*437bfbebSnyanmisaka 
665*437bfbebSnyanmisaka     /* input cr addr */
666*437bfbebSnyanmisaka     if (v_offset) {
667*437bfbebSnyanmisaka         ret = mpp_dev_set_reg_offset(dev, 162, v_offset);
668*437bfbebSnyanmisaka         if (ret)
669*437bfbebSnyanmisaka             mpp_err_f("set input cr addr offset failed %d\n", ret);
670*437bfbebSnyanmisaka     }
671*437bfbebSnyanmisaka 
672*437bfbebSnyanmisaka     return ret;
673*437bfbebSnyanmisaka }
674*437bfbebSnyanmisaka 
675*437bfbebSnyanmisaka 
676*437bfbebSnyanmisaka #if 0
677*437bfbebSnyanmisaka static MPP_RET vepu540c_h265_set_roi_regs(H265eV540cHalContext *ctx, hevc_vepu540c_base *regs)
678*437bfbebSnyanmisaka {
679*437bfbebSnyanmisaka     /* memset register on start so do not clear registers again here */
680*437bfbebSnyanmisaka     if (ctx->roi_data) {
681*437bfbebSnyanmisaka         /* roi setup */
682*437bfbebSnyanmisaka         MppEncROICfg2 *cfg = ( MppEncROICfg2 *)ctx->roi_data;
683*437bfbebSnyanmisaka 
684*437bfbebSnyanmisaka         regs->reg0192_enc_pic.roi_en = 1;
685*437bfbebSnyanmisaka         regs->reg0178_roi_addr = mpp_dev_get_iova_address(ctx->dev, cfg->base_cfg_buf, 0);
686*437bfbebSnyanmisaka         if (cfg->roi_qp_en) {
687*437bfbebSnyanmisaka             regs->reg0179_roi_qp_addr = mpp_dev_get_iova_address(ctx->dev, cfg->qp_cfg_buf, 0);
688*437bfbebSnyanmisaka             regs->reg0228_roi_en.roi_qp_en = 1;
689*437bfbebSnyanmisaka         }
690*437bfbebSnyanmisaka 
691*437bfbebSnyanmisaka         if (cfg->roi_amv_en) {
692*437bfbebSnyanmisaka             regs->reg0180_roi_amv_addr = mpp_dev_get_iova_address(ctx->dev, cfg->amv_cfg_buf, 0);
693*437bfbebSnyanmisaka             regs->reg0228_roi_en.roi_amv_en = 1;
694*437bfbebSnyanmisaka         }
695*437bfbebSnyanmisaka 
696*437bfbebSnyanmisaka         if (cfg->roi_mv_en) {
697*437bfbebSnyanmisaka             regs->reg0181_roi_mv_addr = mpp_dev_get_iova_address(ctx->dev, cfg->mv_cfg_buf, 0);
698*437bfbebSnyanmisaka             regs->reg0228_roi_en.roi_mv_en = 1;
699*437bfbebSnyanmisaka         }
700*437bfbebSnyanmisaka     }
701*437bfbebSnyanmisaka 
702*437bfbebSnyanmisaka     return MPP_OK;
703*437bfbebSnyanmisaka }
704*437bfbebSnyanmisaka #endif
705*437bfbebSnyanmisaka 
vepu540c_h265_set_rc_regs(H265eV540cHalContext * ctx,H265eV540cRegSet * regs,HalEncTask * task)706*437bfbebSnyanmisaka static MPP_RET vepu540c_h265_set_rc_regs(H265eV540cHalContext *ctx, H265eV540cRegSet *regs, HalEncTask *task)
707*437bfbebSnyanmisaka {
708*437bfbebSnyanmisaka     H265eSyntax_new *syn = (H265eSyntax_new *)task->syntax.data;
709*437bfbebSnyanmisaka     EncRcTaskInfo *rc_cfg = &task->rc_task->info;
710*437bfbebSnyanmisaka     hevc_vepu540c_base *reg_base = &regs->reg_base;
711*437bfbebSnyanmisaka     hevc_vepu540c_rc_roi *reg_rc = &regs->reg_rc_roi;
712*437bfbebSnyanmisaka     MppEncCfgSet *cfg = ctx->cfg;
713*437bfbebSnyanmisaka     MppEncRcCfg *rc = &cfg->rc;
714*437bfbebSnyanmisaka     MppEncHwCfg *hw = &cfg->hw;
715*437bfbebSnyanmisaka     MppEncH265Cfg *h265 = &cfg->h265;
716*437bfbebSnyanmisaka     RK_S32 mb_wd32 = (syn->pp.pic_width + 31) / 32;
717*437bfbebSnyanmisaka     RK_S32 mb_h32 = (syn->pp.pic_height + 31) / 32;
718*437bfbebSnyanmisaka 
719*437bfbebSnyanmisaka     RK_U32 ctu_target_bits_mul_16 = (rc_cfg->bit_target << 4) / (mb_wd32 * mb_h32);
720*437bfbebSnyanmisaka     RK_U32 ctu_target_bits;
721*437bfbebSnyanmisaka     RK_S32 negative_bits_thd, positive_bits_thd;
722*437bfbebSnyanmisaka 
723*437bfbebSnyanmisaka     if (rc->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
724*437bfbebSnyanmisaka         reg_base->reg0192_enc_pic.pic_qp    = rc_cfg->quality_target;
725*437bfbebSnyanmisaka         reg_base->reg0240_synt_sli1.sli_qp  = rc_cfg->quality_target;
726*437bfbebSnyanmisaka 
727*437bfbebSnyanmisaka         reg_base->reg213_rc_qp.rc_max_qp   = rc_cfg->quality_target;
728*437bfbebSnyanmisaka         reg_base->reg213_rc_qp.rc_min_qp   = rc_cfg->quality_target;
729*437bfbebSnyanmisaka     } else {
730*437bfbebSnyanmisaka         if (ctu_target_bits_mul_16 >= 0x100000) {
731*437bfbebSnyanmisaka             ctu_target_bits_mul_16 = 0x50000;
732*437bfbebSnyanmisaka         }
733*437bfbebSnyanmisaka         ctu_target_bits = (ctu_target_bits_mul_16 * mb_wd32) >> 4;
734*437bfbebSnyanmisaka         negative_bits_thd = 0 - 5 * ctu_target_bits / 16;
735*437bfbebSnyanmisaka         positive_bits_thd = 5 * ctu_target_bits / 16;
736*437bfbebSnyanmisaka 
737*437bfbebSnyanmisaka         reg_base->reg0192_enc_pic.pic_qp    = rc_cfg->quality_target;
738*437bfbebSnyanmisaka         reg_base->reg0240_synt_sli1.sli_qp  = rc_cfg->quality_target;
739*437bfbebSnyanmisaka         reg_base->reg212_rc_cfg.rc_en      = 1;
740*437bfbebSnyanmisaka         reg_base->reg212_rc_cfg.aq_en  = 1;
741*437bfbebSnyanmisaka         reg_base->reg212_rc_cfg.aq_mode    = 0;
742*437bfbebSnyanmisaka         reg_base->reg212_rc_cfg.rc_ctu_num = mb_wd32;
743*437bfbebSnyanmisaka         reg_base->reg213_rc_qp.rc_qp_range = (ctx->frame_type == INTRA_FRAME) ?
744*437bfbebSnyanmisaka                                              hw->qp_delta_row_i : hw->qp_delta_row;
745*437bfbebSnyanmisaka         reg_base->reg213_rc_qp.rc_max_qp   = rc_cfg->quality_max;
746*437bfbebSnyanmisaka         reg_base->reg213_rc_qp.rc_min_qp   = rc_cfg->quality_min;
747*437bfbebSnyanmisaka         reg_base->reg214_rc_tgt.ctu_ebit  = ctu_target_bits_mul_16;
748*437bfbebSnyanmisaka 
749*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[0] = 4 * negative_bits_thd;
750*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[1] = negative_bits_thd;
751*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[2] = positive_bits_thd;
752*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[3] = 4 * positive_bits_thd;
753*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[4] = 0x7FFFFFFF;
754*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[5] = 0x7FFFFFFF;
755*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[6] = 0x7FFFFFFF;
756*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[7] = 0x7FFFFFFF;
757*437bfbebSnyanmisaka         reg_rc->rc_dthd_0_8[8] = 0x7FFFFFFF;
758*437bfbebSnyanmisaka 
759*437bfbebSnyanmisaka         reg_rc->rc_adj0.qp_adj0    = -2;
760*437bfbebSnyanmisaka         reg_rc->rc_adj0.qp_adj1    = -1;
761*437bfbebSnyanmisaka         reg_rc->rc_adj0.qp_adj2    = 0;
762*437bfbebSnyanmisaka         reg_rc->rc_adj0.qp_adj3    = 1;
763*437bfbebSnyanmisaka         reg_rc->rc_adj0.qp_adj4    = 2;
764*437bfbebSnyanmisaka         reg_rc->rc_adj1.qp_adj5    = 0;
765*437bfbebSnyanmisaka         reg_rc->rc_adj1.qp_adj6    = 0;
766*437bfbebSnyanmisaka         reg_rc->rc_adj1.qp_adj7    = 0;
767*437bfbebSnyanmisaka         reg_rc->rc_adj1.qp_adj8    = 0;
768*437bfbebSnyanmisaka     }
769*437bfbebSnyanmisaka 
770*437bfbebSnyanmisaka     reg_rc->roi_qthd0.qpmin_area0 = h265->qpmin_map[0] > 0 ? h265->qpmin_map[0] : rc_cfg->quality_min;
771*437bfbebSnyanmisaka     reg_rc->roi_qthd0.qpmax_area0 = h265->qpmax_map[0] > 0 ? h265->qpmax_map[0] : rc_cfg->quality_max;
772*437bfbebSnyanmisaka     reg_rc->roi_qthd0.qpmin_area1 = h265->qpmin_map[1] > 0 ? h265->qpmin_map[1] : rc_cfg->quality_min;
773*437bfbebSnyanmisaka     reg_rc->roi_qthd0.qpmax_area1 = h265->qpmax_map[1] > 0 ? h265->qpmax_map[1] : rc_cfg->quality_max;
774*437bfbebSnyanmisaka     reg_rc->roi_qthd0.qpmin_area2 = h265->qpmin_map[2] > 0 ? h265->qpmin_map[2] : rc_cfg->quality_min;
775*437bfbebSnyanmisaka     reg_rc->roi_qthd1.qpmax_area2 = h265->qpmax_map[2] > 0 ? h265->qpmax_map[2] : rc_cfg->quality_max;
776*437bfbebSnyanmisaka     reg_rc->roi_qthd1.qpmin_area3 = h265->qpmin_map[3] > 0 ? h265->qpmin_map[3] : rc_cfg->quality_min;
777*437bfbebSnyanmisaka     reg_rc->roi_qthd1.qpmax_area3 = h265->qpmax_map[3] > 0 ? h265->qpmax_map[3] : rc_cfg->quality_max;
778*437bfbebSnyanmisaka     reg_rc->roi_qthd1.qpmin_area4 = h265->qpmin_map[4] > 0 ? h265->qpmin_map[4] : rc_cfg->quality_min;
779*437bfbebSnyanmisaka     reg_rc->roi_qthd1.qpmax_area4 = h265->qpmax_map[4] > 0 ? h265->qpmax_map[4] : rc_cfg->quality_max;
780*437bfbebSnyanmisaka     reg_rc->roi_qthd2.qpmin_area5 = h265->qpmin_map[5] > 0 ? h265->qpmin_map[5] : rc_cfg->quality_min;
781*437bfbebSnyanmisaka     reg_rc->roi_qthd2.qpmax_area5 = h265->qpmax_map[5] > 0 ? h265->qpmax_map[5] : rc_cfg->quality_max;
782*437bfbebSnyanmisaka     reg_rc->roi_qthd2.qpmin_area6 = h265->qpmin_map[6] > 0 ? h265->qpmin_map[6] : rc_cfg->quality_min;
783*437bfbebSnyanmisaka     reg_rc->roi_qthd2.qpmax_area6 = h265->qpmax_map[6] > 0 ? h265->qpmax_map[6] : rc_cfg->quality_max;
784*437bfbebSnyanmisaka     reg_rc->roi_qthd2.qpmin_area7 = h265->qpmin_map[7] > 0 ? h265->qpmin_map[7] : rc_cfg->quality_min;
785*437bfbebSnyanmisaka     reg_rc->roi_qthd3.qpmax_area7 = h265->qpmax_map[7] > 0 ? h265->qpmax_map[7] : rc_cfg->quality_max;
786*437bfbebSnyanmisaka     reg_rc->roi_qthd3.qpmap_mode  = h265->qpmap_mode;
787*437bfbebSnyanmisaka 
788*437bfbebSnyanmisaka     return MPP_OK;
789*437bfbebSnyanmisaka }
790*437bfbebSnyanmisaka 
vepu540c_h265_set_pp_regs(H265eV540cRegSet * regs,VepuFmtCfg * fmt,MppEncPrepCfg * prep_cfg)791*437bfbebSnyanmisaka static MPP_RET vepu540c_h265_set_pp_regs(H265eV540cRegSet *regs, VepuFmtCfg *fmt, MppEncPrepCfg *prep_cfg)
792*437bfbebSnyanmisaka {
793*437bfbebSnyanmisaka     hevc_vepu540c_control_cfg *reg_ctl = &regs->reg_ctl;
794*437bfbebSnyanmisaka     hevc_vepu540c_base        *reg_base = &regs->reg_base;
795*437bfbebSnyanmisaka     RK_S32 stridey = 0;
796*437bfbebSnyanmisaka     RK_S32 stridec = 0;
797*437bfbebSnyanmisaka 
798*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.src_bus_edin = fmt->src_endian;
799*437bfbebSnyanmisaka     reg_base->reg0198_src_fmt.src_cfmt = fmt->format;
800*437bfbebSnyanmisaka     reg_base->reg0198_src_fmt.alpha_swap = fmt->alpha_swap;
801*437bfbebSnyanmisaka     reg_base->reg0198_src_fmt.rbuv_swap = fmt->rbuv_swap;
802*437bfbebSnyanmisaka 
803*437bfbebSnyanmisaka     reg_base->reg0198_src_fmt.out_fmt = (prep_cfg->format == MPP_FMT_YUV400) ? 0 : 1;
804*437bfbebSnyanmisaka     reg_base->reg0203_src_proc.src_mirr = prep_cfg->mirroring > 0;
805*437bfbebSnyanmisaka     reg_base->reg0203_src_proc.src_rot = prep_cfg->rotation;
806*437bfbebSnyanmisaka 
807*437bfbebSnyanmisaka     if (prep_cfg->hor_stride) {
808*437bfbebSnyanmisaka         stridey = prep_cfg->hor_stride;
809*437bfbebSnyanmisaka     } else {
810*437bfbebSnyanmisaka         if (reg_base->reg0198_src_fmt.src_cfmt == VEPU5xx_FMT_BGRA8888 )
811*437bfbebSnyanmisaka             stridey = prep_cfg->width * 4;
812*437bfbebSnyanmisaka         else if (reg_base->reg0198_src_fmt.src_cfmt == VEPU5xx_FMT_BGR888 )
813*437bfbebSnyanmisaka             stridey = prep_cfg->width * 3;
814*437bfbebSnyanmisaka         else if (reg_base->reg0198_src_fmt.src_cfmt == VEPU5xx_FMT_BGR565 ||
815*437bfbebSnyanmisaka                  reg_base->reg0198_src_fmt.src_cfmt == VEPU5xx_FMT_YUYV422 ||
816*437bfbebSnyanmisaka                  reg_base->reg0198_src_fmt.src_cfmt == VEPU5xx_FMT_UYVY422)
817*437bfbebSnyanmisaka             stridey = prep_cfg->width * 2;
818*437bfbebSnyanmisaka     }
819*437bfbebSnyanmisaka 
820*437bfbebSnyanmisaka     stridec = (reg_base->reg0198_src_fmt.src_cfmt == VEPU5xx_FMT_YUV422SP ||
821*437bfbebSnyanmisaka                reg_base->reg0198_src_fmt.src_cfmt == VEPU5xx_FMT_YUV420SP) ?
822*437bfbebSnyanmisaka               stridey : stridey / 2;
823*437bfbebSnyanmisaka 
824*437bfbebSnyanmisaka     if (reg_base->reg0198_src_fmt.src_cfmt < VEPU5xx_FMT_ARGB1555) {
825*437bfbebSnyanmisaka         const VepuRgb2YuvCfg *cfg_coeffs = cfg_coeffs = get_rgb2yuv_cfg(prep_cfg->range, prep_cfg->color);
826*437bfbebSnyanmisaka 
827*437bfbebSnyanmisaka         hal_h265e_dbg_simple("input color range %d colorspace %d", prep_cfg->range, prep_cfg->color);
828*437bfbebSnyanmisaka 
829*437bfbebSnyanmisaka         reg_base->reg0199_src_udfy.csc_wgt_r2y = cfg_coeffs->_2y.r_coeff;
830*437bfbebSnyanmisaka         reg_base->reg0199_src_udfy.csc_wgt_g2y = cfg_coeffs->_2y.g_coeff;
831*437bfbebSnyanmisaka         reg_base->reg0199_src_udfy.csc_wgt_b2y = cfg_coeffs->_2y.b_coeff;
832*437bfbebSnyanmisaka 
833*437bfbebSnyanmisaka         reg_base->reg0200_src_udfu.csc_wgt_r2u = cfg_coeffs->_2u.r_coeff;
834*437bfbebSnyanmisaka         reg_base->reg0200_src_udfu.csc_wgt_g2u = cfg_coeffs->_2u.g_coeff;
835*437bfbebSnyanmisaka         reg_base->reg0200_src_udfu.csc_wgt_b2u = cfg_coeffs->_2u.b_coeff;
836*437bfbebSnyanmisaka 
837*437bfbebSnyanmisaka         reg_base->reg0201_src_udfv.csc_wgt_r2v = cfg_coeffs->_2v.r_coeff;
838*437bfbebSnyanmisaka         reg_base->reg0201_src_udfv.csc_wgt_g2v = cfg_coeffs->_2v.g_coeff;
839*437bfbebSnyanmisaka         reg_base->reg0201_src_udfv.csc_wgt_b2v = cfg_coeffs->_2v.b_coeff;
840*437bfbebSnyanmisaka 
841*437bfbebSnyanmisaka         reg_base->reg0202_src_udfo.csc_ofst_y = cfg_coeffs->_2y.offset;
842*437bfbebSnyanmisaka         reg_base->reg0202_src_udfo.csc_ofst_u = cfg_coeffs->_2u.offset;
843*437bfbebSnyanmisaka         reg_base->reg0202_src_udfo.csc_ofst_v = cfg_coeffs->_2v.offset;
844*437bfbebSnyanmisaka 
845*437bfbebSnyanmisaka         hal_h265e_dbg_simple("use color range %d colorspace %d", cfg_coeffs->dst_range, cfg_coeffs->color);
846*437bfbebSnyanmisaka     }
847*437bfbebSnyanmisaka 
848*437bfbebSnyanmisaka     reg_base->reg0205_src_strd0.src_strd0  = stridey;
849*437bfbebSnyanmisaka     reg_base->reg0206_src_strd1.src_strd1  = stridec;
850*437bfbebSnyanmisaka 
851*437bfbebSnyanmisaka     return MPP_OK;
852*437bfbebSnyanmisaka }
853*437bfbebSnyanmisaka 
vepu540c_h265_set_slice_regs(H265eSyntax_new * syn,hevc_vepu540c_base * regs)854*437bfbebSnyanmisaka static void vepu540c_h265_set_slice_regs(H265eSyntax_new *syn, hevc_vepu540c_base *regs)
855*437bfbebSnyanmisaka {
856*437bfbebSnyanmisaka     regs->reg0237_synt_sps.smpl_adpt_ofst_e    = syn->pp.sample_adaptive_offset_enabled_flag;
857*437bfbebSnyanmisaka     regs->reg0237_synt_sps.num_st_ref_pic       = syn->pp.num_short_term_ref_pic_sets;
858*437bfbebSnyanmisaka     regs->reg0237_synt_sps.num_lt_ref_pic       = syn->pp.num_long_term_ref_pics_sps;
859*437bfbebSnyanmisaka     regs->reg0237_synt_sps.lt_ref_pic_prsnt     = syn->pp.long_term_ref_pics_present_flag;
860*437bfbebSnyanmisaka     regs->reg0237_synt_sps.tmpl_mvp_e          = syn->pp.sps_temporal_mvp_enabled_flag;
861*437bfbebSnyanmisaka     regs->reg0237_synt_sps.log2_max_poc_lsb     = syn->pp.log2_max_pic_order_cnt_lsb_minus4;
862*437bfbebSnyanmisaka     regs->reg0237_synt_sps.strg_intra_smth      = syn->pp.strong_intra_smoothing_enabled_flag;
863*437bfbebSnyanmisaka 
864*437bfbebSnyanmisaka     regs->reg0238_synt_pps.dpdnt_sli_seg_en     = syn->pp.dependent_slice_segments_enabled_flag;
865*437bfbebSnyanmisaka     regs->reg0238_synt_pps.out_flg_prsnt_flg    = syn->pp.output_flag_present_flag;
866*437bfbebSnyanmisaka     regs->reg0238_synt_pps.num_extr_sli_hdr     = syn->pp.num_extra_slice_header_bits;
867*437bfbebSnyanmisaka     regs->reg0238_synt_pps.sgn_dat_hid_en       = syn->pp.sign_data_hiding_enabled_flag;
868*437bfbebSnyanmisaka     regs->reg0238_synt_pps.cbc_init_prsnt_flg   = syn->pp.cabac_init_present_flag;
869*437bfbebSnyanmisaka     regs->reg0238_synt_pps.pic_init_qp          = syn->pp.init_qp_minus26 + 26;
870*437bfbebSnyanmisaka     regs->reg0238_synt_pps.cu_qp_dlt_en         = syn->pp.cu_qp_delta_enabled_flag;
871*437bfbebSnyanmisaka     regs->reg0238_synt_pps.chrm_qp_ofst_prsn    = syn->pp.pps_slice_chroma_qp_offsets_present_flag;
872*437bfbebSnyanmisaka     regs->reg0238_synt_pps.lp_fltr_acrs_sli     = syn->pp.pps_loop_filter_across_slices_enabled_flag;
873*437bfbebSnyanmisaka     regs->reg0238_synt_pps.dblk_fltr_ovrd_en    = syn->pp.deblocking_filter_override_enabled_flag;
874*437bfbebSnyanmisaka     regs->reg0238_synt_pps.lst_mdfy_prsnt_flg   = syn->pp.lists_modification_present_flag;
875*437bfbebSnyanmisaka     regs->reg0238_synt_pps.sli_seg_hdr_extn     = syn->pp.slice_segment_header_extension_present_flag;
876*437bfbebSnyanmisaka     regs->reg0238_synt_pps.cu_qp_dlt_depth      = syn->pp.diff_cu_qp_delta_depth;
877*437bfbebSnyanmisaka     regs->reg0238_synt_pps.lpf_fltr_acrs_til    = syn->pp.loop_filter_across_tiles_enabled_flag;
878*437bfbebSnyanmisaka 
879*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.cbc_init_flg        = syn->sp.cbc_init_flg;
880*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.mvd_l1_zero_flg     = syn->sp.mvd_l1_zero_flg;
881*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.mrg_up_flg          = syn->sp.merge_up_flag;
882*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.mrg_lft_flg         = syn->sp.merge_left_flag;
883*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.ref_pic_lst_mdf_l0  = syn->sp.ref_pic_lst_mdf_l0;
884*437bfbebSnyanmisaka 
885*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.num_refidx_l1_act   = syn->sp.num_refidx_l1_act;
886*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.num_refidx_l0_act   = syn->sp.num_refidx_l0_act;
887*437bfbebSnyanmisaka 
888*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.num_refidx_act_ovrd = syn->sp.num_refidx_act_ovrd;
889*437bfbebSnyanmisaka 
890*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.sli_sao_chrm_flg    = syn->sp.sli_sao_chrm_flg;
891*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.sli_sao_luma_flg    = syn->sp.sli_sao_luma_flg;
892*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.sli_tmprl_mvp_e     = syn->sp.sli_tmprl_mvp_en;
893*437bfbebSnyanmisaka     regs->reg0192_enc_pic.num_pic_tot_cur       = syn->sp.tot_poc_num;
894*437bfbebSnyanmisaka 
895*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.pic_out_flg         = syn->sp.pic_out_flg;
896*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.sli_type            = syn->sp.slice_type;
897*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.sli_rsrv_flg        = syn->sp.slice_rsrv_flg;
898*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.dpdnt_sli_seg_flg   = syn->sp.dpdnt_sli_seg_flg;
899*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.sli_pps_id          = syn->sp.sli_pps_id;
900*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.no_out_pri_pic      = syn->sp.no_out_pri_pic;
901*437bfbebSnyanmisaka 
902*437bfbebSnyanmisaka 
903*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.sp_tc_ofst_div2       = syn->sp.sli_tc_ofst_div2;;
904*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.sp_beta_ofst_div2     = syn->sp.sli_beta_ofst_div2;
905*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.sli_lp_fltr_acrs_sli  = syn->sp.sli_lp_fltr_acrs_sli;
906*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.sp_dblk_fltr_dis     = syn->sp.sli_dblk_fltr_dis;
907*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.dblk_fltr_ovrd_flg    = syn->sp.dblk_fltr_ovrd_flg;
908*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.sli_cb_qp_ofst        = syn->sp.sli_cb_qp_ofst;
909*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.max_mrg_cnd           = syn->sp.max_mrg_cnd;
910*437bfbebSnyanmisaka 
911*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.col_ref_idx           = syn->sp.col_ref_idx;
912*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.col_frm_l0_flg        = syn->sp.col_frm_l0_flg;
913*437bfbebSnyanmisaka     regs->reg0241_synt_sli2.sli_poc_lsb           = syn->sp.sli_poc_lsb;
914*437bfbebSnyanmisaka     regs->reg0241_synt_sli2.sli_hdr_ext_len       = syn->sp.sli_hdr_ext_len;
915*437bfbebSnyanmisaka 
916*437bfbebSnyanmisaka }
917*437bfbebSnyanmisaka 
vepu540c_h265_set_ref_regs(H265eSyntax_new * syn,hevc_vepu540c_base * regs)918*437bfbebSnyanmisaka static void vepu540c_h265_set_ref_regs(H265eSyntax_new *syn, hevc_vepu540c_base *regs)
919*437bfbebSnyanmisaka {
920*437bfbebSnyanmisaka     regs->reg0242_synt_refm0.st_ref_pic_flg = syn->sp.st_ref_pic_flg;
921*437bfbebSnyanmisaka     regs->reg0242_synt_refm0.poc_lsb_lt0 = syn->sp.poc_lsb_lt0;
922*437bfbebSnyanmisaka     regs->reg0242_synt_refm0.num_lt_pic = syn->sp.num_lt_pic;
923*437bfbebSnyanmisaka 
924*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.dlt_poc_msb_prsnt0 = syn->sp.dlt_poc_msb_prsnt0;
925*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.dlt_poc_msb_cycl0 = syn->sp.dlt_poc_msb_cycl0;
926*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.used_by_lt_flg0 = syn->sp.used_by_lt_flg0;
927*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.used_by_lt_flg1 = syn->sp.used_by_lt_flg1;
928*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.used_by_lt_flg2 = syn->sp.used_by_lt_flg2;
929*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.dlt_poc_msb_prsnt0 = syn->sp.dlt_poc_msb_prsnt0;
930*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.dlt_poc_msb_cycl0 = syn->sp.dlt_poc_msb_cycl0;
931*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.dlt_poc_msb_prsnt1 = syn->sp.dlt_poc_msb_prsnt1;
932*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.num_negative_pics = syn->sp.num_neg_pic;
933*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.num_pos_pic = syn->sp.num_pos_pic;
934*437bfbebSnyanmisaka 
935*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.used_by_s0_flg = syn->sp.used_by_s0_flg;
936*437bfbebSnyanmisaka     regs->reg0244_synt_refm2.dlt_poc_s0_m10 = syn->sp.dlt_poc_s0_m10;
937*437bfbebSnyanmisaka     regs->reg0244_synt_refm2.dlt_poc_s0_m11 = syn->sp.dlt_poc_s0_m11;
938*437bfbebSnyanmisaka     regs->reg0245_synt_refm3.dlt_poc_s0_m12 = syn->sp.dlt_poc_s0_m12;
939*437bfbebSnyanmisaka     regs->reg0245_synt_refm3.dlt_poc_s0_m13 = syn->sp.dlt_poc_s0_m13;
940*437bfbebSnyanmisaka 
941*437bfbebSnyanmisaka     regs->reg0246_synt_long_refm0.poc_lsb_lt1 = syn->sp.poc_lsb_lt1;
942*437bfbebSnyanmisaka     regs->reg0247_synt_long_refm1.dlt_poc_msb_cycl1 = syn->sp.dlt_poc_msb_cycl1;
943*437bfbebSnyanmisaka     regs->reg0246_synt_long_refm0.poc_lsb_lt2 = syn->sp.poc_lsb_lt2;
944*437bfbebSnyanmisaka     regs->reg0243_synt_refm1.dlt_poc_msb_prsnt2 = syn->sp.dlt_poc_msb_prsnt2;
945*437bfbebSnyanmisaka     regs->reg0247_synt_long_refm1.dlt_poc_msb_cycl2 = syn->sp.dlt_poc_msb_cycl2;
946*437bfbebSnyanmisaka     regs->reg0240_synt_sli1.lst_entry_l0 = syn->sp.lst_entry_l0;
947*437bfbebSnyanmisaka     regs->reg0239_synt_sli0.ref_pic_lst_mdf_l0 = syn->sp.ref_pic_lst_mdf_l0;
948*437bfbebSnyanmisaka 
949*437bfbebSnyanmisaka     return;
950*437bfbebSnyanmisaka }
vepu540c_h265_set_me_regs(H265eV540cHalContext * ctx,H265eSyntax_new * syn,hevc_vepu540c_base * regs)951*437bfbebSnyanmisaka static void vepu540c_h265_set_me_regs(H265eV540cHalContext *ctx, H265eSyntax_new *syn, hevc_vepu540c_base *regs)
952*437bfbebSnyanmisaka {
953*437bfbebSnyanmisaka 
954*437bfbebSnyanmisaka     RK_S32 x_gmv = 0;
955*437bfbebSnyanmisaka     RK_S32 y_gmv = 0;
956*437bfbebSnyanmisaka     RK_S32 srch_lftw, srch_rgtw, srch_uph, srch_dwnh;
957*437bfbebSnyanmisaka     RK_S32 frm_sta = 0, frm_end = 0, pic_w = 0;
958*437bfbebSnyanmisaka     RK_S32 pic_wdt_align = ((regs->reg0196_enc_rsl.pic_wd8_m1 + 1) * 8 + 31) / 32 ;
959*437bfbebSnyanmisaka 
960*437bfbebSnyanmisaka 
961*437bfbebSnyanmisaka     regs->reg0220_me_rnge.cime_srch_dwnh = 15;
962*437bfbebSnyanmisaka     regs->reg0220_me_rnge.cime_srch_uph = 14;
963*437bfbebSnyanmisaka     regs->reg0220_me_rnge.cime_srch_rgtw = 12;
964*437bfbebSnyanmisaka     regs->reg0220_me_rnge.cime_srch_lftw = 12;
965*437bfbebSnyanmisaka     regs->reg0221_me_cfg.rme_srch_h    = 3;
966*437bfbebSnyanmisaka     regs->reg0221_me_cfg.rme_srch_v    = 3;
967*437bfbebSnyanmisaka 
968*437bfbebSnyanmisaka     regs->reg0221_me_cfg.srgn_max_num    = 72;
969*437bfbebSnyanmisaka     regs->reg0221_me_cfg.cime_dist_thre    = 1024;
970*437bfbebSnyanmisaka     regs->reg0221_me_cfg.rme_dis      = 0;
971*437bfbebSnyanmisaka     regs->reg0221_me_cfg.fme_dis        = 0;
972*437bfbebSnyanmisaka     regs->reg0220_me_rnge.dlt_frm_num    = 0x1;
973*437bfbebSnyanmisaka     srch_lftw = regs->reg0220_me_rnge.cime_srch_lftw * 4;
974*437bfbebSnyanmisaka     srch_rgtw = regs->reg0220_me_rnge.cime_srch_rgtw * 4;
975*437bfbebSnyanmisaka     srch_uph = regs->reg0220_me_rnge.cime_srch_uph * 2;
976*437bfbebSnyanmisaka     srch_dwnh =  regs->reg0220_me_rnge.cime_srch_dwnh * 2;
977*437bfbebSnyanmisaka 
978*437bfbebSnyanmisaka     if (syn->pp.sps_temporal_mvp_enabled_flag &&
979*437bfbebSnyanmisaka         (ctx->frame_type != INTRA_FRAME)) {
980*437bfbebSnyanmisaka         if (ctx->last_frame_type == INTRA_FRAME) {
981*437bfbebSnyanmisaka             regs->reg0222_me_cach.colmv_load    = 0;
982*437bfbebSnyanmisaka         } else {
983*437bfbebSnyanmisaka             regs->reg0222_me_cach.colmv_load    = 1;
984*437bfbebSnyanmisaka         }
985*437bfbebSnyanmisaka         regs->reg0222_me_cach.colmv_stor   = 1;
986*437bfbebSnyanmisaka     }
987*437bfbebSnyanmisaka     // calc cme_linebuf_w
988*437bfbebSnyanmisaka     {
989*437bfbebSnyanmisaka         if (x_gmv - srch_lftw < 0) {
990*437bfbebSnyanmisaka             frm_sta = (x_gmv - srch_lftw - 15) / 16;
991*437bfbebSnyanmisaka         } else {
992*437bfbebSnyanmisaka             frm_sta = (x_gmv - srch_lftw) / 16;
993*437bfbebSnyanmisaka         }
994*437bfbebSnyanmisaka         if (x_gmv + srch_rgtw < 0) {
995*437bfbebSnyanmisaka             frm_end = pic_wdt_align - 1 + (x_gmv + srch_rgtw) / 16;
996*437bfbebSnyanmisaka         } else {
997*437bfbebSnyanmisaka             frm_end = pic_wdt_align - 1 + (x_gmv + srch_rgtw + 15) / 16;
998*437bfbebSnyanmisaka         }
999*437bfbebSnyanmisaka 
1000*437bfbebSnyanmisaka         if (frm_sta < 0) {
1001*437bfbebSnyanmisaka             frm_sta = 0;
1002*437bfbebSnyanmisaka         } else if (frm_sta > pic_wdt_align - 1) {
1003*437bfbebSnyanmisaka             frm_sta = pic_wdt_align - 1;
1004*437bfbebSnyanmisaka         }
1005*437bfbebSnyanmisaka         frm_end = mpp_clip(frm_end, 0, pic_wdt_align - 1);
1006*437bfbebSnyanmisaka         pic_w = (frm_end - frm_sta + 1) * 32;
1007*437bfbebSnyanmisaka         regs->reg0222_me_cach.cme_linebuf_w = pic_w / 32;
1008*437bfbebSnyanmisaka     }
1009*437bfbebSnyanmisaka 
1010*437bfbebSnyanmisaka     // calc cime_hgt_rama and cime_size_rama
1011*437bfbebSnyanmisaka     {
1012*437bfbebSnyanmisaka         RK_U32 rama_size = 1796;
1013*437bfbebSnyanmisaka         RK_U32 ramb_h;
1014*437bfbebSnyanmisaka         RK_U32 ctu_2_h = 4;
1015*437bfbebSnyanmisaka         RK_U32 ctu_8_w = 1 ;
1016*437bfbebSnyanmisaka         RK_U32 cur_srch_8_w, cur_srch_2_h, cur_srch_h;
1017*437bfbebSnyanmisaka 
1018*437bfbebSnyanmisaka         if ((y_gmv % 8 - srch_uph % 8) < 0) {
1019*437bfbebSnyanmisaka             cur_srch_2_h = (8 + (y_gmv % 8 - srch_uph % 8) % 8 + srch_uph + srch_dwnh) / 2 + ctu_2_h;
1020*437bfbebSnyanmisaka         } else {
1021*437bfbebSnyanmisaka             cur_srch_2_h = ((y_gmv % 8 - srch_uph % 8) % 8 + srch_uph + srch_dwnh) / 2 + ctu_2_h;
1022*437bfbebSnyanmisaka         }
1023*437bfbebSnyanmisaka         regs->reg0222_me_cach.cime_size_rama = (cur_srch_2_h + 3) / 4 * 4;
1024*437bfbebSnyanmisaka 
1025*437bfbebSnyanmisaka         if ((x_gmv % 8 - srch_lftw % 8) < 0) {
1026*437bfbebSnyanmisaka             cur_srch_8_w = (8 + (x_gmv % 8 - srch_lftw % 8) % 8 + srch_lftw + srch_rgtw + 7) / 8 + ctu_8_w;
1027*437bfbebSnyanmisaka         } else {
1028*437bfbebSnyanmisaka             cur_srch_8_w = ((x_gmv % 8 - srch_lftw % 8) % 8 + srch_lftw + srch_rgtw + 7) / 8 + ctu_8_w;
1029*437bfbebSnyanmisaka         }
1030*437bfbebSnyanmisaka 
1031*437bfbebSnyanmisaka         cur_srch_h = ctu_2_h;
1032*437bfbebSnyanmisaka         ramb_h = cur_srch_2_h;
1033*437bfbebSnyanmisaka         while ((rama_size > ((cur_srch_h - ctu_2_h) * regs->reg0222_me_cach.cme_linebuf_w + (ramb_h * cur_srch_8_w)))
1034*437bfbebSnyanmisaka                && (cur_srch_h < regs->reg0222_me_cach.cime_size_rama)) {
1035*437bfbebSnyanmisaka             cur_srch_h = cur_srch_h + ctu_2_h;
1036*437bfbebSnyanmisaka             if (ramb_h > ctu_2_h * 2) {
1037*437bfbebSnyanmisaka                 ramb_h = ramb_h - ctu_2_h;
1038*437bfbebSnyanmisaka             } else {
1039*437bfbebSnyanmisaka                 ramb_h = ctu_2_h;
1040*437bfbebSnyanmisaka             }
1041*437bfbebSnyanmisaka         }
1042*437bfbebSnyanmisaka 
1043*437bfbebSnyanmisaka         if (cur_srch_2_h == ctu_2_h * 2) {
1044*437bfbebSnyanmisaka             cur_srch_h = cur_srch_h + ctu_2_h;
1045*437bfbebSnyanmisaka             ramb_h = ctu_2_h;
1046*437bfbebSnyanmisaka         }
1047*437bfbebSnyanmisaka 
1048*437bfbebSnyanmisaka         if (rama_size < ((cur_srch_h - ctu_2_h) * regs->reg0222_me_cach.cme_linebuf_w + (ramb_h * cur_srch_8_w))) {
1049*437bfbebSnyanmisaka             cur_srch_h = cur_srch_h - ctu_2_h;
1050*437bfbebSnyanmisaka         }
1051*437bfbebSnyanmisaka 
1052*437bfbebSnyanmisaka         regs->reg0222_me_cach.cime_size_rama = ((cur_srch_h - ctu_2_h) * regs->reg0222_me_cach.cme_linebuf_w + ctu_2_h * cur_srch_8_w) / 4;
1053*437bfbebSnyanmisaka         regs->reg0222_me_cach.cime_hgt_rama = cur_srch_h / 2;
1054*437bfbebSnyanmisaka         regs->reg0222_me_cach.fme_prefsu_en = 1;
1055*437bfbebSnyanmisaka     }
1056*437bfbebSnyanmisaka 
1057*437bfbebSnyanmisaka }
1058*437bfbebSnyanmisaka 
vepu540c_h265_set_hw_address(H265eV540cHalContext * ctx,hevc_vepu540c_base * regs,HalEncTask * task)1059*437bfbebSnyanmisaka void vepu540c_h265_set_hw_address(H265eV540cHalContext *ctx, hevc_vepu540c_base *regs, HalEncTask *task)
1060*437bfbebSnyanmisaka {
1061*437bfbebSnyanmisaka     HalEncTask *enc_task = task;
1062*437bfbebSnyanmisaka     HalBuf *recon_buf, *ref_buf;
1063*437bfbebSnyanmisaka     MppBuffer md_info_buf = enc_task->md_info;
1064*437bfbebSnyanmisaka     H265eSyntax_new *syn = (H265eSyntax_new *)enc_task->syntax.data;
1065*437bfbebSnyanmisaka 
1066*437bfbebSnyanmisaka     hal_h265e_enter();
1067*437bfbebSnyanmisaka 
1068*437bfbebSnyanmisaka     regs->reg0160_adr_src0     = mpp_buffer_get_fd(enc_task->input);
1069*437bfbebSnyanmisaka     regs->reg0161_adr_src1     = regs->reg0160_adr_src0;
1070*437bfbebSnyanmisaka     regs->reg0162_adr_src2     = regs->reg0160_adr_src0;
1071*437bfbebSnyanmisaka 
1072*437bfbebSnyanmisaka     recon_buf = hal_bufs_get_buf(ctx->dpb_bufs, syn->sp.recon_pic.slot_idx);
1073*437bfbebSnyanmisaka     ref_buf = hal_bufs_get_buf(ctx->dpb_bufs, syn->sp.ref_pic.slot_idx);
1074*437bfbebSnyanmisaka 
1075*437bfbebSnyanmisaka     if (!syn->sp.non_reference_flag) {
1076*437bfbebSnyanmisaka         regs->reg0163_rfpw_h_addr  = mpp_buffer_get_fd(recon_buf->buf[0]);
1077*437bfbebSnyanmisaka         regs->reg0164_rfpw_b_addr  = regs->reg0163_rfpw_h_addr;
1078*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(ctx->dev, 164, ctx->fbc_header_len);
1079*437bfbebSnyanmisaka     }
1080*437bfbebSnyanmisaka     regs->reg0165_rfpr_h_addr = mpp_buffer_get_fd(ref_buf->buf[0]);
1081*437bfbebSnyanmisaka     regs->reg0166_rfpr_b_addr = regs->reg0165_rfpr_h_addr;
1082*437bfbebSnyanmisaka     regs->reg0167_cmvw_addr = mpp_buffer_get_fd(recon_buf->buf[2]);
1083*437bfbebSnyanmisaka     regs->reg0168_cmvr_addr = mpp_buffer_get_fd(ref_buf->buf[2]);
1084*437bfbebSnyanmisaka     regs->reg0169_dspw_addr = mpp_buffer_get_fd(recon_buf->buf[1]);
1085*437bfbebSnyanmisaka     regs->reg0170_dspr_addr = mpp_buffer_get_fd(ref_buf->buf[1]);
1086*437bfbebSnyanmisaka 
1087*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(ctx->dev, 166, ctx->fbc_header_len);
1088*437bfbebSnyanmisaka 
1089*437bfbebSnyanmisaka     if (md_info_buf) {
1090*437bfbebSnyanmisaka         regs->reg0192_enc_pic.mei_stor    = 1;
1091*437bfbebSnyanmisaka         regs->reg0171_meiw_addr = mpp_buffer_get_fd(md_info_buf);
1092*437bfbebSnyanmisaka     } else {
1093*437bfbebSnyanmisaka         regs->reg0192_enc_pic.mei_stor    = 0;
1094*437bfbebSnyanmisaka         regs->reg0171_meiw_addr = 0;
1095*437bfbebSnyanmisaka     }
1096*437bfbebSnyanmisaka 
1097*437bfbebSnyanmisaka     regs->reg0172_bsbt_addr = mpp_buffer_get_fd(enc_task->output);
1098*437bfbebSnyanmisaka     /* TODO: stream size relative with syntax */
1099*437bfbebSnyanmisaka     regs->reg0173_bsbb_addr  = regs->reg0172_bsbt_addr;
1100*437bfbebSnyanmisaka     regs->reg0175_bsbr_addr  = regs->reg0172_bsbt_addr;
1101*437bfbebSnyanmisaka     regs->reg0174_adr_bsbs   = regs->reg0172_bsbt_addr;
1102*437bfbebSnyanmisaka 
1103*437bfbebSnyanmisaka     regs->reg0180_adr_rfpt_h = 0xffffffff;
1104*437bfbebSnyanmisaka     regs->reg0181_adr_rfpb_h = 0;
1105*437bfbebSnyanmisaka     regs->reg0182_adr_rfpt_b = 0xffffffff;
1106*437bfbebSnyanmisaka     regs->reg0183_adr_rfpb_b = 0;
1107*437bfbebSnyanmisaka 
1108*437bfbebSnyanmisaka 
1109*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(ctx->dev, 174, mpp_packet_get_length(task->packet));
1110*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(ctx->dev, 172, mpp_buffer_get_size(enc_task->output));
1111*437bfbebSnyanmisaka 
1112*437bfbebSnyanmisaka     regs->reg0204_pic_ofst.pic_ofst_y = mpp_frame_get_offset_y(task->frame);
1113*437bfbebSnyanmisaka     regs->reg0204_pic_ofst.pic_ofst_x = mpp_frame_get_offset_x(task->frame);
1114*437bfbebSnyanmisaka }
1115*437bfbebSnyanmisaka 
setup_vepu540c_ext_line_buf(H265eV540cHalContext * ctx,H265eV540cRegSet * regs)1116*437bfbebSnyanmisaka static void setup_vepu540c_ext_line_buf(H265eV540cHalContext *ctx, H265eV540cRegSet *regs)
1117*437bfbebSnyanmisaka {
1118*437bfbebSnyanmisaka     if (ctx->ext_line_buf) {
1119*437bfbebSnyanmisaka         RK_S32 fd = mpp_buffer_get_fd(ctx->ext_line_buf);
1120*437bfbebSnyanmisaka 
1121*437bfbebSnyanmisaka         regs->reg_base.reg0179_adr_ebufb = fd;
1122*437bfbebSnyanmisaka         regs->reg_base.reg0178_adr_ebuft = fd;
1123*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(ctx->dev, 178, ctx->ext_line_buf_size);
1124*437bfbebSnyanmisaka     } else {
1125*437bfbebSnyanmisaka         regs->reg_base.reg0179_adr_ebufb = 0;
1126*437bfbebSnyanmisaka         regs->reg_base.reg0178_adr_ebuft = 0;
1127*437bfbebSnyanmisaka     }
1128*437bfbebSnyanmisaka }
1129*437bfbebSnyanmisaka 
vepu540c_h265_set_split(H265eV540cRegSet * regs,MppEncCfgSet * enc_cfg,RK_U32 title_en)1130*437bfbebSnyanmisaka static void vepu540c_h265_set_split(H265eV540cRegSet *regs, MppEncCfgSet *enc_cfg, RK_U32 title_en)
1131*437bfbebSnyanmisaka {
1132*437bfbebSnyanmisaka     MppEncSliceSplit *cfg = &enc_cfg->split;
1133*437bfbebSnyanmisaka 
1134*437bfbebSnyanmisaka     hal_h265e_dbg_func("enter\n");
1135*437bfbebSnyanmisaka 
1136*437bfbebSnyanmisaka     switch (cfg->split_mode) {
1137*437bfbebSnyanmisaka     case MPP_ENC_SPLIT_NONE : {
1138*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt = 0;
1139*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt_mode = 0;
1140*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt_cpst = 0;
1141*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_max_num_m1 = 0;
1142*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_flsh = 0;
1143*437bfbebSnyanmisaka         regs->reg_base.reg0218_sli_cnum.sli_splt_cnum_m1 = 0;
1144*437bfbebSnyanmisaka 
1145*437bfbebSnyanmisaka         regs->reg_base.reg0217_sli_byte.sli_splt_byte = 0;
1146*437bfbebSnyanmisaka         regs->reg_base.reg0192_enc_pic.slen_fifo = 0;
1147*437bfbebSnyanmisaka     } break;
1148*437bfbebSnyanmisaka     case MPP_ENC_SPLIT_BY_BYTE : {
1149*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt = 1;
1150*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt_mode = 0;
1151*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt_cpst = 0;
1152*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_max_num_m1 = 500;
1153*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_flsh = 1;
1154*437bfbebSnyanmisaka         regs->reg_base.reg0218_sli_cnum.sli_splt_cnum_m1 = 0;
1155*437bfbebSnyanmisaka 
1156*437bfbebSnyanmisaka         regs->reg_base.reg0217_sli_byte.sli_splt_byte = cfg->split_arg;
1157*437bfbebSnyanmisaka         regs->reg_base.reg0192_enc_pic.slen_fifo = cfg->split_out ? 1 : 0;
1158*437bfbebSnyanmisaka         regs->reg_ctl.reg0008_int_en.vslc_done_en = regs->reg_base.reg0192_enc_pic.slen_fifo;
1159*437bfbebSnyanmisaka     } break;
1160*437bfbebSnyanmisaka     case MPP_ENC_SPLIT_BY_CTU : {
1161*437bfbebSnyanmisaka         RK_U32 mb_w = MPP_ALIGN(enc_cfg->prep.width, 64) / 64;
1162*437bfbebSnyanmisaka         RK_U32 mb_h = MPP_ALIGN(enc_cfg->prep.height, 64) / 64;
1163*437bfbebSnyanmisaka         RK_U32 slice_num = 0;
1164*437bfbebSnyanmisaka 
1165*437bfbebSnyanmisaka         if (title_en)
1166*437bfbebSnyanmisaka             mb_w = mb_w / 2;
1167*437bfbebSnyanmisaka 
1168*437bfbebSnyanmisaka         slice_num = (mb_w * mb_h + cfg->split_arg - 1) / cfg->split_arg;
1169*437bfbebSnyanmisaka 
1170*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt = 1;
1171*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt_mode = 1;
1172*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_splt_cpst = 0;
1173*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_max_num_m1 = 500;
1174*437bfbebSnyanmisaka         regs->reg_base.reg0216_sli_splt.sli_flsh = 1;
1175*437bfbebSnyanmisaka         regs->reg_base.reg0218_sli_cnum.sli_splt_cnum_m1 = cfg->split_arg - 1;
1176*437bfbebSnyanmisaka 
1177*437bfbebSnyanmisaka         regs->reg_base.reg0217_sli_byte.sli_splt_byte = 0;
1178*437bfbebSnyanmisaka         regs->reg_base.reg0192_enc_pic.slen_fifo = cfg->split_out ? 1 : 0;
1179*437bfbebSnyanmisaka 
1180*437bfbebSnyanmisaka         if ((cfg->split_out & MPP_ENC_SPLIT_OUT_LOWDELAY) ||
1181*437bfbebSnyanmisaka             (regs->reg_base.reg0192_enc_pic.slen_fifo && (slice_num > VEPU540C_SLICE_FIFO_LEN)))
1182*437bfbebSnyanmisaka             regs->reg_ctl.reg0008_int_en.vslc_done_en = 1 ;
1183*437bfbebSnyanmisaka     } break;
1184*437bfbebSnyanmisaka     default : {
1185*437bfbebSnyanmisaka         mpp_log_f("invalide slice split mode %d\n", cfg->split_mode);
1186*437bfbebSnyanmisaka     } break;
1187*437bfbebSnyanmisaka     }
1188*437bfbebSnyanmisaka 
1189*437bfbebSnyanmisaka     hal_h265e_dbg_func("leave\n");
1190*437bfbebSnyanmisaka }
1191*437bfbebSnyanmisaka 
hal_h265e_v540c_gen_regs(void * hal,HalEncTask * task)1192*437bfbebSnyanmisaka MPP_RET hal_h265e_v540c_gen_regs(void *hal, HalEncTask *task)
1193*437bfbebSnyanmisaka {
1194*437bfbebSnyanmisaka     H265eV540cHalContext *ctx = (H265eV540cHalContext *)hal;
1195*437bfbebSnyanmisaka     HalEncTask *enc_task = task;
1196*437bfbebSnyanmisaka     H265eSyntax_new *syn = (H265eSyntax_new *)enc_task->syntax.data;
1197*437bfbebSnyanmisaka     H265eV540cRegSet *regs = ctx->regs;
1198*437bfbebSnyanmisaka     RK_U32 pic_width_align8, pic_height_align8;
1199*437bfbebSnyanmisaka     RK_S32 pic_wd32, pic_h32;
1200*437bfbebSnyanmisaka     VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
1201*437bfbebSnyanmisaka     hevc_vepu540c_control_cfg *reg_ctl = &regs->reg_ctl;
1202*437bfbebSnyanmisaka     hevc_vepu540c_base        *reg_base = &regs->reg_base;
1203*437bfbebSnyanmisaka     hevc_vepu540c_rc_roi *reg_klut = &regs->reg_rc_roi;
1204*437bfbebSnyanmisaka 
1205*437bfbebSnyanmisaka     hal_h265e_enter();
1206*437bfbebSnyanmisaka     pic_width_align8 = (syn->pp.pic_width + 7) & (~7);
1207*437bfbebSnyanmisaka     pic_height_align8 = (syn->pp.pic_height + 7) & (~7);
1208*437bfbebSnyanmisaka     pic_wd32 = (syn->pp.pic_width +  31) / 32;
1209*437bfbebSnyanmisaka     pic_h32 = (syn->pp.pic_height + 31) / 32;
1210*437bfbebSnyanmisaka 
1211*437bfbebSnyanmisaka     hal_h265e_dbg_simple("frame %d | type %d | start gen regs",
1212*437bfbebSnyanmisaka                          ctx->frame_cnt, ctx->frame_type);
1213*437bfbebSnyanmisaka 
1214*437bfbebSnyanmisaka     memset(regs, 0, sizeof(H265eV540cRegSet));
1215*437bfbebSnyanmisaka 
1216*437bfbebSnyanmisaka     reg_ctl->reg0004_enc_strt.lkt_num      = 0;
1217*437bfbebSnyanmisaka     reg_ctl->reg0004_enc_strt.vepu_cmd     = ctx->enc_mode;
1218*437bfbebSnyanmisaka     reg_ctl->reg0005_enc_clr.safe_clr      = 0x0;
1219*437bfbebSnyanmisaka     reg_ctl->reg0005_enc_clr.force_clr     = 0x0;
1220*437bfbebSnyanmisaka 
1221*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.enc_done_en        = 1;
1222*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.lkt_node_done_en   = 1;
1223*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.sclr_done_en       = 1;
1224*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.vslc_done_en       = 0;
1225*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.vbsf_oflw_en       = 1;
1226*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.vbuf_lens_en       = 1;
1227*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.enc_err_en         = 1;
1228*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.dvbm_fcfg_en       = 1;
1229*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.wdg_en             = 1;
1230*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.lkt_err_int_en     = 0;
1231*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.lkt_err_stop_en    = 1;
1232*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.lkt_force_stop_en  = 1;
1233*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.jslc_done_en       = 1;
1234*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.jbsf_oflw_en       = 1;
1235*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.jbuf_lens_en       = 1;
1236*437bfbebSnyanmisaka     reg_ctl->reg0008_int_en.dvbm_dcnt_en       = 1;
1237*437bfbebSnyanmisaka 
1238*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.jpeg_bus_edin    = 0x0;
1239*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.src_bus_edin     = 0x0;
1240*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.meiw_bus_edin    = 0x0;
1241*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.bsw_bus_edin     = 0x7;
1242*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.lktr_bus_edin    = 0x0;
1243*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.roir_bus_edin    = 0x0;
1244*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.lktw_bus_edin    = 0x0;
1245*437bfbebSnyanmisaka     reg_ctl->reg0012_dtrns_map.rec_nfbc_bus_edin   = 0x0;
1246*437bfbebSnyanmisaka     /* enable rdo clk gating */
1247*437bfbebSnyanmisaka     {
1248*437bfbebSnyanmisaka         RK_U32 *rdo_ckg = (RK_U32*)&reg_ctl->reg0022_rdo_ckg;
1249*437bfbebSnyanmisaka 
1250*437bfbebSnyanmisaka         *rdo_ckg = 0xffffffff;
1251*437bfbebSnyanmisaka     }
1252*437bfbebSnyanmisaka //   reg_ctl->reg0013_dtrns_cfg.dspr_otsd        = (ctx->frame_type == INTER_P_FRAME);
1253*437bfbebSnyanmisaka     reg_ctl->reg0013_dtrns_cfg.axi_brsp_cke     = 0x0;
1254*437bfbebSnyanmisaka     reg_ctl->reg0014_enc_wdg.vs_load_thd        = 0x1fffff;
1255*437bfbebSnyanmisaka     reg_ctl->reg0014_enc_wdg.rfp_load_thd       = 0xff;
1256*437bfbebSnyanmisaka 
1257*437bfbebSnyanmisaka     reg_ctl->reg0021_func_en.cke                = 1;
1258*437bfbebSnyanmisaka     reg_ctl->reg0021_func_en.resetn_hw_en       = 1;
1259*437bfbebSnyanmisaka     reg_ctl->reg0021_func_en.enc_done_tmvp_en   = 1;
1260*437bfbebSnyanmisaka 
1261*437bfbebSnyanmisaka     reg_base->reg0196_enc_rsl.pic_wd8_m1    = pic_width_align8 / 8 - 1;
1262*437bfbebSnyanmisaka     reg_base->reg0197_src_fill.pic_wfill    = (syn->pp.pic_width & 0x7)
1263*437bfbebSnyanmisaka                                               ? (8 - (syn->pp.pic_width & 0x7)) : 0;
1264*437bfbebSnyanmisaka     reg_base->reg0196_enc_rsl.pic_hd8_m1    = pic_height_align8 / 8 - 1;
1265*437bfbebSnyanmisaka     reg_base->reg0197_src_fill.pic_hfill    = (syn->pp.pic_height & 0x7)
1266*437bfbebSnyanmisaka                                               ? (8 - (syn->pp.pic_height & 0x7)) : 0;
1267*437bfbebSnyanmisaka 
1268*437bfbebSnyanmisaka     reg_base->reg0192_enc_pic.enc_stnd      = 1; //H265
1269*437bfbebSnyanmisaka     reg_base->reg0192_enc_pic.cur_frm_ref   = !syn->sp.non_reference_flag; //current frame will be refered
1270*437bfbebSnyanmisaka     reg_base->reg0192_enc_pic.bs_scp        = 1;
1271*437bfbebSnyanmisaka     reg_base->reg0192_enc_pic.log2_ctu_num  = mpp_ceil_log2(pic_wd32 * pic_h32);
1272*437bfbebSnyanmisaka 
1273*437bfbebSnyanmisaka     reg_base->reg0203_src_proc.src_mirr = 0;
1274*437bfbebSnyanmisaka     reg_base->reg0203_src_proc.src_rot  = 0;
1275*437bfbebSnyanmisaka 
1276*437bfbebSnyanmisaka     reg_klut->klut_ofst.chrm_klut_ofst = (ctx->frame_type == INTRA_FRAME) ? 6 :
1277*437bfbebSnyanmisaka                                          (ctx->cfg->tune.scene_mode == MPP_ENC_SCENE_MODE_IPC ? 9 : 6);
1278*437bfbebSnyanmisaka     reg_klut->klut_ofst.inter_chrm_dist_multi = 4;
1279*437bfbebSnyanmisaka     reg_base->reg0248_sao_cfg.sao_lambda_multi = 5;
1280*437bfbebSnyanmisaka 
1281*437bfbebSnyanmisaka     vepu540c_h265_set_me_regs(ctx, syn, reg_base);
1282*437bfbebSnyanmisaka 
1283*437bfbebSnyanmisaka     reg_base->reg0232_rdo_cfg.chrm_spcl   = 0;
1284*437bfbebSnyanmisaka     reg_base->reg0232_rdo_cfg.cu_inter_e    = 0x0092;
1285*437bfbebSnyanmisaka     reg_base->reg0232_rdo_cfg.cu_intra_e    = 0xe;
1286*437bfbebSnyanmisaka     reg_base->reg0232_rdo_cfg.lambda_qp_use_avg_cu16_flag = 1;
1287*437bfbebSnyanmisaka     reg_base->reg0232_rdo_cfg.yuvskip_calc_en = 1;
1288*437bfbebSnyanmisaka     reg_base->reg0232_rdo_cfg.atf_e = 1;
1289*437bfbebSnyanmisaka     reg_base->reg0232_rdo_cfg.atr_e = 1;
1290*437bfbebSnyanmisaka 
1291*437bfbebSnyanmisaka     if (syn->pp.num_long_term_ref_pics_sps) {
1292*437bfbebSnyanmisaka         reg_base->reg0232_rdo_cfg.ltm_col   = 0;
1293*437bfbebSnyanmisaka         reg_base->reg0232_rdo_cfg.ltm_idx0l0 = 1;
1294*437bfbebSnyanmisaka     } else {
1295*437bfbebSnyanmisaka         reg_base->reg0232_rdo_cfg.ltm_col   = 0;
1296*437bfbebSnyanmisaka         reg_base->reg0232_rdo_cfg.ltm_idx0l0 = 0;
1297*437bfbebSnyanmisaka     }
1298*437bfbebSnyanmisaka 
1299*437bfbebSnyanmisaka     reg_base->reg0232_rdo_cfg.ccwa_e = 1;
1300*437bfbebSnyanmisaka     reg_base->reg0232_rdo_cfg.scl_lst_sel = syn->pp.scaling_list_enabled_flag;
1301*437bfbebSnyanmisaka     reg_base->reg0236_synt_nal.nal_unit_type = h265e_get_nal_type(&syn->sp, ctx->frame_type);
1302*437bfbebSnyanmisaka 
1303*437bfbebSnyanmisaka     vepu540c_h265_set_hw_address(ctx, reg_base, task);
1304*437bfbebSnyanmisaka     vepu540c_h265_set_pp_regs(regs, fmt, &ctx->cfg->prep);
1305*437bfbebSnyanmisaka     vepu540c_h265_set_rc_regs(ctx, regs, task);
1306*437bfbebSnyanmisaka     vepu540c_h265_set_slice_regs(syn, reg_base);
1307*437bfbebSnyanmisaka     vepu540c_h265_set_ref_regs(syn, reg_base);
1308*437bfbebSnyanmisaka     vepu540c_h265_set_patch_info(ctx->dev, syn, (VepuFmt)fmt->format, enc_task);
1309*437bfbebSnyanmisaka     setup_vepu540c_ext_line_buf(ctx, ctx->regs);
1310*437bfbebSnyanmisaka     vepu540c_h265_set_split(regs, ctx->cfg, syn->pp.tiles_enabled_flag);
1311*437bfbebSnyanmisaka 
1312*437bfbebSnyanmisaka     /* ROI configure */
1313*437bfbebSnyanmisaka     if (ctx->roi_data)
1314*437bfbebSnyanmisaka         vepu540c_set_roi(&regs->reg_rc_roi.roi_cfg, ctx->roi_data,
1315*437bfbebSnyanmisaka                          ctx->cfg->prep.width, ctx->cfg->prep.height);
1316*437bfbebSnyanmisaka     /*paramet cfg*/
1317*437bfbebSnyanmisaka     vepu540c_h265_global_cfg_set(ctx, regs);
1318*437bfbebSnyanmisaka 
1319*437bfbebSnyanmisaka     ctx->frame_num++;
1320*437bfbebSnyanmisaka 
1321*437bfbebSnyanmisaka     hal_h265e_leave();
1322*437bfbebSnyanmisaka     return MPP_OK;
1323*437bfbebSnyanmisaka }
1324*437bfbebSnyanmisaka 
hal_h265e_v540c_start(void * hal,HalEncTask * enc_task)1325*437bfbebSnyanmisaka MPP_RET hal_h265e_v540c_start(void *hal, HalEncTask *enc_task)
1326*437bfbebSnyanmisaka {
1327*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1328*437bfbebSnyanmisaka     H265eV540cHalContext *ctx = (H265eV540cHalContext *)hal;
1329*437bfbebSnyanmisaka     RK_U32 *regs = (RK_U32*)ctx->regs;
1330*437bfbebSnyanmisaka     H265eV540cRegSet *hw_regs = ctx->regs;
1331*437bfbebSnyanmisaka     H265eV540cStatusElem *reg_out = (H265eV540cStatusElem *)ctx->reg_out[0];
1332*437bfbebSnyanmisaka     MppDevRegWrCfg cfg;
1333*437bfbebSnyanmisaka     MppDevRegRdCfg cfg1;
1334*437bfbebSnyanmisaka     RK_U32 i = 0;
1335*437bfbebSnyanmisaka     hal_h265e_enter();
1336*437bfbebSnyanmisaka 
1337*437bfbebSnyanmisaka     if (enc_task->flags.err) {
1338*437bfbebSnyanmisaka         hal_h265e_err("enc_task->flags.err %08x, return e arly",
1339*437bfbebSnyanmisaka                       enc_task->flags.err);
1340*437bfbebSnyanmisaka         return MPP_NOK;
1341*437bfbebSnyanmisaka     }
1342*437bfbebSnyanmisaka 
1343*437bfbebSnyanmisaka     cfg.reg = (RK_U32*)&hw_regs->reg_ctl;
1344*437bfbebSnyanmisaka     cfg.size = sizeof(hevc_vepu540c_control_cfg);
1345*437bfbebSnyanmisaka     cfg.offset = VEPU540C_CTL_OFFSET;
1346*437bfbebSnyanmisaka 
1347*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
1348*437bfbebSnyanmisaka     if (ret) {
1349*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
1350*437bfbebSnyanmisaka         return ret;
1351*437bfbebSnyanmisaka     }
1352*437bfbebSnyanmisaka 
1353*437bfbebSnyanmisaka     if (hal_h265e_debug & HAL_H265E_DBG_CTL_REGS) {
1354*437bfbebSnyanmisaka         regs = (RK_U32*)&hw_regs->reg_ctl;
1355*437bfbebSnyanmisaka         for (i = 0; i < sizeof(hevc_vepu540c_control_cfg) / 4; i++) {
1356*437bfbebSnyanmisaka             hal_h265e_dbg_ctl("ctl reg[%04x]: 0%08x\n", i * 4, regs[i]);
1357*437bfbebSnyanmisaka         }
1358*437bfbebSnyanmisaka     }
1359*437bfbebSnyanmisaka 
1360*437bfbebSnyanmisaka     cfg.reg = &hw_regs->reg_base;
1361*437bfbebSnyanmisaka     cfg.size = sizeof(hevc_vepu540c_base);
1362*437bfbebSnyanmisaka     cfg.offset = VEPU540C_BASE_OFFSET;
1363*437bfbebSnyanmisaka 
1364*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
1365*437bfbebSnyanmisaka     if (ret) {
1366*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
1367*437bfbebSnyanmisaka         return ret;
1368*437bfbebSnyanmisaka     }
1369*437bfbebSnyanmisaka 
1370*437bfbebSnyanmisaka     if (hal_h265e_debug & HAL_H265E_DBG_REGS) {
1371*437bfbebSnyanmisaka         regs = (RK_U32*)(&hw_regs->reg_base);
1372*437bfbebSnyanmisaka         for (i = 0; i < 32; i++) {
1373*437bfbebSnyanmisaka             hal_h265e_dbg_regs("hw add cfg reg[%04x]: 0%08x\n", i * 4, regs[i]);
1374*437bfbebSnyanmisaka         }
1375*437bfbebSnyanmisaka         regs += 32;
1376*437bfbebSnyanmisaka         for (i = 0; i < (sizeof(hevc_vepu540c_base) - 128) / 4; i++) {
1377*437bfbebSnyanmisaka             hal_h265e_dbg_regs("set reg[%04x]: 0%08x\n", i * 4, regs[i]);
1378*437bfbebSnyanmisaka         }
1379*437bfbebSnyanmisaka     }
1380*437bfbebSnyanmisaka     cfg.reg = &hw_regs->reg_rc_roi;
1381*437bfbebSnyanmisaka     cfg.size = sizeof(hevc_vepu540c_rc_roi);
1382*437bfbebSnyanmisaka     cfg.offset = VEPU540C_RCROI_OFFSET;
1383*437bfbebSnyanmisaka 
1384*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
1385*437bfbebSnyanmisaka     if (ret) {
1386*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
1387*437bfbebSnyanmisaka         return ret;
1388*437bfbebSnyanmisaka     }
1389*437bfbebSnyanmisaka 
1390*437bfbebSnyanmisaka     if (hal_h265e_debug & HAL_H265E_DBG_RCKUT_REGS) {
1391*437bfbebSnyanmisaka         regs = (RK_U32*)&hw_regs->reg_rc_roi;
1392*437bfbebSnyanmisaka         for (i = 0; i < sizeof(hevc_vepu540c_rc_roi) / 4; i++) {
1393*437bfbebSnyanmisaka             hal_h265e_dbg_rckut("set reg[%04x]: 0%08x\n", i * 4, regs[i]);
1394*437bfbebSnyanmisaka         }
1395*437bfbebSnyanmisaka     }
1396*437bfbebSnyanmisaka 
1397*437bfbebSnyanmisaka     cfg.reg =  &hw_regs->reg_wgt;
1398*437bfbebSnyanmisaka     cfg.size = sizeof(hevc_vepu540c_wgt);
1399*437bfbebSnyanmisaka     cfg.offset = VEPU540C_WEG_OFFSET;
1400*437bfbebSnyanmisaka 
1401*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
1402*437bfbebSnyanmisaka     if (ret) {
1403*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
1404*437bfbebSnyanmisaka         return ret;
1405*437bfbebSnyanmisaka     }
1406*437bfbebSnyanmisaka 
1407*437bfbebSnyanmisaka     if (hal_h265e_debug & HAL_H265E_DBG_WGT_REGS) {
1408*437bfbebSnyanmisaka         regs = (RK_U32*)&hw_regs->reg_wgt;
1409*437bfbebSnyanmisaka         for (i = 0; i < sizeof(hevc_vepu540c_wgt) / 4; i++) {
1410*437bfbebSnyanmisaka             hal_h265e_dbg_wgt("set reg[%04x]: 0%08x\n", i * 4, regs[i]);
1411*437bfbebSnyanmisaka         }
1412*437bfbebSnyanmisaka     }
1413*437bfbebSnyanmisaka 
1414*437bfbebSnyanmisaka     cfg.reg = &hw_regs->reg_rdo;
1415*437bfbebSnyanmisaka     cfg.size = sizeof(vepu540c_rdo_cfg);
1416*437bfbebSnyanmisaka     cfg.offset = VEPU540C_RDOCFG_OFFSET;
1417*437bfbebSnyanmisaka 
1418*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &cfg);
1419*437bfbebSnyanmisaka     if (ret) {
1420*437bfbebSnyanmisaka         mpp_err_f("set register write failed %d\n", ret);
1421*437bfbebSnyanmisaka         return ret;
1422*437bfbebSnyanmisaka     }
1423*437bfbebSnyanmisaka 
1424*437bfbebSnyanmisaka     cfg1.reg = &reg_out->hw_status;
1425*437bfbebSnyanmisaka     cfg1.size = sizeof(RK_U32);
1426*437bfbebSnyanmisaka     cfg1.offset = VEPU540C_REG_BASE_HW_STATUS;
1427*437bfbebSnyanmisaka 
1428*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg1);
1429*437bfbebSnyanmisaka     if (ret) {
1430*437bfbebSnyanmisaka         mpp_err_f("set register read failed %d\n", ret);
1431*437bfbebSnyanmisaka         return ret;
1432*437bfbebSnyanmisaka     }
1433*437bfbebSnyanmisaka 
1434*437bfbebSnyanmisaka     cfg1.reg = &reg_out->st;
1435*437bfbebSnyanmisaka     cfg1.size = sizeof(H265eV540cStatusElem) - 4;
1436*437bfbebSnyanmisaka     cfg1.offset = VEPU540C_STATUS_OFFSET;
1437*437bfbebSnyanmisaka 
1438*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &cfg1);
1439*437bfbebSnyanmisaka     if (ret) {
1440*437bfbebSnyanmisaka         mpp_err_f("set register read failed %d\n", ret);
1441*437bfbebSnyanmisaka         return ret;
1442*437bfbebSnyanmisaka     }
1443*437bfbebSnyanmisaka 
1444*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
1445*437bfbebSnyanmisaka     if (ret) {
1446*437bfbebSnyanmisaka         mpp_err_f("send cmd failed %d\n", ret);
1447*437bfbebSnyanmisaka     }
1448*437bfbebSnyanmisaka     hal_h265e_leave();
1449*437bfbebSnyanmisaka     return ret;
1450*437bfbebSnyanmisaka }
1451*437bfbebSnyanmisaka 
vepu540c_h265_set_feedback(H265eV540cHalContext * ctx,HalEncTask * enc_task)1452*437bfbebSnyanmisaka static MPP_RET vepu540c_h265_set_feedback(H265eV540cHalContext *ctx, HalEncTask *enc_task)
1453*437bfbebSnyanmisaka {
1454*437bfbebSnyanmisaka     EncRcTaskInfo *hal_rc_ret = (EncRcTaskInfo *)&enc_task->rc_task->info;
1455*437bfbebSnyanmisaka     vepu540c_h265_fbk *fb = &ctx->feedback;
1456*437bfbebSnyanmisaka     MppEncCfgSet    *cfg = ctx->cfg;
1457*437bfbebSnyanmisaka     RK_S32 mb64_num = ((cfg->prep.width + 63) / 64) * ((cfg->prep.height + 63) / 64);
1458*437bfbebSnyanmisaka     RK_S32 mb8_num = (mb64_num << 6);
1459*437bfbebSnyanmisaka     RK_S32 mb4_num = (mb8_num << 2);
1460*437bfbebSnyanmisaka     H265eV540cStatusElem *elem = (H265eV540cStatusElem *)ctx->reg_out[0];
1461*437bfbebSnyanmisaka     vepu540c_hw_status hw_status = elem->hw_status;
1462*437bfbebSnyanmisaka 
1463*437bfbebSnyanmisaka     hal_h265e_enter();
1464*437bfbebSnyanmisaka 
1465*437bfbebSnyanmisaka     fb->qp_sum += elem->st.qp_sum;
1466*437bfbebSnyanmisaka 
1467*437bfbebSnyanmisaka     fb->out_strm_size += elem->st.bs_lgth_l32;
1468*437bfbebSnyanmisaka 
1469*437bfbebSnyanmisaka     fb->sse_sum += (RK_S64)(elem->st.sse_h32 << 16) +
1470*437bfbebSnyanmisaka                    (elem->st.st_sse_bsl.sse_l16 & 0xffff) ;
1471*437bfbebSnyanmisaka 
1472*437bfbebSnyanmisaka     fb->hw_status = hw_status;
1473*437bfbebSnyanmisaka     hal_h265e_dbg_detail("hw_status: 0x%08x", hw_status.val);
1474*437bfbebSnyanmisaka     if (hw_status.int_sta.enc_done_sta)
1475*437bfbebSnyanmisaka         hal_h265e_dbg_detail("RKV_ENC_INT_ENC_DONE");
1476*437bfbebSnyanmisaka 
1477*437bfbebSnyanmisaka     if (hw_status.int_sta.lkt_node_done_sta)
1478*437bfbebSnyanmisaka         hal_h265e_dbg_detail("RKV_ENC_INT_LKT_NODE_DONE");
1479*437bfbebSnyanmisaka 
1480*437bfbebSnyanmisaka     if (hw_status.int_sta.sclr_done_sta)
1481*437bfbebSnyanmisaka         hal_h265e_dbg_detail("RKV_ENC_INT_SCLR_DONE");
1482*437bfbebSnyanmisaka 
1483*437bfbebSnyanmisaka     if (hw_status.int_sta.vslc_done_sta)
1484*437bfbebSnyanmisaka         hal_h265e_dbg_detail("RKV_ENC_INT_VSLC_DONE");
1485*437bfbebSnyanmisaka 
1486*437bfbebSnyanmisaka     if (hw_status.int_sta.vbsf_oflw_sta)
1487*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_VBSF_OFLOW");
1488*437bfbebSnyanmisaka 
1489*437bfbebSnyanmisaka     if (hw_status.int_sta.vbuf_lens_sta)
1490*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_VBUF_LENS");
1491*437bfbebSnyanmisaka 
1492*437bfbebSnyanmisaka     if (hw_status.int_sta.enc_err_sta)
1493*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_ENC_ERR");
1494*437bfbebSnyanmisaka 
1495*437bfbebSnyanmisaka     if (hw_status.int_sta.dvbm_fcfg_sta)
1496*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_DVBM_FCFG");
1497*437bfbebSnyanmisaka 
1498*437bfbebSnyanmisaka     if (hw_status.int_sta.wdg_sta)
1499*437bfbebSnyanmisaka         hal_h265e_err("RKV_ENC_INT_WDG_TIMEOUT");
1500*437bfbebSnyanmisaka 
1501*437bfbebSnyanmisaka     // fb->st_madi += elem->st.madi;
1502*437bfbebSnyanmisaka     //fb->st_madp += elem->st.madp;
1503*437bfbebSnyanmisaka     fb->st_mb_num += elem->st.st_bnum_b16.num_b16;
1504*437bfbebSnyanmisaka     //  fb->st_ctu_num += elem->st.st_bnum_cme.num_ctu;
1505*437bfbebSnyanmisaka 
1506*437bfbebSnyanmisaka     fb->st_lvl64_inter_num += elem->st.st_pnum_p64.pnum_p64;
1507*437bfbebSnyanmisaka     fb->st_lvl32_inter_num += elem->st.st_pnum_p32.pnum_p32;
1508*437bfbebSnyanmisaka     fb->st_lvl32_intra_num += elem->st.st_pnum_i32.pnum_i32;
1509*437bfbebSnyanmisaka     fb->st_lvl16_inter_num += elem->st.st_pnum_p16.pnum_p16;
1510*437bfbebSnyanmisaka     fb->st_lvl16_intra_num += elem->st.st_pnum_i16.pnum_i16;
1511*437bfbebSnyanmisaka     fb->st_lvl8_inter_num  += elem->st.st_pnum_p8.pnum_p8;
1512*437bfbebSnyanmisaka     fb->st_lvl8_intra_num  += elem->st.st_pnum_i8.pnum_i8;
1513*437bfbebSnyanmisaka     fb->st_lvl4_intra_num  += elem->st.st_pnum_i4.pnum_i4;
1514*437bfbebSnyanmisaka     memcpy(&fb->st_cu_num_qp[0], &elem->st.st_b8_qp, 52 * sizeof(RK_U32));
1515*437bfbebSnyanmisaka 
1516*437bfbebSnyanmisaka     hal_rc_ret->bit_real += fb->out_strm_size * 8;
1517*437bfbebSnyanmisaka 
1518*437bfbebSnyanmisaka     if (fb->st_mb_num) {
1519*437bfbebSnyanmisaka         fb->st_madi = fb->st_madi / fb->st_mb_num;
1520*437bfbebSnyanmisaka     } else {
1521*437bfbebSnyanmisaka         fb->st_madi = 0;
1522*437bfbebSnyanmisaka     }
1523*437bfbebSnyanmisaka     if (fb->st_ctu_num) {
1524*437bfbebSnyanmisaka         fb->st_madp = fb->st_madp / fb->st_ctu_num;
1525*437bfbebSnyanmisaka     } else {
1526*437bfbebSnyanmisaka         fb->st_madp = 0;
1527*437bfbebSnyanmisaka     }
1528*437bfbebSnyanmisaka 
1529*437bfbebSnyanmisaka     if (mb4_num > 0)
1530*437bfbebSnyanmisaka         hal_rc_ret->iblk4_prop =  ((((fb->st_lvl4_intra_num + fb->st_lvl8_intra_num) << 2) +
1531*437bfbebSnyanmisaka                                     (fb->st_lvl16_intra_num << 4) +
1532*437bfbebSnyanmisaka                                     (fb->st_lvl32_intra_num << 6)) << 8) / mb4_num;
1533*437bfbebSnyanmisaka 
1534*437bfbebSnyanmisaka     if (mb64_num > 0) {
1535*437bfbebSnyanmisaka         /*
1536*437bfbebSnyanmisaka         hal_cfg[k].inter_lv8_prop = ((fb->st_lvl8_inter_num + (fb->st_lvl16_inter_num << 2) +
1537*437bfbebSnyanmisaka                                       (fb->st_lvl32_inter_num << 4) +
1538*437bfbebSnyanmisaka                                       (fb->st_lvl64_inter_num << 6)) << 8) / mb8_num;*/
1539*437bfbebSnyanmisaka 
1540*437bfbebSnyanmisaka         hal_rc_ret->quality_real = fb->qp_sum / mb8_num;
1541*437bfbebSnyanmisaka         // hal_cfg[k].sse          = fb->sse_sum / mb64_num;
1542*437bfbebSnyanmisaka     }
1543*437bfbebSnyanmisaka 
1544*437bfbebSnyanmisaka     hal_rc_ret->madi = fb->st_madi;
1545*437bfbebSnyanmisaka     hal_rc_ret->madp = fb->st_madp;
1546*437bfbebSnyanmisaka     hal_h265e_leave();
1547*437bfbebSnyanmisaka     return MPP_OK;
1548*437bfbebSnyanmisaka }
1549*437bfbebSnyanmisaka 
1550*437bfbebSnyanmisaka 
1551*437bfbebSnyanmisaka //#define DUMP_DATA
hal_h265e_v540c_wait(void * hal,HalEncTask * task)1552*437bfbebSnyanmisaka MPP_RET hal_h265e_v540c_wait(void *hal, HalEncTask *task)
1553*437bfbebSnyanmisaka {
1554*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1555*437bfbebSnyanmisaka     H265eV540cHalContext *ctx = (H265eV540cHalContext *)hal;
1556*437bfbebSnyanmisaka     HalEncTask *enc_task = task;
1557*437bfbebSnyanmisaka     H265eV540cStatusElem *elem = (H265eV540cStatusElem *)ctx->reg_out;
1558*437bfbebSnyanmisaka     hal_h265e_enter();
1559*437bfbebSnyanmisaka 
1560*437bfbebSnyanmisaka     if (enc_task->flags.err) {
1561*437bfbebSnyanmisaka         hal_h265e_err("enc_task->flags.err %08x, return early",
1562*437bfbebSnyanmisaka                       enc_task->flags.err);
1563*437bfbebSnyanmisaka         return MPP_NOK;
1564*437bfbebSnyanmisaka     }
1565*437bfbebSnyanmisaka 
1566*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
1567*437bfbebSnyanmisaka 
1568*437bfbebSnyanmisaka #ifdef DUMP_DATA
1569*437bfbebSnyanmisaka     static FILE *fp_fbd = NULL;
1570*437bfbebSnyanmisaka     static FILE *fp_fbh = NULL;
1571*437bfbebSnyanmisaka     static FILE *fp_dws = NULL;
1572*437bfbebSnyanmisaka     HalBuf *recon_buf;
1573*437bfbebSnyanmisaka     static RK_U32 frm_num = 0;
1574*437bfbebSnyanmisaka     H265eSyntax_new *syn = (H265eSyntax_new *)enc_task->syntax.data;
1575*437bfbebSnyanmisaka     recon_buf = hal_bufs_get_buf(ctx->dpb_bufs, syn->sp.recon_pic.slot_idx);
1576*437bfbebSnyanmisaka     char file_name[20] = "";
1577*437bfbebSnyanmisaka     size_t rec_size = mpp_buffer_get_size(recon_buf->buf[0]);
1578*437bfbebSnyanmisaka     size_t dws_size = mpp_buffer_get_size(recon_buf->buf[1]);
1579*437bfbebSnyanmisaka 
1580*437bfbebSnyanmisaka     void *ptr = mpp_buffer_get_ptr(recon_buf->buf[0]);
1581*437bfbebSnyanmisaka     void *dws_ptr = mpp_buffer_get_ptr(recon_buf->buf[1]);
1582*437bfbebSnyanmisaka 
1583*437bfbebSnyanmisaka     sprintf(&file_name[0], "fbd%d.bin", frm_num);
1584*437bfbebSnyanmisaka     if (fp_fbd != NULL) {
1585*437bfbebSnyanmisaka         fclose(fp_fbd);
1586*437bfbebSnyanmisaka         fp_fbd = NULL;
1587*437bfbebSnyanmisaka     } else {
1588*437bfbebSnyanmisaka         fp_fbd = fopen(file_name, "wb+");
1589*437bfbebSnyanmisaka     }
1590*437bfbebSnyanmisaka     if (fp_fbd) {
1591*437bfbebSnyanmisaka         fwrite(ptr + ctx->fbc_header_len, 1, rec_size - ctx->fbc_header_len, fp_fbd);
1592*437bfbebSnyanmisaka         fflush(fp_fbd);
1593*437bfbebSnyanmisaka     }
1594*437bfbebSnyanmisaka 
1595*437bfbebSnyanmisaka     sprintf(&file_name[0], "fbh%d.bin", frm_num);
1596*437bfbebSnyanmisaka 
1597*437bfbebSnyanmisaka     if (fp_fbh != NULL) {
1598*437bfbebSnyanmisaka         fclose(fp_fbh);
1599*437bfbebSnyanmisaka         fp_fbh = NULL;
1600*437bfbebSnyanmisaka     } else {
1601*437bfbebSnyanmisaka         fp_fbh = fopen(file_name, "wb+");
1602*437bfbebSnyanmisaka     }
1603*437bfbebSnyanmisaka 
1604*437bfbebSnyanmisaka     if (fp_fbh) {
1605*437bfbebSnyanmisaka         fwrite(ptr , 1, ctx->fbc_header_len, fp_fbh);
1606*437bfbebSnyanmisaka         fflush(fp_fbh);
1607*437bfbebSnyanmisaka     }
1608*437bfbebSnyanmisaka 
1609*437bfbebSnyanmisaka 
1610*437bfbebSnyanmisaka     sprintf(&file_name[0], "dws%d.bin", frm_num);
1611*437bfbebSnyanmisaka 
1612*437bfbebSnyanmisaka     if (fp_dws != NULL) {
1613*437bfbebSnyanmisaka         fclose(fp_dws);
1614*437bfbebSnyanmisaka         fp_dws = NULL;
1615*437bfbebSnyanmisaka     } else {
1616*437bfbebSnyanmisaka         fp_dws = fopen(file_name, "wb+");
1617*437bfbebSnyanmisaka     }
1618*437bfbebSnyanmisaka 
1619*437bfbebSnyanmisaka     if (fp_dws) {
1620*437bfbebSnyanmisaka         fwrite(dws_ptr , 1, dws_size, fp_dws);
1621*437bfbebSnyanmisaka         fflush(fp_dws);
1622*437bfbebSnyanmisaka     }
1623*437bfbebSnyanmisaka     frm_num++;
1624*437bfbebSnyanmisaka #endif
1625*437bfbebSnyanmisaka     if (ret)
1626*437bfbebSnyanmisaka         mpp_err_f("poll cmd failed %d status %d \n", ret, elem->hw_status.val);
1627*437bfbebSnyanmisaka 
1628*437bfbebSnyanmisaka     hal_h265e_leave();
1629*437bfbebSnyanmisaka     return ret;
1630*437bfbebSnyanmisaka }
1631*437bfbebSnyanmisaka 
hal_h265e_v540c_get_task(void * hal,HalEncTask * task)1632*437bfbebSnyanmisaka MPP_RET hal_h265e_v540c_get_task(void *hal, HalEncTask *task)
1633*437bfbebSnyanmisaka {
1634*437bfbebSnyanmisaka     H265eV540cHalContext *ctx = (H265eV540cHalContext *)hal;
1635*437bfbebSnyanmisaka     MppFrame frame = task->frame;
1636*437bfbebSnyanmisaka     EncFrmStatus  *frm_status = &task->rc_task->frm;
1637*437bfbebSnyanmisaka 
1638*437bfbebSnyanmisaka     hal_h265e_enter();
1639*437bfbebSnyanmisaka 
1640*437bfbebSnyanmisaka     if (vepu540c_h265_setup_hal_bufs(ctx)) {
1641*437bfbebSnyanmisaka         hal_h265e_err("vepu541_h265_allocate_buffers failed, free buffers and return\n");
1642*437bfbebSnyanmisaka         task->flags.err |= HAL_ENC_TASK_ERR_ALLOC;
1643*437bfbebSnyanmisaka         return MPP_ERR_MALLOC;
1644*437bfbebSnyanmisaka     }
1645*437bfbebSnyanmisaka 
1646*437bfbebSnyanmisaka     ctx->last_frame_type = ctx->frame_type;
1647*437bfbebSnyanmisaka     if (frm_status->is_intra) {
1648*437bfbebSnyanmisaka         ctx->frame_type = INTRA_FRAME;
1649*437bfbebSnyanmisaka     } else {
1650*437bfbebSnyanmisaka         ctx->frame_type = INTER_P_FRAME;
1651*437bfbebSnyanmisaka     }
1652*437bfbebSnyanmisaka     if (!frm_status->reencode && mpp_frame_has_meta(task->frame)) {
1653*437bfbebSnyanmisaka         MppMeta meta = mpp_frame_get_meta(frame);
1654*437bfbebSnyanmisaka 
1655*437bfbebSnyanmisaka         mpp_meta_get_ptr(meta, KEY_ROI_DATA, (void **)&ctx->roi_data);
1656*437bfbebSnyanmisaka     }
1657*437bfbebSnyanmisaka     memset(&ctx->feedback, 0, sizeof(vepu540c_h265_fbk));
1658*437bfbebSnyanmisaka 
1659*437bfbebSnyanmisaka     hal_h265e_leave();
1660*437bfbebSnyanmisaka     return MPP_OK;
1661*437bfbebSnyanmisaka }
1662*437bfbebSnyanmisaka 
hal_h265e_v540c_ret_task(void * hal,HalEncTask * task)1663*437bfbebSnyanmisaka MPP_RET hal_h265e_v540c_ret_task(void *hal, HalEncTask *task)
1664*437bfbebSnyanmisaka {
1665*437bfbebSnyanmisaka     H265eV540cHalContext *ctx = (H265eV540cHalContext *)hal;
1666*437bfbebSnyanmisaka     HalEncTask *enc_task = task;
1667*437bfbebSnyanmisaka     vepu540c_h265_fbk *fb = &ctx->feedback;
1668*437bfbebSnyanmisaka     EncRcTaskInfo *rc_info = &task->rc_task->info;
1669*437bfbebSnyanmisaka     RK_U32 offset = mpp_packet_get_length(enc_task->packet);
1670*437bfbebSnyanmisaka 
1671*437bfbebSnyanmisaka     hal_h265e_enter();
1672*437bfbebSnyanmisaka 
1673*437bfbebSnyanmisaka     vepu540c_h265_set_feedback(ctx, enc_task);
1674*437bfbebSnyanmisaka     mpp_buffer_sync_partial_begin(enc_task->output, offset, fb->out_strm_size);
1675*437bfbebSnyanmisaka     hal_h265e_amend_temporal_id(task, fb->out_strm_size);
1676*437bfbebSnyanmisaka 
1677*437bfbebSnyanmisaka     rc_info->sse = fb->sse_sum;
1678*437bfbebSnyanmisaka     rc_info->lvl64_inter_num = fb->st_lvl64_inter_num;
1679*437bfbebSnyanmisaka     rc_info->lvl32_inter_num = fb->st_lvl32_inter_num;
1680*437bfbebSnyanmisaka     rc_info->lvl16_inter_num = fb->st_lvl16_inter_num;
1681*437bfbebSnyanmisaka     rc_info->lvl8_inter_num  = fb->st_lvl8_inter_num;
1682*437bfbebSnyanmisaka     rc_info->lvl32_intra_num = fb->st_lvl32_intra_num;
1683*437bfbebSnyanmisaka     rc_info->lvl16_intra_num = fb->st_lvl16_intra_num;
1684*437bfbebSnyanmisaka     rc_info->lvl8_intra_num  = fb->st_lvl8_intra_num;
1685*437bfbebSnyanmisaka     rc_info->lvl4_intra_num  = fb->st_lvl4_intra_num;
1686*437bfbebSnyanmisaka 
1687*437bfbebSnyanmisaka     enc_task->hw_length = fb->out_strm_size;
1688*437bfbebSnyanmisaka     enc_task->length += fb->out_strm_size;
1689*437bfbebSnyanmisaka 
1690*437bfbebSnyanmisaka     hal_h265e_dbg_detail("output stream size %d\n", fb->out_strm_size);
1691*437bfbebSnyanmisaka 
1692*437bfbebSnyanmisaka     hal_h265e_leave();
1693*437bfbebSnyanmisaka     return MPP_OK;
1694*437bfbebSnyanmisaka }
1695*437bfbebSnyanmisaka 
1696*437bfbebSnyanmisaka const MppEncHalApi hal_h265e_vepu540c = {
1697*437bfbebSnyanmisaka     "hal_h265e_v540c",
1698*437bfbebSnyanmisaka     MPP_VIDEO_CodingHEVC,
1699*437bfbebSnyanmisaka     sizeof(H265eV540cHalContext),
1700*437bfbebSnyanmisaka     0,
1701*437bfbebSnyanmisaka     hal_h265e_v540c_init,
1702*437bfbebSnyanmisaka     hal_h265e_v540c_deinit,
1703*437bfbebSnyanmisaka     hal_h265e_vepu540c_prepare,
1704*437bfbebSnyanmisaka     hal_h265e_v540c_get_task,
1705*437bfbebSnyanmisaka     hal_h265e_v540c_gen_regs,
1706*437bfbebSnyanmisaka     hal_h265e_v540c_start,
1707*437bfbebSnyanmisaka     hal_h265e_v540c_wait,
1708*437bfbebSnyanmisaka     NULL,
1709*437bfbebSnyanmisaka     NULL,
1710*437bfbebSnyanmisaka     hal_h265e_v540c_ret_task,
1711*437bfbebSnyanmisaka };
1712