xref: /rockchip-linux_mpp/mpp/hal/vpu/vp8e/hal_vp8e_vepu2_v2.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2017 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_vp8e_vepu2_v2"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include "mpp_mem.h"
22*437bfbebSnyanmisaka #include "mpp_common.h"
23*437bfbebSnyanmisaka #include "mpp_enc_hal.h"
24*437bfbebSnyanmisaka #include "hal_vp8e_base.h"
25*437bfbebSnyanmisaka #include "hal_vp8e_vepu2_v2.h"
26*437bfbebSnyanmisaka #include "hal_vp8e_vepu2_reg.h"
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka #include "mpp_rc.h"
29*437bfbebSnyanmisaka #include "vp8e_syntax.h"
30*437bfbebSnyanmisaka #include "hal_vp8e_debug.h"
31*437bfbebSnyanmisaka 
32*437bfbebSnyanmisaka #define SWREG_AMOUNT_VEPU2  (184)
33*437bfbebSnyanmisaka #define HW_STATUS_MASK 0x250
34*437bfbebSnyanmisaka #define HW_STATUS_BUFFER_FULL 0x20
35*437bfbebSnyanmisaka #define HW_STATUS_FRAME_READY 0x02
36*437bfbebSnyanmisaka 
vp8e_vpu_frame_start(void * hal)37*437bfbebSnyanmisaka static MPP_RET vp8e_vpu_frame_start(void *hal)
38*437bfbebSnyanmisaka {
39*437bfbebSnyanmisaka     RK_S32 i;
40*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
41*437bfbebSnyanmisaka     Vp8eHwCfg *hw_cfg = &ctx->hw_cfg;
42*437bfbebSnyanmisaka     Vp8eVepu2Reg_t *regs = (Vp8eVepu2Reg_t *)ctx->regs;
43*437bfbebSnyanmisaka 
44*437bfbebSnyanmisaka     memset(regs, 0, sizeof(Vp8eVepu2Reg_t));
45*437bfbebSnyanmisaka 
46*437bfbebSnyanmisaka     regs->sw109.val = hw_cfg->irq_disable ? (regs->sw109.val | 0x0100) :
47*437bfbebSnyanmisaka                       (regs->sw109.val & 0xfeff);
48*437bfbebSnyanmisaka 
49*437bfbebSnyanmisaka     //((0 & (255)) << 24) | ((0 & (255)) << 16) | ((16 & (63)) << 8) | ((0 & (1)) << 2) | ((0 & (1)) << 1);
50*437bfbebSnyanmisaka     regs->sw54.val = 0x1000;
51*437bfbebSnyanmisaka 
52*437bfbebSnyanmisaka     if (hw_cfg->input_format < INPUT_RGB565) {
53*437bfbebSnyanmisaka         regs->sw105.val = 0xfc000000;
54*437bfbebSnyanmisaka     } else if (hw_cfg->input_format < INPUT_RGB888) {
55*437bfbebSnyanmisaka         regs->sw105.val = 0xfc000000;
56*437bfbebSnyanmisaka     } else {
57*437bfbebSnyanmisaka         regs->sw105.val = 0x3c000000;
58*437bfbebSnyanmisaka     }
59*437bfbebSnyanmisaka 
60*437bfbebSnyanmisaka     regs->sw77.base_stream =  hw_cfg->output_strm_base;
61*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(ctx->dev, 77, hw_cfg->output_strm_offset);
62*437bfbebSnyanmisaka     regs->sw78.base_control =  hw_cfg->size_tbl_base;
63*437bfbebSnyanmisaka     regs->sw74.nal_size_write =  hw_cfg->size_tbl_base != 0;
64*437bfbebSnyanmisaka     regs->sw109.mv_write =  hw_cfg->mv_output_base != 0;
65*437bfbebSnyanmisaka 
66*437bfbebSnyanmisaka     regs->sw56.base_ref_lum = hw_cfg->internal_img_lum_base_r[0];
67*437bfbebSnyanmisaka     regs->sw57.base_ref_chr = hw_cfg->internal_img_chr_base_r[0];
68*437bfbebSnyanmisaka     regs->sw63.base_rec_lum = hw_cfg->internal_img_lum_base_w;
69*437bfbebSnyanmisaka     regs->sw64.base_rec_chr = hw_cfg->internal_img_chr_base_w;
70*437bfbebSnyanmisaka 
71*437bfbebSnyanmisaka     regs->sw48.base_in_lum = hw_cfg->input_lum_base;
72*437bfbebSnyanmisaka     if (hw_cfg->input_lum_offset)
73*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(ctx->dev, 48, hw_cfg->input_lum_offset);
74*437bfbebSnyanmisaka 
75*437bfbebSnyanmisaka     regs->sw49.base_in_cb = hw_cfg->input_cb_base;
76*437bfbebSnyanmisaka     if (hw_cfg->input_cb_offset)
77*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(ctx->dev, 49, hw_cfg->input_cb_offset);
78*437bfbebSnyanmisaka 
79*437bfbebSnyanmisaka     regs->sw50.base_in_cr = hw_cfg->input_cr_base;
80*437bfbebSnyanmisaka     if (hw_cfg->input_cr_offset)
81*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(ctx->dev, 50, hw_cfg->input_cr_offset);
82*437bfbebSnyanmisaka 
83*437bfbebSnyanmisaka     // regs->sw109.int_timeout =  1 & 1;
84*437bfbebSnyanmisaka     regs->sw109.val |= 0x0400;
85*437bfbebSnyanmisaka     regs->sw109.int_slice_ready =  hw_cfg->int_slice_ready;
86*437bfbebSnyanmisaka     regs->sw109.rec_write_disable =  hw_cfg->rec_write_disable;
87*437bfbebSnyanmisaka     regs->sw103.width =  hw_cfg->mbs_in_row;
88*437bfbebSnyanmisaka     regs->sw103.height =  hw_cfg->mbs_in_col;
89*437bfbebSnyanmisaka     regs->sw103.picture_type =  hw_cfg->frame_coding_type;
90*437bfbebSnyanmisaka     regs->sw103.encoding_mode =  hw_cfg->coding_type;
91*437bfbebSnyanmisaka 
92*437bfbebSnyanmisaka     regs->sw61.chr_offset = hw_cfg->input_chroma_base_offset;
93*437bfbebSnyanmisaka     regs->sw61.lum_offset = hw_cfg->input_luma_base_offset;
94*437bfbebSnyanmisaka     regs->sw61.row_length = hw_cfg->pixels_on_row;
95*437bfbebSnyanmisaka     regs->sw60.x_fill = hw_cfg->x_fill;
96*437bfbebSnyanmisaka     regs->sw60.y_fill = hw_cfg->y_fill;
97*437bfbebSnyanmisaka     regs->sw74.input_format = hw_cfg->input_format;
98*437bfbebSnyanmisaka     regs->sw74.input_rot = hw_cfg->input_rotation;
99*437bfbebSnyanmisaka 
100*437bfbebSnyanmisaka     regs->sw59.cabac_enable = hw_cfg->enable_cabac;
101*437bfbebSnyanmisaka     regs->sw75.ip_intra_16_favor = hw_cfg->intra_16_favor;
102*437bfbebSnyanmisaka     regs->sw75.inter_favor = hw_cfg->inter_favor;
103*437bfbebSnyanmisaka     regs->sw59.disable_qp_mv = hw_cfg->disable_qp_mv;
104*437bfbebSnyanmisaka     regs->sw59.deblocking = hw_cfg->filter_disable;
105*437bfbebSnyanmisaka     regs->sw60.skip_penalty = hw_cfg->skip_penalty;
106*437bfbebSnyanmisaka     regs->sw99.split_mv = hw_cfg->split_mv_mode;
107*437bfbebSnyanmisaka     regs->sw107.split_penalty_16x8 = hw_cfg->split_penalty[0];
108*437bfbebSnyanmisaka     regs->sw107.split_penalty_8x8 = hw_cfg->split_penalty[1];
109*437bfbebSnyanmisaka     regs->sw107.split_penalty_8x4 = hw_cfg->split_penalty[2];
110*437bfbebSnyanmisaka     regs->sw102.split_penalty_4x4 = hw_cfg->split_penalty[3];
111*437bfbebSnyanmisaka     regs->sw102.zero_mv_favor = hw_cfg->zero_mv_favor;
112*437bfbebSnyanmisaka 
113*437bfbebSnyanmisaka     regs->sw51.strm_hdr_rem1 =  hw_cfg->strm_start_msb;
114*437bfbebSnyanmisaka     regs->sw52.strm_hdr_rem2 =  hw_cfg->strm_start_lsb;
115*437bfbebSnyanmisaka     regs->sw53.strm_buf_limit =  hw_cfg->output_strm_size;
116*437bfbebSnyanmisaka 
117*437bfbebSnyanmisaka     regs->sw76.base_ref_lum2 =  hw_cfg->internal_img_lum_base_r[1];
118*437bfbebSnyanmisaka     regs->sw106.base_ref_chr2 =  hw_cfg->internal_img_chr_base_r[1];
119*437bfbebSnyanmisaka 
120*437bfbebSnyanmisaka     regs->sw100.y1_quant_dc =  hw_cfg->y1_quant_dc[0];
121*437bfbebSnyanmisaka     regs->sw65.y1_quant_ac =  hw_cfg->y1_quant_ac[0];
122*437bfbebSnyanmisaka     regs->sw66.y2_quant_dc =  hw_cfg->y2_quant_dc[0];
123*437bfbebSnyanmisaka     regs->sw67.y2_quant_ac =  hw_cfg->y2_quant_ac[0];
124*437bfbebSnyanmisaka     regs->sw68.ch_quant_dc =  hw_cfg->ch_quant_dc[0];
125*437bfbebSnyanmisaka     regs->sw69.ch_quant_ac =  hw_cfg->ch_quant_ac[0];
126*437bfbebSnyanmisaka 
127*437bfbebSnyanmisaka     regs->sw100.y1_zbin_dc =  hw_cfg->y1_zbin_dc[0];
128*437bfbebSnyanmisaka     regs->sw65.y1_zbin_ac =  hw_cfg->y1_zbin_ac[0];
129*437bfbebSnyanmisaka     regs->sw66.y2_zbin_dc =  hw_cfg->y2_zbin_dc[0];
130*437bfbebSnyanmisaka     regs->sw67.y2_zbin_ac =  hw_cfg->y2_zbin_ac[0];
131*437bfbebSnyanmisaka     regs->sw68.ch_zbin_dc =  hw_cfg->ch_zbin_dc[0];
132*437bfbebSnyanmisaka     regs->sw69.ch_zbin_ac =  hw_cfg->ch_zbin_ac[0];
133*437bfbebSnyanmisaka 
134*437bfbebSnyanmisaka     regs->sw100.y1_round_dc =  hw_cfg->y1_round_dc[0];
135*437bfbebSnyanmisaka     regs->sw65.y1_round_ac =  hw_cfg->y1_round_ac[0];
136*437bfbebSnyanmisaka     regs->sw66.y2_round_dc =  hw_cfg->y2_round_dc[0];
137*437bfbebSnyanmisaka     regs->sw67.y2_round_ac =  hw_cfg->y2_round_ac[0];
138*437bfbebSnyanmisaka     regs->sw68.ch_round_dc =  hw_cfg->ch_round_dc[0];
139*437bfbebSnyanmisaka     regs->sw69.ch_round_ac =  hw_cfg->ch_round_ac[0];
140*437bfbebSnyanmisaka 
141*437bfbebSnyanmisaka     regs->sw70.y1_dequant_dc =  hw_cfg->y1_dequant_dc[0];
142*437bfbebSnyanmisaka     regs->sw70.y1_dequant_ac =  hw_cfg->y1_dequant_ac[0];
143*437bfbebSnyanmisaka     regs->sw70.y2_dequant_dc =  hw_cfg->y2_dequant_dc[0];
144*437bfbebSnyanmisaka     regs->sw71.y2_dequant_ac =  hw_cfg->y2_dequant_ac[0];
145*437bfbebSnyanmisaka     regs->sw71.ch_dequant_dc =  hw_cfg->ch_dequant_dc[0];
146*437bfbebSnyanmisaka     regs->sw71.ch_dequant_ac =  hw_cfg->ch_dequant_ac[0];
147*437bfbebSnyanmisaka 
148*437bfbebSnyanmisaka     regs->sw70.mv_ref_idx =  hw_cfg->mv_ref_idx[0];
149*437bfbebSnyanmisaka     regs->sw71.mv_ref_idx2 =  hw_cfg->mv_ref_idx[1];
150*437bfbebSnyanmisaka     regs->sw71.ref2_enable =  hw_cfg->ref2_enable;
151*437bfbebSnyanmisaka 
152*437bfbebSnyanmisaka     regs->sw72.bool_enc_value =  hw_cfg->bool_enc_value;
153*437bfbebSnyanmisaka     regs->sw73.bool_enc_value_bits =  hw_cfg->bool_enc_value_bits;
154*437bfbebSnyanmisaka     regs->sw73.bool_enc_range =  hw_cfg->bool_enc_range;
155*437bfbebSnyanmisaka 
156*437bfbebSnyanmisaka     regs->sw73.filter_level =  hw_cfg->filter_level[0];
157*437bfbebSnyanmisaka     regs->sw73.golden_penalty =  hw_cfg->golden_penalty;
158*437bfbebSnyanmisaka     regs->sw73.filter_sharpness =  hw_cfg->filter_sharpness;
159*437bfbebSnyanmisaka     regs->sw73.dct_partition_count =  hw_cfg->dct_partitions;
160*437bfbebSnyanmisaka 
161*437bfbebSnyanmisaka     regs->sw60.start_offset =  hw_cfg->first_free_bit;
162*437bfbebSnyanmisaka 
163*437bfbebSnyanmisaka     regs->sw79.base_next_lum =  hw_cfg->vs_next_luma_base;
164*437bfbebSnyanmisaka     regs->sw94.stab_mode =  hw_cfg->vs_mode;
165*437bfbebSnyanmisaka 
166*437bfbebSnyanmisaka     regs->sw99.dmv_penalty_4p =  hw_cfg->diff_mv_penalty[0];
167*437bfbebSnyanmisaka     regs->sw99.dmv_penalty_1p =  hw_cfg->diff_mv_penalty[1];
168*437bfbebSnyanmisaka     regs->sw99.dmv_penalty_qp =  hw_cfg->diff_mv_penalty[2];
169*437bfbebSnyanmisaka 
170*437bfbebSnyanmisaka     regs->sw81.base_cabac_ctx =  hw_cfg->cabac_tbl_base;
171*437bfbebSnyanmisaka     regs->sw80.base_mv_write =  hw_cfg->mv_output_base;
172*437bfbebSnyanmisaka 
173*437bfbebSnyanmisaka     regs->sw95.rgb_coeff_a =  hw_cfg->rgb_coeff_a;
174*437bfbebSnyanmisaka     regs->sw95.rgb_coeff_b =  hw_cfg->rgb_coeff_b;
175*437bfbebSnyanmisaka     regs->sw96.rgb_coeff_c =  hw_cfg->rgb_coeff_c;
176*437bfbebSnyanmisaka     regs->sw96.rgb_coeff_e =  hw_cfg->rgb_coeff_e;
177*437bfbebSnyanmisaka     regs->sw97.rgb_coeff_f =  hw_cfg->rgb_coeff_f;
178*437bfbebSnyanmisaka 
179*437bfbebSnyanmisaka     regs->sw98.r_mask_msb =  hw_cfg->r_mask_msb;
180*437bfbebSnyanmisaka     regs->sw98.g_mask_msb =  hw_cfg->g_mask_msb;
181*437bfbebSnyanmisaka     regs->sw98.b_mask_msb =  hw_cfg->b_mask_msb;
182*437bfbebSnyanmisaka 
183*437bfbebSnyanmisaka     regs->sw47.cir_start =  hw_cfg->cir_start;
184*437bfbebSnyanmisaka     regs->sw47.cir_interval =  hw_cfg->cir_interval;
185*437bfbebSnyanmisaka 
186*437bfbebSnyanmisaka     regs->sw46.intra_area_left =  hw_cfg->intra_area_left;
187*437bfbebSnyanmisaka     regs->sw46.intra_area_right =  hw_cfg->intra_area_right;
188*437bfbebSnyanmisaka     regs->sw46.intra_area_top =  hw_cfg->intra_area_top;
189*437bfbebSnyanmisaka     regs->sw46.intra_area_bottom =  hw_cfg->intra_area_bottom   ;
190*437bfbebSnyanmisaka     regs->sw82.roi1_left =  hw_cfg->roi1_left;
191*437bfbebSnyanmisaka     regs->sw82.roi1_right =  hw_cfg->roi1_right;
192*437bfbebSnyanmisaka     regs->sw82.roi1_top =  hw_cfg->roi1_top;
193*437bfbebSnyanmisaka     regs->sw82.roi1_bottom =  hw_cfg->roi1_bottom;
194*437bfbebSnyanmisaka 
195*437bfbebSnyanmisaka     regs->sw83.roi2_left =  hw_cfg->roi2_left;
196*437bfbebSnyanmisaka     regs->sw83.roi2_right =  hw_cfg->roi2_right;
197*437bfbebSnyanmisaka     regs->sw83.roi2_top =  hw_cfg->roi2_top;
198*437bfbebSnyanmisaka     regs->sw83.roi2_bottom =  hw_cfg->roi2_bottom;
199*437bfbebSnyanmisaka 
200*437bfbebSnyanmisaka     regs->sw44.base_partition1 =  hw_cfg->partition_Base[0];
201*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(ctx->dev, 44, hw_cfg->partition_offset[0]);
202*437bfbebSnyanmisaka     regs->sw45.base_partition2 =  hw_cfg->partition_Base[1];
203*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(ctx->dev, 45, hw_cfg->partition_offset[1]);
204*437bfbebSnyanmisaka     regs->sw108.base_prob_count =  hw_cfg->prob_count_base;
205*437bfbebSnyanmisaka 
206*437bfbebSnyanmisaka     regs->sw33.mode0_penalty =  hw_cfg->intra_mode_penalty[0];
207*437bfbebSnyanmisaka     regs->sw33.mode1_penalty =  hw_cfg->intra_mode_penalty[1];
208*437bfbebSnyanmisaka     regs->sw34.mode2_penalty =  hw_cfg->intra_mode_penalty[2];
209*437bfbebSnyanmisaka     regs->sw34.mode3_penalty =  hw_cfg->intra_mode_penalty[3];
210*437bfbebSnyanmisaka 
211*437bfbebSnyanmisaka     for (i = 0 ; i < 5; i++) {
212*437bfbebSnyanmisaka         regs->sw28_32[i].b_mode_0_penalty = hw_cfg->intra_b_mode_penalty[2 * i];
213*437bfbebSnyanmisaka         regs->sw28_32[i].b_mode_1_penalty = hw_cfg->intra_b_mode_penalty[2 * i + 1];
214*437bfbebSnyanmisaka     }
215*437bfbebSnyanmisaka 
216*437bfbebSnyanmisaka     regs->sw71.segment_enable =  hw_cfg->segment_enable;
217*437bfbebSnyanmisaka     regs->sw71.segment_map_update =  hw_cfg->segment_map_update;
218*437bfbebSnyanmisaka     regs->sw27.base_segment_map =  hw_cfg->segment_map_base;
219*437bfbebSnyanmisaka 
220*437bfbebSnyanmisaka     for (i = 0; i < 3; i++) {
221*437bfbebSnyanmisaka         regs->sw0_26[0 + i * 9].num_0.y1_quant_dc = hw_cfg->y1_quant_dc[1 + i];
222*437bfbebSnyanmisaka         regs->sw0_26[0 + i * 9].num_0.y2_quant_dc = hw_cfg->y2_quant_dc[1 + i];
223*437bfbebSnyanmisaka 
224*437bfbebSnyanmisaka         regs->sw0_26[1 + i * 9].num_1.ch_quant_dc = hw_cfg->ch_quant_dc[1 + i];
225*437bfbebSnyanmisaka         regs->sw0_26[1 + i * 9].num_1.y1_quant_ac = hw_cfg->y1_quant_ac[1 + i];
226*437bfbebSnyanmisaka 
227*437bfbebSnyanmisaka         regs->sw0_26[2 + i * 9].num_2.y2_quant_ac = hw_cfg->y2_quant_ac[1 + i];
228*437bfbebSnyanmisaka         regs->sw0_26[2 + i * 9].num_2.ch_quant_ac = hw_cfg->ch_quant_ac[1 + i];
229*437bfbebSnyanmisaka 
230*437bfbebSnyanmisaka         regs->sw0_26[3 + i * 9].num_3.y1_zbin_dc = hw_cfg->y1_zbin_dc[1 + i];
231*437bfbebSnyanmisaka         regs->sw0_26[3 + i * 9].num_3.y2_zbin_dc = hw_cfg->y2_zbin_dc[1 + i];
232*437bfbebSnyanmisaka         regs->sw0_26[3 + i * 9].num_3.ch_zbin_dc = hw_cfg->ch_zbin_dc[1 + i];
233*437bfbebSnyanmisaka 
234*437bfbebSnyanmisaka         regs->sw0_26[4 + i * 9].num_4.y1_zbin_ac = hw_cfg->y1_zbin_ac[1 + i];
235*437bfbebSnyanmisaka         regs->sw0_26[4 + i * 9].num_4.y2_zbin_ac = hw_cfg->y2_zbin_ac[1 + i];
236*437bfbebSnyanmisaka         regs->sw0_26[4 + i * 9].num_4.ch_zbin_ac = hw_cfg->ch_zbin_ac[1 + i];
237*437bfbebSnyanmisaka 
238*437bfbebSnyanmisaka         regs->sw0_26[5 + i * 9].num_5.y1_round_dc = hw_cfg->y1_round_dc[1 + i];
239*437bfbebSnyanmisaka         regs->sw0_26[5 + i * 9].num_5.y2_round_dc = hw_cfg->y2_round_dc[1 + i];
240*437bfbebSnyanmisaka         regs->sw0_26[5 + i * 9].num_5.ch_round_dc = hw_cfg->ch_round_dc[1 + i];
241*437bfbebSnyanmisaka 
242*437bfbebSnyanmisaka         regs->sw0_26[6 + i * 9].num_6.y1_round_ac = hw_cfg->y1_round_ac[1 + i];
243*437bfbebSnyanmisaka         regs->sw0_26[6 + i * 9].num_6.y2_round_ac = hw_cfg->y2_round_ac[1 + i];
244*437bfbebSnyanmisaka         regs->sw0_26[6 + i * 9].num_6.ch_round_ac = hw_cfg->ch_round_ac[1 + i];
245*437bfbebSnyanmisaka 
246*437bfbebSnyanmisaka         regs->sw0_26[7 + i * 9].num_7.y1_dequant_dc = hw_cfg->y1_dequant_dc[1 + i];
247*437bfbebSnyanmisaka         regs->sw0_26[7 + i * 9].num_7.y2_dequant_dc = hw_cfg->y2_dequant_dc[1 + i];
248*437bfbebSnyanmisaka         regs->sw0_26[7 + i * 9].num_7.ch_dequant_dc = hw_cfg->ch_dequant_dc[1 + i];
249*437bfbebSnyanmisaka         regs->sw0_26[7 + i * 9].num_7.filter_level = hw_cfg->filter_level[1 + i];
250*437bfbebSnyanmisaka 
251*437bfbebSnyanmisaka         regs->sw0_26[8 + i * 9].num_8.y1_dequant_ac = hw_cfg->y1_dequant_ac[1 + i];
252*437bfbebSnyanmisaka         regs->sw0_26[8 + i * 9].num_8.y2_dequant_ac = hw_cfg->y2_dequant_ac[1 + i];
253*437bfbebSnyanmisaka         regs->sw0_26[8 + i * 9].num_8.ch_dequant_ac = hw_cfg->ch_dequant_ac[1 + i];
254*437bfbebSnyanmisaka     }
255*437bfbebSnyanmisaka 
256*437bfbebSnyanmisaka     regs->sw40.lf_ref_delta0 =  hw_cfg->lf_ref_delta[0] & mask_7b;
257*437bfbebSnyanmisaka     regs->sw42.lf_ref_delta1 =  hw_cfg->lf_ref_delta[1] & mask_7b;
258*437bfbebSnyanmisaka     regs->sw42.lf_ref_delta2 =  hw_cfg->lf_ref_delta[2] & mask_7b;
259*437bfbebSnyanmisaka     regs->sw42.lf_ref_delta3 =  hw_cfg->lf_ref_delta[3] & mask_7b;
260*437bfbebSnyanmisaka     regs->sw40.lf_mode_delta0 =  hw_cfg->lf_mode_delta[0] & mask_7b;
261*437bfbebSnyanmisaka     regs->sw43.lf_mode_delta1 =  hw_cfg->lf_mode_delta[1] & mask_7b;
262*437bfbebSnyanmisaka     regs->sw43.lf_mode_delta2 =  hw_cfg->lf_mode_delta[2] & mask_7b;
263*437bfbebSnyanmisaka     regs->sw43.lf_mode_delta3 =  hw_cfg->lf_mode_delta[3] & mask_7b;
264*437bfbebSnyanmisaka 
265*437bfbebSnyanmisaka     RK_S32 j = 0;
266*437bfbebSnyanmisaka     for (j = 0; j < 32; j++) {
267*437bfbebSnyanmisaka         regs->sw120_183[j].penalty_0 = hw_cfg->dmv_penalty[j * 4 + 3];
268*437bfbebSnyanmisaka         regs->sw120_183[j].penalty_1 = hw_cfg->dmv_penalty[j * 4 + 2];
269*437bfbebSnyanmisaka         regs->sw120_183[j].penalty_2 = hw_cfg->dmv_penalty[j * 4 + 1];
270*437bfbebSnyanmisaka         regs->sw120_183[j].penalty_3 = hw_cfg->dmv_penalty[j * 4];
271*437bfbebSnyanmisaka 
272*437bfbebSnyanmisaka         regs->sw120_183[j + 32].penalty_0 = hw_cfg->dmv_qpel_penalty[j * 4 + 3];
273*437bfbebSnyanmisaka         regs->sw120_183[j + 32].penalty_1 = hw_cfg->dmv_qpel_penalty[j * 4 + 2];
274*437bfbebSnyanmisaka         regs->sw120_183[j + 32].penalty_2 = hw_cfg->dmv_qpel_penalty[j * 4 + 1];
275*437bfbebSnyanmisaka         regs->sw120_183[j + 32].penalty_3 = hw_cfg->dmv_qpel_penalty[j * 4];
276*437bfbebSnyanmisaka     }
277*437bfbebSnyanmisaka 
278*437bfbebSnyanmisaka     regs->sw103.enable = 0x1;
279*437bfbebSnyanmisaka 
280*437bfbebSnyanmisaka     return MPP_OK;
281*437bfbebSnyanmisaka }
282*437bfbebSnyanmisaka 
hal_vp8e_vepu2_init_v2(void * hal,MppEncHalCfg * cfg)283*437bfbebSnyanmisaka static MPP_RET hal_vp8e_vepu2_init_v2(void *hal, MppEncHalCfg *cfg)
284*437bfbebSnyanmisaka {
285*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
286*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
287*437bfbebSnyanmisaka     Vp8eHwCfg *hw_cfg = &ctx->hw_cfg;
288*437bfbebSnyanmisaka 
289*437bfbebSnyanmisaka     ctx->cfg = cfg->cfg;
290*437bfbebSnyanmisaka 
291*437bfbebSnyanmisaka     /* update output to MppEnc */
292*437bfbebSnyanmisaka     cfg->type = VPU_CLIENT_VEPU2;
293*437bfbebSnyanmisaka     ret = mpp_dev_init(&cfg->dev, cfg->type);
294*437bfbebSnyanmisaka     if (ret) {
295*437bfbebSnyanmisaka         mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
296*437bfbebSnyanmisaka         return ret;
297*437bfbebSnyanmisaka     }
298*437bfbebSnyanmisaka     ctx->dev = cfg->dev;
299*437bfbebSnyanmisaka 
300*437bfbebSnyanmisaka     vp8e_hal_dbg(VP8E_DBG_HAL_FUNCTION, "mpp_dev_init success.\n");
301*437bfbebSnyanmisaka 
302*437bfbebSnyanmisaka     ctx->buffers = mpp_calloc(Vp8eVpuBuf, 1);
303*437bfbebSnyanmisaka     if (ctx->buffers == NULL) {
304*437bfbebSnyanmisaka         mpp_err("failed to malloc buffers");
305*437bfbebSnyanmisaka         return MPP_ERR_NOMEM;
306*437bfbebSnyanmisaka     }
307*437bfbebSnyanmisaka     //memset(ctx->buffers, 0, sizeof(Vp8eVpuBuf));
308*437bfbebSnyanmisaka 
309*437bfbebSnyanmisaka     ctx->buffer_ready = 0;
310*437bfbebSnyanmisaka     ctx->frame_cnt = 0;
311*437bfbebSnyanmisaka     ctx->frame_type = VP8E_FRM_KEY;
312*437bfbebSnyanmisaka     ctx->prev_frame_lost = 0;
313*437bfbebSnyanmisaka     ctx->frame_size = 0;
314*437bfbebSnyanmisaka     ctx->ivf_hdr_rdy = 0;
315*437bfbebSnyanmisaka     ctx->reg_size = SWREG_AMOUNT_VEPU2;
316*437bfbebSnyanmisaka 
317*437bfbebSnyanmisaka     hw_cfg->irq_disable = 0;
318*437bfbebSnyanmisaka 
319*437bfbebSnyanmisaka     hw_cfg->rounding_ctrl  = 0;
320*437bfbebSnyanmisaka     hw_cfg->cp_distance_mbs = 0;
321*437bfbebSnyanmisaka     hw_cfg->recon_img_id  = 0;
322*437bfbebSnyanmisaka     hw_cfg->input_lum_base  = 0;
323*437bfbebSnyanmisaka     hw_cfg->input_cb_base   = 0;
324*437bfbebSnyanmisaka     hw_cfg->input_cr_base   = 0;
325*437bfbebSnyanmisaka 
326*437bfbebSnyanmisaka     hal_vp8e_init_qp_table(hal);
327*437bfbebSnyanmisaka 
328*437bfbebSnyanmisaka     return ret;
329*437bfbebSnyanmisaka }
330*437bfbebSnyanmisaka 
hal_vp8e_vepu2_deinit_v2(void * hal)331*437bfbebSnyanmisaka static MPP_RET hal_vp8e_vepu2_deinit_v2(void *hal)
332*437bfbebSnyanmisaka {
333*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
334*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
335*437bfbebSnyanmisaka 
336*437bfbebSnyanmisaka     hal_vp8e_buf_free(ctx);
337*437bfbebSnyanmisaka 
338*437bfbebSnyanmisaka     if (ctx->dev) {
339*437bfbebSnyanmisaka         mpp_dev_deinit(ctx->dev);
340*437bfbebSnyanmisaka         ctx->dev = NULL;
341*437bfbebSnyanmisaka     }
342*437bfbebSnyanmisaka 
343*437bfbebSnyanmisaka     MPP_FREE(ctx->regs);
344*437bfbebSnyanmisaka     MPP_FREE(ctx->buffers);
345*437bfbebSnyanmisaka 
346*437bfbebSnyanmisaka     vp8e_hal_dbg(VP8E_DBG_HAL_FUNCTION, "mpp_dev_deinit success.\n");
347*437bfbebSnyanmisaka 
348*437bfbebSnyanmisaka     return ret;
349*437bfbebSnyanmisaka }
350*437bfbebSnyanmisaka 
hal_vp8e_vepu2_gen_regs_v2(void * hal,HalEncTask * task)351*437bfbebSnyanmisaka static MPP_RET hal_vp8e_vepu2_gen_regs_v2(void *hal, HalEncTask *task)
352*437bfbebSnyanmisaka {
353*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
354*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
355*437bfbebSnyanmisaka 
356*437bfbebSnyanmisaka     ctx->rc->qp_hdr = MPP_CLIP3(0, 127, task->rc_task->info.quality_target);
357*437bfbebSnyanmisaka 
358*437bfbebSnyanmisaka     if (!ctx->buffer_ready) {
359*437bfbebSnyanmisaka         ret = hal_vp8e_setup(hal);
360*437bfbebSnyanmisaka         if (ret) {
361*437bfbebSnyanmisaka             mpp_err("failed to init hal vp8e\n");
362*437bfbebSnyanmisaka             return ret;
363*437bfbebSnyanmisaka         } else {
364*437bfbebSnyanmisaka             ctx->buffer_ready = 1;
365*437bfbebSnyanmisaka         }
366*437bfbebSnyanmisaka     }
367*437bfbebSnyanmisaka 
368*437bfbebSnyanmisaka     memset(ctx->stream_size, 0, sizeof(ctx->stream_size));
369*437bfbebSnyanmisaka 
370*437bfbebSnyanmisaka     hal_vp8e_enc_strm_code(ctx, task);
371*437bfbebSnyanmisaka     vp8e_vpu_frame_start(ctx);
372*437bfbebSnyanmisaka 
373*437bfbebSnyanmisaka     return MPP_OK;
374*437bfbebSnyanmisaka }
375*437bfbebSnyanmisaka 
hal_vp8e_vepu2_start_v2(void * hal,HalEncTask * task)376*437bfbebSnyanmisaka static MPP_RET hal_vp8e_vepu2_start_v2(void *hal, HalEncTask *task)
377*437bfbebSnyanmisaka {
378*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
379*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
380*437bfbebSnyanmisaka 
381*437bfbebSnyanmisaka     if (VP8E_DBG_HAL_DUMP_REG & vp8e_hal_debug) {
382*437bfbebSnyanmisaka         RK_U32 i = 0;
383*437bfbebSnyanmisaka         RK_U32 *tmp = (RK_U32 *)ctx->regs;
384*437bfbebSnyanmisaka 
385*437bfbebSnyanmisaka         for (; i < ctx->reg_size; i++)
386*437bfbebSnyanmisaka             mpp_log("reg[%d]:%x\n", i, tmp[i]);
387*437bfbebSnyanmisaka     }
388*437bfbebSnyanmisaka 
389*437bfbebSnyanmisaka     do {
390*437bfbebSnyanmisaka         MppDevRegWrCfg wr_cfg;
391*437bfbebSnyanmisaka         MppDevRegRdCfg rd_cfg;
392*437bfbebSnyanmisaka         RK_U32 reg_size = ctx->reg_size * sizeof(RK_U32);
393*437bfbebSnyanmisaka 
394*437bfbebSnyanmisaka         wr_cfg.reg = ctx->regs;
395*437bfbebSnyanmisaka         wr_cfg.size = reg_size;
396*437bfbebSnyanmisaka         wr_cfg.offset = 0;
397*437bfbebSnyanmisaka 
398*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
399*437bfbebSnyanmisaka         if (ret) {
400*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
401*437bfbebSnyanmisaka             break;
402*437bfbebSnyanmisaka         }
403*437bfbebSnyanmisaka 
404*437bfbebSnyanmisaka         rd_cfg.reg = ctx->regs;
405*437bfbebSnyanmisaka         rd_cfg.size = reg_size;
406*437bfbebSnyanmisaka         rd_cfg.offset = 0;
407*437bfbebSnyanmisaka 
408*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &rd_cfg);
409*437bfbebSnyanmisaka         if (ret) {
410*437bfbebSnyanmisaka             mpp_err_f("set register read failed %d\n", ret);
411*437bfbebSnyanmisaka             break;
412*437bfbebSnyanmisaka         }
413*437bfbebSnyanmisaka 
414*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
415*437bfbebSnyanmisaka         if (ret) {
416*437bfbebSnyanmisaka             mpp_err_f("send cmd failed %d\n", ret);
417*437bfbebSnyanmisaka             break;
418*437bfbebSnyanmisaka         }
419*437bfbebSnyanmisaka     } while (0);
420*437bfbebSnyanmisaka 
421*437bfbebSnyanmisaka     (void)task;
422*437bfbebSnyanmisaka     return ret;
423*437bfbebSnyanmisaka }
424*437bfbebSnyanmisaka 
vp8e_update_hw_cfg(void * hal)425*437bfbebSnyanmisaka static void vp8e_update_hw_cfg(void *hal)
426*437bfbebSnyanmisaka {
427*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
428*437bfbebSnyanmisaka     Vp8eHwCfg *hw_cfg = &ctx->hw_cfg;
429*437bfbebSnyanmisaka     Vp8eVepu2Reg_t *regs = (Vp8eVepu2Reg_t *) ctx->regs;
430*437bfbebSnyanmisaka 
431*437bfbebSnyanmisaka     hw_cfg->output_strm_base = regs->sw53.strm_buf_limit / 8;
432*437bfbebSnyanmisaka     hw_cfg->qp_sum = regs->sw58.qp_sum * 2;
433*437bfbebSnyanmisaka     hw_cfg->mad_count = regs->sw104.mad_count;
434*437bfbebSnyanmisaka     hw_cfg->rlc_count = regs->sw62.rlc_sum * 3;
435*437bfbebSnyanmisaka 
436*437bfbebSnyanmisaka     hw_cfg->intra_16_favor = -1;
437*437bfbebSnyanmisaka     hw_cfg->inter_favor = -1;
438*437bfbebSnyanmisaka     hw_cfg->diff_mv_penalty[0] = -1;
439*437bfbebSnyanmisaka     hw_cfg->diff_mv_penalty[1] = -1;
440*437bfbebSnyanmisaka     hw_cfg->diff_mv_penalty[2] = -1;
441*437bfbebSnyanmisaka     hw_cfg->skip_penalty = -1;
442*437bfbebSnyanmisaka     hw_cfg->golden_penalty = -1;
443*437bfbebSnyanmisaka     hw_cfg->split_penalty[0] = 0;
444*437bfbebSnyanmisaka     hw_cfg->split_penalty[1] = 0;
445*437bfbebSnyanmisaka     hw_cfg->split_penalty[3] = 0;
446*437bfbebSnyanmisaka }
447*437bfbebSnyanmisaka 
hal_vp8e_vepu2_wait_v2(void * hal,HalEncTask * task)448*437bfbebSnyanmisaka static MPP_RET hal_vp8e_vepu2_wait_v2(void *hal, HalEncTask *task)
449*437bfbebSnyanmisaka {
450*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
451*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
452*437bfbebSnyanmisaka 
453*437bfbebSnyanmisaka     Vp8eFeedback *fb = &ctx->feedback;
454*437bfbebSnyanmisaka     Vp8eVepu2Reg_t *regs = (Vp8eVepu2Reg_t *) ctx->regs;
455*437bfbebSnyanmisaka     RK_S32 sw_length = task->length;
456*437bfbebSnyanmisaka 
457*437bfbebSnyanmisaka     if (NULL == ctx->dev) {
458*437bfbebSnyanmisaka         mpp_err_f("invalid dev ctx\n");
459*437bfbebSnyanmisaka         return MPP_NOK;
460*437bfbebSnyanmisaka     }
461*437bfbebSnyanmisaka 
462*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
463*437bfbebSnyanmisaka     if (ret)
464*437bfbebSnyanmisaka         mpp_err_f("poll cmd failed %d\n", ret);
465*437bfbebSnyanmisaka 
466*437bfbebSnyanmisaka     fb->hw_status = regs->sw109.val & HW_STATUS_MASK;
467*437bfbebSnyanmisaka     if (regs->sw109.val & HW_STATUS_FRAME_READY)
468*437bfbebSnyanmisaka         vp8e_update_hw_cfg(ctx);
469*437bfbebSnyanmisaka     else if (regs->sw109.val & HW_STATUS_BUFFER_FULL)
470*437bfbebSnyanmisaka         ctx->bitbuf[1].size = 0;
471*437bfbebSnyanmisaka 
472*437bfbebSnyanmisaka     hal_vp8e_update_buffers(ctx, task);
473*437bfbebSnyanmisaka 
474*437bfbebSnyanmisaka     ctx->last_frm_intra = task->rc_task->frm.is_intra;
475*437bfbebSnyanmisaka     ctx->frame_cnt++;
476*437bfbebSnyanmisaka 
477*437bfbebSnyanmisaka     task->rc_task->info.bit_real = ctx->frame_size << 3;
478*437bfbebSnyanmisaka     task->hw_length = task->length - sw_length;
479*437bfbebSnyanmisaka     return ret;
480*437bfbebSnyanmisaka }
481*437bfbebSnyanmisaka 
hal_vp8e_vepu2_get_task_v2(void * hal,HalEncTask * task)482*437bfbebSnyanmisaka static MPP_RET hal_vp8e_vepu2_get_task_v2(void *hal, HalEncTask *task)
483*437bfbebSnyanmisaka {
484*437bfbebSnyanmisaka     HalVp8eCtx *ctx = (HalVp8eCtx *)hal;
485*437bfbebSnyanmisaka     Vp8eSyntax* syntax = (Vp8eSyntax*)task->syntax.data;
486*437bfbebSnyanmisaka     //ctx->cfg = syntax->cfg;
487*437bfbebSnyanmisaka     RK_U32 i;
488*437bfbebSnyanmisaka 
489*437bfbebSnyanmisaka     for (i = 0; i < task->syntax.number; i++) {
490*437bfbebSnyanmisaka         if (syntax[i].type == VP8E_SYN_CFG) {
491*437bfbebSnyanmisaka             ctx->cfg = (MppEncCfgSet*)syntax[i].data;
492*437bfbebSnyanmisaka         }
493*437bfbebSnyanmisaka         if (syntax[i].type == VP8E_SYN_RC) {
494*437bfbebSnyanmisaka             ctx->rc = (Vp8eRc*) syntax[i].data;
495*437bfbebSnyanmisaka         }
496*437bfbebSnyanmisaka     }
497*437bfbebSnyanmisaka 
498*437bfbebSnyanmisaka     ctx->frame_type = task->rc_task->frm.is_intra ? VP8E_FRM_KEY : VP8E_FRM_P;
499*437bfbebSnyanmisaka 
500*437bfbebSnyanmisaka     if (!ctx->cfg->vp8.disable_ivf && !ctx->ivf_hdr_rdy) {
501*437bfbebSnyanmisaka         RK_U8 *p_out = mpp_buffer_get_ptr(task->output);
502*437bfbebSnyanmisaka 
503*437bfbebSnyanmisaka         write_ivf_header(hal, p_out);
504*437bfbebSnyanmisaka         task->length += IVF_HDR_BYTES;
505*437bfbebSnyanmisaka 
506*437bfbebSnyanmisaka         ctx->ivf_hdr_rdy = 1;
507*437bfbebSnyanmisaka     }
508*437bfbebSnyanmisaka 
509*437bfbebSnyanmisaka     return MPP_OK;
510*437bfbebSnyanmisaka }
511*437bfbebSnyanmisaka 
hal_vp8e_vepu2_ret_task_v2(void * hal,HalEncTask * task)512*437bfbebSnyanmisaka static MPP_RET hal_vp8e_vepu2_ret_task_v2(void *hal, HalEncTask *task)
513*437bfbebSnyanmisaka {
514*437bfbebSnyanmisaka     (void)hal;
515*437bfbebSnyanmisaka     (void)task;
516*437bfbebSnyanmisaka     return MPP_OK;
517*437bfbebSnyanmisaka }
518*437bfbebSnyanmisaka 
519*437bfbebSnyanmisaka const MppEncHalApi hal_vp8e_vepu2 = {
520*437bfbebSnyanmisaka     .name       = "hal_vp8e_vepu2",
521*437bfbebSnyanmisaka     .coding     = MPP_VIDEO_CodingVP8,
522*437bfbebSnyanmisaka     .ctx_size   = sizeof(HalVp8eCtx),
523*437bfbebSnyanmisaka     .flag       = 0,
524*437bfbebSnyanmisaka     .init       = hal_vp8e_vepu2_init_v2,
525*437bfbebSnyanmisaka     .deinit     = hal_vp8e_vepu2_deinit_v2,
526*437bfbebSnyanmisaka     .prepare    = NULL,
527*437bfbebSnyanmisaka     .get_task   = hal_vp8e_vepu2_get_task_v2,
528*437bfbebSnyanmisaka     .gen_regs   = hal_vp8e_vepu2_gen_regs_v2,
529*437bfbebSnyanmisaka     .start      = hal_vp8e_vepu2_start_v2,
530*437bfbebSnyanmisaka     .wait       = hal_vp8e_vepu2_wait_v2,
531*437bfbebSnyanmisaka     .part_start = NULL,
532*437bfbebSnyanmisaka     .part_wait  = NULL,
533*437bfbebSnyanmisaka     .ret_task   = hal_vp8e_vepu2_ret_task_v2,
534*437bfbebSnyanmisaka };
535