1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Hantro VPU codec driver
4  *
5  * Copyright (C) 2018 Rockchip Electronics Co., Ltd.
6  *	Jeffy Chen <jeffy.chen@rock-chips.com>
7  */
8 
9 #include <linux/clk.h>
10 
11 #include "hantro.h"
12 #include "hantro_jpeg.h"
13 #include "hantro_g1_regs.h"
14 #include "hantro_h1_regs.h"
15 #include "rockchip_vpu2_regs.h"
16 #include "rockchip_vpu981_regs.h"
17 
18 #define RK3066_ACLK_MAX_FREQ (300 * 1000 * 1000)
19 #define RK3288_ACLK_MAX_FREQ (400 * 1000 * 1000)
20 #define RK3588_ACLK_MAX_FREQ (300 * 1000 * 1000)
21 
22 #define ROCKCHIP_VPU981_MIN_SIZE 64
23 
24 /*
25  * Supported formats.
26  */
27 
28 static const struct hantro_fmt rockchip_vpu_enc_fmts[] = {
29 	{
30 		.fourcc = V4L2_PIX_FMT_YUV420M,
31 		.codec_mode = HANTRO_MODE_NONE,
32 		.enc_fmt = ROCKCHIP_VPU_ENC_FMT_YUV420P,
33 	},
34 	{
35 		.fourcc = V4L2_PIX_FMT_NV12M,
36 		.codec_mode = HANTRO_MODE_NONE,
37 		.enc_fmt = ROCKCHIP_VPU_ENC_FMT_YUV420SP,
38 	},
39 	{
40 		.fourcc = V4L2_PIX_FMT_YUYV,
41 		.codec_mode = HANTRO_MODE_NONE,
42 		.enc_fmt = ROCKCHIP_VPU_ENC_FMT_YUYV422,
43 	},
44 	{
45 		.fourcc = V4L2_PIX_FMT_UYVY,
46 		.codec_mode = HANTRO_MODE_NONE,
47 		.enc_fmt = ROCKCHIP_VPU_ENC_FMT_UYVY422,
48 	},
49 	{
50 		.fourcc = V4L2_PIX_FMT_JPEG,
51 		.codec_mode = HANTRO_MODE_JPEG_ENC,
52 		.max_depth = 2,
53 		.header_size = JPEG_HEADER_SIZE,
54 		.frmsize = {
55 			.min_width = 96,
56 			.max_width = 8192,
57 			.step_width = MB_DIM,
58 			.min_height = 32,
59 			.max_height = 8192,
60 			.step_height = MB_DIM,
61 		},
62 	},
63 };
64 
65 static const struct hantro_fmt rockchip_vpu1_postproc_fmts[] = {
66 	{
67 		.fourcc = V4L2_PIX_FMT_YUYV,
68 		.codec_mode = HANTRO_MODE_NONE,
69 		.postprocessed = true,
70 		.frmsize = {
71 			.min_width = FMT_MIN_WIDTH,
72 			.max_width = FMT_FHD_WIDTH,
73 			.step_width = MB_DIM,
74 			.min_height = FMT_MIN_HEIGHT,
75 			.max_height = FMT_FHD_HEIGHT,
76 			.step_height = MB_DIM,
77 		},
78 	},
79 };
80 
81 static const struct hantro_fmt rockchip_vpu981_postproc_fmts[] = {
82 	{
83 		.fourcc = V4L2_PIX_FMT_NV12,
84 		.codec_mode = HANTRO_MODE_NONE,
85 		.match_depth = true,
86 		.postprocessed = true,
87 		.frmsize = {
88 			.min_width = ROCKCHIP_VPU981_MIN_SIZE,
89 			.max_width = FMT_UHD_WIDTH,
90 			.step_width = MB_DIM,
91 			.min_height = ROCKCHIP_VPU981_MIN_SIZE,
92 			.max_height = FMT_UHD_HEIGHT,
93 			.step_height = MB_DIM,
94 		},
95 	},
96 	{
97 		.fourcc = V4L2_PIX_FMT_P010,
98 		.codec_mode = HANTRO_MODE_NONE,
99 		.match_depth = true,
100 		.postprocessed = true,
101 		.frmsize = {
102 			.min_width = ROCKCHIP_VPU981_MIN_SIZE,
103 			.max_width = FMT_UHD_WIDTH,
104 			.step_width = MB_DIM,
105 			.min_height = ROCKCHIP_VPU981_MIN_SIZE,
106 			.max_height = FMT_UHD_HEIGHT,
107 			.step_height = MB_DIM,
108 		},
109 	},
110 };
111 
112 static const struct hantro_fmt rk3066_vpu_dec_fmts[] = {
113 	{
114 		.fourcc = V4L2_PIX_FMT_NV12,
115 		.codec_mode = HANTRO_MODE_NONE,
116 		.frmsize = {
117 			.min_width = FMT_MIN_WIDTH,
118 			.max_width = FMT_FHD_WIDTH,
119 			.step_width = MB_DIM,
120 			.min_height = FMT_MIN_HEIGHT,
121 			.max_height = FMT_FHD_HEIGHT,
122 			.step_height = MB_DIM,
123 		},
124 	},
125 	{
126 		.fourcc = V4L2_PIX_FMT_H264_SLICE,
127 		.codec_mode = HANTRO_MODE_H264_DEC,
128 		.max_depth = 2,
129 		.frmsize = {
130 			.min_width = FMT_MIN_WIDTH,
131 			.max_width = FMT_FHD_WIDTH,
132 			.step_width = MB_DIM,
133 			.min_height = FMT_MIN_HEIGHT,
134 			.max_height = FMT_FHD_HEIGHT,
135 			.step_height = MB_DIM,
136 		},
137 	},
138 	{
139 		.fourcc = V4L2_PIX_FMT_MPEG2_SLICE,
140 		.codec_mode = HANTRO_MODE_MPEG2_DEC,
141 		.max_depth = 2,
142 		.frmsize = {
143 			.min_width = FMT_MIN_WIDTH,
144 			.max_width = FMT_FHD_WIDTH,
145 			.step_width = MB_DIM,
146 			.min_height = FMT_MIN_HEIGHT,
147 			.max_height = FMT_FHD_HEIGHT,
148 			.step_height = MB_DIM,
149 		},
150 	},
151 	{
152 		.fourcc = V4L2_PIX_FMT_VP8_FRAME,
153 		.codec_mode = HANTRO_MODE_VP8_DEC,
154 		.max_depth = 2,
155 		.frmsize = {
156 			.min_width = FMT_MIN_WIDTH,
157 			.max_width = FMT_FHD_WIDTH,
158 			.step_width = MB_DIM,
159 			.min_height = FMT_MIN_HEIGHT,
160 			.max_height = FMT_FHD_HEIGHT,
161 			.step_height = MB_DIM,
162 		},
163 	},
164 };
165 
166 static const struct hantro_fmt rk3288_vpu_dec_fmts[] = {
167 	{
168 		.fourcc = V4L2_PIX_FMT_NV12,
169 		.codec_mode = HANTRO_MODE_NONE,
170 		.frmsize = {
171 			.min_width = FMT_MIN_WIDTH,
172 			.max_width = FMT_4K_WIDTH,
173 			.step_width = MB_DIM,
174 			.min_height = FMT_MIN_HEIGHT,
175 			.max_height = FMT_4K_HEIGHT,
176 			.step_height = MB_DIM,
177 		},
178 	},
179 	{
180 		.fourcc = V4L2_PIX_FMT_H264_SLICE,
181 		.codec_mode = HANTRO_MODE_H264_DEC,
182 		.max_depth = 2,
183 		.frmsize = {
184 			.min_width = FMT_MIN_WIDTH,
185 			.max_width = FMT_4K_WIDTH,
186 			.step_width = MB_DIM,
187 			.min_height = FMT_MIN_HEIGHT,
188 			.max_height = FMT_4K_HEIGHT,
189 			.step_height = MB_DIM,
190 		},
191 	},
192 	{
193 		.fourcc = V4L2_PIX_FMT_MPEG2_SLICE,
194 		.codec_mode = HANTRO_MODE_MPEG2_DEC,
195 		.max_depth = 2,
196 		.frmsize = {
197 			.min_width = FMT_MIN_WIDTH,
198 			.max_width = FMT_FHD_WIDTH,
199 			.step_width = MB_DIM,
200 			.min_height = FMT_MIN_HEIGHT,
201 			.max_height = FMT_FHD_HEIGHT,
202 			.step_height = MB_DIM,
203 		},
204 	},
205 	{
206 		.fourcc = V4L2_PIX_FMT_VP8_FRAME,
207 		.codec_mode = HANTRO_MODE_VP8_DEC,
208 		.max_depth = 2,
209 		.frmsize = {
210 			.min_width = FMT_MIN_WIDTH,
211 			.max_width = FMT_UHD_WIDTH,
212 			.step_width = MB_DIM,
213 			.min_height = FMT_MIN_HEIGHT,
214 			.max_height = FMT_UHD_HEIGHT,
215 			.step_height = MB_DIM,
216 		},
217 	},
218 };
219 
220 static const struct hantro_fmt rockchip_vdpu2_dec_fmts[] = {
221 	{
222 		.fourcc = V4L2_PIX_FMT_NV12,
223 		.codec_mode = HANTRO_MODE_NONE,
224 		.frmsize = {
225 			.min_width = FMT_MIN_WIDTH,
226 			.max_width = FMT_FHD_WIDTH,
227 			.step_width = MB_DIM,
228 			.min_height = FMT_MIN_HEIGHT,
229 			.max_height = FMT_FHD_HEIGHT,
230 			.step_height = MB_DIM,
231 		},
232 	},
233 	{
234 		.fourcc = V4L2_PIX_FMT_H264_SLICE,
235 		.codec_mode = HANTRO_MODE_H264_DEC,
236 		.max_depth = 2,
237 		.frmsize = {
238 			.min_width = FMT_MIN_WIDTH,
239 			.max_width = FMT_FHD_WIDTH,
240 			.step_width = MB_DIM,
241 			.min_height = FMT_MIN_HEIGHT,
242 			.max_height = FMT_FHD_HEIGHT,
243 			.step_height = MB_DIM,
244 		},
245 	},
246 	{
247 		.fourcc = V4L2_PIX_FMT_MPEG2_SLICE,
248 		.codec_mode = HANTRO_MODE_MPEG2_DEC,
249 		.max_depth = 2,
250 		.frmsize = {
251 			.min_width = FMT_MIN_WIDTH,
252 			.max_width = FMT_FHD_WIDTH,
253 			.step_width = MB_DIM,
254 			.min_height = FMT_MIN_HEIGHT,
255 			.max_height = FMT_FHD_HEIGHT,
256 			.step_height = MB_DIM,
257 		},
258 	},
259 	{
260 		.fourcc = V4L2_PIX_FMT_VP8_FRAME,
261 		.codec_mode = HANTRO_MODE_VP8_DEC,
262 		.max_depth = 2,
263 		.frmsize = {
264 			.min_width = FMT_MIN_WIDTH,
265 			.max_width = FMT_UHD_WIDTH,
266 			.step_width = MB_DIM,
267 			.min_height = FMT_MIN_HEIGHT,
268 			.max_height = FMT_UHD_HEIGHT,
269 			.step_height = MB_DIM,
270 		},
271 	},
272 };
273 
274 static const struct hantro_fmt rk3399_vpu_dec_fmts[] = {
275 	{
276 		.fourcc = V4L2_PIX_FMT_NV12,
277 		.codec_mode = HANTRO_MODE_NONE,
278 		.frmsize = {
279 			.min_width = FMT_MIN_WIDTH,
280 			.max_width = FMT_FHD_WIDTH,
281 			.step_width = MB_DIM,
282 			.min_height = FMT_MIN_HEIGHT,
283 			.max_height = FMT_FHD_HEIGHT,
284 			.step_height = MB_DIM,
285 		},
286 	},
287 	{
288 		.fourcc = V4L2_PIX_FMT_MPEG2_SLICE,
289 		.codec_mode = HANTRO_MODE_MPEG2_DEC,
290 		.max_depth = 2,
291 		.frmsize = {
292 			.min_width = FMT_MIN_WIDTH,
293 			.max_width = FMT_FHD_WIDTH,
294 			.step_width = MB_DIM,
295 			.min_height = FMT_MIN_HEIGHT,
296 			.max_height = FMT_FHD_HEIGHT,
297 			.step_height = MB_DIM,
298 		},
299 	},
300 	{
301 		.fourcc = V4L2_PIX_FMT_VP8_FRAME,
302 		.codec_mode = HANTRO_MODE_VP8_DEC,
303 		.max_depth = 2,
304 		.frmsize = {
305 			.min_width = FMT_MIN_WIDTH,
306 			.max_width = FMT_UHD_WIDTH,
307 			.step_width = MB_DIM,
308 			.min_height = FMT_MIN_HEIGHT,
309 			.max_height = FMT_UHD_HEIGHT,
310 			.step_height = MB_DIM,
311 		},
312 	},
313 };
314 
315 static const struct hantro_fmt rockchip_vpu981_dec_fmts[] = {
316 	{
317 		.fourcc = V4L2_PIX_FMT_NV12_4L4,
318 		.codec_mode = HANTRO_MODE_NONE,
319 		.match_depth = true,
320 		.frmsize = {
321 			.min_width = ROCKCHIP_VPU981_MIN_SIZE,
322 			.max_width = FMT_UHD_WIDTH,
323 			.step_width = MB_DIM,
324 			.min_height = ROCKCHIP_VPU981_MIN_SIZE,
325 			.max_height = FMT_UHD_HEIGHT,
326 			.step_height = MB_DIM,
327 		},
328 	},
329 	{
330 		.fourcc = V4L2_PIX_FMT_NV15_4L4,
331 		.codec_mode = HANTRO_MODE_NONE,
332 		.match_depth = true,
333 		.frmsize = {
334 			.min_width = ROCKCHIP_VPU981_MIN_SIZE,
335 			.max_width = FMT_UHD_WIDTH,
336 			.step_width = MB_DIM,
337 			.min_height = ROCKCHIP_VPU981_MIN_SIZE,
338 			.max_height = FMT_UHD_HEIGHT,
339 			.step_height = MB_DIM,
340 		},
341 	},
342 	{
343 		.fourcc = V4L2_PIX_FMT_AV1_FRAME,
344 		.codec_mode = HANTRO_MODE_AV1_DEC,
345 		.max_depth = 2,
346 		.frmsize = {
347 			.min_width = ROCKCHIP_VPU981_MIN_SIZE,
348 			.max_width = FMT_UHD_WIDTH,
349 			.step_width = MB_DIM,
350 			.min_height = ROCKCHIP_VPU981_MIN_SIZE,
351 			.max_height = FMT_UHD_HEIGHT,
352 			.step_height = MB_DIM,
353 		},
354 	},
355 };
356 
357 static irqreturn_t rockchip_vpu1_vepu_irq(int irq, void *dev_id)
358 {
359 	struct hantro_dev *vpu = dev_id;
360 	enum vb2_buffer_state state;
361 	u32 status;
362 
363 	status = vepu_read(vpu, H1_REG_INTERRUPT);
364 	state = (status & H1_REG_INTERRUPT_FRAME_RDY) ?
365 		VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR;
366 
367 	vepu_write(vpu, 0, H1_REG_INTERRUPT);
368 	vepu_write(vpu, 0, H1_REG_AXI_CTRL);
369 
370 	hantro_irq_done(vpu, state);
371 
372 	return IRQ_HANDLED;
373 }
374 
375 static irqreturn_t rockchip_vpu2_vdpu_irq(int irq, void *dev_id)
376 {
377 	struct hantro_dev *vpu = dev_id;
378 	enum vb2_buffer_state state;
379 	u32 status;
380 
381 	status = vdpu_read(vpu, VDPU_REG_INTERRUPT);
382 	state = (status & VDPU_REG_INTERRUPT_DEC_IRQ) ?
383 		VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR;
384 
385 	vdpu_write(vpu, 0, VDPU_REG_INTERRUPT);
386 	vdpu_write(vpu, 0, VDPU_REG_AXI_CTRL);
387 
388 	hantro_irq_done(vpu, state);
389 
390 	return IRQ_HANDLED;
391 }
392 
393 static irqreturn_t rockchip_vpu2_vepu_irq(int irq, void *dev_id)
394 {
395 	struct hantro_dev *vpu = dev_id;
396 	enum vb2_buffer_state state;
397 	u32 status;
398 
399 	status = vepu_read(vpu, VEPU_REG_INTERRUPT);
400 	state = (status & VEPU_REG_INTERRUPT_FRAME_READY) ?
401 		VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR;
402 
403 	vepu_write(vpu, 0, VEPU_REG_INTERRUPT);
404 	vepu_write(vpu, 0, VEPU_REG_AXI_CTRL);
405 
406 	hantro_irq_done(vpu, state);
407 
408 	return IRQ_HANDLED;
409 }
410 
411 static irqreturn_t rk3588_vpu981_irq(int irq, void *dev_id)
412 {
413 	struct hantro_dev *vpu = dev_id;
414 	enum vb2_buffer_state state;
415 	u32 status;
416 
417 	status = vdpu_read(vpu, AV1_REG_INTERRUPT);
418 	state = (status & AV1_REG_INTERRUPT_DEC_RDY_INT) ?
419 		VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR;
420 
421 	vdpu_write(vpu, 0, AV1_REG_INTERRUPT);
422 	vdpu_write(vpu, AV1_REG_CONFIG_DEC_CLK_GATE_E, AV1_REG_CONFIG);
423 
424 	hantro_irq_done(vpu, state);
425 
426 	return IRQ_HANDLED;
427 }
428 
429 static int rk3036_vpu_hw_init(struct hantro_dev *vpu)
430 {
431 	/* Bump ACLK to max. possible freq. to improve performance. */
432 	clk_set_rate(vpu->clocks[0].clk, RK3066_ACLK_MAX_FREQ);
433 	return 0;
434 }
435 
436 static int rk3066_vpu_hw_init(struct hantro_dev *vpu)
437 {
438 	/* Bump ACLKs to max. possible freq. to improve performance. */
439 	clk_set_rate(vpu->clocks[0].clk, RK3066_ACLK_MAX_FREQ);
440 	clk_set_rate(vpu->clocks[2].clk, RK3066_ACLK_MAX_FREQ);
441 	return 0;
442 }
443 
444 static int rk3588_vpu981_hw_init(struct hantro_dev *vpu)
445 {
446 	/* Bump ACLKs to max. possible freq. to improve performance. */
447 	clk_set_rate(vpu->clocks[0].clk, RK3588_ACLK_MAX_FREQ);
448 	return 0;
449 }
450 
451 static int rockchip_vpu_hw_init(struct hantro_dev *vpu)
452 {
453 	/* Bump ACLK to max. possible freq. to improve performance. */
454 	clk_set_rate(vpu->clocks[0].clk, RK3288_ACLK_MAX_FREQ);
455 	return 0;
456 }
457 
458 static void rk3066_vpu_dec_reset(struct hantro_ctx *ctx)
459 {
460 	struct hantro_dev *vpu = ctx->dev;
461 
462 	vdpu_write(vpu, G1_REG_INTERRUPT_DEC_IRQ_DIS, G1_REG_INTERRUPT);
463 	vdpu_write(vpu, G1_REG_CONFIG_DEC_CLK_GATE_E, G1_REG_CONFIG);
464 }
465 
466 static void rockchip_vpu1_enc_reset(struct hantro_ctx *ctx)
467 {
468 	struct hantro_dev *vpu = ctx->dev;
469 
470 	vepu_write(vpu, H1_REG_INTERRUPT_DIS_BIT, H1_REG_INTERRUPT);
471 	vepu_write(vpu, 0, H1_REG_ENC_CTRL);
472 	vepu_write(vpu, 0, H1_REG_AXI_CTRL);
473 }
474 
475 static void rockchip_vpu2_dec_reset(struct hantro_ctx *ctx)
476 {
477 	struct hantro_dev *vpu = ctx->dev;
478 
479 	vdpu_write(vpu, VDPU_REG_INTERRUPT_DEC_IRQ_DIS, VDPU_REG_INTERRUPT);
480 	vdpu_write(vpu, 0, VDPU_REG_EN_FLAGS);
481 	vdpu_write(vpu, 1, VDPU_REG_SOFT_RESET);
482 }
483 
484 static void rockchip_vpu2_enc_reset(struct hantro_ctx *ctx)
485 {
486 	struct hantro_dev *vpu = ctx->dev;
487 
488 	vepu_write(vpu, VEPU_REG_INTERRUPT_DIS_BIT, VEPU_REG_INTERRUPT);
489 	vepu_write(vpu, 0, VEPU_REG_ENCODE_START);
490 	vepu_write(vpu, 0, VEPU_REG_AXI_CTRL);
491 }
492 
493 /*
494  * Supported codec ops.
495  */
496 static const struct hantro_codec_ops rk3036_vpu_codec_ops[] = {
497 	[HANTRO_MODE_H264_DEC] = {
498 		.run = hantro_g1_h264_dec_run,
499 		.reset = hantro_g1_reset,
500 		.init = hantro_h264_dec_init,
501 		.exit = hantro_h264_dec_exit,
502 	},
503 	[HANTRO_MODE_MPEG2_DEC] = {
504 		.run = hantro_g1_mpeg2_dec_run,
505 		.reset = hantro_g1_reset,
506 		.init = hantro_mpeg2_dec_init,
507 		.exit = hantro_mpeg2_dec_exit,
508 	},
509 	[HANTRO_MODE_VP8_DEC] = {
510 		.run = hantro_g1_vp8_dec_run,
511 		.reset = hantro_g1_reset,
512 		.init = hantro_vp8_dec_init,
513 		.exit = hantro_vp8_dec_exit,
514 	},
515 };
516 
517 static const struct hantro_codec_ops rk3066_vpu_codec_ops[] = {
518 	[HANTRO_MODE_JPEG_ENC] = {
519 		.run = hantro_h1_jpeg_enc_run,
520 		.reset = rockchip_vpu1_enc_reset,
521 		.done = hantro_h1_jpeg_enc_done,
522 	},
523 	[HANTRO_MODE_H264_DEC] = {
524 		.run = hantro_g1_h264_dec_run,
525 		.reset = rk3066_vpu_dec_reset,
526 		.init = hantro_h264_dec_init,
527 		.exit = hantro_h264_dec_exit,
528 	},
529 	[HANTRO_MODE_MPEG2_DEC] = {
530 		.run = hantro_g1_mpeg2_dec_run,
531 		.reset = rk3066_vpu_dec_reset,
532 		.init = hantro_mpeg2_dec_init,
533 		.exit = hantro_mpeg2_dec_exit,
534 	},
535 	[HANTRO_MODE_VP8_DEC] = {
536 		.run = hantro_g1_vp8_dec_run,
537 		.reset = rk3066_vpu_dec_reset,
538 		.init = hantro_vp8_dec_init,
539 		.exit = hantro_vp8_dec_exit,
540 	},
541 };
542 
543 static const struct hantro_codec_ops rk3288_vpu_codec_ops[] = {
544 	[HANTRO_MODE_JPEG_ENC] = {
545 		.run = hantro_h1_jpeg_enc_run,
546 		.reset = rockchip_vpu1_enc_reset,
547 		.done = hantro_h1_jpeg_enc_done,
548 	},
549 	[HANTRO_MODE_H264_DEC] = {
550 		.run = hantro_g1_h264_dec_run,
551 		.reset = hantro_g1_reset,
552 		.init = hantro_h264_dec_init,
553 		.exit = hantro_h264_dec_exit,
554 	},
555 	[HANTRO_MODE_MPEG2_DEC] = {
556 		.run = hantro_g1_mpeg2_dec_run,
557 		.reset = hantro_g1_reset,
558 		.init = hantro_mpeg2_dec_init,
559 		.exit = hantro_mpeg2_dec_exit,
560 	},
561 	[HANTRO_MODE_VP8_DEC] = {
562 		.run = hantro_g1_vp8_dec_run,
563 		.reset = hantro_g1_reset,
564 		.init = hantro_vp8_dec_init,
565 		.exit = hantro_vp8_dec_exit,
566 	},
567 };
568 
569 static const struct hantro_codec_ops rk3399_vpu_codec_ops[] = {
570 	[HANTRO_MODE_JPEG_ENC] = {
571 		.run = rockchip_vpu2_jpeg_enc_run,
572 		.reset = rockchip_vpu2_enc_reset,
573 		.done = rockchip_vpu2_jpeg_enc_done,
574 	},
575 	[HANTRO_MODE_H264_DEC] = {
576 		.run = rockchip_vpu2_h264_dec_run,
577 		.reset = rockchip_vpu2_dec_reset,
578 		.init = hantro_h264_dec_init,
579 		.exit = hantro_h264_dec_exit,
580 	},
581 	[HANTRO_MODE_MPEG2_DEC] = {
582 		.run = rockchip_vpu2_mpeg2_dec_run,
583 		.reset = rockchip_vpu2_dec_reset,
584 		.init = hantro_mpeg2_dec_init,
585 		.exit = hantro_mpeg2_dec_exit,
586 	},
587 	[HANTRO_MODE_VP8_DEC] = {
588 		.run = rockchip_vpu2_vp8_dec_run,
589 		.reset = rockchip_vpu2_dec_reset,
590 		.init = hantro_vp8_dec_init,
591 		.exit = hantro_vp8_dec_exit,
592 	},
593 };
594 
595 static const struct hantro_codec_ops rk3568_vepu_codec_ops[] = {
596 	[HANTRO_MODE_JPEG_ENC] = {
597 		.run = rockchip_vpu2_jpeg_enc_run,
598 		.reset = rockchip_vpu2_enc_reset,
599 		.done = rockchip_vpu2_jpeg_enc_done,
600 	},
601 };
602 
603 static const struct hantro_codec_ops rk3588_vpu981_codec_ops[] = {
604 	[HANTRO_MODE_AV1_DEC] = {
605 		.run = rockchip_vpu981_av1_dec_run,
606 		.init = rockchip_vpu981_av1_dec_init,
607 		.exit = rockchip_vpu981_av1_dec_exit,
608 		.done = rockchip_vpu981_av1_dec_done,
609 	},
610 };
611 /*
612  * VPU variant.
613  */
614 
615 static const struct hantro_irq rockchip_vdpu1_irqs[] = {
616 	{ "vdpu", hantro_g1_irq },
617 };
618 
619 static const struct hantro_irq rockchip_vpu1_irqs[] = {
620 	{ "vepu", rockchip_vpu1_vepu_irq },
621 	{ "vdpu", hantro_g1_irq },
622 };
623 
624 static const struct hantro_irq rockchip_vdpu2_irqs[] = {
625 	{ "vdpu", rockchip_vpu2_vdpu_irq },
626 };
627 
628 static const struct hantro_irq rockchip_vpu2_irqs[] = {
629 	{ "vepu", rockchip_vpu2_vepu_irq },
630 	{ "vdpu", rockchip_vpu2_vdpu_irq },
631 };
632 
633 static const struct hantro_irq rk3568_vepu_irqs[] = {
634 	{ "vepu", rockchip_vpu2_vepu_irq },
635 };
636 
637 static const char * const rk3066_vpu_clk_names[] = {
638 	"aclk_vdpu", "hclk_vdpu",
639 	"aclk_vepu", "hclk_vepu"
640 };
641 
642 static const struct hantro_irq rk3588_vpu981_irqs[] = {
643 	{ "vdpu", rk3588_vpu981_irq },
644 };
645 
646 static const char * const rockchip_vpu_clk_names[] = {
647 	"aclk", "hclk"
648 };
649 
650 static const char * const rk3588_vpu981_vpu_clk_names[] = {
651 	"aclk", "hclk", "aclk_vdpu_root", "hclk_vdpu_root"
652 };
653 
654 /* VDPU1/VEPU1 */
655 
656 const struct hantro_variant rk3036_vpu_variant = {
657 	.dec_offset = 0x400,
658 	.dec_fmts = rk3066_vpu_dec_fmts,
659 	.num_dec_fmts = ARRAY_SIZE(rk3066_vpu_dec_fmts),
660 	.postproc_fmts = rockchip_vpu1_postproc_fmts,
661 	.num_postproc_fmts = ARRAY_SIZE(rockchip_vpu1_postproc_fmts),
662 	.postproc_ops = &hantro_g1_postproc_ops,
663 	.codec = HANTRO_MPEG2_DECODER | HANTRO_VP8_DECODER |
664 		 HANTRO_H264_DECODER,
665 	.codec_ops = rk3036_vpu_codec_ops,
666 	.irqs = rockchip_vdpu1_irqs,
667 	.num_irqs = ARRAY_SIZE(rockchip_vdpu1_irqs),
668 	.init = rk3036_vpu_hw_init,
669 	.clk_names = rockchip_vpu_clk_names,
670 	.num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names)
671 };
672 
673 /*
674  * Despite this variant has separate clocks for decoder and encoder,
675  * it's still required to enable all four of them for either decoding
676  * or encoding and we can't split it in separate g1/h1 variants.
677  */
678 const struct hantro_variant rk3066_vpu_variant = {
679 	.enc_offset = 0x0,
680 	.enc_fmts = rockchip_vpu_enc_fmts,
681 	.num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts),
682 	.dec_offset = 0x400,
683 	.dec_fmts = rk3066_vpu_dec_fmts,
684 	.num_dec_fmts = ARRAY_SIZE(rk3066_vpu_dec_fmts),
685 	.postproc_fmts = rockchip_vpu1_postproc_fmts,
686 	.num_postproc_fmts = ARRAY_SIZE(rockchip_vpu1_postproc_fmts),
687 	.postproc_ops = &hantro_g1_postproc_ops,
688 	.codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER |
689 		 HANTRO_VP8_DECODER | HANTRO_H264_DECODER,
690 	.codec_ops = rk3066_vpu_codec_ops,
691 	.irqs = rockchip_vpu1_irqs,
692 	.num_irqs = ARRAY_SIZE(rockchip_vpu1_irqs),
693 	.init = rk3066_vpu_hw_init,
694 	.clk_names = rk3066_vpu_clk_names,
695 	.num_clocks = ARRAY_SIZE(rk3066_vpu_clk_names)
696 };
697 
698 const struct hantro_variant rk3288_vpu_variant = {
699 	.enc_offset = 0x0,
700 	.enc_fmts = rockchip_vpu_enc_fmts,
701 	.num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts),
702 	.dec_offset = 0x400,
703 	.dec_fmts = rk3288_vpu_dec_fmts,
704 	.num_dec_fmts = ARRAY_SIZE(rk3288_vpu_dec_fmts),
705 	.postproc_fmts = rockchip_vpu1_postproc_fmts,
706 	.num_postproc_fmts = ARRAY_SIZE(rockchip_vpu1_postproc_fmts),
707 	.postproc_ops = &hantro_g1_postproc_ops,
708 	.codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER |
709 		 HANTRO_VP8_DECODER | HANTRO_H264_DECODER,
710 	.codec_ops = rk3288_vpu_codec_ops,
711 	.irqs = rockchip_vpu1_irqs,
712 	.num_irqs = ARRAY_SIZE(rockchip_vpu1_irqs),
713 	.init = rockchip_vpu_hw_init,
714 	.clk_names = rockchip_vpu_clk_names,
715 	.num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names)
716 };
717 
718 /* VDPU2/VEPU2 */
719 
720 const struct hantro_variant rk3328_vpu_variant = {
721 	.dec_offset = 0x400,
722 	.dec_fmts = rockchip_vdpu2_dec_fmts,
723 	.num_dec_fmts = ARRAY_SIZE(rockchip_vdpu2_dec_fmts),
724 	.codec = HANTRO_MPEG2_DECODER | HANTRO_VP8_DECODER |
725 		 HANTRO_H264_DECODER,
726 	.codec_ops = rk3399_vpu_codec_ops,
727 	.irqs = rockchip_vdpu2_irqs,
728 	.num_irqs = ARRAY_SIZE(rockchip_vdpu2_irqs),
729 	.init = rockchip_vpu_hw_init,
730 	.clk_names = rockchip_vpu_clk_names,
731 	.num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names),
732 };
733 
734 /*
735  * H.264 decoding explicitly disabled in RK3399.
736  * This ensures userspace applications use the Rockchip VDEC core,
737  * which has better performance.
738  */
739 const struct hantro_variant rk3399_vpu_variant = {
740 	.enc_offset = 0x0,
741 	.enc_fmts = rockchip_vpu_enc_fmts,
742 	.num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts),
743 	.dec_offset = 0x400,
744 	.dec_fmts = rk3399_vpu_dec_fmts,
745 	.num_dec_fmts = ARRAY_SIZE(rk3399_vpu_dec_fmts),
746 	.codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER |
747 		 HANTRO_VP8_DECODER,
748 	.codec_ops = rk3399_vpu_codec_ops,
749 	.irqs = rockchip_vpu2_irqs,
750 	.num_irqs = ARRAY_SIZE(rockchip_vpu2_irqs),
751 	.init = rockchip_vpu_hw_init,
752 	.clk_names = rockchip_vpu_clk_names,
753 	.num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names)
754 };
755 
756 const struct hantro_variant rk3568_vepu_variant = {
757 	.enc_offset = 0x0,
758 	.enc_fmts = rockchip_vpu_enc_fmts,
759 	.num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts),
760 	.codec = HANTRO_JPEG_ENCODER,
761 	.codec_ops = rk3568_vepu_codec_ops,
762 	.irqs = rk3568_vepu_irqs,
763 	.num_irqs = ARRAY_SIZE(rk3568_vepu_irqs),
764 	.init = rockchip_vpu_hw_init,
765 	.clk_names = rockchip_vpu_clk_names,
766 	.num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names)
767 };
768 
769 const struct hantro_variant rk3568_vpu_variant = {
770 	.dec_offset = 0x400,
771 	.dec_fmts = rockchip_vdpu2_dec_fmts,
772 	.num_dec_fmts = ARRAY_SIZE(rockchip_vdpu2_dec_fmts),
773 	.codec = HANTRO_MPEG2_DECODER |
774 		 HANTRO_VP8_DECODER | HANTRO_H264_DECODER,
775 	.codec_ops = rk3399_vpu_codec_ops,
776 	.irqs = rockchip_vdpu2_irqs,
777 	.num_irqs = ARRAY_SIZE(rockchip_vdpu2_irqs),
778 	.init = rockchip_vpu_hw_init,
779 	.clk_names = rockchip_vpu_clk_names,
780 	.num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names)
781 };
782 
783 const struct hantro_variant px30_vpu_variant = {
784 	.enc_offset = 0x0,
785 	.enc_fmts = rockchip_vpu_enc_fmts,
786 	.num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts),
787 	.dec_offset = 0x400,
788 	.dec_fmts = rockchip_vdpu2_dec_fmts,
789 	.num_dec_fmts = ARRAY_SIZE(rockchip_vdpu2_dec_fmts),
790 	.codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER |
791 		 HANTRO_VP8_DECODER | HANTRO_H264_DECODER,
792 	.codec_ops = rk3399_vpu_codec_ops,
793 	.irqs = rockchip_vpu2_irqs,
794 	.num_irqs = ARRAY_SIZE(rockchip_vpu2_irqs),
795 	.init = rk3036_vpu_hw_init,
796 	.clk_names = rockchip_vpu_clk_names,
797 	.num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names)
798 };
799 
800 const struct hantro_variant rk3588_vpu981_variant = {
801 	.dec_offset = 0x0,
802 	.dec_fmts = rockchip_vpu981_dec_fmts,
803 	.num_dec_fmts = ARRAY_SIZE(rockchip_vpu981_dec_fmts),
804 	.postproc_fmts = rockchip_vpu981_postproc_fmts,
805 	.num_postproc_fmts = ARRAY_SIZE(rockchip_vpu981_postproc_fmts),
806 	.postproc_ops = &rockchip_vpu981_postproc_ops,
807 	.codec = HANTRO_AV1_DECODER,
808 	.codec_ops = rk3588_vpu981_codec_ops,
809 	.irqs = rk3588_vpu981_irqs,
810 	.num_irqs = ARRAY_SIZE(rk3588_vpu981_irqs),
811 	.init = rk3588_vpu981_hw_init,
812 	.clk_names = rk3588_vpu981_vpu_clk_names,
813 	.num_clocks = ARRAY_SIZE(rk3588_vpu981_vpu_clk_names)
814 };
815