xref: /OK3568_Linux_fs/external/mpp/osal/mpp_soc.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2020 Rockchip Electronics Co. LTD
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define MODULE_TAG "mpp_soc"
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #include <sys/ioctl.h>
20*4882a593Smuzhiyun #include <errno.h>
21*4882a593Smuzhiyun #include <fcntl.h>
22*4882a593Smuzhiyun #include <string.h>
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #include "mpp_debug.h"
25*4882a593Smuzhiyun #include "mpp_common.h"
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #include "mpp_soc.h"
28*4882a593Smuzhiyun #include "mpp_platform.h"
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #define MAX_SOC_NAME_LENGTH     128
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define CODING_TO_IDX(type)   \
33*4882a593Smuzhiyun     ((RK_U32)(type) >= (RK_U32)MPP_VIDEO_CodingKhronosExtensions) ? \
34*4882a593Smuzhiyun     ((RK_U32)(-1)) : \
35*4882a593Smuzhiyun     ((RK_U32)(type) >= (RK_U32)MPP_VIDEO_CodingVC1) ? \
36*4882a593Smuzhiyun     ((RK_U32)(type) - (RK_U32)MPP_VIDEO_CodingVC1 + 16) : \
37*4882a593Smuzhiyun     ((RK_U32)(type) - (RK_U32)MPP_VIDEO_CodingUnused)
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #define HAVE_MPEG2  ((RK_U32)(1 << (CODING_TO_IDX(MPP_VIDEO_CodingMPEG2))))
40*4882a593Smuzhiyun #define HAVE_H263   ((RK_U32)(1 << (CODING_TO_IDX(MPP_VIDEO_CodingH263))))
41*4882a593Smuzhiyun #define HAVE_MPEG4  ((RK_U32)(1 << (CODING_TO_IDX(MPP_VIDEO_CodingMPEG4))))
42*4882a593Smuzhiyun #define HAVE_AVC    ((RK_U32)(1 << (CODING_TO_IDX(MPP_VIDEO_CodingAVC))))
43*4882a593Smuzhiyun #define HAVE_MJPEG  ((RK_U32)(1 << (CODING_TO_IDX(MPP_VIDEO_CodingMJPEG))))
44*4882a593Smuzhiyun #define HAVE_VP8    ((RK_U32)(1 << (CODING_TO_IDX(MPP_VIDEO_CodingVP8))))
45*4882a593Smuzhiyun #define HAVE_VP9    ((RK_U32)(1 << (CODING_TO_IDX(MPP_VIDEO_CodingVP9))))
46*4882a593Smuzhiyun #define HAVE_HEVC   ((RK_U32)(1 << (CODING_TO_IDX(MPP_VIDEO_CodingHEVC))))
47*4882a593Smuzhiyun #define HAVE_AVSP   ((RK_U32)(1 << (CODING_TO_IDX(MPP_VIDEO_CodingAVSPLUS))))
48*4882a593Smuzhiyun #define HAVE_AVS    ((RK_U32)(1 << (CODING_TO_IDX(MPP_VIDEO_CodingAVS))))
49*4882a593Smuzhiyun #define HAVE_AVS2   ((RK_U32)(1 << (CODING_TO_IDX(MPP_VIDEO_CodingAVS2))))
50*4882a593Smuzhiyun #define HAVE_AV1    ((RK_U32)(1 << (CODING_TO_IDX(MPP_VIDEO_CodingAV1))))
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define CAP_CODING_VDPU         (HAVE_MPEG2|HAVE_H263|HAVE_MPEG4|HAVE_AVC|HAVE_MJPEG|HAVE_VP8|HAVE_AVS)
53*4882a593Smuzhiyun #define CAP_CODING_JPEGD_PP     (HAVE_MJPEG)
54*4882a593Smuzhiyun #define CAP_CODING_AVSD         (HAVE_AVS)
55*4882a593Smuzhiyun #define CAP_CODING_AVSPD        (HAVE_AVSP)
56*4882a593Smuzhiyun #define CAP_CODING_AV1D         (HAVE_AV1)
57*4882a593Smuzhiyun #define CAP_CODING_HEVC         (HAVE_HEVC)
58*4882a593Smuzhiyun #define CAP_CODING_VDPU341      (HAVE_AVC|HAVE_HEVC|HAVE_VP9)
59*4882a593Smuzhiyun #define CAP_CODING_VDPU341_LITE (HAVE_AVC|HAVE_HEVC)
60*4882a593Smuzhiyun #define CAP_CODING_VDPU381      (HAVE_AVC|HAVE_HEVC|HAVE_VP9|HAVE_AVS2)
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #define CAP_CODING_VEPU1        (HAVE_AVC|HAVE_MJPEG|HAVE_VP8)
63*4882a593Smuzhiyun #define CAP_CODING_VEPU_LITE    (HAVE_AVC|HAVE_MJPEG)
64*4882a593Smuzhiyun #define CAP_CODING_VEPU22       (HAVE_HEVC)
65*4882a593Smuzhiyun #define CAP_CODING_VEPU54X      (HAVE_AVC|HAVE_HEVC)
66*4882a593Smuzhiyun #define CAP_CODING_VEPU540C     (HAVE_AVC|HAVE_HEVC|HAVE_MJPEG)
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun static const MppDecHwCap vdpu1 = {
69*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_VDPU,
70*4882a593Smuzhiyun     .type               = VPU_CLIENT_VDPU1,
71*4882a593Smuzhiyun     .cap_fbc            = 0,
72*4882a593Smuzhiyun     .cap_4k             = 0,
73*4882a593Smuzhiyun     .cap_8k             = 0,
74*4882a593Smuzhiyun     .cap_colmv_compress = 0,
75*4882a593Smuzhiyun     .cap_hw_h265_rps    = 0,
76*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 0,
77*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
78*4882a593Smuzhiyun     .cap_10bit          = 0,
79*4882a593Smuzhiyun     .cap_down_scale     = 0,
80*4882a593Smuzhiyun     .cap_lmt_linebuf    = 1,
81*4882a593Smuzhiyun     .cap_core_num       = 1,
82*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
83*4882a593Smuzhiyun     .reserved           = 0,
84*4882a593Smuzhiyun };
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun static const MppDecHwCap vdpu1_2160p = {
87*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_VDPU,
88*4882a593Smuzhiyun     .type               = VPU_CLIENT_VDPU1,
89*4882a593Smuzhiyun     .cap_fbc            = 0,
90*4882a593Smuzhiyun     .cap_4k             = 1,
91*4882a593Smuzhiyun     .cap_8k             = 0,
92*4882a593Smuzhiyun     .cap_colmv_compress = 0,
93*4882a593Smuzhiyun     .cap_hw_h265_rps    = 0,
94*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 0,
95*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
96*4882a593Smuzhiyun     .cap_10bit          = 0,
97*4882a593Smuzhiyun     .cap_down_scale     = 0,
98*4882a593Smuzhiyun     .cap_lmt_linebuf    = 1,
99*4882a593Smuzhiyun     .cap_core_num       = 1,
100*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
101*4882a593Smuzhiyun     .reserved           = 0,
102*4882a593Smuzhiyun };
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun static const MppDecHwCap vdpu1_jpeg_pp = {
105*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_JPEGD_PP,
106*4882a593Smuzhiyun     .type               = VPU_CLIENT_VDPU1_PP,
107*4882a593Smuzhiyun     .cap_fbc            = 0,
108*4882a593Smuzhiyun     .cap_4k             = 1,
109*4882a593Smuzhiyun     .cap_8k             = 1,
110*4882a593Smuzhiyun     .cap_colmv_compress = 0,
111*4882a593Smuzhiyun     .cap_hw_h265_rps    = 0,
112*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 0,
113*4882a593Smuzhiyun     .cap_jpg_pp_out     = 1,
114*4882a593Smuzhiyun     .cap_10bit          = 0,
115*4882a593Smuzhiyun     .cap_down_scale     = 0,
116*4882a593Smuzhiyun     .cap_lmt_linebuf    = 1,
117*4882a593Smuzhiyun     .cap_core_num       = 1,
118*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
119*4882a593Smuzhiyun     .reserved           = 0,
120*4882a593Smuzhiyun };
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun static const MppDecHwCap vdpu2 = {
123*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_VDPU,
124*4882a593Smuzhiyun     .type               = VPU_CLIENT_VDPU2,
125*4882a593Smuzhiyun     .cap_fbc            = 0,
126*4882a593Smuzhiyun     .cap_4k             = 0,
127*4882a593Smuzhiyun     .cap_8k             = 0,
128*4882a593Smuzhiyun     .cap_colmv_compress = 0,
129*4882a593Smuzhiyun     .cap_hw_h265_rps    = 0,
130*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 0,
131*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
132*4882a593Smuzhiyun     .cap_10bit          = 0,
133*4882a593Smuzhiyun     .cap_down_scale     = 0,
134*4882a593Smuzhiyun     .cap_lmt_linebuf    = 1,
135*4882a593Smuzhiyun     .cap_core_num       = 1,
136*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
137*4882a593Smuzhiyun     .reserved           = 0,
138*4882a593Smuzhiyun };
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun static const MppDecHwCap vdpu2_jpeg = {
141*4882a593Smuzhiyun     .cap_coding         = HAVE_MJPEG,
142*4882a593Smuzhiyun     .type               = VPU_CLIENT_VDPU2,
143*4882a593Smuzhiyun     .cap_fbc            = 0,
144*4882a593Smuzhiyun     .cap_4k             = 0,
145*4882a593Smuzhiyun     .cap_8k             = 0,
146*4882a593Smuzhiyun     .cap_colmv_compress = 0,
147*4882a593Smuzhiyun     .cap_hw_h265_rps    = 0,
148*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 0,
149*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
150*4882a593Smuzhiyun     .cap_10bit          = 0,
151*4882a593Smuzhiyun     .cap_down_scale     = 0,
152*4882a593Smuzhiyun     .cap_lmt_linebuf    = 1,
153*4882a593Smuzhiyun     .cap_core_num       = 1,
154*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
155*4882a593Smuzhiyun     .reserved           = 0,
156*4882a593Smuzhiyun };
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun static const MppDecHwCap vdpu2_jpeg_pp = {
159*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_JPEGD_PP,
160*4882a593Smuzhiyun     .type               = VPU_CLIENT_VDPU2_PP,
161*4882a593Smuzhiyun     .cap_fbc            = 0,
162*4882a593Smuzhiyun     .cap_4k             = 0,
163*4882a593Smuzhiyun     .cap_8k             = 0,
164*4882a593Smuzhiyun     .cap_colmv_compress = 0,
165*4882a593Smuzhiyun     .cap_hw_h265_rps    = 0,
166*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 0,
167*4882a593Smuzhiyun     .cap_jpg_pp_out     = 1,
168*4882a593Smuzhiyun     .cap_10bit          = 0,
169*4882a593Smuzhiyun     .cap_down_scale     = 0,
170*4882a593Smuzhiyun     .cap_lmt_linebuf    = 1,
171*4882a593Smuzhiyun     .cap_core_num       = 1,
172*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
173*4882a593Smuzhiyun     .reserved           = 0,
174*4882a593Smuzhiyun };
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun static const MppDecHwCap vdpu2_jpeg_fix = {
177*4882a593Smuzhiyun     .cap_coding         = HAVE_MJPEG,
178*4882a593Smuzhiyun     .type               = VPU_CLIENT_VDPU2,
179*4882a593Smuzhiyun     .cap_fbc            = 0,
180*4882a593Smuzhiyun     .cap_4k             = 0,
181*4882a593Smuzhiyun     .cap_8k             = 0,
182*4882a593Smuzhiyun     .cap_colmv_compress = 0,
183*4882a593Smuzhiyun     .cap_hw_h265_rps    = 0,
184*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 0,
185*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
186*4882a593Smuzhiyun     .cap_10bit          = 0,
187*4882a593Smuzhiyun     .cap_down_scale     = 0,
188*4882a593Smuzhiyun     .cap_lmt_linebuf    = 1,
189*4882a593Smuzhiyun     .cap_core_num       = 1,
190*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 1,
191*4882a593Smuzhiyun     .reserved           = 0,
192*4882a593Smuzhiyun };
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun static const MppDecHwCap vdpu2_jpeg_pp_fix  = {
195*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_JPEGD_PP,
196*4882a593Smuzhiyun     .type               = VPU_CLIENT_VDPU2_PP,
197*4882a593Smuzhiyun     .cap_fbc            = 0,
198*4882a593Smuzhiyun     .cap_4k             = 0,
199*4882a593Smuzhiyun     .cap_8k             = 0,
200*4882a593Smuzhiyun     .cap_colmv_compress = 0,
201*4882a593Smuzhiyun     .cap_hw_h265_rps    = 0,
202*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 0,
203*4882a593Smuzhiyun     .cap_jpg_pp_out     = 1,
204*4882a593Smuzhiyun     .cap_10bit          = 0,
205*4882a593Smuzhiyun     .cap_down_scale     = 0,
206*4882a593Smuzhiyun     .cap_lmt_linebuf    = 1,
207*4882a593Smuzhiyun     .cap_core_num       = 1,
208*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 1,
209*4882a593Smuzhiyun     .reserved           = 0,
210*4882a593Smuzhiyun };
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun static const MppDecHwCap rk_hevc = {
213*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_HEVC,
214*4882a593Smuzhiyun     .type               = VPU_CLIENT_HEVC_DEC,
215*4882a593Smuzhiyun     .cap_fbc            = 0,
216*4882a593Smuzhiyun     .cap_4k             = 1,
217*4882a593Smuzhiyun     .cap_8k             = 0,
218*4882a593Smuzhiyun     .cap_colmv_compress = 0,
219*4882a593Smuzhiyun     .cap_hw_h265_rps    = 0,
220*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 0,
221*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
222*4882a593Smuzhiyun     .cap_10bit          = 1,
223*4882a593Smuzhiyun     .cap_down_scale     = 0,
224*4882a593Smuzhiyun     .cap_lmt_linebuf    = 1,
225*4882a593Smuzhiyun     .cap_core_num       = 1,
226*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
227*4882a593Smuzhiyun     .reserved           = 0,
228*4882a593Smuzhiyun };
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun static const MppDecHwCap rk_hevc_1080p = {
231*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_HEVC,
232*4882a593Smuzhiyun     .type               = VPU_CLIENT_HEVC_DEC,
233*4882a593Smuzhiyun     .cap_fbc            = 0,
234*4882a593Smuzhiyun     .cap_4k             = 0,
235*4882a593Smuzhiyun     .cap_8k             = 0,
236*4882a593Smuzhiyun     .cap_colmv_compress = 0,
237*4882a593Smuzhiyun     .cap_hw_h265_rps    = 0,
238*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 0,
239*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
240*4882a593Smuzhiyun     .cap_10bit          = 0,
241*4882a593Smuzhiyun     .cap_down_scale     = 0,
242*4882a593Smuzhiyun     .cap_lmt_linebuf    = 1,
243*4882a593Smuzhiyun     .cap_core_num       = 1,
244*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
245*4882a593Smuzhiyun     .reserved           = 0,
246*4882a593Smuzhiyun };
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun static const MppDecHwCap vdpu341 = {
249*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_VDPU341,
250*4882a593Smuzhiyun     .type               = VPU_CLIENT_RKVDEC,
251*4882a593Smuzhiyun     .cap_fbc            = 0,
252*4882a593Smuzhiyun     .cap_4k             = 1,
253*4882a593Smuzhiyun     .cap_8k             = 0,
254*4882a593Smuzhiyun     .cap_colmv_compress = 1,
255*4882a593Smuzhiyun     .cap_hw_h265_rps    = 0,
256*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 0,
257*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
258*4882a593Smuzhiyun     .cap_10bit          = 1,
259*4882a593Smuzhiyun     .cap_down_scale     = 0,
260*4882a593Smuzhiyun     .cap_lmt_linebuf    = 1,
261*4882a593Smuzhiyun     .cap_core_num       = 1,
262*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
263*4882a593Smuzhiyun     .reserved           = 0,
264*4882a593Smuzhiyun };
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun static const MppDecHwCap vdpu341_lite = {
267*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_VDPU341_LITE,
268*4882a593Smuzhiyun     .type               = VPU_CLIENT_RKVDEC,
269*4882a593Smuzhiyun     .cap_fbc            = 0,
270*4882a593Smuzhiyun     .cap_4k             = 1,
271*4882a593Smuzhiyun     .cap_8k             = 0,
272*4882a593Smuzhiyun     .cap_colmv_compress = 1,
273*4882a593Smuzhiyun     .cap_hw_h265_rps    = 0,
274*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 0,
275*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
276*4882a593Smuzhiyun     .cap_10bit          = 1,
277*4882a593Smuzhiyun     .cap_down_scale     = 0,
278*4882a593Smuzhiyun     .cap_lmt_linebuf    = 1,
279*4882a593Smuzhiyun     .cap_core_num       = 1,
280*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
281*4882a593Smuzhiyun     .reserved           = 0,
282*4882a593Smuzhiyun };
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun static const MppDecHwCap vdpu341_lite_1080p = {
285*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_VDPU341_LITE,
286*4882a593Smuzhiyun     .type               = VPU_CLIENT_RKVDEC,
287*4882a593Smuzhiyun     .cap_fbc            = 0,
288*4882a593Smuzhiyun     .cap_4k             = 0,
289*4882a593Smuzhiyun     .cap_8k             = 0,
290*4882a593Smuzhiyun     .cap_colmv_compress = 1,
291*4882a593Smuzhiyun     .cap_hw_h265_rps    = 0,
292*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 0,
293*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
294*4882a593Smuzhiyun     .cap_10bit          = 0,
295*4882a593Smuzhiyun     .cap_down_scale     = 0,
296*4882a593Smuzhiyun     .cap_lmt_linebuf    = 1,
297*4882a593Smuzhiyun     .cap_core_num       = 1,
298*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
299*4882a593Smuzhiyun     .reserved           = 0,
300*4882a593Smuzhiyun };
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun static const MppDecHwCap vdpu341_h264 = {
303*4882a593Smuzhiyun     .cap_coding         = HAVE_AVC,
304*4882a593Smuzhiyun     .type               = VPU_CLIENT_RKVDEC,
305*4882a593Smuzhiyun     .cap_fbc            = 0,
306*4882a593Smuzhiyun     .cap_4k             = 1,
307*4882a593Smuzhiyun     .cap_8k             = 0,
308*4882a593Smuzhiyun     .cap_colmv_compress = 1,
309*4882a593Smuzhiyun     .cap_hw_h265_rps    = 0,
310*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 0,
311*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
312*4882a593Smuzhiyun     .cap_10bit          = 0,
313*4882a593Smuzhiyun     .cap_down_scale     = 0,
314*4882a593Smuzhiyun     .cap_lmt_linebuf    = 1,
315*4882a593Smuzhiyun     .cap_core_num       = 1,
316*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
317*4882a593Smuzhiyun     .reserved           = 0,
318*4882a593Smuzhiyun };
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun /* vdpu34x support AFBC_V2 output */
321*4882a593Smuzhiyun static const MppDecHwCap vdpu34x = {
322*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_VDPU341,
323*4882a593Smuzhiyun     .type               = VPU_CLIENT_RKVDEC,
324*4882a593Smuzhiyun     .cap_fbc            = 2,
325*4882a593Smuzhiyun     .cap_4k             = 1,
326*4882a593Smuzhiyun     .cap_8k             = 1,
327*4882a593Smuzhiyun     .cap_colmv_compress = 1,
328*4882a593Smuzhiyun     .cap_hw_h265_rps    = 1,
329*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 1,
330*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
331*4882a593Smuzhiyun     .cap_10bit          = 1,
332*4882a593Smuzhiyun     .cap_down_scale     = 0,
333*4882a593Smuzhiyun     .cap_lmt_linebuf    = 0,
334*4882a593Smuzhiyun     .cap_core_num       = 1,
335*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
336*4882a593Smuzhiyun     .reserved           = 0,
337*4882a593Smuzhiyun };
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun static const MppDecHwCap vdpu38x = {
340*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_VDPU381,
341*4882a593Smuzhiyun     .type               = VPU_CLIENT_RKVDEC,
342*4882a593Smuzhiyun     .cap_fbc            = 2,
343*4882a593Smuzhiyun     .cap_4k             = 1,
344*4882a593Smuzhiyun     .cap_8k             = 1,
345*4882a593Smuzhiyun     .cap_colmv_compress = 1,
346*4882a593Smuzhiyun     .cap_hw_h265_rps    = 1,
347*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 1,
348*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
349*4882a593Smuzhiyun     .cap_10bit          = 1,
350*4882a593Smuzhiyun     .cap_down_scale     = 1,
351*4882a593Smuzhiyun     .cap_lmt_linebuf    = 0,
352*4882a593Smuzhiyun     .cap_core_num       = 2,
353*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
354*4882a593Smuzhiyun     .reserved           = 0,
355*4882a593Smuzhiyun };
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun static const MppDecHwCap vdpu382 = {
358*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_VDPU381,
359*4882a593Smuzhiyun     .type               = VPU_CLIENT_RKVDEC,
360*4882a593Smuzhiyun     .cap_fbc            = 2,
361*4882a593Smuzhiyun     .cap_4k             = 1,
362*4882a593Smuzhiyun     .cap_8k             = 1,
363*4882a593Smuzhiyun     .cap_colmv_compress = 1,
364*4882a593Smuzhiyun     .cap_hw_h265_rps    = 1,
365*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 1,
366*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
367*4882a593Smuzhiyun     .cap_10bit          = 1,
368*4882a593Smuzhiyun     .cap_down_scale     = 1,
369*4882a593Smuzhiyun     .cap_lmt_linebuf    = 0,
370*4882a593Smuzhiyun     .cap_core_num       = 1,
371*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
372*4882a593Smuzhiyun     .reserved           = 0,
373*4882a593Smuzhiyun };
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun static const MppDecHwCap vdpu382_lite = {
376*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_VDPU341,
377*4882a593Smuzhiyun     .type               = VPU_CLIENT_RKVDEC,
378*4882a593Smuzhiyun     .cap_fbc            = 0,
379*4882a593Smuzhiyun     .cap_4k             = 1,
380*4882a593Smuzhiyun     .cap_8k             = 1,
381*4882a593Smuzhiyun     .cap_colmv_compress = 0,
382*4882a593Smuzhiyun     .cap_hw_h265_rps    = 1,
383*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 1,
384*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
385*4882a593Smuzhiyun     .cap_10bit          = 0,
386*4882a593Smuzhiyun     .cap_down_scale     = 1,
387*4882a593Smuzhiyun     .cap_lmt_linebuf    = 0,
388*4882a593Smuzhiyun     .cap_core_num       = 1,
389*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
390*4882a593Smuzhiyun     .reserved           = 0,
391*4882a593Smuzhiyun };
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun static const MppDecHwCap avspd = {
394*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_AVSPD,
395*4882a593Smuzhiyun     .type               = VPU_CLIENT_AVSPLUS_DEC,
396*4882a593Smuzhiyun     .cap_fbc            = 0,
397*4882a593Smuzhiyun     .cap_4k             = 0,
398*4882a593Smuzhiyun     .cap_8k             = 0,
399*4882a593Smuzhiyun     .cap_colmv_compress = 0,
400*4882a593Smuzhiyun     .cap_hw_h265_rps    = 0,
401*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 0,
402*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
403*4882a593Smuzhiyun     .cap_10bit          = 0,
404*4882a593Smuzhiyun     .cap_down_scale     = 0,
405*4882a593Smuzhiyun     .cap_lmt_linebuf    = 1,
406*4882a593Smuzhiyun     .cap_core_num       = 1,
407*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
408*4882a593Smuzhiyun     .reserved           = 0,
409*4882a593Smuzhiyun };
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun static const MppDecHwCap rkjpegd = {
412*4882a593Smuzhiyun     .cap_coding         = HAVE_MJPEG,
413*4882a593Smuzhiyun     .type               = VPU_CLIENT_JPEG_DEC,
414*4882a593Smuzhiyun     .cap_fbc            = 0,
415*4882a593Smuzhiyun     .cap_4k             = 1,
416*4882a593Smuzhiyun     .cap_8k             = 0,
417*4882a593Smuzhiyun     .cap_colmv_compress = 0,
418*4882a593Smuzhiyun     .cap_hw_h265_rps    = 0,
419*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 0,
420*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
421*4882a593Smuzhiyun     .cap_10bit          = 0,
422*4882a593Smuzhiyun     .cap_down_scale     = 0,
423*4882a593Smuzhiyun     .cap_lmt_linebuf    = 0,
424*4882a593Smuzhiyun     .cap_core_num       = 1,
425*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 1,
426*4882a593Smuzhiyun     .reserved           = 0,
427*4882a593Smuzhiyun };
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun static const MppDecHwCap av1d = {
430*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_AV1D,
431*4882a593Smuzhiyun     .type               = VPU_CLIENT_AV1DEC,
432*4882a593Smuzhiyun     .cap_fbc            = 0,
433*4882a593Smuzhiyun     .cap_4k             = 1,
434*4882a593Smuzhiyun     .cap_8k             = 0,
435*4882a593Smuzhiyun     .cap_colmv_compress = 0,
436*4882a593Smuzhiyun     .cap_hw_h265_rps    = 0,
437*4882a593Smuzhiyun     .cap_hw_vp9_prob    = 0,
438*4882a593Smuzhiyun     .cap_jpg_pp_out     = 0,
439*4882a593Smuzhiyun     .cap_10bit          = 0,
440*4882a593Smuzhiyun     .cap_down_scale     = 0,
441*4882a593Smuzhiyun     .cap_lmt_linebuf    = 1,
442*4882a593Smuzhiyun     .cap_core_num       = 1,
443*4882a593Smuzhiyun     .cap_hw_jpg_fix     = 0,
444*4882a593Smuzhiyun     .reserved           = 0,
445*4882a593Smuzhiyun };
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun static const MppEncHwCap vepu1 = {
448*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_VEPU1,
449*4882a593Smuzhiyun     .type               = VPU_CLIENT_VEPU1,
450*4882a593Smuzhiyun     .cap_fbc            = 0,
451*4882a593Smuzhiyun     .cap_4k             = 0,
452*4882a593Smuzhiyun     .cap_8k             = 0,
453*4882a593Smuzhiyun     .cap_hw_osd         = 0,
454*4882a593Smuzhiyun     .cap_hw_roi         = 0,
455*4882a593Smuzhiyun     .reserved           = 0,
456*4882a593Smuzhiyun };
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun static const MppEncHwCap vepu2 = {
459*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_VEPU1,
460*4882a593Smuzhiyun     .type               = VPU_CLIENT_VEPU2,
461*4882a593Smuzhiyun     .cap_fbc            = 0,
462*4882a593Smuzhiyun     .cap_4k             = 0,
463*4882a593Smuzhiyun     .cap_8k             = 0,
464*4882a593Smuzhiyun     .cap_hw_osd         = 0,
465*4882a593Smuzhiyun     .cap_hw_roi         = 0,
466*4882a593Smuzhiyun     .reserved           = 0,
467*4882a593Smuzhiyun };
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun static const MppEncHwCap vepu2_no_jpeg = {
470*4882a593Smuzhiyun     .cap_coding         = HAVE_AVC | HAVE_VP8,
471*4882a593Smuzhiyun     .type               = VPU_CLIENT_VEPU2,
472*4882a593Smuzhiyun     .cap_fbc            = 0,
473*4882a593Smuzhiyun     .cap_4k             = 0,
474*4882a593Smuzhiyun     .cap_8k             = 0,
475*4882a593Smuzhiyun     .cap_hw_osd         = 0,
476*4882a593Smuzhiyun     .cap_hw_roi         = 0,
477*4882a593Smuzhiyun     .reserved           = 0,
478*4882a593Smuzhiyun };
479*4882a593Smuzhiyun 
480*4882a593Smuzhiyun static const MppEncHwCap vepu2_jpeg = {
481*4882a593Smuzhiyun     .cap_coding         = HAVE_MJPEG,
482*4882a593Smuzhiyun     .type               = VPU_CLIENT_VEPU2_JPEG,
483*4882a593Smuzhiyun     .cap_fbc            = 0,
484*4882a593Smuzhiyun     .cap_4k             = 0,
485*4882a593Smuzhiyun     .cap_8k             = 0,
486*4882a593Smuzhiyun     .cap_hw_osd         = 0,
487*4882a593Smuzhiyun     .cap_hw_roi         = 0,
488*4882a593Smuzhiyun     .reserved           = 0,
489*4882a593Smuzhiyun };
490*4882a593Smuzhiyun 
491*4882a593Smuzhiyun static const MppEncHwCap vepu22 = {
492*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_HEVC,
493*4882a593Smuzhiyun     .type               = VPU_CLIENT_VEPU22,
494*4882a593Smuzhiyun     .cap_fbc            = 0,
495*4882a593Smuzhiyun     .cap_4k             = 0,
496*4882a593Smuzhiyun     .cap_8k             = 0,
497*4882a593Smuzhiyun     .cap_hw_osd         = 0,
498*4882a593Smuzhiyun     .cap_hw_roi         = 0,
499*4882a593Smuzhiyun     .reserved           = 0,
500*4882a593Smuzhiyun };
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun static const MppEncHwCap vepu540p = {
503*4882a593Smuzhiyun     .cap_coding         = HAVE_AVC,
504*4882a593Smuzhiyun     .type               = VPU_CLIENT_RKVENC,
505*4882a593Smuzhiyun     .cap_fbc            = 0,
506*4882a593Smuzhiyun     .cap_4k             = 0,
507*4882a593Smuzhiyun     .cap_8k             = 0,
508*4882a593Smuzhiyun     .cap_hw_osd         = 1,
509*4882a593Smuzhiyun     .cap_hw_roi         = 1,
510*4882a593Smuzhiyun     .reserved           = 0,
511*4882a593Smuzhiyun };
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun static const MppEncHwCap vepu541 = {
514*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_VEPU54X,
515*4882a593Smuzhiyun     .type               = VPU_CLIENT_RKVENC,
516*4882a593Smuzhiyun     .cap_fbc            = 1,
517*4882a593Smuzhiyun     .cap_4k             = 1,
518*4882a593Smuzhiyun     .cap_8k             = 0,
519*4882a593Smuzhiyun     .cap_hw_osd         = 1,
520*4882a593Smuzhiyun     .cap_hw_roi         = 1,
521*4882a593Smuzhiyun     .reserved           = 0,
522*4882a593Smuzhiyun };
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun /* vepu540 support both AFBC_V1 and AFBC_V2 input */
525*4882a593Smuzhiyun static const MppEncHwCap vepu540 = {
526*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_VEPU54X,
527*4882a593Smuzhiyun     .type               = VPU_CLIENT_RKVENC,
528*4882a593Smuzhiyun     .cap_fbc            = 0x1 | 0x2,
529*4882a593Smuzhiyun     .cap_4k             = 0,
530*4882a593Smuzhiyun     .cap_8k             = 0,
531*4882a593Smuzhiyun     .cap_hw_osd         = 1,
532*4882a593Smuzhiyun     .cap_hw_roi         = 1,
533*4882a593Smuzhiyun     .reserved           = 0,
534*4882a593Smuzhiyun };
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun /* vepu58x */
537*4882a593Smuzhiyun static const MppEncHwCap vepu58x = {
538*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_VEPU54X,
539*4882a593Smuzhiyun     .type               = VPU_CLIENT_RKVENC,
540*4882a593Smuzhiyun     .cap_fbc            = 0x1 | 0x2,
541*4882a593Smuzhiyun     .cap_4k             = 1,
542*4882a593Smuzhiyun     .cap_8k             = 1,
543*4882a593Smuzhiyun     .cap_hw_osd         = 1,
544*4882a593Smuzhiyun     .cap_hw_roi         = 1,
545*4882a593Smuzhiyun     .reserved           = 0,
546*4882a593Smuzhiyun };
547*4882a593Smuzhiyun 
548*4882a593Smuzhiyun static const MppEncHwCap vepu540c = {
549*4882a593Smuzhiyun     .cap_coding         = CAP_CODING_VEPU540C,
550*4882a593Smuzhiyun     .type               = VPU_CLIENT_RKVENC,
551*4882a593Smuzhiyun     .cap_fbc            = 0x1 | 0x2,
552*4882a593Smuzhiyun     .cap_4k             = 0,
553*4882a593Smuzhiyun     .cap_8k             = 0,
554*4882a593Smuzhiyun     .cap_hw_osd         = 0,
555*4882a593Smuzhiyun     .cap_hw_roi         = 1,
556*4882a593Smuzhiyun     .reserved           = 0,
557*4882a593Smuzhiyun };
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun static const MppEncHwCap vepu540c_no_hevc = {
560*4882a593Smuzhiyun     .cap_coding         = (HAVE_AVC | HAVE_MJPEG),
561*4882a593Smuzhiyun     .type               = VPU_CLIENT_RKVENC,
562*4882a593Smuzhiyun     .cap_fbc            = 0,
563*4882a593Smuzhiyun     .cap_4k             = 1,
564*4882a593Smuzhiyun     .cap_8k             = 1,
565*4882a593Smuzhiyun     .cap_hw_osd         = 0,
566*4882a593Smuzhiyun     .cap_hw_roi         = 1,
567*4882a593Smuzhiyun     .reserved           = 0,
568*4882a593Smuzhiyun };
569*4882a593Smuzhiyun 
570*4882a593Smuzhiyun /*
571*4882a593Smuzhiyun  * NOTE:
572*4882a593Smuzhiyun  * vpu1 = vdpu1 + vepu1
573*4882a593Smuzhiyun  * vpu2 = vdpu2 + vepu2
574*4882a593Smuzhiyun  */
575*4882a593Smuzhiyun static const MppSocInfo mpp_soc_infos[] = {
576*4882a593Smuzhiyun     {   /*
577*4882a593Smuzhiyun          * rk3036 has
578*4882a593Smuzhiyun          * 1 - vdpu1
579*4882a593Smuzhiyun          * 2 - RK hevc decoder
580*4882a593Smuzhiyun          * rk3036 do NOT have encoder
581*4882a593Smuzhiyun          */
582*4882a593Smuzhiyun         "rk3036",
583*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3036,
584*4882a593Smuzhiyun         HAVE_VDPU1 | HAVE_VDPU1_PP | HAVE_HEVC_DEC,
585*4882a593Smuzhiyun         {   &rk_hevc_1080p, &vdpu1, &vdpu1_jpeg_pp, NULL, NULL, NULL, },
586*4882a593Smuzhiyun         {   NULL, NULL, NULL, NULL, },
587*4882a593Smuzhiyun     },
588*4882a593Smuzhiyun     {   /* rk3066 has vpu1 only */
589*4882a593Smuzhiyun         "rk3066",
590*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3066,
591*4882a593Smuzhiyun         HAVE_VDPU1 | HAVE_VDPU1_PP | HAVE_VEPU1,
592*4882a593Smuzhiyun         {   &vdpu1, &vdpu1_jpeg_pp, NULL, NULL, NULL, NULL, },
593*4882a593Smuzhiyun         {   &vepu1, NULL, NULL, NULL, },
594*4882a593Smuzhiyun     },
595*4882a593Smuzhiyun     {   /* rk3188 has vpu1 only */
596*4882a593Smuzhiyun         "rk3188",
597*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3188,
598*4882a593Smuzhiyun         HAVE_VDPU1 | HAVE_VDPU1_PP | HAVE_VEPU1,
599*4882a593Smuzhiyun         {   &vdpu1, &vdpu1_jpeg_pp, NULL, NULL, NULL, NULL, },
600*4882a593Smuzhiyun         {   &vepu1, NULL, NULL, NULL, },
601*4882a593Smuzhiyun     },
602*4882a593Smuzhiyun     {   /*
603*4882a593Smuzhiyun          * rk3288 has
604*4882a593Smuzhiyun          * 1 - vpu1 with 2160p AVC decoder
605*4882a593Smuzhiyun          * 2 - RK hevc 4K decoder
606*4882a593Smuzhiyun          */
607*4882a593Smuzhiyun         "rk3288",
608*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3288,
609*4882a593Smuzhiyun         HAVE_VDPU1 | HAVE_VDPU1_PP | HAVE_VEPU1 | HAVE_HEVC_DEC,
610*4882a593Smuzhiyun         {   &rk_hevc, &vdpu1_2160p, &vdpu1_jpeg_pp, NULL, NULL, NULL, },
611*4882a593Smuzhiyun         {   &vepu1, NULL, NULL, NULL, },
612*4882a593Smuzhiyun     },
613*4882a593Smuzhiyun     {   /*
614*4882a593Smuzhiyun          * rk3126 has
615*4882a593Smuzhiyun          * 1 - vpu1
616*4882a593Smuzhiyun          * 2 - RK hevc 1080p decoder
617*4882a593Smuzhiyun          */
618*4882a593Smuzhiyun         "rk3126",
619*4882a593Smuzhiyun         ROCKCHIP_SOC_RK312X,
620*4882a593Smuzhiyun         HAVE_VDPU1 | HAVE_VDPU1_PP | HAVE_VEPU1 | HAVE_HEVC_DEC,
621*4882a593Smuzhiyun         {   &rk_hevc_1080p, &vdpu1, &vdpu1_jpeg_pp, NULL, NULL, NULL, },
622*4882a593Smuzhiyun         {   &vepu1, NULL, NULL, NULL, },
623*4882a593Smuzhiyun     },
624*4882a593Smuzhiyun     {   /*
625*4882a593Smuzhiyun          * rk3128h has
626*4882a593Smuzhiyun          * 1 - vpu2
627*4882a593Smuzhiyun          * 2 - RK H.264/H.265 1080p@60fps decoder
628*4882a593Smuzhiyun          * NOTE: rk3128H do NOT have jpeg encoder
629*4882a593Smuzhiyun          */
630*4882a593Smuzhiyun         "rk3128h",
631*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3128H,
632*4882a593Smuzhiyun         HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC,
633*4882a593Smuzhiyun         {   &vdpu341_lite_1080p, &vdpu2, &vdpu2_jpeg_pp, NULL, NULL, NULL, },
634*4882a593Smuzhiyun         {   &vepu2_no_jpeg, NULL, NULL, NULL, },
635*4882a593Smuzhiyun     },
636*4882a593Smuzhiyun     {   /*
637*4882a593Smuzhiyun          * rk3128 has
638*4882a593Smuzhiyun          * 1 - vpu1
639*4882a593Smuzhiyun          * 2 - RK hevc 1080p decoder
640*4882a593Smuzhiyun          */
641*4882a593Smuzhiyun         "rk3128",
642*4882a593Smuzhiyun         ROCKCHIP_SOC_RK312X,
643*4882a593Smuzhiyun         HAVE_VDPU1 | HAVE_VDPU1_PP | HAVE_VEPU1 | HAVE_HEVC_DEC,
644*4882a593Smuzhiyun         {   &rk_hevc_1080p, &vdpu1, &vdpu1_jpeg_pp, NULL, NULL, NULL, },
645*4882a593Smuzhiyun         {   &vepu1, NULL, NULL, NULL, },
646*4882a593Smuzhiyun     },
647*4882a593Smuzhiyun     {   /*
648*4882a593Smuzhiyun          * rk3368 has
649*4882a593Smuzhiyun          * 1 - vpu1
650*4882a593Smuzhiyun          * 2 - RK hevc 4K decoder
651*4882a593Smuzhiyun          */
652*4882a593Smuzhiyun         "rk3368",
653*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3368,
654*4882a593Smuzhiyun         HAVE_VDPU1 | HAVE_VDPU1_PP | HAVE_VEPU1 | HAVE_HEVC_DEC,
655*4882a593Smuzhiyun         {   &rk_hevc, &vdpu1_2160p, &vdpu1_jpeg_pp, NULL, NULL, NULL, },
656*4882a593Smuzhiyun         {   &vepu1, NULL, NULL, NULL, },
657*4882a593Smuzhiyun     },
658*4882a593Smuzhiyun     {   /*
659*4882a593Smuzhiyun          * rk3399 has
660*4882a593Smuzhiyun          * 1 - vpu2
661*4882a593Smuzhiyun          * 2 - H.264/H.265/VP9 4K decoder
662*4882a593Smuzhiyun          */
663*4882a593Smuzhiyun         "rk3399",
664*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3399,
665*4882a593Smuzhiyun         HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC,
666*4882a593Smuzhiyun         {   &vdpu341, &vdpu2, &vdpu2_jpeg_pp, NULL, NULL, NULL, },
667*4882a593Smuzhiyun         {   &vepu2, NULL, NULL, NULL, },
668*4882a593Smuzhiyun     },
669*4882a593Smuzhiyun     {   /*
670*4882a593Smuzhiyun          * rk3228h has
671*4882a593Smuzhiyun          * 1 - vpu2
672*4882a593Smuzhiyun          * 2 - RK H.264/H.265 4K decoder
673*4882a593Smuzhiyun          * 3 - avs+ decoder
674*4882a593Smuzhiyun          * 4 - H.265 1080p encoder
675*4882a593Smuzhiyun          * rk3228h first for string matching
676*4882a593Smuzhiyun          */
677*4882a593Smuzhiyun         "rk3228h",
678*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3228H,
679*4882a593Smuzhiyun         HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC | HAVE_AVSDEC | HAVE_VEPU22,
680*4882a593Smuzhiyun         {   &vdpu341_lite, &vdpu2, &vdpu2_jpeg_pp, &avspd, NULL, NULL, },
681*4882a593Smuzhiyun         {   &vepu2_no_jpeg, &vepu22, NULL, NULL, },
682*4882a593Smuzhiyun     },
683*4882a593Smuzhiyun     {   /*
684*4882a593Smuzhiyun          * rk3328 has codec:
685*4882a593Smuzhiyun          * 1 - vpu2
686*4882a593Smuzhiyun          * 2 - RK H.264/H.265/VP9 4K decoder
687*4882a593Smuzhiyun          * 4 - H.265 encoder
688*4882a593Smuzhiyun          */
689*4882a593Smuzhiyun         "rk3328",
690*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3328,
691*4882a593Smuzhiyun         HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC | HAVE_VEPU22,
692*4882a593Smuzhiyun         {   &vdpu341, &vdpu2, &vdpu2_jpeg_pp, NULL, NULL, NULL, },
693*4882a593Smuzhiyun         {   &vepu2, &vepu22, NULL, NULL, },
694*4882a593Smuzhiyun     },
695*4882a593Smuzhiyun     {   /*
696*4882a593Smuzhiyun          * rk3228 have codec:
697*4882a593Smuzhiyun          * 1 - vpu2
698*4882a593Smuzhiyun          * 2 - RK H.264/H.265 4K decoder
699*4882a593Smuzhiyun          * NOTE: rk3228 do NOT have jpeg encoder
700*4882a593Smuzhiyun          */
701*4882a593Smuzhiyun         "rk3228",
702*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3228,
703*4882a593Smuzhiyun         HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC,
704*4882a593Smuzhiyun         {   &vdpu341_lite, &vdpu2, &vdpu2_jpeg_pp, NULL, NULL, NULL, },
705*4882a593Smuzhiyun         {   &vepu2_no_jpeg, NULL, NULL, NULL, },
706*4882a593Smuzhiyun     },
707*4882a593Smuzhiyun     {   /*
708*4882a593Smuzhiyun          * rk3229 has
709*4882a593Smuzhiyun          * 1 - vpu2
710*4882a593Smuzhiyun          * 2 - H.264/H.265/VP9 4K decoder
711*4882a593Smuzhiyun          */
712*4882a593Smuzhiyun         "rk3229",
713*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3229,
714*4882a593Smuzhiyun         HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC,
715*4882a593Smuzhiyun         {   &vdpu341, &vdpu2, &vdpu2_jpeg_pp, NULL, NULL, NULL, },
716*4882a593Smuzhiyun         {   &vepu2, NULL, NULL, NULL, },
717*4882a593Smuzhiyun     },
718*4882a593Smuzhiyun     {   /*
719*4882a593Smuzhiyun          * rv1108 has codec:
720*4882a593Smuzhiyun          * 1 - vpu2 for jpeg encoder and decoder
721*4882a593Smuzhiyun          * 2 - RK H.264 4K decoder
722*4882a593Smuzhiyun          * 3 - RK H.264 4K encoder
723*4882a593Smuzhiyun          */
724*4882a593Smuzhiyun         "rv1108",
725*4882a593Smuzhiyun         ROCKCHIP_SOC_RV1108,
726*4882a593Smuzhiyun         HAVE_VDPU2 | HAVE_VEPU2 | HAVE_RKVDEC | HAVE_RKVENC,
727*4882a593Smuzhiyun         {   &vdpu2_jpeg, &vdpu341_h264, NULL, NULL, NULL, NULL, },
728*4882a593Smuzhiyun         {   &vepu2_jpeg, &vepu540p, NULL, NULL, },
729*4882a593Smuzhiyun     },
730*4882a593Smuzhiyun     {   /*
731*4882a593Smuzhiyun          * rv1109 has codec:
732*4882a593Smuzhiyun          * 1 - vpu2 for jpeg encoder and decoder
733*4882a593Smuzhiyun          * 2 - RK H.264/H.265 4K decoder
734*4882a593Smuzhiyun          * 3 - RK H.264/H.265 4K encoder
735*4882a593Smuzhiyun          */
736*4882a593Smuzhiyun         "rv1109",
737*4882a593Smuzhiyun         ROCKCHIP_SOC_RV1109,
738*4882a593Smuzhiyun         HAVE_VDPU2 | HAVE_VEPU2_JPEG | HAVE_RKVDEC | HAVE_RKVENC,
739*4882a593Smuzhiyun         {   &vdpu2_jpeg_fix, &vdpu341_lite, NULL, NULL, NULL, NULL, },
740*4882a593Smuzhiyun         {   &vepu2_jpeg, &vepu541, NULL, NULL, },
741*4882a593Smuzhiyun     },
742*4882a593Smuzhiyun     {   /*
743*4882a593Smuzhiyun          * rv1126 has codec:
744*4882a593Smuzhiyun          * 1 - vpu2 for jpeg encoder and decoder
745*4882a593Smuzhiyun          * 2 - RK H.264/H.265 4K decoder
746*4882a593Smuzhiyun          * 3 - RK H.264/H.265 4K encoder
747*4882a593Smuzhiyun          */
748*4882a593Smuzhiyun         "rv1126",
749*4882a593Smuzhiyun         ROCKCHIP_SOC_RV1126,
750*4882a593Smuzhiyun         HAVE_VDPU2 | HAVE_VEPU2_JPEG | HAVE_RKVDEC | HAVE_RKVENC,
751*4882a593Smuzhiyun         {   &vdpu2_jpeg_fix, &vdpu341_lite, NULL, NULL, NULL, NULL, },
752*4882a593Smuzhiyun         {   &vepu2_jpeg, &vepu541, NULL, NULL, },
753*4882a593Smuzhiyun     },
754*4882a593Smuzhiyun     {   /*
755*4882a593Smuzhiyun          * rk3326 has
756*4882a593Smuzhiyun          * 1 - vpu2
757*4882a593Smuzhiyun          * 2 - RK hevc 1080p decoder
758*4882a593Smuzhiyun          */
759*4882a593Smuzhiyun         "rk3326",
760*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3326,
761*4882a593Smuzhiyun         HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_HEVC_DEC,
762*4882a593Smuzhiyun         {   &rk_hevc_1080p, &vdpu2, &vdpu2_jpeg_pp_fix, NULL, NULL, NULL, },
763*4882a593Smuzhiyun         {   &vepu2, NULL, NULL, NULL, },
764*4882a593Smuzhiyun     },
765*4882a593Smuzhiyun     {   /*
766*4882a593Smuzhiyun          * px30 has
767*4882a593Smuzhiyun          * 1 - vpu2
768*4882a593Smuzhiyun          * 2 - RK hevc 1080p decoder
769*4882a593Smuzhiyun          */
770*4882a593Smuzhiyun         "px30",
771*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3326,
772*4882a593Smuzhiyun         HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_HEVC_DEC,
773*4882a593Smuzhiyun         {   &rk_hevc_1080p, &vdpu2, &vdpu2_jpeg_pp_fix, NULL, NULL, NULL, },
774*4882a593Smuzhiyun         {   &vepu2, NULL, NULL, NULL, },
775*4882a593Smuzhiyun     },
776*4882a593Smuzhiyun     {   /*
777*4882a593Smuzhiyun          * px30 has vpu2 only
778*4882a593Smuzhiyun          */
779*4882a593Smuzhiyun         "rk1808",
780*4882a593Smuzhiyun         ROCKCHIP_SOC_RK1808,
781*4882a593Smuzhiyun         HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2,
782*4882a593Smuzhiyun         {   &vdpu2, &vdpu2_jpeg_pp, NULL, NULL, NULL, NULL, },
783*4882a593Smuzhiyun         {   &vepu2, NULL, NULL, NULL, },
784*4882a593Smuzhiyun     },
785*4882a593Smuzhiyun     {   /*
786*4882a593Smuzhiyun          * rk3566/rk3568 has codec:
787*4882a593Smuzhiyun          * 1 - vpu2 for jpeg/vp8 encoder and decoder
788*4882a593Smuzhiyun          * 2 - RK H.264/H.265/VP9 4K decoder
789*4882a593Smuzhiyun          * 3 - RK H.264/H.265 4K encoder
790*4882a593Smuzhiyun          * 3 - RK jpeg decoder
791*4882a593Smuzhiyun          */
792*4882a593Smuzhiyun         "rk3566",
793*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3566,
794*4882a593Smuzhiyun         HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC | HAVE_RKVENC | HAVE_JPEG_DEC,
795*4882a593Smuzhiyun         {   &vdpu34x, &rkjpegd, &vdpu2, &vdpu2_jpeg_pp_fix, NULL, NULL, },
796*4882a593Smuzhiyun         {   &vepu540, &vepu2, NULL, NULL, },
797*4882a593Smuzhiyun     },
798*4882a593Smuzhiyun     {   /*
799*4882a593Smuzhiyun          * rk3566/rk3568 has codec:
800*4882a593Smuzhiyun          * 1 - vpu2 for jpeg/vp8 encoder and decoder
801*4882a593Smuzhiyun          * 2 - RK H.264/H.265/VP9 4K decoder
802*4882a593Smuzhiyun          * 3 - RK H.264/H.265 4K encoder
803*4882a593Smuzhiyun          * 3 - RK jpeg decoder
804*4882a593Smuzhiyun          */
805*4882a593Smuzhiyun         "rk3568",
806*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3568,
807*4882a593Smuzhiyun         HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC | HAVE_RKVENC | HAVE_JPEG_DEC,
808*4882a593Smuzhiyun         {   &vdpu34x, &rkjpegd, &vdpu2, &vdpu2_jpeg_pp_fix, NULL, NULL, },
809*4882a593Smuzhiyun         {   &vepu540, &vepu2, NULL, NULL, },
810*4882a593Smuzhiyun     },
811*4882a593Smuzhiyun     {   /*
812*4882a593Smuzhiyun          * rk3588 has codec:
813*4882a593Smuzhiyun          * 1 - vpu2 for jpeg/vp8 encoder and decoder
814*4882a593Smuzhiyun          * 2 - RK H.264/H.265/VP9 8K decoder
815*4882a593Smuzhiyun          * 3 - RK H.264/H.265 8K encoder
816*4882a593Smuzhiyun          * 4 - RK jpeg decoder
817*4882a593Smuzhiyun          */
818*4882a593Smuzhiyun         "rk3588",
819*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3588,
820*4882a593Smuzhiyun         HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC | HAVE_RKVENC |
821*4882a593Smuzhiyun         HAVE_JPEG_DEC | HAVE_AV1DEC | HAVE_AVSDEC | HAVE_VEPU2_JPEG,
822*4882a593Smuzhiyun         {   &vdpu38x, &rkjpegd, &vdpu2, &vdpu2_jpeg_pp_fix, &av1d, &avspd},
823*4882a593Smuzhiyun         {   &vepu58x, &vepu2, &vepu2_jpeg, NULL, },
824*4882a593Smuzhiyun     },
825*4882a593Smuzhiyun     {   /*
826*4882a593Smuzhiyun          * rk3528 has codec:
827*4882a593Smuzhiyun          * 1 - vpu2 for jpeg/vp8 decoder
828*4882a593Smuzhiyun          * 2 - RK H.264/H.265/VP9 4K decoder
829*4882a593Smuzhiyun          * 3 - RK H.264/H.265 1080P encoder
830*4882a593Smuzhiyun          * 4 - RK jpeg decoder
831*4882a593Smuzhiyun          */
832*4882a593Smuzhiyun         "rk3528",
833*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3528,
834*4882a593Smuzhiyun         HAVE_RKVDEC | HAVE_RKVENC | HAVE_VDPU2 | HAVE_JPEG_DEC | HAVE_AVSDEC,
835*4882a593Smuzhiyun         {   &vdpu382, &rkjpegd, &vdpu2, &avspd, NULL, NULL, },
836*4882a593Smuzhiyun         {   &vepu540c, NULL, NULL, NULL, },
837*4882a593Smuzhiyun     },
838*4882a593Smuzhiyun     {   /*
839*4882a593Smuzhiyun          * rk3562 has codec:
840*4882a593Smuzhiyun          * 1 - RK H.264/H.265/VP9 4K decoder
841*4882a593Smuzhiyun          * 2 - RK H.264 1080P encoder
842*4882a593Smuzhiyun          * 3 - RK jpeg decoder
843*4882a593Smuzhiyun          */
844*4882a593Smuzhiyun         "rk3562",
845*4882a593Smuzhiyun         ROCKCHIP_SOC_RK3562,
846*4882a593Smuzhiyun         HAVE_RKVDEC | HAVE_RKVENC | HAVE_JPEG_DEC,
847*4882a593Smuzhiyun         {   &vdpu382_lite, &rkjpegd, NULL, NULL, NULL, NULL, },
848*4882a593Smuzhiyun         {   &vepu540c_no_hevc, NULL, NULL, NULL, },
849*4882a593Smuzhiyun     },
850*4882a593Smuzhiyun };
851*4882a593Smuzhiyun 
852*4882a593Smuzhiyun static const MppSocInfo mpp_soc_default = {
853*4882a593Smuzhiyun     "unknown",
854*4882a593Smuzhiyun     ROCKCHIP_SOC_AUTO,
855*4882a593Smuzhiyun     HAVE_VDPU2 | HAVE_VEPU2 | HAVE_VDPU1 | HAVE_VEPU1,
856*4882a593Smuzhiyun     {   &vdpu2, &vdpu1, NULL, NULL, },
857*4882a593Smuzhiyun     {   &vepu2, &vepu1, NULL, NULL, },
858*4882a593Smuzhiyun };
859*4882a593Smuzhiyun 
read_soc_name(char * name,RK_S32 size)860*4882a593Smuzhiyun static void read_soc_name(char *name, RK_S32 size)
861*4882a593Smuzhiyun {
862*4882a593Smuzhiyun     const char *path = "/proc/device-tree/compatible";
863*4882a593Smuzhiyun     RK_S32 fd = open(path, O_RDONLY);
864*4882a593Smuzhiyun 
865*4882a593Smuzhiyun     if (fd < 0) {
866*4882a593Smuzhiyun         mpp_err("open %s error\n", path);
867*4882a593Smuzhiyun     } else {
868*4882a593Smuzhiyun         ssize_t soc_name_len = 0;
869*4882a593Smuzhiyun 
870*4882a593Smuzhiyun         snprintf(name, size - 1, "unknown");
871*4882a593Smuzhiyun         soc_name_len = read(fd, name, size - 1);
872*4882a593Smuzhiyun         if (soc_name_len > 0) {
873*4882a593Smuzhiyun             name[soc_name_len] = '\0';
874*4882a593Smuzhiyun             /* replacing the termination character to space */
875*4882a593Smuzhiyun             for (char *ptr = name;; ptr = name) {
876*4882a593Smuzhiyun                 ptr += strnlen(name, size);
877*4882a593Smuzhiyun                 if (ptr >= name + soc_name_len - 1)
878*4882a593Smuzhiyun                     break;
879*4882a593Smuzhiyun                 *ptr = ' ';
880*4882a593Smuzhiyun             }
881*4882a593Smuzhiyun 
882*4882a593Smuzhiyun             mpp_dbg_platform("chip name: %s\n", name);
883*4882a593Smuzhiyun         }
884*4882a593Smuzhiyun 
885*4882a593Smuzhiyun         close(fd);
886*4882a593Smuzhiyun     }
887*4882a593Smuzhiyun }
888*4882a593Smuzhiyun 
889*4882a593Smuzhiyun 
check_soc_info(const char * soc_name)890*4882a593Smuzhiyun static const MppSocInfo *check_soc_info(const char *soc_name)
891*4882a593Smuzhiyun {
892*4882a593Smuzhiyun     RK_U32 i;
893*4882a593Smuzhiyun 
894*4882a593Smuzhiyun     for (i = 0; i < MPP_ARRAY_ELEMS(mpp_soc_infos); i++) {
895*4882a593Smuzhiyun         const char *compatible = mpp_soc_infos[i].compatible;
896*4882a593Smuzhiyun 
897*4882a593Smuzhiyun         if (strstr(soc_name, compatible)) {
898*4882a593Smuzhiyun             mpp_dbg_platform("match chip name: %s\n", compatible);
899*4882a593Smuzhiyun             return &mpp_soc_infos[i];
900*4882a593Smuzhiyun         }
901*4882a593Smuzhiyun     }
902*4882a593Smuzhiyun 
903*4882a593Smuzhiyun     return NULL;
904*4882a593Smuzhiyun }
905*4882a593Smuzhiyun 
906*4882a593Smuzhiyun class MppSocService
907*4882a593Smuzhiyun {
908*4882a593Smuzhiyun private:
909*4882a593Smuzhiyun     // avoid any unwanted function
910*4882a593Smuzhiyun     MppSocService();
~MppSocService()911*4882a593Smuzhiyun     ~MppSocService() {};
912*4882a593Smuzhiyun     MppSocService(const MppSocService &);
913*4882a593Smuzhiyun     MppSocService &operator=(const MppSocService &);
914*4882a593Smuzhiyun 
915*4882a593Smuzhiyun     char                soc_name[MAX_SOC_NAME_LENGTH];
916*4882a593Smuzhiyun     const MppSocInfo    *soc_info;
917*4882a593Smuzhiyun     RK_U32              dec_coding_cap;
918*4882a593Smuzhiyun     RK_U32              enc_coding_cap;
919*4882a593Smuzhiyun 
920*4882a593Smuzhiyun public:
get()921*4882a593Smuzhiyun     static MppSocService *get() {
922*4882a593Smuzhiyun         static MppSocService instance;
923*4882a593Smuzhiyun         return &instance;
924*4882a593Smuzhiyun     }
925*4882a593Smuzhiyun 
get_soc_name()926*4882a593Smuzhiyun     const char          *get_soc_name() { return soc_name; };
get_soc_info()927*4882a593Smuzhiyun     const MppSocInfo    *get_soc_info() { return soc_info; };
get_dec_cap()928*4882a593Smuzhiyun     RK_U32              get_dec_cap() { return dec_coding_cap; };
get_enc_cap()929*4882a593Smuzhiyun     RK_U32              get_enc_cap() { return enc_coding_cap; };
930*4882a593Smuzhiyun };
931*4882a593Smuzhiyun 
MppSocService()932*4882a593Smuzhiyun MppSocService::MppSocService()
933*4882a593Smuzhiyun     : soc_info(NULL),
934*4882a593Smuzhiyun       dec_coding_cap(0),
935*4882a593Smuzhiyun       enc_coding_cap(0)
936*4882a593Smuzhiyun {
937*4882a593Smuzhiyun     RK_U32 i;
938*4882a593Smuzhiyun     RK_U32 vcodec_type = 0;
939*4882a593Smuzhiyun 
940*4882a593Smuzhiyun     read_soc_name(soc_name, sizeof(soc_name));
941*4882a593Smuzhiyun     soc_info = check_soc_info(soc_name);
942*4882a593Smuzhiyun     if (NULL == soc_info) {
943*4882a593Smuzhiyun         mpp_dbg_platform("use default chip info\n");
944*4882a593Smuzhiyun         soc_info = &mpp_soc_default;
945*4882a593Smuzhiyun     }
946*4882a593Smuzhiyun 
947*4882a593Smuzhiyun     for (i = 0; i < MPP_ARRAY_ELEMS(soc_info->dec_caps); i++) {
948*4882a593Smuzhiyun         const MppDecHwCap *cap = soc_info->dec_caps[i];
949*4882a593Smuzhiyun 
950*4882a593Smuzhiyun         if (cap && cap->cap_coding) {
951*4882a593Smuzhiyun             dec_coding_cap |= cap->cap_coding;
952*4882a593Smuzhiyun             vcodec_type |= (1 << cap->type);
953*4882a593Smuzhiyun         }
954*4882a593Smuzhiyun     }
955*4882a593Smuzhiyun 
956*4882a593Smuzhiyun     for (i = 0; i < MPP_ARRAY_ELEMS(soc_info->enc_caps); i++) {
957*4882a593Smuzhiyun         const MppEncHwCap *cap = soc_info->enc_caps[i];
958*4882a593Smuzhiyun 
959*4882a593Smuzhiyun         if (cap && cap->cap_coding) {
960*4882a593Smuzhiyun             enc_coding_cap |= cap->cap_coding;
961*4882a593Smuzhiyun             vcodec_type |= (1 << cap->type);
962*4882a593Smuzhiyun         }
963*4882a593Smuzhiyun     }
964*4882a593Smuzhiyun 
965*4882a593Smuzhiyun     mpp_dbg_platform("coding caps: dec %08x enc %08x\n",
966*4882a593Smuzhiyun                      dec_coding_cap, enc_coding_cap);
967*4882a593Smuzhiyun     mpp_dbg_platform("vcodec type: %08x\n", soc_info->vcodec_type);
968*4882a593Smuzhiyun     mpp_assert(soc_info->vcodec_type == vcodec_type);
969*4882a593Smuzhiyun }
970*4882a593Smuzhiyun 
mpp_get_soc_name(void)971*4882a593Smuzhiyun const char *mpp_get_soc_name(void)
972*4882a593Smuzhiyun {
973*4882a593Smuzhiyun     static const char *soc_name = NULL;
974*4882a593Smuzhiyun 
975*4882a593Smuzhiyun     if (soc_name)
976*4882a593Smuzhiyun         return soc_name;
977*4882a593Smuzhiyun 
978*4882a593Smuzhiyun     soc_name = MppSocService::get()->get_soc_name();
979*4882a593Smuzhiyun     return soc_name;
980*4882a593Smuzhiyun }
981*4882a593Smuzhiyun 
mpp_get_soc_info(void)982*4882a593Smuzhiyun const MppSocInfo *mpp_get_soc_info(void)
983*4882a593Smuzhiyun {
984*4882a593Smuzhiyun     static const MppSocInfo *soc_info = NULL;
985*4882a593Smuzhiyun 
986*4882a593Smuzhiyun     if (soc_info)
987*4882a593Smuzhiyun         return soc_info;
988*4882a593Smuzhiyun 
989*4882a593Smuzhiyun     soc_info = MppSocService::get()->get_soc_info();
990*4882a593Smuzhiyun     return soc_info;
991*4882a593Smuzhiyun }
992*4882a593Smuzhiyun 
mpp_get_soc_type(void)993*4882a593Smuzhiyun RockchipSocType mpp_get_soc_type(void)
994*4882a593Smuzhiyun {
995*4882a593Smuzhiyun     static RockchipSocType soc_type = ROCKCHIP_SOC_AUTO;
996*4882a593Smuzhiyun 
997*4882a593Smuzhiyun     if (soc_type)
998*4882a593Smuzhiyun         return soc_type;
999*4882a593Smuzhiyun 
1000*4882a593Smuzhiyun     soc_type = MppSocService::get()->get_soc_info()->soc_type;
1001*4882a593Smuzhiyun     return soc_type;
1002*4882a593Smuzhiyun }
1003*4882a593Smuzhiyun 
is_valid_cap_coding(RK_U32 cap,MppCodingType coding)1004*4882a593Smuzhiyun static RK_U32 is_valid_cap_coding(RK_U32 cap, MppCodingType coding)
1005*4882a593Smuzhiyun {
1006*4882a593Smuzhiyun     RK_S32 index = CODING_TO_IDX(coding);
1007*4882a593Smuzhiyun     if (index > 0 && index < 32 && (cap & (RK_U32)(1 << index)))
1008*4882a593Smuzhiyun         return true;
1009*4882a593Smuzhiyun 
1010*4882a593Smuzhiyun     return false;
1011*4882a593Smuzhiyun }
1012*4882a593Smuzhiyun 
mpp_check_soc_cap(MppCtxType type,MppCodingType coding)1013*4882a593Smuzhiyun RK_U32 mpp_check_soc_cap(MppCtxType type, MppCodingType coding)
1014*4882a593Smuzhiyun {
1015*4882a593Smuzhiyun     RK_U32 cap = 0;
1016*4882a593Smuzhiyun 
1017*4882a593Smuzhiyun     if (type == MPP_CTX_DEC)
1018*4882a593Smuzhiyun         cap = MppSocService::get()->get_dec_cap();
1019*4882a593Smuzhiyun     else if (type == MPP_CTX_ENC)
1020*4882a593Smuzhiyun         cap = MppSocService::get()->get_enc_cap();
1021*4882a593Smuzhiyun     else
1022*4882a593Smuzhiyun         return 0;
1023*4882a593Smuzhiyun 
1024*4882a593Smuzhiyun     if (!cap)
1025*4882a593Smuzhiyun         return 0;
1026*4882a593Smuzhiyun 
1027*4882a593Smuzhiyun     return is_valid_cap_coding(cap, coding);
1028*4882a593Smuzhiyun }
1029