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