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