1 // SPDX-License-Identifier: (GPL-2.0+ OR MIT) 2 /* 3 * Copyright (c) 2020 Rockchip Electronics Co., Ltd. 4 * Author: Andy Yan <andy.yan@rock-chips.com> 5 */ 6 #include <linux/bitfield.h> 7 #include <linux/clk.h> 8 #include <linux/component.h> 9 #include <linux/delay.h> 10 #include <linux/iopoll.h> 11 #include <linux/kernel.h> 12 #include <linux/media-bus-format.h> 13 #include <linux/mfd/syscon.h> 14 #include <linux/module.h> 15 #include <linux/of.h> 16 #include <linux/of_graph.h> 17 #include <linux/platform_device.h> 18 #include <linux/pm_runtime.h> 19 #include <linux/regmap.h> 20 #include <linux/swab.h> 21 22 #include <drm/drm.h> 23 #include <drm/drm_atomic.h> 24 #include <drm/drm_atomic_uapi.h> 25 #include <drm/drm_blend.h> 26 #include <drm/drm_crtc.h> 27 #include <linux/debugfs.h> 28 #include <drm/drm_debugfs.h> 29 #include <drm/drm_flip_work.h> 30 #include <drm/drm_framebuffer.h> 31 #include <drm/drm_gem_framebuffer_helper.h> 32 #include <drm/drm_print.h> 33 #include <drm/drm_probe_helper.h> 34 #include <drm/drm_vblank.h> 35 36 #include <uapi/linux/videodev2.h> 37 38 #include "rockchip_drm_gem.h" 39 #include "rockchip_drm_vop2.h" 40 #include "rockchip_rgb.h" 41 42 /* 43 * VOP2 architecture 44 * 45 +----------+ +-------------+ +-----------+ 46 | Cluster | | Sel 1 from 6| | 1 from 3 | 47 | window0 | | Layer0 | | RGB | 48 +----------+ +-------------+ +---------------+ +-------------+ +-----------+ 49 +----------+ +-------------+ |N from 6 layers| | | 50 | Cluster | | Sel 1 from 6| | Overlay0 +--->| Video Port0 | +-----------+ 51 | window1 | | Layer1 | | | | | | 1 from 3 | 52 +----------+ +-------------+ +---------------+ +-------------+ | LVDS | 53 +----------+ +-------------+ +-----------+ 54 | Esmart | | Sel 1 from 6| 55 | window0 | | Layer2 | +---------------+ +-------------+ +-----------+ 56 +----------+ +-------------+ |N from 6 Layers| | | +--> | 1 from 3 | 57 +----------+ +-------------+ --------> | Overlay1 +--->| Video Port1 | | MIPI | 58 | Esmart | | Sel 1 from 6| --------> | | | | +-----------+ 59 | Window1 | | Layer3 | +---------------+ +-------------+ 60 +----------+ +-------------+ +-----------+ 61 +----------+ +-------------+ | 1 from 3 | 62 | Smart | | Sel 1 from 6| +---------------+ +-------------+ | HDMI | 63 | Window0 | | Layer4 | |N from 6 Layers| | | +-----------+ 64 +----------+ +-------------+ | Overlay2 +--->| Video Port2 | 65 +----------+ +-------------+ | | | | +-----------+ 66 | Smart | | Sel 1 from 6| +---------------+ +-------------+ | 1 from 3 | 67 | Window1 | | Layer5 | | eDP | 68 +----------+ +-------------+ +-----------+ 69 * 70 */ 71 72 enum vop2_data_format { 73 VOP2_FMT_ARGB8888 = 0, 74 VOP2_FMT_RGB888, 75 VOP2_FMT_RGB565, 76 VOP2_FMT_XRGB101010, 77 VOP2_FMT_YUV420SP, 78 VOP2_FMT_YUV422SP, 79 VOP2_FMT_YUV444SP, 80 VOP2_FMT_YUYV422 = 8, 81 VOP2_FMT_YUYV420, 82 VOP2_FMT_VYUY422, 83 VOP2_FMT_VYUY420, 84 VOP2_FMT_YUV420SP_TILE_8x4 = 0x10, 85 VOP2_FMT_YUV420SP_TILE_16x2, 86 VOP2_FMT_YUV422SP_TILE_8x4, 87 VOP2_FMT_YUV422SP_TILE_16x2, 88 VOP2_FMT_YUV420SP_10, 89 VOP2_FMT_YUV422SP_10, 90 VOP2_FMT_YUV444SP_10, 91 }; 92 93 enum vop2_afbc_format { 94 VOP2_AFBC_FMT_RGB565, 95 VOP2_AFBC_FMT_ARGB2101010 = 2, 96 VOP2_AFBC_FMT_YUV420_10BIT, 97 VOP2_AFBC_FMT_RGB888, 98 VOP2_AFBC_FMT_ARGB8888, 99 VOP2_AFBC_FMT_YUV420 = 9, 100 VOP2_AFBC_FMT_YUV422 = 0xb, 101 VOP2_AFBC_FMT_YUV422_10BIT = 0xe, 102 VOP2_AFBC_FMT_INVALID = -1, 103 }; 104 105 #define VOP2_MAX_DCLK_RATE 600000000UL 106 107 /* 108 * bus-format types. 109 */ 110 struct drm_bus_format_enum_list { 111 int type; 112 const char *name; 113 }; 114 115 static const struct drm_bus_format_enum_list drm_bus_format_enum_list[] = { 116 { DRM_MODE_CONNECTOR_Unknown, "Unknown" }, 117 { MEDIA_BUS_FMT_RGB565_1X16, "RGB565_1X16" }, 118 { MEDIA_BUS_FMT_RGB666_1X18, "RGB666_1X18" }, 119 { MEDIA_BUS_FMT_RGB666_1X24_CPADHI, "RGB666_1X24_CPADHI" }, 120 { MEDIA_BUS_FMT_RGB666_1X7X3_SPWG, "RGB666_1X7X3_SPWG" }, 121 { MEDIA_BUS_FMT_YUV8_1X24, "YUV8_1X24" }, 122 { MEDIA_BUS_FMT_UYYVYY8_0_5X24, "UYYVYY8_0_5X24" }, 123 { MEDIA_BUS_FMT_YUV10_1X30, "YUV10_1X30" }, 124 { MEDIA_BUS_FMT_UYYVYY10_0_5X30, "UYYVYY10_0_5X30" }, 125 { MEDIA_BUS_FMT_RGB888_3X8, "RGB888_3X8" }, 126 { MEDIA_BUS_FMT_RGB888_1X24, "RGB888_1X24" }, 127 { MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, "RGB888_1X7X4_SPWG" }, 128 { MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA, "RGB888_1X7X4_JEIDA" }, 129 { MEDIA_BUS_FMT_UYVY8_2X8, "UYVY8_2X8" }, 130 { MEDIA_BUS_FMT_YUYV8_1X16, "YUYV8_1X16" }, 131 { MEDIA_BUS_FMT_UYVY8_1X16, "UYVY8_1X16" }, 132 { MEDIA_BUS_FMT_RGB101010_1X30, "RGB101010_1X30" }, 133 { MEDIA_BUS_FMT_YUYV10_1X20, "YUYV10_1X20" }, 134 }; 135 136 static DRM_ENUM_NAME_FN(drm_get_bus_format_name, drm_bus_format_enum_list) 137 138 static const struct regmap_config vop2_regmap_config; 139 140 static void vop2_lock(struct vop2 *vop2) 141 { 142 mutex_lock(&vop2->vop2_lock); 143 } 144 145 static void vop2_unlock(struct vop2 *vop2) 146 { 147 mutex_unlock(&vop2->vop2_lock); 148 } 149 150 static void vop2_win_disable(struct vop2_win *win) 151 { 152 vop2_win_write(win, VOP2_WIN_ENABLE, 0); 153 154 if (vop2_cluster_window(win)) 155 vop2_win_write(win, VOP2_WIN_CLUSTER_ENABLE, 0); 156 } 157 158 static u32 vop2_get_bpp(const struct drm_format_info *format) 159 { 160 switch (format->format) { 161 case DRM_FORMAT_YUV420_8BIT: 162 return 12; 163 case DRM_FORMAT_YUV420_10BIT: 164 return 15; 165 case DRM_FORMAT_VUY101010: 166 return 30; 167 default: 168 return drm_format_info_bpp(format, 0); 169 } 170 } 171 172 static enum vop2_data_format vop2_convert_format(u32 format) 173 { 174 switch (format) { 175 case DRM_FORMAT_XRGB2101010: 176 case DRM_FORMAT_ARGB2101010: 177 case DRM_FORMAT_XBGR2101010: 178 case DRM_FORMAT_ABGR2101010: 179 return VOP2_FMT_XRGB101010; 180 case DRM_FORMAT_XRGB8888: 181 case DRM_FORMAT_ARGB8888: 182 case DRM_FORMAT_XBGR8888: 183 case DRM_FORMAT_ABGR8888: 184 return VOP2_FMT_ARGB8888; 185 case DRM_FORMAT_RGB888: 186 case DRM_FORMAT_BGR888: 187 return VOP2_FMT_RGB888; 188 case DRM_FORMAT_RGB565: 189 case DRM_FORMAT_BGR565: 190 return VOP2_FMT_RGB565; 191 case DRM_FORMAT_NV12: 192 case DRM_FORMAT_NV21: 193 case DRM_FORMAT_YUV420_8BIT: 194 return VOP2_FMT_YUV420SP; 195 case DRM_FORMAT_NV15: 196 case DRM_FORMAT_YUV420_10BIT: 197 return VOP2_FMT_YUV420SP_10; 198 case DRM_FORMAT_NV16: 199 case DRM_FORMAT_NV61: 200 return VOP2_FMT_YUV422SP; 201 case DRM_FORMAT_NV20: 202 case DRM_FORMAT_Y210: 203 return VOP2_FMT_YUV422SP_10; 204 case DRM_FORMAT_NV24: 205 case DRM_FORMAT_NV42: 206 return VOP2_FMT_YUV444SP; 207 case DRM_FORMAT_NV30: 208 return VOP2_FMT_YUV444SP_10; 209 case DRM_FORMAT_YUYV: 210 case DRM_FORMAT_YVYU: 211 return VOP2_FMT_VYUY422; 212 case DRM_FORMAT_VYUY: 213 case DRM_FORMAT_UYVY: 214 return VOP2_FMT_YUYV422; 215 default: 216 DRM_ERROR("unsupported format[%08x]\n", format); 217 return -EINVAL; 218 } 219 } 220 221 static enum vop2_afbc_format vop2_convert_afbc_format(u32 format) 222 { 223 switch (format) { 224 case DRM_FORMAT_XRGB2101010: 225 case DRM_FORMAT_ARGB2101010: 226 case DRM_FORMAT_XBGR2101010: 227 case DRM_FORMAT_ABGR2101010: 228 return VOP2_AFBC_FMT_ARGB2101010; 229 case DRM_FORMAT_XRGB8888: 230 case DRM_FORMAT_ARGB8888: 231 case DRM_FORMAT_XBGR8888: 232 case DRM_FORMAT_ABGR8888: 233 return VOP2_AFBC_FMT_ARGB8888; 234 case DRM_FORMAT_RGB888: 235 case DRM_FORMAT_BGR888: 236 return VOP2_AFBC_FMT_RGB888; 237 case DRM_FORMAT_RGB565: 238 case DRM_FORMAT_BGR565: 239 return VOP2_AFBC_FMT_RGB565; 240 case DRM_FORMAT_YUV420_8BIT: 241 return VOP2_AFBC_FMT_YUV420; 242 case DRM_FORMAT_YUV420_10BIT: 243 return VOP2_AFBC_FMT_YUV420_10BIT; 244 case DRM_FORMAT_YVYU: 245 case DRM_FORMAT_YUYV: 246 case DRM_FORMAT_VYUY: 247 case DRM_FORMAT_UYVY: 248 return VOP2_AFBC_FMT_YUV422; 249 case DRM_FORMAT_Y210: 250 return VOP2_AFBC_FMT_YUV422_10BIT; 251 default: 252 return VOP2_AFBC_FMT_INVALID; 253 } 254 255 return VOP2_AFBC_FMT_INVALID; 256 } 257 258 static bool vop2_win_rb_swap(u32 format) 259 { 260 switch (format) { 261 case DRM_FORMAT_XBGR2101010: 262 case DRM_FORMAT_ABGR2101010: 263 case DRM_FORMAT_XBGR8888: 264 case DRM_FORMAT_ABGR8888: 265 case DRM_FORMAT_BGR888: 266 case DRM_FORMAT_BGR565: 267 return true; 268 default: 269 return false; 270 } 271 } 272 273 static bool vop2_afbc_uv_swap(u32 format) 274 { 275 switch (format) { 276 case DRM_FORMAT_YUYV: 277 case DRM_FORMAT_Y210: 278 case DRM_FORMAT_YUV420_8BIT: 279 case DRM_FORMAT_YUV420_10BIT: 280 return true; 281 default: 282 return false; 283 } 284 } 285 286 static bool vop2_win_uv_swap(u32 format) 287 { 288 switch (format) { 289 case DRM_FORMAT_NV12: 290 case DRM_FORMAT_NV16: 291 case DRM_FORMAT_NV24: 292 case DRM_FORMAT_NV15: 293 case DRM_FORMAT_NV20: 294 case DRM_FORMAT_NV30: 295 case DRM_FORMAT_YUYV: 296 case DRM_FORMAT_UYVY: 297 return true; 298 default: 299 return false; 300 } 301 } 302 303 static bool vop2_win_dither_up(u32 format) 304 { 305 switch (format) { 306 case DRM_FORMAT_BGR565: 307 case DRM_FORMAT_RGB565: 308 return true; 309 default: 310 return false; 311 } 312 } 313 314 static bool vop2_output_uv_swap(u32 bus_format, u32 output_mode) 315 { 316 /* 317 * FIXME: 318 * 319 * There is no media type for YUV444 output, 320 * so when out_mode is AAAA or P888, assume output is YUV444 on 321 * yuv format. 322 * 323 * From H/W testing, YUV444 mode need a rb swap. 324 */ 325 if (bus_format == MEDIA_BUS_FMT_YVYU8_1X16 || 326 bus_format == MEDIA_BUS_FMT_VYUY8_1X16 || 327 bus_format == MEDIA_BUS_FMT_YVYU8_2X8 || 328 bus_format == MEDIA_BUS_FMT_VYUY8_2X8 || 329 ((bus_format == MEDIA_BUS_FMT_YUV8_1X24 || 330 bus_format == MEDIA_BUS_FMT_YUV10_1X30) && 331 (output_mode == ROCKCHIP_OUT_MODE_AAAA || 332 output_mode == ROCKCHIP_OUT_MODE_P888))) 333 return true; 334 else 335 return false; 336 } 337 338 static bool vop2_output_rg_swap(struct vop2 *vop2, u32 bus_format) 339 { 340 if (vop2->version == VOP_VERSION_RK3588) { 341 if (bus_format == MEDIA_BUS_FMT_YUV8_1X24 || 342 bus_format == MEDIA_BUS_FMT_YUV10_1X30) 343 return true; 344 } 345 346 return false; 347 } 348 349 static bool is_yuv_output(u32 bus_format) 350 { 351 switch (bus_format) { 352 case MEDIA_BUS_FMT_YUV8_1X24: 353 case MEDIA_BUS_FMT_YUV10_1X30: 354 case MEDIA_BUS_FMT_UYYVYY8_0_5X24: 355 case MEDIA_BUS_FMT_UYYVYY10_0_5X30: 356 case MEDIA_BUS_FMT_YUYV8_2X8: 357 case MEDIA_BUS_FMT_YVYU8_2X8: 358 case MEDIA_BUS_FMT_UYVY8_2X8: 359 case MEDIA_BUS_FMT_VYUY8_2X8: 360 case MEDIA_BUS_FMT_YUYV8_1X16: 361 case MEDIA_BUS_FMT_YVYU8_1X16: 362 case MEDIA_BUS_FMT_UYVY8_1X16: 363 case MEDIA_BUS_FMT_VYUY8_1X16: 364 return true; 365 default: 366 return false; 367 } 368 } 369 370 static bool rockchip_vop2_mod_supported(struct drm_plane *plane, u32 format, 371 u64 modifier) 372 { 373 struct vop2_win *win = to_vop2_win(plane); 374 struct vop2 *vop2 = win->vop2; 375 int i; 376 377 /* No support for implicit modifiers */ 378 if (modifier == DRM_FORMAT_MOD_INVALID) 379 return false; 380 381 /* The cluster window on 3568 is AFBC-only */ 382 if (vop2->version == VOP_VERSION_RK3568 && vop2_cluster_window(win) && 383 !drm_is_afbc(modifier)) { 384 drm_dbg_kms(vop2->drm, 385 "Cluster window only supports format with afbc\n"); 386 return false; 387 } 388 389 /* 10bpc formats on 3588 are AFBC-only */ 390 if (vop2->version == VOP_VERSION_RK3588 && !drm_is_afbc(modifier) && 391 (format == DRM_FORMAT_XRGB2101010 || format == DRM_FORMAT_XBGR2101010)) { 392 drm_dbg_kms(vop2->drm, "Only support 10bpc format with afbc\n"); 393 return false; 394 } 395 396 /* Linear is otherwise supported everywhere */ 397 if (modifier == DRM_FORMAT_MOD_LINEAR) 398 return true; 399 400 /* Not all format+modifier combinations are allowable */ 401 if (vop2_convert_afbc_format(format) == VOP2_AFBC_FMT_INVALID) 402 return false; 403 404 /* Different windows have different format/modifier support */ 405 for (i = 0; i < plane->modifier_count; i++) { 406 if (plane->modifiers[i] == modifier) 407 return true; 408 } 409 410 return false; 411 } 412 413 /* 414 * 0: Full mode, 16 lines for one tail 415 * 1: half block mode, 8 lines one tail 416 */ 417 static bool vop2_half_block_enable(struct drm_plane_state *pstate) 418 { 419 if (pstate->rotation & (DRM_MODE_ROTATE_270 | DRM_MODE_ROTATE_90)) 420 return false; 421 else 422 return true; 423 } 424 425 static u32 vop2_afbc_transform_offset(struct drm_plane_state *pstate, 426 bool afbc_half_block_en) 427 { 428 struct drm_rect *src = &pstate->src; 429 struct drm_framebuffer *fb = pstate->fb; 430 u32 bpp = vop2_get_bpp(fb->format); 431 u32 vir_width = (fb->pitches[0] << 3) / bpp; 432 u32 width = drm_rect_width(src) >> 16; 433 u32 height = drm_rect_height(src) >> 16; 434 u32 act_xoffset = src->x1 >> 16; 435 u32 act_yoffset = src->y1 >> 16; 436 u32 align16_crop = 0; 437 u32 align64_crop = 0; 438 u32 height_tmp; 439 u8 tx, ty; 440 u8 bottom_crop_line_num = 0; 441 442 /* 16 pixel align */ 443 if (height & 0xf) 444 align16_crop = 16 - (height & 0xf); 445 446 height_tmp = height + align16_crop; 447 448 /* 64 pixel align */ 449 if (height_tmp & 0x3f) 450 align64_crop = 64 - (height_tmp & 0x3f); 451 452 bottom_crop_line_num = align16_crop + align64_crop; 453 454 switch (pstate->rotation & 455 (DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y | 456 DRM_MODE_ROTATE_90 | DRM_MODE_ROTATE_270)) { 457 case DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y: 458 tx = 16 - ((act_xoffset + width) & 0xf); 459 ty = bottom_crop_line_num - act_yoffset; 460 break; 461 case DRM_MODE_REFLECT_X | DRM_MODE_ROTATE_90: 462 tx = bottom_crop_line_num - act_yoffset; 463 ty = vir_width - width - act_xoffset; 464 break; 465 case DRM_MODE_REFLECT_X | DRM_MODE_ROTATE_270: 466 tx = act_yoffset; 467 ty = act_xoffset; 468 break; 469 case DRM_MODE_REFLECT_X: 470 tx = 16 - ((act_xoffset + width) & 0xf); 471 ty = act_yoffset; 472 break; 473 case DRM_MODE_REFLECT_Y: 474 tx = act_xoffset; 475 ty = bottom_crop_line_num - act_yoffset; 476 break; 477 case DRM_MODE_ROTATE_90: 478 tx = bottom_crop_line_num - act_yoffset; 479 ty = act_xoffset; 480 break; 481 case DRM_MODE_ROTATE_270: 482 tx = act_yoffset; 483 ty = vir_width - width - act_xoffset; 484 break; 485 case 0: 486 tx = act_xoffset; 487 ty = act_yoffset; 488 break; 489 } 490 491 if (afbc_half_block_en) 492 ty &= 0x7f; 493 494 #define TRANSFORM_XOFFSET GENMASK(7, 0) 495 #define TRANSFORM_YOFFSET GENMASK(23, 16) 496 return FIELD_PREP(TRANSFORM_XOFFSET, tx) | 497 FIELD_PREP(TRANSFORM_YOFFSET, ty); 498 } 499 500 /* 501 * A Cluster window has 2048 x 16 line buffer, which can 502 * works at 2048 x 16(Full) or 4096 x 8 (Half) mode. 503 * for Cluster_lb_mode register: 504 * 0: half mode, for plane input width range 2048 ~ 4096 505 * 1: half mode, for cluster work at 2 * 2048 plane mode 506 * 2: half mode, for rotate_90/270 mode 507 * 508 */ 509 static int vop2_get_cluster_lb_mode(struct vop2_win *win, 510 struct drm_plane_state *pstate) 511 { 512 if ((pstate->rotation & DRM_MODE_ROTATE_270) || 513 (pstate->rotation & DRM_MODE_ROTATE_90)) 514 return 2; 515 else 516 return 0; 517 } 518 519 static u16 vop2_scale_factor(u32 src, u32 dst) 520 { 521 u32 fac; 522 int shift; 523 524 if (src == dst) 525 return 0; 526 527 if (dst < 2) 528 return U16_MAX; 529 530 if (src < 2) 531 return 0; 532 533 if (src > dst) 534 shift = 12; 535 else 536 shift = 16; 537 538 src--; 539 dst--; 540 541 fac = DIV_ROUND_UP(src << shift, dst) - 1; 542 543 if (fac > U16_MAX) 544 return U16_MAX; 545 546 return fac; 547 } 548 549 static void vop2_setup_scale(struct vop2 *vop2, const struct vop2_win *win, 550 u32 src_w, u32 src_h, u32 dst_w, 551 u32 dst_h, u32 pixel_format) 552 { 553 const struct drm_format_info *info; 554 u16 hor_scl_mode, ver_scl_mode; 555 u16 hscl_filter_mode, vscl_filter_mode; 556 uint16_t cbcr_src_w = src_w; 557 uint16_t cbcr_src_h = src_h; 558 u8 gt2 = 0; 559 u8 gt4 = 0; 560 u32 val; 561 562 info = drm_format_info(pixel_format); 563 564 if (src_h >= (4 * dst_h)) { 565 gt4 = 1; 566 src_h >>= 2; 567 } else if (src_h >= (2 * dst_h)) { 568 gt2 = 1; 569 src_h >>= 1; 570 } 571 572 hor_scl_mode = scl_get_scl_mode(src_w, dst_w); 573 ver_scl_mode = scl_get_scl_mode(src_h, dst_h); 574 575 if (hor_scl_mode == SCALE_UP) 576 hscl_filter_mode = VOP2_SCALE_UP_BIC; 577 else 578 hscl_filter_mode = VOP2_SCALE_DOWN_BIL; 579 580 if (ver_scl_mode == SCALE_UP) 581 vscl_filter_mode = VOP2_SCALE_UP_BIL; 582 else 583 vscl_filter_mode = VOP2_SCALE_DOWN_BIL; 584 585 /* 586 * RK3568 VOP Esmart/Smart dsp_w should be even pixel 587 * at scale down mode 588 */ 589 if (!(win->data->feature & WIN_FEATURE_AFBDC)) { 590 if ((hor_scl_mode == SCALE_DOWN) && (dst_w & 0x1)) { 591 drm_dbg(vop2->drm, "%s dst_w[%d] should align as 2 pixel\n", 592 win->data->name, dst_w); 593 dst_w++; 594 } 595 } 596 597 val = vop2_scale_factor(src_w, dst_w); 598 vop2_win_write(win, VOP2_WIN_SCALE_YRGB_X, val); 599 val = vop2_scale_factor(src_h, dst_h); 600 vop2_win_write(win, VOP2_WIN_SCALE_YRGB_Y, val); 601 602 vop2_win_write(win, VOP2_WIN_VSD_YRGB_GT4, gt4); 603 vop2_win_write(win, VOP2_WIN_VSD_YRGB_GT2, gt2); 604 605 vop2_win_write(win, VOP2_WIN_YRGB_HOR_SCL_MODE, hor_scl_mode); 606 vop2_win_write(win, VOP2_WIN_YRGB_VER_SCL_MODE, ver_scl_mode); 607 608 if (vop2_cluster_window(win)) 609 return; 610 611 vop2_win_write(win, VOP2_WIN_YRGB_HSCL_FILTER_MODE, hscl_filter_mode); 612 vop2_win_write(win, VOP2_WIN_YRGB_VSCL_FILTER_MODE, vscl_filter_mode); 613 614 if (info->is_yuv) { 615 cbcr_src_w /= info->hsub; 616 cbcr_src_h /= info->vsub; 617 618 gt4 = 0; 619 gt2 = 0; 620 621 if (cbcr_src_h >= (4 * dst_h)) { 622 gt4 = 1; 623 cbcr_src_h >>= 2; 624 } else if (cbcr_src_h >= (2 * dst_h)) { 625 gt2 = 1; 626 cbcr_src_h >>= 1; 627 } 628 629 hor_scl_mode = scl_get_scl_mode(cbcr_src_w, dst_w); 630 ver_scl_mode = scl_get_scl_mode(cbcr_src_h, dst_h); 631 632 val = vop2_scale_factor(cbcr_src_w, dst_w); 633 vop2_win_write(win, VOP2_WIN_SCALE_CBCR_X, val); 634 635 val = vop2_scale_factor(cbcr_src_h, dst_h); 636 vop2_win_write(win, VOP2_WIN_SCALE_CBCR_Y, val); 637 638 vop2_win_write(win, VOP2_WIN_VSD_CBCR_GT4, gt4); 639 vop2_win_write(win, VOP2_WIN_VSD_CBCR_GT2, gt2); 640 vop2_win_write(win, VOP2_WIN_CBCR_HOR_SCL_MODE, hor_scl_mode); 641 vop2_win_write(win, VOP2_WIN_CBCR_VER_SCL_MODE, ver_scl_mode); 642 vop2_win_write(win, VOP2_WIN_CBCR_HSCL_FILTER_MODE, hscl_filter_mode); 643 vop2_win_write(win, VOP2_WIN_CBCR_VSCL_FILTER_MODE, vscl_filter_mode); 644 } 645 } 646 647 static int vop2_convert_csc_mode(int csc_mode) 648 { 649 switch (csc_mode) { 650 case V4L2_COLORSPACE_SMPTE170M: 651 case V4L2_COLORSPACE_470_SYSTEM_M: 652 case V4L2_COLORSPACE_470_SYSTEM_BG: 653 return CSC_BT601L; 654 case V4L2_COLORSPACE_REC709: 655 case V4L2_COLORSPACE_SMPTE240M: 656 case V4L2_COLORSPACE_DEFAULT: 657 return CSC_BT709L; 658 case V4L2_COLORSPACE_JPEG: 659 return CSC_BT601F; 660 case V4L2_COLORSPACE_BT2020: 661 return CSC_BT2020; 662 default: 663 return CSC_BT709L; 664 } 665 } 666 667 /* 668 * colorspace path: 669 * Input Win csc Output 670 * 1. YUV(2020) --> Y2R->2020To709->R2Y --> YUV_OUTPUT(601/709) 671 * RGB --> R2Y __/ 672 * 673 * 2. YUV(2020) --> bypasss --> YUV_OUTPUT(2020) 674 * RGB --> 709To2020->R2Y __/ 675 * 676 * 3. YUV(2020) --> Y2R->2020To709 --> RGB_OUTPUT(709) 677 * RGB --> R2Y __/ 678 * 679 * 4. YUV(601/709)-> Y2R->709To2020->R2Y --> YUV_OUTPUT(2020) 680 * RGB --> 709To2020->R2Y __/ 681 * 682 * 5. YUV(601/709)-> bypass --> YUV_OUTPUT(709) 683 * RGB --> R2Y __/ 684 * 685 * 6. YUV(601/709)-> bypass --> YUV_OUTPUT(601) 686 * RGB --> R2Y(601) __/ 687 * 688 * 7. YUV --> Y2R(709) --> RGB_OUTPUT(709) 689 * RGB --> bypass __/ 690 * 691 * 8. RGB --> 709To2020->R2Y --> YUV_OUTPUT(2020) 692 * 693 * 9. RGB --> R2Y(709) --> YUV_OUTPUT(709) 694 * 695 * 10. RGB --> R2Y(601) --> YUV_OUTPUT(601) 696 * 697 * 11. RGB --> bypass --> RGB_OUTPUT(709) 698 */ 699 700 static void vop2_setup_csc_mode(struct vop2_video_port *vp, 701 struct vop2_win *win, 702 struct drm_plane_state *pstate) 703 { 704 struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(vp->crtc.state); 705 int is_input_yuv = pstate->fb->format->is_yuv; 706 int is_output_yuv = is_yuv_output(vcstate->bus_format); 707 int input_csc = V4L2_COLORSPACE_DEFAULT; 708 int output_csc = vcstate->color_space; 709 bool r2y_en, y2r_en; 710 int csc_mode; 711 712 if (is_input_yuv && !is_output_yuv) { 713 y2r_en = true; 714 r2y_en = false; 715 csc_mode = vop2_convert_csc_mode(input_csc); 716 } else if (!is_input_yuv && is_output_yuv) { 717 y2r_en = false; 718 r2y_en = true; 719 csc_mode = vop2_convert_csc_mode(output_csc); 720 } else { 721 y2r_en = false; 722 r2y_en = false; 723 csc_mode = false; 724 } 725 726 vop2_win_write(win, VOP2_WIN_Y2R_EN, y2r_en); 727 vop2_win_write(win, VOP2_WIN_R2Y_EN, r2y_en); 728 vop2_win_write(win, VOP2_WIN_CSC_MODE, csc_mode); 729 } 730 731 static void vop2_crtc_enable_irq(struct vop2_video_port *vp, u32 irq) 732 { 733 struct vop2 *vop2 = vp->vop2; 734 735 vop2_writel(vop2, RK3568_VP_INT_CLR(vp->id), irq << 16 | irq); 736 vop2_writel(vop2, RK3568_VP_INT_EN(vp->id), irq << 16 | irq); 737 } 738 739 static void vop2_crtc_disable_irq(struct vop2_video_port *vp, u32 irq) 740 { 741 struct vop2 *vop2 = vp->vop2; 742 743 vop2_writel(vop2, RK3568_VP_INT_EN(vp->id), irq << 16); 744 } 745 746 static int vop2_core_clks_prepare_enable(struct vop2 *vop2) 747 { 748 int ret; 749 750 ret = clk_prepare_enable(vop2->hclk); 751 if (ret < 0) { 752 drm_err(vop2->drm, "failed to enable hclk - %d\n", ret); 753 return ret; 754 } 755 756 ret = clk_prepare_enable(vop2->aclk); 757 if (ret < 0) { 758 drm_err(vop2->drm, "failed to enable aclk - %d\n", ret); 759 goto err; 760 } 761 762 ret = clk_prepare_enable(vop2->pclk); 763 if (ret < 0) { 764 drm_err(vop2->drm, "failed to enable pclk - %d\n", ret); 765 goto err1; 766 } 767 768 return 0; 769 err1: 770 clk_disable_unprepare(vop2->aclk); 771 err: 772 clk_disable_unprepare(vop2->hclk); 773 774 return ret; 775 } 776 777 static void rk3588_vop2_power_domain_enable_all(struct vop2 *vop2) 778 { 779 u32 pd; 780 781 pd = vop2_readl(vop2, RK3588_SYS_PD_CTRL); 782 pd &= ~(VOP2_PD_CLUSTER0 | VOP2_PD_CLUSTER1 | VOP2_PD_CLUSTER2 | 783 VOP2_PD_CLUSTER3 | VOP2_PD_ESMART); 784 785 vop2_writel(vop2, RK3588_SYS_PD_CTRL, pd); 786 } 787 788 static void vop2_enable(struct vop2 *vop2) 789 { 790 int ret; 791 u32 version; 792 793 ret = pm_runtime_resume_and_get(vop2->dev); 794 if (ret < 0) { 795 drm_err(vop2->drm, "failed to get pm runtime: %d\n", ret); 796 return; 797 } 798 799 ret = vop2_core_clks_prepare_enable(vop2); 800 if (ret) { 801 pm_runtime_put_sync(vop2->dev); 802 return; 803 } 804 805 ret = rockchip_drm_dma_attach_device(vop2->drm, vop2->dev); 806 if (ret) { 807 drm_err(vop2->drm, "failed to attach dma mapping, %d\n", ret); 808 return; 809 } 810 811 version = vop2_readl(vop2, RK3568_VERSION_INFO); 812 if (version != vop2->version) { 813 drm_err(vop2->drm, "Hardware version(0x%08x) mismatch\n", version); 814 return; 815 } 816 817 /* 818 * rk3566 share the same vop version with rk3568, so 819 * we need to use soc_id for identification here. 820 */ 821 if (vop2->data->soc_id == 3566) 822 vop2_writel(vop2, RK3568_OTP_WIN_EN, 1); 823 824 if (vop2->version == VOP_VERSION_RK3588) 825 rk3588_vop2_power_domain_enable_all(vop2); 826 827 if (vop2->version <= VOP_VERSION_RK3588) { 828 vop2->old_layer_sel = vop2_readl(vop2, RK3568_OVL_LAYER_SEL); 829 vop2->old_port_sel = vop2_readl(vop2, RK3568_OVL_PORT_SEL); 830 } 831 832 vop2_writel(vop2, RK3568_REG_CFG_DONE, RK3568_REG_CFG_DONE__GLB_CFG_DONE_EN); 833 834 /* 835 * Disable auto gating, this is a workaround to 836 * avoid display image shift when a window enabled. 837 */ 838 regmap_clear_bits(vop2->map, RK3568_SYS_AUTO_GATING_CTRL, 839 RK3568_SYS_AUTO_GATING_CTRL__AUTO_GATING_EN); 840 841 vop2_writel(vop2, RK3568_SYS0_INT_CLR, 842 VOP2_INT_BUS_ERRPR << 16 | VOP2_INT_BUS_ERRPR); 843 vop2_writel(vop2, RK3568_SYS0_INT_EN, 844 VOP2_INT_BUS_ERRPR << 16 | VOP2_INT_BUS_ERRPR); 845 vop2_writel(vop2, RK3568_SYS1_INT_CLR, 846 VOP2_INT_BUS_ERRPR << 16 | VOP2_INT_BUS_ERRPR); 847 vop2_writel(vop2, RK3568_SYS1_INT_EN, 848 VOP2_INT_BUS_ERRPR << 16 | VOP2_INT_BUS_ERRPR); 849 } 850 851 static void vop2_disable(struct vop2 *vop2) 852 { 853 rockchip_drm_dma_detach_device(vop2->drm, vop2->dev); 854 855 pm_runtime_put_sync(vop2->dev); 856 857 regcache_drop_region(vop2->map, 0, vop2_regmap_config.max_register); 858 859 clk_disable_unprepare(vop2->pclk); 860 clk_disable_unprepare(vop2->aclk); 861 clk_disable_unprepare(vop2->hclk); 862 } 863 864 static bool vop2_vp_dsp_lut_is_enabled(struct vop2_video_port *vp) 865 { 866 u32 dsp_ctrl = vop2_vp_read(vp, RK3568_VP_DSP_CTRL); 867 868 return dsp_ctrl & RK3568_VP_DSP_CTRL__DSP_LUT_EN; 869 } 870 871 static void vop2_vp_dsp_lut_disable(struct vop2_video_port *vp) 872 { 873 u32 dsp_ctrl = vop2_vp_read(vp, RK3568_VP_DSP_CTRL); 874 875 dsp_ctrl &= ~RK3568_VP_DSP_CTRL__DSP_LUT_EN; 876 vop2_vp_write(vp, RK3568_VP_DSP_CTRL, dsp_ctrl); 877 } 878 879 static bool vop2_vp_dsp_lut_poll_disabled(struct vop2_video_port *vp) 880 { 881 u32 dsp_ctrl; 882 int ret = readx_poll_timeout(vop2_vp_dsp_lut_is_enabled, vp, dsp_ctrl, 883 !dsp_ctrl, 5, 30 * 1000); 884 if (ret) { 885 drm_err(vp->vop2->drm, "display LUT RAM enable timeout!\n"); 886 return false; 887 } 888 889 return true; 890 } 891 892 static void vop2_vp_dsp_lut_enable(struct vop2_video_port *vp) 893 { 894 u32 dsp_ctrl = vop2_vp_read(vp, RK3568_VP_DSP_CTRL); 895 896 dsp_ctrl |= RK3568_VP_DSP_CTRL__DSP_LUT_EN; 897 vop2_vp_write(vp, RK3568_VP_DSP_CTRL, dsp_ctrl); 898 } 899 900 static void vop2_vp_dsp_lut_update_enable(struct vop2_video_port *vp) 901 { 902 u32 dsp_ctrl = vop2_vp_read(vp, RK3568_VP_DSP_CTRL); 903 904 dsp_ctrl |= RK3588_VP_DSP_CTRL__GAMMA_UPDATE_EN; 905 vop2_vp_write(vp, RK3568_VP_DSP_CTRL, dsp_ctrl); 906 } 907 908 static inline bool vop2_supports_seamless_gamma_lut_update(struct vop2 *vop2) 909 { 910 return vop2->version != VOP_VERSION_RK3568; 911 } 912 913 static bool vop2_gamma_lut_in_use(struct vop2 *vop2, struct vop2_video_port *vp) 914 { 915 const int nr_vps = vop2->data->nr_vps; 916 int gamma_en_vp_id; 917 918 for (gamma_en_vp_id = 0; gamma_en_vp_id < nr_vps; gamma_en_vp_id++) 919 if (vop2_vp_dsp_lut_is_enabled(&vop2->vps[gamma_en_vp_id])) 920 break; 921 922 return gamma_en_vp_id != nr_vps && gamma_en_vp_id != vp->id; 923 } 924 925 static void vop2_crtc_atomic_disable(struct drm_crtc *crtc, 926 struct drm_atomic_state *state) 927 { 928 struct vop2_video_port *vp = to_vop2_video_port(crtc); 929 struct vop2 *vop2 = vp->vop2; 930 struct drm_crtc_state *old_crtc_state; 931 int ret; 932 933 vop2_lock(vop2); 934 935 old_crtc_state = drm_atomic_get_old_crtc_state(state, crtc); 936 drm_atomic_helper_disable_planes_on_crtc(old_crtc_state, false); 937 938 drm_crtc_vblank_off(crtc); 939 940 /* 941 * Vop standby will take effect at end of current frame, 942 * if dsp hold valid irq happen, it means standby complete. 943 * 944 * we must wait standby complete when we want to disable aclk, 945 * if not, memory bus maybe dead. 946 */ 947 reinit_completion(&vp->dsp_hold_completion); 948 949 vop2_crtc_enable_irq(vp, VP_INT_DSP_HOLD_VALID); 950 951 vop2_vp_write(vp, RK3568_VP_DSP_CTRL, RK3568_VP_DSP_CTRL__STANDBY); 952 953 ret = wait_for_completion_timeout(&vp->dsp_hold_completion, 954 msecs_to_jiffies(50)); 955 if (!ret) 956 drm_info(vop2->drm, "wait for vp%d dsp_hold timeout\n", vp->id); 957 958 vop2_crtc_disable_irq(vp, VP_INT_DSP_HOLD_VALID); 959 960 if (vp->dclk_src) 961 clk_set_parent(vp->dclk, vp->dclk_src); 962 963 clk_disable_unprepare(vp->dclk); 964 965 vop2->enable_count--; 966 967 if (!vop2->enable_count) 968 vop2_disable(vop2); 969 970 vop2_unlock(vop2); 971 972 if (crtc->state->event && !crtc->state->active) { 973 spin_lock_irq(&crtc->dev->event_lock); 974 drm_crtc_send_vblank_event(crtc, crtc->state->event); 975 spin_unlock_irq(&crtc->dev->event_lock); 976 977 crtc->state->event = NULL; 978 } 979 } 980 981 static int vop2_plane_atomic_check(struct drm_plane *plane, 982 struct drm_atomic_state *astate) 983 { 984 struct drm_plane_state *pstate = drm_atomic_get_new_plane_state(astate, plane); 985 struct drm_framebuffer *fb = pstate->fb; 986 struct drm_crtc *crtc = pstate->crtc; 987 struct drm_crtc_state *cstate; 988 struct vop2_video_port *vp; 989 struct vop2_win *win = to_vop2_win(plane); 990 struct vop2 *vop2; 991 const struct vop2_data *vop2_data; 992 struct drm_rect *dest = &pstate->dst; 993 struct drm_rect *src = &pstate->src; 994 int min_scale = FRAC_16_16(1, 8); 995 int max_scale = FRAC_16_16(8, 1); 996 int src_x, src_w, src_h; 997 int dest_w, dest_h; 998 int format; 999 int ret; 1000 1001 if (!crtc) 1002 return 0; 1003 1004 vp = to_vop2_video_port(crtc); 1005 vop2 = vp->vop2; 1006 vop2_data = vop2->data; 1007 1008 cstate = drm_atomic_get_new_crtc_state(pstate->state, crtc); 1009 if (WARN_ON(!cstate)) 1010 return -EINVAL; 1011 1012 ret = drm_atomic_helper_check_plane_state(pstate, cstate, 1013 min_scale, max_scale, 1014 true, true); 1015 if (ret) 1016 return ret; 1017 1018 if (!pstate->visible) 1019 return 0; 1020 1021 format = vop2_convert_format(fb->format->format); 1022 /* We shouldn't be able to create a fb for an unsupported format */ 1023 if (WARN_ON(format < 0)) 1024 return format; 1025 1026 /* Co-ordinates have now been clipped */ 1027 src_x = src->x1 >> 16; 1028 src_w = drm_rect_width(src) >> 16; 1029 src_h = drm_rect_height(src) >> 16; 1030 dest_w = drm_rect_width(dest); 1031 dest_h = drm_rect_height(dest); 1032 1033 if (src_w < 4 || src_h < 4 || dest_w < 4 || dest_h < 4) { 1034 drm_dbg_kms(vop2->drm, "Invalid size: %dx%d->%dx%d, min size is 4x4\n", 1035 src_w, src_h, dest_w, dest_h); 1036 return -EINVAL; 1037 } 1038 1039 if (src_w > vop2_data->max_input.width || 1040 src_h > vop2_data->max_input.height) { 1041 drm_dbg_kms(vop2->drm, "Invalid source: %dx%d. max input: %dx%d\n", 1042 src_w, src_h, 1043 vop2_data->max_input.width, 1044 vop2_data->max_input.height); 1045 return -EINVAL; 1046 } 1047 1048 /* 1049 * Src.x1 can be odd when do clip, but yuv plane start point 1050 * need align with 2 pixel. 1051 */ 1052 if (fb->format->is_yuv && src_x % 2) { 1053 drm_dbg_kms(vop2->drm, "Invalid Source: Yuv format not support odd xpos\n"); 1054 return -EINVAL; 1055 } 1056 1057 /* 1058 * This is workaround solution for IC design: 1059 * esmart can't support scale down when src_w % 16 == 1. 1060 */ 1061 if (!vop2_cluster_window(win) && src_w > dest_w && (src_w & 1)) { 1062 drm_dbg_kms(vop2->drm, 1063 "Esmart windows cannot downscale odd-width source regions\n"); 1064 return -EINVAL; 1065 } 1066 1067 if (vop2->version == VOP_VERSION_RK3568 && drm_is_afbc(fb->modifier) && src_w % 4) { 1068 drm_dbg_kms(vop2->drm, 1069 "AFBC source rectangles must be 4-pixel aligned; is %d\n", 1070 src_w); 1071 return -EINVAL; 1072 } 1073 1074 if (drm_is_afbc(fb->modifier) && 1075 pstate->rotation & 1076 (DRM_MODE_REFLECT_X | DRM_MODE_ROTATE_90 | DRM_MODE_ROTATE_270) && 1077 (fb->pitches[0] << 3) / vop2_get_bpp(fb->format) % 64) { 1078 drm_dbg_kms(vop2->drm, 1079 "AFBC buffers must be 64-pixel aligned for horizontal rotation or mirroring\n"); 1080 return -EINVAL; 1081 } 1082 1083 return 0; 1084 } 1085 1086 static void vop2_plane_atomic_disable(struct drm_plane *plane, 1087 struct drm_atomic_state *state) 1088 { 1089 struct drm_plane_state *old_pstate = NULL; 1090 struct vop2_win *win = to_vop2_win(plane); 1091 struct vop2 *vop2 = win->vop2; 1092 1093 drm_dbg(vop2->drm, "%s disable\n", win->data->name); 1094 1095 if (state) 1096 old_pstate = drm_atomic_get_old_plane_state(state, plane); 1097 if (old_pstate && !old_pstate->crtc) 1098 return; 1099 1100 vop2_win_disable(win); 1101 vop2_win_write(win, VOP2_WIN_YUV_CLIP, 0); 1102 } 1103 1104 /* 1105 * The color key is 10 bit, so all format should 1106 * convert to 10 bit here. 1107 */ 1108 static void vop2_plane_setup_color_key(struct drm_plane *plane, u32 color_key) 1109 { 1110 struct drm_plane_state *pstate = plane->state; 1111 struct drm_framebuffer *fb = pstate->fb; 1112 struct vop2_win *win = to_vop2_win(plane); 1113 u32 color_key_en = 0; 1114 u32 r = 0; 1115 u32 g = 0; 1116 u32 b = 0; 1117 1118 if (!(color_key & VOP2_COLOR_KEY_MASK) || fb->format->is_yuv) { 1119 vop2_win_write(win, VOP2_WIN_COLOR_KEY_EN, 0); 1120 return; 1121 } 1122 1123 switch (fb->format->format) { 1124 case DRM_FORMAT_RGB565: 1125 case DRM_FORMAT_BGR565: 1126 r = (color_key & 0xf800) >> 11; 1127 g = (color_key & 0x7e0) >> 5; 1128 b = (color_key & 0x1f); 1129 r <<= 5; 1130 g <<= 4; 1131 b <<= 5; 1132 color_key_en = 1; 1133 break; 1134 case DRM_FORMAT_XRGB8888: 1135 case DRM_FORMAT_ARGB8888: 1136 case DRM_FORMAT_XBGR8888: 1137 case DRM_FORMAT_ABGR8888: 1138 case DRM_FORMAT_RGB888: 1139 case DRM_FORMAT_BGR888: 1140 r = (color_key & 0xff0000) >> 16; 1141 g = (color_key & 0xff00) >> 8; 1142 b = (color_key & 0xff); 1143 r <<= 2; 1144 g <<= 2; 1145 b <<= 2; 1146 color_key_en = 1; 1147 break; 1148 } 1149 1150 vop2_win_write(win, VOP2_WIN_COLOR_KEY_EN, color_key_en); 1151 vop2_win_write(win, VOP2_WIN_COLOR_KEY, (r << 20) | (g << 10) | b); 1152 } 1153 1154 static void vop2_plane_atomic_update(struct drm_plane *plane, 1155 struct drm_atomic_state *state) 1156 { 1157 struct drm_plane_state *pstate = plane->state; 1158 struct drm_crtc *crtc = pstate->crtc; 1159 struct vop2_win *win = to_vop2_win(plane); 1160 struct vop2_video_port *vp = to_vop2_video_port(crtc); 1161 struct drm_display_mode *adjusted_mode = &crtc->state->adjusted_mode; 1162 struct vop2 *vop2 = win->vop2; 1163 struct drm_framebuffer *fb = pstate->fb; 1164 u32 bpp = vop2_get_bpp(fb->format); 1165 u32 src_w, src_h, dsp_w, dsp_h; 1166 u32 act_info, dsp_info; 1167 u32 format; 1168 u32 afbc_format; 1169 u32 rb_swap; 1170 u32 uv_swap; 1171 struct drm_rect *src = &pstate->src; 1172 struct drm_rect *dest = &pstate->dst; 1173 u32 afbc_tile_num; 1174 u32 transform_offset; 1175 bool dither_up; 1176 bool xmirror = pstate->rotation & DRM_MODE_REFLECT_X ? true : false; 1177 bool ymirror = pstate->rotation & DRM_MODE_REFLECT_Y ? true : false; 1178 bool rotate_270 = pstate->rotation & DRM_MODE_ROTATE_270; 1179 bool rotate_90 = pstate->rotation & DRM_MODE_ROTATE_90; 1180 struct rockchip_gem_object *rk_obj; 1181 unsigned long offset; 1182 bool half_block_en; 1183 bool afbc_en; 1184 dma_addr_t yrgb_mst; 1185 dma_addr_t uv_mst; 1186 1187 /* 1188 * can't update plane when vop2 is disabled. 1189 */ 1190 if (WARN_ON(!crtc)) 1191 return; 1192 1193 if (!pstate->visible) { 1194 vop2_plane_atomic_disable(plane, state); 1195 return; 1196 } 1197 1198 afbc_en = drm_is_afbc(fb->modifier); 1199 1200 offset = (src->x1 >> 16) * fb->format->cpp[0]; 1201 1202 /* 1203 * AFBC HDR_PTR must set to the zero offset of the framebuffer. 1204 */ 1205 if (afbc_en) 1206 offset = 0; 1207 else if (pstate->rotation & DRM_MODE_REFLECT_Y) 1208 offset += ((src->y2 >> 16) - 1) * fb->pitches[0]; 1209 else 1210 offset += (src->y1 >> 16) * fb->pitches[0]; 1211 1212 rk_obj = to_rockchip_obj(fb->obj[0]); 1213 1214 yrgb_mst = rk_obj->dma_addr + offset + fb->offsets[0]; 1215 if (fb->format->is_yuv) { 1216 int hsub = fb->format->hsub; 1217 int vsub = fb->format->vsub; 1218 1219 offset = (src->x1 >> 16) * fb->format->cpp[1] / hsub; 1220 offset += (src->y1 >> 16) * fb->pitches[1] / vsub; 1221 1222 if ((pstate->rotation & DRM_MODE_REFLECT_Y) && !afbc_en) 1223 offset += fb->pitches[1] * ((pstate->src_h >> 16) - 2) / vsub; 1224 1225 rk_obj = to_rockchip_obj(fb->obj[0]); 1226 uv_mst = rk_obj->dma_addr + offset + fb->offsets[1]; 1227 } 1228 1229 src_w = drm_rect_width(src) >> 16; 1230 src_h = drm_rect_height(src) >> 16; 1231 dsp_w = drm_rect_width(dest); 1232 dsp_h = drm_rect_height(dest); 1233 1234 /* drm_atomic_helper_check_plane_state calls drm_rect_clip_scaled for 1235 * us, which keeps our planes bounded within the CRTC active area 1236 */ 1237 if (WARN_ON(dest->x1 + dsp_w > adjusted_mode->hdisplay) || 1238 WARN_ON(dest->y1 + dsp_h > adjusted_mode->vdisplay) || 1239 WARN_ON(dsp_w < 4) || WARN_ON(dsp_h < 4) || 1240 WARN_ON(src_w < 4) || WARN_ON(src_h < 4)) 1241 return; 1242 1243 if (vop2->version == VOP_VERSION_RK3568 && drm_is_afbc(fb->modifier)) 1244 if (WARN_ON(src_w % 4)) 1245 return; 1246 1247 act_info = (src_h - 1) << 16 | ((src_w - 1) & 0xffff); 1248 dsp_info = (dsp_h - 1) << 16 | ((dsp_w - 1) & 0xffff); 1249 1250 format = vop2_convert_format(fb->format->format); 1251 half_block_en = vop2_half_block_enable(pstate); 1252 1253 drm_dbg(vop2->drm, "vp%d update %s[%dx%d->%dx%d@%dx%d] fmt[%p4cc_%s] addr[%pad]\n", 1254 vp->id, win->data->name, src_w, src_h, dsp_w, dsp_h, 1255 dest->x1, dest->y1, 1256 &fb->format->format, 1257 afbc_en ? "AFBC" : "", &yrgb_mst); 1258 1259 if (vop2->version > VOP_VERSION_RK3568) { 1260 vop2_win_write(win, VOP2_WIN_AXI_BUS_ID, win->data->axi_bus_id); 1261 vop2_win_write(win, VOP2_WIN_AXI_YRGB_R_ID, win->data->axi_yrgb_r_id); 1262 vop2_win_write(win, VOP2_WIN_AXI_UV_R_ID, win->data->axi_uv_r_id); 1263 } 1264 1265 if (vop2->version >= VOP_VERSION_RK3576) 1266 vop2_win_write(win, VOP2_WIN_VP_SEL, vp->id); 1267 1268 if (vop2_cluster_window(win)) 1269 vop2_win_write(win, VOP2_WIN_AFBC_HALF_BLOCK_EN, half_block_en); 1270 1271 if (afbc_en) { 1272 u32 stride, block_w; 1273 1274 /* the afbc superblock is 16 x 16 or 32 x 8 */ 1275 block_w = fb->modifier & AFBC_FORMAT_MOD_BLOCK_SIZE_32x8 ? 32 : 16; 1276 1277 afbc_format = vop2_convert_afbc_format(fb->format->format); 1278 1279 /* Enable color transform for YTR */ 1280 if (fb->modifier & AFBC_FORMAT_MOD_YTR) 1281 afbc_format |= (1 << 4); 1282 1283 afbc_tile_num = ALIGN(src_w, block_w) / block_w; 1284 1285 /* 1286 * AFBC pic_vir_width is count by pixel, this is different 1287 * with WIN_VIR_STRIDE. 1288 */ 1289 stride = (fb->pitches[0] << 3) / bpp; 1290 1291 /* It's for head stride, each head size is 16 byte */ 1292 stride = ALIGN(stride, block_w) / block_w * 16; 1293 1294 uv_swap = vop2_afbc_uv_swap(fb->format->format); 1295 /* 1296 * This is a workaround for crazy IC design, Cluster 1297 * and Esmart/Smart use different format configuration map: 1298 * YUV420_10BIT: 0x10 for Cluster, 0x14 for Esmart/Smart. 1299 * 1300 * This is one thing we can make the convert simple: 1301 * AFBCD decode all the YUV data to YUV444. So we just 1302 * set all the yuv 10 bit to YUV444_10. 1303 */ 1304 if (fb->format->is_yuv && bpp == 10) 1305 format = VOP2_CLUSTER_YUV444_10; 1306 1307 if (vop2_cluster_window(win)) 1308 vop2_win_write(win, VOP2_WIN_AFBC_ENABLE, 1); 1309 vop2_win_write(win, VOP2_WIN_AFBC_FORMAT, afbc_format); 1310 vop2_win_write(win, VOP2_WIN_AFBC_UV_SWAP, uv_swap); 1311 /* 1312 * On rk3566/8, this bit is auto gating enable, 1313 * but this function is not work well so we need 1314 * to disable it for these two platform. 1315 * On rk3588, and the following new soc(rk3528/rk3576), 1316 * this bit is gating disable, we should write 1 to 1317 * disable gating when enable afbc. 1318 */ 1319 if (vop2->version == VOP_VERSION_RK3568) 1320 vop2_win_write(win, VOP2_WIN_AFBC_AUTO_GATING_EN, 0); 1321 else 1322 vop2_win_write(win, VOP2_WIN_AFBC_AUTO_GATING_EN, 1); 1323 1324 if (fb->modifier & AFBC_FORMAT_MOD_SPLIT) 1325 vop2_win_write(win, VOP2_WIN_AFBC_BLOCK_SPLIT_EN, 1); 1326 else 1327 vop2_win_write(win, VOP2_WIN_AFBC_BLOCK_SPLIT_EN, 0); 1328 1329 if (vop2->version >= VOP_VERSION_RK3576) { 1330 vop2_win_write(win, VOP2_WIN_AFBC_PLD_OFFSET_EN, 1); 1331 vop2_win_write(win, VOP2_WIN_AFBC_PLD_OFFSET, yrgb_mst); 1332 } 1333 1334 transform_offset = vop2_afbc_transform_offset(pstate, half_block_en); 1335 vop2_win_write(win, VOP2_WIN_AFBC_HDR_PTR, yrgb_mst); 1336 vop2_win_write(win, VOP2_WIN_AFBC_PIC_SIZE, act_info); 1337 vop2_win_write(win, VOP2_WIN_TRANSFORM_OFFSET, transform_offset); 1338 vop2_win_write(win, VOP2_WIN_AFBC_PIC_OFFSET, ((src->x1 >> 16) | src->y1)); 1339 vop2_win_write(win, VOP2_WIN_AFBC_DSP_OFFSET, (dest->x1 | (dest->y1 << 16))); 1340 vop2_win_write(win, VOP2_WIN_AFBC_PIC_VIR_WIDTH, stride); 1341 vop2_win_write(win, VOP2_WIN_AFBC_TILE_NUM, afbc_tile_num); 1342 vop2_win_write(win, VOP2_WIN_XMIRROR, xmirror); 1343 vop2_win_write(win, VOP2_WIN_AFBC_ROTATE_270, rotate_270); 1344 vop2_win_write(win, VOP2_WIN_AFBC_ROTATE_90, rotate_90); 1345 } else { 1346 if (vop2_cluster_window(win)) { 1347 vop2_win_write(win, VOP2_WIN_AFBC_ENABLE, 0); 1348 vop2_win_write(win, VOP2_WIN_TRANSFORM_OFFSET, 0); 1349 } 1350 1351 vop2_win_write(win, VOP2_WIN_YRGB_VIR, DIV_ROUND_UP(fb->pitches[0], 4)); 1352 } 1353 1354 vop2_win_write(win, VOP2_WIN_YMIRROR, ymirror); 1355 1356 if (rotate_90 || rotate_270) { 1357 act_info = swahw32(act_info); 1358 src_w = drm_rect_height(src) >> 16; 1359 src_h = drm_rect_width(src) >> 16; 1360 } 1361 1362 vop2_win_write(win, VOP2_WIN_FORMAT, format); 1363 vop2_win_write(win, VOP2_WIN_YRGB_MST, yrgb_mst); 1364 1365 rb_swap = vop2_win_rb_swap(fb->format->format); 1366 vop2_win_write(win, VOP2_WIN_RB_SWAP, rb_swap); 1367 uv_swap = vop2_win_uv_swap(fb->format->format); 1368 vop2_win_write(win, VOP2_WIN_UV_SWAP, uv_swap); 1369 1370 if (fb->format->is_yuv) { 1371 vop2_win_write(win, VOP2_WIN_UV_VIR, DIV_ROUND_UP(fb->pitches[1], 4)); 1372 vop2_win_write(win, VOP2_WIN_UV_MST, uv_mst); 1373 } 1374 1375 vop2_setup_scale(vop2, win, src_w, src_h, dsp_w, dsp_h, fb->format->format); 1376 if (!vop2_cluster_window(win)) 1377 vop2_plane_setup_color_key(plane, 0); 1378 vop2_win_write(win, VOP2_WIN_ACT_INFO, act_info); 1379 vop2_win_write(win, VOP2_WIN_DSP_INFO, dsp_info); 1380 vop2_win_write(win, VOP2_WIN_DSP_ST, dest->y1 << 16 | (dest->x1 & 0xffff)); 1381 1382 vop2_setup_csc_mode(vp, win, pstate); 1383 1384 dither_up = vop2_win_dither_up(fb->format->format); 1385 vop2_win_write(win, VOP2_WIN_DITHER_UP, dither_up); 1386 1387 vop2_win_write(win, VOP2_WIN_ENABLE, 1); 1388 1389 if (vop2_cluster_window(win)) { 1390 int lb_mode = vop2_get_cluster_lb_mode(win, pstate); 1391 1392 vop2_win_write(win, VOP2_WIN_CLUSTER_LB_MODE, lb_mode); 1393 vop2_win_write(win, VOP2_WIN_CLUSTER_ENABLE, 1); 1394 } 1395 } 1396 1397 static const struct drm_plane_helper_funcs vop2_plane_helper_funcs = { 1398 .atomic_check = vop2_plane_atomic_check, 1399 .atomic_update = vop2_plane_atomic_update, 1400 .atomic_disable = vop2_plane_atomic_disable, 1401 }; 1402 1403 static const struct drm_plane_funcs vop2_plane_funcs = { 1404 .update_plane = drm_atomic_helper_update_plane, 1405 .disable_plane = drm_atomic_helper_disable_plane, 1406 .destroy = drm_plane_cleanup, 1407 .reset = drm_atomic_helper_plane_reset, 1408 .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state, 1409 .atomic_destroy_state = drm_atomic_helper_plane_destroy_state, 1410 .format_mod_supported = rockchip_vop2_mod_supported, 1411 }; 1412 1413 static int vop2_crtc_enable_vblank(struct drm_crtc *crtc) 1414 { 1415 struct vop2_video_port *vp = to_vop2_video_port(crtc); 1416 1417 vop2_crtc_enable_irq(vp, VP_INT_FS_FIELD); 1418 1419 return 0; 1420 } 1421 1422 static void vop2_crtc_disable_vblank(struct drm_crtc *crtc) 1423 { 1424 struct vop2_video_port *vp = to_vop2_video_port(crtc); 1425 1426 vop2_crtc_disable_irq(vp, VP_INT_FS_FIELD); 1427 } 1428 1429 static enum drm_mode_status vop2_crtc_mode_valid(struct drm_crtc *crtc, 1430 const struct drm_display_mode *mode) 1431 { 1432 struct vop2_video_port *vp = to_vop2_video_port(crtc); 1433 1434 if (mode->hdisplay > vp->data->max_output.width) 1435 return MODE_BAD_HVALUE; 1436 1437 return MODE_OK; 1438 } 1439 1440 static bool vop2_crtc_mode_fixup(struct drm_crtc *crtc, 1441 const struct drm_display_mode *mode, 1442 struct drm_display_mode *adj_mode) 1443 { 1444 drm_mode_set_crtcinfo(adj_mode, CRTC_INTERLACE_HALVE_V | 1445 CRTC_STEREO_DOUBLE); 1446 1447 return true; 1448 } 1449 1450 static void vop2_crtc_write_gamma_lut(struct vop2 *vop2, struct drm_crtc *crtc) 1451 { 1452 const struct vop2_video_port *vp = to_vop2_video_port(crtc); 1453 const struct vop2_video_port_data *vp_data = &vop2->data->vp[vp->id]; 1454 struct drm_color_lut *lut = crtc->state->gamma_lut->data; 1455 unsigned int i, bpc = ilog2(vp_data->gamma_lut_len); 1456 u32 word; 1457 1458 for (i = 0; i < crtc->gamma_size; i++) { 1459 word = (drm_color_lut_extract(lut[i].blue, bpc) << (2 * bpc)) | 1460 (drm_color_lut_extract(lut[i].green, bpc) << bpc) | 1461 drm_color_lut_extract(lut[i].red, bpc); 1462 1463 writel(word, vop2->lut_regs + i * 4); 1464 } 1465 } 1466 1467 static void vop2_crtc_atomic_set_gamma_seamless(struct vop2 *vop2, 1468 struct vop2_video_port *vp, 1469 struct drm_crtc *crtc) 1470 { 1471 vop2_writel(vop2, RK3568_LUT_PORT_SEL, 1472 FIELD_PREP(RK3588_LUT_PORT_SEL__GAMMA_AHB_WRITE_SEL, vp->id)); 1473 vop2_vp_dsp_lut_enable(vp); 1474 vop2_crtc_write_gamma_lut(vop2, crtc); 1475 vop2_vp_dsp_lut_update_enable(vp); 1476 } 1477 1478 static void vop2_crtc_atomic_set_gamma_rk356x(struct vop2 *vop2, 1479 struct vop2_video_port *vp, 1480 struct drm_crtc *crtc) 1481 { 1482 vop2_vp_dsp_lut_disable(vp); 1483 vop2_cfg_done(vp); 1484 if (!vop2_vp_dsp_lut_poll_disabled(vp)) 1485 return; 1486 1487 vop2_writel(vop2, RK3568_LUT_PORT_SEL, vp->id); 1488 vop2_crtc_write_gamma_lut(vop2, crtc); 1489 vop2_vp_dsp_lut_enable(vp); 1490 } 1491 1492 static void vop2_crtc_atomic_try_set_gamma(struct vop2 *vop2, 1493 struct vop2_video_port *vp, 1494 struct drm_crtc *crtc, 1495 struct drm_crtc_state *crtc_state) 1496 { 1497 if (!vop2->lut_regs) 1498 return; 1499 1500 if (!crtc_state->gamma_lut) { 1501 vop2_vp_dsp_lut_disable(vp); 1502 return; 1503 } 1504 1505 if (vop2_supports_seamless_gamma_lut_update(vop2)) 1506 vop2_crtc_atomic_set_gamma_seamless(vop2, vp, crtc); 1507 else 1508 vop2_crtc_atomic_set_gamma_rk356x(vop2, vp, crtc); 1509 } 1510 1511 static inline void vop2_crtc_atomic_try_set_gamma_locked(struct vop2 *vop2, 1512 struct vop2_video_port *vp, 1513 struct drm_crtc *crtc, 1514 struct drm_crtc_state *crtc_state) 1515 { 1516 vop2_lock(vop2); 1517 vop2_crtc_atomic_try_set_gamma(vop2, vp, crtc, crtc_state); 1518 vop2_unlock(vop2); 1519 } 1520 1521 static void vop2_dither_setup(struct drm_crtc *crtc, u32 *dsp_ctrl) 1522 { 1523 struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(crtc->state); 1524 1525 switch (vcstate->bus_format) { 1526 case MEDIA_BUS_FMT_RGB565_1X16: 1527 *dsp_ctrl |= RK3568_VP_DSP_CTRL__DITHER_DOWN_EN; 1528 break; 1529 case MEDIA_BUS_FMT_RGB666_1X18: 1530 case MEDIA_BUS_FMT_RGB666_1X24_CPADHI: 1531 case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: 1532 *dsp_ctrl |= RK3568_VP_DSP_CTRL__DITHER_DOWN_EN; 1533 *dsp_ctrl |= RGB888_TO_RGB666; 1534 break; 1535 case MEDIA_BUS_FMT_YUV8_1X24: 1536 case MEDIA_BUS_FMT_UYYVYY8_0_5X24: 1537 *dsp_ctrl |= RK3568_VP_DSP_CTRL__PRE_DITHER_DOWN_EN; 1538 break; 1539 default: 1540 break; 1541 } 1542 1543 if (vcstate->output_mode != ROCKCHIP_OUT_MODE_AAAA) 1544 *dsp_ctrl |= RK3568_VP_DSP_CTRL__PRE_DITHER_DOWN_EN; 1545 1546 *dsp_ctrl |= FIELD_PREP(RK3568_VP_DSP_CTRL__DITHER_DOWN_SEL, 1547 DITHER_DOWN_ALLEGRO); 1548 } 1549 1550 static void vop2_post_config(struct drm_crtc *crtc) 1551 { 1552 struct vop2_video_port *vp = to_vop2_video_port(crtc); 1553 struct vop2 *vop2 = vp->vop2; 1554 struct drm_display_mode *mode = &crtc->state->adjusted_mode; 1555 u16 vtotal = mode->crtc_vtotal; 1556 u16 hdisplay = mode->crtc_hdisplay; 1557 u16 hact_st = mode->crtc_htotal - mode->crtc_hsync_start; 1558 u16 vdisplay = mode->crtc_vdisplay; 1559 u16 vact_st = mode->crtc_vtotal - mode->crtc_vsync_start; 1560 u32 left_margin = 100, right_margin = 100; 1561 u32 top_margin = 100, bottom_margin = 100; 1562 u16 hsize = hdisplay * (left_margin + right_margin) / 200; 1563 u16 vsize = vdisplay * (top_margin + bottom_margin) / 200; 1564 u16 hact_end, vact_end; 1565 u32 val; 1566 1567 vop2->ops->setup_bg_dly(vp); 1568 1569 vsize = rounddown(vsize, 2); 1570 hsize = rounddown(hsize, 2); 1571 hact_st += hdisplay * (100 - left_margin) / 200; 1572 hact_end = hact_st + hsize; 1573 val = hact_st << 16; 1574 val |= hact_end; 1575 vop2_vp_write(vp, RK3568_VP_POST_DSP_HACT_INFO, val); 1576 vact_st += vdisplay * (100 - top_margin) / 200; 1577 vact_end = vact_st + vsize; 1578 val = vact_st << 16; 1579 val |= vact_end; 1580 vop2_vp_write(vp, RK3568_VP_POST_DSP_VACT_INFO, val); 1581 val = scl_cal_scale2(vdisplay, vsize) << 16; 1582 val |= scl_cal_scale2(hdisplay, hsize); 1583 vop2_vp_write(vp, RK3568_VP_POST_SCL_FACTOR_YRGB, val); 1584 1585 val = 0; 1586 if (hdisplay != hsize) 1587 val |= RK3568_VP_POST_SCL_CTRL__HSCALEDOWN; 1588 if (vdisplay != vsize) 1589 val |= RK3568_VP_POST_SCL_CTRL__VSCALEDOWN; 1590 vop2_vp_write(vp, RK3568_VP_POST_SCL_CTRL, val); 1591 1592 if (mode->flags & DRM_MODE_FLAG_INTERLACE) { 1593 u16 vact_st_f1 = vtotal + vact_st + 1; 1594 u16 vact_end_f1 = vact_st_f1 + vsize; 1595 1596 val = vact_st_f1 << 16 | vact_end_f1; 1597 vop2_vp_write(vp, RK3568_VP_POST_DSP_VACT_INFO_F1, val); 1598 } 1599 1600 vop2_vp_write(vp, RK3568_VP_DSP_BG, 0); 1601 } 1602 1603 static int us_to_vertical_line(struct drm_display_mode *mode, int us) 1604 { 1605 return us * mode->clock / mode->htotal / 1000; 1606 } 1607 1608 static void vop2_crtc_atomic_enable(struct drm_crtc *crtc, 1609 struct drm_atomic_state *state) 1610 { 1611 struct vop2_video_port *vp = to_vop2_video_port(crtc); 1612 struct vop2 *vop2 = vp->vop2; 1613 const struct vop2_data *vop2_data = vop2->data; 1614 const struct vop2_video_port_data *vp_data = &vop2_data->vp[vp->id]; 1615 struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc); 1616 struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(crtc->state); 1617 struct drm_display_mode *mode = &crtc->state->adjusted_mode; 1618 unsigned long clock = mode->crtc_clock * 1000; 1619 u16 hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start; 1620 u16 hdisplay = mode->crtc_hdisplay; 1621 u16 htotal = mode->crtc_htotal; 1622 u16 hact_st = mode->crtc_htotal - mode->crtc_hsync_start; 1623 u16 hact_end = hact_st + hdisplay; 1624 u16 vdisplay = mode->crtc_vdisplay; 1625 u16 vtotal = mode->crtc_vtotal; 1626 u16 vsync_len = mode->crtc_vsync_end - mode->crtc_vsync_start; 1627 u16 vact_st = mode->crtc_vtotal - mode->crtc_vsync_start; 1628 u16 vact_end = vact_st + vdisplay; 1629 u8 out_mode; 1630 u32 dsp_ctrl = 0; 1631 int act_end; 1632 u32 val, polflags; 1633 int ret; 1634 struct drm_encoder *encoder; 1635 1636 drm_dbg(vop2->drm, "Update mode to %dx%d%s%d, type: %d for vp%d\n", 1637 hdisplay, vdisplay, mode->flags & DRM_MODE_FLAG_INTERLACE ? "i" : "p", 1638 drm_mode_vrefresh(mode), vcstate->output_type, vp->id); 1639 1640 vop2_lock(vop2); 1641 1642 ret = clk_prepare_enable(vp->dclk); 1643 if (ret < 0) { 1644 drm_err(vop2->drm, "failed to enable dclk for video port%d - %d\n", 1645 vp->id, ret); 1646 vop2_unlock(vop2); 1647 return; 1648 } 1649 1650 if (!vop2->enable_count) 1651 vop2_enable(vop2); 1652 1653 vop2->enable_count++; 1654 1655 vcstate->yuv_overlay = is_yuv_output(vcstate->bus_format); 1656 1657 vop2_crtc_enable_irq(vp, VP_INT_POST_BUF_EMPTY); 1658 1659 polflags = 0; 1660 if (vcstate->bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE) 1661 polflags |= POLFLAG_DCLK_INV; 1662 if (mode->flags & DRM_MODE_FLAG_PHSYNC) 1663 polflags |= BIT(HSYNC_POSITIVE); 1664 if (mode->flags & DRM_MODE_FLAG_PVSYNC) 1665 polflags |= BIT(VSYNC_POSITIVE); 1666 1667 drm_for_each_encoder_mask(encoder, crtc->dev, crtc_state->encoder_mask) { 1668 struct rockchip_encoder *rkencoder = to_rockchip_encoder(encoder); 1669 1670 /* 1671 * for drive a high resolution(4KP120, 8K), vop on rk3588/rk3576 need 1672 * process multi(1/2/4/8) pixels per cycle, so the dclk feed by the 1673 * system cru may be the 1/2 or 1/4 of mode->clock. 1674 */ 1675 clock = vop2->ops->setup_intf_mux(vp, rkencoder->crtc_endpoint_id, polflags); 1676 } 1677 1678 if (!clock) { 1679 vop2_unlock(vop2); 1680 return; 1681 } 1682 1683 if (vcstate->output_mode == ROCKCHIP_OUT_MODE_AAAA && 1684 !(vp_data->feature & VOP2_VP_FEATURE_OUTPUT_10BIT)) 1685 out_mode = ROCKCHIP_OUT_MODE_P888; 1686 else 1687 out_mode = vcstate->output_mode; 1688 1689 dsp_ctrl |= FIELD_PREP(RK3568_VP_DSP_CTRL__OUT_MODE, out_mode); 1690 1691 if (vop2_output_uv_swap(vcstate->bus_format, vcstate->output_mode)) 1692 dsp_ctrl |= RK3568_VP_DSP_CTRL__DSP_RB_SWAP; 1693 if (vop2_output_rg_swap(vop2, vcstate->bus_format)) 1694 dsp_ctrl |= RK3568_VP_DSP_CTRL__DSP_RG_SWAP; 1695 1696 if (vcstate->yuv_overlay) 1697 dsp_ctrl |= RK3568_VP_DSP_CTRL__POST_DSP_OUT_R2Y; 1698 1699 vop2_dither_setup(crtc, &dsp_ctrl); 1700 1701 vop2_vp_write(vp, RK3568_VP_DSP_HTOTAL_HS_END, (htotal << 16) | hsync_len); 1702 val = hact_st << 16; 1703 val |= hact_end; 1704 vop2_vp_write(vp, RK3568_VP_DSP_HACT_ST_END, val); 1705 1706 val = vact_st << 16; 1707 val |= vact_end; 1708 vop2_vp_write(vp, RK3568_VP_DSP_VACT_ST_END, val); 1709 1710 if (mode->flags & DRM_MODE_FLAG_INTERLACE) { 1711 u16 vact_st_f1 = vtotal + vact_st + 1; 1712 u16 vact_end_f1 = vact_st_f1 + vdisplay; 1713 1714 val = vact_st_f1 << 16 | vact_end_f1; 1715 vop2_vp_write(vp, RK3568_VP_DSP_VACT_ST_END_F1, val); 1716 1717 val = vtotal << 16 | (vtotal + vsync_len); 1718 vop2_vp_write(vp, RK3568_VP_DSP_VS_ST_END_F1, val); 1719 dsp_ctrl |= RK3568_VP_DSP_CTRL__DSP_INTERLACE; 1720 dsp_ctrl |= RK3568_VP_DSP_CTRL__DSP_FILED_POL; 1721 dsp_ctrl |= RK3568_VP_DSP_CTRL__P2I_EN; 1722 vtotal += vtotal + 1; 1723 act_end = vact_end_f1; 1724 } else { 1725 act_end = vact_end; 1726 } 1727 1728 vop2_writel(vop2, RK3568_VP_LINE_FLAG(vp->id), 1729 (act_end - us_to_vertical_line(mode, 0)) << 16 | act_end); 1730 1731 vop2_vp_write(vp, RK3568_VP_DSP_VTOTAL_VS_END, vtotal << 16 | vsync_len); 1732 1733 if (mode->flags & DRM_MODE_FLAG_DBLCLK) { 1734 dsp_ctrl |= RK3568_VP_DSP_CTRL__CORE_DCLK_DIV; 1735 clock *= 2; 1736 } 1737 1738 vop2_vp_write(vp, RK3568_VP_MIPI_CTRL, 0); 1739 1740 /* 1741 * Switch to HDMI PHY PLL as DCLK source for display modes up 1742 * to 4K@60Hz, if available, otherwise keep using the system CRU. 1743 */ 1744 if (vop2->pll_hdmiphy0 || vop2->pll_hdmiphy1) { 1745 unsigned long max_dclk = DIV_ROUND_CLOSEST_ULL(VOP2_MAX_DCLK_RATE * 8, 1746 vcstate->output_bpc); 1747 if (clock <= max_dclk) { 1748 drm_for_each_encoder_mask(encoder, crtc->dev, crtc_state->encoder_mask) { 1749 struct rockchip_encoder *rkencoder = to_rockchip_encoder(encoder); 1750 1751 if (rkencoder->crtc_endpoint_id == ROCKCHIP_VOP2_EP_HDMI0) { 1752 if (!vop2->pll_hdmiphy0) 1753 break; 1754 1755 if (!vp->dclk_src) 1756 vp->dclk_src = clk_get_parent(vp->dclk); 1757 1758 ret = clk_set_parent(vp->dclk, vop2->pll_hdmiphy0); 1759 if (ret < 0) 1760 drm_warn(vop2->drm, 1761 "Could not switch to HDMI0 PHY PLL: %d\n", 1762 ret); 1763 break; 1764 } 1765 1766 if (rkencoder->crtc_endpoint_id == ROCKCHIP_VOP2_EP_HDMI1) { 1767 if (!vop2->pll_hdmiphy1) 1768 break; 1769 1770 if (!vp->dclk_src) 1771 vp->dclk_src = clk_get_parent(vp->dclk); 1772 1773 ret = clk_set_parent(vp->dclk, vop2->pll_hdmiphy1); 1774 if (ret < 0) 1775 drm_warn(vop2->drm, 1776 "Could not switch to HDMI1 PHY PLL: %d\n", 1777 ret); 1778 break; 1779 } 1780 } 1781 } 1782 } 1783 1784 clk_set_rate(vp->dclk, clock); 1785 1786 vop2_post_config(crtc); 1787 1788 vop2_cfg_done(vp); 1789 1790 vop2_vp_write(vp, RK3568_VP_DSP_CTRL, dsp_ctrl); 1791 1792 vop2_crtc_atomic_try_set_gamma(vop2, vp, crtc, crtc_state); 1793 1794 drm_crtc_vblank_on(crtc); 1795 1796 vop2_unlock(vop2); 1797 } 1798 1799 static int vop2_crtc_atomic_check_gamma(struct vop2_video_port *vp, 1800 struct drm_crtc *crtc, 1801 struct drm_atomic_state *state, 1802 struct drm_crtc_state *crtc_state) 1803 { 1804 struct vop2 *vop2 = vp->vop2; 1805 unsigned int len; 1806 1807 if (!vp->vop2->lut_regs || !crtc_state->color_mgmt_changed || 1808 !crtc_state->gamma_lut) 1809 return 0; 1810 1811 len = drm_color_lut_size(crtc_state->gamma_lut); 1812 if (len != crtc->gamma_size) { 1813 drm_dbg(vop2->drm, "Invalid LUT size; got %d, expected %d\n", 1814 len, crtc->gamma_size); 1815 return -EINVAL; 1816 } 1817 1818 if (!vop2_supports_seamless_gamma_lut_update(vop2) && vop2_gamma_lut_in_use(vop2, vp)) { 1819 drm_info(vop2->drm, "Gamma LUT can be enabled for only one CRTC at a time\n"); 1820 return -EINVAL; 1821 } 1822 1823 return 0; 1824 } 1825 1826 static int vop2_crtc_atomic_check(struct drm_crtc *crtc, 1827 struct drm_atomic_state *state) 1828 { 1829 struct vop2_video_port *vp = to_vop2_video_port(crtc); 1830 struct drm_plane *plane; 1831 int nplanes = 0; 1832 struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc); 1833 int ret; 1834 1835 ret = vop2_crtc_atomic_check_gamma(vp, crtc, state, crtc_state); 1836 if (ret) 1837 return ret; 1838 1839 drm_atomic_crtc_state_for_each_plane(plane, crtc_state) 1840 nplanes++; 1841 1842 if (nplanes > vp->nlayers) 1843 return -EINVAL; 1844 1845 return 0; 1846 } 1847 1848 static void vop2_crtc_atomic_begin(struct drm_crtc *crtc, 1849 struct drm_atomic_state *state) 1850 { 1851 struct vop2_video_port *vp = to_vop2_video_port(crtc); 1852 struct vop2 *vop2 = vp->vop2; 1853 1854 vop2->ops->setup_overlay(vp); 1855 } 1856 1857 static void vop2_crtc_atomic_flush(struct drm_crtc *crtc, 1858 struct drm_atomic_state *state) 1859 { 1860 struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc); 1861 struct vop2_video_port *vp = to_vop2_video_port(crtc); 1862 struct vop2 *vop2 = vp->vop2; 1863 1864 /* In case of modeset, gamma lut update already happened in atomic enable */ 1865 if (!drm_atomic_crtc_needs_modeset(crtc_state) && crtc_state->color_mgmt_changed) 1866 vop2_crtc_atomic_try_set_gamma_locked(vop2, vp, crtc, crtc_state); 1867 1868 vop2_post_config(crtc); 1869 1870 vop2_cfg_done(vp); 1871 1872 spin_lock_irq(&crtc->dev->event_lock); 1873 1874 if (crtc->state->event) { 1875 WARN_ON(drm_crtc_vblank_get(crtc)); 1876 vp->event = crtc->state->event; 1877 crtc->state->event = NULL; 1878 } 1879 1880 spin_unlock_irq(&crtc->dev->event_lock); 1881 } 1882 1883 static const struct drm_crtc_helper_funcs vop2_crtc_helper_funcs = { 1884 .mode_fixup = vop2_crtc_mode_fixup, 1885 .mode_valid = vop2_crtc_mode_valid, 1886 .atomic_check = vop2_crtc_atomic_check, 1887 .atomic_begin = vop2_crtc_atomic_begin, 1888 .atomic_flush = vop2_crtc_atomic_flush, 1889 .atomic_enable = vop2_crtc_atomic_enable, 1890 .atomic_disable = vop2_crtc_atomic_disable, 1891 }; 1892 1893 static void vop2_dump_connector_on_crtc(struct drm_crtc *crtc, struct seq_file *s) 1894 { 1895 struct drm_connector_list_iter conn_iter; 1896 struct drm_connector *connector; 1897 1898 drm_connector_list_iter_begin(crtc->dev, &conn_iter); 1899 drm_for_each_connector_iter(connector, &conn_iter) { 1900 if (crtc->state->connector_mask & drm_connector_mask(connector)) 1901 seq_printf(s, " Connector: %s\n", connector->name); 1902 } 1903 drm_connector_list_iter_end(&conn_iter); 1904 } 1905 1906 static int vop2_plane_state_dump(struct seq_file *s, struct drm_plane *plane) 1907 { 1908 struct vop2_win *win = to_vop2_win(plane); 1909 struct drm_plane_state *pstate = plane->state; 1910 struct drm_rect *src, *dst; 1911 struct drm_framebuffer *fb; 1912 struct drm_gem_object *obj; 1913 struct rockchip_gem_object *rk_obj; 1914 bool xmirror; 1915 bool ymirror; 1916 bool rotate_270; 1917 bool rotate_90; 1918 dma_addr_t fb_addr; 1919 int i; 1920 1921 seq_printf(s, " %s: %s\n", win->data->name, !pstate ? 1922 "DISABLED" : pstate->crtc ? "ACTIVE" : "DISABLED"); 1923 1924 if (!pstate || !pstate->fb) 1925 return 0; 1926 1927 fb = pstate->fb; 1928 src = &pstate->src; 1929 dst = &pstate->dst; 1930 xmirror = pstate->rotation & DRM_MODE_REFLECT_X ? true : false; 1931 ymirror = pstate->rotation & DRM_MODE_REFLECT_Y ? true : false; 1932 rotate_270 = pstate->rotation & DRM_MODE_ROTATE_270; 1933 rotate_90 = pstate->rotation & DRM_MODE_ROTATE_90; 1934 1935 seq_printf(s, "\twin_id: %d\n", win->win_id); 1936 1937 seq_printf(s, "\tformat: %p4cc%s glb_alpha[0x%x]\n", 1938 &fb->format->format, 1939 drm_is_afbc(fb->modifier) ? "[AFBC]" : "", 1940 pstate->alpha >> 8); 1941 seq_printf(s, "\trotate: xmirror: %d ymirror: %d rotate_90: %d rotate_270: %d\n", 1942 xmirror, ymirror, rotate_90, rotate_270); 1943 seq_printf(s, "\tzpos: %d\n", pstate->normalized_zpos); 1944 seq_printf(s, "\tsrc: pos[%d, %d] rect[%d x %d]\n", src->x1 >> 16, 1945 src->y1 >> 16, drm_rect_width(src) >> 16, 1946 drm_rect_height(src) >> 16); 1947 seq_printf(s, "\tdst: pos[%d, %d] rect[%d x %d]\n", dst->x1, dst->y1, 1948 drm_rect_width(dst), drm_rect_height(dst)); 1949 1950 for (i = 0; i < fb->format->num_planes; i++) { 1951 obj = fb->obj[i]; 1952 rk_obj = to_rockchip_obj(obj); 1953 fb_addr = rk_obj->dma_addr + fb->offsets[i]; 1954 1955 seq_printf(s, "\tbuf[%d]: addr: %pad pitch: %d offset: %d\n", 1956 i, &fb_addr, fb->pitches[i], fb->offsets[i]); 1957 } 1958 1959 return 0; 1960 } 1961 1962 static int vop2_crtc_state_dump(struct drm_crtc *crtc, struct seq_file *s) 1963 { 1964 struct vop2_video_port *vp = to_vop2_video_port(crtc); 1965 struct drm_crtc_state *cstate = crtc->state; 1966 struct rockchip_crtc_state *vcstate; 1967 struct drm_display_mode *mode; 1968 struct drm_plane *plane; 1969 bool interlaced; 1970 1971 seq_printf(s, "Video Port%d: %s\n", vp->id, !cstate ? 1972 "DISABLED" : cstate->active ? "ACTIVE" : "DISABLED"); 1973 1974 if (!cstate || !cstate->active) 1975 return 0; 1976 1977 mode = &crtc->state->adjusted_mode; 1978 vcstate = to_rockchip_crtc_state(cstate); 1979 interlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE); 1980 1981 vop2_dump_connector_on_crtc(crtc, s); 1982 seq_printf(s, "\tbus_format[%x]: %s\n", vcstate->bus_format, 1983 drm_get_bus_format_name(vcstate->bus_format)); 1984 seq_printf(s, "\toutput_mode[%x]", vcstate->output_mode); 1985 seq_printf(s, " color_space[%d]\n", vcstate->color_space); 1986 seq_printf(s, " Display mode: %dx%d%s%d\n", 1987 mode->hdisplay, mode->vdisplay, interlaced ? "i" : "p", 1988 drm_mode_vrefresh(mode)); 1989 seq_printf(s, "\tclk[%d] real_clk[%d] type[%x] flag[%x]\n", 1990 mode->clock, mode->crtc_clock, mode->type, mode->flags); 1991 seq_printf(s, "\tH: %d %d %d %d\n", mode->hdisplay, mode->hsync_start, 1992 mode->hsync_end, mode->htotal); 1993 seq_printf(s, "\tV: %d %d %d %d\n", mode->vdisplay, mode->vsync_start, 1994 mode->vsync_end, mode->vtotal); 1995 1996 drm_atomic_crtc_for_each_plane(plane, crtc) { 1997 vop2_plane_state_dump(s, plane); 1998 } 1999 2000 return 0; 2001 } 2002 2003 static int vop2_summary_show(struct seq_file *s, void *data) 2004 { 2005 struct drm_info_node *node = s->private; 2006 struct drm_minor *minor = node->minor; 2007 struct drm_device *drm_dev = minor->dev; 2008 struct drm_crtc *crtc; 2009 2010 drm_modeset_lock_all(drm_dev); 2011 drm_for_each_crtc(crtc, drm_dev) { 2012 vop2_crtc_state_dump(crtc, s); 2013 } 2014 drm_modeset_unlock_all(drm_dev); 2015 2016 return 0; 2017 } 2018 2019 static void vop2_regs_print(struct vop2 *vop2, struct seq_file *s, 2020 const struct vop2_regs_dump *dump, bool active_only) 2021 { 2022 resource_size_t start; 2023 u32 val; 2024 int i; 2025 2026 if (dump->en_mask && active_only) { 2027 val = vop2_readl(vop2, dump->base + dump->en_reg); 2028 if ((val & dump->en_mask) != dump->en_val) 2029 return; 2030 } 2031 2032 seq_printf(s, "\n%s:\n", dump->name); 2033 2034 start = vop2->res->start + dump->base; 2035 for (i = 0; i < dump->size >> 2; i += 4) { 2036 seq_printf(s, "%08x: %08x %08x %08x %08x\n", (u32)start + i * 4, 2037 vop2_readl(vop2, dump->base + (4 * i)), 2038 vop2_readl(vop2, dump->base + (4 * (i + 1))), 2039 vop2_readl(vop2, dump->base + (4 * (i + 2))), 2040 vop2_readl(vop2, dump->base + (4 * (i + 3)))); 2041 } 2042 } 2043 2044 static void __vop2_regs_dump(struct seq_file *s, bool active_only) 2045 { 2046 struct drm_info_node *node = s->private; 2047 struct vop2 *vop2 = node->info_ent->data; 2048 struct drm_minor *minor = node->minor; 2049 struct drm_device *drm_dev = minor->dev; 2050 const struct vop2_regs_dump *dump; 2051 unsigned int i; 2052 2053 drm_modeset_lock_all(drm_dev); 2054 2055 regcache_drop_region(vop2->map, 0, vop2_regmap_config.max_register); 2056 2057 if (vop2->enable_count) { 2058 for (i = 0; i < vop2->data->regs_dump_size; i++) { 2059 dump = &vop2->data->regs_dump[i]; 2060 vop2_regs_print(vop2, s, dump, active_only); 2061 } 2062 } else { 2063 seq_puts(s, "VOP disabled\n"); 2064 } 2065 drm_modeset_unlock_all(drm_dev); 2066 } 2067 2068 static int vop2_regs_show(struct seq_file *s, void *arg) 2069 { 2070 __vop2_regs_dump(s, false); 2071 2072 return 0; 2073 } 2074 2075 static int vop2_active_regs_show(struct seq_file *s, void *data) 2076 { 2077 __vop2_regs_dump(s, true); 2078 2079 return 0; 2080 } 2081 2082 static struct drm_info_list vop2_debugfs_list[] = { 2083 { "summary", vop2_summary_show, 0, NULL }, 2084 { "active_regs", vop2_active_regs_show, 0, NULL }, 2085 { "regs", vop2_regs_show, 0, NULL }, 2086 }; 2087 2088 static void vop2_debugfs_init(struct vop2 *vop2, struct drm_minor *minor) 2089 { 2090 struct dentry *root; 2091 unsigned int i; 2092 2093 root = debugfs_create_dir("vop2", minor->debugfs_root); 2094 if (!IS_ERR(root)) { 2095 for (i = 0; i < ARRAY_SIZE(vop2_debugfs_list); i++) 2096 vop2_debugfs_list[i].data = vop2; 2097 2098 drm_debugfs_create_files(vop2_debugfs_list, 2099 ARRAY_SIZE(vop2_debugfs_list), 2100 root, minor); 2101 } 2102 } 2103 2104 static int vop2_crtc_late_register(struct drm_crtc *crtc) 2105 { 2106 struct vop2_video_port *vp = to_vop2_video_port(crtc); 2107 struct vop2 *vop2 = vp->vop2; 2108 2109 if (drm_crtc_index(crtc) == 0) 2110 vop2_debugfs_init(vop2, crtc->dev->primary); 2111 2112 return 0; 2113 } 2114 2115 static struct drm_crtc_state *vop2_crtc_duplicate_state(struct drm_crtc *crtc) 2116 { 2117 struct rockchip_crtc_state *vcstate; 2118 2119 if (WARN_ON(!crtc->state)) 2120 return NULL; 2121 2122 vcstate = kmemdup(to_rockchip_crtc_state(crtc->state), 2123 sizeof(*vcstate), GFP_KERNEL); 2124 if (!vcstate) 2125 return NULL; 2126 2127 __drm_atomic_helper_crtc_duplicate_state(crtc, &vcstate->base); 2128 2129 return &vcstate->base; 2130 } 2131 2132 static void vop2_crtc_destroy_state(struct drm_crtc *crtc, 2133 struct drm_crtc_state *state) 2134 { 2135 struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(state); 2136 2137 __drm_atomic_helper_crtc_destroy_state(&vcstate->base); 2138 kfree(vcstate); 2139 } 2140 2141 static void vop2_crtc_reset(struct drm_crtc *crtc) 2142 { 2143 struct rockchip_crtc_state *vcstate = 2144 kzalloc(sizeof(*vcstate), GFP_KERNEL); 2145 2146 if (crtc->state) 2147 vop2_crtc_destroy_state(crtc, crtc->state); 2148 2149 if (vcstate) 2150 __drm_atomic_helper_crtc_reset(crtc, &vcstate->base); 2151 else 2152 __drm_atomic_helper_crtc_reset(crtc, NULL); 2153 } 2154 2155 static const struct drm_crtc_funcs vop2_crtc_funcs = { 2156 .set_config = drm_atomic_helper_set_config, 2157 .page_flip = drm_atomic_helper_page_flip, 2158 .destroy = drm_crtc_cleanup, 2159 .reset = vop2_crtc_reset, 2160 .atomic_duplicate_state = vop2_crtc_duplicate_state, 2161 .atomic_destroy_state = vop2_crtc_destroy_state, 2162 .enable_vblank = vop2_crtc_enable_vblank, 2163 .disable_vblank = vop2_crtc_disable_vblank, 2164 .late_register = vop2_crtc_late_register, 2165 }; 2166 2167 static irqreturn_t rk3576_vp_isr(int irq, void *data) 2168 { 2169 struct vop2_video_port *vp = data; 2170 struct vop2 *vop2 = vp->vop2; 2171 struct drm_crtc *crtc = &vp->crtc; 2172 uint32_t irqs; 2173 int ret = IRQ_NONE; 2174 2175 if (!pm_runtime_get_if_in_use(vop2->dev)) 2176 return IRQ_NONE; 2177 2178 irqs = vop2_readl(vop2, RK3568_VP_INT_STATUS(vp->id)); 2179 vop2_writel(vop2, RK3568_VP_INT_CLR(vp->id), irqs << 16 | irqs); 2180 2181 if (irqs & VP_INT_DSP_HOLD_VALID) { 2182 complete(&vp->dsp_hold_completion); 2183 ret = IRQ_HANDLED; 2184 } 2185 2186 if (irqs & VP_INT_FS_FIELD) { 2187 drm_crtc_handle_vblank(crtc); 2188 spin_lock(&crtc->dev->event_lock); 2189 if (vp->event) { 2190 u32 val = vop2_readl(vop2, RK3568_REG_CFG_DONE); 2191 2192 if (!(val & BIT(vp->id))) { 2193 drm_crtc_send_vblank_event(crtc, vp->event); 2194 vp->event = NULL; 2195 drm_crtc_vblank_put(crtc); 2196 } 2197 } 2198 spin_unlock(&crtc->dev->event_lock); 2199 2200 ret = IRQ_HANDLED; 2201 } 2202 2203 if (irqs & VP_INT_POST_BUF_EMPTY) { 2204 drm_err_ratelimited(vop2->drm, "POST_BUF_EMPTY irq err at vp%d\n", vp->id); 2205 ret = IRQ_HANDLED; 2206 } 2207 2208 pm_runtime_put(vop2->dev); 2209 2210 return ret; 2211 } 2212 2213 static irqreturn_t vop2_isr(int irq, void *data) 2214 { 2215 struct vop2 *vop2 = data; 2216 const struct vop2_data *vop2_data = vop2->data; 2217 u32 axi_irqs[VOP2_SYS_AXI_BUS_NUM]; 2218 int ret = IRQ_NONE; 2219 int i; 2220 2221 /* 2222 * The irq is shared with the iommu. If the runtime-pm state of the 2223 * vop2-device is disabled the irq has to be targeted at the iommu. 2224 */ 2225 if (!pm_runtime_get_if_in_use(vop2->dev)) 2226 return IRQ_NONE; 2227 2228 if (vop2->version < VOP_VERSION_RK3576) { 2229 for (i = 0; i < vop2_data->nr_vps; i++) { 2230 struct vop2_video_port *vp = &vop2->vps[i]; 2231 struct drm_crtc *crtc = &vp->crtc; 2232 u32 irqs; 2233 2234 irqs = vop2_readl(vop2, RK3568_VP_INT_STATUS(vp->id)); 2235 vop2_writel(vop2, RK3568_VP_INT_CLR(vp->id), irqs << 16 | irqs); 2236 2237 if (irqs & VP_INT_DSP_HOLD_VALID) { 2238 complete(&vp->dsp_hold_completion); 2239 ret = IRQ_HANDLED; 2240 } 2241 2242 if (irqs & VP_INT_FS_FIELD) { 2243 drm_crtc_handle_vblank(crtc); 2244 spin_lock(&crtc->dev->event_lock); 2245 if (vp->event) { 2246 u32 val = vop2_readl(vop2, RK3568_REG_CFG_DONE); 2247 2248 if (!(val & BIT(vp->id))) { 2249 drm_crtc_send_vblank_event(crtc, vp->event); 2250 vp->event = NULL; 2251 drm_crtc_vblank_put(crtc); 2252 } 2253 } 2254 spin_unlock(&crtc->dev->event_lock); 2255 2256 ret = IRQ_HANDLED; 2257 } 2258 2259 if (irqs & VP_INT_POST_BUF_EMPTY) { 2260 drm_err_ratelimited(vop2->drm, 2261 "POST_BUF_EMPTY irq err at vp%d\n", 2262 vp->id); 2263 ret = IRQ_HANDLED; 2264 } 2265 } 2266 } 2267 2268 axi_irqs[0] = vop2_readl(vop2, RK3568_SYS0_INT_STATUS); 2269 vop2_writel(vop2, RK3568_SYS0_INT_CLR, axi_irqs[0] << 16 | axi_irqs[0]); 2270 axi_irqs[1] = vop2_readl(vop2, RK3568_SYS1_INT_STATUS); 2271 vop2_writel(vop2, RK3568_SYS1_INT_CLR, axi_irqs[1] << 16 | axi_irqs[1]); 2272 2273 for (i = 0; i < ARRAY_SIZE(axi_irqs); i++) { 2274 if (axi_irqs[i] & VOP2_INT_BUS_ERRPR) { 2275 drm_err_ratelimited(vop2->drm, "BUS_ERROR irq err\n"); 2276 ret = IRQ_HANDLED; 2277 } 2278 } 2279 2280 pm_runtime_put(vop2->dev); 2281 2282 return ret; 2283 } 2284 2285 static int vop2_plane_init(struct vop2 *vop2, struct vop2_win *win, 2286 unsigned long possible_crtcs) 2287 { 2288 const struct vop2_win_data *win_data = win->data; 2289 unsigned int blend_caps = BIT(DRM_MODE_BLEND_PIXEL_NONE) | 2290 BIT(DRM_MODE_BLEND_PREMULTI) | 2291 BIT(DRM_MODE_BLEND_COVERAGE); 2292 int ret; 2293 2294 ret = drm_universal_plane_init(vop2->drm, &win->base, possible_crtcs, 2295 &vop2_plane_funcs, win_data->formats, 2296 win_data->nformats, 2297 win_data->format_modifiers, 2298 win->type, win_data->name); 2299 if (ret) { 2300 drm_err(vop2->drm, "failed to initialize plane %d\n", ret); 2301 return ret; 2302 } 2303 2304 drm_plane_helper_add(&win->base, &vop2_plane_helper_funcs); 2305 2306 if (win->data->supported_rotations) 2307 drm_plane_create_rotation_property(&win->base, DRM_MODE_ROTATE_0, 2308 DRM_MODE_ROTATE_0 | 2309 win->data->supported_rotations); 2310 drm_plane_create_alpha_property(&win->base); 2311 drm_plane_create_blend_mode_property(&win->base, blend_caps); 2312 drm_plane_create_zpos_property(&win->base, win->win_id, 0, 2313 vop2->registered_num_wins - 1); 2314 2315 return 0; 2316 } 2317 2318 /* 2319 * On RK3566 these windows don't have an independent 2320 * framebuffer. They can only share/mirror the framebuffer 2321 * with smart0, esmart0 and cluster0 respectively. 2322 * And RK3566 share the same vop version with Rk3568, so we 2323 * need to use soc_id for identification here. 2324 */ 2325 static bool vop2_is_mirror_win(struct vop2_win *win) 2326 { 2327 struct vop2 *vop2 = win->vop2; 2328 2329 if (vop2->data->soc_id == 3566) { 2330 switch (win->data->phys_id) { 2331 case ROCKCHIP_VOP2_SMART1: 2332 case ROCKCHIP_VOP2_ESMART1: 2333 case ROCKCHIP_VOP2_CLUSTER1: 2334 return true; 2335 default: 2336 return false; 2337 } 2338 } else { 2339 return false; 2340 } 2341 } 2342 2343 static int vop2_create_crtcs(struct vop2 *vop2) 2344 { 2345 const struct vop2_data *vop2_data = vop2->data; 2346 struct drm_device *drm = vop2->drm; 2347 struct device *dev = vop2->dev; 2348 struct drm_plane *plane; 2349 struct device_node *port; 2350 struct vop2_video_port *vp; 2351 struct vop2_win *win; 2352 u32 possible_crtcs; 2353 int i, j, nvp, nvps = 0; 2354 int ret; 2355 2356 for (i = 0; i < vop2_data->nr_vps; i++) { 2357 const struct vop2_video_port_data *vp_data; 2358 struct device_node *np; 2359 char dclk_name[9]; 2360 2361 vp_data = &vop2_data->vp[i]; 2362 vp = &vop2->vps[i]; 2363 vp->vop2 = vop2; 2364 vp->id = vp_data->id; 2365 vp->data = vp_data; 2366 2367 snprintf(dclk_name, sizeof(dclk_name), "dclk_vp%d", vp->id); 2368 vp->dclk = devm_clk_get(vop2->dev, dclk_name); 2369 if (IS_ERR(vp->dclk)) 2370 return dev_err_probe(drm->dev, PTR_ERR(vp->dclk), 2371 "failed to get %s\n", dclk_name); 2372 2373 np = of_graph_get_remote_node(dev->of_node, i, -1); 2374 if (!np) { 2375 drm_dbg(vop2->drm, "%s: No remote for vp%d\n", __func__, i); 2376 continue; 2377 } 2378 of_node_put(np); 2379 2380 port = of_graph_get_port_by_id(dev->of_node, i); 2381 if (!port) 2382 return dev_err_probe(drm->dev, -ENOENT, 2383 "no port node found for video_port%d\n", i); 2384 vp->crtc.port = port; 2385 nvps++; 2386 } 2387 2388 nvp = 0; 2389 /* Register a primary plane for every crtc */ 2390 for (i = 0; i < vop2_data->nr_vps; i++) { 2391 vp = &vop2->vps[i]; 2392 2393 if (!vp->crtc.port) 2394 continue; 2395 2396 for (j = 0; j < vop2->registered_num_wins; j++) { 2397 win = &vop2->win[j]; 2398 2399 /* Aready registered as primary plane */ 2400 if (win->base.type == DRM_PLANE_TYPE_PRIMARY) 2401 continue; 2402 2403 /* If this win can not attached to this VP */ 2404 if (!(win->data->possible_vp_mask & BIT(vp->id))) 2405 continue; 2406 2407 if (vop2_is_mirror_win(win)) 2408 continue; 2409 2410 if (win->type == DRM_PLANE_TYPE_PRIMARY) { 2411 possible_crtcs = BIT(nvp); 2412 vp->primary_plane = win; 2413 ret = vop2_plane_init(vop2, win, possible_crtcs); 2414 if (ret) 2415 return dev_err_probe(drm->dev, ret, 2416 "failed to init primary plane %s\n", 2417 win->data->name); 2418 nvp++; 2419 break; 2420 } 2421 } 2422 2423 if (!vp->primary_plane) 2424 return dev_err_probe(drm->dev, -ENOENT, 2425 "no primary plane for vp %d\n", i); 2426 } 2427 2428 /* Register all unused window as overlay plane */ 2429 for (i = 0; i < vop2->registered_num_wins; i++) { 2430 win = &vop2->win[i]; 2431 2432 /* Aready registered as primary plane */ 2433 if (win->base.type == DRM_PLANE_TYPE_PRIMARY) 2434 continue; 2435 2436 if (vop2_is_mirror_win(win)) 2437 continue; 2438 2439 win->type = DRM_PLANE_TYPE_OVERLAY; 2440 2441 possible_crtcs = 0; 2442 nvp = 0; 2443 for (j = 0; j < vop2_data->nr_vps; j++) { 2444 vp = &vop2->vps[j]; 2445 2446 if (!vp->crtc.port) 2447 continue; 2448 2449 if (win->data->possible_vp_mask & BIT(vp->id)) 2450 possible_crtcs |= BIT(nvp); 2451 nvp++; 2452 } 2453 2454 ret = vop2_plane_init(vop2, win, possible_crtcs); 2455 if (ret) 2456 return dev_err_probe(drm->dev, ret, "failed to init overlay plane %s\n", 2457 win->data->name); 2458 } 2459 2460 for (i = 0; i < vop2_data->nr_vps; i++) { 2461 vp = &vop2->vps[i]; 2462 2463 if (!vp->crtc.port) 2464 continue; 2465 2466 plane = &vp->primary_plane->base; 2467 2468 ret = drm_crtc_init_with_planes(drm, &vp->crtc, plane, NULL, 2469 &vop2_crtc_funcs, 2470 "video_port%d", vp->id); 2471 if (ret) 2472 return dev_err_probe(drm->dev, ret, 2473 "crtc init for video_port%d failed\n", i); 2474 2475 drm_crtc_helper_add(&vp->crtc, &vop2_crtc_helper_funcs); 2476 if (vop2->lut_regs) { 2477 const struct vop2_video_port_data *vp_data = &vop2_data->vp[vp->id]; 2478 2479 drm_mode_crtc_set_gamma_size(&vp->crtc, vp_data->gamma_lut_len); 2480 drm_crtc_enable_color_mgmt(&vp->crtc, 0, false, vp_data->gamma_lut_len); 2481 } 2482 init_completion(&vp->dsp_hold_completion); 2483 } 2484 2485 /* 2486 * On the VOP2 it's very hard to change the number of layers on a VP 2487 * during runtime, so we distribute the layers equally over the used 2488 * VPs 2489 */ 2490 for (i = 0; i < vop2->data->nr_vps; i++) { 2491 struct vop2_video_port *vp = &vop2->vps[i]; 2492 2493 if (vp->crtc.port) 2494 vp->nlayers = vop2_data->win_size / nvps; 2495 } 2496 2497 return 0; 2498 } 2499 2500 static void vop2_destroy_crtcs(struct vop2 *vop2) 2501 { 2502 struct drm_device *drm = vop2->drm; 2503 struct list_head *crtc_list = &drm->mode_config.crtc_list; 2504 struct list_head *plane_list = &drm->mode_config.plane_list; 2505 struct drm_crtc *crtc, *tmpc; 2506 struct drm_plane *plane, *tmpp; 2507 2508 list_for_each_entry_safe(plane, tmpp, plane_list, head) 2509 drm_plane_cleanup(plane); 2510 2511 /* 2512 * Destroy CRTC after vop2_plane_destroy() since vop2_disable_plane() 2513 * references the CRTC. 2514 */ 2515 list_for_each_entry_safe(crtc, tmpc, crtc_list, head) { 2516 of_node_put(crtc->port); 2517 drm_crtc_cleanup(crtc); 2518 } 2519 } 2520 2521 static int vop2_find_rgb_encoder(struct vop2 *vop2) 2522 { 2523 struct device_node *node = vop2->dev->of_node; 2524 struct device_node *endpoint; 2525 int i; 2526 2527 for (i = 0; i < vop2->data->nr_vps; i++) { 2528 endpoint = of_graph_get_endpoint_by_regs(node, i, 2529 ROCKCHIP_VOP2_EP_RGB0); 2530 if (!endpoint) 2531 continue; 2532 2533 of_node_put(endpoint); 2534 return i; 2535 } 2536 2537 return -ENOENT; 2538 } 2539 2540 static int vop2_regmap_init(struct vop2_win *win, const struct reg_field *regs, 2541 int nr_regs) 2542 { 2543 struct vop2 *vop2 = win->vop2; 2544 int i; 2545 2546 for (i = 0; i < nr_regs; i++) { 2547 const struct reg_field field = { 2548 .reg = (regs[i].reg != 0xffffffff) ? 2549 regs[i].reg + win->offset : regs[i].reg, 2550 .lsb = regs[i].lsb, 2551 .msb = regs[i].msb 2552 }; 2553 2554 win->reg[i] = devm_regmap_field_alloc(vop2->dev, vop2->map, field); 2555 if (IS_ERR(win->reg[i])) 2556 return PTR_ERR(win->reg[i]); 2557 } 2558 2559 return 0; 2560 }; 2561 2562 static int vop2_win_init(struct vop2 *vop2) 2563 { 2564 const struct vop2_data *vop2_data = vop2->data; 2565 struct vop2_win *win; 2566 int i, ret; 2567 2568 for (i = 0; i < vop2_data->win_size; i++) { 2569 const struct vop2_win_data *win_data = &vop2_data->win[i]; 2570 2571 win = &vop2->win[i]; 2572 win->data = win_data; 2573 win->type = win_data->type; 2574 win->offset = win_data->base; 2575 win->win_id = i; 2576 win->vop2 = vop2; 2577 if (vop2_cluster_window(win)) 2578 ret = vop2_regmap_init(win, vop2->data->cluster_reg, 2579 vop2->data->nr_cluster_regs); 2580 else 2581 ret = vop2_regmap_init(win, vop2->data->smart_reg, 2582 vop2->data->nr_smart_regs); 2583 if (ret) 2584 return ret; 2585 } 2586 2587 vop2->registered_num_wins = vop2_data->win_size; 2588 2589 return 0; 2590 } 2591 2592 /* 2593 * The window and video port registers are only updated when config 2594 * done is written. Until that they read back the old value. As we 2595 * read-modify-write these registers mark them as non-volatile. This 2596 * makes sure we read the new values from the regmap register cache. 2597 */ 2598 static const struct regmap_range vop2_nonvolatile_range[] = { 2599 regmap_reg_range(RK3568_VP0_CTRL_BASE, RK3588_VP3_CTRL_BASE + 255), 2600 regmap_reg_range(0x1000, 0x23ff), 2601 }; 2602 2603 static const struct regmap_access_table vop2_volatile_table = { 2604 .no_ranges = vop2_nonvolatile_range, 2605 .n_no_ranges = ARRAY_SIZE(vop2_nonvolatile_range), 2606 }; 2607 2608 static const struct regmap_config vop2_regmap_config = { 2609 .reg_bits = 32, 2610 .val_bits = 32, 2611 .reg_stride = 4, 2612 .max_register = 0x3000, 2613 .name = "vop2", 2614 .volatile_table = &vop2_volatile_table, 2615 .cache_type = REGCACHE_MAPLE, 2616 }; 2617 2618 static int vop2_bind(struct device *dev, struct device *master, void *data) 2619 { 2620 struct platform_device *pdev = to_platform_device(dev); 2621 const struct vop2_data *vop2_data; 2622 struct drm_device *drm = data; 2623 struct vop2 *vop2; 2624 struct resource *res; 2625 size_t alloc_size; 2626 int ret; 2627 2628 vop2_data = of_device_get_match_data(dev); 2629 if (!vop2_data) 2630 return -ENODEV; 2631 2632 /* Allocate vop2 struct and its vop2_win array */ 2633 alloc_size = struct_size(vop2, win, vop2_data->win_size); 2634 vop2 = devm_kzalloc(dev, alloc_size, GFP_KERNEL); 2635 if (!vop2) 2636 return -ENOMEM; 2637 2638 vop2->dev = dev; 2639 vop2->data = vop2_data; 2640 vop2->ops = vop2_data->ops; 2641 vop2->version = vop2_data->version; 2642 vop2->drm = drm; 2643 2644 dev_set_drvdata(dev, vop2); 2645 2646 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "vop"); 2647 if (!res) 2648 return dev_err_probe(drm->dev, -EINVAL, 2649 "failed to get vop2 register byname\n"); 2650 2651 vop2->res = res; 2652 vop2->regs = devm_ioremap_resource(dev, res); 2653 if (IS_ERR(vop2->regs)) 2654 return PTR_ERR(vop2->regs); 2655 vop2->len = resource_size(res); 2656 2657 vop2->map = devm_regmap_init_mmio(dev, vop2->regs, &vop2_regmap_config); 2658 if (IS_ERR(vop2->map)) 2659 return PTR_ERR(vop2->map); 2660 2661 /* Set the bounds for framebuffer creation */ 2662 drm->mode_config.min_width = 4; 2663 drm->mode_config.min_height = 4; 2664 drm->mode_config.max_width = vop2_data->max_input.width; 2665 drm->mode_config.max_height = vop2_data->max_input.height; 2666 2667 ret = vop2_win_init(vop2); 2668 if (ret) 2669 return ret; 2670 2671 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "gamma-lut"); 2672 if (res) { 2673 vop2->lut_regs = devm_ioremap_resource(dev, res); 2674 if (IS_ERR(vop2->lut_regs)) 2675 return PTR_ERR(vop2->lut_regs); 2676 } 2677 if (vop2_data->feature & VOP2_FEATURE_HAS_SYS_GRF) { 2678 vop2->sys_grf = syscon_regmap_lookup_by_phandle(dev->of_node, "rockchip,grf"); 2679 if (IS_ERR(vop2->sys_grf)) 2680 return dev_err_probe(drm->dev, PTR_ERR(vop2->sys_grf), 2681 "cannot get sys_grf\n"); 2682 } 2683 2684 if (vop2_data->feature & VOP2_FEATURE_HAS_VOP_GRF) { 2685 vop2->vop_grf = syscon_regmap_lookup_by_phandle(dev->of_node, "rockchip,vop-grf"); 2686 if (IS_ERR(vop2->vop_grf)) 2687 return dev_err_probe(drm->dev, PTR_ERR(vop2->vop_grf), 2688 "cannot get vop_grf\n"); 2689 } 2690 2691 if (vop2_data->feature & VOP2_FEATURE_HAS_VO1_GRF) { 2692 vop2->vo1_grf = syscon_regmap_lookup_by_phandle(dev->of_node, "rockchip,vo1-grf"); 2693 if (IS_ERR(vop2->vo1_grf)) 2694 return dev_err_probe(drm->dev, PTR_ERR(vop2->vo1_grf), 2695 "cannot get vo1_grf\n"); 2696 } 2697 2698 if (vop2_data->feature & VOP2_FEATURE_HAS_SYS_PMU) { 2699 vop2->sys_pmu = syscon_regmap_lookup_by_phandle(dev->of_node, "rockchip,pmu"); 2700 if (IS_ERR(vop2->sys_pmu)) 2701 return dev_err_probe(drm->dev, PTR_ERR(vop2->sys_pmu), 2702 "cannot get sys_pmu\n"); 2703 } 2704 2705 vop2->hclk = devm_clk_get(vop2->dev, "hclk"); 2706 if (IS_ERR(vop2->hclk)) 2707 return dev_err_probe(drm->dev, PTR_ERR(vop2->hclk), 2708 "failed to get hclk source\n"); 2709 2710 vop2->aclk = devm_clk_get(vop2->dev, "aclk"); 2711 if (IS_ERR(vop2->aclk)) 2712 return dev_err_probe(drm->dev, PTR_ERR(vop2->aclk), 2713 "failed to get aclk source\n"); 2714 2715 vop2->pclk = devm_clk_get_optional(vop2->dev, "pclk_vop"); 2716 if (IS_ERR(vop2->pclk)) 2717 return dev_err_probe(drm->dev, PTR_ERR(vop2->pclk), 2718 "failed to get pclk source\n"); 2719 2720 vop2->pll_hdmiphy0 = devm_clk_get_optional(vop2->dev, "pll_hdmiphy0"); 2721 if (IS_ERR(vop2->pll_hdmiphy0)) 2722 return dev_err_probe(drm->dev, PTR_ERR(vop2->pll_hdmiphy0), 2723 "failed to get pll_hdmiphy0\n"); 2724 2725 vop2->pll_hdmiphy1 = devm_clk_get_optional(vop2->dev, "pll_hdmiphy1"); 2726 if (IS_ERR(vop2->pll_hdmiphy1)) 2727 return dev_err_probe(drm->dev, PTR_ERR(vop2->pll_hdmiphy1), 2728 "failed to get pll_hdmiphy1\n"); 2729 2730 vop2->irq = platform_get_irq(pdev, 0); 2731 if (vop2->irq < 0) 2732 return dev_err_probe(drm->dev, vop2->irq, "cannot find irq for vop2\n"); 2733 2734 mutex_init(&vop2->vop2_lock); 2735 mutex_init(&vop2->ovl_lock); 2736 2737 ret = devm_request_irq(dev, vop2->irq, vop2_isr, IRQF_SHARED, dev_name(dev), vop2); 2738 if (ret) 2739 return ret; 2740 2741 ret = vop2_create_crtcs(vop2); 2742 if (ret) 2743 return ret; 2744 2745 if (vop2->version >= VOP_VERSION_RK3576) { 2746 struct drm_crtc *crtc; 2747 2748 drm_for_each_crtc(crtc, drm) { 2749 struct vop2_video_port *vp = to_vop2_video_port(crtc); 2750 int vp_irq; 2751 const char *irq_name = devm_kasprintf(dev, GFP_KERNEL, "vp%d", vp->id); 2752 2753 if (!irq_name) 2754 return -ENOMEM; 2755 2756 vp_irq = platform_get_irq_byname(pdev, irq_name); 2757 if (vp_irq < 0) 2758 return dev_err_probe(drm->dev, vp_irq, 2759 "cannot find irq for vop2 vp%d\n", vp->id); 2760 2761 ret = devm_request_irq(dev, vp_irq, rk3576_vp_isr, IRQF_SHARED, irq_name, 2762 vp); 2763 if (ret) 2764 dev_err_probe(drm->dev, ret, 2765 "request irq for vop2 vp%d failed\n", vp->id); 2766 } 2767 } 2768 2769 ret = vop2_find_rgb_encoder(vop2); 2770 if (ret >= 0) { 2771 vop2->rgb = rockchip_rgb_init(dev, &vop2->vps[ret].crtc, 2772 vop2->drm, ret); 2773 if (IS_ERR(vop2->rgb)) { 2774 if (PTR_ERR(vop2->rgb) == -EPROBE_DEFER) { 2775 ret = PTR_ERR(vop2->rgb); 2776 goto err_crtcs; 2777 } 2778 vop2->rgb = NULL; 2779 } 2780 } 2781 2782 rockchip_drm_dma_init_device(vop2->drm, vop2->dev); 2783 2784 pm_runtime_enable(&pdev->dev); 2785 2786 return 0; 2787 2788 err_crtcs: 2789 vop2_destroy_crtcs(vop2); 2790 2791 return ret; 2792 } 2793 2794 static void vop2_unbind(struct device *dev, struct device *master, void *data) 2795 { 2796 struct vop2 *vop2 = dev_get_drvdata(dev); 2797 2798 pm_runtime_disable(dev); 2799 2800 if (vop2->rgb) 2801 rockchip_rgb_fini(vop2->rgb); 2802 2803 vop2_destroy_crtcs(vop2); 2804 } 2805 2806 const struct component_ops vop2_component_ops = { 2807 .bind = vop2_bind, 2808 .unbind = vop2_unbind, 2809 }; 2810 EXPORT_SYMBOL_GPL(vop2_component_ops); 2811