1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2018 BayLibre, SAS
4  * Author: Maxime Jourdan <mjourdan@baylibre.com>
5  */
6 
7 #include "vdec_platform.h"
8 #include "vdec.h"
9 
10 #include "vdec_1.h"
11 #include "vdec_hevc.h"
12 #include "codec_mpeg12.h"
13 #include "codec_h264.h"
14 #include "codec_vp9.h"
15 
16 static const struct amvdec_format vdec_formats_gxbb[] = {
17 	{
18 		.pixfmt = V4L2_PIX_FMT_H264,
19 		.min_buffers = 2,
20 		.max_buffers = 24,
21 		.max_width = 1920,
22 		.max_height = 1080,
23 		.vdec_ops = &vdec_1_ops,
24 		.codec_ops = &codec_h264_ops,
25 		.firmware_path = "meson/vdec/gxbb_h264.bin",
26 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 },
27 		.flags = V4L2_FMT_FLAG_COMPRESSED |
28 			 V4L2_FMT_FLAG_DYN_RESOLUTION,
29 	}, {
30 		.pixfmt = V4L2_PIX_FMT_MPEG1,
31 		.min_buffers = 8,
32 		.max_buffers = 8,
33 		.max_width = 1920,
34 		.max_height = 1080,
35 		.vdec_ops = &vdec_1_ops,
36 		.codec_ops = &codec_mpeg12_ops,
37 		.firmware_path = "meson/vdec/gxl_mpeg12.bin",
38 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 },
39 		.flags = V4L2_FMT_FLAG_COMPRESSED,
40 	}, {
41 		.pixfmt = V4L2_PIX_FMT_MPEG2,
42 		.min_buffers = 8,
43 		.max_buffers = 8,
44 		.max_width = 1920,
45 		.max_height = 1080,
46 		.vdec_ops = &vdec_1_ops,
47 		.codec_ops = &codec_mpeg12_ops,
48 		.firmware_path = "meson/vdec/gxl_mpeg12.bin",
49 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 },
50 		.flags = V4L2_FMT_FLAG_COMPRESSED,
51 	},
52 };
53 
54 static const struct amvdec_format vdec_formats_gxl[] = {
55 	{
56 		.pixfmt = V4L2_PIX_FMT_VP9,
57 		.min_buffers = 16,
58 		.max_buffers = 24,
59 		.max_width = 3840,
60 		.max_height = 2160,
61 		.vdec_ops = &vdec_hevc_ops,
62 		.codec_ops = &codec_vp9_ops,
63 		.firmware_path = "meson/vdec/gxl_vp9.bin",
64 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 },
65 		.flags = V4L2_FMT_FLAG_COMPRESSED |
66 			 V4L2_FMT_FLAG_DYN_RESOLUTION,
67 	}, {
68 		.pixfmt = V4L2_PIX_FMT_H264,
69 		.min_buffers = 2,
70 		.max_buffers = 24,
71 		.max_width = 3840,
72 		.max_height = 2160,
73 		.vdec_ops = &vdec_1_ops,
74 		.codec_ops = &codec_h264_ops,
75 		.firmware_path = "meson/vdec/gxl_h264.bin",
76 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 },
77 		.flags = V4L2_FMT_FLAG_COMPRESSED |
78 			 V4L2_FMT_FLAG_DYN_RESOLUTION,
79 	}, {
80 		.pixfmt = V4L2_PIX_FMT_MPEG1,
81 		.min_buffers = 8,
82 		.max_buffers = 8,
83 		.max_width = 1920,
84 		.max_height = 1080,
85 		.vdec_ops = &vdec_1_ops,
86 		.codec_ops = &codec_mpeg12_ops,
87 		.firmware_path = "meson/vdec/gxl_mpeg12.bin",
88 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 },
89 		.flags = V4L2_FMT_FLAG_COMPRESSED,
90 	}, {
91 		.pixfmt = V4L2_PIX_FMT_MPEG2,
92 		.min_buffers = 8,
93 		.max_buffers = 8,
94 		.max_width = 1920,
95 		.max_height = 1080,
96 		.vdec_ops = &vdec_1_ops,
97 		.codec_ops = &codec_mpeg12_ops,
98 		.firmware_path = "meson/vdec/gxl_mpeg12.bin",
99 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 },
100 		.flags = V4L2_FMT_FLAG_COMPRESSED,
101 	},
102 };
103 
104 static const struct amvdec_format vdec_formats_gxm[] = {
105 	{
106 		.pixfmt = V4L2_PIX_FMT_VP9,
107 		.min_buffers = 16,
108 		.max_buffers = 24,
109 		.max_width = 3840,
110 		.max_height = 2160,
111 		.vdec_ops = &vdec_hevc_ops,
112 		.codec_ops = &codec_vp9_ops,
113 		.firmware_path = "meson/vdec/gxl_vp9.bin",
114 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 },
115 		.flags = V4L2_FMT_FLAG_COMPRESSED |
116 			 V4L2_FMT_FLAG_DYN_RESOLUTION,
117 	}, {
118 		.pixfmt = V4L2_PIX_FMT_H264,
119 		.min_buffers = 2,
120 		.max_buffers = 24,
121 		.max_width = 3840,
122 		.max_height = 2160,
123 		.vdec_ops = &vdec_1_ops,
124 		.codec_ops = &codec_h264_ops,
125 		.firmware_path = "meson/vdec/gxm_h264.bin",
126 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 },
127 		.flags = V4L2_FMT_FLAG_COMPRESSED |
128 			 V4L2_FMT_FLAG_DYN_RESOLUTION,
129 	}, {
130 		.pixfmt = V4L2_PIX_FMT_MPEG1,
131 		.min_buffers = 8,
132 		.max_buffers = 8,
133 		.max_width = 1920,
134 		.max_height = 1080,
135 		.vdec_ops = &vdec_1_ops,
136 		.codec_ops = &codec_mpeg12_ops,
137 		.firmware_path = "meson/vdec/gxl_mpeg12.bin",
138 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 },
139 		.flags = V4L2_FMT_FLAG_COMPRESSED,
140 	}, {
141 		.pixfmt = V4L2_PIX_FMT_MPEG2,
142 		.min_buffers = 8,
143 		.max_buffers = 8,
144 		.max_width = 1920,
145 		.max_height = 1080,
146 		.vdec_ops = &vdec_1_ops,
147 		.codec_ops = &codec_mpeg12_ops,
148 		.firmware_path = "meson/vdec/gxl_mpeg12.bin",
149 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 },
150 		.flags = V4L2_FMT_FLAG_COMPRESSED,
151 	},
152 };
153 
154 static const struct amvdec_format vdec_formats_g12a[] = {
155 	{
156 		.pixfmt = V4L2_PIX_FMT_VP9,
157 		.min_buffers = 16,
158 		.max_buffers = 24,
159 		.max_width = 3840,
160 		.max_height = 2160,
161 		.vdec_ops = &vdec_hevc_ops,
162 		.codec_ops = &codec_vp9_ops,
163 		.firmware_path = "meson/vdec/g12a_vp9.bin",
164 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 },
165 		.flags = V4L2_FMT_FLAG_COMPRESSED |
166 			 V4L2_FMT_FLAG_DYN_RESOLUTION,
167 	}, {
168 		.pixfmt = V4L2_PIX_FMT_H264,
169 		.min_buffers = 2,
170 		.max_buffers = 24,
171 		.max_width = 3840,
172 		.max_height = 2160,
173 		.vdec_ops = &vdec_1_ops,
174 		.codec_ops = &codec_h264_ops,
175 		.firmware_path = "meson/vdec/g12a_h264.bin",
176 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 },
177 		.flags = V4L2_FMT_FLAG_COMPRESSED |
178 			 V4L2_FMT_FLAG_DYN_RESOLUTION,
179 	}, {
180 		.pixfmt = V4L2_PIX_FMT_MPEG1,
181 		.min_buffers = 8,
182 		.max_buffers = 8,
183 		.max_width = 1920,
184 		.max_height = 1080,
185 		.vdec_ops = &vdec_1_ops,
186 		.codec_ops = &codec_mpeg12_ops,
187 		.firmware_path = "meson/vdec/gxl_mpeg12.bin",
188 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 },
189 		.flags = V4L2_FMT_FLAG_COMPRESSED,
190 	}, {
191 		.pixfmt = V4L2_PIX_FMT_MPEG2,
192 		.min_buffers = 8,
193 		.max_buffers = 8,
194 		.max_width = 1920,
195 		.max_height = 1080,
196 		.vdec_ops = &vdec_1_ops,
197 		.codec_ops = &codec_mpeg12_ops,
198 		.firmware_path = "meson/vdec/gxl_mpeg12.bin",
199 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 },
200 		.flags = V4L2_FMT_FLAG_COMPRESSED,
201 	},
202 };
203 
204 static const struct amvdec_format vdec_formats_sm1[] = {
205 	{
206 		.pixfmt = V4L2_PIX_FMT_VP9,
207 		.min_buffers = 16,
208 		.max_buffers = 24,
209 		.max_width = 3840,
210 		.max_height = 2160,
211 		.vdec_ops = &vdec_hevc_ops,
212 		.codec_ops = &codec_vp9_ops,
213 		.firmware_path = "meson/vdec/sm1_vp9_mmu.bin",
214 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 },
215 		.flags = V4L2_FMT_FLAG_COMPRESSED |
216 			 V4L2_FMT_FLAG_DYN_RESOLUTION,
217 	}, {
218 		.pixfmt = V4L2_PIX_FMT_H264,
219 		.min_buffers = 2,
220 		.max_buffers = 24,
221 		.max_width = 3840,
222 		.max_height = 2160,
223 		.vdec_ops = &vdec_1_ops,
224 		.codec_ops = &codec_h264_ops,
225 		.firmware_path = "meson/vdec/g12a_h264.bin",
226 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, 0 },
227 		.flags = V4L2_FMT_FLAG_COMPRESSED |
228 			 V4L2_FMT_FLAG_DYN_RESOLUTION,
229 	}, {
230 		.pixfmt = V4L2_PIX_FMT_MPEG1,
231 		.min_buffers = 8,
232 		.max_buffers = 8,
233 		.max_width = 1920,
234 		.max_height = 1080,
235 		.vdec_ops = &vdec_1_ops,
236 		.codec_ops = &codec_mpeg12_ops,
237 		.firmware_path = "meson/vdec/gxl_mpeg12.bin",
238 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 },
239 		.flags = V4L2_FMT_FLAG_COMPRESSED,
240 	}, {
241 		.pixfmt = V4L2_PIX_FMT_MPEG2,
242 		.min_buffers = 8,
243 		.max_buffers = 8,
244 		.max_width = 1920,
245 		.max_height = 1080,
246 		.vdec_ops = &vdec_1_ops,
247 		.codec_ops = &codec_mpeg12_ops,
248 		.firmware_path = "meson/vdec/gxl_mpeg12.bin",
249 		.pixfmts_cap = { V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_YUV420M, 0 },
250 		.flags = V4L2_FMT_FLAG_COMPRESSED,
251 	},
252 };
253 
254 const struct vdec_platform vdec_platform_gxbb = {
255 	.formats = vdec_formats_gxbb,
256 	.num_formats = ARRAY_SIZE(vdec_formats_gxbb),
257 	.revision = VDEC_REVISION_GXBB,
258 };
259 
260 const struct vdec_platform vdec_platform_gxl = {
261 	.formats = vdec_formats_gxl,
262 	.num_formats = ARRAY_SIZE(vdec_formats_gxl),
263 	.revision = VDEC_REVISION_GXL,
264 };
265 
266 const struct vdec_platform vdec_platform_gxm = {
267 	.formats = vdec_formats_gxm,
268 	.num_formats = ARRAY_SIZE(vdec_formats_gxm),
269 	.revision = VDEC_REVISION_GXM,
270 };
271 
272 const struct vdec_platform vdec_platform_g12a = {
273 	.formats = vdec_formats_g12a,
274 	.num_formats = ARRAY_SIZE(vdec_formats_g12a),
275 	.revision = VDEC_REVISION_G12A,
276 };
277 
278 const struct vdec_platform vdec_platform_sm1 = {
279 	.formats = vdec_formats_sm1,
280 	.num_formats = ARRAY_SIZE(vdec_formats_sm1),
281 	.revision = VDEC_REVISION_SM1,
282 };
283 
284 MODULE_FIRMWARE("meson/vdec/g12a_h264.bin");
285 MODULE_FIRMWARE("meson/vdec/g12a_vp9.bin");
286 MODULE_FIRMWARE("meson/vdec/gxbb_h264.bin");
287 MODULE_FIRMWARE("meson/vdec/gxl_h264.bin");
288 MODULE_FIRMWARE("meson/vdec/gxl_mpeg12.bin");
289 MODULE_FIRMWARE("meson/vdec/gxl_vp9.bin");
290 MODULE_FIRMWARE("meson/vdec/gxm_h264.bin");
291 MODULE_FIRMWARE("meson/vdec/sm1_vp9_mmu.bin");
292