1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka * Copyright 2021 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka *
4*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka * You may obtain a copy of the License at
7*437bfbebSnyanmisaka *
8*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka *
10*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka * limitations under the License.
15*437bfbebSnyanmisaka */
16*437bfbebSnyanmisaka
17*437bfbebSnyanmisaka #define MODULE_TAG "hal_h264e_vepu580"
18*437bfbebSnyanmisaka
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka
21*437bfbebSnyanmisaka #include "mpp_env.h"
22*437bfbebSnyanmisaka #include "mpp_mem.h"
23*437bfbebSnyanmisaka #include "mpp_common.h"
24*437bfbebSnyanmisaka #include "mpp_frame_impl.h"
25*437bfbebSnyanmisaka #include "mpp_packet_impl.h"
26*437bfbebSnyanmisaka #include "mpp_rc.h"
27*437bfbebSnyanmisaka
28*437bfbebSnyanmisaka #include "h264e_sps.h"
29*437bfbebSnyanmisaka #include "h264e_pps.h"
30*437bfbebSnyanmisaka #include "h264e_dpb.h"
31*437bfbebSnyanmisaka #include "h264e_slice.h"
32*437bfbebSnyanmisaka
33*437bfbebSnyanmisaka #include "hal_h264e_debug.h"
34*437bfbebSnyanmisaka #include "hal_bufs.h"
35*437bfbebSnyanmisaka #include "mpp_enc_hal.h"
36*437bfbebSnyanmisaka #include "rkv_enc_def.h"
37*437bfbebSnyanmisaka #include "vepu5xx_common.h"
38*437bfbebSnyanmisaka #include "vepu580_common.h"
39*437bfbebSnyanmisaka #include "vepu5xx.h"
40*437bfbebSnyanmisaka #include "hal_h264e_vepu580_reg.h"
41*437bfbebSnyanmisaka #include "mpp_enc_cb_param.h"
42*437bfbebSnyanmisaka #include "hal_h264e_stream_amend.h"
43*437bfbebSnyanmisaka
44*437bfbebSnyanmisaka #define DUMP_REG 0
45*437bfbebSnyanmisaka #define MAX_TASK_CNT 2
46*437bfbebSnyanmisaka
47*437bfbebSnyanmisaka typedef struct Vepu580RoiH264BsCfg_t {
48*437bfbebSnyanmisaka RK_U64 force_inter : 42;
49*437bfbebSnyanmisaka RK_U64 mode_mask : 9;
50*437bfbebSnyanmisaka RK_U64 reserved : 10;
51*437bfbebSnyanmisaka RK_U64 force_intra : 1;
52*437bfbebSnyanmisaka RK_U64 qp_adj_en : 1;
53*437bfbebSnyanmisaka RK_U64 amv_en : 1;
54*437bfbebSnyanmisaka } Vepu580RoiH264BsCfg;
55*437bfbebSnyanmisaka
56*437bfbebSnyanmisaka typedef struct HalH264eVepu580Ctx_t {
57*437bfbebSnyanmisaka MppEncCfgSet *cfg;
58*437bfbebSnyanmisaka
59*437bfbebSnyanmisaka MppDev dev;
60*437bfbebSnyanmisaka RK_S32 frame_cnt;
61*437bfbebSnyanmisaka RK_U32 task_cnt;
62*437bfbebSnyanmisaka
63*437bfbebSnyanmisaka /* buffers management */
64*437bfbebSnyanmisaka HalBufs hw_recn;
65*437bfbebSnyanmisaka RK_S32 pixel_buf_fbc_hdr_size;
66*437bfbebSnyanmisaka RK_S32 pixel_buf_fbc_bdy_size;
67*437bfbebSnyanmisaka RK_S32 pixel_buf_size;
68*437bfbebSnyanmisaka RK_S32 thumb_buf_size;
69*437bfbebSnyanmisaka RK_S32 max_buf_cnt;
70*437bfbebSnyanmisaka MppDevRegOffCfgs *offsets;
71*437bfbebSnyanmisaka
72*437bfbebSnyanmisaka /* external line buffer over 4K */
73*437bfbebSnyanmisaka MppBufferGroup ext_line_buf_grp;
74*437bfbebSnyanmisaka MppBuffer ext_line_bufs[MAX_TASK_CNT];
75*437bfbebSnyanmisaka RK_S32 ext_line_buf_size;
76*437bfbebSnyanmisaka
77*437bfbebSnyanmisaka /* syntax for input from enc_impl */
78*437bfbebSnyanmisaka RK_U32 updated;
79*437bfbebSnyanmisaka H264eSps *sps;
80*437bfbebSnyanmisaka H264ePps *pps;
81*437bfbebSnyanmisaka H264eDpb *dpb;
82*437bfbebSnyanmisaka H264eFrmInfo *frms;
83*437bfbebSnyanmisaka
84*437bfbebSnyanmisaka /* async encode TSVC info */
85*437bfbebSnyanmisaka H264eReorderInfo *reorder;
86*437bfbebSnyanmisaka H264eMarkingInfo *marking;
87*437bfbebSnyanmisaka
88*437bfbebSnyanmisaka /* syntax for output to enc_impl */
89*437bfbebSnyanmisaka EncRcTaskInfo hal_rc_cfg;
90*437bfbebSnyanmisaka
91*437bfbebSnyanmisaka /* roi */
92*437bfbebSnyanmisaka void *roi_data;
93*437bfbebSnyanmisaka MppBufferGroup roi_grp;
94*437bfbebSnyanmisaka MppBuffer roi_base_cfg_buf;
95*437bfbebSnyanmisaka RK_S32 roi_base_buf_size;
96*437bfbebSnyanmisaka
97*437bfbebSnyanmisaka /* osd */
98*437bfbebSnyanmisaka Vepu5xxOsdCfg osd_cfg;
99*437bfbebSnyanmisaka
100*437bfbebSnyanmisaka /* finetune */
101*437bfbebSnyanmisaka void *tune;
102*437bfbebSnyanmisaka MppBuffer qpmap_base_cfg_buf;
103*437bfbebSnyanmisaka MppBuffer qpmap_qp_cfg_buf;
104*437bfbebSnyanmisaka RK_U8* md_flag_buf;
105*437bfbebSnyanmisaka RK_S32 qpmap_base_cfg_size;
106*437bfbebSnyanmisaka RK_S32 qpmap_qp_cfg_size;
107*437bfbebSnyanmisaka RK_S32 md_flag_size;
108*437bfbebSnyanmisaka
109*437bfbebSnyanmisaka /* two-pass deflicker */
110*437bfbebSnyanmisaka MppBuffer buf_pass1;
111*437bfbebSnyanmisaka
112*437bfbebSnyanmisaka /* register */
113*437bfbebSnyanmisaka HalVepu580RegSet *regs_sets;
114*437bfbebSnyanmisaka HalH264eVepuStreamAmend *amend_sets;
115*437bfbebSnyanmisaka
116*437bfbebSnyanmisaka H264ePrefixNal *prefix_sets;
117*437bfbebSnyanmisaka H264eSlice *slice_sets;
118*437bfbebSnyanmisaka
119*437bfbebSnyanmisaka /* frame parallel info */
120*437bfbebSnyanmisaka RK_S32 task_idx;
121*437bfbebSnyanmisaka RK_S32 curr_idx;
122*437bfbebSnyanmisaka RK_S32 prev_idx;
123*437bfbebSnyanmisaka HalVepu580RegSet *regs_set;
124*437bfbebSnyanmisaka HalH264eVepuStreamAmend *amend;
125*437bfbebSnyanmisaka H264ePrefixNal *prefix;
126*437bfbebSnyanmisaka H264eSlice *slice;
127*437bfbebSnyanmisaka
128*437bfbebSnyanmisaka MppBuffer ext_line_buf;
129*437bfbebSnyanmisaka
130*437bfbebSnyanmisaka /* slice low delay output callback */
131*437bfbebSnyanmisaka MppCbCtx *output_cb;
132*437bfbebSnyanmisaka RK_S32 poll_slice_max;
133*437bfbebSnyanmisaka RK_S32 poll_cfg_size;
134*437bfbebSnyanmisaka MppDevPollCfg *poll_cfgs;
135*437bfbebSnyanmisaka } HalH264eVepu580Ctx;
136*437bfbebSnyanmisaka
137*437bfbebSnyanmisaka #define CHROMA_KLUT_TAB_SIZE (24 * sizeof(RK_U32))
138*437bfbebSnyanmisaka
139*437bfbebSnyanmisaka static RK_U32 h264e_klut_weight[30] = {
140*437bfbebSnyanmisaka 0x0a000010, 0x00064000, 0x14000020, 0x000c8000,
141*437bfbebSnyanmisaka 0x28000040, 0x00194000, 0x50800080, 0x0032c000,
142*437bfbebSnyanmisaka 0xa1000100, 0x00658000, 0x42800200, 0x00cb0001,
143*437bfbebSnyanmisaka 0x85000400, 0x01964002, 0x0a000800, 0x032c8005,
144*437bfbebSnyanmisaka 0x14001000, 0x0659400a, 0x28802000, 0x0cb2c014,
145*437bfbebSnyanmisaka 0x51004000, 0x1965c028, 0xa2808000, 0x32cbc050,
146*437bfbebSnyanmisaka 0x4500ffff, 0x659780a1, 0x8a81fffe, 0xCC000142,
147*437bfbebSnyanmisaka 0xFF83FFFF, 0x000001FF,
148*437bfbebSnyanmisaka };
149*437bfbebSnyanmisaka
150*437bfbebSnyanmisaka static RK_U32 disable_rcb_buf = 0;
151*437bfbebSnyanmisaka
152*437bfbebSnyanmisaka static RK_U32 h264_mode_bias[16] = {
153*437bfbebSnyanmisaka 0, 2, 4, 6,
154*437bfbebSnyanmisaka 8, 10, 12, 14,
155*437bfbebSnyanmisaka 16, 18, 20, 24,
156*437bfbebSnyanmisaka 28, 32, 64, 128
157*437bfbebSnyanmisaka };
158*437bfbebSnyanmisaka
159*437bfbebSnyanmisaka static RK_S32 h264_aq_tthd_default[16] = {
160*437bfbebSnyanmisaka 0, 0, 0, 0,
161*437bfbebSnyanmisaka 3, 3, 5, 5,
162*437bfbebSnyanmisaka 8, 8, 8, 15,
163*437bfbebSnyanmisaka 15, 20, 25, 35,
164*437bfbebSnyanmisaka };
165*437bfbebSnyanmisaka
166*437bfbebSnyanmisaka static RK_S32 h264_P_aq_step_default[16] = {
167*437bfbebSnyanmisaka -8, -7, -6, -5,
168*437bfbebSnyanmisaka -4, -3, -2, -1,
169*437bfbebSnyanmisaka 0, 1, 2, 3,
170*437bfbebSnyanmisaka 4, 5, 7, 8,
171*437bfbebSnyanmisaka };
172*437bfbebSnyanmisaka
173*437bfbebSnyanmisaka static RK_S32 h264_I_aq_step_default[16] = {
174*437bfbebSnyanmisaka -8, -7, -6, -5,
175*437bfbebSnyanmisaka -4, -3, -2, -1,
176*437bfbebSnyanmisaka 0, 1, 2, 3,
177*437bfbebSnyanmisaka 4, 5, 6, 8,
178*437bfbebSnyanmisaka };
179*437bfbebSnyanmisaka
180*437bfbebSnyanmisaka #include "hal_h264e_vepu580_tune.c"
181*437bfbebSnyanmisaka
setup_ext_line_bufs(HalH264eVepu580Ctx * ctx)182*437bfbebSnyanmisaka static void setup_ext_line_bufs(HalH264eVepu580Ctx *ctx)
183*437bfbebSnyanmisaka {
184*437bfbebSnyanmisaka RK_U32 i;
185*437bfbebSnyanmisaka
186*437bfbebSnyanmisaka for (i = 0; i < ctx->task_cnt; i++) {
187*437bfbebSnyanmisaka if (ctx->ext_line_bufs[i])
188*437bfbebSnyanmisaka continue;
189*437bfbebSnyanmisaka
190*437bfbebSnyanmisaka mpp_buffer_get(ctx->ext_line_buf_grp, &ctx->ext_line_bufs[i],
191*437bfbebSnyanmisaka ctx->ext_line_buf_size);
192*437bfbebSnyanmisaka }
193*437bfbebSnyanmisaka }
194*437bfbebSnyanmisaka
clear_ext_line_bufs(HalH264eVepu580Ctx * ctx)195*437bfbebSnyanmisaka static void clear_ext_line_bufs(HalH264eVepu580Ctx *ctx)
196*437bfbebSnyanmisaka {
197*437bfbebSnyanmisaka RK_U32 i;
198*437bfbebSnyanmisaka
199*437bfbebSnyanmisaka for (i = 0; i < ctx->task_cnt; i++) {
200*437bfbebSnyanmisaka if (ctx->ext_line_bufs[i]) {
201*437bfbebSnyanmisaka mpp_buffer_put(ctx->ext_line_bufs[i]);
202*437bfbebSnyanmisaka ctx->ext_line_bufs[i] = NULL;
203*437bfbebSnyanmisaka }
204*437bfbebSnyanmisaka }
205*437bfbebSnyanmisaka }
206*437bfbebSnyanmisaka
hal_h264e_vepu580_deinit(void * hal)207*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu580_deinit(void *hal)
208*437bfbebSnyanmisaka {
209*437bfbebSnyanmisaka HalH264eVepu580Ctx *p = (HalH264eVepu580Ctx *)hal;
210*437bfbebSnyanmisaka RK_U32 i;
211*437bfbebSnyanmisaka
212*437bfbebSnyanmisaka hal_h264e_dbg_func("enter %p\n", p);
213*437bfbebSnyanmisaka
214*437bfbebSnyanmisaka if (p->dev) {
215*437bfbebSnyanmisaka mpp_dev_deinit(p->dev);
216*437bfbebSnyanmisaka p->dev = NULL;
217*437bfbebSnyanmisaka }
218*437bfbebSnyanmisaka
219*437bfbebSnyanmisaka clear_ext_line_bufs(p);
220*437bfbebSnyanmisaka
221*437bfbebSnyanmisaka if (p->amend_sets) {
222*437bfbebSnyanmisaka for (i = 0; i < p->task_cnt; i++)
223*437bfbebSnyanmisaka h264e_vepu_stream_amend_deinit(&p->amend_sets[i]);
224*437bfbebSnyanmisaka }
225*437bfbebSnyanmisaka
226*437bfbebSnyanmisaka MPP_FREE(p->regs_sets);
227*437bfbebSnyanmisaka MPP_FREE(p->amend_sets);
228*437bfbebSnyanmisaka MPP_FREE(p->prefix_sets);
229*437bfbebSnyanmisaka MPP_FREE(p->slice_sets);
230*437bfbebSnyanmisaka MPP_FREE(p->reorder);
231*437bfbebSnyanmisaka MPP_FREE(p->marking);
232*437bfbebSnyanmisaka MPP_FREE(p->poll_cfgs);
233*437bfbebSnyanmisaka
234*437bfbebSnyanmisaka if (p->ext_line_buf_grp) {
235*437bfbebSnyanmisaka mpp_buffer_group_put(p->ext_line_buf_grp);
236*437bfbebSnyanmisaka p->ext_line_buf_grp = NULL;
237*437bfbebSnyanmisaka }
238*437bfbebSnyanmisaka
239*437bfbebSnyanmisaka if (p->hw_recn) {
240*437bfbebSnyanmisaka hal_bufs_deinit(p->hw_recn);
241*437bfbebSnyanmisaka p->hw_recn = NULL;
242*437bfbebSnyanmisaka }
243*437bfbebSnyanmisaka
244*437bfbebSnyanmisaka if (p->roi_base_cfg_buf) {
245*437bfbebSnyanmisaka mpp_buffer_put(p->roi_base_cfg_buf);
246*437bfbebSnyanmisaka p->roi_base_cfg_buf = NULL;
247*437bfbebSnyanmisaka p->roi_base_buf_size = 0;
248*437bfbebSnyanmisaka }
249*437bfbebSnyanmisaka
250*437bfbebSnyanmisaka if (p->roi_grp) {
251*437bfbebSnyanmisaka mpp_buffer_group_put(p->roi_grp);
252*437bfbebSnyanmisaka p->roi_grp = NULL;
253*437bfbebSnyanmisaka }
254*437bfbebSnyanmisaka
255*437bfbebSnyanmisaka if (p->offsets) {
256*437bfbebSnyanmisaka mpp_dev_multi_offset_deinit(p->offsets);
257*437bfbebSnyanmisaka p->offsets = NULL;
258*437bfbebSnyanmisaka }
259*437bfbebSnyanmisaka
260*437bfbebSnyanmisaka if (p->buf_pass1) {
261*437bfbebSnyanmisaka mpp_buffer_put(p->buf_pass1);
262*437bfbebSnyanmisaka p->buf_pass1 = NULL;
263*437bfbebSnyanmisaka }
264*437bfbebSnyanmisaka
265*437bfbebSnyanmisaka if (p->tune) {
266*437bfbebSnyanmisaka vepu580_h264e_tune_deinit(p->tune);
267*437bfbebSnyanmisaka p->tune = NULL;
268*437bfbebSnyanmisaka }
269*437bfbebSnyanmisaka
270*437bfbebSnyanmisaka if (p->qpmap_base_cfg_buf) {
271*437bfbebSnyanmisaka mpp_buffer_put(p->qpmap_base_cfg_buf);
272*437bfbebSnyanmisaka p->qpmap_base_cfg_buf = NULL;
273*437bfbebSnyanmisaka }
274*437bfbebSnyanmisaka
275*437bfbebSnyanmisaka if (p->qpmap_qp_cfg_buf) {
276*437bfbebSnyanmisaka mpp_buffer_put(p->qpmap_qp_cfg_buf);
277*437bfbebSnyanmisaka p->qpmap_qp_cfg_buf = NULL;
278*437bfbebSnyanmisaka }
279*437bfbebSnyanmisaka
280*437bfbebSnyanmisaka if (p->md_flag_buf) {
281*437bfbebSnyanmisaka MPP_FREE(p->md_flag_buf);
282*437bfbebSnyanmisaka }
283*437bfbebSnyanmisaka
284*437bfbebSnyanmisaka hal_h264e_dbg_func("leave %p\n", p);
285*437bfbebSnyanmisaka
286*437bfbebSnyanmisaka return MPP_OK;
287*437bfbebSnyanmisaka }
288*437bfbebSnyanmisaka
hal_h264e_vepu580_init(void * hal,MppEncHalCfg * cfg)289*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu580_init(void *hal, MppEncHalCfg *cfg)
290*437bfbebSnyanmisaka {
291*437bfbebSnyanmisaka HalH264eVepu580Ctx *p = (HalH264eVepu580Ctx *)hal;
292*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
293*437bfbebSnyanmisaka RK_U32 i;
294*437bfbebSnyanmisaka
295*437bfbebSnyanmisaka hal_h264e_dbg_func("enter %p\n", p);
296*437bfbebSnyanmisaka
297*437bfbebSnyanmisaka p->cfg = cfg->cfg;
298*437bfbebSnyanmisaka
299*437bfbebSnyanmisaka mpp_env_get_u32("disable_rcb_buf", &disable_rcb_buf, 0);
300*437bfbebSnyanmisaka
301*437bfbebSnyanmisaka /* update output to MppEnc */
302*437bfbebSnyanmisaka cfg->type = VPU_CLIENT_RKVENC;
303*437bfbebSnyanmisaka ret = mpp_dev_init(&cfg->dev, cfg->type);
304*437bfbebSnyanmisaka if (ret) {
305*437bfbebSnyanmisaka mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
306*437bfbebSnyanmisaka goto DONE;
307*437bfbebSnyanmisaka }
308*437bfbebSnyanmisaka p->dev = cfg->dev;
309*437bfbebSnyanmisaka p->task_cnt = cfg->task_cnt;
310*437bfbebSnyanmisaka mpp_assert(p->task_cnt && p->task_cnt <= MAX_TASK_CNT);
311*437bfbebSnyanmisaka
312*437bfbebSnyanmisaka ret = hal_bufs_init(&p->hw_recn);
313*437bfbebSnyanmisaka if (ret) {
314*437bfbebSnyanmisaka mpp_err_f("init vepu buffer failed ret: %d\n", ret);
315*437bfbebSnyanmisaka goto DONE;
316*437bfbebSnyanmisaka }
317*437bfbebSnyanmisaka
318*437bfbebSnyanmisaka p->regs_sets = mpp_malloc(HalVepu580RegSet, p->task_cnt);
319*437bfbebSnyanmisaka if (NULL == p->regs_sets) {
320*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
321*437bfbebSnyanmisaka mpp_err_f("init register buffer failed\n");
322*437bfbebSnyanmisaka goto DONE;
323*437bfbebSnyanmisaka }
324*437bfbebSnyanmisaka p->amend_sets = mpp_malloc(HalH264eVepuStreamAmend, p->task_cnt);
325*437bfbebSnyanmisaka if (NULL == p->amend_sets) {
326*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
327*437bfbebSnyanmisaka mpp_err_f("init amend data failed\n");
328*437bfbebSnyanmisaka goto DONE;
329*437bfbebSnyanmisaka }
330*437bfbebSnyanmisaka
331*437bfbebSnyanmisaka if (p->task_cnt > 1) {
332*437bfbebSnyanmisaka p->prefix_sets = mpp_malloc(H264ePrefixNal, p->task_cnt);
333*437bfbebSnyanmisaka if (NULL == p->prefix_sets) {
334*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
335*437bfbebSnyanmisaka mpp_err_f("init amend data failed\n");
336*437bfbebSnyanmisaka goto DONE;
337*437bfbebSnyanmisaka }
338*437bfbebSnyanmisaka
339*437bfbebSnyanmisaka p->slice_sets = mpp_malloc(H264eSlice, p->task_cnt);
340*437bfbebSnyanmisaka if (NULL == p->slice_sets) {
341*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
342*437bfbebSnyanmisaka mpp_err_f("init amend data failed\n");
343*437bfbebSnyanmisaka goto DONE;
344*437bfbebSnyanmisaka }
345*437bfbebSnyanmisaka
346*437bfbebSnyanmisaka p->reorder = mpp_malloc(H264eReorderInfo, 1);
347*437bfbebSnyanmisaka if (NULL == p->reorder) {
348*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
349*437bfbebSnyanmisaka mpp_err_f("init amend data failed\n");
350*437bfbebSnyanmisaka goto DONE;
351*437bfbebSnyanmisaka }
352*437bfbebSnyanmisaka
353*437bfbebSnyanmisaka p->marking = mpp_malloc(H264eMarkingInfo, 1);
354*437bfbebSnyanmisaka if (NULL == p->marking) {
355*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
356*437bfbebSnyanmisaka mpp_err_f("init amend data failed\n");
357*437bfbebSnyanmisaka goto DONE;
358*437bfbebSnyanmisaka }
359*437bfbebSnyanmisaka }
360*437bfbebSnyanmisaka
361*437bfbebSnyanmisaka p->poll_slice_max = 8;
362*437bfbebSnyanmisaka p->poll_cfg_size = (sizeof(p->poll_cfgs) + sizeof(RK_S32) * p->poll_slice_max);
363*437bfbebSnyanmisaka p->poll_cfgs = mpp_malloc_size(MppDevPollCfg, p->poll_cfg_size * p->task_cnt);
364*437bfbebSnyanmisaka if (NULL == p->poll_cfgs) {
365*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
366*437bfbebSnyanmisaka mpp_err_f("init poll cfg buffer failed\n");
367*437bfbebSnyanmisaka goto DONE;
368*437bfbebSnyanmisaka }
369*437bfbebSnyanmisaka
370*437bfbebSnyanmisaka p->osd_cfg.reg_base = &p->regs_sets->reg_osd;
371*437bfbebSnyanmisaka p->osd_cfg.dev = p->dev;
372*437bfbebSnyanmisaka p->osd_cfg.reg_cfg = NULL;
373*437bfbebSnyanmisaka p->osd_cfg.plt_cfg = &p->cfg->plt_cfg;
374*437bfbebSnyanmisaka p->osd_cfg.osd_data = NULL;
375*437bfbebSnyanmisaka p->osd_cfg.osd_data2 = NULL;
376*437bfbebSnyanmisaka
377*437bfbebSnyanmisaka { /* setup default hardware config */
378*437bfbebSnyanmisaka MppEncHwCfg *hw = &cfg->cfg->hw;
379*437bfbebSnyanmisaka
380*437bfbebSnyanmisaka hw->qp_delta_row_i = 2;
381*437bfbebSnyanmisaka hw->qp_delta_row = 2;
382*437bfbebSnyanmisaka hw->extra_buf = 1;
383*437bfbebSnyanmisaka hw->qbias_i = 683;
384*437bfbebSnyanmisaka hw->qbias_p = 341;
385*437bfbebSnyanmisaka hw->qbias_en = 0;
386*437bfbebSnyanmisaka
387*437bfbebSnyanmisaka memcpy(hw->aq_thrd_i, h264_aq_tthd_default, sizeof(hw->aq_thrd_i));
388*437bfbebSnyanmisaka memcpy(hw->aq_thrd_p, h264_aq_tthd_default, sizeof(hw->aq_thrd_p));
389*437bfbebSnyanmisaka memcpy(hw->aq_step_i, h264_I_aq_step_default, sizeof(hw->aq_step_i));
390*437bfbebSnyanmisaka memcpy(hw->aq_step_p, h264_P_aq_step_default, sizeof(hw->aq_step_p));
391*437bfbebSnyanmisaka
392*437bfbebSnyanmisaka for (i = 0; i < MPP_ARRAY_ELEMS(hw->mode_bias); i++)
393*437bfbebSnyanmisaka hw->mode_bias[i] = 8;
394*437bfbebSnyanmisaka
395*437bfbebSnyanmisaka hw->skip_sad = 8;
396*437bfbebSnyanmisaka hw->skip_bias = 8;
397*437bfbebSnyanmisaka }
398*437bfbebSnyanmisaka mpp_dev_multi_offset_init(&p->offsets, 24);
399*437bfbebSnyanmisaka p->osd_cfg.reg_cfg = p->offsets;
400*437bfbebSnyanmisaka
401*437bfbebSnyanmisaka p->tune = vepu580_h264e_tune_init(p);
402*437bfbebSnyanmisaka p->output_cb = cfg->output_cb;
403*437bfbebSnyanmisaka
404*437bfbebSnyanmisaka cfg->cap_recn_out = 1;
405*437bfbebSnyanmisaka
406*437bfbebSnyanmisaka for (i = 0; i < p->task_cnt; i++)
407*437bfbebSnyanmisaka h264e_vepu_stream_amend_init(&p->amend_sets[i]);
408*437bfbebSnyanmisaka
409*437bfbebSnyanmisaka DONE:
410*437bfbebSnyanmisaka if (ret)
411*437bfbebSnyanmisaka hal_h264e_vepu580_deinit(hal);
412*437bfbebSnyanmisaka
413*437bfbebSnyanmisaka hal_h264e_dbg_func("leave %p\n", p);
414*437bfbebSnyanmisaka return ret;
415*437bfbebSnyanmisaka }
416*437bfbebSnyanmisaka
417*437bfbebSnyanmisaka /*
418*437bfbebSnyanmisaka * NOTE: recon / refer buffer is FBC data buffer.
419*437bfbebSnyanmisaka * And FBC data require extra 16 lines space for hardware io.
420*437bfbebSnyanmisaka */
setup_hal_bufs(HalH264eVepu580Ctx * ctx)421*437bfbebSnyanmisaka static void setup_hal_bufs(HalH264eVepu580Ctx *ctx)
422*437bfbebSnyanmisaka {
423*437bfbebSnyanmisaka MppEncCfgSet *cfg = ctx->cfg;
424*437bfbebSnyanmisaka MppEncPrepCfg *prep = &cfg->prep;
425*437bfbebSnyanmisaka RK_S32 alignment_w = 64;
426*437bfbebSnyanmisaka RK_S32 alignment_h = 16;
427*437bfbebSnyanmisaka RK_S32 aligned_w = MPP_ALIGN(prep->width, alignment_w);
428*437bfbebSnyanmisaka RK_S32 aligned_h = MPP_ALIGN(prep->height, alignment_h) + 16;
429*437bfbebSnyanmisaka RK_S32 pixel_buf_fbc_hdr_size = MPP_ALIGN(aligned_w * aligned_h / 64, SZ_8K);
430*437bfbebSnyanmisaka RK_S32 pixel_buf_fbc_bdy_size = aligned_w * aligned_h * 3 / 2;
431*437bfbebSnyanmisaka RK_S32 pixel_buf_size = pixel_buf_fbc_hdr_size + pixel_buf_fbc_bdy_size;
432*437bfbebSnyanmisaka RK_S32 thumb_buf_size = MPP_ALIGN(aligned_w / 64 * aligned_h / 64 * 256, SZ_8K);
433*437bfbebSnyanmisaka RK_S32 old_max_cnt = ctx->max_buf_cnt;
434*437bfbebSnyanmisaka RK_S32 new_max_cnt = 4;
435*437bfbebSnyanmisaka MppEncRefCfg ref_cfg = cfg->ref_cfg;
436*437bfbebSnyanmisaka
437*437bfbebSnyanmisaka if (ref_cfg) {
438*437bfbebSnyanmisaka MppEncCpbInfo *info = mpp_enc_ref_cfg_get_cpb_info(ref_cfg);
439*437bfbebSnyanmisaka if (new_max_cnt < MPP_MAX(new_max_cnt, info->dpb_size + 1))
440*437bfbebSnyanmisaka new_max_cnt = MPP_MAX(new_max_cnt, info->dpb_size + 1);
441*437bfbebSnyanmisaka }
442*437bfbebSnyanmisaka
443*437bfbebSnyanmisaka if (aligned_w > SZ_4K) {
444*437bfbebSnyanmisaka /* 480 bytes for each ctu above 3072 */
445*437bfbebSnyanmisaka RK_S32 ext_line_buf_size = (aligned_w - 3 * SZ_1K) / 64 * 480;
446*437bfbebSnyanmisaka
447*437bfbebSnyanmisaka if (NULL == ctx->ext_line_buf_grp)
448*437bfbebSnyanmisaka mpp_buffer_group_get_internal(&ctx->ext_line_buf_grp, MPP_BUFFER_TYPE_ION);
449*437bfbebSnyanmisaka else if (ext_line_buf_size != ctx->ext_line_buf_size) {
450*437bfbebSnyanmisaka clear_ext_line_bufs(ctx);
451*437bfbebSnyanmisaka mpp_buffer_group_clear(ctx->ext_line_buf_grp);
452*437bfbebSnyanmisaka }
453*437bfbebSnyanmisaka
454*437bfbebSnyanmisaka mpp_assert(ctx->ext_line_buf_grp);
455*437bfbebSnyanmisaka
456*437bfbebSnyanmisaka ctx->ext_line_buf_size = ext_line_buf_size;
457*437bfbebSnyanmisaka setup_ext_line_bufs(ctx);
458*437bfbebSnyanmisaka } else {
459*437bfbebSnyanmisaka clear_ext_line_bufs(ctx);
460*437bfbebSnyanmisaka if (ctx->ext_line_buf_grp) {
461*437bfbebSnyanmisaka mpp_buffer_group_clear(ctx->ext_line_buf_grp);
462*437bfbebSnyanmisaka mpp_buffer_group_put(ctx->ext_line_buf_grp);
463*437bfbebSnyanmisaka ctx->ext_line_buf_grp = NULL;
464*437bfbebSnyanmisaka }
465*437bfbebSnyanmisaka ctx->ext_line_buf_size = 0;
466*437bfbebSnyanmisaka }
467*437bfbebSnyanmisaka
468*437bfbebSnyanmisaka if ((ctx->pixel_buf_fbc_hdr_size != pixel_buf_fbc_hdr_size) ||
469*437bfbebSnyanmisaka (ctx->pixel_buf_fbc_bdy_size != pixel_buf_fbc_bdy_size) ||
470*437bfbebSnyanmisaka (ctx->pixel_buf_size != pixel_buf_size) ||
471*437bfbebSnyanmisaka (ctx->thumb_buf_size != thumb_buf_size) ||
472*437bfbebSnyanmisaka (new_max_cnt > old_max_cnt)) {
473*437bfbebSnyanmisaka size_t sizes[2];
474*437bfbebSnyanmisaka
475*437bfbebSnyanmisaka hal_h264e_dbg_detail("frame size %d -> %d max count %d -> %d\n",
476*437bfbebSnyanmisaka ctx->pixel_buf_size, pixel_buf_size,
477*437bfbebSnyanmisaka old_max_cnt, new_max_cnt);
478*437bfbebSnyanmisaka
479*437bfbebSnyanmisaka /* pixel buffer */
480*437bfbebSnyanmisaka sizes[0] = pixel_buf_size;
481*437bfbebSnyanmisaka /* thumb buffer */
482*437bfbebSnyanmisaka sizes[1] = thumb_buf_size;
483*437bfbebSnyanmisaka new_max_cnt = MPP_MAX(new_max_cnt, old_max_cnt);
484*437bfbebSnyanmisaka
485*437bfbebSnyanmisaka hal_bufs_setup(ctx->hw_recn, new_max_cnt, 2, sizes);
486*437bfbebSnyanmisaka
487*437bfbebSnyanmisaka ctx->pixel_buf_fbc_hdr_size = pixel_buf_fbc_hdr_size;
488*437bfbebSnyanmisaka ctx->pixel_buf_fbc_bdy_size = pixel_buf_fbc_bdy_size;
489*437bfbebSnyanmisaka ctx->pixel_buf_size = pixel_buf_size;
490*437bfbebSnyanmisaka ctx->thumb_buf_size = thumb_buf_size;
491*437bfbebSnyanmisaka ctx->max_buf_cnt = new_max_cnt;
492*437bfbebSnyanmisaka }
493*437bfbebSnyanmisaka }
494*437bfbebSnyanmisaka
hal_h264e_vepu580_prepare(void * hal)495*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu580_prepare(void *hal)
496*437bfbebSnyanmisaka {
497*437bfbebSnyanmisaka HalH264eVepu580Ctx *ctx = (HalH264eVepu580Ctx *)hal;
498*437bfbebSnyanmisaka MppEncPrepCfg *prep = &ctx->cfg->prep;
499*437bfbebSnyanmisaka
500*437bfbebSnyanmisaka hal_h264e_dbg_func("enter %p\n", hal);
501*437bfbebSnyanmisaka
502*437bfbebSnyanmisaka if (prep->change_res) {
503*437bfbebSnyanmisaka RK_S32 i;
504*437bfbebSnyanmisaka
505*437bfbebSnyanmisaka // pre-alloc required buffers to reduce first frame delay
506*437bfbebSnyanmisaka setup_hal_bufs(ctx);
507*437bfbebSnyanmisaka for (i = 0; i < ctx->max_buf_cnt; i++)
508*437bfbebSnyanmisaka hal_bufs_get_buf(ctx->hw_recn, i);
509*437bfbebSnyanmisaka
510*437bfbebSnyanmisaka prep->change_res = 0;
511*437bfbebSnyanmisaka }
512*437bfbebSnyanmisaka
513*437bfbebSnyanmisaka hal_h264e_dbg_func("leave %p\n", hal);
514*437bfbebSnyanmisaka
515*437bfbebSnyanmisaka return MPP_OK;
516*437bfbebSnyanmisaka }
517*437bfbebSnyanmisaka
update_vepu580_syntax(HalH264eVepu580Ctx * ctx,MppSyntax * syntax)518*437bfbebSnyanmisaka static RK_U32 update_vepu580_syntax(HalH264eVepu580Ctx *ctx, MppSyntax *syntax)
519*437bfbebSnyanmisaka {
520*437bfbebSnyanmisaka H264eSyntaxDesc *desc = syntax->data;
521*437bfbebSnyanmisaka RK_S32 syn_num = syntax->number;
522*437bfbebSnyanmisaka RK_U32 updated = 0;
523*437bfbebSnyanmisaka RK_S32 i;
524*437bfbebSnyanmisaka
525*437bfbebSnyanmisaka for (i = 0; i < syn_num; i++, desc++) {
526*437bfbebSnyanmisaka switch (desc->type) {
527*437bfbebSnyanmisaka case H264E_SYN_CFG : {
528*437bfbebSnyanmisaka hal_h264e_dbg_detail("update cfg");
529*437bfbebSnyanmisaka ctx->cfg = desc->p;
530*437bfbebSnyanmisaka } break;
531*437bfbebSnyanmisaka case H264E_SYN_SPS : {
532*437bfbebSnyanmisaka hal_h264e_dbg_detail("update sps");
533*437bfbebSnyanmisaka ctx->sps = desc->p;
534*437bfbebSnyanmisaka } break;
535*437bfbebSnyanmisaka case H264E_SYN_PPS : {
536*437bfbebSnyanmisaka hal_h264e_dbg_detail("update pps");
537*437bfbebSnyanmisaka ctx->pps = desc->p;
538*437bfbebSnyanmisaka } break;
539*437bfbebSnyanmisaka case H264E_SYN_DPB : {
540*437bfbebSnyanmisaka hal_h264e_dbg_detail("update dpb");
541*437bfbebSnyanmisaka ctx->dpb = desc->p;
542*437bfbebSnyanmisaka } break;
543*437bfbebSnyanmisaka case H264E_SYN_SLICE : {
544*437bfbebSnyanmisaka hal_h264e_dbg_detail("update slice");
545*437bfbebSnyanmisaka ctx->slice = desc->p;
546*437bfbebSnyanmisaka } break;
547*437bfbebSnyanmisaka case H264E_SYN_FRAME : {
548*437bfbebSnyanmisaka hal_h264e_dbg_detail("update frames");
549*437bfbebSnyanmisaka ctx->frms = desc->p;
550*437bfbebSnyanmisaka } break;
551*437bfbebSnyanmisaka case H264E_SYN_PREFIX : {
552*437bfbebSnyanmisaka hal_h264e_dbg_detail("update prefix nal");
553*437bfbebSnyanmisaka ctx->prefix = desc->p;
554*437bfbebSnyanmisaka } break;
555*437bfbebSnyanmisaka default : {
556*437bfbebSnyanmisaka mpp_log_f("invalid syntax type %d\n", desc->type);
557*437bfbebSnyanmisaka } break;
558*437bfbebSnyanmisaka }
559*437bfbebSnyanmisaka
560*437bfbebSnyanmisaka updated |= SYN_TYPE_FLAG(desc->type);
561*437bfbebSnyanmisaka }
562*437bfbebSnyanmisaka
563*437bfbebSnyanmisaka return updated;
564*437bfbebSnyanmisaka }
565*437bfbebSnyanmisaka
hal_h264e_vepu580_get_task(void * hal,HalEncTask * task)566*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu580_get_task(void *hal, HalEncTask *task)
567*437bfbebSnyanmisaka {
568*437bfbebSnyanmisaka HalH264eVepu580Ctx *ctx = (HalH264eVepu580Ctx *)hal;
569*437bfbebSnyanmisaka MppEncCfgSet *cfg_set = ctx->cfg;
570*437bfbebSnyanmisaka MppEncRefCfgImpl *ref = (MppEncRefCfgImpl *)cfg_set->ref_cfg;
571*437bfbebSnyanmisaka MppEncH264HwCfg *hw_cfg = &cfg_set->h264.hw_cfg;
572*437bfbebSnyanmisaka RK_U32 updated = update_vepu580_syntax(ctx, &task->syntax);
573*437bfbebSnyanmisaka EncFrmStatus *frm_status = &task->rc_task->frm;
574*437bfbebSnyanmisaka H264eFrmInfo *frms = ctx->frms;
575*437bfbebSnyanmisaka
576*437bfbebSnyanmisaka hal_h264e_dbg_func("enter %p\n", hal);
577*437bfbebSnyanmisaka
578*437bfbebSnyanmisaka if (updated & SYN_TYPE_FLAG(H264E_SYN_CFG))
579*437bfbebSnyanmisaka setup_hal_bufs(ctx);
580*437bfbebSnyanmisaka
581*437bfbebSnyanmisaka if (!frm_status->reencode && mpp_frame_has_meta(task->frame)) {
582*437bfbebSnyanmisaka MppMeta meta = mpp_frame_get_meta(task->frame);
583*437bfbebSnyanmisaka
584*437bfbebSnyanmisaka mpp_meta_get_ptr_d(meta, KEY_ROI_DATA2, (void **)&ctx->roi_data, NULL);
585*437bfbebSnyanmisaka mpp_meta_get_ptr_d(meta, KEY_OSD_DATA, (void **)&ctx->osd_cfg.osd_data, NULL);
586*437bfbebSnyanmisaka mpp_meta_get_ptr_d(meta, KEY_OSD_DATA2, (void **)&ctx->osd_cfg.osd_data2, NULL);
587*437bfbebSnyanmisaka }
588*437bfbebSnyanmisaka
589*437bfbebSnyanmisaka if (ctx->dpb) {
590*437bfbebSnyanmisaka h264e_dpb_hal_start(ctx->dpb, frms->curr_idx);
591*437bfbebSnyanmisaka h264e_dpb_hal_start(ctx->dpb, frms->refr_idx);
592*437bfbebSnyanmisaka }
593*437bfbebSnyanmisaka
594*437bfbebSnyanmisaka task->flags.reg_idx = ctx->task_idx;
595*437bfbebSnyanmisaka task->flags.curr_idx = frms->curr_idx;
596*437bfbebSnyanmisaka task->flags.refr_idx = frms->refr_idx;
597*437bfbebSnyanmisaka task->part_first = 1;
598*437bfbebSnyanmisaka task->part_last = 0;
599*437bfbebSnyanmisaka
600*437bfbebSnyanmisaka ctx->ext_line_buf = ctx->ext_line_bufs[ctx->task_idx];
601*437bfbebSnyanmisaka ctx->regs_set = &ctx->regs_sets[ctx->task_idx];
602*437bfbebSnyanmisaka ctx->amend = &ctx->amend_sets[ctx->task_idx];
603*437bfbebSnyanmisaka ctx->osd_cfg.reg_base = &ctx->regs_set->reg_osd;
604*437bfbebSnyanmisaka
605*437bfbebSnyanmisaka /* if not VEPU1/2, update log2_max_frame_num_minus4 in hw_cfg */
606*437bfbebSnyanmisaka hw_cfg->hw_log2_max_frame_num_minus4 = ctx->sps->log2_max_frame_num_minus4;
607*437bfbebSnyanmisaka
608*437bfbebSnyanmisaka if (ctx->task_cnt > 1 && (ref->lt_cfg_cnt || ref->st_cfg_cnt > 1)) {
609*437bfbebSnyanmisaka H264ePrefixNal *prefix = &ctx->prefix_sets[ctx->task_idx];
610*437bfbebSnyanmisaka H264eSlice *slice = &ctx->slice_sets[ctx->task_idx];
611*437bfbebSnyanmisaka
612*437bfbebSnyanmisaka //store async encode TSVC info
613*437bfbebSnyanmisaka if (ctx->prefix)
614*437bfbebSnyanmisaka memcpy(prefix, ctx->prefix, sizeof(H264ePrefixNal));
615*437bfbebSnyanmisaka else
616*437bfbebSnyanmisaka prefix = NULL;
617*437bfbebSnyanmisaka
618*437bfbebSnyanmisaka if (ctx->slice) {
619*437bfbebSnyanmisaka memcpy(slice, ctx->slice, sizeof(H264eSlice));
620*437bfbebSnyanmisaka
621*437bfbebSnyanmisaka /*
622*437bfbebSnyanmisaka * Generally, reorder and marking are shared by dpb and slice.
623*437bfbebSnyanmisaka * However, async encoding TSVC will change reorder and marking in each task.
624*437bfbebSnyanmisaka * Therefore, malloc a special space for async encoding TSVC.
625*437bfbebSnyanmisaka */
626*437bfbebSnyanmisaka ctx->amend->reorder = ctx->reorder;
627*437bfbebSnyanmisaka ctx->amend->marking = ctx->marking;
628*437bfbebSnyanmisaka }
629*437bfbebSnyanmisaka
630*437bfbebSnyanmisaka h264e_vepu_stream_amend_config(ctx->amend, task->packet, ctx->cfg,
631*437bfbebSnyanmisaka slice, prefix);
632*437bfbebSnyanmisaka } else {
633*437bfbebSnyanmisaka h264e_vepu_stream_amend_config(ctx->amend, task->packet, ctx->cfg,
634*437bfbebSnyanmisaka ctx->slice, ctx->prefix);
635*437bfbebSnyanmisaka }
636*437bfbebSnyanmisaka
637*437bfbebSnyanmisaka if (ctx->task_cnt > 1)
638*437bfbebSnyanmisaka ctx->task_idx = !ctx->task_idx;
639*437bfbebSnyanmisaka
640*437bfbebSnyanmisaka hal_h264e_dbg_func("leave %p\n", hal);
641*437bfbebSnyanmisaka
642*437bfbebSnyanmisaka return MPP_OK;
643*437bfbebSnyanmisaka }
644*437bfbebSnyanmisaka
setup_vepu580_normal(HalVepu580RegSet * regs)645*437bfbebSnyanmisaka static void setup_vepu580_normal(HalVepu580RegSet *regs)
646*437bfbebSnyanmisaka {
647*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
648*437bfbebSnyanmisaka
649*437bfbebSnyanmisaka /* reg001 ENC_STRT */
650*437bfbebSnyanmisaka regs->reg_ctl.enc_strt.lkt_num = 0;
651*437bfbebSnyanmisaka regs->reg_ctl.enc_strt.vepu_cmd = 1;
652*437bfbebSnyanmisaka regs->reg_ctl.func_en.cke = 1;
653*437bfbebSnyanmisaka regs->reg_ctl.func_en.resetn_hw_en = 1;
654*437bfbebSnyanmisaka regs->reg_ctl.func_en.enc_done_tmvp_en = 1;
655*437bfbebSnyanmisaka
656*437bfbebSnyanmisaka /* reg002 ENC_CLR */
657*437bfbebSnyanmisaka regs->reg_ctl.enc_clr.safe_clr = 0;
658*437bfbebSnyanmisaka regs->reg_ctl.enc_clr.force_clr = 0;
659*437bfbebSnyanmisaka
660*437bfbebSnyanmisaka /* reg004 INT_EN */
661*437bfbebSnyanmisaka regs->reg_ctl.int_en.enc_done_en = 1;
662*437bfbebSnyanmisaka regs->reg_ctl.int_en.lkt_node_done_en = 1;
663*437bfbebSnyanmisaka regs->reg_ctl.int_en.sclr_done_en = 1;
664*437bfbebSnyanmisaka regs->reg_ctl.int_en.slc_done_en = 0;
665*437bfbebSnyanmisaka regs->reg_ctl.int_en.bsf_oflw_en = 1;
666*437bfbebSnyanmisaka regs->reg_ctl.int_en.brsp_otsd_en = 1;
667*437bfbebSnyanmisaka regs->reg_ctl.int_en.wbus_err_en = 1;
668*437bfbebSnyanmisaka regs->reg_ctl.int_en.rbus_err_en = 1;
669*437bfbebSnyanmisaka regs->reg_ctl.int_en.wdg_en = 1;
670*437bfbebSnyanmisaka
671*437bfbebSnyanmisaka /* reg005 INT_MSK */
672*437bfbebSnyanmisaka regs->reg_ctl.int_msk.enc_done_msk = 0;
673*437bfbebSnyanmisaka regs->reg_ctl.int_msk.lkt_node_done_msk = 0;
674*437bfbebSnyanmisaka regs->reg_ctl.int_msk.sclr_done_msk = 0;
675*437bfbebSnyanmisaka regs->reg_ctl.int_msk.slc_done_msk = 0;
676*437bfbebSnyanmisaka regs->reg_ctl.int_msk.bsf_oflw_msk = 0;
677*437bfbebSnyanmisaka regs->reg_ctl.int_msk.brsp_otsd_msk = 0;
678*437bfbebSnyanmisaka regs->reg_ctl.int_msk.wbus_err_msk = 0;
679*437bfbebSnyanmisaka regs->reg_ctl.int_msk.rbus_err_msk = 0;
680*437bfbebSnyanmisaka regs->reg_ctl.int_msk.wdg_msk = 0;
681*437bfbebSnyanmisaka
682*437bfbebSnyanmisaka regs->reg_ctl.enc_wdg.vs_load_thd = 0x1fffff;
683*437bfbebSnyanmisaka regs->reg_ctl.enc_wdg.rfp_load_thd = 0;
684*437bfbebSnyanmisaka
685*437bfbebSnyanmisaka /* reg015 DTRNS_MAP */
686*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.cmvw_bus_ordr = 0;
687*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.dspw_bus_ordr = 0;
688*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.rfpw_bus_ordr = 0;
689*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.src_bus_edin = 0;
690*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.meiw_bus_edin = 0;
691*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.bsw_bus_edin = 7;
692*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.lktr_bus_edin = 0;
693*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.roir_bus_edin = 0;
694*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.lktw_bus_edin = 0;
695*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.afbc_bsize = 1;
696*437bfbebSnyanmisaka
697*437bfbebSnyanmisaka regs->reg_ctl.dtrns_cfg.axi_brsp_cke = 0;
698*437bfbebSnyanmisaka regs->reg_ctl.dtrns_cfg.dspr_otsd = 1;
699*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
700*437bfbebSnyanmisaka }
701*437bfbebSnyanmisaka
setup_vepu580_prep(HalVepu580RegSet * regs,MppEncPrepCfg * prep,HalEncTask * task)702*437bfbebSnyanmisaka static MPP_RET setup_vepu580_prep(HalVepu580RegSet *regs, MppEncPrepCfg *prep,
703*437bfbebSnyanmisaka HalEncTask *task)
704*437bfbebSnyanmisaka {
705*437bfbebSnyanmisaka VepuFmtCfg cfg;
706*437bfbebSnyanmisaka MppFrameFormat fmt = prep->format;
707*437bfbebSnyanmisaka MPP_RET ret = vepu5xx_set_fmt(&cfg, fmt);
708*437bfbebSnyanmisaka RK_U32 hw_fmt = cfg.format;
709*437bfbebSnyanmisaka RK_S32 y_stride;
710*437bfbebSnyanmisaka RK_S32 c_stride;
711*437bfbebSnyanmisaka
712*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
713*437bfbebSnyanmisaka
714*437bfbebSnyanmisaka /* do nothing when color format is not supported */
715*437bfbebSnyanmisaka if (ret)
716*437bfbebSnyanmisaka return ret;
717*437bfbebSnyanmisaka
718*437bfbebSnyanmisaka regs->reg_base.enc_rsl.pic_wd8_m1 = MPP_ALIGN(prep->width, 16) / 8 - 1;
719*437bfbebSnyanmisaka regs->reg_base.src_fill.pic_wfill = MPP_ALIGN(prep->width, 16) - prep->width;
720*437bfbebSnyanmisaka regs->reg_base.enc_rsl.pic_hd8_m1 = MPP_ALIGN(prep->height, 16) / 8 - 1;
721*437bfbebSnyanmisaka regs->reg_base.src_fill.pic_hfill = MPP_ALIGN(prep->height, 16) - prep->height;
722*437bfbebSnyanmisaka
723*437bfbebSnyanmisaka regs->reg_ctl.dtrns_map.src_bus_edin = cfg.src_endian;
724*437bfbebSnyanmisaka
725*437bfbebSnyanmisaka regs->reg_base.src_fmt.src_cfmt = hw_fmt;
726*437bfbebSnyanmisaka regs->reg_base.src_fmt.alpha_swap = cfg.alpha_swap;
727*437bfbebSnyanmisaka regs->reg_base.src_fmt.rbuv_swap = cfg.rbuv_swap;
728*437bfbebSnyanmisaka regs->reg_base.src_fmt.out_fmt = (fmt == MPP_FMT_YUV400) ? 0 : 1;
729*437bfbebSnyanmisaka
730*437bfbebSnyanmisaka if (MPP_FRAME_FMT_IS_YUV(fmt))
731*437bfbebSnyanmisaka regs->reg_base.src_fmt.src_range = 1;
732*437bfbebSnyanmisaka else
733*437bfbebSnyanmisaka regs->reg_base.src_fmt.src_range = (prep->range == MPP_FRAME_RANGE_JPEG) ? 1 : 0;
734*437bfbebSnyanmisaka
735*437bfbebSnyanmisaka if (MPP_FRAME_FMT_IS_FBC(fmt)) {
736*437bfbebSnyanmisaka y_stride = mpp_frame_get_fbc_hdr_stride(task->frame);
737*437bfbebSnyanmisaka if (!y_stride)
738*437bfbebSnyanmisaka y_stride = MPP_ALIGN(prep->width, 16);
739*437bfbebSnyanmisaka } else if (prep->hor_stride) {
740*437bfbebSnyanmisaka y_stride = prep->hor_stride;
741*437bfbebSnyanmisaka } else {
742*437bfbebSnyanmisaka if (hw_fmt == VEPU5xx_FMT_BGRA8888 )
743*437bfbebSnyanmisaka y_stride = prep->width * 4;
744*437bfbebSnyanmisaka else if (hw_fmt == VEPU5xx_FMT_BGR888 )
745*437bfbebSnyanmisaka y_stride = prep->width * 3;
746*437bfbebSnyanmisaka else if (hw_fmt == VEPU5xx_FMT_BGR565 ||
747*437bfbebSnyanmisaka hw_fmt == VEPU5xx_FMT_YUYV422 ||
748*437bfbebSnyanmisaka hw_fmt == VEPU5xx_FMT_UYVY422)
749*437bfbebSnyanmisaka y_stride = prep->width * 2;
750*437bfbebSnyanmisaka else
751*437bfbebSnyanmisaka y_stride = prep->width;
752*437bfbebSnyanmisaka }
753*437bfbebSnyanmisaka
754*437bfbebSnyanmisaka switch (hw_fmt) {
755*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV444SP : {
756*437bfbebSnyanmisaka c_stride = y_stride * 2;
757*437bfbebSnyanmisaka } break;
758*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422SP :
759*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420SP :
760*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV444P : {
761*437bfbebSnyanmisaka c_stride = y_stride;
762*437bfbebSnyanmisaka } break;
763*437bfbebSnyanmisaka default : {
764*437bfbebSnyanmisaka c_stride = y_stride / 2;
765*437bfbebSnyanmisaka } break;
766*437bfbebSnyanmisaka }
767*437bfbebSnyanmisaka
768*437bfbebSnyanmisaka if (hw_fmt < VEPU5xx_FMT_ARGB1555) {
769*437bfbebSnyanmisaka const VepuRgb2YuvCfg *cfg_coeffs = get_rgb2yuv_cfg(prep->range, prep->color);
770*437bfbebSnyanmisaka
771*437bfbebSnyanmisaka hal_h264e_dbg_flow("input color range %d colorspace %d", prep->range, prep->color);
772*437bfbebSnyanmisaka
773*437bfbebSnyanmisaka regs->reg_base.src_udfy.csc_wgt_b2y = cfg_coeffs->_2y.b_coeff;
774*437bfbebSnyanmisaka regs->reg_base.src_udfy.csc_wgt_g2y = cfg_coeffs->_2y.g_coeff;
775*437bfbebSnyanmisaka regs->reg_base.src_udfy.csc_wgt_r2y = cfg_coeffs->_2y.r_coeff;
776*437bfbebSnyanmisaka
777*437bfbebSnyanmisaka regs->reg_base.src_udfu.csc_wgt_b2u = cfg_coeffs->_2u.b_coeff;
778*437bfbebSnyanmisaka regs->reg_base.src_udfu.csc_wgt_g2u = cfg_coeffs->_2u.g_coeff;
779*437bfbebSnyanmisaka regs->reg_base.src_udfu.csc_wgt_r2u = cfg_coeffs->_2u.r_coeff;
780*437bfbebSnyanmisaka
781*437bfbebSnyanmisaka regs->reg_base.src_udfv.csc_wgt_b2v = cfg_coeffs->_2v.b_coeff;
782*437bfbebSnyanmisaka regs->reg_base.src_udfv.csc_wgt_g2v = cfg_coeffs->_2v.g_coeff;
783*437bfbebSnyanmisaka regs->reg_base.src_udfv.csc_wgt_r2v = cfg_coeffs->_2v.r_coeff;
784*437bfbebSnyanmisaka
785*437bfbebSnyanmisaka regs->reg_base.src_udfo.csc_ofst_y = cfg_coeffs->_2y.offset;
786*437bfbebSnyanmisaka regs->reg_base.src_udfo.csc_ofst_u = cfg_coeffs->_2u.offset;
787*437bfbebSnyanmisaka regs->reg_base.src_udfo.csc_ofst_v = cfg_coeffs->_2v.offset;
788*437bfbebSnyanmisaka
789*437bfbebSnyanmisaka hal_h264e_dbg_flow("use color range %d colorspace %d", cfg_coeffs->dst_range, cfg_coeffs->color);
790*437bfbebSnyanmisaka } else {
791*437bfbebSnyanmisaka regs->reg_base.src_udfy.csc_wgt_b2y = cfg.weight[0];
792*437bfbebSnyanmisaka regs->reg_base.src_udfy.csc_wgt_g2y = cfg.weight[1];
793*437bfbebSnyanmisaka regs->reg_base.src_udfy.csc_wgt_r2y = cfg.weight[2];
794*437bfbebSnyanmisaka
795*437bfbebSnyanmisaka regs->reg_base.src_udfu.csc_wgt_b2u = cfg.weight[3];
796*437bfbebSnyanmisaka regs->reg_base.src_udfu.csc_wgt_g2u = cfg.weight[4];
797*437bfbebSnyanmisaka regs->reg_base.src_udfu.csc_wgt_r2u = cfg.weight[5];
798*437bfbebSnyanmisaka
799*437bfbebSnyanmisaka regs->reg_base.src_udfv.csc_wgt_b2v = cfg.weight[6];
800*437bfbebSnyanmisaka regs->reg_base.src_udfv.csc_wgt_g2v = cfg.weight[7];
801*437bfbebSnyanmisaka regs->reg_base.src_udfv.csc_wgt_r2v = cfg.weight[8];
802*437bfbebSnyanmisaka
803*437bfbebSnyanmisaka regs->reg_base.src_udfo.csc_ofst_y = cfg.offset[0];
804*437bfbebSnyanmisaka regs->reg_base.src_udfo.csc_ofst_u = cfg.offset[1];
805*437bfbebSnyanmisaka regs->reg_base.src_udfo.csc_ofst_v = cfg.offset[2];
806*437bfbebSnyanmisaka }
807*437bfbebSnyanmisaka
808*437bfbebSnyanmisaka regs->reg_base.src_proc.afbcd_en = MPP_FRAME_FMT_IS_FBC(fmt) ? 1 : 0;
809*437bfbebSnyanmisaka regs->reg_base.src_strd0.src_strd0 = y_stride;
810*437bfbebSnyanmisaka regs->reg_base.src_strd1.src_strd1 = c_stride;
811*437bfbebSnyanmisaka
812*437bfbebSnyanmisaka regs->reg_base.src_proc.src_mirr = prep->mirroring > 0;
813*437bfbebSnyanmisaka regs->reg_base.src_proc.src_rot = prep->rotation;
814*437bfbebSnyanmisaka regs->reg_base.src_proc.txa_en = 0;
815*437bfbebSnyanmisaka
816*437bfbebSnyanmisaka regs->reg_base.sli_cfg.sli_crs_en = 1;
817*437bfbebSnyanmisaka
818*437bfbebSnyanmisaka regs->reg_base.pic_ofst.pic_ofst_y = 0;
819*437bfbebSnyanmisaka regs->reg_base.pic_ofst.pic_ofst_x = 0;
820*437bfbebSnyanmisaka
821*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
822*437bfbebSnyanmisaka
823*437bfbebSnyanmisaka return ret;
824*437bfbebSnyanmisaka }
825*437bfbebSnyanmisaka
vepu580_h264e_save_pass1_patch(HalVepu580RegSet * regs,HalH264eVepu580Ctx * ctx)826*437bfbebSnyanmisaka static MPP_RET vepu580_h264e_save_pass1_patch(HalVepu580RegSet *regs, HalH264eVepu580Ctx *ctx)
827*437bfbebSnyanmisaka {
828*437bfbebSnyanmisaka RK_S32 width_align = MPP_ALIGN(ctx->cfg->prep.width, 64);
829*437bfbebSnyanmisaka RK_S32 height_align = MPP_ALIGN(ctx->cfg->prep.height, 16);
830*437bfbebSnyanmisaka
831*437bfbebSnyanmisaka if (NULL == ctx->buf_pass1) {
832*437bfbebSnyanmisaka mpp_buffer_get(NULL, &ctx->buf_pass1, width_align * height_align * 3 / 2);
833*437bfbebSnyanmisaka if (!ctx->buf_pass1) {
834*437bfbebSnyanmisaka mpp_err("buf_pass1 malloc fail, debreath invaild");
835*437bfbebSnyanmisaka return MPP_NOK;
836*437bfbebSnyanmisaka }
837*437bfbebSnyanmisaka }
838*437bfbebSnyanmisaka
839*437bfbebSnyanmisaka regs->reg_base.enc_pic.cur_frm_ref = 1;
840*437bfbebSnyanmisaka regs->reg_base.rfpw_h_addr = mpp_buffer_get_fd(ctx->buf_pass1);
841*437bfbebSnyanmisaka regs->reg_base.rfpw_b_addr = regs->reg_base.rfpw_h_addr;
842*437bfbebSnyanmisaka regs->reg_base.enc_pic.rec_fbc_dis = 1;
843*437bfbebSnyanmisaka
844*437bfbebSnyanmisaka mpp_dev_multi_offset_update(ctx->offsets, 164, width_align * height_align);
845*437bfbebSnyanmisaka
846*437bfbebSnyanmisaka /* NOTE: disable split to avoid lowdelay slice output */
847*437bfbebSnyanmisaka regs->reg_base.sli_splt.sli_splt = 0;
848*437bfbebSnyanmisaka regs->reg_base.enc_pic.slen_fifo = 0;
849*437bfbebSnyanmisaka
850*437bfbebSnyanmisaka return MPP_OK;
851*437bfbebSnyanmisaka }
852*437bfbebSnyanmisaka
vepu580_h264e_use_pass1_patch(HalVepu580RegSet * regs,HalH264eVepu580Ctx * ctx)853*437bfbebSnyanmisaka static MPP_RET vepu580_h264e_use_pass1_patch(HalVepu580RegSet *regs, HalH264eVepu580Ctx *ctx)
854*437bfbebSnyanmisaka {
855*437bfbebSnyanmisaka MppEncPrepCfg *prep = &ctx->cfg->prep;
856*437bfbebSnyanmisaka RK_S32 hor_stride = MPP_ALIGN(prep->width, 64);
857*437bfbebSnyanmisaka RK_S32 ver_stride = MPP_ALIGN(prep->height, 16);
858*437bfbebSnyanmisaka RK_S32 frame_size = hor_stride * ver_stride;
859*437bfbebSnyanmisaka RK_S32 fd_in = mpp_buffer_get_fd(ctx->buf_pass1);
860*437bfbebSnyanmisaka
861*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
862*437bfbebSnyanmisaka
863*437bfbebSnyanmisaka regs->reg_base.src_fmt.src_cfmt = VEPU5xx_FMT_YUV420SP;
864*437bfbebSnyanmisaka regs->reg_base.src_fmt.alpha_swap = 0;
865*437bfbebSnyanmisaka regs->reg_base.src_fmt.rbuv_swap = 0;
866*437bfbebSnyanmisaka regs->reg_base.src_fmt.out_fmt = 1;
867*437bfbebSnyanmisaka
868*437bfbebSnyanmisaka regs->reg_base.src_proc.afbcd_en = 0;
869*437bfbebSnyanmisaka regs->reg_base.src_strd0.src_strd0 = hor_stride;
870*437bfbebSnyanmisaka regs->reg_base.src_strd1.src_strd1 = hor_stride;
871*437bfbebSnyanmisaka
872*437bfbebSnyanmisaka regs->reg_base.src_proc.src_mirr = 0;
873*437bfbebSnyanmisaka regs->reg_base.src_proc.src_rot = 0;
874*437bfbebSnyanmisaka regs->reg_base.src_proc.txa_en = 0;
875*437bfbebSnyanmisaka
876*437bfbebSnyanmisaka regs->reg_base.pic_ofst.pic_ofst_y = 0;
877*437bfbebSnyanmisaka regs->reg_base.pic_ofst.pic_ofst_x = 0;
878*437bfbebSnyanmisaka
879*437bfbebSnyanmisaka
880*437bfbebSnyanmisaka regs->reg_base.adr_src0 = fd_in;
881*437bfbebSnyanmisaka regs->reg_base.adr_src1 = fd_in;
882*437bfbebSnyanmisaka regs->reg_base.adr_src2 = fd_in;
883*437bfbebSnyanmisaka
884*437bfbebSnyanmisaka mpp_dev_multi_offset_update(ctx->offsets, 161, frame_size);
885*437bfbebSnyanmisaka mpp_dev_multi_offset_update(ctx->offsets, 162, frame_size);
886*437bfbebSnyanmisaka
887*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
888*437bfbebSnyanmisaka return MPP_OK;
889*437bfbebSnyanmisaka }
890*437bfbebSnyanmisaka
setup_vepu580_codec(HalVepu580RegSet * regs,H264eSps * sps,H264ePps * pps,H264eSlice * slice)891*437bfbebSnyanmisaka static void setup_vepu580_codec(HalVepu580RegSet *regs, H264eSps *sps,
892*437bfbebSnyanmisaka H264ePps *pps, H264eSlice *slice)
893*437bfbebSnyanmisaka {
894*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
895*437bfbebSnyanmisaka
896*437bfbebSnyanmisaka regs->reg_base.enc_pic.enc_stnd = 0;
897*437bfbebSnyanmisaka regs->reg_base.enc_pic.cur_frm_ref = slice->nal_reference_idc > 0;
898*437bfbebSnyanmisaka regs->reg_base.enc_pic.bs_scp = 1;
899*437bfbebSnyanmisaka
900*437bfbebSnyanmisaka regs->reg_base.synt_nal.nal_ref_idc = slice->nal_reference_idc;
901*437bfbebSnyanmisaka regs->reg_base.synt_nal.nal_unit_type = slice->nalu_type;
902*437bfbebSnyanmisaka
903*437bfbebSnyanmisaka regs->reg_base.synt_sps.max_fnum = sps->log2_max_frame_num_minus4;
904*437bfbebSnyanmisaka regs->reg_base.synt_sps.drct_8x8 = sps->direct8x8_inference;
905*437bfbebSnyanmisaka regs->reg_base.synt_sps.mpoc_lm4 = sps->log2_max_poc_lsb_minus4;
906*437bfbebSnyanmisaka
907*437bfbebSnyanmisaka regs->reg_base.synt_pps.etpy_mode = pps->entropy_coding_mode;
908*437bfbebSnyanmisaka regs->reg_base.synt_pps.trns_8x8 = pps->transform_8x8_mode;
909*437bfbebSnyanmisaka regs->reg_base.synt_pps.csip_flag = pps->constrained_intra_pred;
910*437bfbebSnyanmisaka regs->reg_base.synt_pps.num_ref0_idx = pps->num_ref_idx_l0_default_active - 1;
911*437bfbebSnyanmisaka regs->reg_base.synt_pps.num_ref1_idx = pps->num_ref_idx_l1_default_active - 1;
912*437bfbebSnyanmisaka regs->reg_base.synt_pps.pic_init_qp = pps->pic_init_qp;
913*437bfbebSnyanmisaka regs->reg_base.synt_pps.cb_ofst = pps->chroma_qp_index_offset;
914*437bfbebSnyanmisaka regs->reg_base.synt_pps.cr_ofst = pps->second_chroma_qp_index_offset;
915*437bfbebSnyanmisaka regs->reg_base.synt_pps.wght_pred = pps->weighted_pred;
916*437bfbebSnyanmisaka regs->reg_base.synt_pps.dbf_cp_flg = pps->deblocking_filter_control;
917*437bfbebSnyanmisaka
918*437bfbebSnyanmisaka regs->reg_base.synt_sli0.sli_type = (slice->slice_type == H264_I_SLICE) ? (2) : (0);
919*437bfbebSnyanmisaka regs->reg_base.synt_sli0.pps_id = slice->pic_parameter_set_id;
920*437bfbebSnyanmisaka regs->reg_base.synt_sli0.drct_smvp = 0;
921*437bfbebSnyanmisaka regs->reg_base.synt_sli0.num_ref_ovrd = slice->num_ref_idx_override;
922*437bfbebSnyanmisaka regs->reg_base.synt_sli0.cbc_init_idc = slice->cabac_init_idc;
923*437bfbebSnyanmisaka regs->reg_base.synt_sli0.frm_num = slice->frame_num;
924*437bfbebSnyanmisaka
925*437bfbebSnyanmisaka regs->reg_base.synt_sli1.idr_pid = (slice->slice_type == H264_I_SLICE) ? slice->idr_pic_id : (RK_U32)(-1);
926*437bfbebSnyanmisaka regs->reg_base.synt_sli1.poc_lsb = slice->pic_order_cnt_lsb;
927*437bfbebSnyanmisaka
928*437bfbebSnyanmisaka
929*437bfbebSnyanmisaka regs->reg_base.synt_sli2.dis_dblk_idc = slice->disable_deblocking_filter_idc;
930*437bfbebSnyanmisaka regs->reg_base.synt_sli2.sli_alph_ofst = slice->slice_alpha_c0_offset_div2;
931*437bfbebSnyanmisaka
932*437bfbebSnyanmisaka h264e_reorder_rd_rewind(slice->reorder);
933*437bfbebSnyanmisaka { /* reorder process */
934*437bfbebSnyanmisaka H264eRplmo rplmo;
935*437bfbebSnyanmisaka MPP_RET ret = h264e_reorder_rd_op(slice->reorder, &rplmo);
936*437bfbebSnyanmisaka
937*437bfbebSnyanmisaka if (MPP_OK == ret) {
938*437bfbebSnyanmisaka regs->reg_base.synt_sli2.ref_list0_rodr = 1;
939*437bfbebSnyanmisaka regs->reg_base.synt_sli2.rodr_pic_idx = rplmo.modification_of_pic_nums_idc;
940*437bfbebSnyanmisaka
941*437bfbebSnyanmisaka switch (rplmo.modification_of_pic_nums_idc) {
942*437bfbebSnyanmisaka case 0 :
943*437bfbebSnyanmisaka case 1 : {
944*437bfbebSnyanmisaka regs->reg_base.synt_sli2.rodr_pic_num = rplmo.abs_diff_pic_num_minus1;
945*437bfbebSnyanmisaka } break;
946*437bfbebSnyanmisaka case 2 : {
947*437bfbebSnyanmisaka regs->reg_base.synt_sli2.rodr_pic_num = rplmo.long_term_pic_idx;
948*437bfbebSnyanmisaka } break;
949*437bfbebSnyanmisaka default : {
950*437bfbebSnyanmisaka mpp_err_f("invalid modification_of_pic_nums_idc %d\n",
951*437bfbebSnyanmisaka rplmo.modification_of_pic_nums_idc);
952*437bfbebSnyanmisaka } break;
953*437bfbebSnyanmisaka }
954*437bfbebSnyanmisaka } else {
955*437bfbebSnyanmisaka // slice->ref_pic_list_modification_flag;
956*437bfbebSnyanmisaka regs->reg_base.synt_sli2.ref_list0_rodr = 0;
957*437bfbebSnyanmisaka regs->reg_base.synt_sli2.rodr_pic_idx = 0;
958*437bfbebSnyanmisaka regs->reg_base.synt_sli2.rodr_pic_num = 0;
959*437bfbebSnyanmisaka }
960*437bfbebSnyanmisaka }
961*437bfbebSnyanmisaka
962*437bfbebSnyanmisaka /* clear all mmco arg first */
963*437bfbebSnyanmisaka regs->reg_base.synt_refm0.nopp_flg = 0;
964*437bfbebSnyanmisaka regs->reg_base.synt_refm0.ltrf_flg = 0;
965*437bfbebSnyanmisaka regs->reg_base.synt_refm0.arpm_flg = 0;
966*437bfbebSnyanmisaka regs->reg_base.synt_refm0.mmco4_pre = 0;
967*437bfbebSnyanmisaka regs->reg_base.synt_refm0.mmco_type0 = 0;
968*437bfbebSnyanmisaka regs->reg_base.synt_refm0.mmco_parm0 = 0;
969*437bfbebSnyanmisaka regs->reg_base.synt_refm0.mmco_type1 = 0;
970*437bfbebSnyanmisaka regs->reg_base.synt_refm1.mmco_parm1 = 0;
971*437bfbebSnyanmisaka regs->reg_base.synt_refm0.mmco_type2 = 0;
972*437bfbebSnyanmisaka regs->reg_base.synt_refm1.mmco_parm2 = 0;
973*437bfbebSnyanmisaka regs->reg_base.synt_refm2.long_term_frame_idx0 = 0;
974*437bfbebSnyanmisaka regs->reg_base.synt_refm2.long_term_frame_idx1 = 0;
975*437bfbebSnyanmisaka regs->reg_base.synt_refm2.long_term_frame_idx2 = 0;
976*437bfbebSnyanmisaka
977*437bfbebSnyanmisaka h264e_marking_rd_rewind(slice->marking);
978*437bfbebSnyanmisaka
979*437bfbebSnyanmisaka /* only update used parameter */
980*437bfbebSnyanmisaka if (slice->slice_type == H264_I_SLICE) {
981*437bfbebSnyanmisaka regs->reg_base.synt_refm0.nopp_flg = slice->no_output_of_prior_pics;
982*437bfbebSnyanmisaka regs->reg_base.synt_refm0.ltrf_flg = slice->long_term_reference_flag;
983*437bfbebSnyanmisaka } else {
984*437bfbebSnyanmisaka if (!h264e_marking_is_empty(slice->marking)) {
985*437bfbebSnyanmisaka H264eMmco mmco;
986*437bfbebSnyanmisaka
987*437bfbebSnyanmisaka regs->reg_base.synt_refm0.arpm_flg = 1;
988*437bfbebSnyanmisaka
989*437bfbebSnyanmisaka /* max 3 mmco */
990*437bfbebSnyanmisaka do {
991*437bfbebSnyanmisaka RK_S32 type = 0;
992*437bfbebSnyanmisaka RK_S32 param_0 = 0;
993*437bfbebSnyanmisaka RK_S32 param_1 = 0;
994*437bfbebSnyanmisaka
995*437bfbebSnyanmisaka h264e_marking_rd_op(slice->marking, &mmco);
996*437bfbebSnyanmisaka type = mmco.mmco;
997*437bfbebSnyanmisaka switch (type) {
998*437bfbebSnyanmisaka case 1 : {
999*437bfbebSnyanmisaka param_0 = mmco.difference_of_pic_nums_minus1;
1000*437bfbebSnyanmisaka } break;
1001*437bfbebSnyanmisaka case 2 : {
1002*437bfbebSnyanmisaka param_0 = mmco.long_term_pic_num;
1003*437bfbebSnyanmisaka } break;
1004*437bfbebSnyanmisaka case 3 : {
1005*437bfbebSnyanmisaka param_0 = mmco.difference_of_pic_nums_minus1;
1006*437bfbebSnyanmisaka param_1 = mmco.long_term_frame_idx;
1007*437bfbebSnyanmisaka } break;
1008*437bfbebSnyanmisaka case 4 : {
1009*437bfbebSnyanmisaka param_0 = mmco.max_long_term_frame_idx_plus1;
1010*437bfbebSnyanmisaka } break;
1011*437bfbebSnyanmisaka case 5 : {
1012*437bfbebSnyanmisaka } break;
1013*437bfbebSnyanmisaka case 6 : {
1014*437bfbebSnyanmisaka param_0 = mmco.long_term_frame_idx;
1015*437bfbebSnyanmisaka } break;
1016*437bfbebSnyanmisaka default : {
1017*437bfbebSnyanmisaka mpp_err_f("unsupported mmco 0 %d\n", type);
1018*437bfbebSnyanmisaka type = 0;
1019*437bfbebSnyanmisaka } break;
1020*437bfbebSnyanmisaka }
1021*437bfbebSnyanmisaka
1022*437bfbebSnyanmisaka regs->reg_base.synt_refm0.mmco_type0 = type;
1023*437bfbebSnyanmisaka regs->reg_base.synt_refm0.mmco_parm0 = param_0;
1024*437bfbebSnyanmisaka regs->reg_base.synt_refm2.long_term_frame_idx0 = param_1;
1025*437bfbebSnyanmisaka
1026*437bfbebSnyanmisaka if (h264e_marking_is_empty(slice->marking))
1027*437bfbebSnyanmisaka break;
1028*437bfbebSnyanmisaka
1029*437bfbebSnyanmisaka h264e_marking_rd_op(slice->marking, &mmco);
1030*437bfbebSnyanmisaka type = mmco.mmco;
1031*437bfbebSnyanmisaka param_0 = 0;
1032*437bfbebSnyanmisaka param_1 = 0;
1033*437bfbebSnyanmisaka switch (type) {
1034*437bfbebSnyanmisaka case 1 : {
1035*437bfbebSnyanmisaka param_0 = mmco.difference_of_pic_nums_minus1;
1036*437bfbebSnyanmisaka } break;
1037*437bfbebSnyanmisaka case 2 : {
1038*437bfbebSnyanmisaka param_0 = mmco.long_term_pic_num;
1039*437bfbebSnyanmisaka } break;
1040*437bfbebSnyanmisaka case 3 : {
1041*437bfbebSnyanmisaka param_0 = mmco.difference_of_pic_nums_minus1;
1042*437bfbebSnyanmisaka param_1 = mmco.long_term_frame_idx;
1043*437bfbebSnyanmisaka } break;
1044*437bfbebSnyanmisaka case 4 : {
1045*437bfbebSnyanmisaka param_0 = mmco.max_long_term_frame_idx_plus1;
1046*437bfbebSnyanmisaka } break;
1047*437bfbebSnyanmisaka case 5 : {
1048*437bfbebSnyanmisaka } break;
1049*437bfbebSnyanmisaka case 6 : {
1050*437bfbebSnyanmisaka param_0 = mmco.long_term_frame_idx;
1051*437bfbebSnyanmisaka } break;
1052*437bfbebSnyanmisaka default : {
1053*437bfbebSnyanmisaka mpp_err_f("unsupported mmco 0 %d\n", type);
1054*437bfbebSnyanmisaka type = 0;
1055*437bfbebSnyanmisaka } break;
1056*437bfbebSnyanmisaka }
1057*437bfbebSnyanmisaka
1058*437bfbebSnyanmisaka regs->reg_base.synt_refm0.mmco_type1 = type;
1059*437bfbebSnyanmisaka regs->reg_base.synt_refm1.mmco_parm1 = param_0;
1060*437bfbebSnyanmisaka regs->reg_base.synt_refm2.long_term_frame_idx1 = param_1;
1061*437bfbebSnyanmisaka
1062*437bfbebSnyanmisaka if (h264e_marking_is_empty(slice->marking))
1063*437bfbebSnyanmisaka break;
1064*437bfbebSnyanmisaka
1065*437bfbebSnyanmisaka h264e_marking_rd_op(slice->marking, &mmco);
1066*437bfbebSnyanmisaka type = mmco.mmco;
1067*437bfbebSnyanmisaka param_0 = 0;
1068*437bfbebSnyanmisaka param_1 = 0;
1069*437bfbebSnyanmisaka switch (type) {
1070*437bfbebSnyanmisaka case 1 : {
1071*437bfbebSnyanmisaka param_0 = mmco.difference_of_pic_nums_minus1;
1072*437bfbebSnyanmisaka } break;
1073*437bfbebSnyanmisaka case 2 : {
1074*437bfbebSnyanmisaka param_0 = mmco.long_term_pic_num;
1075*437bfbebSnyanmisaka } break;
1076*437bfbebSnyanmisaka case 3 : {
1077*437bfbebSnyanmisaka param_0 = mmco.difference_of_pic_nums_minus1;
1078*437bfbebSnyanmisaka param_1 = mmco.long_term_frame_idx;
1079*437bfbebSnyanmisaka } break;
1080*437bfbebSnyanmisaka case 4 : {
1081*437bfbebSnyanmisaka param_0 = mmco.max_long_term_frame_idx_plus1;
1082*437bfbebSnyanmisaka } break;
1083*437bfbebSnyanmisaka case 5 : {
1084*437bfbebSnyanmisaka } break;
1085*437bfbebSnyanmisaka case 6 : {
1086*437bfbebSnyanmisaka param_0 = mmco.long_term_frame_idx;
1087*437bfbebSnyanmisaka } break;
1088*437bfbebSnyanmisaka default : {
1089*437bfbebSnyanmisaka mpp_err_f("unsupported mmco 0 %d\n", type);
1090*437bfbebSnyanmisaka type = 0;
1091*437bfbebSnyanmisaka } break;
1092*437bfbebSnyanmisaka }
1093*437bfbebSnyanmisaka
1094*437bfbebSnyanmisaka regs->reg_base.synt_refm0.mmco_type2 = type;
1095*437bfbebSnyanmisaka regs->reg_base.synt_refm1.mmco_parm2 = param_0;
1096*437bfbebSnyanmisaka regs->reg_base.synt_refm2.long_term_frame_idx2 = param_1;
1097*437bfbebSnyanmisaka } while (0);
1098*437bfbebSnyanmisaka }
1099*437bfbebSnyanmisaka }
1100*437bfbebSnyanmisaka
1101*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
1102*437bfbebSnyanmisaka }
1103*437bfbebSnyanmisaka
setup_vepu580_rdo_pred(HalVepu580RegSet * regs,H264eSps * sps,H264ePps * pps,H264eSlice * slice)1104*437bfbebSnyanmisaka static void setup_vepu580_rdo_pred(HalVepu580RegSet *regs, H264eSps *sps,
1105*437bfbebSnyanmisaka H264ePps *pps, H264eSlice *slice)
1106*437bfbebSnyanmisaka {
1107*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1108*437bfbebSnyanmisaka
1109*437bfbebSnyanmisaka if (slice->slice_type == H264_I_SLICE) {
1110*437bfbebSnyanmisaka regs->reg_rc_klut.klut_ofst.chrm_klut_ofst = 0;
1111*437bfbebSnyanmisaka memcpy(®s->reg_rc_klut.klut_wgt0, &h264e_klut_weight[0], CHROMA_KLUT_TAB_SIZE);
1112*437bfbebSnyanmisaka } else {
1113*437bfbebSnyanmisaka regs->reg_rc_klut.klut_ofst.chrm_klut_ofst = 3;
1114*437bfbebSnyanmisaka memcpy(®s->reg_rc_klut.klut_wgt0, &h264e_klut_weight[4], CHROMA_KLUT_TAB_SIZE);
1115*437bfbebSnyanmisaka }
1116*437bfbebSnyanmisaka
1117*437bfbebSnyanmisaka regs->reg_base.iprd_csts.vthd_y = 9;
1118*437bfbebSnyanmisaka regs->reg_base.iprd_csts.vthd_c = 63;
1119*437bfbebSnyanmisaka
1120*437bfbebSnyanmisaka regs->reg_base.rdo_cfg.rect_size = (sps->profile_idc == H264_PROFILE_BASELINE &&
1121*437bfbebSnyanmisaka sps->level_idc <= H264_LEVEL_3_0) ? 1 : 0;
1122*437bfbebSnyanmisaka regs->reg_base.rdo_cfg.inter_4x4 = 1;
1123*437bfbebSnyanmisaka regs->reg_base.rdo_cfg.vlc_lmt = (sps->profile_idc < H264_PROFILE_MAIN) &&
1124*437bfbebSnyanmisaka !pps->entropy_coding_mode;
1125*437bfbebSnyanmisaka regs->reg_base.rdo_cfg.chrm_spcl = 1;
1126*437bfbebSnyanmisaka regs->reg_base.rdo_cfg.rdo_mask = 0;
1127*437bfbebSnyanmisaka regs->reg_base.rdo_cfg.ccwa_e = 1;
1128*437bfbebSnyanmisaka regs->reg_base.rdo_cfg.scl_lst_sel = pps->pic_scaling_matrix_present;
1129*437bfbebSnyanmisaka regs->reg_base.rdo_cfg.atr_e = 1;
1130*437bfbebSnyanmisaka regs->reg_base.rdo_cfg.atf_intra_e = 1;
1131*437bfbebSnyanmisaka
1132*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
1133*437bfbebSnyanmisaka }
1134*437bfbebSnyanmisaka
setup_vepu580_rdo_bias_cfg(Vepu580RdoCfg * regs,MppEncHwCfg * hw)1135*437bfbebSnyanmisaka static void setup_vepu580_rdo_bias_cfg(Vepu580RdoCfg *regs, MppEncHwCfg *hw)
1136*437bfbebSnyanmisaka {
1137*437bfbebSnyanmisaka RK_U8 bias = h264_mode_bias[hw->mode_bias[1]];
1138*437bfbebSnyanmisaka
1139*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt0.atf_rdo_intra_wgt00 = bias > 24 ? bias : 24;
1140*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt0.atf_rdo_intra_wgt01 = bias > 22 ? bias : 22;
1141*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt0.atf_rdo_intra_wgt02 = bias > 21 ? bias : 21;
1142*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt1.atf_rdo_intra_wgt10 = bias > 22 ? bias : 22;
1143*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt1.atf_rdo_intra_wgt11 = bias > 21 ? bias : 21;
1144*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt1.atf_rdo_intra_wgt12 = bias > 20 ? bias : 20;
1145*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt2.atf_rdo_intra_wgt20 = bias > 20 ? bias : 20;
1146*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt2.atf_rdo_intra_wgt21 = bias > 19 ? bias : 19;
1147*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt2.atf_rdo_intra_wgt22 = bias > 18 ? bias : 18;
1148*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt3.atf_rdo_intra_wgt30 = bias;
1149*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt3.atf_rdo_intra_wgt31 = bias;
1150*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt3.atf_rdo_intra_wgt32 = bias;
1151*437bfbebSnyanmisaka
1152*437bfbebSnyanmisaka if (hw->skip_bias_en) {
1153*437bfbebSnyanmisaka bias = hw->skip_bias;
1154*437bfbebSnyanmisaka
1155*437bfbebSnyanmisaka regs->rdo_skip_cime_thd0.atf_rdo_skip_cime_thd0 = hw->skip_sad < 10 ? hw->skip_sad : 10;
1156*437bfbebSnyanmisaka regs->rdo_skip_cime_thd0.atf_rdo_skip_cime_thd1 = hw->skip_sad < 8 ? hw->skip_sad : 8;
1157*437bfbebSnyanmisaka regs->rdo_skip_cime_thd1.atf_rdo_skip_cime_thd2 = hw->skip_sad < 15 ? hw->skip_sad : 15;
1158*437bfbebSnyanmisaka regs->rdo_skip_cime_thd1.atf_rdo_skip_cime_thd3 = hw->skip_sad;
1159*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt0.atf_rdo_skip_atf_wgt00 = bias > 20 ? bias : 20;
1160*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt0.atf_rdo_skip_atf_wgt10 = bias;
1161*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt0.atf_rdo_skip_atf_wgt11 = bias;
1162*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt0.atf_rdo_skip_atf_wgt12 = bias;
1163*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt1.atf_rdo_skip_atf_wgt20 = bias;
1164*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt1.atf_rdo_skip_atf_wgt21 = bias;
1165*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt1.atf_rdo_skip_atf_wgt22 = bias;
1166*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt2.atf_rdo_skip_atf_wgt30 = bias;
1167*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt2.atf_rdo_skip_atf_wgt31 = bias;
1168*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt2.atf_rdo_skip_atf_wgt32 = bias;
1169*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt3.atf_rdo_skip_atf_wgt40 = bias;
1170*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt3.atf_rdo_skip_atf_wgt41 = bias;
1171*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt3.atf_rdo_skip_atf_wgt42 = bias;
1172*437bfbebSnyanmisaka }
1173*437bfbebSnyanmisaka }
1174*437bfbebSnyanmisaka
setup_vepu580_rdo_cfg(Vepu580RdoCfg * regs)1175*437bfbebSnyanmisaka static void setup_vepu580_rdo_cfg(Vepu580RdoCfg *regs)
1176*437bfbebSnyanmisaka {
1177*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1178*437bfbebSnyanmisaka
1179*437bfbebSnyanmisaka /* 0x2000 */
1180*437bfbebSnyanmisaka regs->rdo_sqi_cfg.atf_pskip_en = 1;
1181*437bfbebSnyanmisaka
1182*437bfbebSnyanmisaka /* 0x20CC ~ 0x20D0 */
1183*437bfbebSnyanmisaka regs->rdo_intra_cime_thd0.atf_rdo_intra_cime_thd0 = 28;
1184*437bfbebSnyanmisaka regs->rdo_intra_cime_thd0.atf_rdo_intra_cime_thd1 = 44;
1185*437bfbebSnyanmisaka regs->rdo_intra_cime_thd1.atf_rdo_intra_cime_thd2 = 72;
1186*437bfbebSnyanmisaka
1187*437bfbebSnyanmisaka /* 0x20D4 ~ 0x20E0 */
1188*437bfbebSnyanmisaka regs->rdo_intra_var_thd0.atf_rdo_intra_var_thd00 = 25;
1189*437bfbebSnyanmisaka regs->rdo_intra_var_thd0.atf_rdo_intra_var_thd01 = 64;
1190*437bfbebSnyanmisaka regs->rdo_intra_var_thd1.atf_rdo_intra_var_thd10 = 25;
1191*437bfbebSnyanmisaka regs->rdo_intra_var_thd1.atf_rdo_intra_var_thd11 = 64;
1192*437bfbebSnyanmisaka regs->rdo_intra_var_thd2.atf_rdo_intra_var_thd20 = 70;
1193*437bfbebSnyanmisaka regs->rdo_intra_var_thd2.atf_rdo_intra_var_thd21 = 100;
1194*437bfbebSnyanmisaka regs->rdo_intra_var_thd3.atf_rdo_intra_var_thd30 = 70;
1195*437bfbebSnyanmisaka regs->rdo_intra_var_thd3.atf_rdo_intra_var_thd31 = 100;
1196*437bfbebSnyanmisaka
1197*437bfbebSnyanmisaka /* 0x20E4 ~ 0x20F0 */
1198*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt0.atf_rdo_intra_wgt00 = 24;
1199*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt0.atf_rdo_intra_wgt01 = 22;
1200*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt0.atf_rdo_intra_wgt02 = 21;
1201*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt1.atf_rdo_intra_wgt10 = 22;
1202*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt1.atf_rdo_intra_wgt11 = 21;
1203*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt1.atf_rdo_intra_wgt12 = 20;
1204*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt2.atf_rdo_intra_wgt20 = 20;
1205*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt2.atf_rdo_intra_wgt21 = 19;
1206*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt2.atf_rdo_intra_wgt22 = 18;
1207*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt3.atf_rdo_intra_wgt30 = 16;
1208*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt3.atf_rdo_intra_wgt31 = 16;
1209*437bfbebSnyanmisaka regs->rdo_intra_atf_wgt3.atf_rdo_intra_wgt32 = 16;
1210*437bfbebSnyanmisaka
1211*437bfbebSnyanmisaka /* 0x211C ~ 0x2130 */
1212*437bfbebSnyanmisaka regs->rdo_skip_cime_thd0.atf_rdo_skip_cime_thd0 = 10;
1213*437bfbebSnyanmisaka regs->rdo_skip_cime_thd0.atf_rdo_skip_cime_thd1 = 8;
1214*437bfbebSnyanmisaka regs->rdo_skip_cime_thd1.atf_rdo_skip_cime_thd2 = 15;
1215*437bfbebSnyanmisaka regs->rdo_skip_cime_thd1.atf_rdo_skip_cime_thd3 = 25;
1216*437bfbebSnyanmisaka regs->rdo_skip_var_thd0.atf_rdo_skip_var_thd10 = 25;
1217*437bfbebSnyanmisaka regs->rdo_skip_var_thd0.atf_rdo_skip_var_thd11 = 40;
1218*437bfbebSnyanmisaka regs->rdo_skip_var_thd1.atf_rdo_skip_var_thd20 = 25;
1219*437bfbebSnyanmisaka regs->rdo_skip_var_thd1.atf_rdo_skip_var_thd21 = 40;
1220*437bfbebSnyanmisaka regs->rdo_skip_var_thd2.atf_rdo_skip_var_thd30 = 70;
1221*437bfbebSnyanmisaka regs->rdo_skip_var_thd2.atf_rdo_skip_var_thd31 = 100;
1222*437bfbebSnyanmisaka regs->rdo_skip_var_thd3.atf_rdo_skip_var_thd40 = 70;
1223*437bfbebSnyanmisaka regs->rdo_skip_var_thd3.atf_rdo_skip_var_thd41 = 100;
1224*437bfbebSnyanmisaka
1225*437bfbebSnyanmisaka /* 0x2134 ~ 0x2140 */
1226*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt0.atf_rdo_skip_atf_wgt00 = 20;
1227*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt0.atf_rdo_skip_atf_wgt10 = 16;
1228*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt0.atf_rdo_skip_atf_wgt11 = 16;
1229*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt0.atf_rdo_skip_atf_wgt12 = 16;
1230*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt1.atf_rdo_skip_atf_wgt20 = 16;
1231*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt1.atf_rdo_skip_atf_wgt21 = 16;
1232*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt1.atf_rdo_skip_atf_wgt22 = 16;
1233*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt2.atf_rdo_skip_atf_wgt30 = 16;
1234*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt2.atf_rdo_skip_atf_wgt31 = 16;
1235*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt2.atf_rdo_skip_atf_wgt32 = 16;
1236*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt3.atf_rdo_skip_atf_wgt40 = 16;
1237*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt3.atf_rdo_skip_atf_wgt41 = 16;
1238*437bfbebSnyanmisaka regs->rdo_skip_atf_wgt3.atf_rdo_skip_atf_wgt42 = 16;
1239*437bfbebSnyanmisaka
1240*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
1241*437bfbebSnyanmisaka }
1242*437bfbebSnyanmisaka
setup_vepu580_rc_base(HalVepu580RegSet * regs,HalH264eVepu580Ctx * ctx,EncRcTask * rc_task)1243*437bfbebSnyanmisaka static void setup_vepu580_rc_base(HalVepu580RegSet *regs, HalH264eVepu580Ctx *ctx, EncRcTask *rc_task)
1244*437bfbebSnyanmisaka {
1245*437bfbebSnyanmisaka EncRcTaskInfo *rc_info = &rc_task->info;
1246*437bfbebSnyanmisaka H264eSlice *slice = ctx->slice;
1247*437bfbebSnyanmisaka MppEncCfgSet *cfg = ctx->cfg;
1248*437bfbebSnyanmisaka MppEncHwCfg *hw = &cfg->hw;
1249*437bfbebSnyanmisaka H264eSps *sps = ctx->sps;
1250*437bfbebSnyanmisaka MppEncRcCfg *rc = &cfg->rc;
1251*437bfbebSnyanmisaka RK_S32 mb_w = sps->pic_width_in_mbs;
1252*437bfbebSnyanmisaka RK_S32 mb_h = sps->pic_height_in_mbs;
1253*437bfbebSnyanmisaka RK_U32 qp_target = rc_info->quality_target;
1254*437bfbebSnyanmisaka RK_U32 qp_min = rc_info->quality_min;
1255*437bfbebSnyanmisaka RK_U32 qp_max = rc_info->quality_max;
1256*437bfbebSnyanmisaka RK_U32 qpmap_mode = 1;
1257*437bfbebSnyanmisaka RK_S32 mb_target_bits_mul_16 = (rc_info->bit_target << 4) / (mb_w * mb_h);
1258*437bfbebSnyanmisaka RK_S32 mb_target_bits;
1259*437bfbebSnyanmisaka RK_S32 negative_bits_thd;
1260*437bfbebSnyanmisaka RK_S32 positive_bits_thd;
1261*437bfbebSnyanmisaka
1262*437bfbebSnyanmisaka hal_h264e_dbg_rc("bittarget %d qp [%d %d %d]\n", rc_info->bit_target,
1263*437bfbebSnyanmisaka qp_min, qp_target, qp_max);
1264*437bfbebSnyanmisaka
1265*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1266*437bfbebSnyanmisaka
1267*437bfbebSnyanmisaka regs->reg_rc_klut.roi_qthd0.qpmin_area0 = qp_min;
1268*437bfbebSnyanmisaka regs->reg_rc_klut.roi_qthd0.qpmax_area0 = qp_max;
1269*437bfbebSnyanmisaka regs->reg_rc_klut.roi_qthd0.qpmin_area1 = qp_min;
1270*437bfbebSnyanmisaka regs->reg_rc_klut.roi_qthd0.qpmax_area1 = qp_max;
1271*437bfbebSnyanmisaka regs->reg_rc_klut.roi_qthd0.qpmin_area2 = qp_min;
1272*437bfbebSnyanmisaka
1273*437bfbebSnyanmisaka regs->reg_rc_klut.roi_qthd1.qpmax_area2 = qp_max;
1274*437bfbebSnyanmisaka regs->reg_rc_klut.roi_qthd1.qpmin_area3 = qp_min;
1275*437bfbebSnyanmisaka regs->reg_rc_klut.roi_qthd1.qpmax_area3 = qp_max;
1276*437bfbebSnyanmisaka regs->reg_rc_klut.roi_qthd1.qpmin_area4 = qp_min;
1277*437bfbebSnyanmisaka regs->reg_rc_klut.roi_qthd1.qpmax_area4 = qp_max;
1278*437bfbebSnyanmisaka
1279*437bfbebSnyanmisaka regs->reg_rc_klut.roi_qthd2.qpmin_area5 = qp_min;
1280*437bfbebSnyanmisaka regs->reg_rc_klut.roi_qthd2.qpmax_area5 = qp_max;
1281*437bfbebSnyanmisaka regs->reg_rc_klut.roi_qthd2.qpmin_area6 = qp_min;
1282*437bfbebSnyanmisaka regs->reg_rc_klut.roi_qthd2.qpmax_area6 = qp_max;
1283*437bfbebSnyanmisaka regs->reg_rc_klut.roi_qthd2.qpmin_area7 = qp_min;
1284*437bfbebSnyanmisaka
1285*437bfbebSnyanmisaka regs->reg_rc_klut.roi_qthd3.qpmax_area7 = qp_max;
1286*437bfbebSnyanmisaka regs->reg_rc_klut.roi_qthd3.qpmap_mode = qpmap_mode;
1287*437bfbebSnyanmisaka
1288*437bfbebSnyanmisaka if (rc->rc_mode == MPP_ENC_RC_MODE_FIXQP) {
1289*437bfbebSnyanmisaka regs->reg_base.enc_pic.pic_qp = qp_target;
1290*437bfbebSnyanmisaka regs->reg_base.rc_qp.rc_max_qp = qp_target;
1291*437bfbebSnyanmisaka regs->reg_base.rc_qp.rc_min_qp = qp_target;
1292*437bfbebSnyanmisaka
1293*437bfbebSnyanmisaka return;
1294*437bfbebSnyanmisaka }
1295*437bfbebSnyanmisaka
1296*437bfbebSnyanmisaka if (mb_target_bits_mul_16 >= 0x100000)
1297*437bfbebSnyanmisaka mb_target_bits_mul_16 = 0x50000;
1298*437bfbebSnyanmisaka
1299*437bfbebSnyanmisaka mb_target_bits = (mb_target_bits_mul_16 * mb_w) >> 4;
1300*437bfbebSnyanmisaka negative_bits_thd = 0 - 5 * mb_target_bits / 16;
1301*437bfbebSnyanmisaka positive_bits_thd = 5 * mb_target_bits / 16;
1302*437bfbebSnyanmisaka
1303*437bfbebSnyanmisaka regs->reg_base.enc_pic.pic_qp = qp_target;
1304*437bfbebSnyanmisaka regs->reg_base.rc_cfg.rc_en = 1;
1305*437bfbebSnyanmisaka regs->reg_base.rc_cfg.aq_en = 1;
1306*437bfbebSnyanmisaka regs->reg_base.rc_cfg.aq_mode = 0;
1307*437bfbebSnyanmisaka regs->reg_base.rc_cfg.rc_ctu_num = mb_w;
1308*437bfbebSnyanmisaka regs->reg_base.rc_qp.rc_qp_range = (slice->slice_type == H264_I_SLICE) ?
1309*437bfbebSnyanmisaka hw->qp_delta_row_i : hw->qp_delta_row;
1310*437bfbebSnyanmisaka regs->reg_base.rc_qp.rc_max_qp = qp_max;
1311*437bfbebSnyanmisaka regs->reg_base.rc_qp.rc_min_qp = qp_min;
1312*437bfbebSnyanmisaka regs->reg_base.rc_tgt.ctu_ebit = mb_target_bits_mul_16;
1313*437bfbebSnyanmisaka
1314*437bfbebSnyanmisaka regs->reg_rc_klut.rc_adj0.qp_adj0 = -2;
1315*437bfbebSnyanmisaka regs->reg_rc_klut.rc_adj0.qp_adj1 = -1;
1316*437bfbebSnyanmisaka regs->reg_rc_klut.rc_adj0.qp_adj2 = 0;
1317*437bfbebSnyanmisaka regs->reg_rc_klut.rc_adj0.qp_adj3 = 1;
1318*437bfbebSnyanmisaka regs->reg_rc_klut.rc_adj0.qp_adj4 = 2;
1319*437bfbebSnyanmisaka regs->reg_rc_klut.rc_adj1.qp_adj5 = 0;
1320*437bfbebSnyanmisaka regs->reg_rc_klut.rc_adj1.qp_adj6 = 0;
1321*437bfbebSnyanmisaka regs->reg_rc_klut.rc_adj1.qp_adj7 = 0;
1322*437bfbebSnyanmisaka regs->reg_rc_klut.rc_adj1.qp_adj8 = 1;
1323*437bfbebSnyanmisaka
1324*437bfbebSnyanmisaka regs->reg_rc_klut.rc_dthd_0_8[0] = 4 * negative_bits_thd;
1325*437bfbebSnyanmisaka regs->reg_rc_klut.rc_dthd_0_8[1] = negative_bits_thd;
1326*437bfbebSnyanmisaka regs->reg_rc_klut.rc_dthd_0_8[2] = positive_bits_thd;
1327*437bfbebSnyanmisaka regs->reg_rc_klut.rc_dthd_0_8[3] = 4 * positive_bits_thd;
1328*437bfbebSnyanmisaka regs->reg_rc_klut.rc_dthd_0_8[4] = 0x7FFFFFFF;
1329*437bfbebSnyanmisaka regs->reg_rc_klut.rc_dthd_0_8[5] = 0x7FFFFFFF;
1330*437bfbebSnyanmisaka regs->reg_rc_klut.rc_dthd_0_8[6] = 0x7FFFFFFF;
1331*437bfbebSnyanmisaka regs->reg_rc_klut.rc_dthd_0_8[7] = 0x7FFFFFFF;
1332*437bfbebSnyanmisaka regs->reg_rc_klut.rc_dthd_0_8[8] = 0x7FFFFFFF;
1333*437bfbebSnyanmisaka
1334*437bfbebSnyanmisaka {
1335*437bfbebSnyanmisaka /* 0x1070 ~ 0x1074 */
1336*437bfbebSnyanmisaka regs->reg_rc_klut.md_sad_thd.md_sad_thd0 = 4;
1337*437bfbebSnyanmisaka regs->reg_rc_klut.md_sad_thd.md_sad_thd1 = 9;
1338*437bfbebSnyanmisaka regs->reg_rc_klut.md_sad_thd.md_sad_thd2 = 15;
1339*437bfbebSnyanmisaka
1340*437bfbebSnyanmisaka regs->reg_rc_klut.madi_thd.madi_thd0 = 4;
1341*437bfbebSnyanmisaka regs->reg_rc_klut.madi_thd.madi_thd1 = 9;
1342*437bfbebSnyanmisaka regs->reg_rc_klut.madi_thd.madi_thd2 = 15;
1343*437bfbebSnyanmisaka }
1344*437bfbebSnyanmisaka
1345*437bfbebSnyanmisaka if (cfg->rc.rc_mode == MPP_ENC_RC_MODE_SMTRC) {
1346*437bfbebSnyanmisaka regs->reg_base.rc_qp.rc_qp_range = 0;
1347*437bfbebSnyanmisaka }
1348*437bfbebSnyanmisaka
1349*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
1350*437bfbebSnyanmisaka }
1351*437bfbebSnyanmisaka
setup_vepu580_io_buf(HalVepu580RegSet * regs,MppDevRegOffCfgs * offsets,HalEncTask * task)1352*437bfbebSnyanmisaka static void setup_vepu580_io_buf(HalVepu580RegSet *regs, MppDevRegOffCfgs *offsets,
1353*437bfbebSnyanmisaka HalEncTask *task)
1354*437bfbebSnyanmisaka {
1355*437bfbebSnyanmisaka MppFrame frm = task->frame;
1356*437bfbebSnyanmisaka MppPacket pkt = task->packet;
1357*437bfbebSnyanmisaka MppBuffer buf_in = mpp_frame_get_buffer(frm);
1358*437bfbebSnyanmisaka MppBuffer buf_out = task->output;
1359*437bfbebSnyanmisaka MppFrameFormat fmt = mpp_frame_get_fmt(frm);
1360*437bfbebSnyanmisaka RK_S32 hor_stride = mpp_frame_get_hor_stride(frm);
1361*437bfbebSnyanmisaka RK_S32 ver_stride = mpp_frame_get_ver_stride(frm);
1362*437bfbebSnyanmisaka RK_S32 fd_in = mpp_buffer_get_fd(buf_in);
1363*437bfbebSnyanmisaka RK_U32 off_in[2] = {0};
1364*437bfbebSnyanmisaka RK_U32 off_out = mpp_packet_get_length(pkt);
1365*437bfbebSnyanmisaka size_t siz_out = mpp_buffer_get_size(buf_out);
1366*437bfbebSnyanmisaka RK_S32 fd_out = mpp_buffer_get_fd(buf_out);
1367*437bfbebSnyanmisaka
1368*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1369*437bfbebSnyanmisaka
1370*437bfbebSnyanmisaka regs->reg_base.adr_src0 = fd_in;
1371*437bfbebSnyanmisaka regs->reg_base.adr_src1 = fd_in;
1372*437bfbebSnyanmisaka regs->reg_base.adr_src2 = fd_in;
1373*437bfbebSnyanmisaka
1374*437bfbebSnyanmisaka regs->reg_base.bsbb_addr = fd_out;
1375*437bfbebSnyanmisaka regs->reg_base.bsbr_addr = fd_out;
1376*437bfbebSnyanmisaka regs->reg_base.adr_bsbs = fd_out;
1377*437bfbebSnyanmisaka regs->reg_base.bsbt_addr = fd_out;
1378*437bfbebSnyanmisaka
1379*437bfbebSnyanmisaka if (MPP_FRAME_FMT_IS_FBC(fmt)) {
1380*437bfbebSnyanmisaka off_in[0] = mpp_frame_get_fbc_offset(frm);;
1381*437bfbebSnyanmisaka off_in[1] = 0;
1382*437bfbebSnyanmisaka } else if (MPP_FRAME_FMT_IS_YUV(fmt)) {
1383*437bfbebSnyanmisaka VepuFmtCfg cfg;
1384*437bfbebSnyanmisaka
1385*437bfbebSnyanmisaka vepu5xx_set_fmt(&cfg, fmt);
1386*437bfbebSnyanmisaka switch (cfg.format) {
1387*437bfbebSnyanmisaka case VEPU5xx_FMT_BGRA8888 :
1388*437bfbebSnyanmisaka case VEPU5xx_FMT_BGR888 :
1389*437bfbebSnyanmisaka case VEPU5xx_FMT_BGR565 : {
1390*437bfbebSnyanmisaka off_in[0] = 0;
1391*437bfbebSnyanmisaka off_in[1] = 0;
1392*437bfbebSnyanmisaka } break;
1393*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420SP :
1394*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422SP : {
1395*437bfbebSnyanmisaka off_in[0] = hor_stride * ver_stride;
1396*437bfbebSnyanmisaka off_in[1] = hor_stride * ver_stride;
1397*437bfbebSnyanmisaka } break;
1398*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV422P : {
1399*437bfbebSnyanmisaka off_in[0] = hor_stride * ver_stride;
1400*437bfbebSnyanmisaka off_in[1] = hor_stride * ver_stride * 3 / 2;
1401*437bfbebSnyanmisaka } break;
1402*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV420P : {
1403*437bfbebSnyanmisaka off_in[0] = hor_stride * ver_stride;
1404*437bfbebSnyanmisaka off_in[1] = hor_stride * ver_stride * 5 / 4;
1405*437bfbebSnyanmisaka } break;
1406*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV400 :
1407*437bfbebSnyanmisaka case VEPU5xx_FMT_YUYV422 :
1408*437bfbebSnyanmisaka case VEPU5xx_FMT_UYVY422 : {
1409*437bfbebSnyanmisaka off_in[0] = 0;
1410*437bfbebSnyanmisaka off_in[1] = 0;
1411*437bfbebSnyanmisaka } break;
1412*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV444SP : {
1413*437bfbebSnyanmisaka off_in[0] = hor_stride * ver_stride;
1414*437bfbebSnyanmisaka off_in[1] = hor_stride * ver_stride;
1415*437bfbebSnyanmisaka } break;
1416*437bfbebSnyanmisaka case VEPU5xx_FMT_YUV444P : {
1417*437bfbebSnyanmisaka off_in[0] = hor_stride * ver_stride;
1418*437bfbebSnyanmisaka off_in[1] = hor_stride * ver_stride * 2;
1419*437bfbebSnyanmisaka } break;
1420*437bfbebSnyanmisaka default : {
1421*437bfbebSnyanmisaka off_in[0] = 0;
1422*437bfbebSnyanmisaka off_in[1] = 0;
1423*437bfbebSnyanmisaka } break;
1424*437bfbebSnyanmisaka }
1425*437bfbebSnyanmisaka }
1426*437bfbebSnyanmisaka
1427*437bfbebSnyanmisaka mpp_dev_multi_offset_update(offsets, 161, off_in[0]);
1428*437bfbebSnyanmisaka mpp_dev_multi_offset_update(offsets, 162, off_in[1]);
1429*437bfbebSnyanmisaka mpp_dev_multi_offset_update(offsets, 172, siz_out);
1430*437bfbebSnyanmisaka mpp_dev_multi_offset_update(offsets, 175, off_out);
1431*437bfbebSnyanmisaka
1432*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
1433*437bfbebSnyanmisaka }
1434*437bfbebSnyanmisaka
vepu580_h264_set_one_roi(void * buf,MppEncROIRegion * region,RK_S32 w,RK_S32 h)1435*437bfbebSnyanmisaka static MPP_RET vepu580_h264_set_one_roi(void *buf, MppEncROIRegion *region, RK_S32 w, RK_S32 h)
1436*437bfbebSnyanmisaka {
1437*437bfbebSnyanmisaka Vepu580RoiH264BsCfg *ptr = (Vepu580RoiH264BsCfg *)buf;
1438*437bfbebSnyanmisaka RK_S32 mb_w = MPP_ALIGN(w, 16) / 16;
1439*437bfbebSnyanmisaka RK_S32 mb_h = MPP_ALIGN(h, 16) / 16;
1440*437bfbebSnyanmisaka RK_S32 stride_h = MPP_ALIGN(mb_w, 4);
1441*437bfbebSnyanmisaka Vepu580RoiH264BsCfg cfg;
1442*437bfbebSnyanmisaka MPP_RET ret = MPP_NOK;
1443*437bfbebSnyanmisaka
1444*437bfbebSnyanmisaka if (NULL == buf || NULL == region) {
1445*437bfbebSnyanmisaka mpp_err_f("invalid buf %p roi %p\n", buf, region);
1446*437bfbebSnyanmisaka goto DONE;
1447*437bfbebSnyanmisaka }
1448*437bfbebSnyanmisaka
1449*437bfbebSnyanmisaka RK_S32 roi_width = (region->w + 15) / 16;
1450*437bfbebSnyanmisaka RK_S32 roi_height = (region->h + 15) / 16;
1451*437bfbebSnyanmisaka RK_S32 pos_x_init = region->x / 16;
1452*437bfbebSnyanmisaka RK_S32 pos_y_init = region->y / 16;
1453*437bfbebSnyanmisaka RK_S32 pos_x_end = pos_x_init + roi_width;
1454*437bfbebSnyanmisaka RK_S32 pos_y_end = pos_y_init + roi_height;
1455*437bfbebSnyanmisaka RK_S32 x, y;
1456*437bfbebSnyanmisaka
1457*437bfbebSnyanmisaka pos_x_end = MPP_MIN(pos_x_end, mb_w);
1458*437bfbebSnyanmisaka pos_y_end = MPP_MIN(pos_y_end, mb_h);
1459*437bfbebSnyanmisaka pos_x_init = MPP_MAX(pos_x_init, 0);
1460*437bfbebSnyanmisaka pos_y_init = MPP_MAX(pos_y_init, 0);
1461*437bfbebSnyanmisaka
1462*437bfbebSnyanmisaka mpp_assert(pos_x_end > pos_x_init);
1463*437bfbebSnyanmisaka mpp_assert(pos_y_end > pos_y_init);
1464*437bfbebSnyanmisaka
1465*437bfbebSnyanmisaka cfg.force_intra = 1;
1466*437bfbebSnyanmisaka
1467*437bfbebSnyanmisaka ptr += pos_y_init * stride_h + pos_x_init;
1468*437bfbebSnyanmisaka roi_width = pos_x_end - pos_x_init;
1469*437bfbebSnyanmisaka roi_height = pos_y_end - pos_y_init;
1470*437bfbebSnyanmisaka
1471*437bfbebSnyanmisaka for (y = 0; y < roi_height; y++) {
1472*437bfbebSnyanmisaka Vepu580RoiH264BsCfg *dst = ptr;
1473*437bfbebSnyanmisaka
1474*437bfbebSnyanmisaka for (x = 0; x < roi_width; x++, dst++)
1475*437bfbebSnyanmisaka memcpy(dst, &cfg, sizeof(cfg));
1476*437bfbebSnyanmisaka
1477*437bfbebSnyanmisaka ptr += stride_h;
1478*437bfbebSnyanmisaka }
1479*437bfbebSnyanmisaka DONE:
1480*437bfbebSnyanmisaka return ret;
1481*437bfbebSnyanmisaka }
1482*437bfbebSnyanmisaka
setup_vepu580_intra_refresh(HalVepu580RegSet * regs,HalH264eVepu580Ctx * ctx,RK_U32 refresh_idx)1483*437bfbebSnyanmisaka static MPP_RET setup_vepu580_intra_refresh(HalVepu580RegSet *regs, HalH264eVepu580Ctx *ctx, RK_U32 refresh_idx)
1484*437bfbebSnyanmisaka {
1485*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
1486*437bfbebSnyanmisaka RK_U32 mb_w = ctx->sps->pic_width_in_mbs;
1487*437bfbebSnyanmisaka RK_U32 mb_h = ctx->sps->pic_height_in_mbs;
1488*437bfbebSnyanmisaka RK_U32 w = mb_w * 16;
1489*437bfbebSnyanmisaka RK_U32 h = mb_h * 16;
1490*437bfbebSnyanmisaka MppEncROIRegion *region = NULL;
1491*437bfbebSnyanmisaka RK_U32 refresh_num = ctx->cfg->rc.refresh_num;
1492*437bfbebSnyanmisaka RK_U32 stride_h = MPP_ALIGN(mb_w, 4);
1493*437bfbebSnyanmisaka RK_U32 stride_v = MPP_ALIGN(mb_h, 4);
1494*437bfbebSnyanmisaka RK_S32 roi_base_buf_size = stride_h * stride_v * 8;
1495*437bfbebSnyanmisaka RK_U32 i = 0;
1496*437bfbebSnyanmisaka
1497*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1498*437bfbebSnyanmisaka
1499*437bfbebSnyanmisaka if (!ctx->cfg->rc.refresh_en) {
1500*437bfbebSnyanmisaka ret = MPP_ERR_VALUE;
1501*437bfbebSnyanmisaka goto RET;
1502*437bfbebSnyanmisaka }
1503*437bfbebSnyanmisaka
1504*437bfbebSnyanmisaka if (ctx->roi_base_buf_size < roi_base_buf_size) {
1505*437bfbebSnyanmisaka if (NULL == ctx->roi_grp)
1506*437bfbebSnyanmisaka mpp_buffer_group_get_internal(&ctx->roi_grp, MPP_BUFFER_TYPE_ION);
1507*437bfbebSnyanmisaka if (ctx->roi_base_cfg_buf)
1508*437bfbebSnyanmisaka mpp_buffer_put(ctx->roi_base_cfg_buf);
1509*437bfbebSnyanmisaka mpp_buffer_get(ctx->roi_grp, &ctx->roi_base_cfg_buf, roi_base_buf_size);
1510*437bfbebSnyanmisaka ctx->roi_base_buf_size = roi_base_buf_size;
1511*437bfbebSnyanmisaka }
1512*437bfbebSnyanmisaka
1513*437bfbebSnyanmisaka mpp_assert(ctx->roi_base_cfg_buf);
1514*437bfbebSnyanmisaka RK_S32 base_cfg_fd = mpp_buffer_get_fd(ctx->roi_base_cfg_buf);
1515*437bfbebSnyanmisaka void *base_cfg_buf = mpp_buffer_get_ptr(ctx->roi_base_cfg_buf);
1516*437bfbebSnyanmisaka Vepu580RoiH264BsCfg base_cfg;
1517*437bfbebSnyanmisaka Vepu580RoiH264BsCfg *base_cfg_ptr = (Vepu580RoiH264BsCfg *)base_cfg_buf;
1518*437bfbebSnyanmisaka
1519*437bfbebSnyanmisaka base_cfg.force_intra = 0;
1520*437bfbebSnyanmisaka base_cfg.qp_adj_en = 1;
1521*437bfbebSnyanmisaka
1522*437bfbebSnyanmisaka for (i = 0; i < stride_h * stride_v; i++, base_cfg_ptr++)
1523*437bfbebSnyanmisaka memcpy(base_cfg_ptr, &base_cfg, sizeof(base_cfg));
1524*437bfbebSnyanmisaka
1525*437bfbebSnyanmisaka region = mpp_calloc(MppEncROIRegion, 1);
1526*437bfbebSnyanmisaka
1527*437bfbebSnyanmisaka if (NULL == region) {
1528*437bfbebSnyanmisaka mpp_err_f("Failed to calloc for MppEncROIRegion !\n");
1529*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
1530*437bfbebSnyanmisaka }
1531*437bfbebSnyanmisaka
1532*437bfbebSnyanmisaka if (ctx->cfg->rc.refresh_mode == MPP_ENC_RC_INTRA_REFRESH_ROW) {
1533*437bfbebSnyanmisaka region->x = 0;
1534*437bfbebSnyanmisaka region->w = w;
1535*437bfbebSnyanmisaka if (refresh_idx > 0) {
1536*437bfbebSnyanmisaka region->y = refresh_idx * 16 * refresh_num - 32;
1537*437bfbebSnyanmisaka region->h = 16 * refresh_num + 32;
1538*437bfbebSnyanmisaka } else {
1539*437bfbebSnyanmisaka region->y = refresh_idx * 16 * refresh_num;
1540*437bfbebSnyanmisaka region->h = 16 * refresh_num;
1541*437bfbebSnyanmisaka }
1542*437bfbebSnyanmisaka regs->reg_base.me_rnge.cme_srch_v = 1;
1543*437bfbebSnyanmisaka } else if (ctx->cfg->rc.refresh_mode == MPP_ENC_RC_INTRA_REFRESH_COL) {
1544*437bfbebSnyanmisaka region->y = 0;
1545*437bfbebSnyanmisaka region->h = h;
1546*437bfbebSnyanmisaka if (refresh_idx > 0) {
1547*437bfbebSnyanmisaka region->x = refresh_idx * 16 * refresh_num - 32;
1548*437bfbebSnyanmisaka region->w = 16 * refresh_num + 32;
1549*437bfbebSnyanmisaka } else {
1550*437bfbebSnyanmisaka region->x = refresh_idx * 16 * refresh_num;
1551*437bfbebSnyanmisaka region->w = 16 * refresh_num;
1552*437bfbebSnyanmisaka }
1553*437bfbebSnyanmisaka regs->reg_base.me_rnge.cme_srch_h = 1;
1554*437bfbebSnyanmisaka }
1555*437bfbebSnyanmisaka
1556*437bfbebSnyanmisaka region->intra = 1;
1557*437bfbebSnyanmisaka region->quality = -ctx->cfg->rc.qp_delta_ip;
1558*437bfbebSnyanmisaka
1559*437bfbebSnyanmisaka region->area_map_en = 1;
1560*437bfbebSnyanmisaka region->qp_area_idx = 1;
1561*437bfbebSnyanmisaka region->abs_qp_en = 0;
1562*437bfbebSnyanmisaka
1563*437bfbebSnyanmisaka regs->reg_base.enc_pic.roi_en = 1;
1564*437bfbebSnyanmisaka regs->reg_base.roi_addr = base_cfg_fd;
1565*437bfbebSnyanmisaka vepu580_h264_set_one_roi(base_cfg_buf, region, w, h);
1566*437bfbebSnyanmisaka mpp_free(region);
1567*437bfbebSnyanmisaka mpp_buffer_sync_end(ctx->roi_base_cfg_buf);
1568*437bfbebSnyanmisaka
1569*437bfbebSnyanmisaka RET:
1570*437bfbebSnyanmisaka hal_h264e_dbg_func("leave, ret %d\n", ret);
1571*437bfbebSnyanmisaka return ret;
1572*437bfbebSnyanmisaka }
1573*437bfbebSnyanmisaka
setup_vepu580_roi(HalVepu580RegSet * regs,HalH264eVepu580Ctx * ctx)1574*437bfbebSnyanmisaka static void setup_vepu580_roi(HalVepu580RegSet *regs, HalH264eVepu580Ctx *ctx)
1575*437bfbebSnyanmisaka {
1576*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1577*437bfbebSnyanmisaka
1578*437bfbebSnyanmisaka /* memset register on start so do not clear registers again here */
1579*437bfbebSnyanmisaka if (ctx->roi_data) {
1580*437bfbebSnyanmisaka /* roi setup */
1581*437bfbebSnyanmisaka RK_U32 mb_w = MPP_ALIGN(ctx->cfg->prep.width, 64) / 16;
1582*437bfbebSnyanmisaka RK_U32 mb_h = MPP_ALIGN(ctx->cfg->prep.height, 64) / 16;
1583*437bfbebSnyanmisaka RK_U32 base_cfg_size = mb_w * mb_h * 8;
1584*437bfbebSnyanmisaka RK_U32 qp_cfg_size = mb_w * mb_h * 2;
1585*437bfbebSnyanmisaka RK_U32 amv_cfg_size = mb_w * mb_h / 4;
1586*437bfbebSnyanmisaka RK_U32 mv_cfg_size = mb_w * mb_h * 96 / 4;
1587*437bfbebSnyanmisaka MppEncROICfg2 *cfg = (MppEncROICfg2 *)ctx->roi_data;
1588*437bfbebSnyanmisaka
1589*437bfbebSnyanmisaka if (mpp_buffer_get_size(cfg->base_cfg_buf) >= base_cfg_size) {
1590*437bfbebSnyanmisaka regs->reg_base.enc_pic.roi_en = 1;
1591*437bfbebSnyanmisaka regs->reg_base.roi_addr = mpp_buffer_get_fd(cfg->base_cfg_buf);
1592*437bfbebSnyanmisaka } else {
1593*437bfbebSnyanmisaka mpp_err("roi base cfg buf not enough, roi is invalid");
1594*437bfbebSnyanmisaka }
1595*437bfbebSnyanmisaka
1596*437bfbebSnyanmisaka if (cfg->roi_qp_en) {
1597*437bfbebSnyanmisaka if (mpp_buffer_get_size(cfg->qp_cfg_buf) >= qp_cfg_size) {
1598*437bfbebSnyanmisaka regs->reg_base.roi_qp_addr = mpp_buffer_get_fd(cfg->qp_cfg_buf);
1599*437bfbebSnyanmisaka regs->reg_base.roi_en.roi_qp_en = 1;
1600*437bfbebSnyanmisaka } else {
1601*437bfbebSnyanmisaka mpp_err("roi qp cfg buf not enough, roi is invalid");
1602*437bfbebSnyanmisaka }
1603*437bfbebSnyanmisaka }
1604*437bfbebSnyanmisaka
1605*437bfbebSnyanmisaka if (cfg->roi_amv_en) {
1606*437bfbebSnyanmisaka if (mpp_buffer_get_size(cfg->amv_cfg_buf) >= amv_cfg_size) {
1607*437bfbebSnyanmisaka regs->reg_base.qoi_amv_addr = mpp_buffer_get_fd(cfg->amv_cfg_buf);
1608*437bfbebSnyanmisaka regs->reg_base.roi_en.roi_amv_en = 1;
1609*437bfbebSnyanmisaka } else {
1610*437bfbebSnyanmisaka mpp_err("roi amv cfg buf not enough, roi is invalid");
1611*437bfbebSnyanmisaka }
1612*437bfbebSnyanmisaka }
1613*437bfbebSnyanmisaka
1614*437bfbebSnyanmisaka if (cfg->roi_mv_en) {
1615*437bfbebSnyanmisaka if (mpp_buffer_get_size(cfg->mv_cfg_buf) >= mv_cfg_size) {
1616*437bfbebSnyanmisaka regs->reg_base.qoi_mv_addr = mpp_buffer_get_fd(cfg->mv_cfg_buf);
1617*437bfbebSnyanmisaka regs->reg_base.roi_en.roi_mv_en = 1;
1618*437bfbebSnyanmisaka } else {
1619*437bfbebSnyanmisaka mpp_err("roi mv cfg buf not enough, roi is invalid");
1620*437bfbebSnyanmisaka }
1621*437bfbebSnyanmisaka }
1622*437bfbebSnyanmisaka }
1623*437bfbebSnyanmisaka
1624*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
1625*437bfbebSnyanmisaka }
1626*437bfbebSnyanmisaka
setup_vepu580_recn_refr(HalH264eVepu580Ctx * ctx,HalVepu580RegSet * regs)1627*437bfbebSnyanmisaka static void setup_vepu580_recn_refr(HalH264eVepu580Ctx *ctx, HalVepu580RegSet *regs)
1628*437bfbebSnyanmisaka {
1629*437bfbebSnyanmisaka H264eFrmInfo *frms = ctx->frms;
1630*437bfbebSnyanmisaka HalBufs bufs = ctx->hw_recn;
1631*437bfbebSnyanmisaka RK_S32 fbc_hdr_size = ctx->pixel_buf_fbc_hdr_size;
1632*437bfbebSnyanmisaka
1633*437bfbebSnyanmisaka HalBuf *curr = hal_bufs_get_buf(bufs, frms->curr_idx);
1634*437bfbebSnyanmisaka HalBuf *refr = hal_bufs_get_buf(bufs, frms->refr_idx);
1635*437bfbebSnyanmisaka
1636*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1637*437bfbebSnyanmisaka
1638*437bfbebSnyanmisaka if (curr && curr->cnt) {
1639*437bfbebSnyanmisaka MppBuffer buf_pixel = curr->buf[0];
1640*437bfbebSnyanmisaka MppBuffer buf_thumb = curr->buf[1];
1641*437bfbebSnyanmisaka RK_S32 fd = mpp_buffer_get_fd(buf_pixel);
1642*437bfbebSnyanmisaka
1643*437bfbebSnyanmisaka mpp_assert(buf_pixel);
1644*437bfbebSnyanmisaka mpp_assert(buf_thumb);
1645*437bfbebSnyanmisaka
1646*437bfbebSnyanmisaka regs->reg_base.rfpw_h_addr = fd;
1647*437bfbebSnyanmisaka regs->reg_base.rfpw_b_addr = fd;
1648*437bfbebSnyanmisaka regs->reg_base.dspw_addr = mpp_buffer_get_fd(buf_thumb);
1649*437bfbebSnyanmisaka }
1650*437bfbebSnyanmisaka
1651*437bfbebSnyanmisaka if (refr && refr->cnt) {
1652*437bfbebSnyanmisaka MppBuffer buf_pixel = refr->buf[0];
1653*437bfbebSnyanmisaka MppBuffer buf_thumb = refr->buf[1];
1654*437bfbebSnyanmisaka RK_S32 fd = mpp_buffer_get_fd(buf_pixel);
1655*437bfbebSnyanmisaka
1656*437bfbebSnyanmisaka mpp_assert(buf_pixel);
1657*437bfbebSnyanmisaka mpp_assert(buf_thumb);
1658*437bfbebSnyanmisaka
1659*437bfbebSnyanmisaka regs->reg_base.rfpr_h_addr = fd;
1660*437bfbebSnyanmisaka regs->reg_base.rfpr_b_addr = fd;
1661*437bfbebSnyanmisaka regs->reg_base.dspr_addr = mpp_buffer_get_fd(buf_thumb);
1662*437bfbebSnyanmisaka }
1663*437bfbebSnyanmisaka
1664*437bfbebSnyanmisaka mpp_dev_multi_offset_update(ctx->offsets, 164, fbc_hdr_size);
1665*437bfbebSnyanmisaka mpp_dev_multi_offset_update(ctx->offsets, 166, fbc_hdr_size);
1666*437bfbebSnyanmisaka
1667*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
1668*437bfbebSnyanmisaka }
1669*437bfbebSnyanmisaka
setup_vepu580_split(HalVepu580RegSet * regs,MppEncCfgSet * enc_cfg)1670*437bfbebSnyanmisaka static void setup_vepu580_split(HalVepu580RegSet *regs, MppEncCfgSet *enc_cfg)
1671*437bfbebSnyanmisaka {
1672*437bfbebSnyanmisaka MppEncSliceSplit *cfg = &enc_cfg->split;
1673*437bfbebSnyanmisaka
1674*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1675*437bfbebSnyanmisaka
1676*437bfbebSnyanmisaka switch (cfg->split_mode) {
1677*437bfbebSnyanmisaka case MPP_ENC_SPLIT_NONE : {
1678*437bfbebSnyanmisaka regs->reg_base.sli_splt.sli_splt = 0;
1679*437bfbebSnyanmisaka regs->reg_base.sli_splt.sli_splt_mode = 0;
1680*437bfbebSnyanmisaka regs->reg_base.sli_splt.sli_splt_cpst = 0;
1681*437bfbebSnyanmisaka regs->reg_base.sli_splt.sli_max_num_m1 = 0;
1682*437bfbebSnyanmisaka regs->reg_base.sli_splt.sli_flsh = 0;
1683*437bfbebSnyanmisaka regs->reg_base.sli_cnum.sli_splt_cnum_m1 = 0;
1684*437bfbebSnyanmisaka
1685*437bfbebSnyanmisaka regs->reg_base.sli_byte.sli_splt_byte = 0;
1686*437bfbebSnyanmisaka regs->reg_base.enc_pic.slen_fifo = 0;
1687*437bfbebSnyanmisaka } break;
1688*437bfbebSnyanmisaka case MPP_ENC_SPLIT_BY_BYTE : {
1689*437bfbebSnyanmisaka regs->reg_base.sli_splt.sli_splt = 1;
1690*437bfbebSnyanmisaka regs->reg_base.sli_splt.sli_splt_mode = 0;
1691*437bfbebSnyanmisaka regs->reg_base.sli_splt.sli_splt_cpst = 0;
1692*437bfbebSnyanmisaka regs->reg_base.sli_splt.sli_max_num_m1 = 500;
1693*437bfbebSnyanmisaka regs->reg_base.sli_splt.sli_flsh = 1;
1694*437bfbebSnyanmisaka regs->reg_base.sli_cnum.sli_splt_cnum_m1 = 0;
1695*437bfbebSnyanmisaka
1696*437bfbebSnyanmisaka regs->reg_base.sli_byte.sli_splt_byte = cfg->split_arg;
1697*437bfbebSnyanmisaka regs->reg_base.enc_pic.slen_fifo = cfg->split_out ? 1 : 0;
1698*437bfbebSnyanmisaka regs->reg_ctl.int_en.slc_done_en = regs->reg_base.enc_pic.slen_fifo;
1699*437bfbebSnyanmisaka } break;
1700*437bfbebSnyanmisaka case MPP_ENC_SPLIT_BY_CTU : {
1701*437bfbebSnyanmisaka RK_U32 mb_w = MPP_ALIGN(enc_cfg->prep.width, 16) / 16;
1702*437bfbebSnyanmisaka RK_U32 mb_h = MPP_ALIGN(enc_cfg->prep.height, 16) / 16;
1703*437bfbebSnyanmisaka RK_U32 slice_num = (mb_w * mb_h + cfg->split_arg - 1) / cfg->split_arg;
1704*437bfbebSnyanmisaka
1705*437bfbebSnyanmisaka regs->reg_base.sli_splt.sli_splt = 1;
1706*437bfbebSnyanmisaka regs->reg_base.sli_splt.sli_splt_mode = 1;
1707*437bfbebSnyanmisaka regs->reg_base.sli_splt.sli_splt_cpst = 0;
1708*437bfbebSnyanmisaka regs->reg_base.sli_splt.sli_max_num_m1 = 500;
1709*437bfbebSnyanmisaka regs->reg_base.sli_splt.sli_flsh = 1;
1710*437bfbebSnyanmisaka regs->reg_base.sli_cnum.sli_splt_cnum_m1 = cfg->split_arg - 1;
1711*437bfbebSnyanmisaka
1712*437bfbebSnyanmisaka regs->reg_base.sli_byte.sli_splt_byte = 0;
1713*437bfbebSnyanmisaka regs->reg_base.enc_pic.slen_fifo = cfg->split_out ? 1 : 0;
1714*437bfbebSnyanmisaka
1715*437bfbebSnyanmisaka if ((cfg->split_out & MPP_ENC_SPLIT_OUT_LOWDELAY) ||
1716*437bfbebSnyanmisaka (regs->reg_base.enc_pic.slen_fifo && (slice_num > VEPU580_SLICE_FIFO_LEN)))
1717*437bfbebSnyanmisaka regs->reg_ctl.int_en.slc_done_en = 1;
1718*437bfbebSnyanmisaka
1719*437bfbebSnyanmisaka } break;
1720*437bfbebSnyanmisaka default : {
1721*437bfbebSnyanmisaka mpp_log_f("invalide slice split mode %d\n", cfg->split_mode);
1722*437bfbebSnyanmisaka } break;
1723*437bfbebSnyanmisaka }
1724*437bfbebSnyanmisaka
1725*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
1726*437bfbebSnyanmisaka }
1727*437bfbebSnyanmisaka
calc_cime_parameter(HalVepu580RegSet * regs,H264eSps * sps)1728*437bfbebSnyanmisaka static void calc_cime_parameter(HalVepu580RegSet *regs, H264eSps *sps)
1729*437bfbebSnyanmisaka {
1730*437bfbebSnyanmisaka Vepu580BaseCfg *base_regs = ®s->reg_base;
1731*437bfbebSnyanmisaka RK_S32 x_gmv = base_regs->gmv.gmv_x;
1732*437bfbebSnyanmisaka RK_S32 y_gmv = base_regs->gmv.gmv_y;
1733*437bfbebSnyanmisaka RK_S32 srch_w = base_regs->me_rnge.cme_srch_h * 4;
1734*437bfbebSnyanmisaka RK_S32 srch_h = base_regs->me_rnge.cme_srch_v * 4;
1735*437bfbebSnyanmisaka RK_S32 frm_sta = 0, frm_end = 0, pic_w = 0;
1736*437bfbebSnyanmisaka RK_S32 pic_wd64 = MPP_ALIGN(sps->pic_width_in_mbs * 16, 64) / 64;
1737*437bfbebSnyanmisaka
1738*437bfbebSnyanmisaka // calc cime_linebuf_w
1739*437bfbebSnyanmisaka {
1740*437bfbebSnyanmisaka if (x_gmv - srch_w < 0) {
1741*437bfbebSnyanmisaka frm_sta = (x_gmv - srch_w - 15) / 16;
1742*437bfbebSnyanmisaka } else {
1743*437bfbebSnyanmisaka frm_sta = (x_gmv - srch_w) / 16;
1744*437bfbebSnyanmisaka }
1745*437bfbebSnyanmisaka frm_sta = mpp_clip(frm_sta, 0, pic_wd64 - 1);
1746*437bfbebSnyanmisaka
1747*437bfbebSnyanmisaka if (x_gmv + srch_w < 0) {
1748*437bfbebSnyanmisaka frm_end = pic_wd64 - 1 + (x_gmv + srch_w) / 16;
1749*437bfbebSnyanmisaka } else {
1750*437bfbebSnyanmisaka frm_end = pic_wd64 - 1 + (x_gmv + srch_w + 15) / 16;
1751*437bfbebSnyanmisaka }
1752*437bfbebSnyanmisaka frm_end = mpp_clip(frm_end, 0, pic_wd64 - 1);
1753*437bfbebSnyanmisaka
1754*437bfbebSnyanmisaka pic_w = (frm_end - frm_sta + 1) * 64;
1755*437bfbebSnyanmisaka base_regs->me_cach.cme_linebuf_w = (pic_w ? pic_w : 64) / 64;
1756*437bfbebSnyanmisaka }
1757*437bfbebSnyanmisaka
1758*437bfbebSnyanmisaka // calc cime_cacha_h and cime_cacha_max
1759*437bfbebSnyanmisaka {
1760*437bfbebSnyanmisaka RK_U32 cime_cacha_max = 2464;
1761*437bfbebSnyanmisaka RK_U32 ctu_4_h = 1, ramb_h;
1762*437bfbebSnyanmisaka RK_U32 cur_srch_16_w, cur_srch_4_h, cur_srch_max;
1763*437bfbebSnyanmisaka RK_U32 cime_cacha_h = ctu_4_h;
1764*437bfbebSnyanmisaka
1765*437bfbebSnyanmisaka if ((x_gmv % 16 - srch_w % 16) < 0) {
1766*437bfbebSnyanmisaka cur_srch_16_w = (16 + (x_gmv % 16 - srch_w % 16) % 16 + srch_w * 2 + 15) / 16 + 1;
1767*437bfbebSnyanmisaka } else {
1768*437bfbebSnyanmisaka cur_srch_16_w = ((x_gmv % 16 - srch_w % 16) % 16 + srch_w * 2 + 15) / 16 + 1;
1769*437bfbebSnyanmisaka }
1770*437bfbebSnyanmisaka
1771*437bfbebSnyanmisaka if ((y_gmv % 4 - srch_h % 4) < 0) {
1772*437bfbebSnyanmisaka cur_srch_4_h = (4 + (y_gmv % 4 - srch_h % 4) % 4 + srch_h * 2 + 3) / 4 + ctu_4_h;
1773*437bfbebSnyanmisaka } else {
1774*437bfbebSnyanmisaka cur_srch_4_h = ((y_gmv % 4 - srch_h % 4) % 4 + srch_h * 2 + 3) / 4 + ctu_4_h;
1775*437bfbebSnyanmisaka }
1776*437bfbebSnyanmisaka
1777*437bfbebSnyanmisaka cur_srch_max = cur_srch_4_h;
1778*437bfbebSnyanmisaka
1779*437bfbebSnyanmisaka if (base_regs->me_cach.cme_linebuf_w < cur_srch_16_w) {
1780*437bfbebSnyanmisaka cur_srch_16_w = base_regs->me_cach.cme_linebuf_w;
1781*437bfbebSnyanmisaka }
1782*437bfbebSnyanmisaka
1783*437bfbebSnyanmisaka ramb_h = cur_srch_4_h;
1784*437bfbebSnyanmisaka while ((cime_cacha_h < cur_srch_max) && (cime_cacha_max >
1785*437bfbebSnyanmisaka ((cime_cacha_h - ctu_4_h) * base_regs->me_cach.cme_linebuf_w * 4 + (ramb_h * 4 * cur_srch_16_w)))) {
1786*437bfbebSnyanmisaka cime_cacha_h = cime_cacha_h + ctu_4_h;
1787*437bfbebSnyanmisaka
1788*437bfbebSnyanmisaka if (ramb_h > 2 * ctu_4_h) {
1789*437bfbebSnyanmisaka ramb_h = ramb_h - ctu_4_h;
1790*437bfbebSnyanmisaka } else {
1791*437bfbebSnyanmisaka ramb_h = ctu_4_h;
1792*437bfbebSnyanmisaka }
1793*437bfbebSnyanmisaka }
1794*437bfbebSnyanmisaka
1795*437bfbebSnyanmisaka if (cur_srch_4_h == ctu_4_h) {
1796*437bfbebSnyanmisaka cime_cacha_h = cime_cacha_h + ctu_4_h;
1797*437bfbebSnyanmisaka ramb_h = 0;
1798*437bfbebSnyanmisaka }
1799*437bfbebSnyanmisaka
1800*437bfbebSnyanmisaka if (cime_cacha_max < ((cime_cacha_h - ctu_4_h) * base_regs->me_cach.cme_linebuf_w * 4 + (ramb_h * 4 * cur_srch_16_w))) {
1801*437bfbebSnyanmisaka cime_cacha_h = cime_cacha_h - ctu_4_h;
1802*437bfbebSnyanmisaka }
1803*437bfbebSnyanmisaka base_regs->me_cach.cme_rama_h = cime_cacha_h;
1804*437bfbebSnyanmisaka
1805*437bfbebSnyanmisaka /* cime_cacha_max */
1806*437bfbebSnyanmisaka {
1807*437bfbebSnyanmisaka RK_U32 ram_col_h = (cime_cacha_h - ctu_4_h) / ctu_4_h;
1808*437bfbebSnyanmisaka base_regs->me_cach.cme_rama_max = ram_col_h * base_regs->me_cach.cme_linebuf_w + cur_srch_16_w;
1809*437bfbebSnyanmisaka }
1810*437bfbebSnyanmisaka }
1811*437bfbebSnyanmisaka }
1812*437bfbebSnyanmisaka
setup_vepu580_me(HalVepu580RegSet * regs,H264eSps * sps,H264eSlice * slice)1813*437bfbebSnyanmisaka static void setup_vepu580_me(HalVepu580RegSet *regs, H264eSps *sps,
1814*437bfbebSnyanmisaka H264eSlice *slice)
1815*437bfbebSnyanmisaka {
1816*437bfbebSnyanmisaka RK_S32 level_idc = sps->level_idc;
1817*437bfbebSnyanmisaka RK_S32 cime_w = 176;
1818*437bfbebSnyanmisaka RK_S32 cime_h = 112;
1819*437bfbebSnyanmisaka RK_S32 cime_blk_w_max = 44;
1820*437bfbebSnyanmisaka RK_S32 cime_blk_h_max = 28;
1821*437bfbebSnyanmisaka
1822*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1823*437bfbebSnyanmisaka /*
1824*437bfbebSnyanmisaka * Step 1. limit the mv range by level_idc
1825*437bfbebSnyanmisaka * For level 1 and level 1b the vertical MV range is [-64,+63.75]
1826*437bfbebSnyanmisaka * For level 1.1, 1.2, 1.3 and 2 the vertical MV range is [-128,+127.75]
1827*437bfbebSnyanmisaka */
1828*437bfbebSnyanmisaka switch (level_idc) {
1829*437bfbebSnyanmisaka case H264_LEVEL_1_0 :
1830*437bfbebSnyanmisaka case H264_LEVEL_1_b : {
1831*437bfbebSnyanmisaka cime_blk_h_max = 12;
1832*437bfbebSnyanmisaka } break;
1833*437bfbebSnyanmisaka case H264_LEVEL_1_1 :
1834*437bfbebSnyanmisaka case H264_LEVEL_1_2 :
1835*437bfbebSnyanmisaka case H264_LEVEL_1_3 :
1836*437bfbebSnyanmisaka case H264_LEVEL_2_0 : {
1837*437bfbebSnyanmisaka cime_blk_h_max = 28;
1838*437bfbebSnyanmisaka } break;
1839*437bfbebSnyanmisaka default : {
1840*437bfbebSnyanmisaka cime_blk_h_max = 28;
1841*437bfbebSnyanmisaka } break;
1842*437bfbebSnyanmisaka }
1843*437bfbebSnyanmisaka
1844*437bfbebSnyanmisaka if (cime_w < cime_blk_w_max * 4)
1845*437bfbebSnyanmisaka cime_blk_w_max = cime_w / 4;
1846*437bfbebSnyanmisaka
1847*437bfbebSnyanmisaka if (cime_h < cime_blk_h_max * 4)
1848*437bfbebSnyanmisaka cime_blk_h_max = cime_h / 4;
1849*437bfbebSnyanmisaka
1850*437bfbebSnyanmisaka /*
1851*437bfbebSnyanmisaka * Step 2. limit the mv range by image size
1852*437bfbebSnyanmisaka */
1853*437bfbebSnyanmisaka if (cime_blk_w_max / 4 * 2 > (sps->pic_width_in_mbs * 2 + 1) / 2)
1854*437bfbebSnyanmisaka cime_blk_w_max = (sps->pic_width_in_mbs * 2 + 1) / 2 / 2 * 4;
1855*437bfbebSnyanmisaka
1856*437bfbebSnyanmisaka if (cime_blk_h_max / 4 > MPP_ALIGN(sps->pic_height_in_mbs * 16, 64) / 128 * 4)
1857*437bfbebSnyanmisaka cime_blk_h_max = MPP_ALIGN(sps->pic_height_in_mbs * 16, 64) / 128 * 16;
1858*437bfbebSnyanmisaka
1859*437bfbebSnyanmisaka regs->reg_base.me_rnge.cme_srch_h = cime_blk_w_max / 4;
1860*437bfbebSnyanmisaka regs->reg_base.me_rnge.cme_srch_v = cime_blk_h_max / 4;
1861*437bfbebSnyanmisaka regs->reg_base.me_rnge.rme_srch_h = 7;
1862*437bfbebSnyanmisaka regs->reg_base.me_rnge.rme_srch_v = 5;
1863*437bfbebSnyanmisaka regs->reg_base.me_rnge.dlt_frm_num = 0;
1864*437bfbebSnyanmisaka
1865*437bfbebSnyanmisaka if (slice->slice_type == H264_I_SLICE) {
1866*437bfbebSnyanmisaka regs->reg_base.me_cfg.pmv_mdst_h = 0;
1867*437bfbebSnyanmisaka regs->reg_base.me_cfg.pmv_mdst_v = 0;
1868*437bfbebSnyanmisaka } else {
1869*437bfbebSnyanmisaka regs->reg_base.me_cfg.pmv_mdst_h = 5;
1870*437bfbebSnyanmisaka regs->reg_base.me_cfg.pmv_mdst_v = 5;
1871*437bfbebSnyanmisaka }
1872*437bfbebSnyanmisaka regs->reg_base.me_cfg.mv_limit = (sps->level_idc > 20) ? 2 : ((sps->level_idc >= 11) ? 1 : 0);//2;
1873*437bfbebSnyanmisaka regs->reg_base.me_cfg.pmv_num = 2;
1874*437bfbebSnyanmisaka regs->reg_base.me_cfg.rme_dis = 0;
1875*437bfbebSnyanmisaka regs->reg_base.me_cfg.fme_dis = 0;
1876*437bfbebSnyanmisaka regs->reg_base.me_cfg.lvl4_ovrd_en = 0;
1877*437bfbebSnyanmisaka
1878*437bfbebSnyanmisaka calc_cime_parameter(regs, sps);
1879*437bfbebSnyanmisaka
1880*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
1881*437bfbebSnyanmisaka }
1882*437bfbebSnyanmisaka
1883*437bfbebSnyanmisaka #define H264E_LAMBDA_TAB_SIZE (52 * sizeof(RK_U32))
1884*437bfbebSnyanmisaka
1885*437bfbebSnyanmisaka static RK_U32 h264e_lambda_default[58] = {
1886*437bfbebSnyanmisaka 0x00000003, 0x00000005, 0x00000006, 0x00000007,
1887*437bfbebSnyanmisaka 0x00000009, 0x0000000b, 0x0000000e, 0x00000012,
1888*437bfbebSnyanmisaka 0x00000016, 0x0000001c, 0x00000024, 0x0000002d,
1889*437bfbebSnyanmisaka 0x00000039, 0x00000048, 0x0000005b, 0x00000073,
1890*437bfbebSnyanmisaka 0x00000091, 0x000000b6, 0x000000e6, 0x00000122,
1891*437bfbebSnyanmisaka 0x0000016d, 0x000001cc, 0x00000244, 0x000002db,
1892*437bfbebSnyanmisaka 0x00000399, 0x00000489, 0x000005b6, 0x00000733,
1893*437bfbebSnyanmisaka 0x00000912, 0x00000b6d, 0x00000e66, 0x00001224,
1894*437bfbebSnyanmisaka 0x000016db, 0x00001ccc, 0x00002449, 0x00002db7,
1895*437bfbebSnyanmisaka 0x00003999, 0x00004892, 0x00005b6f, 0x00007333,
1896*437bfbebSnyanmisaka 0x00009124, 0x0000b6de, 0x0000e666, 0x00012249,
1897*437bfbebSnyanmisaka 0x00016dbc, 0x0001cccc, 0x00024492, 0x0002db79,
1898*437bfbebSnyanmisaka 0x00039999, 0x00048924, 0x0005b6f2, 0x00073333,
1899*437bfbebSnyanmisaka 0x00091249, 0x000b6de5, 0x000e6666, 0x00122492,
1900*437bfbebSnyanmisaka 0x0016dbcb, 0x001ccccc,
1901*437bfbebSnyanmisaka };
1902*437bfbebSnyanmisaka
setup_vepu580_l2(HalVepu580RegSet * regs,H264eSlice * slice,MppEncHwCfg * hw)1903*437bfbebSnyanmisaka static void setup_vepu580_l2(HalVepu580RegSet *regs, H264eSlice *slice, MppEncHwCfg *hw)
1904*437bfbebSnyanmisaka {
1905*437bfbebSnyanmisaka RK_U32 i;
1906*437bfbebSnyanmisaka
1907*437bfbebSnyanmisaka hal_h264e_dbg_func("enter\n");
1908*437bfbebSnyanmisaka
1909*437bfbebSnyanmisaka regs->reg_s3.iprd_wgt_qp_hevc_0_51[0] = 0;
1910*437bfbebSnyanmisaka /* ~ */
1911*437bfbebSnyanmisaka regs->reg_s3.iprd_wgt_qp_hevc_0_51[51] = 0;
1912*437bfbebSnyanmisaka
1913*437bfbebSnyanmisaka if (slice->slice_type == H264_I_SLICE) {
1914*437bfbebSnyanmisaka memcpy(regs->reg_s3.rdo_wgta_qp_grpa_0_51, &h264e_lambda_default[6], H264E_LAMBDA_TAB_SIZE);
1915*437bfbebSnyanmisaka } else {
1916*437bfbebSnyanmisaka memcpy(regs->reg_s3.rdo_wgta_qp_grpa_0_51, &h264e_lambda_default[6], H264E_LAMBDA_TAB_SIZE);
1917*437bfbebSnyanmisaka }
1918*437bfbebSnyanmisaka memset(regs->reg_s3.iprd_wgt_qp_hevc_0_51, 0, H264E_LAMBDA_TAB_SIZE);
1919*437bfbebSnyanmisaka
1920*437bfbebSnyanmisaka regs->reg_rc_klut.madi_cfg.madi_mode = 0;
1921*437bfbebSnyanmisaka regs->reg_rc_klut.madi_cfg.madi_thd = 25;
1922*437bfbebSnyanmisaka
1923*437bfbebSnyanmisaka regs->reg_s3.lvl32_intra_CST_THD0.lvl4_intra_cst_thd0 = 1;
1924*437bfbebSnyanmisaka regs->reg_s3.lvl32_intra_CST_THD0.lvl4_intra_cst_thd1 = 4;
1925*437bfbebSnyanmisaka regs->reg_s3.lvl32_intra_CST_THD1.lvl4_intra_cst_thd2 = 9;
1926*437bfbebSnyanmisaka regs->reg_s3.lvl32_intra_CST_THD1.lvl4_intra_cst_thd3 = 36;
1927*437bfbebSnyanmisaka
1928*437bfbebSnyanmisaka regs->reg_s3.lvl16_intra_CST_THD0.lvl8_intra_chrm_cst_thd0 = 1;
1929*437bfbebSnyanmisaka regs->reg_s3.lvl16_intra_CST_THD0.lvl8_intra_chrm_cst_thd1 = 4;
1930*437bfbebSnyanmisaka regs->reg_s3.lvl16_intra_CST_THD1.lvl8_intra_chrm_cst_thd2 = 9;
1931*437bfbebSnyanmisaka regs->reg_s3.lvl16_intra_CST_THD1.lvl8_intra_chrm_cst_thd3 = 36;
1932*437bfbebSnyanmisaka
1933*437bfbebSnyanmisaka regs->reg_s3.lvl8_intra_CST_THD0.lvl8_intra_cst_thd0 = 1;
1934*437bfbebSnyanmisaka regs->reg_s3.lvl8_intra_CST_THD0.lvl8_intra_cst_thd1 = 4;
1935*437bfbebSnyanmisaka regs->reg_s3.lvl8_intra_CST_THD1.lvl8_intra_cst_thd2 = 9;
1936*437bfbebSnyanmisaka regs->reg_s3.lvl8_intra_CST_THD1.lvl8_intra_cst_thd3 = 36;
1937*437bfbebSnyanmisaka
1938*437bfbebSnyanmisaka regs->reg_s3.lvl16_intra_UL_CST_THD.lvl16_intra_ul_cst_thld = 0;
1939*437bfbebSnyanmisaka regs->reg_s3.lvl32_intra_CST_WGT0.lvl8_intra_cst_wgt0 = 48;
1940*437bfbebSnyanmisaka regs->reg_s3.lvl32_intra_CST_WGT0.lvl8_intra_cst_wgt1 = 60;
1941*437bfbebSnyanmisaka regs->reg_s3.lvl32_intra_CST_WGT0.lvl8_intra_cst_wgt2 = 40;
1942*437bfbebSnyanmisaka regs->reg_s3.lvl32_intra_CST_WGT0.lvl8_intra_cst_wgt3 = 48;
1943*437bfbebSnyanmisaka
1944*437bfbebSnyanmisaka regs->reg_s3.lvl32_intra_CST_WGT1.lvl4_intra_cst_wgt0 = 48;
1945*437bfbebSnyanmisaka regs->reg_s3.lvl32_intra_CST_WGT1.lvl4_intra_cst_wgt1 = 60;
1946*437bfbebSnyanmisaka regs->reg_s3.lvl32_intra_CST_WGT1.lvl4_intra_cst_wgt2 = 40;
1947*437bfbebSnyanmisaka regs->reg_s3.lvl32_intra_CST_WGT1.lvl4_intra_cst_wgt3 = 48;
1948*437bfbebSnyanmisaka
1949*437bfbebSnyanmisaka regs->reg_s3.lvl16_intra_CST_WGT0.lvl16_intra_cst_wgt0 = 48;
1950*437bfbebSnyanmisaka regs->reg_s3.lvl16_intra_CST_WGT0.lvl16_intra_cst_wgt1 = 60;
1951*437bfbebSnyanmisaka regs->reg_s3.lvl16_intra_CST_WGT0.lvl16_intra_cst_wgt2 = 40;
1952*437bfbebSnyanmisaka regs->reg_s3.lvl16_intra_CST_WGT0.lvl16_intra_cst_wgt3 = 48;
1953*437bfbebSnyanmisaka /* 0x1728 */
1954*437bfbebSnyanmisaka regs->reg_s3.lvl16_intra_CST_WGT1.lvl8_intra_chrm_cst_wgt0 = 36;
1955*437bfbebSnyanmisaka regs->reg_s3.lvl16_intra_CST_WGT1.lvl8_intra_chrm_cst_wgt1 = 42;
1956*437bfbebSnyanmisaka regs->reg_s3.lvl16_intra_CST_WGT1.lvl8_intra_chrm_cst_wgt2 = 28;
1957*437bfbebSnyanmisaka regs->reg_s3.lvl16_intra_CST_WGT1.lvl8_intra_chrm_cst_wgt3 = 32;
1958*437bfbebSnyanmisaka
1959*437bfbebSnyanmisaka regs->reg_s3.RDO_QUANT.quant_f_bias_P = 171;
1960*437bfbebSnyanmisaka
1961*437bfbebSnyanmisaka if (slice->slice_type == H264_I_SLICE) {
1962*437bfbebSnyanmisaka regs->reg_s3.RDO_QUANT.quant_f_bias_I = 683;
1963*437bfbebSnyanmisaka regs->reg_s3.ATR_THD0.atr_thd0 = 1;
1964*437bfbebSnyanmisaka regs->reg_s3.ATR_THD0.atr_thd1 = 4;
1965*437bfbebSnyanmisaka regs->reg_s3.ATR_THD1.atr_thd2 = 36;
1966*437bfbebSnyanmisaka } else {
1967*437bfbebSnyanmisaka regs->reg_s3.RDO_QUANT.quant_f_bias_I = 583;
1968*437bfbebSnyanmisaka regs->reg_s3.ATR_THD0.atr_thd0 = 4;
1969*437bfbebSnyanmisaka regs->reg_s3.ATR_THD0.atr_thd1 = 16;
1970*437bfbebSnyanmisaka regs->reg_s3.ATR_THD1.atr_thd2 = 81;
1971*437bfbebSnyanmisaka }
1972*437bfbebSnyanmisaka regs->reg_s3.ATR_THD1.atr_thdqp = 45;
1973*437bfbebSnyanmisaka
1974*437bfbebSnyanmisaka if (slice->slice_type == H264_I_SLICE) {
1975*437bfbebSnyanmisaka regs->reg_s3.Lvl16_ATR_WGT.lvl16_atr_wgt0 = 16;
1976*437bfbebSnyanmisaka regs->reg_s3.Lvl16_ATR_WGT.lvl16_atr_wgt1 = 16;
1977*437bfbebSnyanmisaka regs->reg_s3.Lvl16_ATR_WGT.lvl16_atr_wgt2 = 16;
1978*437bfbebSnyanmisaka
1979*437bfbebSnyanmisaka regs->reg_s3.Lvl8_ATR_WGT.lvl8_atr_wgt0 = 22;
1980*437bfbebSnyanmisaka regs->reg_s3.Lvl8_ATR_WGT.lvl8_atr_wgt1 = 21;
1981*437bfbebSnyanmisaka regs->reg_s3.Lvl8_ATR_WGT.lvl8_atr_wgt2 = 20;
1982*437bfbebSnyanmisaka
1983*437bfbebSnyanmisaka regs->reg_s3.Lvl4_ATR_WGT.lvl4_atr_wgt0 = 20;
1984*437bfbebSnyanmisaka regs->reg_s3.Lvl4_ATR_WGT.lvl4_atr_wgt1 = 18;
1985*437bfbebSnyanmisaka regs->reg_s3.Lvl4_ATR_WGT.lvl4_atr_wgt2 = 16;
1986*437bfbebSnyanmisaka } else {
1987*437bfbebSnyanmisaka regs->reg_s3.Lvl16_ATR_WGT.lvl16_atr_wgt0 = 25;
1988*437bfbebSnyanmisaka regs->reg_s3.Lvl16_ATR_WGT.lvl16_atr_wgt1 = 20;
1989*437bfbebSnyanmisaka regs->reg_s3.Lvl16_ATR_WGT.lvl16_atr_wgt2 = 16;
1990*437bfbebSnyanmisaka
1991*437bfbebSnyanmisaka regs->reg_s3.Lvl8_ATR_WGT.lvl8_atr_wgt0 = 25;
1992*437bfbebSnyanmisaka regs->reg_s3.Lvl8_ATR_WGT.lvl8_atr_wgt1 = 20;
1993*437bfbebSnyanmisaka regs->reg_s3.Lvl8_ATR_WGT.lvl8_atr_wgt2 = 18;
1994*437bfbebSnyanmisaka
1995*437bfbebSnyanmisaka regs->reg_s3.Lvl4_ATR_WGT.lvl4_atr_wgt0 = 25;
1996*437bfbebSnyanmisaka regs->reg_s3.Lvl4_ATR_WGT.lvl4_atr_wgt1 = 20;
1997*437bfbebSnyanmisaka regs->reg_s3.Lvl4_ATR_WGT.lvl4_atr_wgt2 = 16;
1998*437bfbebSnyanmisaka }
1999*437bfbebSnyanmisaka /* CIME */
2000*437bfbebSnyanmisaka {
2001*437bfbebSnyanmisaka /* 0x1760 */
2002*437bfbebSnyanmisaka regs->reg_s3.cime_sqi_cfg.cime_sad_mod_sel = 0;
2003*437bfbebSnyanmisaka regs->reg_s3.cime_sqi_cfg.cime_sad_use_big_block = 1;
2004*437bfbebSnyanmisaka regs->reg_s3.cime_sqi_cfg.cime_pmv_set_zero = 1;
2005*437bfbebSnyanmisaka regs->reg_s3.cime_sqi_cfg.cime_pmv_num = 3;
2006*437bfbebSnyanmisaka
2007*437bfbebSnyanmisaka /* 0x1764 */
2008*437bfbebSnyanmisaka regs->reg_s3.cime_sqi_thd.cime_mvd_th0 = 32;
2009*437bfbebSnyanmisaka regs->reg_s3.cime_sqi_thd.cime_mvd_th1 = 80;
2010*437bfbebSnyanmisaka regs->reg_s3.cime_sqi_thd.cime_mvd_th2 = 128;
2011*437bfbebSnyanmisaka
2012*437bfbebSnyanmisaka /* 0x1768 */
2013*437bfbebSnyanmisaka regs->reg_s3.cime_sqi_multi0.cime_multi0 = 4;
2014*437bfbebSnyanmisaka regs->reg_s3.cime_sqi_multi0.cime_multi1 = 8;
2015*437bfbebSnyanmisaka regs->reg_s3.cime_sqi_multi1.cime_multi2 = 24;
2016*437bfbebSnyanmisaka regs->reg_s3.cime_sqi_multi1.cime_multi3 = 24;
2017*437bfbebSnyanmisaka }
2018*437bfbebSnyanmisaka
2019*437bfbebSnyanmisaka /* RIME && FME */
2020*437bfbebSnyanmisaka {
2021*437bfbebSnyanmisaka /* 0x1770 */
2022*437bfbebSnyanmisaka regs->reg_s3.rime_sqi_thd.cime_sad_th0 = 50;
2023*437bfbebSnyanmisaka regs->reg_s3.rime_sqi_thd.rime_mvd_th0 = 3;
2024*437bfbebSnyanmisaka regs->reg_s3.rime_sqi_thd.rime_mvd_th1 = 8;
2025*437bfbebSnyanmisaka regs->reg_s3.rime_sqi_multi.rime_multi0 = 4;
2026*437bfbebSnyanmisaka regs->reg_s3.rime_sqi_multi.rime_multi1 = 32;
2027*437bfbebSnyanmisaka regs->reg_s3.rime_sqi_multi.rime_multi2 = 128;
2028*437bfbebSnyanmisaka
2029*437bfbebSnyanmisaka /* 0x1778 */
2030*437bfbebSnyanmisaka regs->reg_s3.fme_sqi_thd0.cime_sad_pu16_th = 2;
2031*437bfbebSnyanmisaka
2032*437bfbebSnyanmisaka /* 0x177C */
2033*437bfbebSnyanmisaka regs->reg_s3.fme_sqi_thd1.move_lambda = 1;
2034*437bfbebSnyanmisaka }
2035*437bfbebSnyanmisaka
2036*437bfbebSnyanmisaka if (slice->slice_type == H264_I_SLICE) {
2037*437bfbebSnyanmisaka for (i = 0; i < MPP_ARRAY_ELEMS(h264_aq_tthd_default); i++) {
2038*437bfbebSnyanmisaka regs->reg_rc_klut.aq_tthd[i] = hw->aq_thrd_i[i];
2039*437bfbebSnyanmisaka regs->reg_rc_klut.aq_step[i] = hw->aq_step_i[i] & 0x3f;
2040*437bfbebSnyanmisaka }
2041*437bfbebSnyanmisaka } else {
2042*437bfbebSnyanmisaka for (i = 0; i < MPP_ARRAY_ELEMS(h264_P_aq_step_default); i++) {
2043*437bfbebSnyanmisaka regs->reg_rc_klut.aq_tthd[i] = hw->aq_thrd_p[i];
2044*437bfbebSnyanmisaka regs->reg_rc_klut.aq_step[i] = hw->aq_step_p[i] & 0x3f;
2045*437bfbebSnyanmisaka }
2046*437bfbebSnyanmisaka }
2047*437bfbebSnyanmisaka
2048*437bfbebSnyanmisaka hal_h264e_dbg_func("leave\n");
2049*437bfbebSnyanmisaka }
2050*437bfbebSnyanmisaka
setup_vepu580_ext_line_buf(HalVepu580RegSet * regs,HalH264eVepu580Ctx * ctx)2051*437bfbebSnyanmisaka static void setup_vepu580_ext_line_buf(HalVepu580RegSet *regs, HalH264eVepu580Ctx *ctx)
2052*437bfbebSnyanmisaka {
2053*437bfbebSnyanmisaka RK_S32 offset = 0;
2054*437bfbebSnyanmisaka RK_S32 fd;
2055*437bfbebSnyanmisaka
2056*437bfbebSnyanmisaka if (!ctx->ext_line_buf) {
2057*437bfbebSnyanmisaka regs->reg_base.ebufb_addr = 0;
2058*437bfbebSnyanmisaka regs->reg_base.ebufb_addr = 0;
2059*437bfbebSnyanmisaka return;
2060*437bfbebSnyanmisaka }
2061*437bfbebSnyanmisaka
2062*437bfbebSnyanmisaka fd = mpp_buffer_get_fd(ctx->ext_line_buf);
2063*437bfbebSnyanmisaka offset = ctx->ext_line_buf_size;
2064*437bfbebSnyanmisaka
2065*437bfbebSnyanmisaka regs->reg_base.ebuft_addr = fd;
2066*437bfbebSnyanmisaka regs->reg_base.ebufb_addr = fd;
2067*437bfbebSnyanmisaka
2068*437bfbebSnyanmisaka mpp_dev_multi_offset_update(ctx->offsets, 182, offset);
2069*437bfbebSnyanmisaka
2070*437bfbebSnyanmisaka /* rcb info for sram */
2071*437bfbebSnyanmisaka if (!disable_rcb_buf) {
2072*437bfbebSnyanmisaka MppDevRcbInfoCfg rcb_cfg;
2073*437bfbebSnyanmisaka
2074*437bfbebSnyanmisaka rcb_cfg.reg_idx = 183;
2075*437bfbebSnyanmisaka rcb_cfg.size = offset;
2076*437bfbebSnyanmisaka
2077*437bfbebSnyanmisaka mpp_dev_ioctl(ctx->dev, MPP_DEV_RCB_INFO, &rcb_cfg);
2078*437bfbebSnyanmisaka
2079*437bfbebSnyanmisaka rcb_cfg.reg_idx = 182;
2080*437bfbebSnyanmisaka rcb_cfg.size = 0;
2081*437bfbebSnyanmisaka
2082*437bfbebSnyanmisaka mpp_dev_ioctl(ctx->dev, MPP_DEV_RCB_INFO, &rcb_cfg);
2083*437bfbebSnyanmisaka }
2084*437bfbebSnyanmisaka }
2085*437bfbebSnyanmisaka
setup_vepu580_dual_core(HalH264eVepu580Ctx * ctx,H264SliceType slice_type)2086*437bfbebSnyanmisaka static MPP_RET setup_vepu580_dual_core(HalH264eVepu580Ctx *ctx, H264SliceType slice_type)
2087*437bfbebSnyanmisaka {
2088*437bfbebSnyanmisaka Vepu580BaseCfg *reg_base = &ctx->regs_set->reg_base;
2089*437bfbebSnyanmisaka RK_U32 dchs_ofst = 9;
2090*437bfbebSnyanmisaka RK_U32 dchs_rxe = 1;
2091*437bfbebSnyanmisaka
2092*437bfbebSnyanmisaka if (ctx->task_cnt == 1)
2093*437bfbebSnyanmisaka return MPP_OK;
2094*437bfbebSnyanmisaka
2095*437bfbebSnyanmisaka if (slice_type == H264_I_SLICE) {
2096*437bfbebSnyanmisaka ctx->curr_idx = 0;
2097*437bfbebSnyanmisaka ctx->prev_idx = 0;
2098*437bfbebSnyanmisaka dchs_rxe = 0;
2099*437bfbebSnyanmisaka }
2100*437bfbebSnyanmisaka
2101*437bfbebSnyanmisaka reg_base->dual_core.dchs_txid = ctx->curr_idx;
2102*437bfbebSnyanmisaka reg_base->dual_core.dchs_rxid = ctx->prev_idx;
2103*437bfbebSnyanmisaka reg_base->dual_core.dchs_txe = 1;
2104*437bfbebSnyanmisaka reg_base->dual_core.dchs_rxe = dchs_rxe;
2105*437bfbebSnyanmisaka reg_base->dual_core.dchs_ofst = dchs_ofst;
2106*437bfbebSnyanmisaka
2107*437bfbebSnyanmisaka ctx->prev_idx = ctx->curr_idx++;
2108*437bfbebSnyanmisaka if (ctx->curr_idx > 3)
2109*437bfbebSnyanmisaka ctx->curr_idx = 0;
2110*437bfbebSnyanmisaka
2111*437bfbebSnyanmisaka return MPP_OK;
2112*437bfbebSnyanmisaka }
2113*437bfbebSnyanmisaka
hal_h264e_vepu580_gen_regs(void * hal,HalEncTask * task)2114*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu580_gen_regs(void *hal, HalEncTask *task)
2115*437bfbebSnyanmisaka {
2116*437bfbebSnyanmisaka HalH264eVepu580Ctx *ctx = (HalH264eVepu580Ctx *)hal;
2117*437bfbebSnyanmisaka HalVepu580RegSet *regs = ctx->regs_set;
2118*437bfbebSnyanmisaka MppEncCfgSet *cfg = ctx->cfg;
2119*437bfbebSnyanmisaka H264eSps *sps = ctx->sps;
2120*437bfbebSnyanmisaka H264ePps *pps = ctx->pps;
2121*437bfbebSnyanmisaka H264eSlice *slice = ctx->slice;
2122*437bfbebSnyanmisaka EncRcTask *rc_task = task->rc_task;
2123*437bfbebSnyanmisaka EncFrmStatus *frm = &rc_task->frm;
2124*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
2125*437bfbebSnyanmisaka EncFrmStatus *frm_status = &task->rc_task->frm;
2126*437bfbebSnyanmisaka
2127*437bfbebSnyanmisaka hal_h264e_dbg_func("enter %p\n", hal);
2128*437bfbebSnyanmisaka hal_h264e_dbg_detail("frame %d generate regs now", ctx->frms->seq_idx);
2129*437bfbebSnyanmisaka
2130*437bfbebSnyanmisaka /* register setup */
2131*437bfbebSnyanmisaka memset(regs, 0, sizeof(*regs));
2132*437bfbebSnyanmisaka
2133*437bfbebSnyanmisaka setup_vepu580_normal(regs);
2134*437bfbebSnyanmisaka ret = setup_vepu580_prep(regs, &ctx->cfg->prep, task);
2135*437bfbebSnyanmisaka if (ret)
2136*437bfbebSnyanmisaka return ret;
2137*437bfbebSnyanmisaka
2138*437bfbebSnyanmisaka setup_vepu580_dual_core(ctx, slice->slice_type);
2139*437bfbebSnyanmisaka setup_vepu580_codec(regs, sps, pps, slice);
2140*437bfbebSnyanmisaka setup_vepu580_rdo_pred(regs, sps, pps, slice);
2141*437bfbebSnyanmisaka setup_vepu580_rdo_cfg(®s->reg_rdo);
2142*437bfbebSnyanmisaka setup_vepu580_rdo_bias_cfg(®s->reg_rdo, &cfg->hw);
2143*437bfbebSnyanmisaka
2144*437bfbebSnyanmisaka // scl cfg
2145*437bfbebSnyanmisaka memcpy(®s->reg_scl, vepu580_540_h264_flat_scl_tab, sizeof(vepu580_540_h264_flat_scl_tab));
2146*437bfbebSnyanmisaka
2147*437bfbebSnyanmisaka setup_vepu580_rc_base(regs, ctx, rc_task);
2148*437bfbebSnyanmisaka setup_vepu580_io_buf(regs, ctx->offsets, task);
2149*437bfbebSnyanmisaka setup_vepu580_roi(regs, ctx);
2150*437bfbebSnyanmisaka setup_vepu580_recn_refr(ctx, regs);
2151*437bfbebSnyanmisaka
2152*437bfbebSnyanmisaka regs->reg_base.meiw_addr = task->md_info ? mpp_buffer_get_fd(task->md_info) : 0;
2153*437bfbebSnyanmisaka regs->reg_base.enc_pic.mei_stor = task->md_info ? 1 : 0;
2154*437bfbebSnyanmisaka regs->reg_base.pic_ofst.pic_ofst_y = mpp_frame_get_offset_y(task->frame);
2155*437bfbebSnyanmisaka regs->reg_base.pic_ofst.pic_ofst_x = mpp_frame_get_offset_x(task->frame);
2156*437bfbebSnyanmisaka
2157*437bfbebSnyanmisaka setup_vepu580_split(regs, cfg);
2158*437bfbebSnyanmisaka setup_vepu580_me(regs, sps, slice);
2159*437bfbebSnyanmisaka
2160*437bfbebSnyanmisaka if (frm_status->is_i_refresh)
2161*437bfbebSnyanmisaka setup_vepu580_intra_refresh(regs, ctx, frm_status->seq_idx % cfg->rc.gop);
2162*437bfbebSnyanmisaka
2163*437bfbebSnyanmisaka if (cfg->tune.deblur_en && (!rc_task->info.complex_scene) &&
2164*437bfbebSnyanmisaka cfg->rc.rc_mode == MPP_ENC_RC_MODE_SMTRC &&
2165*437bfbebSnyanmisaka cfg->tune.scene_mode == MPP_ENC_SCENE_MODE_IPC) {
2166*437bfbebSnyanmisaka if (MPP_OK != setup_vepu580_qpmap_buf(ctx))
2167*437bfbebSnyanmisaka mpp_err("qpmap malloc buffer failed!\n");
2168*437bfbebSnyanmisaka }
2169*437bfbebSnyanmisaka
2170*437bfbebSnyanmisaka vepu580_set_osd(&ctx->osd_cfg);
2171*437bfbebSnyanmisaka setup_vepu580_l2(regs, slice, &cfg->hw);
2172*437bfbebSnyanmisaka setup_vepu580_ext_line_buf(regs, ctx);
2173*437bfbebSnyanmisaka vepu580_h264e_tune_reg_patch(ctx->tune);
2174*437bfbebSnyanmisaka
2175*437bfbebSnyanmisaka /* two pass register patch */
2176*437bfbebSnyanmisaka if (frm->save_pass1)
2177*437bfbebSnyanmisaka vepu580_h264e_save_pass1_patch(regs, ctx);
2178*437bfbebSnyanmisaka
2179*437bfbebSnyanmisaka if (frm->use_pass1)
2180*437bfbebSnyanmisaka vepu580_h264e_use_pass1_patch(regs, ctx);
2181*437bfbebSnyanmisaka
2182*437bfbebSnyanmisaka ctx->frame_cnt++;
2183*437bfbebSnyanmisaka
2184*437bfbebSnyanmisaka hal_h264e_dbg_func("leave %p\n", hal);
2185*437bfbebSnyanmisaka return MPP_OK;
2186*437bfbebSnyanmisaka }
2187*437bfbebSnyanmisaka
hal_h264e_vepu580_start(void * hal,HalEncTask * task)2188*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu580_start(void *hal, HalEncTask *task)
2189*437bfbebSnyanmisaka {
2190*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
2191*437bfbebSnyanmisaka HalH264eVepu580Ctx *ctx = (HalH264eVepu580Ctx *)hal;
2192*437bfbebSnyanmisaka HalVepu580RegSet *regs = ctx->regs_set;
2193*437bfbebSnyanmisaka
2194*437bfbebSnyanmisaka (void) task;
2195*437bfbebSnyanmisaka
2196*437bfbebSnyanmisaka hal_h264e_dbg_func("enter %p\n", hal);
2197*437bfbebSnyanmisaka
2198*437bfbebSnyanmisaka do {
2199*437bfbebSnyanmisaka MppDevRegWrCfg wr_cfg;
2200*437bfbebSnyanmisaka MppDevRegRdCfg rd_cfg;
2201*437bfbebSnyanmisaka
2202*437bfbebSnyanmisaka wr_cfg.reg = ®s->reg_ctl;
2203*437bfbebSnyanmisaka wr_cfg.size = sizeof(regs->reg_ctl);
2204*437bfbebSnyanmisaka wr_cfg.offset = VEPU580_CONTROL_CFG_OFFSET;
2205*437bfbebSnyanmisaka #if DUMP_REG
2206*437bfbebSnyanmisaka {
2207*437bfbebSnyanmisaka RK_U32 i;
2208*437bfbebSnyanmisaka RK_U32 *reg = (RK_U32)wr_cfg.reg;
2209*437bfbebSnyanmisaka for ( i = 0; i < sizeof(regs->reg_ctl) / sizeof(RK_U32); i++) {
2210*437bfbebSnyanmisaka /* code */
2211*437bfbebSnyanmisaka mpp_log("reg[%d] = 0x%08x\n", i, reg[i]);
2212*437bfbebSnyanmisaka }
2213*437bfbebSnyanmisaka
2214*437bfbebSnyanmisaka }
2215*437bfbebSnyanmisaka #endif
2216*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
2217*437bfbebSnyanmisaka if (ret) {
2218*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2219*437bfbebSnyanmisaka break;
2220*437bfbebSnyanmisaka }
2221*437bfbebSnyanmisaka wr_cfg.reg = ®s->reg_base;
2222*437bfbebSnyanmisaka wr_cfg.size = sizeof(regs->reg_base);
2223*437bfbebSnyanmisaka wr_cfg.offset = VEPU580_BASE_CFG_OFFSET;
2224*437bfbebSnyanmisaka
2225*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
2226*437bfbebSnyanmisaka if (ret) {
2227*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2228*437bfbebSnyanmisaka break;
2229*437bfbebSnyanmisaka }
2230*437bfbebSnyanmisaka wr_cfg.reg = ®s->reg_rc_klut;
2231*437bfbebSnyanmisaka wr_cfg.size = sizeof(regs->reg_rc_klut);
2232*437bfbebSnyanmisaka wr_cfg.offset = VEPU580_RC_KLUT_CFG_OFFSET;
2233*437bfbebSnyanmisaka
2234*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
2235*437bfbebSnyanmisaka if (ret) {
2236*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2237*437bfbebSnyanmisaka break;
2238*437bfbebSnyanmisaka }
2239*437bfbebSnyanmisaka wr_cfg.reg = ®s->reg_s3;
2240*437bfbebSnyanmisaka wr_cfg.size = sizeof(regs->reg_s3);
2241*437bfbebSnyanmisaka wr_cfg.offset = VEPU580_SECTION_3_OFFSET;
2242*437bfbebSnyanmisaka
2243*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
2244*437bfbebSnyanmisaka if (ret) {
2245*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2246*437bfbebSnyanmisaka break;
2247*437bfbebSnyanmisaka }
2248*437bfbebSnyanmisaka wr_cfg.reg = ®s->reg_rdo;
2249*437bfbebSnyanmisaka wr_cfg.size = sizeof(regs->reg_rdo);
2250*437bfbebSnyanmisaka wr_cfg.offset = VEPU580_RDO_CFG_OFFSET;
2251*437bfbebSnyanmisaka
2252*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
2253*437bfbebSnyanmisaka if (ret) {
2254*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2255*437bfbebSnyanmisaka break;
2256*437bfbebSnyanmisaka }
2257*437bfbebSnyanmisaka
2258*437bfbebSnyanmisaka wr_cfg.reg = ®s->reg_scl;
2259*437bfbebSnyanmisaka wr_cfg.size = sizeof(regs->reg_scl);
2260*437bfbebSnyanmisaka wr_cfg.offset = VEPU580_SCL_CFG_OFFSET;
2261*437bfbebSnyanmisaka
2262*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
2263*437bfbebSnyanmisaka if (ret) {
2264*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2265*437bfbebSnyanmisaka break;
2266*437bfbebSnyanmisaka }
2267*437bfbebSnyanmisaka
2268*437bfbebSnyanmisaka wr_cfg.reg = ®s->reg_osd;
2269*437bfbebSnyanmisaka wr_cfg.size = sizeof(regs->reg_osd);
2270*437bfbebSnyanmisaka wr_cfg.offset = VEPU580_OSD_OFFSET;
2271*437bfbebSnyanmisaka
2272*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
2273*437bfbebSnyanmisaka if (ret) {
2274*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
2275*437bfbebSnyanmisaka break;
2276*437bfbebSnyanmisaka }
2277*437bfbebSnyanmisaka
2278*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_OFFS, ctx->offsets);
2279*437bfbebSnyanmisaka if (ret) {
2280*437bfbebSnyanmisaka mpp_err_f("set register offsets failed %d\n", ret);
2281*437bfbebSnyanmisaka break;
2282*437bfbebSnyanmisaka }
2283*437bfbebSnyanmisaka
2284*437bfbebSnyanmisaka rd_cfg.reg = ®s->reg_ctl.int_sta;
2285*437bfbebSnyanmisaka rd_cfg.size = sizeof(RK_U32);
2286*437bfbebSnyanmisaka rd_cfg.offset = VEPU580_REG_BASE_HW_STATUS;
2287*437bfbebSnyanmisaka
2288*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &rd_cfg);
2289*437bfbebSnyanmisaka if (ret) {
2290*437bfbebSnyanmisaka mpp_err_f("set register read failed %d\n", ret);
2291*437bfbebSnyanmisaka break;
2292*437bfbebSnyanmisaka }
2293*437bfbebSnyanmisaka
2294*437bfbebSnyanmisaka rd_cfg.reg = ®s->reg_st;
2295*437bfbebSnyanmisaka rd_cfg.size = sizeof(regs->reg_st);
2296*437bfbebSnyanmisaka rd_cfg.offset = VEPU580_STATUS_OFFSET;
2297*437bfbebSnyanmisaka
2298*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &rd_cfg);
2299*437bfbebSnyanmisaka if (ret) {
2300*437bfbebSnyanmisaka mpp_err_f("set register read failed %d\n", ret);
2301*437bfbebSnyanmisaka break;
2302*437bfbebSnyanmisaka }
2303*437bfbebSnyanmisaka
2304*437bfbebSnyanmisaka /* send request to hardware */
2305*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
2306*437bfbebSnyanmisaka if (ret) {
2307*437bfbebSnyanmisaka mpp_err_f("send cmd failed %d\n", ret);
2308*437bfbebSnyanmisaka break;
2309*437bfbebSnyanmisaka }
2310*437bfbebSnyanmisaka } while (0);
2311*437bfbebSnyanmisaka
2312*437bfbebSnyanmisaka hal_h264e_dbg_func("leave %p\n", hal);
2313*437bfbebSnyanmisaka
2314*437bfbebSnyanmisaka return ret;
2315*437bfbebSnyanmisaka }
2316*437bfbebSnyanmisaka
hal_h264e_vepu580_status_check(HalVepu580RegSet * regs)2317*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu580_status_check(HalVepu580RegSet *regs)
2318*437bfbebSnyanmisaka {
2319*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
2320*437bfbebSnyanmisaka
2321*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.lkt_node_done_sta)
2322*437bfbebSnyanmisaka hal_h264e_dbg_detail("lkt_done finish");
2323*437bfbebSnyanmisaka
2324*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.enc_done_sta)
2325*437bfbebSnyanmisaka hal_h264e_dbg_detail("enc_done finish");
2326*437bfbebSnyanmisaka
2327*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.slc_done_sta)
2328*437bfbebSnyanmisaka hal_h264e_dbg_detail("enc_slice finsh");
2329*437bfbebSnyanmisaka
2330*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.sclr_done_sta)
2331*437bfbebSnyanmisaka hal_h264e_dbg_detail("safe clear finsh");
2332*437bfbebSnyanmisaka
2333*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.bsf_oflw_sta) {
2334*437bfbebSnyanmisaka mpp_err_f("bit stream overflow");
2335*437bfbebSnyanmisaka ret = MPP_NOK;
2336*437bfbebSnyanmisaka }
2337*437bfbebSnyanmisaka
2338*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.brsp_otsd_sta) {
2339*437bfbebSnyanmisaka mpp_err_f("bus write full");
2340*437bfbebSnyanmisaka ret = MPP_NOK;
2341*437bfbebSnyanmisaka }
2342*437bfbebSnyanmisaka
2343*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.wbus_err_sta) {
2344*437bfbebSnyanmisaka mpp_err_f("bus write error");
2345*437bfbebSnyanmisaka ret = MPP_NOK;
2346*437bfbebSnyanmisaka }
2347*437bfbebSnyanmisaka
2348*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.rbus_err_sta) {
2349*437bfbebSnyanmisaka mpp_err_f("bus read error");
2350*437bfbebSnyanmisaka ret = MPP_NOK;
2351*437bfbebSnyanmisaka }
2352*437bfbebSnyanmisaka
2353*437bfbebSnyanmisaka if (regs->reg_ctl.int_sta.wdg_sta) {
2354*437bfbebSnyanmisaka ret = MPP_NOK;
2355*437bfbebSnyanmisaka mpp_err_f("wdg timeout");
2356*437bfbebSnyanmisaka }
2357*437bfbebSnyanmisaka
2358*437bfbebSnyanmisaka return ret;
2359*437bfbebSnyanmisaka }
2360*437bfbebSnyanmisaka
hal_h264e_vepu580_wait(void * hal,HalEncTask * task)2361*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu580_wait(void *hal, HalEncTask *task)
2362*437bfbebSnyanmisaka {
2363*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
2364*437bfbebSnyanmisaka HalH264eVepu580Ctx *ctx = (HalH264eVepu580Ctx *)hal;
2365*437bfbebSnyanmisaka HalVepu580RegSet *regs = &ctx->regs_sets[task->flags.reg_idx];
2366*437bfbebSnyanmisaka RK_U32 split_out = ctx->cfg->split.split_out;
2367*437bfbebSnyanmisaka MppPacket pkt = task->packet;
2368*437bfbebSnyanmisaka RK_S32 offset = mpp_packet_get_length(pkt);
2369*437bfbebSnyanmisaka H264NaluType type = task->rc_task->frm.is_idr ? H264_NALU_TYPE_IDR : H264_NALU_TYPE_SLICE;
2370*437bfbebSnyanmisaka MppEncH264HwCfg *hw_cfg = &ctx->cfg->h264.hw_cfg;
2371*437bfbebSnyanmisaka RK_S32 i;
2372*437bfbebSnyanmisaka
2373*437bfbebSnyanmisaka hal_h264e_dbg_func("enter %p\n", hal);
2374*437bfbebSnyanmisaka
2375*437bfbebSnyanmisaka /* if pass1 mode, it will disable split mode and the split out need to be disable */
2376*437bfbebSnyanmisaka if (task->rc_task->frm.save_pass1)
2377*437bfbebSnyanmisaka split_out = 0;
2378*437bfbebSnyanmisaka
2379*437bfbebSnyanmisaka /* update split_out in hw_cfg */
2380*437bfbebSnyanmisaka hw_cfg->hw_split_out = split_out;
2381*437bfbebSnyanmisaka
2382*437bfbebSnyanmisaka if (split_out) {
2383*437bfbebSnyanmisaka EncOutParam param;
2384*437bfbebSnyanmisaka RK_U32 slice_len;
2385*437bfbebSnyanmisaka RK_U32 slice_last;
2386*437bfbebSnyanmisaka MppDevPollCfg *poll_cfg = (MppDevPollCfg *)((char *)ctx->poll_cfgs +
2387*437bfbebSnyanmisaka task->flags.reg_idx * ctx->poll_cfg_size);
2388*437bfbebSnyanmisaka param.task = task;
2389*437bfbebSnyanmisaka param.base = mpp_packet_get_data(task->packet);
2390*437bfbebSnyanmisaka
2391*437bfbebSnyanmisaka do {
2392*437bfbebSnyanmisaka poll_cfg->poll_type = 0;
2393*437bfbebSnyanmisaka poll_cfg->poll_ret = 0;
2394*437bfbebSnyanmisaka poll_cfg->count_max = split_out & MPP_ENC_SPLIT_OUT_LOWDELAY ? 1 : ctx->poll_slice_max;
2395*437bfbebSnyanmisaka poll_cfg->count_ret = 0;
2396*437bfbebSnyanmisaka
2397*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, poll_cfg);
2398*437bfbebSnyanmisaka
2399*437bfbebSnyanmisaka for (i = 0; i < poll_cfg->count_ret; i++) {
2400*437bfbebSnyanmisaka slice_last = poll_cfg->slice_info[i].last;
2401*437bfbebSnyanmisaka slice_len = poll_cfg->slice_info[i].length;
2402*437bfbebSnyanmisaka
2403*437bfbebSnyanmisaka mpp_packet_add_segment_info(pkt, type, offset, slice_len);
2404*437bfbebSnyanmisaka offset += slice_len;
2405*437bfbebSnyanmisaka
2406*437bfbebSnyanmisaka if (split_out & MPP_ENC_SPLIT_OUT_LOWDELAY) {
2407*437bfbebSnyanmisaka param.length = slice_len;
2408*437bfbebSnyanmisaka
2409*437bfbebSnyanmisaka if (slice_last)
2410*437bfbebSnyanmisaka ctx->output_cb->cmd = ENC_OUTPUT_FINISH;
2411*437bfbebSnyanmisaka else
2412*437bfbebSnyanmisaka ctx->output_cb->cmd = ENC_OUTPUT_SLICE;
2413*437bfbebSnyanmisaka
2414*437bfbebSnyanmisaka mpp_callback(ctx->output_cb, ¶m);
2415*437bfbebSnyanmisaka }
2416*437bfbebSnyanmisaka }
2417*437bfbebSnyanmisaka } while (!slice_last);
2418*437bfbebSnyanmisaka
2419*437bfbebSnyanmisaka ret = hal_h264e_vepu580_status_check(regs);
2420*437bfbebSnyanmisaka if (!ret)
2421*437bfbebSnyanmisaka task->hw_length += regs->reg_st.bs_lgth_l32;
2422*437bfbebSnyanmisaka } else {
2423*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
2424*437bfbebSnyanmisaka if (ret) {
2425*437bfbebSnyanmisaka mpp_err_f("poll cmd failed %d\n", ret);
2426*437bfbebSnyanmisaka ret = MPP_ERR_VPUHW;
2427*437bfbebSnyanmisaka } else {
2428*437bfbebSnyanmisaka ret = hal_h264e_vepu580_status_check(regs);
2429*437bfbebSnyanmisaka if (!ret)
2430*437bfbebSnyanmisaka task->hw_length += regs->reg_st.bs_lgth_l32;
2431*437bfbebSnyanmisaka }
2432*437bfbebSnyanmisaka
2433*437bfbebSnyanmisaka mpp_packet_add_segment_info(pkt, type, offset, regs->reg_st.bs_lgth_l32);
2434*437bfbebSnyanmisaka }
2435*437bfbebSnyanmisaka
2436*437bfbebSnyanmisaka if (!(split_out & MPP_ENC_SPLIT_OUT_LOWDELAY) && !ret) {
2437*437bfbebSnyanmisaka HalH264eVepuStreamAmend *amend = &ctx->amend_sets[task->flags.reg_idx];
2438*437bfbebSnyanmisaka
2439*437bfbebSnyanmisaka if (amend->enable) {
2440*437bfbebSnyanmisaka amend->old_length = task->hw_length;
2441*437bfbebSnyanmisaka amend->slice->is_multi_slice = (ctx->cfg->split.split_mode > 0);
2442*437bfbebSnyanmisaka h264e_vepu_stream_amend_proc(amend, &ctx->cfg->h264.hw_cfg);
2443*437bfbebSnyanmisaka task->hw_length = amend->new_length;
2444*437bfbebSnyanmisaka } else if (amend->prefix) {
2445*437bfbebSnyanmisaka /* check prefix value */
2446*437bfbebSnyanmisaka amend->old_length = task->hw_length;
2447*437bfbebSnyanmisaka h264e_vepu_stream_amend_sync_ref_idc(amend);
2448*437bfbebSnyanmisaka }
2449*437bfbebSnyanmisaka }
2450*437bfbebSnyanmisaka
2451*437bfbebSnyanmisaka hal_h264e_dbg_func("leave %p ret %d\n", hal, ret);
2452*437bfbebSnyanmisaka
2453*437bfbebSnyanmisaka return ret;
2454*437bfbebSnyanmisaka }
2455*437bfbebSnyanmisaka
hal_h264e_vepu580_ret_task(void * hal,HalEncTask * task)2456*437bfbebSnyanmisaka static MPP_RET hal_h264e_vepu580_ret_task(void * hal, HalEncTask * task)
2457*437bfbebSnyanmisaka {
2458*437bfbebSnyanmisaka HalH264eVepu580Ctx *ctx = (HalH264eVepu580Ctx *)hal;
2459*437bfbebSnyanmisaka HalVepu580RegSet *regs = &ctx->regs_sets[task->flags.reg_idx];
2460*437bfbebSnyanmisaka EncRcTaskInfo *rc_info = &task->rc_task->info;
2461*437bfbebSnyanmisaka RK_U32 mb_w = ctx->sps->pic_width_in_mbs;
2462*437bfbebSnyanmisaka RK_U32 mb_h = ctx->sps->pic_height_in_mbs;
2463*437bfbebSnyanmisaka RK_U32 mbs = mb_w * mb_h;
2464*437bfbebSnyanmisaka
2465*437bfbebSnyanmisaka hal_h264e_dbg_func("enter %p\n", hal);
2466*437bfbebSnyanmisaka
2467*437bfbebSnyanmisaka // update total hardware length
2468*437bfbebSnyanmisaka task->length += task->hw_length;
2469*437bfbebSnyanmisaka
2470*437bfbebSnyanmisaka // setup bit length for rate control
2471*437bfbebSnyanmisaka rc_info->bit_real = task->hw_length * 8;
2472*437bfbebSnyanmisaka rc_info->quality_real = regs->reg_st.qp_sum / mbs;
2473*437bfbebSnyanmisaka rc_info->madi = (!regs->reg_st.st_bnum_b16.num_b16) ? 0 :
2474*437bfbebSnyanmisaka regs->reg_st.madi / regs->reg_st.st_bnum_b16.num_b16;
2475*437bfbebSnyanmisaka rc_info->madp = (!regs->reg_st.st_bnum_cme.num_ctu) ? 0 :
2476*437bfbebSnyanmisaka regs->reg_st.madp / regs->reg_st.st_bnum_cme.num_ctu;
2477*437bfbebSnyanmisaka rc_info->iblk4_prop = (regs->reg_st.st_pnum_i4.pnum_i4 +
2478*437bfbebSnyanmisaka regs->reg_st.st_pnum_i8.pnum_i8 +
2479*437bfbebSnyanmisaka regs->reg_st.st_pnum_i16.pnum_i16) * 256 / mbs;
2480*437bfbebSnyanmisaka
2481*437bfbebSnyanmisaka rc_info->sse = ((RK_S64)regs->reg_st.sse_h32 << 16) + (regs->reg_st.st_sse_bsl.sse_l16 & 0xffff);
2482*437bfbebSnyanmisaka rc_info->lvl16_inter_num = regs->reg_st.st_pnum_p16.pnum_p16;
2483*437bfbebSnyanmisaka rc_info->lvl8_inter_num = regs->reg_st.st_pnum_p8.pnum_p8;
2484*437bfbebSnyanmisaka rc_info->lvl16_intra_num = regs->reg_st.st_pnum_i16.pnum_i16;
2485*437bfbebSnyanmisaka rc_info->lvl8_intra_num = regs->reg_st.st_pnum_i8.pnum_i8;
2486*437bfbebSnyanmisaka rc_info->lvl4_intra_num = regs->reg_st.st_pnum_i4.pnum_i4;
2487*437bfbebSnyanmisaka
2488*437bfbebSnyanmisaka ctx->hal_rc_cfg.bit_real = rc_info->bit_real;
2489*437bfbebSnyanmisaka ctx->hal_rc_cfg.quality_real = rc_info->quality_real;
2490*437bfbebSnyanmisaka ctx->hal_rc_cfg.iblk4_prop = rc_info->iblk4_prop;
2491*437bfbebSnyanmisaka
2492*437bfbebSnyanmisaka task->hal_ret.data = &ctx->hal_rc_cfg;
2493*437bfbebSnyanmisaka task->hal_ret.number = 1;
2494*437bfbebSnyanmisaka
2495*437bfbebSnyanmisaka //RK_U32 madi_th_cnt0 = ctx->regs_set->reg_st.madi_b16num0;
2496*437bfbebSnyanmisaka RK_U32 madi_th_cnt1 = ctx->regs_set->reg_st.madi_b16num1;
2497*437bfbebSnyanmisaka RK_U32 madi_th_cnt2 = ctx->regs_set->reg_st.madi_b16num2;
2498*437bfbebSnyanmisaka RK_U32 madi_th_cnt3 = ctx->regs_set->reg_st.madi_b16num3;
2499*437bfbebSnyanmisaka //RK_U32 madp_th_cnt0 = ctx->regs_set->reg_st.md_sad_b16num0;
2500*437bfbebSnyanmisaka RK_U32 madp_th_cnt1 = ctx->regs_set->reg_st.md_sad_b16num1;
2501*437bfbebSnyanmisaka RK_U32 madp_th_cnt2 = ctx->regs_set->reg_st.md_sad_b16num2;
2502*437bfbebSnyanmisaka RK_U32 madp_th_cnt3 = ctx->regs_set->reg_st.md_sad_b16num3;
2503*437bfbebSnyanmisaka
2504*437bfbebSnyanmisaka RK_U32 md_cnt = (24 * madp_th_cnt3 + 22 * madp_th_cnt2 + 17 * madp_th_cnt1) >> 2;
2505*437bfbebSnyanmisaka RK_U32 madi_cnt = (6 * madi_th_cnt3 + 5 * madi_th_cnt2 + 4 * madi_th_cnt1) >> 2;
2506*437bfbebSnyanmisaka
2507*437bfbebSnyanmisaka rc_info->motion_level = 0;
2508*437bfbebSnyanmisaka if (md_cnt * 100 > 15 * mbs)
2509*437bfbebSnyanmisaka rc_info->motion_level = 200;
2510*437bfbebSnyanmisaka else if (md_cnt * 100 > 5 * mbs)
2511*437bfbebSnyanmisaka rc_info->motion_level = 100;
2512*437bfbebSnyanmisaka else
2513*437bfbebSnyanmisaka rc_info->motion_level = 0;
2514*437bfbebSnyanmisaka
2515*437bfbebSnyanmisaka rc_info->complex_level = 0;
2516*437bfbebSnyanmisaka if (madi_cnt * 100 > 30 * mbs)
2517*437bfbebSnyanmisaka rc_info->complex_level = 2;
2518*437bfbebSnyanmisaka else if (madi_cnt * 100 > 13 * mbs)
2519*437bfbebSnyanmisaka rc_info->complex_level = 1;
2520*437bfbebSnyanmisaka else
2521*437bfbebSnyanmisaka rc_info->complex_level = 0;
2522*437bfbebSnyanmisaka
2523*437bfbebSnyanmisaka hal_h264e_dbg_rc("motion_level %u, complex_level %u\n", rc_info->motion_level, rc_info->complex_level);
2524*437bfbebSnyanmisaka
2525*437bfbebSnyanmisaka vepu580_h264e_tune_stat_update(ctx->tune, task);
2526*437bfbebSnyanmisaka
2527*437bfbebSnyanmisaka mpp_dev_multi_offset_reset(ctx->offsets);
2528*437bfbebSnyanmisaka
2529*437bfbebSnyanmisaka if (ctx->dpb) {
2530*437bfbebSnyanmisaka h264e_dpb_hal_end(ctx->dpb, task->flags.curr_idx);
2531*437bfbebSnyanmisaka h264e_dpb_hal_end(ctx->dpb, task->flags.refr_idx);
2532*437bfbebSnyanmisaka }
2533*437bfbebSnyanmisaka
2534*437bfbebSnyanmisaka hal_h264e_dbg_func("leave %p\n", hal);
2535*437bfbebSnyanmisaka
2536*437bfbebSnyanmisaka return MPP_OK;
2537*437bfbebSnyanmisaka }
2538*437bfbebSnyanmisaka
2539*437bfbebSnyanmisaka const MppEncHalApi hal_h264e_vepu580 = {
2540*437bfbebSnyanmisaka .name = "hal_h264e_vepu580",
2541*437bfbebSnyanmisaka .coding = MPP_VIDEO_CodingAVC,
2542*437bfbebSnyanmisaka .ctx_size = sizeof(HalH264eVepu580Ctx),
2543*437bfbebSnyanmisaka .flag = 0,
2544*437bfbebSnyanmisaka .init = hal_h264e_vepu580_init,
2545*437bfbebSnyanmisaka .deinit = hal_h264e_vepu580_deinit,
2546*437bfbebSnyanmisaka .prepare = hal_h264e_vepu580_prepare,
2547*437bfbebSnyanmisaka .get_task = hal_h264e_vepu580_get_task,
2548*437bfbebSnyanmisaka .gen_regs = hal_h264e_vepu580_gen_regs,
2549*437bfbebSnyanmisaka .start = hal_h264e_vepu580_start,
2550*437bfbebSnyanmisaka .wait = hal_h264e_vepu580_wait,
2551*437bfbebSnyanmisaka .part_start = NULL,
2552*437bfbebSnyanmisaka .part_wait = NULL,
2553*437bfbebSnyanmisaka .ret_task = hal_h264e_vepu580_ret_task,
2554*437bfbebSnyanmisaka };
2555