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