xref: /rockchip-linux_mpp/mpp/hal/rkdec/avsd/hal_avsd_vdpu2.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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_avsd_vdpu2"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include "mpp_debug.h"
22*437bfbebSnyanmisaka #include "mpp_common.h"
23*437bfbebSnyanmisaka #include "mpp_mem.h"
24*437bfbebSnyanmisaka #include "mpp_device.h"
25*437bfbebSnyanmisaka #include "mpp_dec_cb_param.h"
26*437bfbebSnyanmisaka 
27*437bfbebSnyanmisaka #include "hal_avsd_base.h"
28*437bfbebSnyanmisaka #include "hal_avsd_vdpu2.h"
29*437bfbebSnyanmisaka #include "hal_avsd_vdpu2_reg.h"
30*437bfbebSnyanmisaka 
set_defalut_parameters(AvsdHalCtx_t * p_hal)31*437bfbebSnyanmisaka static MPP_RET set_defalut_parameters(AvsdHalCtx_t *p_hal)
32*437bfbebSnyanmisaka {
33*437bfbebSnyanmisaka     AvsdVdpu2Regs_t *p_regs = (AvsdVdpu2Regs_t *)p_hal->p_regs;
34*437bfbebSnyanmisaka 
35*437bfbebSnyanmisaka     p_regs->sw54.dec_out_endian = 1;
36*437bfbebSnyanmisaka     p_regs->sw54.dec_in_endian = 0;
37*437bfbebSnyanmisaka     p_regs->sw54.dec_strendian_e = 1;
38*437bfbebSnyanmisaka     p_regs->sw56.dec_max_burlen = 16;
39*437bfbebSnyanmisaka     p_regs->sw50.dec_ascmd0_dis = 0;
40*437bfbebSnyanmisaka 
41*437bfbebSnyanmisaka     p_regs->sw50.adv_pref_dis = 0;
42*437bfbebSnyanmisaka     p_regs->sw52.adv_pref_thrd = 8;
43*437bfbebSnyanmisaka     p_regs->sw50.adtion_latency = 0;
44*437bfbebSnyanmisaka 
45*437bfbebSnyanmisaka     p_regs->sw56.dec_data_discd_en = 0;
46*437bfbebSnyanmisaka     p_regs->sw54.dec_out_wordsp = 1;
47*437bfbebSnyanmisaka     p_regs->sw54.dec_in_wordsp = 1;
48*437bfbebSnyanmisaka     p_regs->sw54.dec_strm_wordsp = 1;
49*437bfbebSnyanmisaka     p_regs->sw55.timeout_det_sts = 0;
50*437bfbebSnyanmisaka     p_regs->sw57.dec_clkgate_en = 1;
51*437bfbebSnyanmisaka     p_regs->sw55.dec_irq_dis = 0;
52*437bfbebSnyanmisaka 
53*437bfbebSnyanmisaka     p_regs->sw56.dec_axi_id_rd = 0xFF;
54*437bfbebSnyanmisaka     p_regs->sw56.dec_axi_id_wr = 0;
55*437bfbebSnyanmisaka 
56*437bfbebSnyanmisaka     p_regs->sw59.pred_bc_tap_0_0 = 0x3FF;
57*437bfbebSnyanmisaka     p_regs->sw59.pred_bc_tap_0_1 = 5;
58*437bfbebSnyanmisaka     p_regs->sw59.pred_bc_tap_0_2 = 5;
59*437bfbebSnyanmisaka     p_regs->sw153.pred_bc_tap_0_3 = 0x3FF;
60*437bfbebSnyanmisaka     p_regs->sw153.pred_bc_tap_1_0 = 1;
61*437bfbebSnyanmisaka     p_regs->sw153.pred_bc_tap_1_1 = 7;
62*437bfbebSnyanmisaka     p_regs->sw154.pred_bc_tap_1_2 = 7;
63*437bfbebSnyanmisaka     p_regs->sw154.pred_bc_tap_1_3 = 1;
64*437bfbebSnyanmisaka 
65*437bfbebSnyanmisaka     p_regs->sw50.dec_tiled_lsb = 0;
66*437bfbebSnyanmisaka 
67*437bfbebSnyanmisaka     return MPP_OK;
68*437bfbebSnyanmisaka }
69*437bfbebSnyanmisaka 
set_regs_parameters(AvsdHalCtx_t * p_hal,HalDecTask * task)70*437bfbebSnyanmisaka static MPP_RET set_regs_parameters(AvsdHalCtx_t *p_hal, HalDecTask *task)
71*437bfbebSnyanmisaka {
72*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
73*437bfbebSnyanmisaka 
74*437bfbebSnyanmisaka     AvsdSyntax_t *p_syn = &p_hal->syn;
75*437bfbebSnyanmisaka     AvsdVdpu2Regs_t *p_regs = (AvsdVdpu2Regs_t *)p_hal->p_regs;
76*437bfbebSnyanmisaka 
77*437bfbebSnyanmisaka     set_defalut_parameters(p_hal);
78*437bfbebSnyanmisaka 
79*437bfbebSnyanmisaka     p_regs->sw57.timeout_sts_en = 1;
80*437bfbebSnyanmisaka     p_regs->sw57.dec_clkgate_en = 1;
81*437bfbebSnyanmisaka     p_regs->sw55.dec_irq_dis = 0;
82*437bfbebSnyanmisaka 
83*437bfbebSnyanmisaka     //!< set wrok_out pic info
84*437bfbebSnyanmisaka     if (p_hal->work_out < 0) {
85*437bfbebSnyanmisaka         p_hal->work_out = get_queue_pic(p_hal);
86*437bfbebSnyanmisaka         if (p_hal->work_out < 0) {
87*437bfbebSnyanmisaka             ret = MPP_NOK;
88*437bfbebSnyanmisaka             mpp_err_f("cannot get a pic_info buffer.\n");
89*437bfbebSnyanmisaka             goto __FAILED;
90*437bfbebSnyanmisaka         }
91*437bfbebSnyanmisaka     }
92*437bfbebSnyanmisaka     {
93*437bfbebSnyanmisaka         AvsdHalPic_t *p_work_out = &p_hal->pic[p_hal->work_out];
94*437bfbebSnyanmisaka 
95*437bfbebSnyanmisaka         p_work_out->slot_idx = task->output;
96*437bfbebSnyanmisaka         p_work_out->pic_code_type = p_syn->pp.picCodingType;
97*437bfbebSnyanmisaka         p_work_out->picture_distance = p_syn->pp.pictureDistance;
98*437bfbebSnyanmisaka     }
99*437bfbebSnyanmisaka     //!< set register
100*437bfbebSnyanmisaka     p_regs->sw120.pic_mb_width = (p_syn->pp.horizontalSize + 15) >> 4;
101*437bfbebSnyanmisaka     p_regs->sw53.dec_fmt_sel = 11; //!< DEC_MODE_AVS
102*437bfbebSnyanmisaka 
103*437bfbebSnyanmisaka     if (p_syn->pp.pictureStructure == FRAMEPICTURE) {
104*437bfbebSnyanmisaka         p_regs->sw57.pic_interlace_e = 0; //!< interlace_e
105*437bfbebSnyanmisaka         p_regs->sw57.pic_fieldmode_e = 0; //!< fieldmode_e
106*437bfbebSnyanmisaka         p_regs->sw57.pic_topfield_e = 0; //!< topfield_e
107*437bfbebSnyanmisaka     } else {
108*437bfbebSnyanmisaka         p_regs->sw57.pic_interlace_e = 1;
109*437bfbebSnyanmisaka         p_regs->sw57.pic_fieldmode_e = 1;
110*437bfbebSnyanmisaka         p_regs->sw57.pic_topfield_e = p_hal->first_field;
111*437bfbebSnyanmisaka     }
112*437bfbebSnyanmisaka 
113*437bfbebSnyanmisaka     p_regs->sw120.pic_mb_height_p = (p_syn->pp.verticalSize + 15) >> 4;
114*437bfbebSnyanmisaka     p_regs->sw121.avs_h_ext = (p_syn->pp.verticalSize + 15) >> 12;
115*437bfbebSnyanmisaka     p_regs->sw57.pic_b_e = (p_syn->pp.picCodingType == BFRAME);
116*437bfbebSnyanmisaka     p_regs->sw57.pic_inter_e = (p_syn->pp.picCodingType != IFRAME) ? 1 : 0;
117*437bfbebSnyanmisaka 
118*437bfbebSnyanmisaka     p_regs->sw122.strm_start_bit = 8 * (p_hal->data_offset & 0x7);
119*437bfbebSnyanmisaka     p_hal->data_offset = (p_hal->data_offset & ~0x7);
120*437bfbebSnyanmisaka     p_regs->sw64.rlc_vlc_st_adr = get_packet_fd(p_hal, task->input);
121*437bfbebSnyanmisaka     mpp_dev_set_reg_offset(p_hal->dev, 64, p_hal->data_offset);
122*437bfbebSnyanmisaka     p_regs->sw51.stream_len = p_syn->bitstream_size - p_hal->data_offset;
123*437bfbebSnyanmisaka     p_regs->sw50.dec_fixed_quant = p_syn->pp.fixedPictureQp;
124*437bfbebSnyanmisaka     p_regs->sw51.init_qp = p_syn->pp.pictureQp;
125*437bfbebSnyanmisaka 
126*437bfbebSnyanmisaka     p_regs->sw63.dec_out_st_adr = get_frame_fd(p_hal, task->output);
127*437bfbebSnyanmisaka     if (p_syn->pp.pictureStructure == FIELDPICTURE && !p_hal->first_field) {
128*437bfbebSnyanmisaka         //!< start of bottom field line
129*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 63, p_syn->pp.horizontalSize);
130*437bfbebSnyanmisaka     }
131*437bfbebSnyanmisaka     {
132*437bfbebSnyanmisaka         RK_S32 tmp_fwd = -1;
133*437bfbebSnyanmisaka         RK_S32 refer0 = -1;
134*437bfbebSnyanmisaka         RK_S32 refer1 = -1;
135*437bfbebSnyanmisaka 
136*437bfbebSnyanmisaka         tmp_fwd = (p_hal->work1 < 0) ? p_hal->work0 : p_hal->work1;
137*437bfbebSnyanmisaka         tmp_fwd = (tmp_fwd < 0) ? p_hal->work_out : tmp_fwd;
138*437bfbebSnyanmisaka 
139*437bfbebSnyanmisaka         refer0 = (task->refer[0] < 0) ? task->output : task->refer[0];
140*437bfbebSnyanmisaka         refer1 = (task->refer[1] < 0) ? refer0 : task->refer[1];
141*437bfbebSnyanmisaka         if (!p_hal->first_field
142*437bfbebSnyanmisaka             && p_syn->pp.pictureStructure == FIELDPICTURE
143*437bfbebSnyanmisaka             && p_syn->pp.picCodingType != BFRAME) {
144*437bfbebSnyanmisaka             p_regs->sw131.refer0_base = get_frame_fd(p_hal, task->output);
145*437bfbebSnyanmisaka             p_regs->sw148.refer1_base = get_frame_fd(p_hal, refer0);
146*437bfbebSnyanmisaka             p_regs->sw134.refer2_base = get_frame_fd(p_hal, refer0);
147*437bfbebSnyanmisaka             p_regs->sw135.refer3_base = get_frame_fd(p_hal, refer1);
148*437bfbebSnyanmisaka         } else {
149*437bfbebSnyanmisaka             p_regs->sw131.refer0_base = get_frame_fd(p_hal, refer0);
150*437bfbebSnyanmisaka             p_regs->sw148.refer1_base = get_frame_fd(p_hal, refer0);
151*437bfbebSnyanmisaka             p_regs->sw134.refer2_base = get_frame_fd(p_hal, refer1);
152*437bfbebSnyanmisaka             p_regs->sw135.refer3_base = get_frame_fd(p_hal, refer1);
153*437bfbebSnyanmisaka         }
154*437bfbebSnyanmisaka     }
155*437bfbebSnyanmisaka     //!< block distances
156*437bfbebSnyanmisaka     if (p_syn->pp.pictureStructure == FRAMEPICTURE) {
157*437bfbebSnyanmisaka         if (p_syn->pp.picCodingType == BFRAME) {
158*437bfbebSnyanmisaka             RK_S32 tmp = 0;
159*437bfbebSnyanmisaka             //!< current to future anchor
160*437bfbebSnyanmisaka             if (p_hal->work0 >= 0) {
161*437bfbebSnyanmisaka                 tmp = (2 * p_hal->pic[p_hal->work0].picture_distance -
162*437bfbebSnyanmisaka                        2 * p_syn->pp.pictureDistance + 512) & 0x1FF;
163*437bfbebSnyanmisaka             }
164*437bfbebSnyanmisaka             //!< prevent division by zero
165*437bfbebSnyanmisaka             if (!tmp) tmp = 2;
166*437bfbebSnyanmisaka             p_regs->sw133.ref_dist_cur_2 = tmp;
167*437bfbebSnyanmisaka             p_regs->sw133.ref_dist_cur_3 = tmp;
168*437bfbebSnyanmisaka             p_regs->sw147.ref_invd_cur_2 = 512 / tmp;
169*437bfbebSnyanmisaka             p_regs->sw147.ref_invd_cur_3 = 512 / tmp;
170*437bfbebSnyanmisaka 
171*437bfbebSnyanmisaka             //!< current to past anchor
172*437bfbebSnyanmisaka             if (p_hal->work1 >= 0) {
173*437bfbebSnyanmisaka                 tmp = (2 * p_syn->pp.pictureDistance -
174*437bfbebSnyanmisaka                        2 * p_hal->pic[p_hal->work1].picture_distance - 512) & 0x1FF;
175*437bfbebSnyanmisaka                 if (!tmp) tmp = 2;
176*437bfbebSnyanmisaka             }
177*437bfbebSnyanmisaka             p_regs->sw132.ref_dist_cur_0 = tmp;
178*437bfbebSnyanmisaka             p_regs->sw132.ref_dist_cur_1 = tmp;
179*437bfbebSnyanmisaka             p_regs->sw146.ref_invd_cur_0 = 512 / tmp;
180*437bfbebSnyanmisaka             p_regs->sw146.ref_invd_cur_1 = 512 / tmp;
181*437bfbebSnyanmisaka             //!< future anchor to past anchor
182*437bfbebSnyanmisaka             if (p_hal->work0 >= 0 && p_hal->work1 >= 0) {
183*437bfbebSnyanmisaka                 tmp = (2 * p_hal->pic[p_hal->work0].picture_distance -
184*437bfbebSnyanmisaka                        2 * p_hal->pic[p_hal->work1].picture_distance - 512) & 0x1FF;
185*437bfbebSnyanmisaka                 if (!tmp) tmp = 2;
186*437bfbebSnyanmisaka             }
187*437bfbebSnyanmisaka             tmp = 16384 / tmp;
188*437bfbebSnyanmisaka             p_regs->sw129.ref_invd_col_0 = tmp;
189*437bfbebSnyanmisaka             p_regs->sw129.ref_invd_col_1 = tmp;
190*437bfbebSnyanmisaka             //!< future anchor to previous past anchor
191*437bfbebSnyanmisaka             tmp = p_hal->future2prev_past_dist;
192*437bfbebSnyanmisaka             tmp = 16384 / tmp;
193*437bfbebSnyanmisaka             p_regs->sw130.ref_invd_col_2 = tmp;
194*437bfbebSnyanmisaka             p_regs->sw130.ref_invd_col_3 = tmp;
195*437bfbebSnyanmisaka         } else {
196*437bfbebSnyanmisaka             RK_S32 tmp = 0;
197*437bfbebSnyanmisaka             //!< current to past anchor
198*437bfbebSnyanmisaka             if (p_hal->work0 >= 0) {
199*437bfbebSnyanmisaka                 tmp = (2 * p_syn->pp.pictureDistance -
200*437bfbebSnyanmisaka                        2 * p_hal->pic[p_hal->work0].picture_distance - 512) & 0x1FF;
201*437bfbebSnyanmisaka             }
202*437bfbebSnyanmisaka             if (!tmp) tmp = 2;
203*437bfbebSnyanmisaka             p_regs->sw132.ref_dist_cur_0 = tmp;
204*437bfbebSnyanmisaka             p_regs->sw132.ref_dist_cur_1 = tmp;
205*437bfbebSnyanmisaka             p_regs->sw146.ref_invd_cur_0 = 512 / tmp;
206*437bfbebSnyanmisaka             p_regs->sw146.ref_invd_cur_1 = 512 / tmp;
207*437bfbebSnyanmisaka             //!< current to previous past anchor
208*437bfbebSnyanmisaka             if (p_hal->work1 >= 0) {
209*437bfbebSnyanmisaka                 tmp = (2 * p_syn->pp.pictureDistance -
210*437bfbebSnyanmisaka                        2 * p_hal->pic[p_hal->work1].picture_distance - 512) & 0x1FF;
211*437bfbebSnyanmisaka                 if (!tmp) tmp = 2;
212*437bfbebSnyanmisaka             }
213*437bfbebSnyanmisaka             //!< this will become "future to previous past" for next B
214*437bfbebSnyanmisaka             p_hal->future2prev_past_dist = tmp;
215*437bfbebSnyanmisaka 
216*437bfbebSnyanmisaka             p_regs->sw133.ref_dist_cur_2 = tmp;
217*437bfbebSnyanmisaka             p_regs->sw133.ref_dist_cur_3 = tmp;
218*437bfbebSnyanmisaka             p_regs->sw147.ref_invd_cur_2 = 512 / tmp;
219*437bfbebSnyanmisaka             p_regs->sw147.ref_invd_cur_3 = 512 / tmp;
220*437bfbebSnyanmisaka 
221*437bfbebSnyanmisaka             p_regs->sw129.ref_invd_col_0 = 0;
222*437bfbebSnyanmisaka             p_regs->sw129.ref_invd_col_1 = 0;
223*437bfbebSnyanmisaka             p_regs->sw130.ref_invd_col_2 = 0;
224*437bfbebSnyanmisaka             p_regs->sw130.ref_invd_col_3 = 0;
225*437bfbebSnyanmisaka         }
226*437bfbebSnyanmisaka     } else {
227*437bfbebSnyanmisaka         //!< field interlaced
228*437bfbebSnyanmisaka         if (p_syn->pp.picCodingType == BFRAME) {
229*437bfbebSnyanmisaka             RK_S32 tmp = 0;
230*437bfbebSnyanmisaka             //!< block distances
231*437bfbebSnyanmisaka             if (p_hal->work0 >= 0) {
232*437bfbebSnyanmisaka                 tmp = (2 * p_hal->pic[p_hal->work0].picture_distance -
233*437bfbebSnyanmisaka                        2 * p_syn->pp.pictureDistance + 512) & 0x1FF;
234*437bfbebSnyanmisaka             }
235*437bfbebSnyanmisaka             //!< prevent division by zero
236*437bfbebSnyanmisaka             if (!tmp) tmp = 2;
237*437bfbebSnyanmisaka 
238*437bfbebSnyanmisaka             if (p_hal->first_field) {
239*437bfbebSnyanmisaka                 p_regs->sw133.ref_dist_cur_2 = tmp;
240*437bfbebSnyanmisaka                 p_regs->sw133.ref_dist_cur_3 = tmp + 1;
241*437bfbebSnyanmisaka                 p_regs->sw147.ref_invd_cur_2 = 512 / tmp;
242*437bfbebSnyanmisaka                 p_regs->sw147.ref_invd_cur_3 = 512 / (tmp + 1);
243*437bfbebSnyanmisaka             } else {
244*437bfbebSnyanmisaka                 p_regs->sw133.ref_dist_cur_2 = tmp - 1;
245*437bfbebSnyanmisaka                 p_regs->sw133.ref_dist_cur_3 = tmp;
246*437bfbebSnyanmisaka                 p_regs->sw147.ref_invd_cur_2 = 512 / (tmp - 1);
247*437bfbebSnyanmisaka                 p_regs->sw147.ref_invd_cur_3 = 512 / tmp;
248*437bfbebSnyanmisaka             }
249*437bfbebSnyanmisaka 
250*437bfbebSnyanmisaka             if (p_hal->work1 >= 0) {
251*437bfbebSnyanmisaka                 tmp = (2 * p_syn->pp.pictureDistance -
252*437bfbebSnyanmisaka                        2 * p_hal->pic[p_hal->work1].picture_distance - 512) & 0x1FF;
253*437bfbebSnyanmisaka                 if (!tmp) tmp = 2;
254*437bfbebSnyanmisaka             }
255*437bfbebSnyanmisaka             if (p_hal->first_field) {
256*437bfbebSnyanmisaka                 p_regs->sw132.ref_dist_cur_0 = (tmp - 1);
257*437bfbebSnyanmisaka                 p_regs->sw132.ref_dist_cur_1 = tmp;
258*437bfbebSnyanmisaka                 p_regs->sw146.ref_invd_cur_0 = 512 / (tmp - 1);
259*437bfbebSnyanmisaka                 p_regs->sw146.ref_invd_cur_1 = 512 / tmp;
260*437bfbebSnyanmisaka             } else {
261*437bfbebSnyanmisaka                 p_regs->sw132.ref_dist_cur_0 = tmp;
262*437bfbebSnyanmisaka                 p_regs->sw132.ref_dist_cur_1 = tmp + 1;
263*437bfbebSnyanmisaka                 p_regs->sw146.ref_invd_cur_0 = 512 / tmp;
264*437bfbebSnyanmisaka                 p_regs->sw146.ref_invd_cur_1 = 512 / (tmp + 1);
265*437bfbebSnyanmisaka             }
266*437bfbebSnyanmisaka 
267*437bfbebSnyanmisaka             if (p_hal->work0 >= 0 && p_hal->work1 >= 0) {
268*437bfbebSnyanmisaka                 tmp = (2 * p_hal->pic[p_hal->work0].picture_distance -
269*437bfbebSnyanmisaka                        2 * p_hal->pic[p_hal->work1].picture_distance - 512) & 0x1FF;
270*437bfbebSnyanmisaka                 if (!tmp) tmp = 2;
271*437bfbebSnyanmisaka             }
272*437bfbebSnyanmisaka 
273*437bfbebSnyanmisaka             if (p_syn->pp.pbFieldEnhancedFlag && !p_hal->first_field) {
274*437bfbebSnyanmisaka                 //!< in this case, BlockDistanceRef is different with before, the mvRef points to top field
275*437bfbebSnyanmisaka                 p_regs->sw129.ref_invd_col_0 = 16384 / (tmp - 1);
276*437bfbebSnyanmisaka                 p_regs->sw129.ref_invd_col_1 = 16384 / tmp;
277*437bfbebSnyanmisaka 
278*437bfbebSnyanmisaka                 //!< future anchor to previous past anchor
279*437bfbebSnyanmisaka                 tmp = p_hal->future2prev_past_dist;
280*437bfbebSnyanmisaka 
281*437bfbebSnyanmisaka                 p_regs->sw130.ref_invd_col_2 = 16384 / (tmp - 1);
282*437bfbebSnyanmisaka                 p_regs->sw130.ref_invd_col_3 = 16384 / tmp;
283*437bfbebSnyanmisaka             } else {
284*437bfbebSnyanmisaka                 if (p_hal->first_field) {
285*437bfbebSnyanmisaka                     p_regs->sw129.ref_invd_col_0 = 16384 / (tmp - 1);
286*437bfbebSnyanmisaka                     p_regs->sw129.ref_invd_col_1 = 16384 / tmp;
287*437bfbebSnyanmisaka                 } else {
288*437bfbebSnyanmisaka                     p_regs->sw129.ref_invd_col_0 = 16384;
289*437bfbebSnyanmisaka                     p_regs->sw129.ref_invd_col_1 = 16384 / tmp;
290*437bfbebSnyanmisaka                     p_regs->sw130.ref_invd_col_2 = 16384 / (tmp + 1);
291*437bfbebSnyanmisaka                 }
292*437bfbebSnyanmisaka 
293*437bfbebSnyanmisaka                 //!< future anchor to previous past anchor
294*437bfbebSnyanmisaka                 tmp = p_hal->future2prev_past_dist;
295*437bfbebSnyanmisaka 
296*437bfbebSnyanmisaka                 if (p_hal->first_field) {
297*437bfbebSnyanmisaka                     p_regs->sw130.ref_invd_col_2 = 16384 / (tmp - 1);
298*437bfbebSnyanmisaka                     p_regs->sw130.ref_invd_col_3 = 16384 / tmp;
299*437bfbebSnyanmisaka                 } else {
300*437bfbebSnyanmisaka                     p_regs->sw130.ref_invd_col_3 = 16384 / tmp;
301*437bfbebSnyanmisaka                 }
302*437bfbebSnyanmisaka             }
303*437bfbebSnyanmisaka         } else {
304*437bfbebSnyanmisaka             RK_S32 tmp = 0;
305*437bfbebSnyanmisaka             if (p_hal->work0 >= 0) {
306*437bfbebSnyanmisaka                 tmp = (2 * p_syn->pp.pictureDistance -
307*437bfbebSnyanmisaka                        2 * p_hal->pic[p_hal->work0].picture_distance - 512) & 0x1FF;
308*437bfbebSnyanmisaka             }
309*437bfbebSnyanmisaka             if (!tmp) tmp = 2;
310*437bfbebSnyanmisaka 
311*437bfbebSnyanmisaka             if (!p_hal->first_field) {
312*437bfbebSnyanmisaka                 p_regs->sw132.ref_dist_cur_0 = 1;
313*437bfbebSnyanmisaka                 p_regs->sw133.ref_dist_cur_2 = tmp + 1;
314*437bfbebSnyanmisaka 
315*437bfbebSnyanmisaka                 p_regs->sw146.ref_invd_cur_0 = 512;
316*437bfbebSnyanmisaka                 p_regs->sw147.ref_invd_cur_2 = 512 / (tmp + 1);
317*437bfbebSnyanmisaka             } else {
318*437bfbebSnyanmisaka                 p_regs->sw132.ref_dist_cur_0 = tmp - 1;
319*437bfbebSnyanmisaka                 p_regs->sw146.ref_invd_cur_0 = 512 / (tmp - 1);
320*437bfbebSnyanmisaka             }
321*437bfbebSnyanmisaka             p_regs->sw132.ref_dist_cur_1 = tmp;
322*437bfbebSnyanmisaka             p_regs->sw146.ref_invd_cur_1 = 512 / tmp;
323*437bfbebSnyanmisaka 
324*437bfbebSnyanmisaka             if (p_hal->work1 >= 0) {
325*437bfbebSnyanmisaka                 tmp = (2 * p_syn->pp.pictureDistance -
326*437bfbebSnyanmisaka                        2 * p_hal->pic[p_hal->work1].picture_distance - 512) & 0x1FF;
327*437bfbebSnyanmisaka                 if (!tmp) tmp = 2;
328*437bfbebSnyanmisaka             }
329*437bfbebSnyanmisaka             //!< this will become "future to previous past" for next B
330*437bfbebSnyanmisaka             p_hal->future2prev_past_dist = tmp;
331*437bfbebSnyanmisaka             if (p_hal->first_field) {
332*437bfbebSnyanmisaka                 p_regs->sw133.ref_dist_cur_2 = tmp - 1;
333*437bfbebSnyanmisaka                 p_regs->sw133.ref_dist_cur_3 = tmp;
334*437bfbebSnyanmisaka 
335*437bfbebSnyanmisaka                 p_regs->sw147.ref_invd_cur_2 = 512 / (tmp - 1);
336*437bfbebSnyanmisaka                 p_regs->sw147.ref_invd_cur_3 = 512 / tmp;
337*437bfbebSnyanmisaka             } else {
338*437bfbebSnyanmisaka                 p_regs->sw133.ref_dist_cur_3 = tmp;
339*437bfbebSnyanmisaka                 p_regs->sw147.ref_invd_cur_3 = 512 / tmp;
340*437bfbebSnyanmisaka             }
341*437bfbebSnyanmisaka 
342*437bfbebSnyanmisaka             p_regs->sw129.ref_invd_col_0 = 0;
343*437bfbebSnyanmisaka             p_regs->sw129.ref_invd_col_1 = 0;
344*437bfbebSnyanmisaka             p_regs->sw130.ref_invd_col_2 = 0;
345*437bfbebSnyanmisaka             p_regs->sw130.ref_invd_col_3 = 0;
346*437bfbebSnyanmisaka         }
347*437bfbebSnyanmisaka     }
348*437bfbebSnyanmisaka 
349*437bfbebSnyanmisaka     p_regs->sw52.startmb_x = 0;
350*437bfbebSnyanmisaka     p_regs->sw52.startmb_y = 0;
351*437bfbebSnyanmisaka 
352*437bfbebSnyanmisaka     p_regs->sw50.filtering_dis = p_syn->pp.loopFilterDisable;
353*437bfbebSnyanmisaka     p_regs->sw122.alpha_offset = p_syn->pp.alphaOffset;
354*437bfbebSnyanmisaka     p_regs->sw122.beta_offset = p_syn->pp.betaOffset;
355*437bfbebSnyanmisaka     p_regs->sw50.skip_mode = p_syn->pp.skipModeFlag;
356*437bfbebSnyanmisaka     p_regs->sw120.pic_refer_flag = p_syn->pp.pictureReferenceFlag;
357*437bfbebSnyanmisaka 
358*437bfbebSnyanmisaka     if (p_syn->pp.picCodingType == PFRAME
359*437bfbebSnyanmisaka         || (p_syn->pp.picCodingType == IFRAME && !p_hal->first_field)) {
360*437bfbebSnyanmisaka         p_regs->sw57.dmmv_wr_en = 1;
361*437bfbebSnyanmisaka     } else {
362*437bfbebSnyanmisaka         p_regs->sw57.dmmv_wr_en = 0;
363*437bfbebSnyanmisaka     }
364*437bfbebSnyanmisaka 
365*437bfbebSnyanmisaka     //!< set mv base
366*437bfbebSnyanmisaka     p_regs->sw62.dmmv_st_adr = mpp_buffer_get_fd(p_hal->mv_buf);
367*437bfbebSnyanmisaka     if (p_hal->first_field ||
368*437bfbebSnyanmisaka         (p_syn->pp.picCodingType == BFRAME && p_hal->prev_pic_structure)) {
369*437bfbebSnyanmisaka     } else {
370*437bfbebSnyanmisaka         RK_U32 frame_width = 0, frame_height = 0, offset = 0;
371*437bfbebSnyanmisaka         frame_width = (p_syn->pp.horizontalSize + 15) >> 4;
372*437bfbebSnyanmisaka         if (p_syn->pp.progressiveFrame)
373*437bfbebSnyanmisaka             frame_height = (p_syn->pp.verticalSize + 15) >> 4;
374*437bfbebSnyanmisaka         else
375*437bfbebSnyanmisaka             frame_height = 2 * ((p_syn->pp.verticalSize + 31) >> 5);
376*437bfbebSnyanmisaka         offset = MPP_ALIGN(frame_width * frame_height / 2, 2) * 16;
377*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 62, offset);
378*437bfbebSnyanmisaka     }
379*437bfbebSnyanmisaka     {
380*437bfbebSnyanmisaka         RK_U32 pic_type = 0;
381*437bfbebSnyanmisaka         RK_U32 prev_anc_type = 0;
382*437bfbebSnyanmisaka         if (p_hal->work0 >= 0) {
383*437bfbebSnyanmisaka             pic_type = p_hal->pic[p_hal->work0].pic_type;
384*437bfbebSnyanmisaka         }
385*437bfbebSnyanmisaka         prev_anc_type = !pic_type || (!p_hal->first_field && !p_hal->prev_pic_structure);
386*437bfbebSnyanmisaka         p_regs->sw136.prev_anc_type = prev_anc_type;
387*437bfbebSnyanmisaka     }
388*437bfbebSnyanmisaka     //!< b-picture needs to know if future reference is field or frame coded
389*437bfbebSnyanmisaka     // p_regs->sw134.refer2_field_e = (!p_hal->prev_pic_structure) ? 1 : 0;
390*437bfbebSnyanmisaka     // p_regs->sw135.refer3_field_e = (!p_hal->prev_pic_structure) ? 1 : 0;
391*437bfbebSnyanmisaka     if (!p_hal->prev_pic_structure) {
392*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 134, 2);
393*437bfbebSnyanmisaka         mpp_dev_set_reg_offset(p_hal->dev, 135, 3);
394*437bfbebSnyanmisaka     }
395*437bfbebSnyanmisaka 
396*437bfbebSnyanmisaka     p_regs->sw57.dec_out_dis = 0;
397*437bfbebSnyanmisaka     p_regs->sw57.dec_e = 1;
398*437bfbebSnyanmisaka 
399*437bfbebSnyanmisaka     return MPP_OK;
400*437bfbebSnyanmisaka __FAILED:
401*437bfbebSnyanmisaka     return ret;
402*437bfbebSnyanmisaka }
403*437bfbebSnyanmisaka 
update_parameters(AvsdHalCtx_t * p_hal)404*437bfbebSnyanmisaka static MPP_RET update_parameters(AvsdHalCtx_t *p_hal)
405*437bfbebSnyanmisaka {
406*437bfbebSnyanmisaka     AvsdSyntax_t *p_syn = &p_hal->syn;
407*437bfbebSnyanmisaka 
408*437bfbebSnyanmisaka     if (p_syn->pp.pictureStructure == FRAMEPICTURE || !p_hal->first_field) {
409*437bfbebSnyanmisaka         p_hal->first_field = 1;
410*437bfbebSnyanmisaka         if (p_syn->pp.picCodingType != BFRAME) {
411*437bfbebSnyanmisaka             RK_S32 temp = p_hal->work1;
412*437bfbebSnyanmisaka 
413*437bfbebSnyanmisaka             p_hal->work1 =  p_hal->work0;
414*437bfbebSnyanmisaka             p_hal->work0 =  p_hal->work_out;
415*437bfbebSnyanmisaka 
416*437bfbebSnyanmisaka             if (p_hal->work_out >= 0)
417*437bfbebSnyanmisaka                 p_hal->pic[p_hal->work_out].pic_type = p_syn->pp.picCodingType == IFRAME;
418*437bfbebSnyanmisaka             p_hal->work_out = temp;
419*437bfbebSnyanmisaka             p_hal->prev_pic_structure = p_syn->pp.pictureStructure;
420*437bfbebSnyanmisaka         }
421*437bfbebSnyanmisaka         p_hal->prev_pic_code_type = p_syn->pp.picCodingType;
422*437bfbebSnyanmisaka     } else {
423*437bfbebSnyanmisaka         p_hal->first_field = 0;
424*437bfbebSnyanmisaka     }
425*437bfbebSnyanmisaka 
426*437bfbebSnyanmisaka     return MPP_OK;
427*437bfbebSnyanmisaka }
428*437bfbebSnyanmisaka 
repeat_other_field(AvsdHalCtx_t * p_hal,HalTaskInfo * task)429*437bfbebSnyanmisaka static MPP_RET repeat_other_field(AvsdHalCtx_t *p_hal, HalTaskInfo *task)
430*437bfbebSnyanmisaka {
431*437bfbebSnyanmisaka     RK_U8 i = 0;
432*437bfbebSnyanmisaka     RK_U8 *pdata = NULL;
433*437bfbebSnyanmisaka     MppBuffer mbuffer = NULL;
434*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
435*437bfbebSnyanmisaka     AvsdVdpu2Regs_t *p_regs = (AvsdVdpu2Regs_t *)p_hal->p_regs;
436*437bfbebSnyanmisaka 
437*437bfbebSnyanmisaka     //!< re-find start code and calculate offset
438*437bfbebSnyanmisaka     p_hal->data_offset = p_regs->sw64.rlc_vlc_st_adr >> 10;
439*437bfbebSnyanmisaka     p_hal->data_offset += p_hal->syn.bitstream_offset;
440*437bfbebSnyanmisaka     p_hal->data_offset -= MPP_MIN(p_hal->data_offset, 8);
441*437bfbebSnyanmisaka 
442*437bfbebSnyanmisaka     mpp_buf_slot_get_prop(p_hal->packet_slots, task->dec.input, SLOT_BUFFER, &mbuffer);
443*437bfbebSnyanmisaka     pdata = (RK_U8 *)mpp_buffer_get_ptr(mbuffer) + p_hal->data_offset;
444*437bfbebSnyanmisaka 
445*437bfbebSnyanmisaka     while (i < 16) {
446*437bfbebSnyanmisaka         if (pdata[i] == 0 && pdata[i + 1] == 0 && pdata[i + 2] == 1) {
447*437bfbebSnyanmisaka             p_hal->data_offset += i;
448*437bfbebSnyanmisaka             break;
449*437bfbebSnyanmisaka         }
450*437bfbebSnyanmisaka         i++;
451*437bfbebSnyanmisaka     }
452*437bfbebSnyanmisaka 
453*437bfbebSnyanmisaka     AVSD_HAL_DBG(AVSD_HAL_DBG_OFFSET, "frame_no %d idx %d offset %x\n",
454*437bfbebSnyanmisaka                  p_hal->frame_no, i, p_hal->data_offset);
455*437bfbebSnyanmisaka 
456*437bfbebSnyanmisaka     //!< re-generate register
457*437bfbebSnyanmisaka     FUN_CHECK(ret = set_regs_parameters(p_hal, &task->dec));
458*437bfbebSnyanmisaka     hal_avsd_vdpu2_start((void *)p_hal, task);
459*437bfbebSnyanmisaka     hal_avsd_vdpu2_wait((void *)p_hal, task);
460*437bfbebSnyanmisaka 
461*437bfbebSnyanmisaka     return ret = MPP_OK;
462*437bfbebSnyanmisaka __FAILED:
463*437bfbebSnyanmisaka     return ret;
464*437bfbebSnyanmisaka }
465*437bfbebSnyanmisaka 
466*437bfbebSnyanmisaka 
467*437bfbebSnyanmisaka /*!
468*437bfbebSnyanmisaka  ***********************************************************************
469*437bfbebSnyanmisaka  * \brief
470*437bfbebSnyanmisaka  *    init
471*437bfbebSnyanmisaka  ***********************************************************************
472*437bfbebSnyanmisaka  */
473*437bfbebSnyanmisaka //extern "C"
hal_avsd_vdpu2_init(void * decoder,MppHalCfg * cfg)474*437bfbebSnyanmisaka MPP_RET hal_avsd_vdpu2_init(void *decoder, MppHalCfg *cfg)
475*437bfbebSnyanmisaka {
476*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
477*437bfbebSnyanmisaka     RK_U32 buf_size = 0;
478*437bfbebSnyanmisaka     AvsdHalCtx_t *p_hal = (AvsdHalCtx_t *)decoder;
479*437bfbebSnyanmisaka 
480*437bfbebSnyanmisaka     AVSD_HAL_TRACE("AVS_vdpu2 In.");
481*437bfbebSnyanmisaka 
482*437bfbebSnyanmisaka     buf_size = (1920 * 1088) * 2;
483*437bfbebSnyanmisaka     FUN_CHECK(ret = mpp_buffer_get(p_hal->buf_group, &p_hal->mv_buf, buf_size));
484*437bfbebSnyanmisaka 
485*437bfbebSnyanmisaka     p_hal->p_regs = mpp_calloc_size(RK_U32, sizeof(AvsdVdpu2Regs_t));
486*437bfbebSnyanmisaka     MEM_CHECK(ret, p_hal->p_regs);
487*437bfbebSnyanmisaka 
488*437bfbebSnyanmisaka     mpp_slots_set_prop(p_hal->frame_slots, SLOTS_HOR_ALIGN, avsd_hor_align);
489*437bfbebSnyanmisaka     mpp_slots_set_prop(p_hal->frame_slots, SLOTS_VER_ALIGN, avsd_ver_align);
490*437bfbebSnyanmisaka     mpp_slots_set_prop(p_hal->frame_slots, SLOTS_LEN_ALIGN, avsd_len_align);
491*437bfbebSnyanmisaka 
492*437bfbebSnyanmisaka     p_hal->regs_num = 159;
493*437bfbebSnyanmisaka     //!< initial for control
494*437bfbebSnyanmisaka     p_hal->first_field = 1;
495*437bfbebSnyanmisaka     p_hal->prev_pic_structure = 0; //!< field
496*437bfbebSnyanmisaka 
497*437bfbebSnyanmisaka     memset(p_hal->pic, 0, sizeof(p_hal->pic));
498*437bfbebSnyanmisaka     p_hal->work_out = -1;
499*437bfbebSnyanmisaka     p_hal->work0 = -1;
500*437bfbebSnyanmisaka     p_hal->work1 = -1;
501*437bfbebSnyanmisaka 
502*437bfbebSnyanmisaka     AVSD_HAL_TRACE("Out.");
503*437bfbebSnyanmisaka     (void)cfg;
504*437bfbebSnyanmisaka     return ret = MPP_OK;
505*437bfbebSnyanmisaka __FAILED:
506*437bfbebSnyanmisaka     return ret;
507*437bfbebSnyanmisaka 
508*437bfbebSnyanmisaka }
509*437bfbebSnyanmisaka /*!
510*437bfbebSnyanmisaka  ***********************************************************************
511*437bfbebSnyanmisaka  * \brief
512*437bfbebSnyanmisaka  *    deinit
513*437bfbebSnyanmisaka  ***********************************************************************
514*437bfbebSnyanmisaka  */
515*437bfbebSnyanmisaka //extern "C"
hal_avsd_vdpu2_deinit(void * decoder)516*437bfbebSnyanmisaka MPP_RET hal_avsd_vdpu2_deinit(void *decoder)
517*437bfbebSnyanmisaka {
518*437bfbebSnyanmisaka     AvsdHalCtx_t *p_hal = (AvsdHalCtx_t *)decoder;
519*437bfbebSnyanmisaka 
520*437bfbebSnyanmisaka     AVSD_HAL_TRACE("In.");
521*437bfbebSnyanmisaka 
522*437bfbebSnyanmisaka     if (p_hal->mv_buf) {
523*437bfbebSnyanmisaka         mpp_buffer_put(p_hal->mv_buf);
524*437bfbebSnyanmisaka         p_hal->mv_buf = NULL;
525*437bfbebSnyanmisaka     }
526*437bfbebSnyanmisaka     MPP_FREE(p_hal->p_regs);
527*437bfbebSnyanmisaka 
528*437bfbebSnyanmisaka     AVSD_HAL_TRACE("Out.");
529*437bfbebSnyanmisaka 
530*437bfbebSnyanmisaka     return MPP_OK;
531*437bfbebSnyanmisaka }
532*437bfbebSnyanmisaka /*!
533*437bfbebSnyanmisaka  ***********************************************************************
534*437bfbebSnyanmisaka  * \brief
535*437bfbebSnyanmisaka  *    generate register
536*437bfbebSnyanmisaka  ***********************************************************************
537*437bfbebSnyanmisaka  */
538*437bfbebSnyanmisaka //extern "C"
hal_avsd_vdpu2_gen_regs(void * decoder,HalTaskInfo * task)539*437bfbebSnyanmisaka MPP_RET hal_avsd_vdpu2_gen_regs(void *decoder, HalTaskInfo *task)
540*437bfbebSnyanmisaka {
541*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
542*437bfbebSnyanmisaka     AvsdHalCtx_t *p_hal = (AvsdHalCtx_t *)decoder;
543*437bfbebSnyanmisaka 
544*437bfbebSnyanmisaka     AVSD_HAL_TRACE("In.");
545*437bfbebSnyanmisaka     if ((task->dec.flags.parse_err || task->dec.flags.ref_err) &&
546*437bfbebSnyanmisaka         !p_hal->dec_cfg->base.disable_error) {
547*437bfbebSnyanmisaka         goto __RETURN;
548*437bfbebSnyanmisaka     }
549*437bfbebSnyanmisaka     p_hal->data_offset = p_hal->syn.bitstream_offset;
550*437bfbebSnyanmisaka 
551*437bfbebSnyanmisaka     FUN_CHECK(ret = set_regs_parameters(p_hal, &task->dec));
552*437bfbebSnyanmisaka __RETURN:
553*437bfbebSnyanmisaka     AVSD_HAL_TRACE("Out.");
554*437bfbebSnyanmisaka 
555*437bfbebSnyanmisaka     return ret = MPP_OK;
556*437bfbebSnyanmisaka __FAILED:
557*437bfbebSnyanmisaka     return ret;
558*437bfbebSnyanmisaka 
559*437bfbebSnyanmisaka }
560*437bfbebSnyanmisaka /*!
561*437bfbebSnyanmisaka  ***********************************************************************
562*437bfbebSnyanmisaka  * \brief h
563*437bfbebSnyanmisaka  *    start hard
564*437bfbebSnyanmisaka  ***********************************************************************
565*437bfbebSnyanmisaka  */
566*437bfbebSnyanmisaka //extern "C"
hal_avsd_vdpu2_start(void * decoder,HalTaskInfo * task)567*437bfbebSnyanmisaka MPP_RET hal_avsd_vdpu2_start(void *decoder, HalTaskInfo *task)
568*437bfbebSnyanmisaka {
569*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
570*437bfbebSnyanmisaka     AvsdHalCtx_t *p_hal = (AvsdHalCtx_t *)decoder;
571*437bfbebSnyanmisaka 
572*437bfbebSnyanmisaka     AVSD_HAL_TRACE("In.");
573*437bfbebSnyanmisaka 
574*437bfbebSnyanmisaka     if ((task->dec.flags.parse_err || task->dec.flags.ref_err) &&
575*437bfbebSnyanmisaka         !p_hal->dec_cfg->base.disable_error) {
576*437bfbebSnyanmisaka         goto __RETURN;
577*437bfbebSnyanmisaka     }
578*437bfbebSnyanmisaka 
579*437bfbebSnyanmisaka     do {
580*437bfbebSnyanmisaka         MppDevRegWrCfg wr_cfg;
581*437bfbebSnyanmisaka         MppDevRegRdCfg rd_cfg;
582*437bfbebSnyanmisaka         RK_U32 reg_size = 159 * sizeof(RK_U32);
583*437bfbebSnyanmisaka 
584*437bfbebSnyanmisaka         wr_cfg.reg = p_hal->p_regs;
585*437bfbebSnyanmisaka         wr_cfg.size = reg_size;
586*437bfbebSnyanmisaka         wr_cfg.offset = 0;
587*437bfbebSnyanmisaka 
588*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(p_hal->dev, MPP_DEV_REG_WR, &wr_cfg);
589*437bfbebSnyanmisaka         if (ret) {
590*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
591*437bfbebSnyanmisaka             break;
592*437bfbebSnyanmisaka         }
593*437bfbebSnyanmisaka 
594*437bfbebSnyanmisaka         rd_cfg.reg = p_hal->p_regs;
595*437bfbebSnyanmisaka         rd_cfg.size = reg_size;
596*437bfbebSnyanmisaka         rd_cfg.offset = 0;
597*437bfbebSnyanmisaka 
598*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(p_hal->dev, MPP_DEV_REG_RD, &rd_cfg);
599*437bfbebSnyanmisaka         if (ret) {
600*437bfbebSnyanmisaka             mpp_err_f("set register read failed %d\n", ret);
601*437bfbebSnyanmisaka             break;
602*437bfbebSnyanmisaka         }
603*437bfbebSnyanmisaka 
604*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(p_hal->dev, MPP_DEV_CMD_SEND, NULL);
605*437bfbebSnyanmisaka         if (ret) {
606*437bfbebSnyanmisaka             mpp_err_f("send cmd failed %d\n", ret);
607*437bfbebSnyanmisaka             break;
608*437bfbebSnyanmisaka         }
609*437bfbebSnyanmisaka     } while (0);
610*437bfbebSnyanmisaka 
611*437bfbebSnyanmisaka __RETURN:
612*437bfbebSnyanmisaka     AVSD_HAL_TRACE("Out.");
613*437bfbebSnyanmisaka     return ret = MPP_OK;
614*437bfbebSnyanmisaka }
615*437bfbebSnyanmisaka /*!
616*437bfbebSnyanmisaka  ***********************************************************************
617*437bfbebSnyanmisaka  * \brief
618*437bfbebSnyanmisaka  *    wait hard
619*437bfbebSnyanmisaka  ***********************************************************************
620*437bfbebSnyanmisaka  */
621*437bfbebSnyanmisaka //extern "C"
hal_avsd_vdpu2_wait(void * decoder,HalTaskInfo * task)622*437bfbebSnyanmisaka MPP_RET hal_avsd_vdpu2_wait(void *decoder, HalTaskInfo *task)
623*437bfbebSnyanmisaka {
624*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
625*437bfbebSnyanmisaka     AvsdHalCtx_t *p_hal = (AvsdHalCtx_t *)decoder;
626*437bfbebSnyanmisaka 
627*437bfbebSnyanmisaka     AVSD_HAL_TRACE("In.");
628*437bfbebSnyanmisaka 
629*437bfbebSnyanmisaka     if ((task->dec.flags.parse_err || task->dec.flags.ref_err) &&
630*437bfbebSnyanmisaka         !p_hal->dec_cfg->base.disable_error) {
631*437bfbebSnyanmisaka         goto __SKIP_HARD;
632*437bfbebSnyanmisaka     }
633*437bfbebSnyanmisaka 
634*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(p_hal->dev, MPP_DEV_CMD_POLL, NULL);
635*437bfbebSnyanmisaka     if (ret)
636*437bfbebSnyanmisaka         mpp_err_f("poll cmd failed %d\n", ret);
637*437bfbebSnyanmisaka 
638*437bfbebSnyanmisaka __SKIP_HARD:
639*437bfbebSnyanmisaka     if (p_hal->dec_cb) {
640*437bfbebSnyanmisaka         DecCbHalDone param;
641*437bfbebSnyanmisaka 
642*437bfbebSnyanmisaka         param.task = (void *)&task->dec;
643*437bfbebSnyanmisaka         param.regs = (RK_U32 *)p_hal->p_regs;
644*437bfbebSnyanmisaka 
645*437bfbebSnyanmisaka         if (!((AvsdVdpu2Regs_t *)p_hal->p_regs)->sw55.dec_rdy_sts) {
646*437bfbebSnyanmisaka             param.hard_err = 1;
647*437bfbebSnyanmisaka         } else
648*437bfbebSnyanmisaka             param.hard_err = 0;
649*437bfbebSnyanmisaka 
650*437bfbebSnyanmisaka         mpp_callback(p_hal->dec_cb, &param);
651*437bfbebSnyanmisaka         AVSD_HAL_DBG(AVSD_HAL_DBG_WAIT, "reg[55]=%08x, ref=%d, dpberr=%d, harderr=%d\n",
652*437bfbebSnyanmisaka                      p_hal->p_regs[55], task->dec.flags.used_for_ref, task->dec.flags.ref_err, param.hard_err);
653*437bfbebSnyanmisaka     }
654*437bfbebSnyanmisaka 
655*437bfbebSnyanmisaka     update_parameters(p_hal);
656*437bfbebSnyanmisaka     memset(&p_hal->p_regs[55], 0, sizeof(RK_U32));
657*437bfbebSnyanmisaka     if (!p_hal->first_field && p_hal->syn.pp.pictureStructure == FIELDPICTURE &&
658*437bfbebSnyanmisaka         ((!task->dec.flags.parse_err && !task->dec.flags.ref_err) ||
659*437bfbebSnyanmisaka          p_hal->dec_cfg->base.disable_error)) {
660*437bfbebSnyanmisaka         repeat_other_field(p_hal, task);
661*437bfbebSnyanmisaka     }
662*437bfbebSnyanmisaka     p_hal->frame_no++;
663*437bfbebSnyanmisaka 
664*437bfbebSnyanmisaka     AVSD_HAL_TRACE("Out.");
665*437bfbebSnyanmisaka     return ret = MPP_OK;
666*437bfbebSnyanmisaka }
667*437bfbebSnyanmisaka /*!
668*437bfbebSnyanmisaka  ***********************************************************************
669*437bfbebSnyanmisaka  * \brief
670*437bfbebSnyanmisaka  *    reset
671*437bfbebSnyanmisaka  ***********************************************************************
672*437bfbebSnyanmisaka  */
673*437bfbebSnyanmisaka //extern "C"
hal_avsd_vdpu2_reset(void * decoder)674*437bfbebSnyanmisaka MPP_RET hal_avsd_vdpu2_reset(void *decoder)
675*437bfbebSnyanmisaka {
676*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
677*437bfbebSnyanmisaka     AvsdHalCtx_t *p_hal = (AvsdHalCtx_t *)decoder;
678*437bfbebSnyanmisaka 
679*437bfbebSnyanmisaka     AVSD_HAL_TRACE("In.");
680*437bfbebSnyanmisaka 
681*437bfbebSnyanmisaka     p_hal->first_field = 1;
682*437bfbebSnyanmisaka     p_hal->prev_pic_structure = 0; //!< field
683*437bfbebSnyanmisaka 
684*437bfbebSnyanmisaka     memset(p_hal->pic, 0, sizeof(p_hal->pic));
685*437bfbebSnyanmisaka     p_hal->work_out = -1;
686*437bfbebSnyanmisaka     p_hal->work0 = -1;
687*437bfbebSnyanmisaka     p_hal->work1 = -1;
688*437bfbebSnyanmisaka 
689*437bfbebSnyanmisaka     AVSD_HAL_TRACE("Out.");
690*437bfbebSnyanmisaka 
691*437bfbebSnyanmisaka     return ret = MPP_OK;
692*437bfbebSnyanmisaka }
693*437bfbebSnyanmisaka /*!
694*437bfbebSnyanmisaka  ***********************************************************************
695*437bfbebSnyanmisaka  * \brief
696*437bfbebSnyanmisaka  *    flush
697*437bfbebSnyanmisaka  ***********************************************************************
698*437bfbebSnyanmisaka  */
699*437bfbebSnyanmisaka //extern "C"
hal_avsd_vdpu2_flush(void * decoder)700*437bfbebSnyanmisaka MPP_RET hal_avsd_vdpu2_flush(void *decoder)
701*437bfbebSnyanmisaka {
702*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
703*437bfbebSnyanmisaka 
704*437bfbebSnyanmisaka     AVSD_HAL_TRACE("In.");
705*437bfbebSnyanmisaka 
706*437bfbebSnyanmisaka     (void)decoder;
707*437bfbebSnyanmisaka 
708*437bfbebSnyanmisaka     AVSD_HAL_TRACE("Out.");
709*437bfbebSnyanmisaka 
710*437bfbebSnyanmisaka     return ret = MPP_OK;
711*437bfbebSnyanmisaka }
712*437bfbebSnyanmisaka /*!
713*437bfbebSnyanmisaka  ***********************************************************************
714*437bfbebSnyanmisaka  * \brief
715*437bfbebSnyanmisaka  *    control
716*437bfbebSnyanmisaka  ***********************************************************************
717*437bfbebSnyanmisaka  */
718*437bfbebSnyanmisaka //extern "C"
hal_avsd_vdpu2_control(void * decoder,MpiCmd cmd_type,void * param)719*437bfbebSnyanmisaka MPP_RET hal_avsd_vdpu2_control(void *decoder, MpiCmd cmd_type, void *param)
720*437bfbebSnyanmisaka {
721*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
722*437bfbebSnyanmisaka 
723*437bfbebSnyanmisaka     AVSD_HAL_TRACE("In.");
724*437bfbebSnyanmisaka 
725*437bfbebSnyanmisaka     (void)decoder;
726*437bfbebSnyanmisaka     (void)cmd_type;
727*437bfbebSnyanmisaka     (void)param;
728*437bfbebSnyanmisaka 
729*437bfbebSnyanmisaka     AVSD_HAL_TRACE("Out.");
730*437bfbebSnyanmisaka 
731*437bfbebSnyanmisaka     return ret = MPP_OK;
732*437bfbebSnyanmisaka }
733