xref: /rockchip-linux_mpp/mpp/hal/mpp_hal.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2015 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #define  MODULE_TAG "mpp_hal"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include "mpp_mem.h"
9*437bfbebSnyanmisaka #include "mpp_log.h"
10*437bfbebSnyanmisaka #include "mpp_common.h"
11*437bfbebSnyanmisaka 
12*437bfbebSnyanmisaka #include "mpp.h"
13*437bfbebSnyanmisaka #include "mpp_hal.h"
14*437bfbebSnyanmisaka #include "mpp_frame_impl.h"
15*437bfbebSnyanmisaka 
16*437bfbebSnyanmisaka #include "hal_h263d_api.h"
17*437bfbebSnyanmisaka #include "hal_h264d_api.h"
18*437bfbebSnyanmisaka #include "hal_h265d_api.h"
19*437bfbebSnyanmisaka #include "hal_vp8d_api.h"
20*437bfbebSnyanmisaka #include "hal_vp9d_api.h"
21*437bfbebSnyanmisaka #include "hal_avsd_api.h"
22*437bfbebSnyanmisaka #include "hal_avs2d_api.h"
23*437bfbebSnyanmisaka #include "hal_m2vd_api.h"
24*437bfbebSnyanmisaka #include "hal_mpg4d_api.h"
25*437bfbebSnyanmisaka #include "hal_jpegd_api.h"
26*437bfbebSnyanmisaka #include "hal_av1d_api.h"
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka // for test and demo
29*437bfbebSnyanmisaka #include "hal_dummy_dec_api.h"
30*437bfbebSnyanmisaka #include "hal_dummy_enc_api.h"
31*437bfbebSnyanmisaka 
32*437bfbebSnyanmisaka /*
33*437bfbebSnyanmisaka  * all hardware api static register here
34*437bfbebSnyanmisaka  */
35*437bfbebSnyanmisaka static const MppHalApi *hw_apis[] = {
36*437bfbebSnyanmisaka #if HAVE_AVSD
37*437bfbebSnyanmisaka     &hal_api_avsd,
38*437bfbebSnyanmisaka     &hal_api_avsd_plus,
39*437bfbebSnyanmisaka #endif
40*437bfbebSnyanmisaka #if HAVE_AVS2D
41*437bfbebSnyanmisaka     &hal_api_avs2d,
42*437bfbebSnyanmisaka #endif
43*437bfbebSnyanmisaka #if HAVE_H263D
44*437bfbebSnyanmisaka     &hal_api_h263d,
45*437bfbebSnyanmisaka #endif
46*437bfbebSnyanmisaka #if HAVE_H264D
47*437bfbebSnyanmisaka     &hal_api_h264d,
48*437bfbebSnyanmisaka #endif
49*437bfbebSnyanmisaka #if HAVE_H265D
50*437bfbebSnyanmisaka     &hal_api_h265d,
51*437bfbebSnyanmisaka #endif
52*437bfbebSnyanmisaka #if HAVE_MPEG2D
53*437bfbebSnyanmisaka     &hal_api_m2vd,
54*437bfbebSnyanmisaka #endif
55*437bfbebSnyanmisaka #if HAVE_MPEG4D
56*437bfbebSnyanmisaka     &hal_api_mpg4d,
57*437bfbebSnyanmisaka #endif
58*437bfbebSnyanmisaka #if HAVE_VP8D
59*437bfbebSnyanmisaka     &hal_api_vp8d,
60*437bfbebSnyanmisaka #endif
61*437bfbebSnyanmisaka #if HAVE_VP9D
62*437bfbebSnyanmisaka     &hal_api_vp9d,
63*437bfbebSnyanmisaka #endif
64*437bfbebSnyanmisaka #if HAVE_JPEGD
65*437bfbebSnyanmisaka     &hal_api_jpegd,
66*437bfbebSnyanmisaka #endif
67*437bfbebSnyanmisaka #if HAVE_AV1D
68*437bfbebSnyanmisaka     &hal_api_av1d,
69*437bfbebSnyanmisaka #endif
70*437bfbebSnyanmisaka     &hal_api_dummy_dec,
71*437bfbebSnyanmisaka     &hal_api_dummy_enc,
72*437bfbebSnyanmisaka };
73*437bfbebSnyanmisaka 
74*437bfbebSnyanmisaka typedef struct MppHalImpl_t {
75*437bfbebSnyanmisaka     void            *ctx;
76*437bfbebSnyanmisaka     const MppHalApi *api;
77*437bfbebSnyanmisaka 
78*437bfbebSnyanmisaka     HalTaskGroup    tasks;
79*437bfbebSnyanmisaka } MppHalImpl;
80*437bfbebSnyanmisaka 
81*437bfbebSnyanmisaka 
mpp_hal_init(MppHal * ctx,MppHalCfg * cfg)82*437bfbebSnyanmisaka MPP_RET mpp_hal_init(MppHal *ctx, MppHalCfg *cfg)
83*437bfbebSnyanmisaka {
84*437bfbebSnyanmisaka     if (NULL == ctx || NULL == cfg) {
85*437bfbebSnyanmisaka         mpp_err_f("found NULL input ctx %p cfg %p\n", ctx, cfg);
86*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
87*437bfbebSnyanmisaka     }
88*437bfbebSnyanmisaka     *ctx = NULL;
89*437bfbebSnyanmisaka 
90*437bfbebSnyanmisaka     MppHalImpl *p = mpp_calloc(MppHalImpl, 1);
91*437bfbebSnyanmisaka     if (NULL == p) {
92*437bfbebSnyanmisaka         mpp_err_f("malloc failed\n");
93*437bfbebSnyanmisaka         return MPP_ERR_MALLOC;
94*437bfbebSnyanmisaka     }
95*437bfbebSnyanmisaka 
96*437bfbebSnyanmisaka     RK_U32 i;
97*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(hw_apis); i++) {
98*437bfbebSnyanmisaka         if (cfg->type   == hw_apis[i]->type &&
99*437bfbebSnyanmisaka             cfg->coding == hw_apis[i]->coding) {
100*437bfbebSnyanmisaka             p->api  = hw_apis[i];
101*437bfbebSnyanmisaka             p->ctx  = mpp_calloc_size(void, p->api->ctx_size);
102*437bfbebSnyanmisaka 
103*437bfbebSnyanmisaka             MPP_RET ret = p->api->init(p->ctx, cfg);
104*437bfbebSnyanmisaka             if (ret) {
105*437bfbebSnyanmisaka                 mpp_err_f("hal %s init failed ret %d\n", hw_apis[i]->name, ret);
106*437bfbebSnyanmisaka                 break;
107*437bfbebSnyanmisaka             }
108*437bfbebSnyanmisaka 
109*437bfbebSnyanmisaka             *ctx = p;
110*437bfbebSnyanmisaka             return MPP_OK;
111*437bfbebSnyanmisaka         }
112*437bfbebSnyanmisaka     }
113*437bfbebSnyanmisaka 
114*437bfbebSnyanmisaka     mpp_err_f("could not found coding type %d\n", cfg->coding);
115*437bfbebSnyanmisaka     mpp_free(p->ctx);
116*437bfbebSnyanmisaka     mpp_free(p);
117*437bfbebSnyanmisaka 
118*437bfbebSnyanmisaka     return MPP_NOK;
119*437bfbebSnyanmisaka }
120*437bfbebSnyanmisaka 
mpp_hal_deinit(MppHal ctx)121*437bfbebSnyanmisaka MPP_RET mpp_hal_deinit(MppHal ctx)
122*437bfbebSnyanmisaka {
123*437bfbebSnyanmisaka     if (NULL == ctx) {
124*437bfbebSnyanmisaka         mpp_err_f("found NULL input\n");
125*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
126*437bfbebSnyanmisaka     }
127*437bfbebSnyanmisaka 
128*437bfbebSnyanmisaka     MppHalImpl *p = (MppHalImpl*)ctx;
129*437bfbebSnyanmisaka     p->api->deinit(p->ctx);
130*437bfbebSnyanmisaka     mpp_free(p->ctx);
131*437bfbebSnyanmisaka     mpp_free(p);
132*437bfbebSnyanmisaka     return MPP_OK;
133*437bfbebSnyanmisaka }
134*437bfbebSnyanmisaka 
mpp_hal_reg_gen(MppHal ctx,HalTaskInfo * task)135*437bfbebSnyanmisaka MPP_RET mpp_hal_reg_gen(MppHal ctx, HalTaskInfo *task)
136*437bfbebSnyanmisaka {
137*437bfbebSnyanmisaka     if (NULL == ctx || NULL == task) {
138*437bfbebSnyanmisaka         mpp_err_f("found NULL input ctx %p task %p\n", ctx, task);
139*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
140*437bfbebSnyanmisaka     }
141*437bfbebSnyanmisaka 
142*437bfbebSnyanmisaka     MppHalImpl *p = (MppHalImpl*)ctx;
143*437bfbebSnyanmisaka     return p->api->reg_gen(p->ctx, task);
144*437bfbebSnyanmisaka }
145*437bfbebSnyanmisaka 
mpp_hal_hw_start(MppHal ctx,HalTaskInfo * task)146*437bfbebSnyanmisaka MPP_RET mpp_hal_hw_start(MppHal ctx, HalTaskInfo *task)
147*437bfbebSnyanmisaka {
148*437bfbebSnyanmisaka     if (NULL == ctx || NULL == task) {
149*437bfbebSnyanmisaka         mpp_err_f("found NULL input ctx %p task %p\n", ctx, task);
150*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
151*437bfbebSnyanmisaka     }
152*437bfbebSnyanmisaka 
153*437bfbebSnyanmisaka     MppHalImpl *p = (MppHalImpl*)ctx;
154*437bfbebSnyanmisaka     return p->api->start(p->ctx, task);
155*437bfbebSnyanmisaka }
156*437bfbebSnyanmisaka 
mpp_hal_hw_wait(MppHal ctx,HalTaskInfo * task)157*437bfbebSnyanmisaka MPP_RET mpp_hal_hw_wait(MppHal ctx, HalTaskInfo *task)
158*437bfbebSnyanmisaka {
159*437bfbebSnyanmisaka     if (NULL == ctx || NULL == task) {
160*437bfbebSnyanmisaka         mpp_err_f("found NULL input ctx %p task %p\n", ctx, task);
161*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
162*437bfbebSnyanmisaka     }
163*437bfbebSnyanmisaka 
164*437bfbebSnyanmisaka     MppHalImpl *p = (MppHalImpl*)ctx;
165*437bfbebSnyanmisaka     return p->api->wait(p->ctx, task);
166*437bfbebSnyanmisaka }
167*437bfbebSnyanmisaka 
mpp_hal_reset(MppHal ctx)168*437bfbebSnyanmisaka MPP_RET mpp_hal_reset(MppHal ctx)
169*437bfbebSnyanmisaka {
170*437bfbebSnyanmisaka     if (NULL == ctx) {
171*437bfbebSnyanmisaka         mpp_err_f("found NULL input\n");
172*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
173*437bfbebSnyanmisaka     }
174*437bfbebSnyanmisaka 
175*437bfbebSnyanmisaka     MppHalImpl *p = (MppHalImpl*)ctx;
176*437bfbebSnyanmisaka 
177*437bfbebSnyanmisaka     if (NULL == p->api || NULL == p->api->reset)
178*437bfbebSnyanmisaka         return MPP_OK;
179*437bfbebSnyanmisaka 
180*437bfbebSnyanmisaka     return p->api->reset(p->ctx);
181*437bfbebSnyanmisaka }
182*437bfbebSnyanmisaka 
mpp_hal_flush(MppHal ctx)183*437bfbebSnyanmisaka MPP_RET mpp_hal_flush(MppHal ctx)
184*437bfbebSnyanmisaka {
185*437bfbebSnyanmisaka     if (NULL == ctx) {
186*437bfbebSnyanmisaka         mpp_err_f("found NULL input\n");
187*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
188*437bfbebSnyanmisaka     }
189*437bfbebSnyanmisaka 
190*437bfbebSnyanmisaka     MppHalImpl *p = (MppHalImpl*)ctx;
191*437bfbebSnyanmisaka 
192*437bfbebSnyanmisaka     if (NULL == p->api || NULL == p->api->flush)
193*437bfbebSnyanmisaka         return MPP_OK;
194*437bfbebSnyanmisaka 
195*437bfbebSnyanmisaka     return p->api->flush(p->ctx);
196*437bfbebSnyanmisaka }
197*437bfbebSnyanmisaka 
mpp_hal_control(MppHal ctx,MpiCmd cmd,void * param)198*437bfbebSnyanmisaka MPP_RET mpp_hal_control(MppHal ctx, MpiCmd cmd, void *param)
199*437bfbebSnyanmisaka {
200*437bfbebSnyanmisaka     if (NULL == ctx) {
201*437bfbebSnyanmisaka         mpp_err_f("found NULL input\n");
202*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
203*437bfbebSnyanmisaka     }
204*437bfbebSnyanmisaka 
205*437bfbebSnyanmisaka     MppHalImpl *p = (MppHalImpl*)ctx;
206*437bfbebSnyanmisaka 
207*437bfbebSnyanmisaka     if (NULL == p->api || NULL == p->api->control)
208*437bfbebSnyanmisaka         return MPP_OK;
209*437bfbebSnyanmisaka 
210*437bfbebSnyanmisaka     return p->api->control(p->ctx, cmd, param);
211*437bfbebSnyanmisaka }
212