xref: /rockchip-linux_mpp/mpp/hal/rkdec/avsd/hal_avsd_api.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_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