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