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