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