xref: /rockchip-linux_mpp/mpp/hal/common/av1/hal_av1d_api_v2.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2021 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_av1d_api"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <stdio.h>
20*437bfbebSnyanmisaka #include <stdlib.h>
21*437bfbebSnyanmisaka #include <string.h>
22*437bfbebSnyanmisaka #include <dlfcn.h>
23*437bfbebSnyanmisaka #include <unistd.h>
24*437bfbebSnyanmisaka 
25*437bfbebSnyanmisaka #include "mpp_mem.h"
26*437bfbebSnyanmisaka #include "mpp_env.h"
27*437bfbebSnyanmisaka #include "mpp_platform.h"
28*437bfbebSnyanmisaka #include "mpp_common.h"
29*437bfbebSnyanmisaka 
30*437bfbebSnyanmisaka #include "dxva_syntax.h"
31*437bfbebSnyanmisaka 
32*437bfbebSnyanmisaka #include "hal_av1d_vdpu_reg.h"
33*437bfbebSnyanmisaka #include "hal_av1d_vdpu.h"
34*437bfbebSnyanmisaka #include "hal_av1d_vdpu383.h"
35*437bfbebSnyanmisaka #include "hal_av1d_common.h"
36*437bfbebSnyanmisaka 
37*437bfbebSnyanmisaka RK_U32 hal_av1d_debug = 0;
38*437bfbebSnyanmisaka 
hal_av1d_init(void * hal,MppHalCfg * cfg)39*437bfbebSnyanmisaka MPP_RET hal_av1d_init(void *hal, MppHalCfg *cfg)
40*437bfbebSnyanmisaka {
41*437bfbebSnyanmisaka     MPP_RET ret         = MPP_OK;
42*437bfbebSnyanmisaka     Av1dHalCtx *p_hal   = (Av1dHalCtx *)hal;
43*437bfbebSnyanmisaka     RK_U32 vcodec_type  = mpp_get_vcodec_type();
44*437bfbebSnyanmisaka     MppClientType type  = VPU_CLIENT_RKVDEC;
45*437bfbebSnyanmisaka     RK_U32 hw_id = 0;
46*437bfbebSnyanmisaka 
47*437bfbebSnyanmisaka     INP_CHECK(ret, NULL == p_hal);
48*437bfbebSnyanmisaka     memset(p_hal, 0, sizeof(Av1dHalCtx));
49*437bfbebSnyanmisaka     mpp_env_get_u32("hal_av1d_debug", &hal_av1d_debug, 0);
50*437bfbebSnyanmisaka 
51*437bfbebSnyanmisaka     // check codec_type first
52*437bfbebSnyanmisaka     if (!(vcodec_type & (HAVE_RKVDEC | HAVE_AV1DEC))) {
53*437bfbebSnyanmisaka         mpp_err_f("can not found av1 decoder hardware on platform %x\n", vcodec_type);
54*437bfbebSnyanmisaka         return ret;
55*437bfbebSnyanmisaka     }
56*437bfbebSnyanmisaka 
57*437bfbebSnyanmisaka     hw_id = mpp_get_client_hw_id(type);
58*437bfbebSnyanmisaka     if (hw_id == HWID_VDPU383) {
59*437bfbebSnyanmisaka         p_hal->api = &hal_av1d_vdpu383;
60*437bfbebSnyanmisaka     } else {
61*437bfbebSnyanmisaka         p_hal->api = &hal_av1d_vdpu;
62*437bfbebSnyanmisaka         type  = VPU_CLIENT_AV1DEC;
63*437bfbebSnyanmisaka     }
64*437bfbebSnyanmisaka 
65*437bfbebSnyanmisaka     //!< callback function to parser module
66*437bfbebSnyanmisaka     p_hal->dec_cb = cfg->dec_cb;
67*437bfbebSnyanmisaka 
68*437bfbebSnyanmisaka     ret = mpp_dev_init(&cfg->dev, type);
69*437bfbebSnyanmisaka     if (ret) {
70*437bfbebSnyanmisaka         mpp_err("mpp_dev_init failed ret: %d\n", ret);
71*437bfbebSnyanmisaka         goto __FAILED;
72*437bfbebSnyanmisaka     }
73*437bfbebSnyanmisaka     cfg->hw_info = mpp_get_dec_hw_info_by_client_type(type);
74*437bfbebSnyanmisaka     p_hal->hw_info = cfg->hw_info;
75*437bfbebSnyanmisaka 
76*437bfbebSnyanmisaka     //< get buffer group
77*437bfbebSnyanmisaka     if (p_hal->buf_group == NULL) {
78*437bfbebSnyanmisaka         FUN_CHECK(ret = mpp_buffer_group_get_internal
79*437bfbebSnyanmisaka                         (&p_hal->buf_group, MPP_BUFFER_TYPE_ION));
80*437bfbebSnyanmisaka     }
81*437bfbebSnyanmisaka 
82*437bfbebSnyanmisaka     cfg->support_fast_mode = 0;
83*437bfbebSnyanmisaka     p_hal->dev          = cfg->dev;
84*437bfbebSnyanmisaka     p_hal->cfg          = cfg->cfg;
85*437bfbebSnyanmisaka     p_hal->slots        = cfg->frame_slots;
86*437bfbebSnyanmisaka     p_hal->packet_slots = cfg->packet_slots;
87*437bfbebSnyanmisaka     p_hal->fast_mode    = cfg->cfg->base.fast_parse && cfg->support_fast_mode;
88*437bfbebSnyanmisaka 
89*437bfbebSnyanmisaka     if (p_hal->buf_group == NULL) {
90*437bfbebSnyanmisaka         FUN_CHECK(ret = mpp_buffer_group_get_internal
91*437bfbebSnyanmisaka                         (&p_hal->buf_group, MPP_BUFFER_TYPE_ION));
92*437bfbebSnyanmisaka     }
93*437bfbebSnyanmisaka     //!< run init funtion
94*437bfbebSnyanmisaka     FUN_CHECK(ret = p_hal->api->init(hal, cfg));
95*437bfbebSnyanmisaka 
96*437bfbebSnyanmisaka __RETURN:
97*437bfbebSnyanmisaka     return MPP_OK;
98*437bfbebSnyanmisaka __FAILED:
99*437bfbebSnyanmisaka     return ret;
100*437bfbebSnyanmisaka }
101*437bfbebSnyanmisaka 
hal_av1d_deinit(void * hal)102*437bfbebSnyanmisaka MPP_RET hal_av1d_deinit(void *hal)
103*437bfbebSnyanmisaka {
104*437bfbebSnyanmisaka     MPP_RET ret         = MPP_ERR_UNKNOW;
105*437bfbebSnyanmisaka     Av1dHalCtx *p_hal   = (Av1dHalCtx *)hal;
106*437bfbebSnyanmisaka 
107*437bfbebSnyanmisaka     FUN_CHECK(ret = p_hal->api->deinit(hal));
108*437bfbebSnyanmisaka 
109*437bfbebSnyanmisaka     if (p_hal->dev) {
110*437bfbebSnyanmisaka         mpp_dev_deinit(p_hal->dev);
111*437bfbebSnyanmisaka         p_hal->dev = NULL;
112*437bfbebSnyanmisaka     }
113*437bfbebSnyanmisaka 
114*437bfbebSnyanmisaka     if (p_hal->buf_group) {
115*437bfbebSnyanmisaka         FUN_CHECK(ret = mpp_buffer_group_put(p_hal->buf_group));
116*437bfbebSnyanmisaka     }
117*437bfbebSnyanmisaka 
118*437bfbebSnyanmisaka     return MPP_OK;
119*437bfbebSnyanmisaka __FAILED:
120*437bfbebSnyanmisaka     return ret;
121*437bfbebSnyanmisaka }
122*437bfbebSnyanmisaka 
hal_av1d_gen_regs(void * hal,HalTaskInfo * task)123*437bfbebSnyanmisaka MPP_RET hal_av1d_gen_regs(void *hal, HalTaskInfo *task)
124*437bfbebSnyanmisaka {
125*437bfbebSnyanmisaka     Av1dHalCtx *p_hal = (Av1dHalCtx *)hal;
126*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
127*437bfbebSnyanmisaka 
128*437bfbebSnyanmisaka     if (p_hal && p_hal->api && p_hal->api->reg_gen)
129*437bfbebSnyanmisaka         ret = p_hal->api->reg_gen(hal, task);
130*437bfbebSnyanmisaka     return ret;
131*437bfbebSnyanmisaka }
132*437bfbebSnyanmisaka 
hal_av1d_start(void * hal,HalTaskInfo * task)133*437bfbebSnyanmisaka MPP_RET hal_av1d_start(void *hal, HalTaskInfo *task)
134*437bfbebSnyanmisaka {
135*437bfbebSnyanmisaka     Av1dHalCtx *p_hal = (Av1dHalCtx *)hal;
136*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
137*437bfbebSnyanmisaka 
138*437bfbebSnyanmisaka     if (p_hal && p_hal->api && p_hal->api->start)
139*437bfbebSnyanmisaka         ret = p_hal->api->start(hal, task);
140*437bfbebSnyanmisaka     return ret;
141*437bfbebSnyanmisaka }
142*437bfbebSnyanmisaka 
hal_av1d_wait(void * hal,HalTaskInfo * task)143*437bfbebSnyanmisaka MPP_RET hal_av1d_wait(void *hal, HalTaskInfo *task)
144*437bfbebSnyanmisaka {
145*437bfbebSnyanmisaka     Av1dHalCtx *p_hal = (Av1dHalCtx *)hal;
146*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
147*437bfbebSnyanmisaka 
148*437bfbebSnyanmisaka     if (p_hal && p_hal->api && p_hal->api->wait)
149*437bfbebSnyanmisaka         ret = p_hal->api->wait(hal, task);
150*437bfbebSnyanmisaka     return ret;
151*437bfbebSnyanmisaka }
152*437bfbebSnyanmisaka 
hal_av1d_reset(void * hal)153*437bfbebSnyanmisaka MPP_RET hal_av1d_reset(void *hal)
154*437bfbebSnyanmisaka {
155*437bfbebSnyanmisaka     Av1dHalCtx *p_hal = (Av1dHalCtx *)hal;
156*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
157*437bfbebSnyanmisaka 
158*437bfbebSnyanmisaka     if (p_hal && p_hal->api && p_hal->api->reset)
159*437bfbebSnyanmisaka         ret = p_hal->api->reset(hal);
160*437bfbebSnyanmisaka     return ret;
161*437bfbebSnyanmisaka }
162*437bfbebSnyanmisaka 
hal_av1d_flush(void * hal)163*437bfbebSnyanmisaka MPP_RET hal_av1d_flush(void *hal)
164*437bfbebSnyanmisaka {
165*437bfbebSnyanmisaka     Av1dHalCtx *p_hal = (Av1dHalCtx *)hal;
166*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
167*437bfbebSnyanmisaka 
168*437bfbebSnyanmisaka     if (p_hal && p_hal->api && p_hal->api->flush)
169*437bfbebSnyanmisaka         ret = p_hal->api->flush(hal);
170*437bfbebSnyanmisaka     return ret;
171*437bfbebSnyanmisaka }
172*437bfbebSnyanmisaka 
hal_av1d_control(void * hal,MpiCmd cmd_type,void * param)173*437bfbebSnyanmisaka MPP_RET hal_av1d_control(void *hal, MpiCmd cmd_type, void *param)
174*437bfbebSnyanmisaka {
175*437bfbebSnyanmisaka     Av1dHalCtx *p_hal = (Av1dHalCtx *)hal;
176*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
177*437bfbebSnyanmisaka 
178*437bfbebSnyanmisaka     if (p_hal && p_hal->api && p_hal->api->control)
179*437bfbebSnyanmisaka         ret = p_hal->api->control(hal, cmd_type, param);
180*437bfbebSnyanmisaka     return ret;
181*437bfbebSnyanmisaka }
182*437bfbebSnyanmisaka 
183*437bfbebSnyanmisaka const MppHalApi hal_api_av1d = {
184*437bfbebSnyanmisaka     .name       = "av1d_vdpu",
185*437bfbebSnyanmisaka     .type       = MPP_CTX_DEC,
186*437bfbebSnyanmisaka     .coding     = MPP_VIDEO_CodingAV1,
187*437bfbebSnyanmisaka     .ctx_size   = sizeof(Av1dHalCtx),
188*437bfbebSnyanmisaka     .flag       = 0,
189*437bfbebSnyanmisaka     .init       = hal_av1d_init,
190*437bfbebSnyanmisaka     .deinit     = hal_av1d_deinit,
191*437bfbebSnyanmisaka     .reg_gen    = hal_av1d_gen_regs,
192*437bfbebSnyanmisaka     .start      = hal_av1d_start,
193*437bfbebSnyanmisaka     .wait       = hal_av1d_wait,
194*437bfbebSnyanmisaka     .reset      = hal_av1d_reset,
195*437bfbebSnyanmisaka     .flush      = hal_av1d_flush,
196*437bfbebSnyanmisaka     .control    = hal_av1d_control,
197*437bfbebSnyanmisaka };
198