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_vp8d_vdpu1"
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_debug.h"
24*437bfbebSnyanmisaka
25*437bfbebSnyanmisaka #include "hal_vp8d_vdpu1.h"
26*437bfbebSnyanmisaka #include "hal_vp8d_vdpu1_reg.h"
27*437bfbebSnyanmisaka
28*437bfbebSnyanmisaka #define CLIP3(l, h, v) ((v) < (l) ? (l) : ((v) > (h) ? (h) : (v)))
29*437bfbebSnyanmisaka
30*437bfbebSnyanmisaka static const RK_U32 mcFilter[8][6] = {
31*437bfbebSnyanmisaka { 0, 0, 128, 0, 0, 0 },
32*437bfbebSnyanmisaka { 0, -6, 123, 12, -1, 0 },
33*437bfbebSnyanmisaka { 2, -11, 108, 36, -8, 1 },
34*437bfbebSnyanmisaka { 0, -9, 93, 50, -6, 0 },
35*437bfbebSnyanmisaka { 3, -16, 77, 77, -16, 3 },
36*437bfbebSnyanmisaka { 0, -6, 50, 93, -9, 0 },
37*437bfbebSnyanmisaka { 1, -8, 36, 108, -11, 2 },
38*437bfbebSnyanmisaka { 0, -1, 12, 123, -6, 0 }
39*437bfbebSnyanmisaka };
40*437bfbebSnyanmisaka
hal_vp8d_vdpu1_init(void * hal,MppHalCfg * cfg)41*437bfbebSnyanmisaka MPP_RET hal_vp8d_vdpu1_init(void *hal, MppHalCfg *cfg)
42*437bfbebSnyanmisaka {
43*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
44*437bfbebSnyanmisaka VP8DHalContext_t *ctx = (VP8DHalContext_t *)hal;
45*437bfbebSnyanmisaka
46*437bfbebSnyanmisaka FUN_T("enter\n");
47*437bfbebSnyanmisaka
48*437bfbebSnyanmisaka ret = mpp_dev_init(&ctx->dev, VPU_CLIENT_VDPU1);
49*437bfbebSnyanmisaka if (ret) {
50*437bfbebSnyanmisaka mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
51*437bfbebSnyanmisaka goto ERR_RET;
52*437bfbebSnyanmisaka }
53*437bfbebSnyanmisaka if (NULL == ctx->regs) {
54*437bfbebSnyanmisaka ctx->regs = mpp_calloc_size(void, sizeof(VP8DRegSet_t));
55*437bfbebSnyanmisaka if (NULL == ctx->regs) {
56*437bfbebSnyanmisaka mpp_err("hal_vp8 reg alloc failed\n");
57*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC;
58*437bfbebSnyanmisaka goto ERR_RET;
59*437bfbebSnyanmisaka }
60*437bfbebSnyanmisaka }
61*437bfbebSnyanmisaka
62*437bfbebSnyanmisaka if (NULL == ctx->group) {
63*437bfbebSnyanmisaka ret = mpp_buffer_group_get_internal(&ctx->group, MPP_BUFFER_TYPE_ION);
64*437bfbebSnyanmisaka if (ret) {
65*437bfbebSnyanmisaka mpp_err("hal_vp8 mpp_buffer_group_get failed\n");
66*437bfbebSnyanmisaka goto ERR_RET;
67*437bfbebSnyanmisaka }
68*437bfbebSnyanmisaka }
69*437bfbebSnyanmisaka
70*437bfbebSnyanmisaka ret = mpp_buffer_get(ctx->group, &ctx->probe_table, VP8D_PROB_TABLE_SIZE);
71*437bfbebSnyanmisaka if (ret) {
72*437bfbebSnyanmisaka mpp_err("hal_vp8 probe_table get buffer failed\n");
73*437bfbebSnyanmisaka goto ERR_RET;
74*437bfbebSnyanmisaka }
75*437bfbebSnyanmisaka
76*437bfbebSnyanmisaka ret = mpp_buffer_get(ctx->group, &ctx->seg_map, VP8D_MAX_SEGMAP_SIZE);
77*437bfbebSnyanmisaka if (ret) {
78*437bfbebSnyanmisaka mpp_err("hal_vp8 seg_map get buffer failed\n");
79*437bfbebSnyanmisaka goto ERR_RET;
80*437bfbebSnyanmisaka }
81*437bfbebSnyanmisaka //configure
82*437bfbebSnyanmisaka ctx->packet_slots = cfg->packet_slots;
83*437bfbebSnyanmisaka ctx->frame_slots = cfg->frame_slots;
84*437bfbebSnyanmisaka cfg->dev = ctx->dev;
85*437bfbebSnyanmisaka
86*437bfbebSnyanmisaka FUN_T("leave\n");
87*437bfbebSnyanmisaka return ret;
88*437bfbebSnyanmisaka ERR_RET:
89*437bfbebSnyanmisaka if (ctx->dev) {
90*437bfbebSnyanmisaka mpp_dev_deinit(ctx->dev);
91*437bfbebSnyanmisaka ctx->dev = NULL;
92*437bfbebSnyanmisaka }
93*437bfbebSnyanmisaka
94*437bfbebSnyanmisaka if (ctx->regs) {
95*437bfbebSnyanmisaka mpp_free(ctx->regs);
96*437bfbebSnyanmisaka ctx->regs = NULL;
97*437bfbebSnyanmisaka }
98*437bfbebSnyanmisaka
99*437bfbebSnyanmisaka if (ctx->probe_table) {
100*437bfbebSnyanmisaka mpp_buffer_put(ctx->probe_table);
101*437bfbebSnyanmisaka ctx->probe_table = NULL;
102*437bfbebSnyanmisaka }
103*437bfbebSnyanmisaka
104*437bfbebSnyanmisaka if (ctx->seg_map) {
105*437bfbebSnyanmisaka mpp_buffer_group_put(ctx->seg_map);
106*437bfbebSnyanmisaka ctx->seg_map = NULL;
107*437bfbebSnyanmisaka }
108*437bfbebSnyanmisaka
109*437bfbebSnyanmisaka if (ctx->group) {
110*437bfbebSnyanmisaka mpp_buffer_put(ctx->group);
111*437bfbebSnyanmisaka ctx->group = NULL;
112*437bfbebSnyanmisaka }
113*437bfbebSnyanmisaka FUN_T("leave\n");
114*437bfbebSnyanmisaka return ret;
115*437bfbebSnyanmisaka }
116*437bfbebSnyanmisaka
hal_vp8d_vdpu1_deinit(void * hal)117*437bfbebSnyanmisaka MPP_RET hal_vp8d_vdpu1_deinit(void *hal)
118*437bfbebSnyanmisaka {
119*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
120*437bfbebSnyanmisaka VP8DHalContext_t *ctx = (VP8DHalContext_t *)hal;
121*437bfbebSnyanmisaka
122*437bfbebSnyanmisaka FUN_T("enter\n");
123*437bfbebSnyanmisaka
124*437bfbebSnyanmisaka if (ctx->dev) {
125*437bfbebSnyanmisaka mpp_dev_deinit(ctx->dev);
126*437bfbebSnyanmisaka ctx->dev = NULL;
127*437bfbebSnyanmisaka }
128*437bfbebSnyanmisaka
129*437bfbebSnyanmisaka if (ctx->probe_table) {
130*437bfbebSnyanmisaka ret = mpp_buffer_put(ctx->probe_table);
131*437bfbebSnyanmisaka if (ret) {
132*437bfbebSnyanmisaka mpp_err("hal_vp8 probe table put buffer failed\n");
133*437bfbebSnyanmisaka }
134*437bfbebSnyanmisaka }
135*437bfbebSnyanmisaka
136*437bfbebSnyanmisaka if (ctx->seg_map) {
137*437bfbebSnyanmisaka ret = mpp_buffer_put(ctx->seg_map);
138*437bfbebSnyanmisaka if (ret) {
139*437bfbebSnyanmisaka mpp_err("hal_vp8 seg map put buffer failed\n");
140*437bfbebSnyanmisaka }
141*437bfbebSnyanmisaka }
142*437bfbebSnyanmisaka
143*437bfbebSnyanmisaka if (ctx->group) {
144*437bfbebSnyanmisaka ret = mpp_buffer_group_put(ctx->group);
145*437bfbebSnyanmisaka if (ret) {
146*437bfbebSnyanmisaka mpp_err("hal_vp8 group free buffer failed\n");
147*437bfbebSnyanmisaka }
148*437bfbebSnyanmisaka }
149*437bfbebSnyanmisaka
150*437bfbebSnyanmisaka if (ctx->regs) {
151*437bfbebSnyanmisaka mpp_free(ctx->regs);
152*437bfbebSnyanmisaka ctx->regs = NULL;
153*437bfbebSnyanmisaka }
154*437bfbebSnyanmisaka
155*437bfbebSnyanmisaka FUN_T("leave\n");
156*437bfbebSnyanmisaka return ret;
157*437bfbebSnyanmisaka }
158*437bfbebSnyanmisaka
hal_vp8_init_hwcfg(VP8DHalContext_t * ctx)159*437bfbebSnyanmisaka static MPP_RET hal_vp8_init_hwcfg(VP8DHalContext_t *ctx)
160*437bfbebSnyanmisaka {
161*437bfbebSnyanmisaka
162*437bfbebSnyanmisaka VP8DRegSet_t *reg = (VP8DRegSet_t *)ctx->regs;
163*437bfbebSnyanmisaka
164*437bfbebSnyanmisaka FUN_T("enter\n");
165*437bfbebSnyanmisaka memset(reg, 0, sizeof(VP8DRegSet_t));
166*437bfbebSnyanmisaka
167*437bfbebSnyanmisaka reg->reg1_interrupt.sw_dec_e = 1;
168*437bfbebSnyanmisaka
169*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_out_tiled_e = 0;
170*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_scmd_dis = 0;
171*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_adv_pre_dis = 0;
172*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_latency = 0;
173*437bfbebSnyanmisaka
174*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_in_endian = 1;
175*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_out_endian = 1;
176*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_inswap32_e = 1;
177*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_outswap32_e = 1;
178*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_strswap32_e = 1;
179*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_strendian_e = 1;
180*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_axi_rn_id = 0;
181*437bfbebSnyanmisaka
182*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_data_disc_e = 0;
183*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_max_burst = 16;
184*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_timeout_e = 1;
185*437bfbebSnyanmisaka reg->reg2_dec_ctrl.sw_dec_clk_gate_e = 1;
186*437bfbebSnyanmisaka
187*437bfbebSnyanmisaka reg->reg3.sw_dec_out_dis = 0;
188*437bfbebSnyanmisaka reg->reg3.sw_dec_axi_wr_id = 0;
189*437bfbebSnyanmisaka reg->reg3.sw_dec_mode = DEC_MODE_VP8;
190*437bfbebSnyanmisaka
191*437bfbebSnyanmisaka reg->reg1_interrupt.sw_dec_irq = 0;
192*437bfbebSnyanmisaka
193*437bfbebSnyanmisaka reg->reg10_segment_map_base = mpp_buffer_get_fd(ctx->seg_map);
194*437bfbebSnyanmisaka reg->reg40_qtable_base = mpp_buffer_get_fd(ctx->probe_table);
195*437bfbebSnyanmisaka
196*437bfbebSnyanmisaka FUN_T("leave\n");
197*437bfbebSnyanmisaka return MPP_OK;
198*437bfbebSnyanmisaka }
199*437bfbebSnyanmisaka
hal_vp8d_pre_filter_tap_set(VP8DHalContext_t * ctx)200*437bfbebSnyanmisaka static MPP_RET hal_vp8d_pre_filter_tap_set(VP8DHalContext_t *ctx)
201*437bfbebSnyanmisaka {
202*437bfbebSnyanmisaka VP8DRegSet_t *regs = (VP8DRegSet_t *)ctx->regs;
203*437bfbebSnyanmisaka
204*437bfbebSnyanmisaka FUN_T("enter\n");
205*437bfbebSnyanmisaka regs->reg49.sw_pred_bc_tap_0_0 = mcFilter[0][1];
206*437bfbebSnyanmisaka regs->reg49.sw_pred_bc_tap_0_1 = mcFilter[0][2];
207*437bfbebSnyanmisaka regs->reg49.sw_pred_bc_tap_0_2 = mcFilter[0][3];
208*437bfbebSnyanmisaka regs->reg34.sw_pred_bc_tap_0_3 = mcFilter[0][4];
209*437bfbebSnyanmisaka regs->reg34.sw_pred_bc_tap_1_0 = mcFilter[1][1];
210*437bfbebSnyanmisaka regs->reg34.sw_pred_bc_tap_1_1 = mcFilter[1][2];
211*437bfbebSnyanmisaka regs->reg35.sw_pred_bc_tap_1_2 = mcFilter[1][3];
212*437bfbebSnyanmisaka regs->reg35.sw_pred_bc_tap_1_3 = mcFilter[1][4];
213*437bfbebSnyanmisaka regs->reg35.sw_pred_bc_tap_2_0 = mcFilter[2][1];
214*437bfbebSnyanmisaka regs->reg36.sw_pred_bc_tap_2_1 = mcFilter[2][2];
215*437bfbebSnyanmisaka regs->reg36.sw_pred_bc_tap_2_2 = mcFilter[2][3];
216*437bfbebSnyanmisaka regs->reg36.sw_pred_bc_tap_2_3 = mcFilter[2][4];
217*437bfbebSnyanmisaka
218*437bfbebSnyanmisaka regs->reg37.sw_pred_bc_tap_3_0 = mcFilter[3][1];
219*437bfbebSnyanmisaka regs->reg37.sw_pred_bc_tap_3_1 = mcFilter[3][2];
220*437bfbebSnyanmisaka regs->reg37.sw_pred_bc_tap_3_2 = mcFilter[3][3];
221*437bfbebSnyanmisaka regs->reg38.sw_pred_bc_tap_3_3 = mcFilter[3][4];
222*437bfbebSnyanmisaka regs->reg38.sw_pred_bc_tap_4_0 = mcFilter[4][1];
223*437bfbebSnyanmisaka regs->reg38.sw_pred_bc_tap_4_1 = mcFilter[4][2];
224*437bfbebSnyanmisaka regs->reg39.sw_pred_bc_tap_4_2 = mcFilter[4][3];
225*437bfbebSnyanmisaka regs->reg39.sw_pred_bc_tap_4_3 = mcFilter[4][4];
226*437bfbebSnyanmisaka regs->reg39.sw_pred_bc_tap_5_0 = mcFilter[5][1];
227*437bfbebSnyanmisaka
228*437bfbebSnyanmisaka regs->reg42.sw_pred_bc_tap_5_1 = mcFilter[5][2];
229*437bfbebSnyanmisaka regs->reg42.sw_pred_bc_tap_5_2 = mcFilter[5][3];
230*437bfbebSnyanmisaka regs->reg42.sw_pred_bc_tap_5_3 = mcFilter[5][4];
231*437bfbebSnyanmisaka
232*437bfbebSnyanmisaka regs->reg43.sw_pred_bc_tap_6_0 = mcFilter[6][1];
233*437bfbebSnyanmisaka regs->reg43.sw_pred_bc_tap_6_1 = mcFilter[6][2];
234*437bfbebSnyanmisaka regs->reg43.sw_pred_bc_tap_6_2 = mcFilter[6][3];
235*437bfbebSnyanmisaka
236*437bfbebSnyanmisaka regs->reg44.sw_pred_bc_tap_6_3 = mcFilter[6][4];
237*437bfbebSnyanmisaka regs->reg44.sw_pred_bc_tap_7_0 = mcFilter[7][1];
238*437bfbebSnyanmisaka regs->reg44.sw_pred_bc_tap_7_1 = mcFilter[7][2];
239*437bfbebSnyanmisaka
240*437bfbebSnyanmisaka regs->reg45.sw_pred_bc_tap_7_2 = mcFilter[7][3];
241*437bfbebSnyanmisaka regs->reg45.sw_pred_bc_tap_7_3 = mcFilter[7][4];
242*437bfbebSnyanmisaka
243*437bfbebSnyanmisaka regs->reg45.sw_pred_tap_2_M1 = mcFilter[2][0];
244*437bfbebSnyanmisaka regs->reg45.sw_pred_tap_2_4 = mcFilter[2][5];
245*437bfbebSnyanmisaka regs->reg45.sw_pred_tap_4_M1 = mcFilter[4][0];
246*437bfbebSnyanmisaka regs->reg45.sw_pred_tap_4_4 = mcFilter[4][5];
247*437bfbebSnyanmisaka regs->reg45.sw_pred_tap_6_M1 = mcFilter[6][0];
248*437bfbebSnyanmisaka regs->reg45.sw_pred_tap_6_4 = mcFilter[6][5];
249*437bfbebSnyanmisaka
250*437bfbebSnyanmisaka FUN_T("leave\n");
251*437bfbebSnyanmisaka return MPP_OK;
252*437bfbebSnyanmisaka }
253*437bfbebSnyanmisaka
254*437bfbebSnyanmisaka static MPP_RET
hal_vp8d_dct_partition_cfg(VP8DHalContext_t * ctx,HalTaskInfo * task)255*437bfbebSnyanmisaka hal_vp8d_dct_partition_cfg(VP8DHalContext_t *ctx, HalTaskInfo *task)
256*437bfbebSnyanmisaka {
257*437bfbebSnyanmisaka RK_U32 i = 0, len = 0, len1 = 0;
258*437bfbebSnyanmisaka RK_U32 extraBytesPacked = 0;
259*437bfbebSnyanmisaka RK_U32 addr = 0, byte_offset = 0;
260*437bfbebSnyanmisaka RK_U32 fd = 0;
261*437bfbebSnyanmisaka MppBuffer streambuf = NULL;
262*437bfbebSnyanmisaka VP8DRegSet_t *regs = (VP8DRegSet_t *)ctx->regs;
263*437bfbebSnyanmisaka DXVA_PicParams_VP8 *pic_param = (DXVA_PicParams_VP8 *)task->dec.syntax.data;
264*437bfbebSnyanmisaka
265*437bfbebSnyanmisaka
266*437bfbebSnyanmisaka FUN_T("enter\n");
267*437bfbebSnyanmisaka
268*437bfbebSnyanmisaka mpp_buf_slot_get_prop(ctx->packet_slots, task->dec.input,
269*437bfbebSnyanmisaka SLOT_BUFFER, &streambuf);
270*437bfbebSnyanmisaka fd = mpp_buffer_get_fd(streambuf);
271*437bfbebSnyanmisaka regs->reg27_bitpl_ctrl_base = fd;
272*437bfbebSnyanmisaka if (pic_param->stream_start_offset)
273*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 27, pic_param->stream_start_offset);
274*437bfbebSnyanmisaka regs->reg5.sw_strm1_start_bit = pic_param->stream_start_bit;
275*437bfbebSnyanmisaka
276*437bfbebSnyanmisaka /* calculate dct partition length here instead */
277*437bfbebSnyanmisaka if (pic_param->decMode == VP8HWD_VP8 && !pic_param->frame_type)
278*437bfbebSnyanmisaka extraBytesPacked += 7;
279*437bfbebSnyanmisaka
280*437bfbebSnyanmisaka len = pic_param->streamEndPos + pic_param->frameTagSize
281*437bfbebSnyanmisaka - pic_param->dctPartitionOffsets[0];
282*437bfbebSnyanmisaka len += ((1 << pic_param->log2_nbr_of_dct_partitions) - 1) * 3;
283*437bfbebSnyanmisaka len1 = extraBytesPacked + pic_param->dctPartitionOffsets[0];
284*437bfbebSnyanmisaka len += (len1 & 0x7);
285*437bfbebSnyanmisaka regs->reg6.sw_stream_len = len;
286*437bfbebSnyanmisaka
287*437bfbebSnyanmisaka len = pic_param->offsetToDctParts + pic_param->frameTagSize -
288*437bfbebSnyanmisaka (pic_param->stream_start_offset - extraBytesPacked);
289*437bfbebSnyanmisaka len++;
290*437bfbebSnyanmisaka
291*437bfbebSnyanmisaka regs->reg9.sw_stream1_len = len;
292*437bfbebSnyanmisaka regs->reg9.sw_coeffs_part_am = (1 << pic_param->log2_nbr_of_dct_partitions);
293*437bfbebSnyanmisaka regs->reg9.sw_coeffs_part_am--;
294*437bfbebSnyanmisaka for (i = 0; i < (RK_U32)(1 << pic_param->log2_nbr_of_dct_partitions); i++) {
295*437bfbebSnyanmisaka addr = extraBytesPacked + pic_param->dctPartitionOffsets[i];
296*437bfbebSnyanmisaka byte_offset = addr & 0x7;
297*437bfbebSnyanmisaka addr = addr & 0xFFFFFFF8;
298*437bfbebSnyanmisaka
299*437bfbebSnyanmisaka if (i == 0) {
300*437bfbebSnyanmisaka regs->reg12_input_stream_base = fd;
301*437bfbebSnyanmisaka if (addr) {
302*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 12, addr);
303*437bfbebSnyanmisaka }
304*437bfbebSnyanmisaka } else if (i <= 5) {
305*437bfbebSnyanmisaka regs->reg_dct_strm0_base[i - 1] = fd;
306*437bfbebSnyanmisaka if (addr) {
307*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 21 + i, addr);
308*437bfbebSnyanmisaka }
309*437bfbebSnyanmisaka } else {
310*437bfbebSnyanmisaka regs->reg_dct_strm1_base[i - 6] = fd;
311*437bfbebSnyanmisaka if (addr) {
312*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 22 + i, addr);
313*437bfbebSnyanmisaka }
314*437bfbebSnyanmisaka }
315*437bfbebSnyanmisaka
316*437bfbebSnyanmisaka switch (i) {
317*437bfbebSnyanmisaka case 0:
318*437bfbebSnyanmisaka regs->reg5.sw_strm0_start_bit = byte_offset * 8;
319*437bfbebSnyanmisaka break;
320*437bfbebSnyanmisaka case 1:
321*437bfbebSnyanmisaka regs->reg7.sw_dct1_start_bit = byte_offset * 8;
322*437bfbebSnyanmisaka break;
323*437bfbebSnyanmisaka case 2:
324*437bfbebSnyanmisaka regs->reg7.sw_dct2_start_bit = byte_offset * 8;
325*437bfbebSnyanmisaka break;
326*437bfbebSnyanmisaka case 3:
327*437bfbebSnyanmisaka regs->reg11.sw_dct_start_bit_3 = byte_offset * 8;
328*437bfbebSnyanmisaka break;
329*437bfbebSnyanmisaka case 4:
330*437bfbebSnyanmisaka regs->reg11.sw_dct_start_bit_4 = byte_offset * 8;
331*437bfbebSnyanmisaka break;
332*437bfbebSnyanmisaka case 5:
333*437bfbebSnyanmisaka regs->reg11.sw_dct_start_bit_5 = byte_offset * 8;
334*437bfbebSnyanmisaka break;
335*437bfbebSnyanmisaka case 6:
336*437bfbebSnyanmisaka regs->reg11.sw_dct_start_bit_6 = byte_offset * 8;
337*437bfbebSnyanmisaka break;
338*437bfbebSnyanmisaka case 7:
339*437bfbebSnyanmisaka regs->reg11.sw_dct_start_bit_7 = byte_offset * 8;
340*437bfbebSnyanmisaka break;
341*437bfbebSnyanmisaka default:
342*437bfbebSnyanmisaka break;
343*437bfbebSnyanmisaka }
344*437bfbebSnyanmisaka }
345*437bfbebSnyanmisaka
346*437bfbebSnyanmisaka FUN_T("leave\n");
347*437bfbebSnyanmisaka return MPP_OK;
348*437bfbebSnyanmisaka }
349*437bfbebSnyanmisaka
hal_vp8hw_asic_probe_update(DXVA_PicParams_VP8 * p,RK_U8 * probTbl)350*437bfbebSnyanmisaka static void hal_vp8hw_asic_probe_update(DXVA_PicParams_VP8 *p, RK_U8 *probTbl)
351*437bfbebSnyanmisaka {
352*437bfbebSnyanmisaka RK_U8 *dst;
353*437bfbebSnyanmisaka RK_U32 i, j, k;
354*437bfbebSnyanmisaka
355*437bfbebSnyanmisaka FUN_T("enter\n");
356*437bfbebSnyanmisaka /* first probs */
357*437bfbebSnyanmisaka dst = probTbl;
358*437bfbebSnyanmisaka
359*437bfbebSnyanmisaka dst[0] = p->probe_skip_false;
360*437bfbebSnyanmisaka dst[1] = p->prob_intra;
361*437bfbebSnyanmisaka dst[2] = p->prob_last;
362*437bfbebSnyanmisaka dst[3] = p->prob_golden;
363*437bfbebSnyanmisaka dst[4] = p->stVP8Segments.mb_segment_tree_probs[0];
364*437bfbebSnyanmisaka dst[5] = p->stVP8Segments.mb_segment_tree_probs[1];
365*437bfbebSnyanmisaka dst[6] = p->stVP8Segments.mb_segment_tree_probs[2];
366*437bfbebSnyanmisaka dst[7] = 0; /*unused*/
367*437bfbebSnyanmisaka
368*437bfbebSnyanmisaka dst += 8;
369*437bfbebSnyanmisaka dst[0] = p->intra_16x16_prob[0];
370*437bfbebSnyanmisaka dst[1] = p->intra_16x16_prob[1];
371*437bfbebSnyanmisaka dst[2] = p->intra_16x16_prob[2];
372*437bfbebSnyanmisaka dst[3] = p->intra_16x16_prob[3];
373*437bfbebSnyanmisaka dst[4] = p->intra_chroma_prob[0];
374*437bfbebSnyanmisaka dst[5] = p->intra_chroma_prob[1];
375*437bfbebSnyanmisaka dst[6] = p->intra_chroma_prob[2];
376*437bfbebSnyanmisaka dst[7] = 0; /*unused*/
377*437bfbebSnyanmisaka
378*437bfbebSnyanmisaka /* mv probs */
379*437bfbebSnyanmisaka dst += 8;
380*437bfbebSnyanmisaka dst[0] = p->vp8_mv_update_probs[0][0]; /* is short */
381*437bfbebSnyanmisaka dst[1] = p->vp8_mv_update_probs[1][0];
382*437bfbebSnyanmisaka dst[2] = p->vp8_mv_update_probs[0][1]; /* sign */
383*437bfbebSnyanmisaka dst[3] = p->vp8_mv_update_probs[1][1];
384*437bfbebSnyanmisaka dst[4] = p->vp8_mv_update_probs[0][8 + 9];
385*437bfbebSnyanmisaka dst[5] = p->vp8_mv_update_probs[0][9 + 9];
386*437bfbebSnyanmisaka dst[6] = p->vp8_mv_update_probs[1][8 + 9];
387*437bfbebSnyanmisaka dst[7] = p->vp8_mv_update_probs[1][9 + 9];
388*437bfbebSnyanmisaka dst += 8;
389*437bfbebSnyanmisaka for ( i = 0 ; i < 2 ; ++i ) {
390*437bfbebSnyanmisaka for ( j = 0 ; j < 8 ; j += 4 ) {
391*437bfbebSnyanmisaka dst[0] = p->vp8_mv_update_probs[i][j + 9 + 0];
392*437bfbebSnyanmisaka dst[1] = p->vp8_mv_update_probs[i][j + 9 + 1];
393*437bfbebSnyanmisaka dst[2] = p->vp8_mv_update_probs[i][j + 9 + 2];
394*437bfbebSnyanmisaka dst[3] = p->vp8_mv_update_probs[i][j + 9 + 3];
395*437bfbebSnyanmisaka dst += 4;
396*437bfbebSnyanmisaka }
397*437bfbebSnyanmisaka }
398*437bfbebSnyanmisaka for ( i = 0 ; i < 2 ; ++i ) {
399*437bfbebSnyanmisaka dst[0] = p->vp8_mv_update_probs[i][0 + 2];
400*437bfbebSnyanmisaka dst[1] = p->vp8_mv_update_probs[i][1 + 2];
401*437bfbebSnyanmisaka dst[2] = p->vp8_mv_update_probs[i][2 + 2];
402*437bfbebSnyanmisaka dst[3] = p->vp8_mv_update_probs[i][3 + 2];
403*437bfbebSnyanmisaka dst[4] = p->vp8_mv_update_probs[i][4 + 2];
404*437bfbebSnyanmisaka dst[5] = p->vp8_mv_update_probs[i][5 + 2];
405*437bfbebSnyanmisaka dst[6] = p->vp8_mv_update_probs[i][6 + 2];
406*437bfbebSnyanmisaka dst[7] = 0; /*unused*/
407*437bfbebSnyanmisaka dst += 8;
408*437bfbebSnyanmisaka }
409*437bfbebSnyanmisaka
410*437bfbebSnyanmisaka /* coeff probs (header part) */
411*437bfbebSnyanmisaka dst = (RK_U8*)probTbl;
412*437bfbebSnyanmisaka dst += (8 * 7);
413*437bfbebSnyanmisaka for ( i = 0 ; i < 4 ; ++i ) {
414*437bfbebSnyanmisaka for ( j = 0 ; j < 8 ; ++j ) {
415*437bfbebSnyanmisaka for ( k = 0 ; k < 3 ; ++k ) {
416*437bfbebSnyanmisaka dst[0] = p->vp8_coef_update_probs[i][j][k][0];
417*437bfbebSnyanmisaka dst[1] = p->vp8_coef_update_probs[i][j][k][1];
418*437bfbebSnyanmisaka dst[2] = p->vp8_coef_update_probs[i][j][k][2];
419*437bfbebSnyanmisaka dst[3] = p->vp8_coef_update_probs[i][j][k][3];
420*437bfbebSnyanmisaka dst += 4;
421*437bfbebSnyanmisaka }
422*437bfbebSnyanmisaka }
423*437bfbebSnyanmisaka }
424*437bfbebSnyanmisaka
425*437bfbebSnyanmisaka /* coeff probs (footer part) */
426*437bfbebSnyanmisaka dst = (RK_U8*)probTbl;
427*437bfbebSnyanmisaka dst += (8 * 55);
428*437bfbebSnyanmisaka for ( i = 0 ; i < 4 ; ++i ) {
429*437bfbebSnyanmisaka for ( j = 0 ; j < 8 ; ++j ) {
430*437bfbebSnyanmisaka for ( k = 0 ; k < 3 ; ++k ) {
431*437bfbebSnyanmisaka dst[0] = p->vp8_coef_update_probs[i][j][k][4];
432*437bfbebSnyanmisaka dst[1] = p->vp8_coef_update_probs[i][j][k][5];
433*437bfbebSnyanmisaka dst[2] = p->vp8_coef_update_probs[i][j][k][6];
434*437bfbebSnyanmisaka dst[3] = p->vp8_coef_update_probs[i][j][k][7];
435*437bfbebSnyanmisaka dst[4] = p->vp8_coef_update_probs[i][j][k][8];
436*437bfbebSnyanmisaka dst[5] = p->vp8_coef_update_probs[i][j][k][9];
437*437bfbebSnyanmisaka dst[6] = p->vp8_coef_update_probs[i][j][k][10];
438*437bfbebSnyanmisaka dst[7] = 0; /*unused*/
439*437bfbebSnyanmisaka dst += 8;
440*437bfbebSnyanmisaka }
441*437bfbebSnyanmisaka }
442*437bfbebSnyanmisaka }
443*437bfbebSnyanmisaka FUN_T("leave\n");
444*437bfbebSnyanmisaka return ;
445*437bfbebSnyanmisaka }
446*437bfbebSnyanmisaka
hal_vp8d_vdpu1_gen_regs(void * hal,HalTaskInfo * task)447*437bfbebSnyanmisaka MPP_RET hal_vp8d_vdpu1_gen_regs(void* hal, HalTaskInfo *task)
448*437bfbebSnyanmisaka {
449*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
450*437bfbebSnyanmisaka RK_U32 mb_width = 0, mb_height = 0;
451*437bfbebSnyanmisaka MppBuffer framebuf = NULL;
452*437bfbebSnyanmisaka RK_U8 *segmap_ptr = NULL;
453*437bfbebSnyanmisaka RK_U8 *probe_ptr = NULL;
454*437bfbebSnyanmisaka VP8DHalContext_t *ctx = (VP8DHalContext_t *)hal;
455*437bfbebSnyanmisaka VP8DRegSet_t *regs = (VP8DRegSet_t *)ctx->regs;
456*437bfbebSnyanmisaka DXVA_PicParams_VP8 *pic_param = (DXVA_PicParams_VP8 *)task->dec.syntax.data;
457*437bfbebSnyanmisaka
458*437bfbebSnyanmisaka FUN_T("enter\n");
459*437bfbebSnyanmisaka
460*437bfbebSnyanmisaka hal_vp8_init_hwcfg(ctx);
461*437bfbebSnyanmisaka mb_width = (pic_param->width + 15) >> 4;
462*437bfbebSnyanmisaka mb_height = (pic_param->height + 15) >> 4;
463*437bfbebSnyanmisaka
464*437bfbebSnyanmisaka regs->reg4.sw_pic_mb_width = mb_width & 0x1FF;
465*437bfbebSnyanmisaka regs->reg4.sw_pic_mb_hight_p = mb_height & 0xFF;
466*437bfbebSnyanmisaka regs->reg4.sw_pic_mb_w_ext = mb_width >> 9;
467*437bfbebSnyanmisaka regs->reg4.sw_pic_mb_h_ext = mb_height >> 8;
468*437bfbebSnyanmisaka
469*437bfbebSnyanmisaka if (!pic_param->frame_type) {
470*437bfbebSnyanmisaka segmap_ptr = mpp_buffer_get_ptr(ctx->seg_map);
471*437bfbebSnyanmisaka if (NULL != segmap_ptr) {
472*437bfbebSnyanmisaka memset(segmap_ptr, 0, VP8D_MAX_SEGMAP_SIZE);
473*437bfbebSnyanmisaka }
474*437bfbebSnyanmisaka }
475*437bfbebSnyanmisaka
476*437bfbebSnyanmisaka probe_ptr = mpp_buffer_get_ptr(ctx->probe_table);
477*437bfbebSnyanmisaka if (NULL != probe_ptr) {
478*437bfbebSnyanmisaka hal_vp8hw_asic_probe_update(pic_param, probe_ptr);
479*437bfbebSnyanmisaka }
480*437bfbebSnyanmisaka mpp_buf_slot_get_prop(ctx->frame_slots, pic_param->CurrPic.Index7Bits, SLOT_BUFFER, &framebuf);
481*437bfbebSnyanmisaka regs->reg13_cur_pic_base = mpp_buffer_get_fd(framebuf);
482*437bfbebSnyanmisaka if (!pic_param->frame_type) { //key frame
483*437bfbebSnyanmisaka if ((mb_width * mb_height) << 8 > 0x400000) {
484*437bfbebSnyanmisaka mpp_log("mb_width*mb_height is big then 0x400000,iommu err");
485*437bfbebSnyanmisaka }
486*437bfbebSnyanmisaka regs->reg14_ref0_base = regs->reg13_cur_pic_base;
487*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 14, (mb_width * mb_height) << 8);
488*437bfbebSnyanmisaka } else if (pic_param->lst_fb_idx.Index7Bits < 0x7f) { //config ref0 base
489*437bfbebSnyanmisaka mpp_buf_slot_get_prop(ctx->frame_slots, pic_param->lst_fb_idx.Index7Bits, SLOT_BUFFER, &framebuf);
490*437bfbebSnyanmisaka regs->reg14_ref0_base = mpp_buffer_get_fd(framebuf);
491*437bfbebSnyanmisaka } else {
492*437bfbebSnyanmisaka regs->reg14_ref0_base = regs->reg13_cur_pic_base;
493*437bfbebSnyanmisaka }
494*437bfbebSnyanmisaka
495*437bfbebSnyanmisaka /* golden reference */
496*437bfbebSnyanmisaka if (pic_param->gld_fb_idx.Index7Bits < 0x7f) {
497*437bfbebSnyanmisaka mpp_buf_slot_get_prop(ctx->frame_slots, pic_param->gld_fb_idx.Index7Bits, SLOT_BUFFER, &framebuf);
498*437bfbebSnyanmisaka regs->reg18_golden_ref_base = mpp_buffer_get_fd(framebuf);
499*437bfbebSnyanmisaka } else {
500*437bfbebSnyanmisaka regs->reg18_golden_ref_base = regs->reg13_cur_pic_base;
501*437bfbebSnyanmisaka }
502*437bfbebSnyanmisaka
503*437bfbebSnyanmisaka if (pic_param->ref_frame_sign_bias_golden) {
504*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 18, pic_param->ref_frame_sign_bias_golden);
505*437bfbebSnyanmisaka }
506*437bfbebSnyanmisaka
507*437bfbebSnyanmisaka /* alternate reference */
508*437bfbebSnyanmisaka if (pic_param->alt_fb_idx.Index7Bits < 0x7f) {
509*437bfbebSnyanmisaka mpp_buf_slot_get_prop(ctx->frame_slots, pic_param->alt_fb_idx.Index7Bits, SLOT_BUFFER, &framebuf);
510*437bfbebSnyanmisaka regs->reg19.alternate_ref_base = mpp_buffer_get_fd(framebuf);
511*437bfbebSnyanmisaka } else {
512*437bfbebSnyanmisaka regs->reg19.alternate_ref_base = regs->reg13_cur_pic_base;
513*437bfbebSnyanmisaka }
514*437bfbebSnyanmisaka
515*437bfbebSnyanmisaka if (pic_param->ref_frame_sign_bias_altref) {
516*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 19, pic_param->ref_frame_sign_bias_altref);
517*437bfbebSnyanmisaka }
518*437bfbebSnyanmisaka
519*437bfbebSnyanmisaka if (pic_param->stVP8Segments.segmentation_enabled || pic_param->stVP8Segments.update_mb_segmentation_map) {
520*437bfbebSnyanmisaka mpp_dev_set_reg_offset(ctx->dev, 10, (pic_param->stVP8Segments.segmentation_enabled
521*437bfbebSnyanmisaka + (pic_param->stVP8Segments.update_mb_segmentation_map << 1)));
522*437bfbebSnyanmisaka }
523*437bfbebSnyanmisaka
524*437bfbebSnyanmisaka regs->reg3.sw_pic_inter_e = pic_param->frame_type;
525*437bfbebSnyanmisaka regs->reg3.sw_skip_mode = !pic_param->mb_no_coeff_skip;
526*437bfbebSnyanmisaka
527*437bfbebSnyanmisaka if (!pic_param->stVP8Segments.segmentation_enabled) {
528*437bfbebSnyanmisaka regs->reg32.sw_filt_level_0 = pic_param->filter_level;
529*437bfbebSnyanmisaka } else if (pic_param->stVP8Segments.update_mb_segmentation_data) {
530*437bfbebSnyanmisaka regs->reg32.sw_filt_level_0 =
531*437bfbebSnyanmisaka pic_param->stVP8Segments.segment_feature_data[1][0];
532*437bfbebSnyanmisaka regs->reg32.sw_filt_level_1 =
533*437bfbebSnyanmisaka pic_param->stVP8Segments.segment_feature_data[1][1];
534*437bfbebSnyanmisaka regs->reg32.sw_filt_level_2 =
535*437bfbebSnyanmisaka pic_param->stVP8Segments.segment_feature_data[1][2];
536*437bfbebSnyanmisaka regs->reg32.sw_filt_level_3 =
537*437bfbebSnyanmisaka pic_param->stVP8Segments.segment_feature_data[1][3];
538*437bfbebSnyanmisaka } else {
539*437bfbebSnyanmisaka regs->reg32.sw_filt_level_0 = CLIP3(0, 63,
540*437bfbebSnyanmisaka (RK_S32)pic_param->filter_level
541*437bfbebSnyanmisaka + pic_param->stVP8Segments.segment_feature_data[1][0]);
542*437bfbebSnyanmisaka regs->reg32.sw_filt_level_1 = CLIP3(0, 63,
543*437bfbebSnyanmisaka (RK_S32)pic_param->filter_level
544*437bfbebSnyanmisaka + pic_param->stVP8Segments.segment_feature_data[1][1]);
545*437bfbebSnyanmisaka regs->reg32.sw_filt_level_2 = CLIP3(0, 63,
546*437bfbebSnyanmisaka (RK_S32)pic_param->filter_level
547*437bfbebSnyanmisaka + pic_param->stVP8Segments.segment_feature_data[1][2]);
548*437bfbebSnyanmisaka regs->reg32.sw_filt_level_3 = CLIP3(0, 63,
549*437bfbebSnyanmisaka (RK_S32)pic_param->filter_level
550*437bfbebSnyanmisaka + pic_param->stVP8Segments.segment_feature_data[1][3]);
551*437bfbebSnyanmisaka }
552*437bfbebSnyanmisaka
553*437bfbebSnyanmisaka regs->reg30.sw_filt_type = pic_param->filter_type;
554*437bfbebSnyanmisaka regs->reg30.sw_filt_sharpness = pic_param->sharpness;
555*437bfbebSnyanmisaka
556*437bfbebSnyanmisaka if (pic_param->filter_level == 0)
557*437bfbebSnyanmisaka regs->reg3.sw_filtering_dis = 1;
558*437bfbebSnyanmisaka
559*437bfbebSnyanmisaka if (pic_param->version != 3)
560*437bfbebSnyanmisaka regs->reg7.sw_ch_mv_res = 1;
561*437bfbebSnyanmisaka
562*437bfbebSnyanmisaka if (pic_param->decMode == VP8HWD_VP8 && (pic_param->version & 0x3))
563*437bfbebSnyanmisaka regs->reg7.sw_bilin_mc_e = 1;
564*437bfbebSnyanmisaka
565*437bfbebSnyanmisaka regs->reg5.sw_boolean_value = pic_param->bool_value;
566*437bfbebSnyanmisaka regs->reg5.sw_boolean_range = pic_param->bool_range;
567*437bfbebSnyanmisaka
568*437bfbebSnyanmisaka {
569*437bfbebSnyanmisaka if (!pic_param->stVP8Segments.segmentation_enabled)
570*437bfbebSnyanmisaka regs->reg33.sw_quant_0 = pic_param->y1ac_delta_q;
571*437bfbebSnyanmisaka else if (pic_param->stVP8Segments.update_mb_segmentation_data) { /* absolute mode */
572*437bfbebSnyanmisaka regs->reg33.sw_quant_0 =
573*437bfbebSnyanmisaka pic_param->stVP8Segments.segment_feature_data[0][0];
574*437bfbebSnyanmisaka regs->reg33.sw_quant_1 =
575*437bfbebSnyanmisaka pic_param->stVP8Segments.segment_feature_data[0][1];
576*437bfbebSnyanmisaka regs->reg46.sw_quant_2 = pic_param->stVP8Segments.segment_feature_data[0][2];
577*437bfbebSnyanmisaka regs->reg46.sw_quant_3 = pic_param->stVP8Segments.segment_feature_data[0][3];
578*437bfbebSnyanmisaka } else { /* delta mode */
579*437bfbebSnyanmisaka regs->reg33.sw_quant_0 = CLIP3(0, 127,
580*437bfbebSnyanmisaka pic_param->y1ac_delta_q
581*437bfbebSnyanmisaka + pic_param->stVP8Segments.segment_feature_data[0][0]);
582*437bfbebSnyanmisaka regs->reg33.sw_quant_1 = CLIP3(0, 127,
583*437bfbebSnyanmisaka pic_param->y1ac_delta_q
584*437bfbebSnyanmisaka + pic_param->stVP8Segments.segment_feature_data[0][1]);
585*437bfbebSnyanmisaka regs->reg46.sw_quant_2 = CLIP3(0, 127,
586*437bfbebSnyanmisaka pic_param->y1ac_delta_q
587*437bfbebSnyanmisaka + pic_param->stVP8Segments.segment_feature_data[0][2]);
588*437bfbebSnyanmisaka regs->reg46.sw_quant_3 = CLIP3(0, 127,
589*437bfbebSnyanmisaka pic_param->y1ac_delta_q
590*437bfbebSnyanmisaka + pic_param->stVP8Segments.segment_feature_data[0][3]);
591*437bfbebSnyanmisaka }
592*437bfbebSnyanmisaka
593*437bfbebSnyanmisaka regs->reg33.sw_quant_delta_0 = pic_param->y1dc_delta_q;
594*437bfbebSnyanmisaka regs->reg33.sw_quant_delta_1 = pic_param->y2dc_delta_q;
595*437bfbebSnyanmisaka regs->reg46.sw_quant_delta_2 = pic_param->y2ac_delta_q;
596*437bfbebSnyanmisaka regs->reg46.sw_quant_delta_3 = pic_param->uvdc_delta_q;
597*437bfbebSnyanmisaka regs->reg47.sw_quant_delta_4 = pic_param->uvac_delta_q;
598*437bfbebSnyanmisaka
599*437bfbebSnyanmisaka if (pic_param->mode_ref_lf_delta_enabled) {
600*437bfbebSnyanmisaka regs->reg31.sw_filt_ref_adj_0 = pic_param->ref_lf_deltas[0];
601*437bfbebSnyanmisaka regs->reg31.sw_filt_ref_adj_1 = pic_param->ref_lf_deltas[1];
602*437bfbebSnyanmisaka regs->reg31.sw_filt_ref_adj_2 = pic_param->ref_lf_deltas[2];
603*437bfbebSnyanmisaka regs->reg31.sw_filt_ref_adj_3 = pic_param->ref_lf_deltas[3];
604*437bfbebSnyanmisaka regs->reg30.sw_filt_mb_adj_0 = pic_param->mode_lf_deltas[0];
605*437bfbebSnyanmisaka regs->reg30.sw_filt_mb_adj_1 = pic_param->mode_lf_deltas[1];
606*437bfbebSnyanmisaka regs->reg30.sw_filt_mb_adj_2 = pic_param->mode_lf_deltas[2];
607*437bfbebSnyanmisaka regs->reg30.sw_filt_mb_adj_3 = pic_param->mode_lf_deltas[3];
608*437bfbebSnyanmisaka }
609*437bfbebSnyanmisaka }
610*437bfbebSnyanmisaka
611*437bfbebSnyanmisaka if ((pic_param->version & 0x3) == 0)
612*437bfbebSnyanmisaka hal_vp8d_pre_filter_tap_set(ctx);
613*437bfbebSnyanmisaka
614*437bfbebSnyanmisaka hal_vp8d_dct_partition_cfg(ctx, task);
615*437bfbebSnyanmisaka
616*437bfbebSnyanmisaka mpp_buffer_sync_end(ctx->probe_table);
617*437bfbebSnyanmisaka mpp_buffer_sync_end(ctx->seg_map);
618*437bfbebSnyanmisaka
619*437bfbebSnyanmisaka FUN_T("leave\n");
620*437bfbebSnyanmisaka return ret;
621*437bfbebSnyanmisaka }
622*437bfbebSnyanmisaka
hal_vp8d_vdpu1_start(void * hal,HalTaskInfo * task)623*437bfbebSnyanmisaka MPP_RET hal_vp8d_vdpu1_start(void *hal, HalTaskInfo *task)
624*437bfbebSnyanmisaka {
625*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
626*437bfbebSnyanmisaka VP8DHalContext_t *ctx = (VP8DHalContext_t *)hal;
627*437bfbebSnyanmisaka VP8DRegSet_t *regs = (VP8DRegSet_t *)ctx->regs;
628*437bfbebSnyanmisaka
629*437bfbebSnyanmisaka FUN_T("enter\n");
630*437bfbebSnyanmisaka
631*437bfbebSnyanmisaka if (hal_vp8d_debug & VP8H_DBG_REG) {
632*437bfbebSnyanmisaka RK_U32 *p = ctx->regs;
633*437bfbebSnyanmisaka RK_U32 i = 0;
634*437bfbebSnyanmisaka
635*437bfbebSnyanmisaka for (i = 0; i < VP8D_REG_NUM; i++)
636*437bfbebSnyanmisaka mpp_log_f("vp8d: regs[%02d]=%08X\n", i, *p++);
637*437bfbebSnyanmisaka }
638*437bfbebSnyanmisaka
639*437bfbebSnyanmisaka do {
640*437bfbebSnyanmisaka MppDevRegWrCfg wr_cfg;
641*437bfbebSnyanmisaka MppDevRegRdCfg rd_cfg;
642*437bfbebSnyanmisaka RK_U32 reg_size = sizeof(VP8DRegSet_t);
643*437bfbebSnyanmisaka
644*437bfbebSnyanmisaka wr_cfg.reg = regs;
645*437bfbebSnyanmisaka wr_cfg.size = reg_size;
646*437bfbebSnyanmisaka wr_cfg.offset = 0;
647*437bfbebSnyanmisaka
648*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_WR, &wr_cfg);
649*437bfbebSnyanmisaka if (ret) {
650*437bfbebSnyanmisaka mpp_err_f("set register write failed %d\n", ret);
651*437bfbebSnyanmisaka break;
652*437bfbebSnyanmisaka }
653*437bfbebSnyanmisaka
654*437bfbebSnyanmisaka rd_cfg.reg = regs;
655*437bfbebSnyanmisaka rd_cfg.size = reg_size;
656*437bfbebSnyanmisaka rd_cfg.offset = 0;
657*437bfbebSnyanmisaka
658*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_REG_RD, &rd_cfg);
659*437bfbebSnyanmisaka if (ret) {
660*437bfbebSnyanmisaka mpp_err_f("set register read failed %d\n", ret);
661*437bfbebSnyanmisaka break;
662*437bfbebSnyanmisaka }
663*437bfbebSnyanmisaka
664*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
665*437bfbebSnyanmisaka if (ret) {
666*437bfbebSnyanmisaka mpp_err_f("send cmd failed %d\n", ret);
667*437bfbebSnyanmisaka break;
668*437bfbebSnyanmisaka }
669*437bfbebSnyanmisaka } while (0);
670*437bfbebSnyanmisaka
671*437bfbebSnyanmisaka FUN_T("leave\n");
672*437bfbebSnyanmisaka
673*437bfbebSnyanmisaka (void)task;
674*437bfbebSnyanmisaka return ret;
675*437bfbebSnyanmisaka }
676*437bfbebSnyanmisaka
hal_vp8d_vdpu1_wait(void * hal,HalTaskInfo * task)677*437bfbebSnyanmisaka MPP_RET hal_vp8d_vdpu1_wait(void *hal, HalTaskInfo *task)
678*437bfbebSnyanmisaka {
679*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
680*437bfbebSnyanmisaka VP8DHalContext_t *ctx = (VP8DHalContext_t *)hal;
681*437bfbebSnyanmisaka
682*437bfbebSnyanmisaka FUN_T("enter\n");
683*437bfbebSnyanmisaka
684*437bfbebSnyanmisaka ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
685*437bfbebSnyanmisaka if (ret)
686*437bfbebSnyanmisaka mpp_err_f("poll cmd failed %d\n", ret);
687*437bfbebSnyanmisaka
688*437bfbebSnyanmisaka (void)task;
689*437bfbebSnyanmisaka FUN_T("leave\n");
690*437bfbebSnyanmisaka return ret;
691*437bfbebSnyanmisaka }
692