1 // SPDX-License-Identifier: GPL-2.0
3 * Hantro VPU codec driver
5 * Copyright (C) 2018 Rockchip Electronics Co., Ltd.
6 * Jeffy Chen <jeffy.chen@rock-chips.com>
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"
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)
22 #define ROCKCHIP_VPU981_MIN_SIZE 64
28 static const struct hantro_fmt rockchip_vpu_enc_fmts[] = {
30 .fourcc = V4L2_PIX_FMT_YUV420M,
31 .codec_mode = HANTRO_MODE_NONE,
32 .enc_fmt = ROCKCHIP_VPU_ENC_FMT_YUV420P,
35 .fourcc = V4L2_PIX_FMT_NV12M,
36 .codec_mode = HANTRO_MODE_NONE,
37 .enc_fmt = ROCKCHIP_VPU_ENC_FMT_YUV420SP,
40 .fourcc = V4L2_PIX_FMT_YUYV,
41 .codec_mode = HANTRO_MODE_NONE,
42 .enc_fmt = ROCKCHIP_VPU_ENC_FMT_YUYV422,
45 .fourcc = V4L2_PIX_FMT_UYVY,
46 .codec_mode = HANTRO_MODE_NONE,
47 .enc_fmt = ROCKCHIP_VPU_ENC_FMT_UYVY422,
50 .fourcc = V4L2_PIX_FMT_JPEG,
51 .codec_mode = HANTRO_MODE_JPEG_ENC,
53 .header_size = JPEG_HEADER_SIZE,
60 .step_height = MB_DIM,
65 static const struct hantro_fmt rockchip_vpu1_postproc_fmts[] = {
67 .fourcc = V4L2_PIX_FMT_YUYV,
68 .codec_mode = HANTRO_MODE_NONE,
69 .postprocessed = true,
71 .min_width = FMT_MIN_WIDTH,
72 .max_width = FMT_FHD_WIDTH,
74 .min_height = FMT_MIN_HEIGHT,
75 .max_height = FMT_FHD_HEIGHT,
76 .step_height = MB_DIM,
81 static const struct hantro_fmt rockchip_vpu981_postproc_fmts[] = {
83 .fourcc = V4L2_PIX_FMT_NV12,
84 .codec_mode = HANTRO_MODE_NONE,
86 .postprocessed = true,
88 .min_width = ROCKCHIP_VPU981_MIN_SIZE,
89 .max_width = FMT_UHD_WIDTH,
91 .min_height = ROCKCHIP_VPU981_MIN_SIZE,
92 .max_height = FMT_UHD_HEIGHT,
93 .step_height = MB_DIM,
97 .fourcc = V4L2_PIX_FMT_P010,
98 .codec_mode = HANTRO_MODE_NONE,
100 .postprocessed = true,
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,
112 static const struct hantro_fmt rk3066_vpu_dec_fmts[] = {
114 .fourcc = V4L2_PIX_FMT_NV12,
115 .codec_mode = HANTRO_MODE_NONE,
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,
126 .fourcc = V4L2_PIX_FMT_H264_SLICE,
127 .codec_mode = HANTRO_MODE_H264_DEC,
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,
139 .fourcc = V4L2_PIX_FMT_MPEG2_SLICE,
140 .codec_mode = HANTRO_MODE_MPEG2_DEC,
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,
152 .fourcc = V4L2_PIX_FMT_VP8_FRAME,
153 .codec_mode = HANTRO_MODE_VP8_DEC,
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,
166 static const struct hantro_fmt rk3288_vpu_dec_fmts[] = {
168 .fourcc = V4L2_PIX_FMT_NV12,
169 .codec_mode = HANTRO_MODE_NONE,
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,
180 .fourcc = V4L2_PIX_FMT_H264_SLICE,
181 .codec_mode = HANTRO_MODE_H264_DEC,
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,
193 .fourcc = V4L2_PIX_FMT_MPEG2_SLICE,
194 .codec_mode = HANTRO_MODE_MPEG2_DEC,
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,
206 .fourcc = V4L2_PIX_FMT_VP8_FRAME,
207 .codec_mode = HANTRO_MODE_VP8_DEC,
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,
220 static const struct hantro_fmt rockchip_vdpu2_dec_fmts[] = {
222 .fourcc = V4L2_PIX_FMT_NV12,
223 .codec_mode = HANTRO_MODE_NONE,
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,
234 .fourcc = V4L2_PIX_FMT_H264_SLICE,
235 .codec_mode = HANTRO_MODE_H264_DEC,
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,
247 .fourcc = V4L2_PIX_FMT_MPEG2_SLICE,
248 .codec_mode = HANTRO_MODE_MPEG2_DEC,
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,
260 .fourcc = V4L2_PIX_FMT_VP8_FRAME,
261 .codec_mode = HANTRO_MODE_VP8_DEC,
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,
274 static const struct hantro_fmt rk3399_vpu_dec_fmts[] = {
276 .fourcc = V4L2_PIX_FMT_NV12,
277 .codec_mode = HANTRO_MODE_NONE,
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,
288 .fourcc = V4L2_PIX_FMT_MPEG2_SLICE,
289 .codec_mode = HANTRO_MODE_MPEG2_DEC,
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,
301 .fourcc = V4L2_PIX_FMT_VP8_FRAME,
302 .codec_mode = HANTRO_MODE_VP8_DEC,
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,
315 static const struct hantro_fmt rockchip_vpu981_dec_fmts[] = {
317 .fourcc = V4L2_PIX_FMT_NV12_4L4,
318 .codec_mode = HANTRO_MODE_NONE,
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,
330 .fourcc = V4L2_PIX_FMT_NV15_4L4,
331 .codec_mode = HANTRO_MODE_NONE,
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,
343 .fourcc = V4L2_PIX_FMT_AV1_FRAME,
344 .codec_mode = HANTRO_MODE_AV1_DEC,
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,
357 static irqreturn_t rockchip_vpu1_vepu_irq(int irq, void *dev_id)
359 struct hantro_dev *vpu = dev_id;
360 enum vb2_buffer_state state;
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;
367 vepu_write(vpu, 0, H1_REG_INTERRUPT);
368 vepu_write(vpu, 0, H1_REG_AXI_CTRL);
370 hantro_irq_done(vpu, state);
375 static irqreturn_t rockchip_vpu2_vdpu_irq(int irq, void *dev_id)
377 struct hantro_dev *vpu = dev_id;
378 enum vb2_buffer_state state;
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;
385 vdpu_write(vpu, 0, VDPU_REG_INTERRUPT);
386 vdpu_write(vpu, 0, VDPU_REG_AXI_CTRL);
388 hantro_irq_done(vpu, state);
393 static irqreturn_t rockchip_vpu2_vepu_irq(int irq, void *dev_id)
395 struct hantro_dev *vpu = dev_id;
396 enum vb2_buffer_state state;
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;
403 vepu_write(vpu, 0, VEPU_REG_INTERRUPT);
404 vepu_write(vpu, 0, VEPU_REG_AXI_CTRL);
406 hantro_irq_done(vpu, state);
411 static irqreturn_t rk3588_vpu981_irq(int irq, void *dev_id)
413 struct hantro_dev *vpu = dev_id;
414 enum vb2_buffer_state state;
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;
421 vdpu_write(vpu, 0, AV1_REG_INTERRUPT);
422 vdpu_write(vpu, AV1_REG_CONFIG_DEC_CLK_GATE_E, AV1_REG_CONFIG);
424 hantro_irq_done(vpu, state);
429 static int rk3036_vpu_hw_init(struct hantro_dev *vpu)
431 /* Bump ACLK to max. possible freq. to improve performance. */
432 clk_set_rate(vpu->clocks[0].clk, RK3066_ACLK_MAX_FREQ);
436 static int rk3066_vpu_hw_init(struct hantro_dev *vpu)
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);
444 static int rk3588_vpu981_hw_init(struct hantro_dev *vpu)
446 /* Bump ACLKs to max. possible freq. to improve performance. */
447 clk_set_rate(vpu->clocks[0].clk, RK3588_ACLK_MAX_FREQ);
451 static int rockchip_vpu_hw_init(struct hantro_dev *vpu)
453 /* Bump ACLK to max. possible freq. to improve performance. */
454 clk_set_rate(vpu->clocks[0].clk, RK3288_ACLK_MAX_FREQ);
458 static void rk3066_vpu_dec_reset(struct hantro_ctx *ctx)
460 struct hantro_dev *vpu = ctx->dev;
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);
466 static void rockchip_vpu1_enc_reset(struct hantro_ctx *ctx)
468 struct hantro_dev *vpu = ctx->dev;
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);
475 static void rockchip_vpu2_dec_reset(struct hantro_ctx *ctx)
477 struct hantro_dev *vpu = ctx->dev;
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);
484 static void rockchip_vpu2_enc_reset(struct hantro_ctx *ctx)
486 struct hantro_dev *vpu = ctx->dev;
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);
494 * Supported codec ops.
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
615 static const struct hantro_irq rockchip_vdpu1_irqs[] = {
616 { "vdpu", hantro_g1_irq },
619 static const struct hantro_irq rockchip_vpu1_irqs[] = {
620 { "vepu", rockchip_vpu1_vepu_irq },
621 { "vdpu", hantro_g1_irq },
624 static const struct hantro_irq rockchip_vdpu2_irqs[] = {
625 { "vdpu", rockchip_vpu2_vdpu_irq },
628 static const struct hantro_irq rockchip_vpu2_irqs[] = {
629 { "vepu", rockchip_vpu2_vepu_irq },
630 { "vdpu", rockchip_vpu2_vdpu_irq },
633 static const struct hantro_irq rk3568_vepu_irqs[] = {
634 { "vepu", rockchip_vpu2_vepu_irq },
637 static const char * const rk3066_vpu_clk_names[] = {
638 "aclk_vdpu", "hclk_vdpu",
639 "aclk_vepu", "hclk_vepu"
642 static const struct hantro_irq rk3588_vpu981_irqs[] = {
643 { "vdpu", rk3588_vpu981_irq },
646 static const char * const rockchip_vpu_clk_names[] = {
650 static const char * const rk3588_vpu981_vpu_clk_names[] = {
656 const struct hantro_variant rk3036_vpu_variant = {
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 |
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)
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.
678 const struct hantro_variant rk3066_vpu_variant = {
680 .enc_fmts = rockchip_vpu_enc_fmts,
681 .num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts),
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)
698 const struct hantro_variant rk3288_vpu_variant = {
700 .enc_fmts = rockchip_vpu_enc_fmts,
701 .num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts),
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)
720 const struct hantro_variant rk3328_vpu_variant = {
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 |
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),
735 * H.264 decoding explicitly disabled in RK3399.
736 * This ensures userspace applications use the Rockchip VDEC core,
737 * which has better performance.
739 const struct hantro_variant rk3399_vpu_variant = {
741 .enc_fmts = rockchip_vpu_enc_fmts,
742 .num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts),
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 |
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)
756 const struct hantro_variant rk3568_vepu_variant = {
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)
769 const struct hantro_variant rk3568_vpu_variant = {
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)
783 const struct hantro_variant px30_vpu_variant = {
785 .enc_fmts = rockchip_vpu_enc_fmts,
786 .num_enc_fmts = ARRAY_SIZE(rockchip_vpu_enc_fmts),
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)
800 const struct hantro_variant rk3588_vpu981_variant = {
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)