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