xref: /rockchip-linux_mpp/mpp/hal/vpu/m2vd/hal_m2vd_vdpu2.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2016 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_vdpu2"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include "mpp_env.h"
22*437bfbebSnyanmisaka #include "mpp_mem.h"
23*437bfbebSnyanmisaka #include "mpp_common.h"
24*437bfbebSnyanmisaka 
25*437bfbebSnyanmisaka #include "hal_m2vd_base.h"
26*437bfbebSnyanmisaka #include "hal_m2vd_vdpu2_reg.h"
27*437bfbebSnyanmisaka #include "hal_m2vd_vpu2.h"
28*437bfbebSnyanmisaka #include "hal_m2vd_api.h"
29*437bfbebSnyanmisaka 
hal_m2vd_vdpu2_init(void * hal,MppHalCfg * cfg)30*437bfbebSnyanmisaka MPP_RET hal_m2vd_vdpu2_init(void *hal, MppHalCfg *cfg)
31*437bfbebSnyanmisaka {
32*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
33*437bfbebSnyanmisaka     M2vdHalCtx *p = (M2vdHalCtx *)hal;
34*437bfbebSnyanmisaka     M2vdVdpu2Reg *reg = NULL;
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka     m2vh_dbg_func("enter\n");
37*437bfbebSnyanmisaka 
38*437bfbebSnyanmisaka     reg = mpp_calloc(M2vdVdpu2Reg, 1);
39*437bfbebSnyanmisaka     if (NULL == reg) {
40*437bfbebSnyanmisaka         mpp_err_f("failed to malloc register ret\n");
41*437bfbebSnyanmisaka         ret = MPP_ERR_MALLOC;
42*437bfbebSnyanmisaka         goto __ERR_RET;
43*437bfbebSnyanmisaka     }
44*437bfbebSnyanmisaka 
45*437bfbebSnyanmisaka     p->reg_len = M2VD_VDPU2_REG_NUM;
46*437bfbebSnyanmisaka 
47*437bfbebSnyanmisaka     ret = mpp_dev_init(&p->dev, VPU_CLIENT_VDPU2);
48*437bfbebSnyanmisaka     if (ret) {
49*437bfbebSnyanmisaka         mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
50*437bfbebSnyanmisaka         goto __ERR_RET;
51*437bfbebSnyanmisaka     }
52*437bfbebSnyanmisaka 
53*437bfbebSnyanmisaka     if (p->group == NULL) {
54*437bfbebSnyanmisaka         ret = mpp_buffer_group_get_internal(&p->group, MPP_BUFFER_TYPE_ION);
55*437bfbebSnyanmisaka         if (ret) {
56*437bfbebSnyanmisaka             mpp_err("m2v_hal mpp_buffer_group_get failed\n");
57*437bfbebSnyanmisaka             goto __ERR_RET;
58*437bfbebSnyanmisaka         }
59*437bfbebSnyanmisaka     }
60*437bfbebSnyanmisaka 
61*437bfbebSnyanmisaka     ret = mpp_buffer_get(p->group, &p->qp_table, M2VD_BUF_SIZE_QPTAB);
62*437bfbebSnyanmisaka     if (ret) {
63*437bfbebSnyanmisaka         mpp_err("m2v_hal qtable_base get buffer failed\n");
64*437bfbebSnyanmisaka         goto __ERR_RET;
65*437bfbebSnyanmisaka     }
66*437bfbebSnyanmisaka 
67*437bfbebSnyanmisaka     if (M2VH_DBG_DUMP_REG & m2vh_debug) {
68*437bfbebSnyanmisaka         p->fp_reg_in = fopen("/sdcard/m2vd_dbg_reg_in.txt", "wb");
69*437bfbebSnyanmisaka         if (p->fp_reg_in == NULL) {
70*437bfbebSnyanmisaka             mpp_log("file open error: %s", "/sdcard/m2vd_dbg_reg_in.txt");
71*437bfbebSnyanmisaka         }
72*437bfbebSnyanmisaka         p->fp_reg_out = fopen("/sdcard/m2vd_dbg_reg_out.txt", "wb");
73*437bfbebSnyanmisaka         if (p->fp_reg_out == NULL) {
74*437bfbebSnyanmisaka             mpp_log("file open error: %s", "/sdcard/m2vd_dbg_reg_out.txt");
75*437bfbebSnyanmisaka         }
76*437bfbebSnyanmisaka     } else {
77*437bfbebSnyanmisaka         p->fp_reg_in = NULL;
78*437bfbebSnyanmisaka         p->fp_reg_out = NULL;
79*437bfbebSnyanmisaka     }
80*437bfbebSnyanmisaka 
81*437bfbebSnyanmisaka     //configure
82*437bfbebSnyanmisaka     p->packet_slots = cfg->packet_slots;
83*437bfbebSnyanmisaka     p->frame_slots  = cfg->frame_slots;
84*437bfbebSnyanmisaka     p->dec_cb       = cfg->dec_cb;
85*437bfbebSnyanmisaka     p->regs         = (void*)reg;
86*437bfbebSnyanmisaka     cfg->dev        = p->dev;
87*437bfbebSnyanmisaka 
88*437bfbebSnyanmisaka     m2vh_dbg_func("leave\n");
89*437bfbebSnyanmisaka 
90*437bfbebSnyanmisaka     return ret;
91*437bfbebSnyanmisaka 
92*437bfbebSnyanmisaka __ERR_RET:
93*437bfbebSnyanmisaka     if (reg) {
94*437bfbebSnyanmisaka         mpp_free(reg);
95*437bfbebSnyanmisaka         reg = NULL;
96*437bfbebSnyanmisaka     }
97*437bfbebSnyanmisaka 
98*437bfbebSnyanmisaka     if (p) {
99*437bfbebSnyanmisaka         hal_m2vd_vdpu2_deinit(p);
100*437bfbebSnyanmisaka     }
101*437bfbebSnyanmisaka 
102*437bfbebSnyanmisaka     return ret;
103*437bfbebSnyanmisaka }
104*437bfbebSnyanmisaka 
hal_m2vd_vdpu2_deinit(void * hal)105*437bfbebSnyanmisaka MPP_RET hal_m2vd_vdpu2_deinit(void *hal)
106*437bfbebSnyanmisaka {
107*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
108*437bfbebSnyanmisaka     M2vdHalCtx *p = (M2vdHalCtx *)hal;
109*437bfbebSnyanmisaka 
110*437bfbebSnyanmisaka     m2vh_dbg_func("enter\n");
111*437bfbebSnyanmisaka 
112*437bfbebSnyanmisaka     if (p->dev) {
113*437bfbebSnyanmisaka         mpp_dev_deinit(p->dev);
114*437bfbebSnyanmisaka         p->dev = NULL;
115*437bfbebSnyanmisaka     }
116*437bfbebSnyanmisaka 
117*437bfbebSnyanmisaka     if (p->qp_table) {
118*437bfbebSnyanmisaka         ret = mpp_buffer_put(p->qp_table);
119*437bfbebSnyanmisaka         p->qp_table = NULL;
120*437bfbebSnyanmisaka         if (ret) {
121*437bfbebSnyanmisaka             mpp_err("m2v_hal qp_table put buffer failed\n");
122*437bfbebSnyanmisaka             return ret;
123*437bfbebSnyanmisaka         }
124*437bfbebSnyanmisaka     }
125*437bfbebSnyanmisaka 
126*437bfbebSnyanmisaka     if (p->group) {
127*437bfbebSnyanmisaka         ret = mpp_buffer_group_put(p->group);
128*437bfbebSnyanmisaka         p->group = NULL;
129*437bfbebSnyanmisaka         if (ret) {
130*437bfbebSnyanmisaka             mpp_err("m2v_hal group free buffer failed\n");
131*437bfbebSnyanmisaka             return ret;
132*437bfbebSnyanmisaka         }
133*437bfbebSnyanmisaka     }
134*437bfbebSnyanmisaka 
135*437bfbebSnyanmisaka     if (p->regs) {
136*437bfbebSnyanmisaka         mpp_free(p->regs);
137*437bfbebSnyanmisaka         p->regs = NULL;
138*437bfbebSnyanmisaka     }
139*437bfbebSnyanmisaka 
140*437bfbebSnyanmisaka     if (p->fp_reg_in) {
141*437bfbebSnyanmisaka         fclose(p->fp_reg_in);
142*437bfbebSnyanmisaka         p->fp_reg_in = NULL;
143*437bfbebSnyanmisaka     }
144*437bfbebSnyanmisaka     if (p->fp_reg_out) {
145*437bfbebSnyanmisaka         fclose(p->fp_reg_out);
146*437bfbebSnyanmisaka         p->fp_reg_out = NULL;
147*437bfbebSnyanmisaka     }
148*437bfbebSnyanmisaka 
149*437bfbebSnyanmisaka     m2vh_dbg_func("leave\n");
150*437bfbebSnyanmisaka     return ret;
151*437bfbebSnyanmisaka }
152*437bfbebSnyanmisaka 
hal_m2vd_vdpu2_init_hwcfg(M2vdHalCtx * ctx)153*437bfbebSnyanmisaka static MPP_RET hal_m2vd_vdpu2_init_hwcfg(M2vdHalCtx *ctx)
154*437bfbebSnyanmisaka {
155*437bfbebSnyanmisaka 
156*437bfbebSnyanmisaka     M2vdVdpu2Reg *p_regs = (M2vdVdpu2Reg *)ctx->regs;
157*437bfbebSnyanmisaka 
158*437bfbebSnyanmisaka     memset(p_regs, 0, sizeof(M2vdVdpu2Reg));
159*437bfbebSnyanmisaka 
160*437bfbebSnyanmisaka     p_regs->sw56.dec_axi_rn_id = 0;
161*437bfbebSnyanmisaka     p_regs->sw57.dec_timeout_e = 1;
162*437bfbebSnyanmisaka     p_regs->sw54.dec_strswap32_e = 1;     //change
163*437bfbebSnyanmisaka     p_regs->sw54.dec_strendian_e = DEC_LITTLE_ENDIAN;
164*437bfbebSnyanmisaka     p_regs->sw54.dec_inswap32_e = 1;      //change
165*437bfbebSnyanmisaka     p_regs->sw54.dec_outswap32_e = 1; //change
166*437bfbebSnyanmisaka 
167*437bfbebSnyanmisaka 
168*437bfbebSnyanmisaka     p_regs->sw57.dec_clk_gate_e = 1;      //change
169*437bfbebSnyanmisaka     p_regs->sw54.dec_in_endian = DEC_LITTLE_ENDIAN;  //change
170*437bfbebSnyanmisaka     p_regs->sw54.dec_out_endian = DEC_LITTLE_ENDIAN;
171*437bfbebSnyanmisaka 
172*437bfbebSnyanmisaka     p_regs->sw50.dec_out_tiled_e = 0;
173*437bfbebSnyanmisaka     p_regs->sw56.dec_max_burst = DEC_BUS_BURST_LENGTH_16;
174*437bfbebSnyanmisaka     p_regs->sw50.dec_scmd_dis = 0;
175*437bfbebSnyanmisaka     p_regs->sw50.dec_adv_pre_dis = 0;
176*437bfbebSnyanmisaka     p_regs->sw52.apf_threshold = 8;
177*437bfbebSnyanmisaka 
178*437bfbebSnyanmisaka     p_regs->sw50.dec_latency = 0;
179*437bfbebSnyanmisaka     p_regs->sw56.dec_data_disc_e  = 0;
180*437bfbebSnyanmisaka 
181*437bfbebSnyanmisaka     p_regs->sw55.dec_irq = 0;
182*437bfbebSnyanmisaka     p_regs->sw56.dec_axi_rn_id = 0;
183*437bfbebSnyanmisaka     p_regs->sw56.dec_axi_wr_id = 0;
184*437bfbebSnyanmisaka 
185*437bfbebSnyanmisaka     p_regs->sw53.sw_dec_mode = 8;
186*437bfbebSnyanmisaka 
187*437bfbebSnyanmisaka     p_regs->ppReg[0] = 0;
188*437bfbebSnyanmisaka     p_regs->sw136.mv_accuracy_fwd = 1;
189*437bfbebSnyanmisaka     p_regs->sw136.mv_accuracy_bwd = 1;
190*437bfbebSnyanmisaka 
191*437bfbebSnyanmisaka     return MPP_OK;
192*437bfbebSnyanmisaka }
193*437bfbebSnyanmisaka 
hal_m2vd_vdpu2_gen_regs(void * hal,HalTaskInfo * task)194*437bfbebSnyanmisaka MPP_RET hal_m2vd_vdpu2_gen_regs(void *hal, HalTaskInfo *task)
195*437bfbebSnyanmisaka {
196*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
197*437bfbebSnyanmisaka 
198*437bfbebSnyanmisaka     if (task->dec.valid) {
199*437bfbebSnyanmisaka         void *q_table = NULL;
200*437bfbebSnyanmisaka         MppBuffer streambuf = NULL;
201*437bfbebSnyanmisaka         MppBuffer framebuf = NULL;
202*437bfbebSnyanmisaka         M2vdHalCtx *ctx = (M2vdHalCtx *)hal;
203*437bfbebSnyanmisaka         M2VDDxvaParam *dx = (M2VDDxvaParam *)task->dec.syntax.data;
204*437bfbebSnyanmisaka         M2vdVdpu2Reg *p_regs = ctx->regs;
205*437bfbebSnyanmisaka 
206*437bfbebSnyanmisaka         task->dec.valid = 0;
207*437bfbebSnyanmisaka         q_table = mpp_buffer_get_ptr(ctx->qp_table);
208*437bfbebSnyanmisaka         memcpy(q_table, dx->qp_tab, M2VD_BUF_SIZE_QPTAB);
209*437bfbebSnyanmisaka         mpp_buffer_sync_end(ctx->qp_table);
210*437bfbebSnyanmisaka 
211*437bfbebSnyanmisaka         hal_m2vd_vdpu2_init_hwcfg(ctx);
212*437bfbebSnyanmisaka 
213*437bfbebSnyanmisaka         p_regs->sw136.mv_accuracy_fwd = 1;
214*437bfbebSnyanmisaka         p_regs->sw136.mv_accuracy_bwd = 1;
215*437bfbebSnyanmisaka         if (dx->seq_ext_head_dec_flag) {
216*437bfbebSnyanmisaka             p_regs->sw53.sw_dec_mode = 5;
217*437bfbebSnyanmisaka             p_regs->sw136.fcode_fwd_hor = dx->pic.full_pel_forward_vector;
218*437bfbebSnyanmisaka             p_regs->sw136.fcode_fwd_ver = dx->pic.forward_f_code;
219*437bfbebSnyanmisaka             p_regs->sw136.fcode_bwd_hor = dx->pic.full_pel_backward_vector;
220*437bfbebSnyanmisaka             p_regs->sw136.fcode_bwd_ver = dx->pic.backward_f_code;
221*437bfbebSnyanmisaka 
222*437bfbebSnyanmisaka         } else {
223*437bfbebSnyanmisaka             p_regs->sw53.sw_dec_mode = 6;
224*437bfbebSnyanmisaka             p_regs->sw136.fcode_fwd_hor = dx->pic.forward_f_code;
225*437bfbebSnyanmisaka             p_regs->sw136.fcode_fwd_ver = dx->pic.forward_f_code;
226*437bfbebSnyanmisaka             p_regs->sw136.fcode_bwd_hor = dx->pic.backward_f_code;
227*437bfbebSnyanmisaka             p_regs->sw136.fcode_bwd_ver = dx->pic.backward_f_code;
228*437bfbebSnyanmisaka             if (dx->pic.full_pel_forward_vector)
229*437bfbebSnyanmisaka                 p_regs->sw136.mv_accuracy_fwd = 0;
230*437bfbebSnyanmisaka             if (dx->pic.full_pel_backward_vector)
231*437bfbebSnyanmisaka                 p_regs->sw136.mv_accuracy_bwd = 0;
232*437bfbebSnyanmisaka         }
233*437bfbebSnyanmisaka 
234*437bfbebSnyanmisaka         p_regs->sw120.pic_mb_width = (dx->seq.decode_width + 15) >> 4;
235*437bfbebSnyanmisaka         p_regs->sw120.pic_mb_height_p = (dx->seq.decode_height + 15) >> 4;
236*437bfbebSnyanmisaka         p_regs->sw57.pic_interlace_e = 1 - dx->seq_ext.progressive_sequence;
237*437bfbebSnyanmisaka         if (dx->pic_code_ext.picture_structure == M2VD_PIC_STRUCT_FRAME)
238*437bfbebSnyanmisaka             p_regs->sw57.pic_fieldmode_e = 0;
239*437bfbebSnyanmisaka         else {
240*437bfbebSnyanmisaka             p_regs->sw57.pic_fieldmode_e = 1;
241*437bfbebSnyanmisaka             p_regs->sw57.pic_topfield_e = dx->pic_code_ext.picture_structure == 1;
242*437bfbebSnyanmisaka         }
243*437bfbebSnyanmisaka         if (dx->pic.picture_coding_type == M2VD_CODING_TYPE_B)
244*437bfbebSnyanmisaka             p_regs->sw57.pic_b_e = 1;
245*437bfbebSnyanmisaka         else
246*437bfbebSnyanmisaka             p_regs->sw57.pic_b_e = 0;
247*437bfbebSnyanmisaka         if (dx->pic.picture_coding_type == M2VD_CODING_TYPE_I)
248*437bfbebSnyanmisaka             p_regs->sw57.pic_inter_e = 0;
249*437bfbebSnyanmisaka         else
250*437bfbebSnyanmisaka             p_regs->sw57.pic_inter_e = 1;
251*437bfbebSnyanmisaka 
252*437bfbebSnyanmisaka         p_regs->sw120.topfieldfirst_e = dx->pic_code_ext.top_field_first;
253*437bfbebSnyanmisaka         p_regs->sw57.fwd_interlace_e = 0;
254*437bfbebSnyanmisaka         p_regs->sw57.write_mvs_e = 0;//concealment_motion_vectors;
255*437bfbebSnyanmisaka         p_regs->sw120.alt_scan_e = dx->pic_code_ext.alternate_scan;
256*437bfbebSnyanmisaka         p_regs->sw136.alt_scan_flag_e = dx->pic_code_ext.alternate_scan;
257*437bfbebSnyanmisaka 
258*437bfbebSnyanmisaka         p_regs->sw122.qscale_type = dx->pic_code_ext.q_scale_type;
259*437bfbebSnyanmisaka         p_regs->sw122.intra_dc_prec = dx->pic_code_ext.intra_dc_precision;
260*437bfbebSnyanmisaka         p_regs->sw122.con_mv_e = dx->pic_code_ext.concealment_motion_vectors;
261*437bfbebSnyanmisaka         p_regs->sw122.intra_vlc_tab = dx->pic_code_ext.intra_vlc_format;
262*437bfbebSnyanmisaka         p_regs->sw122.frame_pred_dct = dx->pic_code_ext.frame_pred_frame_dct;
263*437bfbebSnyanmisaka         p_regs->sw51.init_qp = 1;
264*437bfbebSnyanmisaka 
265*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(ctx->packet_slots, task->dec.input, SLOT_BUFFER, &streambuf);
266*437bfbebSnyanmisaka         p_regs->sw64.VLC_base = mpp_buffer_get_fd(streambuf);
267*437bfbebSnyanmisaka         if (dx->bitstream_offset) {
268*437bfbebSnyanmisaka             mpp_dev_set_reg_offset(ctx->dev, 64, dx->bitstream_offset);
269*437bfbebSnyanmisaka         }
270*437bfbebSnyanmisaka 
271*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(ctx->frame_slots, dx->CurrPic.Index7Bits, SLOT_BUFFER, &framebuf);
272*437bfbebSnyanmisaka 
273*437bfbebSnyanmisaka 
274*437bfbebSnyanmisaka         if ((dx->pic_code_ext.picture_structure == M2VD_PIC_STRUCT_TOP_FIELD) ||
275*437bfbebSnyanmisaka             (dx->pic_code_ext.picture_structure == M2VD_PIC_STRUCT_FRAME)) {
276*437bfbebSnyanmisaka             p_regs->sw63.cur_pic_base = mpp_buffer_get_fd(framebuf); //just index need map
277*437bfbebSnyanmisaka         } else {
278*437bfbebSnyanmisaka             p_regs->sw63.cur_pic_base = mpp_buffer_get_fd(framebuf);
279*437bfbebSnyanmisaka             mpp_dev_set_reg_offset(ctx->dev, 63, MPP_ALIGN(dx->seq.decode_width, 16));
280*437bfbebSnyanmisaka         }
281*437bfbebSnyanmisaka 
282*437bfbebSnyanmisaka         //ref & qtable config
283*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(ctx->frame_slots, dx->frame_refs[0].Index7Bits, SLOT_BUFFER, &framebuf);
284*437bfbebSnyanmisaka         p_regs->sw131.ref0  = mpp_buffer_get_fd(framebuf); //just index need map
285*437bfbebSnyanmisaka 
286*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(ctx->frame_slots, dx->frame_refs[1].Index7Bits, SLOT_BUFFER, &framebuf);
287*437bfbebSnyanmisaka         p_regs->sw148.ref1  = mpp_buffer_get_fd(framebuf); //just index need map
288*437bfbebSnyanmisaka 
289*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(ctx->frame_slots, dx->frame_refs[2].Index7Bits, SLOT_BUFFER, &framebuf);
290*437bfbebSnyanmisaka         p_regs->sw134.ref2  = mpp_buffer_get_fd(framebuf); //just index need map
291*437bfbebSnyanmisaka 
292*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(ctx->frame_slots, dx->frame_refs[3].Index7Bits, SLOT_BUFFER, &framebuf);
293*437bfbebSnyanmisaka         p_regs->sw135.ref3  = mpp_buffer_get_fd(framebuf); //just index need map
294*437bfbebSnyanmisaka 
295*437bfbebSnyanmisaka         p_regs->sw61.slice_table = mpp_buffer_get_fd(ctx->qp_table);
296*437bfbebSnyanmisaka 
297*437bfbebSnyanmisaka         p_regs->sw52.startmb_x = 0;
298*437bfbebSnyanmisaka         p_regs->sw52.startmb_y = 0;
299*437bfbebSnyanmisaka         p_regs->sw57.dec_out_dis = 0;
300*437bfbebSnyanmisaka         p_regs->sw50.filtering_dis = 1;
301*437bfbebSnyanmisaka 
302*437bfbebSnyanmisaka         p_regs->sw51.stream_len = dx->bitstream_length;
303*437bfbebSnyanmisaka         p_regs->sw122.stream_start_bit = dx->bitstream_start_bit;
304*437bfbebSnyanmisaka         p_regs->sw57.dec_e = 1;
305*437bfbebSnyanmisaka 
306*437bfbebSnyanmisaka         if (M2VH_DBG_REG & m2vh_debug) {
307*437bfbebSnyanmisaka             RK_U32 j = 0;
308*437bfbebSnyanmisaka             RK_U32 *p_reg = (RK_U32 *)p_regs;
309*437bfbebSnyanmisaka             for (j = 50; j < 159; j++) {
310*437bfbebSnyanmisaka                 mpp_log("reg[%d] = 0x%08x", j, p_reg[j]);
311*437bfbebSnyanmisaka             }
312*437bfbebSnyanmisaka         }
313*437bfbebSnyanmisaka         if (ctx->fp_reg_in) {
314*437bfbebSnyanmisaka             int k = 0;
315*437bfbebSnyanmisaka             RK_U32 *p_reg = (RK_U32*)p_regs;
316*437bfbebSnyanmisaka             mpp_log("fwrite regs start");
317*437bfbebSnyanmisaka             fprintf(ctx->fp_reg_in, "Frame #%d\n", ctx->dec_frame_cnt);
318*437bfbebSnyanmisaka             for (k = 0; k < M2VD_VDPU2_REG_NUM; k++)
319*437bfbebSnyanmisaka                 fprintf(ctx->fp_reg_in, "[(D)%03d, (X)%03x]  %08x\n", k, k, p_reg[k]);
320*437bfbebSnyanmisaka             fflush(ctx->fp_reg_in);
321*437bfbebSnyanmisaka         }
322*437bfbebSnyanmisaka 
323*437bfbebSnyanmisaka         task->dec.valid = 1;
324*437bfbebSnyanmisaka         ctx->dec_frame_cnt++;
325*437bfbebSnyanmisaka     }
326*437bfbebSnyanmisaka     return ret;
327*437bfbebSnyanmisaka 
328*437bfbebSnyanmisaka }
329*437bfbebSnyanmisaka 
hal_m2vd_vdpu2_start(void * hal,HalTaskInfo * task)330*437bfbebSnyanmisaka MPP_RET hal_m2vd_vdpu2_start(void *hal, HalTaskInfo *task)
331*437bfbebSnyanmisaka {
332*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
333*437bfbebSnyanmisaka     M2vdHalCtx *ctx = (M2vdHalCtx *)hal;
334*437bfbebSnyanmisaka 
335*437bfbebSnyanmisaka     m2vh_dbg_func("enter\n");
336*437bfbebSnyanmisaka 
337*437bfbebSnyanmisaka     do {
338*437bfbebSnyanmisaka         MppDevRegWrCfg wr_cfg;
339*437bfbebSnyanmisaka         MppDevRegRdCfg rd_cfg;
340*437bfbebSnyanmisaka         RK_U32 *regs = (RK_U32 *)ctx->regs;
341*437bfbebSnyanmisaka         RK_U32 reg_size = sizeof(M2vdVdpu2Reg);
342*437bfbebSnyanmisaka 
343*437bfbebSnyanmisaka         wr_cfg.reg = regs;
344*437bfbebSnyanmisaka         wr_cfg.size = reg_size;
345*437bfbebSnyanmisaka         wr_cfg.offset = 0;
346*437bfbebSnyanmisaka 
347*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
348*437bfbebSnyanmisaka         if (ret) {
349*437bfbebSnyanmisaka             mpp_err_f("set register write failed %d\n", ret);
350*437bfbebSnyanmisaka             break;
351*437bfbebSnyanmisaka         }
352*437bfbebSnyanmisaka 
353*437bfbebSnyanmisaka         rd_cfg.reg = regs;
354*437bfbebSnyanmisaka         rd_cfg.size = reg_size;
355*437bfbebSnyanmisaka         rd_cfg.offset = 0;
356*437bfbebSnyanmisaka 
357*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &rd_cfg);
358*437bfbebSnyanmisaka         if (ret) {
359*437bfbebSnyanmisaka             mpp_err_f("set register read failed %d\n", ret);
360*437bfbebSnyanmisaka             break;
361*437bfbebSnyanmisaka         }
362*437bfbebSnyanmisaka 
363*437bfbebSnyanmisaka         ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
364*437bfbebSnyanmisaka         if (ret) {
365*437bfbebSnyanmisaka             mpp_err_f("send cmd failed %d\n", ret);
366*437bfbebSnyanmisaka             break;
367*437bfbebSnyanmisaka         }
368*437bfbebSnyanmisaka     } while (0);
369*437bfbebSnyanmisaka 
370*437bfbebSnyanmisaka     (void)task;
371*437bfbebSnyanmisaka     m2vh_dbg_func("leave\n");
372*437bfbebSnyanmisaka     return ret;
373*437bfbebSnyanmisaka }
374*437bfbebSnyanmisaka 
hal_m2vd_vdpu2_wait(void * hal,HalTaskInfo * task)375*437bfbebSnyanmisaka MPP_RET hal_m2vd_vdpu2_wait(void *hal, HalTaskInfo *task)
376*437bfbebSnyanmisaka {
377*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
378*437bfbebSnyanmisaka     M2vdHalCtx *ctx = (M2vdHalCtx *)hal;
379*437bfbebSnyanmisaka     M2vdVdpu2Reg* reg_out = (M2vdVdpu2Reg * )ctx->regs;
380*437bfbebSnyanmisaka 
381*437bfbebSnyanmisaka     m2vh_dbg_func("enter\n");
382*437bfbebSnyanmisaka 
383*437bfbebSnyanmisaka     ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
384*437bfbebSnyanmisaka     if (ret)
385*437bfbebSnyanmisaka         mpp_err_f("poll cmd failed %d\n", ret);
386*437bfbebSnyanmisaka 
387*437bfbebSnyanmisaka     if (ctx->fp_reg_out) {
388*437bfbebSnyanmisaka         int k = 0;
389*437bfbebSnyanmisaka         RK_U32 *p_reg = (RK_U32*)&reg_out;
390*437bfbebSnyanmisaka         fprintf(ctx->fp_reg_out, "Frame #%d\n", ctx->dec_frame_cnt);
391*437bfbebSnyanmisaka         for (k = 0; k < M2VD_VDPU2_REG_NUM; k++)
392*437bfbebSnyanmisaka             fprintf(ctx->fp_reg_out, "[(D)%03d, (X)%03x]  %08x\n", k, k, p_reg[k]);
393*437bfbebSnyanmisaka         fflush(ctx->fp_reg_out);
394*437bfbebSnyanmisaka     }
395*437bfbebSnyanmisaka     if (reg_out->sw55.dec_error_int | reg_out->sw55.dec_buffer_int) {
396*437bfbebSnyanmisaka         if (ctx->dec_cb)
397*437bfbebSnyanmisaka             mpp_callback(ctx->dec_cb, NULL);
398*437bfbebSnyanmisaka     }
399*437bfbebSnyanmisaka 
400*437bfbebSnyanmisaka     if (M2VH_DBG_IRQ & m2vh_debug)
401*437bfbebSnyanmisaka         mpp_log("mpp_device_wait_reg return interrupt:%08x", reg_out->sw55);
402*437bfbebSnyanmisaka 
403*437bfbebSnyanmisaka     (void)task;
404*437bfbebSnyanmisaka     m2vh_dbg_func("leave\n");
405*437bfbebSnyanmisaka     return ret;
406*437bfbebSnyanmisaka }
407