1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka * Copyright 2015 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka *
4*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka * You may obtain a copy of the License at
7*437bfbebSnyanmisaka *
8*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka *
10*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka * limitations under the License.
15*437bfbebSnyanmisaka */
16*437bfbebSnyanmisaka
17*437bfbebSnyanmisaka #define MODULE_TAG "hal_avsd_api"
18*437bfbebSnyanmisaka
19*437bfbebSnyanmisaka #include <stdio.h>
20*437bfbebSnyanmisaka #include <stdlib.h>
21*437bfbebSnyanmisaka #include <string.h>
22*437bfbebSnyanmisaka
23*437bfbebSnyanmisaka #include "rk_mpi_cmd.h"
24*437bfbebSnyanmisaka #include "mpp_debug.h"
25*437bfbebSnyanmisaka #include "mpp_mem.h"
26*437bfbebSnyanmisaka #include "mpp_env.h"
27*437bfbebSnyanmisaka #include "mpp_common.h"
28*437bfbebSnyanmisaka #include "mpp_platform.h"
29*437bfbebSnyanmisaka #include "mpp_device.h"
30*437bfbebSnyanmisaka
31*437bfbebSnyanmisaka #include "mpp_dec_cb_param.h"
32*437bfbebSnyanmisaka #include "hal_avsd_api.h"
33*437bfbebSnyanmisaka #include "hal_avsd_base.h"
34*437bfbebSnyanmisaka #include "hal_avsd_vdpu1.h"
35*437bfbebSnyanmisaka #include "hal_avsd_vdpu2.h"
36*437bfbebSnyanmisaka #include "hal_avsd_plus.h"
37*437bfbebSnyanmisaka
init_hard_platform(AvsdHalCtx_t * p_hal,MppCodingType coding)38*437bfbebSnyanmisaka static MPP_RET init_hard_platform(AvsdHalCtx_t *p_hal, MppCodingType coding)
39*437bfbebSnyanmisaka {
40*437bfbebSnyanmisaka MppHalApi *p_api = &p_hal->hal_api;
41*437bfbebSnyanmisaka RK_U32 vcodec_type = mpp_get_vcodec_type();
42*437bfbebSnyanmisaka MppClientType client_type = VPU_CLIENT_BUTT;
43*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
44*437bfbebSnyanmisaka
45*437bfbebSnyanmisaka if (coding == MPP_VIDEO_CodingAVSPLUS) {
46*437bfbebSnyanmisaka if (!(vcodec_type & HAVE_AVSDEC))
47*437bfbebSnyanmisaka mpp_err("coding %x vcodec_type %x do not found avs hw %x\n",
48*437bfbebSnyanmisaka coding, vcodec_type, HAVE_AVSDEC);
49*437bfbebSnyanmisaka } else {
50*437bfbebSnyanmisaka RK_U32 hw_flag = HAVE_VDPU1 | HAVE_VDPU2 | HAVE_VDPU1_PP | HAVE_VDPU2_PP;
51*437bfbebSnyanmisaka
52*437bfbebSnyanmisaka if (!(vcodec_type & hw_flag ))
53*437bfbebSnyanmisaka mpp_err("coding %x vcodec_type %x do not found avs hw %x\n",
54*437bfbebSnyanmisaka coding, vcodec_type, hw_flag);
55*437bfbebSnyanmisaka }
56*437bfbebSnyanmisaka
57*437bfbebSnyanmisaka if ((coding == MPP_VIDEO_CodingAVSPLUS) &&
58*437bfbebSnyanmisaka (vcodec_type & HAVE_AVSDEC)) {
59*437bfbebSnyanmisaka p_api->init = hal_avsd_plus_init;
60*437bfbebSnyanmisaka p_api->deinit = hal_avsd_plus_deinit;
61*437bfbebSnyanmisaka p_api->reg_gen = hal_avsd_plus_gen_regs;
62*437bfbebSnyanmisaka p_api->start = hal_avsd_plus_start;
63*437bfbebSnyanmisaka p_api->wait = hal_avsd_plus_wait;
64*437bfbebSnyanmisaka p_api->reset = hal_avsd_plus_reset;
65*437bfbebSnyanmisaka p_api->flush = hal_avsd_plus_flush;
66*437bfbebSnyanmisaka p_api->control = hal_avsd_plus_control;
67*437bfbebSnyanmisaka client_type = VPU_CLIENT_AVSPLUS_DEC;
68*437bfbebSnyanmisaka } else if ((coding == MPP_VIDEO_CodingAVS) &&
69*437bfbebSnyanmisaka (vcodec_type & (HAVE_VDPU1 | HAVE_VDPU1_PP))) {
70*437bfbebSnyanmisaka p_api->init = hal_avsd_vdpu1_init;
71*437bfbebSnyanmisaka p_api->deinit = hal_avsd_vdpu1_deinit;
72*437bfbebSnyanmisaka p_api->reg_gen = hal_avsd_vdpu1_gen_regs;
73*437bfbebSnyanmisaka p_api->start = hal_avsd_vdpu1_start;
74*437bfbebSnyanmisaka p_api->wait = hal_avsd_vdpu1_wait;
75*437bfbebSnyanmisaka p_api->reset = hal_avsd_vdpu1_reset;
76*437bfbebSnyanmisaka p_api->flush = hal_avsd_vdpu1_flush;
77*437bfbebSnyanmisaka p_api->control = hal_avsd_vdpu1_control;
78*437bfbebSnyanmisaka client_type = VPU_CLIENT_VDPU1;
79*437bfbebSnyanmisaka } else if ((coding == MPP_VIDEO_CodingAVS) &&
80*437bfbebSnyanmisaka (vcodec_type & (HAVE_VDPU2 | HAVE_VDPU2_PP))) {
81*437bfbebSnyanmisaka p_api->init = hal_avsd_vdpu2_init;
82*437bfbebSnyanmisaka p_api->deinit = hal_avsd_vdpu2_deinit;
83*437bfbebSnyanmisaka p_api->reg_gen = hal_avsd_vdpu2_gen_regs;
84*437bfbebSnyanmisaka p_api->start = hal_avsd_vdpu2_start;
85*437bfbebSnyanmisaka p_api->wait = hal_avsd_vdpu2_wait;
86*437bfbebSnyanmisaka p_api->reset = hal_avsd_vdpu2_reset;
87*437bfbebSnyanmisaka p_api->flush = hal_avsd_vdpu2_flush;
88*437bfbebSnyanmisaka p_api->control = hal_avsd_vdpu2_control;
89*437bfbebSnyanmisaka client_type = VPU_CLIENT_VDPU2;
90*437bfbebSnyanmisaka } else {
91*437bfbebSnyanmisaka ret = MPP_NOK;
92*437bfbebSnyanmisaka goto __FAILED;
93*437bfbebSnyanmisaka }
94*437bfbebSnyanmisaka p_hal->coding = coding;
95*437bfbebSnyanmisaka AVSD_HAL_DBG(AVSD_DBG_HARD_MODE, "hw_spt %08x, coding %d\n", vcodec_type, coding);
96*437bfbebSnyanmisaka
97*437bfbebSnyanmisaka ret = mpp_dev_init(&p_hal->dev, client_type);
98*437bfbebSnyanmisaka if (ret) {
99*437bfbebSnyanmisaka mpp_err("mpp_device_init failed. ret: %d\n", ret);
100*437bfbebSnyanmisaka return ret;
101*437bfbebSnyanmisaka
102*437bfbebSnyanmisaka }
103*437bfbebSnyanmisaka return ret = MPP_OK;
104*437bfbebSnyanmisaka __FAILED:
105*437bfbebSnyanmisaka return ret;
106*437bfbebSnyanmisaka }
107*437bfbebSnyanmisaka
108*437bfbebSnyanmisaka /*!
109*437bfbebSnyanmisaka ***********************************************************************
110*437bfbebSnyanmisaka * \brief
111*437bfbebSnyanmisaka * deinit
112*437bfbebSnyanmisaka ***********************************************************************
113*437bfbebSnyanmisaka */
114*437bfbebSnyanmisaka //extern "C"
hal_avsd_deinit(void * decoder)115*437bfbebSnyanmisaka MPP_RET hal_avsd_deinit(void *decoder)
116*437bfbebSnyanmisaka {
117*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
118*437bfbebSnyanmisaka AvsdHalCtx_t *p_hal = (AvsdHalCtx_t *)decoder;
119*437bfbebSnyanmisaka
120*437bfbebSnyanmisaka AVSD_HAL_TRACE("In.");
121*437bfbebSnyanmisaka INP_CHECK(ret, NULL == decoder);
122*437bfbebSnyanmisaka
123*437bfbebSnyanmisaka FUN_CHECK(ret = p_hal->hal_api.deinit(decoder));
124*437bfbebSnyanmisaka //!< mpp_dev_init
125*437bfbebSnyanmisaka if (p_hal->dev) {
126*437bfbebSnyanmisaka ret = mpp_dev_deinit(p_hal->dev);
127*437bfbebSnyanmisaka if (ret)
128*437bfbebSnyanmisaka mpp_err("mpp_dev_deinit failed. ret: %d\n", ret);
129*437bfbebSnyanmisaka }
130*437bfbebSnyanmisaka
131*437bfbebSnyanmisaka if (p_hal->buf_group) {
132*437bfbebSnyanmisaka FUN_CHECK(ret = mpp_buffer_group_put(p_hal->buf_group));
133*437bfbebSnyanmisaka }
134*437bfbebSnyanmisaka __RETURN:
135*437bfbebSnyanmisaka AVSD_HAL_TRACE("Out.");
136*437bfbebSnyanmisaka
137*437bfbebSnyanmisaka return ret = MPP_OK;
138*437bfbebSnyanmisaka __FAILED:
139*437bfbebSnyanmisaka return ret;
140*437bfbebSnyanmisaka }
141*437bfbebSnyanmisaka
142*437bfbebSnyanmisaka /*!
143*437bfbebSnyanmisaka ***********************************************************************
144*437bfbebSnyanmisaka * \brief
145*437bfbebSnyanmisaka * init
146*437bfbebSnyanmisaka ***********************************************************************
147*437bfbebSnyanmisaka */
148*437bfbebSnyanmisaka //extern "C"
hal_avsd_init(void * decoder,MppHalCfg * cfg)149*437bfbebSnyanmisaka MPP_RET hal_avsd_init(void *decoder, MppHalCfg *cfg)
150*437bfbebSnyanmisaka {
151*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
152*437bfbebSnyanmisaka AvsdHalCtx_t *p_hal = (AvsdHalCtx_t *)decoder;
153*437bfbebSnyanmisaka
154*437bfbebSnyanmisaka AVSD_HAL_TRACE("In.");
155*437bfbebSnyanmisaka INP_CHECK(ret, NULL == decoder);
156*437bfbebSnyanmisaka
157*437bfbebSnyanmisaka memset(p_hal, 0, sizeof(AvsdHalCtx_t));
158*437bfbebSnyanmisaka p_hal->frame_slots = cfg->frame_slots;
159*437bfbebSnyanmisaka p_hal->packet_slots = cfg->packet_slots;
160*437bfbebSnyanmisaka
161*437bfbebSnyanmisaka //!< callback function to parser module
162*437bfbebSnyanmisaka p_hal->dec_cb = cfg->dec_cb;
163*437bfbebSnyanmisaka mpp_env_get_u32("avsd_debug", &avsd_hal_debug, 0);
164*437bfbebSnyanmisaka //< get buffer group
165*437bfbebSnyanmisaka FUN_CHECK(ret = mpp_buffer_group_get_internal(&p_hal->buf_group, MPP_BUFFER_TYPE_ION));
166*437bfbebSnyanmisaka
167*437bfbebSnyanmisaka FUN_CHECK(ret = init_hard_platform(p_hal, cfg->coding));
168*437bfbebSnyanmisaka cfg->dev = p_hal->dev;
169*437bfbebSnyanmisaka p_hal->dec_cfg = cfg->cfg;
170*437bfbebSnyanmisaka
171*437bfbebSnyanmisaka //!< run init funtion
172*437bfbebSnyanmisaka FUN_CHECK(ret = p_hal->hal_api.init(decoder, cfg));
173*437bfbebSnyanmisaka
174*437bfbebSnyanmisaka __RETURN:
175*437bfbebSnyanmisaka AVSD_HAL_TRACE("Out.");
176*437bfbebSnyanmisaka
177*437bfbebSnyanmisaka return ret = MPP_OK;
178*437bfbebSnyanmisaka __FAILED:
179*437bfbebSnyanmisaka hal_avsd_deinit(decoder);
180*437bfbebSnyanmisaka return ret;
181*437bfbebSnyanmisaka }
182*437bfbebSnyanmisaka
183*437bfbebSnyanmisaka /*!
184*437bfbebSnyanmisaka ***********************************************************************
185*437bfbebSnyanmisaka * \brief
186*437bfbebSnyanmisaka * generate register
187*437bfbebSnyanmisaka ***********************************************************************
188*437bfbebSnyanmisaka */
189*437bfbebSnyanmisaka //extern "C"
hal_avsd_gen_regs(void * decoder,HalTaskInfo * task)190*437bfbebSnyanmisaka MPP_RET hal_avsd_gen_regs(void *decoder, HalTaskInfo *task)
191*437bfbebSnyanmisaka {
192*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
193*437bfbebSnyanmisaka MppCodingType coding = MPP_VIDEO_CodingUnused;
194*437bfbebSnyanmisaka AvsdHalCtx_t *p_hal = (AvsdHalCtx_t *)decoder;
195*437bfbebSnyanmisaka
196*437bfbebSnyanmisaka memcpy(&p_hal->syn, task->dec.syntax.data, sizeof(AvsdSyntax_t));
197*437bfbebSnyanmisaka // check coding
198*437bfbebSnyanmisaka coding = (p_hal->syn.pp.profileId == 0x48) ? MPP_VIDEO_CodingAVSPLUS : p_hal->coding;
199*437bfbebSnyanmisaka if (coding != p_hal->coding) {
200*437bfbebSnyanmisaka if (p_hal->dev) {
201*437bfbebSnyanmisaka ret = mpp_dev_deinit(p_hal->dev);
202*437bfbebSnyanmisaka if (ret)
203*437bfbebSnyanmisaka mpp_err("mpp_dev_deinit failed. ret: %d\n", ret);
204*437bfbebSnyanmisaka
205*437bfbebSnyanmisaka p_hal->dev = NULL;
206*437bfbebSnyanmisaka }
207*437bfbebSnyanmisaka
208*437bfbebSnyanmisaka ret = p_hal->hal_api.deinit(decoder);
209*437bfbebSnyanmisaka if (ret) {
210*437bfbebSnyanmisaka mpp_err_f("deinit decoder failed, ret %d\n", ret);
211*437bfbebSnyanmisaka return ret;
212*437bfbebSnyanmisaka }
213*437bfbebSnyanmisaka
214*437bfbebSnyanmisaka ret = init_hard_platform(p_hal, coding);
215*437bfbebSnyanmisaka if (ret) {
216*437bfbebSnyanmisaka mpp_err_f("change paltform %x -> %x error\n", p_hal->coding, coding);
217*437bfbebSnyanmisaka return ret;
218*437bfbebSnyanmisaka }
219*437bfbebSnyanmisaka
220*437bfbebSnyanmisaka ret = p_hal->hal_api.init(decoder, p_hal->cfg);
221*437bfbebSnyanmisaka if (ret) {
222*437bfbebSnyanmisaka mpp_err_f("init decoder failed, ret %d\n", ret);
223*437bfbebSnyanmisaka return ret;
224*437bfbebSnyanmisaka }
225*437bfbebSnyanmisaka }
226*437bfbebSnyanmisaka
227*437bfbebSnyanmisaka p_hal->frame_no++;
228*437bfbebSnyanmisaka
229*437bfbebSnyanmisaka return p_hal->hal_api.reg_gen(decoder, task);
230*437bfbebSnyanmisaka }
231*437bfbebSnyanmisaka /*!
232*437bfbebSnyanmisaka ***********************************************************************
233*437bfbebSnyanmisaka * \brief h
234*437bfbebSnyanmisaka * start hard
235*437bfbebSnyanmisaka ***********************************************************************
236*437bfbebSnyanmisaka */
237*437bfbebSnyanmisaka //extern "C"
hal_avsd_start(void * decoder,HalTaskInfo * task)238*437bfbebSnyanmisaka MPP_RET hal_avsd_start(void *decoder, HalTaskInfo *task)
239*437bfbebSnyanmisaka {
240*437bfbebSnyanmisaka AvsdHalCtx_t *p_hal = (AvsdHalCtx_t *)decoder;
241*437bfbebSnyanmisaka
242*437bfbebSnyanmisaka return p_hal->hal_api.start(decoder, task);
243*437bfbebSnyanmisaka }
244*437bfbebSnyanmisaka /*!
245*437bfbebSnyanmisaka ***********************************************************************
246*437bfbebSnyanmisaka * \brief
247*437bfbebSnyanmisaka * wait hard
248*437bfbebSnyanmisaka ***********************************************************************
249*437bfbebSnyanmisaka */
250*437bfbebSnyanmisaka //extern "C"
hal_avsd_wait(void * decoder,HalTaskInfo * task)251*437bfbebSnyanmisaka MPP_RET hal_avsd_wait(void *decoder, HalTaskInfo *task)
252*437bfbebSnyanmisaka {
253*437bfbebSnyanmisaka AvsdHalCtx_t *p_hal = (AvsdHalCtx_t *)decoder;
254*437bfbebSnyanmisaka
255*437bfbebSnyanmisaka return p_hal->hal_api.wait(decoder, task);
256*437bfbebSnyanmisaka }
257*437bfbebSnyanmisaka /*!
258*437bfbebSnyanmisaka ***********************************************************************
259*437bfbebSnyanmisaka * \brief
260*437bfbebSnyanmisaka * reset
261*437bfbebSnyanmisaka ***********************************************************************
262*437bfbebSnyanmisaka */
263*437bfbebSnyanmisaka //extern "C"
hal_avsd_reset(void * decoder)264*437bfbebSnyanmisaka MPP_RET hal_avsd_reset(void *decoder)
265*437bfbebSnyanmisaka {
266*437bfbebSnyanmisaka AvsdHalCtx_t *p_hal = (AvsdHalCtx_t *)decoder;
267*437bfbebSnyanmisaka
268*437bfbebSnyanmisaka return p_hal->hal_api.reset(p_hal);
269*437bfbebSnyanmisaka }
270*437bfbebSnyanmisaka /*!
271*437bfbebSnyanmisaka ***********************************************************************
272*437bfbebSnyanmisaka * \brief
273*437bfbebSnyanmisaka * flush
274*437bfbebSnyanmisaka ***********************************************************************
275*437bfbebSnyanmisaka */
276*437bfbebSnyanmisaka //extern "C"
hal_avsd_flush(void * decoder)277*437bfbebSnyanmisaka MPP_RET hal_avsd_flush(void *decoder)
278*437bfbebSnyanmisaka {
279*437bfbebSnyanmisaka AvsdHalCtx_t *p_hal = (AvsdHalCtx_t *)decoder;
280*437bfbebSnyanmisaka
281*437bfbebSnyanmisaka return p_hal->hal_api.flush(p_hal);
282*437bfbebSnyanmisaka }
283*437bfbebSnyanmisaka /*!
284*437bfbebSnyanmisaka ***********************************************************************
285*437bfbebSnyanmisaka * \brief
286*437bfbebSnyanmisaka * control
287*437bfbebSnyanmisaka ***********************************************************************
288*437bfbebSnyanmisaka */
289*437bfbebSnyanmisaka //extern "C"
hal_avsd_control(void * decoder,MpiCmd cmd_type,void * param)290*437bfbebSnyanmisaka MPP_RET hal_avsd_control(void *decoder, MpiCmd cmd_type, void *param)
291*437bfbebSnyanmisaka {
292*437bfbebSnyanmisaka AvsdHalCtx_t *p_hal = (AvsdHalCtx_t *)decoder;
293*437bfbebSnyanmisaka
294*437bfbebSnyanmisaka return p_hal->hal_api.control(decoder, cmd_type, param);
295*437bfbebSnyanmisaka }
296*437bfbebSnyanmisaka
297*437bfbebSnyanmisaka const MppHalApi hal_api_avsd = {
298*437bfbebSnyanmisaka .name = "avsd_vdpu",
299*437bfbebSnyanmisaka .type = MPP_CTX_DEC,
300*437bfbebSnyanmisaka .coding = MPP_VIDEO_CodingAVS,
301*437bfbebSnyanmisaka .ctx_size = sizeof(AvsdHalCtx_t),
302*437bfbebSnyanmisaka .flag = 0,
303*437bfbebSnyanmisaka .init = hal_avsd_init,
304*437bfbebSnyanmisaka .deinit = hal_avsd_deinit,
305*437bfbebSnyanmisaka .reg_gen = hal_avsd_gen_regs,
306*437bfbebSnyanmisaka .start = hal_avsd_start,
307*437bfbebSnyanmisaka .wait = hal_avsd_wait,
308*437bfbebSnyanmisaka .reset = hal_avsd_reset,
309*437bfbebSnyanmisaka .flush = hal_avsd_flush,
310*437bfbebSnyanmisaka .control = hal_avsd_control,
311*437bfbebSnyanmisaka };
312*437bfbebSnyanmisaka
313*437bfbebSnyanmisaka const MppHalApi hal_api_avsd_plus = {
314*437bfbebSnyanmisaka .name = "avsd_plus",
315*437bfbebSnyanmisaka .type = MPP_CTX_DEC,
316*437bfbebSnyanmisaka .coding = MPP_VIDEO_CodingAVSPLUS,
317*437bfbebSnyanmisaka .ctx_size = sizeof(AvsdHalCtx_t),
318*437bfbebSnyanmisaka .flag = 0,
319*437bfbebSnyanmisaka .init = hal_avsd_init,
320*437bfbebSnyanmisaka .deinit = hal_avsd_deinit,
321*437bfbebSnyanmisaka .reg_gen = hal_avsd_gen_regs,
322*437bfbebSnyanmisaka .start = hal_avsd_start,
323*437bfbebSnyanmisaka .wait = hal_avsd_wait,
324*437bfbebSnyanmisaka .reset = hal_avsd_reset,
325*437bfbebSnyanmisaka .flush = hal_avsd_flush,
326*437bfbebSnyanmisaka .control = hal_avsd_control,
327*437bfbebSnyanmisaka };
328