xref: /rockchip-linux_mpp/mpp/hal/vpu/m2vd/hal_m2vd_vdpu1.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_m2vd_vdpu1"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include "mpp_mem.h"
22*437bfbebSnyanmisaka #include "mpp_common.h"
23*437bfbebSnyanmisaka 
24*437bfbebSnyanmisaka #include "hal_m2vd_base.h"
25*437bfbebSnyanmisaka #include "hal_m2vd_vdpu1_reg.h"
26*437bfbebSnyanmisaka #include "hal_m2vd_vpu1.h"
27*437bfbebSnyanmisaka 
hal_m2vd_vdpu1_init(void * hal,MppHalCfg * cfg)28*437bfbebSnyanmisaka MPP_RET hal_m2vd_vdpu1_init(void *hal, MppHalCfg *cfg)
29*437bfbebSnyanmisaka {
30*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
31*437bfbebSnyanmisaka     M2vdHalCtx *ctx = (M2vdHalCtx *)hal;
32*437bfbebSnyanmisaka     M2vdVdpu1Reg_t *regs = NULL;
33*437bfbebSnyanmisaka 
34*437bfbebSnyanmisaka     regs = mpp_calloc(M2vdVdpu1Reg_t, 1);
35*437bfbebSnyanmisaka     if (NULL == regs) {
36*437bfbebSnyanmisaka         mpp_err_f("failed to malloc register ret\n");
37*437bfbebSnyanmisaka         ret = MPP_ERR_MALLOC;
38*437bfbebSnyanmisaka         goto __ERR_RET;
39*437bfbebSnyanmisaka     }
40*437bfbebSnyanmisaka 
41*437bfbebSnyanmisaka     ctx->reg_len = M2VD_VDPU1_REG_NUM;
42*437bfbebSnyanmisaka 
43*437bfbebSnyanmisaka     ret = mpp_dev_init(&ctx->dev, VPU_CLIENT_VDPU1);
44*437bfbebSnyanmisaka     if (ret) {
45*437bfbebSnyanmisaka         mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
46*437bfbebSnyanmisaka         ret = MPP_ERR_UNKNOW;
47*437bfbebSnyanmisaka         goto __ERR_RET;
48*437bfbebSnyanmisaka     }
49*437bfbebSnyanmisaka     if (ctx->group == NULL) {
50*437bfbebSnyanmisaka         ret = mpp_buffer_group_get_internal(&ctx->group, MPP_BUFFER_TYPE_ION);
51*437bfbebSnyanmisaka         if (ret) {
52*437bfbebSnyanmisaka             mpp_err("m2v_hal mpp_buffer_group_get failed\n");
53*437bfbebSnyanmisaka             goto __ERR_RET;
54*437bfbebSnyanmisaka         }
55*437bfbebSnyanmisaka     }
56*437bfbebSnyanmisaka     ret = mpp_buffer_get(ctx->group, &ctx->qp_table, M2VD_BUF_SIZE_QPTAB);
57*437bfbebSnyanmisaka     if (ret) {
58*437bfbebSnyanmisaka         mpp_err("m2v_hal_qtable_base get buffer failed\n");
59*437bfbebSnyanmisaka         goto __ERR_RET;
60*437bfbebSnyanmisaka     }
61*437bfbebSnyanmisaka 
62*437bfbebSnyanmisaka     ctx->packet_slots   = cfg->packet_slots;
63*437bfbebSnyanmisaka     ctx->frame_slots    = cfg->frame_slots;
64*437bfbebSnyanmisaka     ctx->dec_cb         = cfg->dec_cb;
65*437bfbebSnyanmisaka     ctx->regs           = (void*)regs;
66*437bfbebSnyanmisaka     cfg->dev            = ctx->dev;
67*437bfbebSnyanmisaka 
68*437bfbebSnyanmisaka     return ret;
69*437bfbebSnyanmisaka 
70*437bfbebSnyanmisaka __ERR_RET:
71*437bfbebSnyanmisaka     if (regs) {
72*437bfbebSnyanmisaka         mpp_free(regs);
73*437bfbebSnyanmisaka         regs = NULL;
74*437bfbebSnyanmisaka     }
75*437bfbebSnyanmisaka 
76*437bfbebSnyanmisaka     if (ctx) {
77*437bfbebSnyanmisaka         hal_m2vd_vdpu1_deinit(ctx);
78*437bfbebSnyanmisaka     }
79*437bfbebSnyanmisaka 
80*437bfbebSnyanmisaka     return ret;
81*437bfbebSnyanmisaka }
82*437bfbebSnyanmisaka 
hal_m2vd_vdpu1_deinit(void * hal)83*437bfbebSnyanmisaka MPP_RET hal_m2vd_vdpu1_deinit(void *hal)
84*437bfbebSnyanmisaka {
85*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
86*437bfbebSnyanmisaka     M2vdHalCtx *p = (M2vdHalCtx *)hal;
87*437bfbebSnyanmisaka 
88*437bfbebSnyanmisaka     if (p->dev) {
89*437bfbebSnyanmisaka         mpp_dev_deinit(p->dev);
90*437bfbebSnyanmisaka         p->dev = NULL;
91*437bfbebSnyanmisaka     }
92*437bfbebSnyanmisaka 
93*437bfbebSnyanmisaka     if (p->qp_table) {
94*437bfbebSnyanmisaka         ret = mpp_buffer_put(p->qp_table);
95*437bfbebSnyanmisaka         p->qp_table = NULL;
96*437bfbebSnyanmisaka         if (MPP_OK !=  ret) {
97*437bfbebSnyanmisaka             mpp_err("m2v_hal qp_table put buffer failed\n");
98*437bfbebSnyanmisaka             return ret;
99*437bfbebSnyanmisaka         }
100*437bfbebSnyanmisaka     }
101*437bfbebSnyanmisaka 
102*437bfbebSnyanmisaka     if (p->group) {
103*437bfbebSnyanmisaka         ret = mpp_buffer_group_put(p->group);
104*437bfbebSnyanmisaka         p->group = NULL;
105*437bfbebSnyanmisaka         if (ret) {
106*437bfbebSnyanmisaka             mpp_err("m2v_hal group free buffer failed\n");
107*437bfbebSnyanmisaka             return ret;
108*437bfbebSnyanmisaka         }
109*437bfbebSnyanmisaka     }
110*437bfbebSnyanmisaka 
111*437bfbebSnyanmisaka     return ret;
112*437bfbebSnyanmisaka }
113*437bfbebSnyanmisaka 
hal_m2vd_vdpu1_init_hwcfg(M2vdHalCtx * ctx)114*437bfbebSnyanmisaka static MPP_RET hal_m2vd_vdpu1_init_hwcfg(M2vdHalCtx *ctx)
115*437bfbebSnyanmisaka {
116*437bfbebSnyanmisaka     M2vdVdpu1Reg_t *p_regs = (M2vdVdpu1Reg_t *)ctx->regs;
117*437bfbebSnyanmisaka 
118*437bfbebSnyanmisaka     memset(p_regs, 0, sizeof(M2vdVdpu1Reg_t));
119*437bfbebSnyanmisaka     p_regs->sw02.dec_axi_rn_id = 0;
120*437bfbebSnyanmisaka     p_regs->sw02.dec_timeout_e = 1;
121*437bfbebSnyanmisaka     p_regs->sw02.dec_strswap32_e = 1;
122*437bfbebSnyanmisaka     p_regs->sw02.dec_strendian_e = 1;
123*437bfbebSnyanmisaka     p_regs->sw02.dec_inswap32_e = 1;
124*437bfbebSnyanmisaka     p_regs->sw02.dec_outswap32_e = 1;
125*437bfbebSnyanmisaka 
126*437bfbebSnyanmisaka     p_regs->sw02.dec_clk_gate_e = 1;
127*437bfbebSnyanmisaka     p_regs->sw02.dec_in_endian = 1;
128*437bfbebSnyanmisaka     p_regs->sw02.dec_out_endian = 1;
129*437bfbebSnyanmisaka 
130*437bfbebSnyanmisaka     p_regs->sw02.dec_out_tiled_e = 0;
131*437bfbebSnyanmisaka     p_regs->sw02.dec_max_burst = DEC_BUS_BURST_LENGTH_16;
132*437bfbebSnyanmisaka     p_regs->sw02.dec_scmd_dis = 0;
133*437bfbebSnyanmisaka     p_regs->sw02.dec_adv_pre_dis = 0;
134*437bfbebSnyanmisaka     p_regs->sw55.apf_threshold = 8;
135*437bfbebSnyanmisaka     p_regs->sw02.dec_latency = 0;
136*437bfbebSnyanmisaka     p_regs->sw02.dec_data_disc_e = 0;
137*437bfbebSnyanmisaka     p_regs->sw01.dec_irq = 0;
138*437bfbebSnyanmisaka     p_regs->sw02.dec_axi_rn_id = 0;
139*437bfbebSnyanmisaka     p_regs->sw03.dec_axi_wr_id = 0;
140*437bfbebSnyanmisaka     p_regs->sw03.dec_mode = 8;
141*437bfbebSnyanmisaka 
142*437bfbebSnyanmisaka     return MPP_OK;
143*437bfbebSnyanmisaka }
144*437bfbebSnyanmisaka 
hal_m2vd_vdpu1_gen_regs(void * hal,HalTaskInfo * task)145*437bfbebSnyanmisaka MPP_RET hal_m2vd_vdpu1_gen_regs(void *hal, HalTaskInfo *task)
146*437bfbebSnyanmisaka {
147*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
148*437bfbebSnyanmisaka 
149*437bfbebSnyanmisaka     if (task->dec.valid) {
150*437bfbebSnyanmisaka         void *q_table = NULL;
151*437bfbebSnyanmisaka         MppBuffer streambuf = NULL;
152*437bfbebSnyanmisaka         MppBuffer framebuf = NULL;
153*437bfbebSnyanmisaka         M2vdHalCtx *ctx = (M2vdHalCtx *)hal;
154*437bfbebSnyanmisaka         M2VDDxvaParam *dx = (M2VDDxvaParam *)task->dec.syntax.data;
155*437bfbebSnyanmisaka         M2vdVdpu1Reg_t *p_regs = (M2vdVdpu1Reg_t*) ctx->regs;
156*437bfbebSnyanmisaka 
157*437bfbebSnyanmisaka         task->dec.valid = 0;
158*437bfbebSnyanmisaka         q_table = mpp_buffer_get_ptr(ctx->qp_table);
159*437bfbebSnyanmisaka         memcpy(q_table, dx->qp_tab, M2VD_BUF_SIZE_QPTAB);
160*437bfbebSnyanmisaka         mpp_buffer_sync_end(ctx->qp_table);
161*437bfbebSnyanmisaka 
162*437bfbebSnyanmisaka         hal_m2vd_vdpu1_init_hwcfg(ctx);
163*437bfbebSnyanmisaka 
164*437bfbebSnyanmisaka         p_regs->sw18.mv_accuracy_fwd = 1;
165*437bfbebSnyanmisaka         p_regs->sw18.mv_accuracy_bwd = 1;
166*437bfbebSnyanmisaka         if (dx->seq_ext_head_dec_flag) {
167*437bfbebSnyanmisaka             p_regs->sw03.dec_mode = 5;
168*437bfbebSnyanmisaka             p_regs->sw18.fcode_fwd_hor = dx->pic.full_pel_forward_vector;
169*437bfbebSnyanmisaka             p_regs->sw18.fcode_fwd_ver = dx->pic.forward_f_code;
170*437bfbebSnyanmisaka             p_regs->sw18.fcode_bwd_hor = dx->pic.full_pel_backward_vector;
171*437bfbebSnyanmisaka             p_regs->sw18.fcode_bwd_ver = dx->pic.backward_f_code;
172*437bfbebSnyanmisaka         } else {
173*437bfbebSnyanmisaka             p_regs->sw03.dec_mode = 6;
174*437bfbebSnyanmisaka             p_regs->sw18.fcode_fwd_hor = dx->pic.forward_f_code;
175*437bfbebSnyanmisaka             p_regs->sw18.fcode_fwd_ver = dx->pic.forward_f_code;
176*437bfbebSnyanmisaka             p_regs->sw18.fcode_bwd_hor = dx->pic.backward_f_code;
177*437bfbebSnyanmisaka             p_regs->sw18.fcode_bwd_ver = dx->pic.backward_f_code;
178*437bfbebSnyanmisaka             if (dx->pic.full_pel_forward_vector)
179*437bfbebSnyanmisaka                 p_regs->sw18.mv_accuracy_fwd = 0;
180*437bfbebSnyanmisaka             if (dx->pic.full_pel_backward_vector)
181*437bfbebSnyanmisaka                 p_regs->sw18.mv_accuracy_bwd = 0;
182*437bfbebSnyanmisaka         }
183*437bfbebSnyanmisaka 
184*437bfbebSnyanmisaka         p_regs->sw04.pic_mb_width = (dx->seq.decode_width + 15) >> 4;
185*437bfbebSnyanmisaka         p_regs->sw04.pic_mb_height_p = (dx->seq.decode_height + 15) >> 4;
186*437bfbebSnyanmisaka         p_regs->sw03.pic_interlace_e = 1 - dx->seq_ext.progressive_sequence;
187*437bfbebSnyanmisaka         if (dx->pic_code_ext.picture_structure == M2VD_PIC_STRUCT_FRAME)
188*437bfbebSnyanmisaka             p_regs->sw03.pic_fieldmode_e = 0;
189*437bfbebSnyanmisaka         else {
190*437bfbebSnyanmisaka             p_regs->sw03.pic_fieldmode_e = 1;
191*437bfbebSnyanmisaka             p_regs->sw03.pic_topfield_e = dx->pic_code_ext.picture_structure == 1;
192*437bfbebSnyanmisaka         }
193*437bfbebSnyanmisaka         if (dx->pic.picture_coding_type == M2VD_CODING_TYPE_B)
194*437bfbebSnyanmisaka             p_regs->sw03.pic_b_e = 1;
195*437bfbebSnyanmisaka         else
196*437bfbebSnyanmisaka             p_regs->sw03.pic_b_e = 0;
197*437bfbebSnyanmisaka         if (dx->pic.picture_coding_type == M2VD_CODING_TYPE_I)
198*437bfbebSnyanmisaka             p_regs->sw03.pic_inter_e = 0;
199*437bfbebSnyanmisaka         else
200*437bfbebSnyanmisaka             p_regs->sw03.pic_inter_e = 1;
201*437bfbebSnyanmisaka 
202*437bfbebSnyanmisaka         p_regs->sw04.topfieldfirst_e = dx->pic_code_ext.top_field_first;
203*437bfbebSnyanmisaka         p_regs->sw03.fwd_interlace_e = 0;
204*437bfbebSnyanmisaka         p_regs->sw03.write_mvs_e = 0;
205*437bfbebSnyanmisaka         p_regs->sw04.alt_scan_e = dx->pic_code_ext.alternate_scan;
206*437bfbebSnyanmisaka         p_regs->sw18.alt_scan_flag_e = dx->pic_code_ext.alternate_scan;
207*437bfbebSnyanmisaka 
208*437bfbebSnyanmisaka         p_regs->sw05.qscale_type = dx->pic_code_ext.q_scale_type;
209*437bfbebSnyanmisaka         p_regs->sw05.intra_dc_prec = dx->pic_code_ext.intra_dc_precision;
210*437bfbebSnyanmisaka         p_regs->sw05.con_mv_e = dx->pic_code_ext.concealment_motion_vectors;
211*437bfbebSnyanmisaka         p_regs->sw05.intra_vlc_tab = dx->pic_code_ext.intra_vlc_format;
212*437bfbebSnyanmisaka         p_regs->sw05.frame_pred_dct = dx->pic_code_ext.frame_pred_frame_dct;
213*437bfbebSnyanmisaka         p_regs->sw06.init_qp = 1;
214*437bfbebSnyanmisaka 
215*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(ctx->packet_slots, task->dec.input, SLOT_BUFFER, &streambuf);
216*437bfbebSnyanmisaka         p_regs->sw12.rlc_vlc_base = mpp_buffer_get_fd(streambuf);
217*437bfbebSnyanmisaka         if (dx->bitstream_offset) {
218*437bfbebSnyanmisaka             mpp_dev_set_reg_offset(ctx->dev, 12, dx->bitstream_offset);
219*437bfbebSnyanmisaka         }
220*437bfbebSnyanmisaka 
221*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(ctx->frame_slots, dx->CurrPic.Index7Bits, SLOT_BUFFER, &framebuf);
222*437bfbebSnyanmisaka 
223*437bfbebSnyanmisaka         if ((dx->pic_code_ext.picture_structure == M2VD_PIC_STRUCT_TOP_FIELD) ||
224*437bfbebSnyanmisaka             (dx->pic_code_ext.picture_structure == M2VD_PIC_STRUCT_FRAME)) {
225*437bfbebSnyanmisaka             p_regs->sw13.dec_out_base = mpp_buffer_get_fd(framebuf);
226*437bfbebSnyanmisaka         } else {
227*437bfbebSnyanmisaka             p_regs->sw13.dec_out_base = mpp_buffer_get_fd(framebuf);
228*437bfbebSnyanmisaka             mpp_dev_set_reg_offset(ctx->dev, 13, MPP_ALIGN(dx->seq.decode_width, 16));
229*437bfbebSnyanmisaka         }
230*437bfbebSnyanmisaka 
231*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(ctx->frame_slots, dx->frame_refs[0].Index7Bits, SLOT_BUFFER, &framebuf);
232*437bfbebSnyanmisaka         p_regs->sw14.refer0_base = mpp_buffer_get_fd(framebuf);
233*437bfbebSnyanmisaka 
234*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(ctx->frame_slots, dx->frame_refs[1].Index7Bits, SLOT_BUFFER, &framebuf);
235*437bfbebSnyanmisaka         p_regs->sw15.refer1_base = mpp_buffer_get_fd(framebuf);
236*437bfbebSnyanmisaka 
237*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(ctx->frame_slots, dx->frame_refs[2].Index7Bits, SLOT_BUFFER, &framebuf);
238*437bfbebSnyanmisaka         p_regs->sw16.refer2_base = mpp_buffer_get_fd(framebuf);
239*437bfbebSnyanmisaka 
240*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(ctx->frame_slots, dx->frame_refs[3].Index7Bits, SLOT_BUFFER, &framebuf);
241*437bfbebSnyanmisaka         p_regs->sw17.refer3_base = mpp_buffer_get_fd(framebuf);
242*437bfbebSnyanmisaka 
243*437bfbebSnyanmisaka         p_regs->sw40.qtable_base = mpp_buffer_get_fd(ctx->qp_table);
244*437bfbebSnyanmisaka 
245*437bfbebSnyanmisaka         p_regs->sw48.startmb_x = 0;
246*437bfbebSnyanmisaka         p_regs->sw48.startmb_y = 0;
247*437bfbebSnyanmisaka         p_regs->sw03.dec_out_dis = 0;
248*437bfbebSnyanmisaka         p_regs->sw03.filtering_dis = 1;
249*437bfbebSnyanmisaka         p_regs->sw06.stream_len = dx->bitstream_length;
250*437bfbebSnyanmisaka         p_regs->sw05.stream_start_bit = dx->bitstream_start_bit;
251*437bfbebSnyanmisaka         p_regs->sw01.dec_e = 1;
252*437bfbebSnyanmisaka 
253*437bfbebSnyanmisaka         task->dec.valid = 1;
254*437bfbebSnyanmisaka         ctx->dec_frame_cnt++;
255*437bfbebSnyanmisaka     }
256*437bfbebSnyanmisaka 
257*437bfbebSnyanmisaka     return ret;
258*437bfbebSnyanmisaka }
259*437bfbebSnyanmisaka 
hal_m2vd_vdpu1_start(void * hal,HalTaskInfo * task)260*437bfbebSnyanmisaka MPP_RET hal_m2vd_vdpu1_start(void *hal, HalTaskInfo *task)
261*437bfbebSnyanmisaka {
262*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
263*437bfbebSnyanmisaka     M2vdHalCtx *ctx = (M2vdHalCtx *)hal;
264*437bfbebSnyanmisaka 
265*437bfbebSnyanmisaka     do {
266*437bfbebSnyanmisaka         MppDevRegWrCfg wr_cfg;
267*437bfbebSnyanmisaka         MppDevRegRdCfg rd_cfg;
268*437bfbebSnyanmisaka         RK_U32 *regs = (RK_U32 *)ctx->regs;
269*437bfbebSnyanmisaka         RK_U32 reg_size = sizeof(M2vdVdpu1Reg_t);
270*437bfbebSnyanmisaka 
271*437bfbebSnyanmisaka         wr_cfg.reg = regs;
272*437bfbebSnyanmisaka         wr_cfg.size = reg_size;
273*437bfbebSnyanmisaka         wr_cfg.offset = 0;
274*437bfbebSnyanmisaka 
275*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
276*437bfbebSnyanmisaka         if (ret) {
277*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
278*437bfbebSnyanmisaka             break;
279*437bfbebSnyanmisaka         }
280*437bfbebSnyanmisaka 
281*437bfbebSnyanmisaka         rd_cfg.reg = regs;
282*437bfbebSnyanmisaka         rd_cfg.size = reg_size;
283*437bfbebSnyanmisaka         rd_cfg.offset = 0;
284*437bfbebSnyanmisaka 
285*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &rd_cfg);
286*437bfbebSnyanmisaka         if (ret) {
287*437bfbebSnyanmisaka             mpp_err_f("set register read failed %d\n", ret);
288*437bfbebSnyanmisaka             break;
289*437bfbebSnyanmisaka         }
290*437bfbebSnyanmisaka 
291*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
292*437bfbebSnyanmisaka         if (ret) {
293*437bfbebSnyanmisaka             mpp_err_f("send cmd failed %d\n", ret);
294*437bfbebSnyanmisaka             break;
295*437bfbebSnyanmisaka         }
296*437bfbebSnyanmisaka     } while (0);
297*437bfbebSnyanmisaka 
298*437bfbebSnyanmisaka     (void)task;
299*437bfbebSnyanmisaka     return ret;
300*437bfbebSnyanmisaka }
301*437bfbebSnyanmisaka 
hal_m2vd_vdpu1_wait(void * hal,HalTaskInfo * task)302*437bfbebSnyanmisaka MPP_RET hal_m2vd_vdpu1_wait(void *hal, HalTaskInfo *task)
303*437bfbebSnyanmisaka {
304*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
305*437bfbebSnyanmisaka     M2vdHalCtx *ctx = (M2vdHalCtx *)hal;
306*437bfbebSnyanmisaka     M2vdVdpu1Reg_t* reg_out = (M2vdVdpu1Reg_t * )ctx->regs;
307*437bfbebSnyanmisaka 
308*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
309*437bfbebSnyanmisaka     if (ret)
310*437bfbebSnyanmisaka         mpp_err_f("poll cmd failed %d\n", ret);
311*437bfbebSnyanmisaka 
312*437bfbebSnyanmisaka     if (reg_out->sw01.dec_error_int | reg_out->sw01.dec_buffer_int) {
313*437bfbebSnyanmisaka         if (ctx->dec_cb)
314*437bfbebSnyanmisaka             mpp_callback(ctx->dec_cb, NULL);
315*437bfbebSnyanmisaka     }
316*437bfbebSnyanmisaka 
317*437bfbebSnyanmisaka     (void)task;
318*437bfbebSnyanmisaka 
319*437bfbebSnyanmisaka     return ret;
320*437bfbebSnyanmisaka }
321