xref: /linux/drivers/media/platform/verisilicon/rockchip_vpu_hw.c (revision e0c0ab04f6785abaa71b9b8dc252cb1a2072c225)
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 		.postprocessed = true,
86 		.frmsize = {
87 			.min_width = ROCKCHIP_VPU981_MIN_SIZE,
88 			.max_width = FMT_4K_WIDTH,
89 			.step_width = MB_DIM,
90 			.min_height = ROCKCHIP_VPU981_MIN_SIZE,
91 			.max_height = FMT_4K_HEIGHT,
92 			.step_height = MB_DIM,
93 		},
94 	},
95 	{
96 		.fourcc = V4L2_PIX_FMT_NV15,
97 		.codec_mode = HANTRO_MODE_NONE,
98 		.match_depth = true,
99 		.postprocessed = true,
100 		.frmsize = {
101 			.min_width = ROCKCHIP_VPU981_MIN_SIZE,
102 			.max_width = FMT_4K_WIDTH,
103 			.step_width = MB_DIM,
104 			.min_height = ROCKCHIP_VPU981_MIN_SIZE,
105 			.max_height = FMT_4K_HEIGHT,
106 			.step_height = MB_DIM,
107 		},
108 	},
109 	{
110 		.fourcc = V4L2_PIX_FMT_P010,
111 		.codec_mode = HANTRO_MODE_NONE,
112 		.match_depth = true,
113 		.postprocessed = true,
114 		.frmsize = {
115 			.min_width = ROCKCHIP_VPU981_MIN_SIZE,
116 			.max_width = FMT_4K_WIDTH,
117 			.step_width = MB_DIM,
118 			.min_height = ROCKCHIP_VPU981_MIN_SIZE,
119 			.max_height = FMT_4K_HEIGHT,
120 			.step_height = MB_DIM,
121 		},
122 	},
123 };
124 
125 static const struct hantro_fmt rk3066_vpu_dec_fmts[] = {
126 	{
127 		.fourcc = V4L2_PIX_FMT_NV12,
128 		.codec_mode = HANTRO_MODE_NONE,
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_H264_SLICE,
140 		.codec_mode = HANTRO_MODE_H264_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_MPEG2_SLICE,
153 		.codec_mode = HANTRO_MODE_MPEG2_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 		.fourcc = V4L2_PIX_FMT_VP8_FRAME,
166 		.codec_mode = HANTRO_MODE_VP8_DEC,
167 		.max_depth = 2,
168 		.frmsize = {
169 			.min_width = FMT_MIN_WIDTH,
170 			.max_width = FMT_FHD_WIDTH,
171 			.step_width = MB_DIM,
172 			.min_height = FMT_MIN_HEIGHT,
173 			.max_height = FMT_FHD_HEIGHT,
174 			.step_height = MB_DIM,
175 		},
176 	},
177 };
178 
179 static const struct hantro_fmt rk3288_vpu_dec_fmts[] = {
180 	{
181 		.fourcc = V4L2_PIX_FMT_NV12,
182 		.codec_mode = HANTRO_MODE_NONE,
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_H264_SLICE,
194 		.codec_mode = HANTRO_MODE_H264_DEC,
195 		.max_depth = 2,
196 		.frmsize = {
197 			.min_width = FMT_MIN_WIDTH,
198 			.max_width = FMT_4K_WIDTH,
199 			.step_width = MB_DIM,
200 			.min_height = FMT_MIN_HEIGHT,
201 			.max_height = FMT_4K_HEIGHT,
202 			.step_height = MB_DIM,
203 		},
204 	},
205 	{
206 		.fourcc = V4L2_PIX_FMT_MPEG2_SLICE,
207 		.codec_mode = HANTRO_MODE_MPEG2_DEC,
208 		.max_depth = 2,
209 		.frmsize = {
210 			.min_width = FMT_MIN_WIDTH,
211 			.max_width = FMT_FHD_WIDTH,
212 			.step_width = MB_DIM,
213 			.min_height = FMT_MIN_HEIGHT,
214 			.max_height = FMT_FHD_HEIGHT,
215 			.step_height = MB_DIM,
216 		},
217 	},
218 	{
219 		.fourcc = V4L2_PIX_FMT_VP8_FRAME,
220 		.codec_mode = HANTRO_MODE_VP8_DEC,
221 		.max_depth = 2,
222 		.frmsize = {
223 			.min_width = FMT_MIN_WIDTH,
224 			.max_width = FMT_UHD_WIDTH,
225 			.step_width = MB_DIM,
226 			.min_height = FMT_MIN_HEIGHT,
227 			.max_height = FMT_UHD_HEIGHT,
228 			.step_height = MB_DIM,
229 		},
230 	},
231 };
232 
233 static const struct hantro_fmt rockchip_vdpu2_dec_fmts[] = {
234 	{
235 		.fourcc = V4L2_PIX_FMT_NV12,
236 		.codec_mode = HANTRO_MODE_NONE,
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_H264_SLICE,
248 		.codec_mode = HANTRO_MODE_H264_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_MPEG2_SLICE,
261 		.codec_mode = HANTRO_MODE_MPEG2_DEC,
262 		.max_depth = 2,
263 		.frmsize = {
264 			.min_width = FMT_MIN_WIDTH,
265 			.max_width = FMT_FHD_WIDTH,
266 			.step_width = MB_DIM,
267 			.min_height = FMT_MIN_HEIGHT,
268 			.max_height = FMT_FHD_HEIGHT,
269 			.step_height = MB_DIM,
270 		},
271 	},
272 	{
273 		.fourcc = V4L2_PIX_FMT_VP8_FRAME,
274 		.codec_mode = HANTRO_MODE_VP8_DEC,
275 		.max_depth = 2,
276 		.frmsize = {
277 			.min_width = FMT_MIN_WIDTH,
278 			.max_width = FMT_UHD_WIDTH,
279 			.step_width = MB_DIM,
280 			.min_height = FMT_MIN_HEIGHT,
281 			.max_height = FMT_UHD_HEIGHT,
282 			.step_height = MB_DIM,
283 		},
284 	},
285 };
286 
287 static const struct hantro_fmt rk3399_vpu_dec_fmts[] = {
288 	{
289 		.fourcc = V4L2_PIX_FMT_NV12,
290 		.codec_mode = HANTRO_MODE_NONE,
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_MPEG2_SLICE,
302 		.codec_mode = HANTRO_MODE_MPEG2_DEC,
303 		.max_depth = 2,
304 		.frmsize = {
305 			.min_width = FMT_MIN_WIDTH,
306 			.max_width = FMT_FHD_WIDTH,
307 			.step_width = MB_DIM,
308 			.min_height = FMT_MIN_HEIGHT,
309 			.max_height = FMT_FHD_HEIGHT,
310 			.step_height = MB_DIM,
311 		},
312 	},
313 	{
314 		.fourcc = V4L2_PIX_FMT_VP8_FRAME,
315 		.codec_mode = HANTRO_MODE_VP8_DEC,
316 		.max_depth = 2,
317 		.frmsize = {
318 			.min_width = FMT_MIN_WIDTH,
319 			.max_width = FMT_UHD_WIDTH,
320 			.step_width = MB_DIM,
321 			.min_height = FMT_MIN_HEIGHT,
322 			.max_height = FMT_UHD_HEIGHT,
323 			.step_height = MB_DIM,
324 		},
325 	},
326 };
327 
328 static const struct hantro_fmt rockchip_vpu981_dec_fmts[] = {
329 	{
330 		.fourcc = V4L2_PIX_FMT_NV12_4L4,
331 		.codec_mode = HANTRO_MODE_NONE,
332 		.match_depth = true,
333 		.frmsize = {
334 			.min_width = ROCKCHIP_VPU981_MIN_SIZE,
335 			.max_width = FMT_4K_WIDTH,
336 			.step_width = MB_DIM,
337 			.min_height = ROCKCHIP_VPU981_MIN_SIZE,
338 			.max_height = FMT_4K_HEIGHT,
339 			.step_height = MB_DIM,
340 		},
341 	},
342 	{
343 		.fourcc = V4L2_PIX_FMT_NV15_4L4,
344 		.codec_mode = HANTRO_MODE_NONE,
345 		.match_depth = true,
346 		.frmsize = {
347 			.min_width = ROCKCHIP_VPU981_MIN_SIZE,
348 			.max_width = FMT_4K_WIDTH,
349 			.step_width = MB_DIM,
350 			.min_height = ROCKCHIP_VPU981_MIN_SIZE,
351 			.max_height = FMT_4K_HEIGHT,
352 			.step_height = MB_DIM,
353 		},
354 	},
355 	{
356 		.fourcc = V4L2_PIX_FMT_AV1_FRAME,
357 		.codec_mode = HANTRO_MODE_AV1_DEC,
358 		.max_depth = 2,
359 		.frmsize = {
360 			.min_width = ROCKCHIP_VPU981_MIN_SIZE,
361 			.max_width = FMT_4K_WIDTH,
362 			.step_width = MB_DIM,
363 			.min_height = ROCKCHIP_VPU981_MIN_SIZE,
364 			.max_height = FMT_4K_HEIGHT,
365 			.step_height = MB_DIM,
366 		},
367 	},
368 };
369 
370 static irqreturn_t rockchip_vpu1_vepu_irq(int irq, void *dev_id)
371 {
372 	struct hantro_dev *vpu = dev_id;
373 	enum vb2_buffer_state state;
374 	u32 status;
375 
376 	status = vepu_read(vpu, H1_REG_INTERRUPT);
377 	state = (status & H1_REG_INTERRUPT_FRAME_RDY) ?
378 		VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR;
379 
380 	vepu_write(vpu, 0, H1_REG_INTERRUPT);
381 	vepu_write(vpu, 0, H1_REG_AXI_CTRL);
382 
383 	hantro_irq_done(vpu, state);
384 
385 	return IRQ_HANDLED;
386 }
387 
388 static irqreturn_t rockchip_vpu2_vdpu_irq(int irq, void *dev_id)
389 {
390 	struct hantro_dev *vpu = dev_id;
391 	enum vb2_buffer_state state;
392 	u32 status;
393 
394 	status = vdpu_read(vpu, VDPU_REG_INTERRUPT);
395 	state = (status & VDPU_REG_INTERRUPT_DEC_IRQ) ?
396 		VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR;
397 
398 	vdpu_write(vpu, 0, VDPU_REG_INTERRUPT);
399 	vdpu_write(vpu, 0, VDPU_REG_AXI_CTRL);
400 
401 	hantro_irq_done(vpu, state);
402 
403 	return IRQ_HANDLED;
404 }
405 
406 static irqreturn_t rockchip_vpu2_vepu_irq(int irq, void *dev_id)
407 {
408 	struct hantro_dev *vpu = dev_id;
409 	enum vb2_buffer_state state;
410 	u32 status;
411 
412 	status = vepu_read(vpu, VEPU_REG_INTERRUPT);
413 	state = (status & VEPU_REG_INTERRUPT_FRAME_READY) ?
414 		VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR;
415 
416 	vepu_write(vpu, 0, VEPU_REG_INTERRUPT);
417 	vepu_write(vpu, 0, VEPU_REG_AXI_CTRL);
418 
419 	hantro_irq_done(vpu, state);
420 
421 	return IRQ_HANDLED;
422 }
423 
424 static irqreturn_t rk3588_vpu981_irq(int irq, void *dev_id)
425 {
426 	struct hantro_dev *vpu = dev_id;
427 	enum vb2_buffer_state state;
428 	u32 status;
429 
430 	status = vdpu_read(vpu, AV1_REG_INTERRUPT);
431 	state = (status & AV1_REG_INTERRUPT_DEC_RDY_INT) ?
432 		VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR;
433 
434 	vdpu_write(vpu, 0, AV1_REG_INTERRUPT);
435 	vdpu_write(vpu, AV1_REG_CONFIG_DEC_CLK_GATE_E, AV1_REG_CONFIG);
436 
437 	hantro_irq_done(vpu, state);
438 
439 	return IRQ_HANDLED;
440 }
441 
442 static int rk3036_vpu_hw_init(struct hantro_dev *vpu)
443 {
444 	/* Bump ACLK to max. possible freq. to improve performance. */
445 	clk_set_rate(vpu->clocks[0].clk, RK3066_ACLK_MAX_FREQ);
446 	return 0;
447 }
448 
449 static int rk3066_vpu_hw_init(struct hantro_dev *vpu)
450 {
451 	/* Bump ACLKs to max. possible freq. to improve performance. */
452 	clk_set_rate(vpu->clocks[0].clk, RK3066_ACLK_MAX_FREQ);
453 	clk_set_rate(vpu->clocks[2].clk, RK3066_ACLK_MAX_FREQ);
454 	return 0;
455 }
456 
457 static int rk3588_vpu981_hw_init(struct hantro_dev *vpu)
458 {
459 	/* Bump ACLKs to max. possible freq. to improve performance. */
460 	clk_set_rate(vpu->clocks[0].clk, RK3588_ACLK_MAX_FREQ);
461 	return 0;
462 }
463 
464 static int rockchip_vpu_hw_init(struct hantro_dev *vpu)
465 {
466 	/* Bump ACLK to max. possible freq. to improve performance. */
467 	clk_set_rate(vpu->clocks[0].clk, RK3288_ACLK_MAX_FREQ);
468 	return 0;
469 }
470 
471 static void rk3066_vpu_dec_reset(struct hantro_ctx *ctx)
472 {
473 	struct hantro_dev *vpu = ctx->dev;
474 
475 	vdpu_write(vpu, G1_REG_INTERRUPT_DEC_IRQ_DIS, G1_REG_INTERRUPT);
476 	vdpu_write(vpu, G1_REG_CONFIG_DEC_CLK_GATE_E, G1_REG_CONFIG);
477 }
478 
479 static void rockchip_vpu1_enc_reset(struct hantro_ctx *ctx)
480 {
481 	struct hantro_dev *vpu = ctx->dev;
482 
483 	vepu_write(vpu, H1_REG_INTERRUPT_DIS_BIT, H1_REG_INTERRUPT);
484 	vepu_write(vpu, 0, H1_REG_ENC_CTRL);
485 	vepu_write(vpu, 0, H1_REG_AXI_CTRL);
486 }
487 
488 static void rockchip_vpu2_dec_reset(struct hantro_ctx *ctx)
489 {
490 	struct hantro_dev *vpu = ctx->dev;
491 
492 	vdpu_write(vpu, VDPU_REG_INTERRUPT_DEC_IRQ_DIS, VDPU_REG_INTERRUPT);
493 	vdpu_write(vpu, 0, VDPU_REG_EN_FLAGS);
494 	vdpu_write(vpu, 1, VDPU_REG_SOFT_RESET);
495 }
496 
497 static void rockchip_vpu2_enc_reset(struct hantro_ctx *ctx)
498 {
499 	struct hantro_dev *vpu = ctx->dev;
500 
501 	vepu_write(vpu, VEPU_REG_INTERRUPT_DIS_BIT, VEPU_REG_INTERRUPT);
502 	vepu_write(vpu, 0, VEPU_REG_ENCODE_START);
503 	vepu_write(vpu, 0, VEPU_REG_AXI_CTRL);
504 }
505 
506 /*
507  * Supported codec ops.
508  */
509 static const struct hantro_codec_ops rk3036_vpu_codec_ops[] = {
510 	[HANTRO_MODE_H264_DEC] = {
511 		.run = hantro_g1_h264_dec_run,
512 		.reset = hantro_g1_reset,
513 		.init = hantro_h264_dec_init,
514 		.exit = hantro_h264_dec_exit,
515 	},
516 	[HANTRO_MODE_MPEG2_DEC] = {
517 		.run = hantro_g1_mpeg2_dec_run,
518 		.reset = hantro_g1_reset,
519 		.init = hantro_mpeg2_dec_init,
520 		.exit = hantro_mpeg2_dec_exit,
521 	},
522 	[HANTRO_MODE_VP8_DEC] = {
523 		.run = hantro_g1_vp8_dec_run,
524 		.reset = hantro_g1_reset,
525 		.init = hantro_vp8_dec_init,
526 		.exit = hantro_vp8_dec_exit,
527 	},
528 };
529 
530 static const struct hantro_codec_ops rk3066_vpu_codec_ops[] = {
531 	[HANTRO_MODE_JPEG_ENC] = {
532 		.run = hantro_h1_jpeg_enc_run,
533 		.reset = rockchip_vpu1_enc_reset,
534 		.done = hantro_h1_jpeg_enc_done,
535 	},
536 	[HANTRO_MODE_H264_DEC] = {
537 		.run = hantro_g1_h264_dec_run,
538 		.reset = rk3066_vpu_dec_reset,
539 		.init = hantro_h264_dec_init,
540 		.exit = hantro_h264_dec_exit,
541 	},
542 	[HANTRO_MODE_MPEG2_DEC] = {
543 		.run = hantro_g1_mpeg2_dec_run,
544 		.reset = rk3066_vpu_dec_reset,
545 		.init = hantro_mpeg2_dec_init,
546 		.exit = hantro_mpeg2_dec_exit,
547 	},
548 	[HANTRO_MODE_VP8_DEC] = {
549 		.run = hantro_g1_vp8_dec_run,
550 		.reset = rk3066_vpu_dec_reset,
551 		.init = hantro_vp8_dec_init,
552 		.exit = hantro_vp8_dec_exit,
553 	},
554 };
555 
556 static const struct hantro_codec_ops rk3288_vpu_codec_ops[] = {
557 	[HANTRO_MODE_JPEG_ENC] = {
558 		.run = hantro_h1_jpeg_enc_run,
559 		.reset = rockchip_vpu1_enc_reset,
560 		.done = hantro_h1_jpeg_enc_done,
561 	},
562 	[HANTRO_MODE_H264_DEC] = {
563 		.run = hantro_g1_h264_dec_run,
564 		.reset = hantro_g1_reset,
565 		.init = hantro_h264_dec_init,
566 		.exit = hantro_h264_dec_exit,
567 	},
568 	[HANTRO_MODE_MPEG2_DEC] = {
569 		.run = hantro_g1_mpeg2_dec_run,
570 		.reset = hantro_g1_reset,
571 		.init = hantro_mpeg2_dec_init,
572 		.exit = hantro_mpeg2_dec_exit,
573 	},
574 	[HANTRO_MODE_VP8_DEC] = {
575 		.run = hantro_g1_vp8_dec_run,
576 		.reset = hantro_g1_reset,
577 		.init = hantro_vp8_dec_init,
578 		.exit = hantro_vp8_dec_exit,
579 	},
580 };
581 
582 static const struct hantro_codec_ops rk3399_vpu_codec_ops[] = {
583 	[HANTRO_MODE_JPEG_ENC] = {
584 		.run = rockchip_vpu2_jpeg_enc_run,
585 		.reset = rockchip_vpu2_enc_reset,
586 		.done = rockchip_vpu2_jpeg_enc_done,
587 	},
588 	[HANTRO_MODE_H264_DEC] = {
589 		.run = rockchip_vpu2_h264_dec_run,
590 		.reset = rockchip_vpu2_dec_reset,
591 		.init = hantro_h264_dec_init,
592 		.exit = hantro_h264_dec_exit,
593 	},
594 	[HANTRO_MODE_MPEG2_DEC] = {
595 		.run = rockchip_vpu2_mpeg2_dec_run,
596 		.reset = rockchip_vpu2_dec_reset,
597 		.init = hantro_mpeg2_dec_init,
598 		.exit = hantro_mpeg2_dec_exit,
599 	},
600 	[HANTRO_MODE_VP8_DEC] = {
601 		.run = rockchip_vpu2_vp8_dec_run,
602 		.reset = rockchip_vpu2_dec_reset,
603 		.init = hantro_vp8_dec_init,
604 		.exit = hantro_vp8_dec_exit,
605 	},
606 };
607 
608 static const struct hantro_codec_ops rk3568_vepu_codec_ops[] = {
609 	[HANTRO_MODE_JPEG_ENC] = {
610 		.run = rockchip_vpu2_jpeg_enc_run,
611 		.reset = rockchip_vpu2_enc_reset,
612 		.done = rockchip_vpu2_jpeg_enc_done,
613 	},
614 };
615 
616 static const struct hantro_codec_ops rk3588_vpu981_codec_ops[] = {
617 	[HANTRO_MODE_AV1_DEC] = {
618 		.run = rockchip_vpu981_av1_dec_run,
619 		.init = rockchip_vpu981_av1_dec_init,
620 		.exit = rockchip_vpu981_av1_dec_exit,
621 		.done = rockchip_vpu981_av1_dec_done,
622 	},
623 };
624 /*
625  * VPU variant.
626  */
627 
628 static const struct hantro_irq rockchip_vdpu1_irqs[] = {
629 	{ "vdpu", hantro_g1_irq },
630 };
631 
632 static const struct hantro_irq rockchip_vpu1_irqs[] = {
633 	{ "vepu", rockchip_vpu1_vepu_irq },
634 	{ "vdpu", hantro_g1_irq },
635 };
636 
637 static const struct hantro_irq rockchip_vdpu2_irqs[] = {
638 	{ "vdpu", rockchip_vpu2_vdpu_irq },
639 };
640 
641 static const struct hantro_irq rockchip_vpu2_irqs[] = {
642 	{ "vepu", rockchip_vpu2_vepu_irq },
643 	{ "vdpu", rockchip_vpu2_vdpu_irq },
644 };
645 
646 static const struct hantro_irq rk3568_vepu_irqs[] = {
647 	{ "vepu", rockchip_vpu2_vepu_irq },
648 };
649 
650 static const char * const rk3066_vpu_clk_names[] = {
651 	"aclk_vdpu", "hclk_vdpu",
652 	"aclk_vepu", "hclk_vepu"
653 };
654 
655 static const struct hantro_irq rk3588_vpu981_irqs[] = {
656 	{ "vdpu", rk3588_vpu981_irq },
657 };
658 
659 static const char * const rockchip_vpu_clk_names[] = {
660 	"aclk", "hclk"
661 };
662 
663 static const char * const rk3588_vpu981_vpu_clk_names[] = {
664 	"aclk", "hclk",
665 };
666 
667 /* VDPU1/VEPU1 */
668 
669 const struct hantro_variant rk3036_vpu_variant = {
670 	.dec_offset = 0x400,
671 	.dec_fmts = rk3066_vpu_dec_fmts,
672 	.num_dec_fmts = ARRAY_SIZE(rk3066_vpu_dec_fmts),
673 	.postproc_fmts = rockchip_vpu1_postproc_fmts,
674 	.num_postproc_fmts = ARRAY_SIZE(rockchip_vpu1_postproc_fmts),
675 	.postproc_ops = &hantro_g1_postproc_ops,
676 	.codec = HANTRO_MPEG2_DECODER | HANTRO_VP8_DECODER |
677 		 HANTRO_H264_DECODER,
678 	.codec_ops = rk3036_vpu_codec_ops,
679 	.irqs = rockchip_vdpu1_irqs,
680 	.num_irqs = ARRAY_SIZE(rockchip_vdpu1_irqs),
681 	.init = rk3036_vpu_hw_init,
682 	.clk_names = rockchip_vpu_clk_names,
683 	.num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names)
684 };
685 
686 /*
687  * Despite this variant has separate clocks for decoder and encoder,
688  * it's still required to enable all four of them for either decoding
689  * or encoding and we can't split it in separate g1/h1 variants.
690  */
691 const struct hantro_variant rk3066_vpu_variant = {
692 	.enc_offset = 0x0,
693 	.enc_fmts = rockchip_vpu_enc_fmts,
694 	.num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts),
695 	.dec_offset = 0x400,
696 	.dec_fmts = rk3066_vpu_dec_fmts,
697 	.num_dec_fmts = ARRAY_SIZE(rk3066_vpu_dec_fmts),
698 	.postproc_fmts = rockchip_vpu1_postproc_fmts,
699 	.num_postproc_fmts = ARRAY_SIZE(rockchip_vpu1_postproc_fmts),
700 	.postproc_ops = &hantro_g1_postproc_ops,
701 	.codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER |
702 		 HANTRO_VP8_DECODER | HANTRO_H264_DECODER,
703 	.codec_ops = rk3066_vpu_codec_ops,
704 	.irqs = rockchip_vpu1_irqs,
705 	.num_irqs = ARRAY_SIZE(rockchip_vpu1_irqs),
706 	.init = rk3066_vpu_hw_init,
707 	.clk_names = rk3066_vpu_clk_names,
708 	.num_clocks = ARRAY_SIZE(rk3066_vpu_clk_names)
709 };
710 
711 const struct hantro_variant rk3288_vpu_variant = {
712 	.enc_offset = 0x0,
713 	.enc_fmts = rockchip_vpu_enc_fmts,
714 	.num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts),
715 	.dec_offset = 0x400,
716 	.dec_fmts = rk3288_vpu_dec_fmts,
717 	.num_dec_fmts = ARRAY_SIZE(rk3288_vpu_dec_fmts),
718 	.postproc_fmts = rockchip_vpu1_postproc_fmts,
719 	.num_postproc_fmts = ARRAY_SIZE(rockchip_vpu1_postproc_fmts),
720 	.postproc_ops = &hantro_g1_postproc_ops,
721 	.codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER |
722 		 HANTRO_VP8_DECODER | HANTRO_H264_DECODER,
723 	.codec_ops = rk3288_vpu_codec_ops,
724 	.irqs = rockchip_vpu1_irqs,
725 	.num_irqs = ARRAY_SIZE(rockchip_vpu1_irqs),
726 	.init = rockchip_vpu_hw_init,
727 	.clk_names = rockchip_vpu_clk_names,
728 	.num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names)
729 };
730 
731 /* VDPU2/VEPU2 */
732 
733 const struct hantro_variant rk3328_vpu_variant = {
734 	.dec_offset = 0x400,
735 	.dec_fmts = rockchip_vdpu2_dec_fmts,
736 	.num_dec_fmts = ARRAY_SIZE(rockchip_vdpu2_dec_fmts),
737 	.codec = HANTRO_MPEG2_DECODER | HANTRO_VP8_DECODER |
738 		 HANTRO_H264_DECODER,
739 	.codec_ops = rk3399_vpu_codec_ops,
740 	.irqs = rockchip_vdpu2_irqs,
741 	.num_irqs = ARRAY_SIZE(rockchip_vdpu2_irqs),
742 	.init = rockchip_vpu_hw_init,
743 	.clk_names = rockchip_vpu_clk_names,
744 	.num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names),
745 };
746 
747 /*
748  * H.264 decoding explicitly disabled in RK3399.
749  * This ensures userspace applications use the Rockchip VDEC core,
750  * which has better performance.
751  */
752 const struct hantro_variant rk3399_vpu_variant = {
753 	.enc_offset = 0x0,
754 	.enc_fmts = rockchip_vpu_enc_fmts,
755 	.num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts),
756 	.dec_offset = 0x400,
757 	.dec_fmts = rk3399_vpu_dec_fmts,
758 	.num_dec_fmts = ARRAY_SIZE(rk3399_vpu_dec_fmts),
759 	.codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER |
760 		 HANTRO_VP8_DECODER,
761 	.codec_ops = rk3399_vpu_codec_ops,
762 	.irqs = rockchip_vpu2_irqs,
763 	.num_irqs = ARRAY_SIZE(rockchip_vpu2_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_vepu_variant = {
770 	.enc_offset = 0x0,
771 	.enc_fmts = rockchip_vpu_enc_fmts,
772 	.num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts),
773 	.codec = HANTRO_JPEG_ENCODER,
774 	.codec_ops = rk3568_vepu_codec_ops,
775 	.irqs = rk3568_vepu_irqs,
776 	.num_irqs = ARRAY_SIZE(rk3568_vepu_irqs),
777 	.init = rockchip_vpu_hw_init,
778 	.clk_names = rockchip_vpu_clk_names,
779 	.num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names)
780 };
781 
782 const struct hantro_variant rk3568_vpu_variant = {
783 	.dec_offset = 0x400,
784 	.dec_fmts = rockchip_vdpu2_dec_fmts,
785 	.num_dec_fmts = ARRAY_SIZE(rockchip_vdpu2_dec_fmts),
786 	.codec = HANTRO_MPEG2_DECODER |
787 		 HANTRO_VP8_DECODER | HANTRO_H264_DECODER,
788 	.codec_ops = rk3399_vpu_codec_ops,
789 	.irqs = rockchip_vdpu2_irqs,
790 	.num_irqs = ARRAY_SIZE(rockchip_vdpu2_irqs),
791 	.init = rockchip_vpu_hw_init,
792 	.clk_names = rockchip_vpu_clk_names,
793 	.num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names)
794 };
795 
796 const struct hantro_variant px30_vpu_variant = {
797 	.enc_offset = 0x0,
798 	.enc_fmts = rockchip_vpu_enc_fmts,
799 	.num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts),
800 	.dec_offset = 0x400,
801 	.dec_fmts = rockchip_vdpu2_dec_fmts,
802 	.num_dec_fmts = ARRAY_SIZE(rockchip_vdpu2_dec_fmts),
803 	.codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER |
804 		 HANTRO_VP8_DECODER | HANTRO_H264_DECODER,
805 	.codec_ops = rk3399_vpu_codec_ops,
806 	.irqs = rockchip_vpu2_irqs,
807 	.num_irqs = ARRAY_SIZE(rockchip_vpu2_irqs),
808 	.init = rk3036_vpu_hw_init,
809 	.clk_names = rockchip_vpu_clk_names,
810 	.num_clocks = ARRAY_SIZE(rockchip_vpu_clk_names)
811 };
812 
813 const struct hantro_variant rk3588_vpu981_variant = {
814 	.dec_offset = 0x0,
815 	.dec_fmts = rockchip_vpu981_dec_fmts,
816 	.num_dec_fmts = ARRAY_SIZE(rockchip_vpu981_dec_fmts),
817 	.postproc_fmts = rockchip_vpu981_postproc_fmts,
818 	.num_postproc_fmts = ARRAY_SIZE(rockchip_vpu981_postproc_fmts),
819 	.postproc_ops = &rockchip_vpu981_postproc_ops,
820 	.codec = HANTRO_AV1_DECODER,
821 	.codec_ops = rk3588_vpu981_codec_ops,
822 	.irqs = rk3588_vpu981_irqs,
823 	.num_irqs = ARRAY_SIZE(rk3588_vpu981_irqs),
824 	.init = rk3588_vpu981_hw_init,
825 	.clk_names = rk3588_vpu981_vpu_clk_names,
826 	.num_clocks = ARRAY_SIZE(rk3588_vpu981_vpu_clk_names)
827 };
828