xref: /rockchip-linux_mpp/mpp/hal/vpu/jpegd/hal_jpegd_api.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2017 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_jpegd_api"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include "mpp_env.h"
22*437bfbebSnyanmisaka #include "mpp_debug.h"
23*437bfbebSnyanmisaka #include "mpp_common.h"
24*437bfbebSnyanmisaka #include "osal_2str.h"
25*437bfbebSnyanmisaka 
26*437bfbebSnyanmisaka #include "mpp_hal.h"
27*437bfbebSnyanmisaka #include "mpp_platform.h"
28*437bfbebSnyanmisaka #include "hal_jpegd_base.h"
29*437bfbebSnyanmisaka #include "hal_jpegd_vdpu2.h"
30*437bfbebSnyanmisaka #include "hal_jpegd_vdpu1.h"
31*437bfbebSnyanmisaka #include "hal_jpegd_rkv.h"
32*437bfbebSnyanmisaka 
hal_jpegd_reg_gen(void * hal,HalTaskInfo * task)33*437bfbebSnyanmisaka static MPP_RET hal_jpegd_reg_gen(void *hal, HalTaskInfo *task)
34*437bfbebSnyanmisaka {
35*437bfbebSnyanmisaka     JpegdHalCtx *self = (JpegdHalCtx *)hal;
36*437bfbebSnyanmisaka     return self->hal_api.reg_gen (hal, task);
37*437bfbebSnyanmisaka }
38*437bfbebSnyanmisaka 
hal_jpegd_start(void * hal,HalTaskInfo * task)39*437bfbebSnyanmisaka static MPP_RET hal_jpegd_start(void *hal, HalTaskInfo *task)
40*437bfbebSnyanmisaka {
41*437bfbebSnyanmisaka     JpegdHalCtx *self = (JpegdHalCtx *)hal;
42*437bfbebSnyanmisaka     return self->hal_api.start (hal, task);
43*437bfbebSnyanmisaka }
44*437bfbebSnyanmisaka 
hal_jpegd_wait(void * hal,HalTaskInfo * task)45*437bfbebSnyanmisaka static MPP_RET hal_jpegd_wait(void *hal, HalTaskInfo *task)
46*437bfbebSnyanmisaka {
47*437bfbebSnyanmisaka     JpegdHalCtx *self = (JpegdHalCtx *)hal;
48*437bfbebSnyanmisaka     return self->hal_api.wait (hal, task);
49*437bfbebSnyanmisaka }
50*437bfbebSnyanmisaka 
hal_jpegd_control(void * hal,MpiCmd cmd_type,void * param)51*437bfbebSnyanmisaka static MPP_RET hal_jpegd_control(void *hal, MpiCmd cmd_type, void *param)
52*437bfbebSnyanmisaka {
53*437bfbebSnyanmisaka     JpegdHalCtx *self = (JpegdHalCtx *)hal;
54*437bfbebSnyanmisaka     return self->hal_api.control (hal, cmd_type, param);
55*437bfbebSnyanmisaka }
56*437bfbebSnyanmisaka 
hal_jpegd_deinit(void * hal)57*437bfbebSnyanmisaka static MPP_RET hal_jpegd_deinit(void *hal)
58*437bfbebSnyanmisaka {
59*437bfbebSnyanmisaka     JpegdHalCtx *self = (JpegdHalCtx *)hal;
60*437bfbebSnyanmisaka     return self->hal_api.deinit (hal);
61*437bfbebSnyanmisaka }
62*437bfbebSnyanmisaka 
hal_jpegd_init(void * hal,MppHalCfg * cfg)63*437bfbebSnyanmisaka static MPP_RET hal_jpegd_init(void *hal, MppHalCfg *cfg)
64*437bfbebSnyanmisaka {
65*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
66*437bfbebSnyanmisaka     JpegdHalCtx *self = (JpegdHalCtx *)hal;
67*437bfbebSnyanmisaka     MppHalApi *p_api = NULL;
68*437bfbebSnyanmisaka     MppClientType client_type = VPU_CLIENT_BUTT;
69*437bfbebSnyanmisaka     MppDecBaseCfg *base = &cfg->cfg->base;
70*437bfbebSnyanmisaka     RK_S32 hw_type = -1;
71*437bfbebSnyanmisaka     RK_U32 hw_flag = 0;
72*437bfbebSnyanmisaka 
73*437bfbebSnyanmisaka     if (NULL == self)
74*437bfbebSnyanmisaka         return MPP_ERR_VALUE;
75*437bfbebSnyanmisaka 
76*437bfbebSnyanmisaka     memset(self, 0, sizeof(JpegdHalCtx));
77*437bfbebSnyanmisaka 
78*437bfbebSnyanmisaka     p_api = &self->hal_api;
79*437bfbebSnyanmisaka 
80*437bfbebSnyanmisaka     hw_flag = mpp_get_vcodec_type();
81*437bfbebSnyanmisaka 
82*437bfbebSnyanmisaka     if (mpp_check_soc_cap(base->type, base->coding))
83*437bfbebSnyanmisaka         hw_type = base->hw_type;
84*437bfbebSnyanmisaka 
85*437bfbebSnyanmisaka     if (hw_type > 0) {
86*437bfbebSnyanmisaka         if (hw_flag & (1 << hw_type)) {
87*437bfbebSnyanmisaka             mpp_log("init with %s hw\n", strof_client_type(hw_type));
88*437bfbebSnyanmisaka             client_type = hw_type;
89*437bfbebSnyanmisaka         } else
90*437bfbebSnyanmisaka             mpp_err_f("invalid hw_type %d with vcodec_type %08x\n",
91*437bfbebSnyanmisaka                       hw_type, hw_flag);
92*437bfbebSnyanmisaka     }
93*437bfbebSnyanmisaka 
94*437bfbebSnyanmisaka     if (client_type == VPU_CLIENT_BUTT) {
95*437bfbebSnyanmisaka         if (hw_flag & HAVE_VDPU2)
96*437bfbebSnyanmisaka             client_type = VPU_CLIENT_VDPU2;
97*437bfbebSnyanmisaka         if (hw_flag & HAVE_VDPU1)
98*437bfbebSnyanmisaka             client_type = VPU_CLIENT_VDPU1;
99*437bfbebSnyanmisaka         if (hw_flag & HAVE_VDPU2_PP)
100*437bfbebSnyanmisaka             client_type = VPU_CLIENT_VDPU2_PP;
101*437bfbebSnyanmisaka         if (hw_flag & HAVE_VDPU1_PP)
102*437bfbebSnyanmisaka             client_type = VPU_CLIENT_VDPU1_PP;
103*437bfbebSnyanmisaka         if (hw_flag & HAVE_JPEG_DEC)
104*437bfbebSnyanmisaka             client_type = VPU_CLIENT_JPEG_DEC;
105*437bfbebSnyanmisaka     }
106*437bfbebSnyanmisaka 
107*437bfbebSnyanmisaka     mpp_env_get_u32("jpegd_mode", &client_type, client_type);
108*437bfbebSnyanmisaka 
109*437bfbebSnyanmisaka     switch (client_type) {
110*437bfbebSnyanmisaka     case VPU_CLIENT_VDPU2 :
111*437bfbebSnyanmisaka     case VPU_CLIENT_VDPU2_PP : {
112*437bfbebSnyanmisaka         p_api->init = hal_jpegd_vdpu2_init;
113*437bfbebSnyanmisaka         p_api->deinit = hal_jpegd_vdpu2_deinit;
114*437bfbebSnyanmisaka         p_api->reg_gen = hal_jpegd_vdpu2_gen_regs;
115*437bfbebSnyanmisaka         p_api->start = hal_jpegd_vdpu2_start;
116*437bfbebSnyanmisaka         p_api->wait = hal_jpegd_vdpu2_wait;
117*437bfbebSnyanmisaka         p_api->control = hal_jpegd_vdpu2_control;
118*437bfbebSnyanmisaka     } break;
119*437bfbebSnyanmisaka     case VPU_CLIENT_VDPU1 :
120*437bfbebSnyanmisaka     case VPU_CLIENT_VDPU1_PP : {
121*437bfbebSnyanmisaka         p_api->init = hal_jpegd_vdpu1_init;
122*437bfbebSnyanmisaka         p_api->deinit = hal_jpegd_vdpu1_deinit;
123*437bfbebSnyanmisaka         p_api->reg_gen = hal_jpegd_vdpu1_gen_regs;
124*437bfbebSnyanmisaka         p_api->start = hal_jpegd_vdpu1_start;
125*437bfbebSnyanmisaka         p_api->wait = hal_jpegd_vdpu1_wait;
126*437bfbebSnyanmisaka         p_api->control = hal_jpegd_vdpu1_control;
127*437bfbebSnyanmisaka     } break;
128*437bfbebSnyanmisaka     case VPU_CLIENT_JPEG_DEC : {
129*437bfbebSnyanmisaka         p_api->init = hal_jpegd_rkv_init;
130*437bfbebSnyanmisaka         p_api->deinit = hal_jpegd_rkv_deinit;
131*437bfbebSnyanmisaka         p_api->reg_gen = hal_jpegd_rkv_gen_regs;
132*437bfbebSnyanmisaka         p_api->start = hal_jpegd_rkv_start;
133*437bfbebSnyanmisaka         p_api->wait = hal_jpegd_rkv_wait;
134*437bfbebSnyanmisaka         p_api->control = hal_jpegd_rkv_control;
135*437bfbebSnyanmisaka     } break;
136*437bfbebSnyanmisaka     default : {
137*437bfbebSnyanmisaka         return MPP_ERR_INIT;
138*437bfbebSnyanmisaka     } break;
139*437bfbebSnyanmisaka     }
140*437bfbebSnyanmisaka 
141*437bfbebSnyanmisaka     ret = mpp_dev_init(&cfg->dev, client_type);
142*437bfbebSnyanmisaka     if (ret) {
143*437bfbebSnyanmisaka         mpp_err("mpp_dev_init failed ret: %d\n", ret);
144*437bfbebSnyanmisaka         goto __RETURN;
145*437bfbebSnyanmisaka     }
146*437bfbebSnyanmisaka 
147*437bfbebSnyanmisaka     cfg->hw_info = mpp_get_dec_hw_info_by_client_type(client_type);
148*437bfbebSnyanmisaka     self->hw_info = cfg->hw_info;
149*437bfbebSnyanmisaka     self->dev = cfg->dev;
150*437bfbebSnyanmisaka 
151*437bfbebSnyanmisaka     ret = p_api->init(hal, cfg);
152*437bfbebSnyanmisaka     if (ret) {
153*437bfbebSnyanmisaka         mpp_err("init device with client_type %d failed!\n", client_type);
154*437bfbebSnyanmisaka         mpp_dev_deinit(cfg->dev);
155*437bfbebSnyanmisaka     }
156*437bfbebSnyanmisaka 
157*437bfbebSnyanmisaka __RETURN:
158*437bfbebSnyanmisaka     return ret;
159*437bfbebSnyanmisaka }
160*437bfbebSnyanmisaka 
161*437bfbebSnyanmisaka const MppHalApi hal_api_jpegd = {
162*437bfbebSnyanmisaka     .name = "jpegd",
163*437bfbebSnyanmisaka     .type = MPP_CTX_DEC,
164*437bfbebSnyanmisaka     .coding = MPP_VIDEO_CodingMJPEG,
165*437bfbebSnyanmisaka     .ctx_size = sizeof(JpegdHalCtx),
166*437bfbebSnyanmisaka     .flag = 0,
167*437bfbebSnyanmisaka     .init = hal_jpegd_init,
168*437bfbebSnyanmisaka     .deinit = hal_jpegd_deinit,
169*437bfbebSnyanmisaka     .reg_gen = hal_jpegd_reg_gen,
170*437bfbebSnyanmisaka     .start = hal_jpegd_start,
171*437bfbebSnyanmisaka     .wait = hal_jpegd_wait,
172*437bfbebSnyanmisaka     .reset = NULL,
173*437bfbebSnyanmisaka     .flush = NULL,
174*437bfbebSnyanmisaka     .control = hal_jpegd_control,
175*437bfbebSnyanmisaka };
176