.. | .. |
---|
666 | 666 | static bool is_rb_swap(uint32_t bus_format, uint32_t output_mode) |
---|
667 | 667 | { |
---|
668 | 668 | /* |
---|
669 | | - * The default component order of serial rgb3x8 formats |
---|
| 669 | + * The default component order of serial formats |
---|
670 | 670 | * is BGR. So it is needed to enable RB swap. |
---|
671 | 671 | */ |
---|
672 | 672 | if (bus_format == MEDIA_BUS_FMT_RGB888_3X8 || |
---|
673 | | - bus_format == MEDIA_BUS_FMT_RGB888_DUMMY_4X8) |
---|
| 673 | + bus_format == MEDIA_BUS_FMT_RGB888_DUMMY_4X8 || |
---|
| 674 | + bus_format == MEDIA_BUS_FMT_RGB666_3X6 || |
---|
| 675 | + bus_format == MEDIA_BUS_FMT_RGB565_2X8_LE) |
---|
674 | 676 | return true; |
---|
675 | 677 | else |
---|
676 | 678 | return false; |
---|
.. | .. |
---|
1871 | 1873 | to_vop_plane_state(plane->state); |
---|
1872 | 1874 | #endif |
---|
1873 | 1875 | |
---|
| 1876 | + rockchip_drm_dbg(vop->dev, VOP_DEBUG_PLANE, "disable win%d-area%d by %s\n", |
---|
| 1877 | + win->win_id, win->area_id, current->comm); |
---|
| 1878 | + |
---|
1874 | 1879 | if (!old_state->crtc) |
---|
1875 | 1880 | return; |
---|
1876 | 1881 | |
---|
.. | .. |
---|
1980 | 1985 | uint32_t val; |
---|
1981 | 1986 | bool rb_swap, global_alpha_en; |
---|
1982 | 1987 | int is_yuv = fb->format->is_yuv; |
---|
| 1988 | + struct drm_format_name_buf format_name; |
---|
1983 | 1989 | |
---|
1984 | 1990 | #if defined(CONFIG_ROCKCHIP_DRM_DEBUG) |
---|
1985 | 1991 | bool AFBC_flag = false; |
---|
.. | .. |
---|
2144 | 2150 | VOP_WIN_SET(vop, win, enable, 1); |
---|
2145 | 2151 | VOP_WIN_SET(vop, win, gate, 1); |
---|
2146 | 2152 | spin_unlock(&vop->reg_lock); |
---|
| 2153 | + |
---|
| 2154 | + drm_get_format_name(fb->format->format, &format_name); |
---|
| 2155 | + rockchip_drm_dbg(vop->dev, VOP_DEBUG_PLANE, |
---|
| 2156 | + "update win%d-area%d [%dx%d->%dx%d@(%d, %d)] zpos:%d fmt[%s%s] addr[%pad] by %s\n", |
---|
| 2157 | + win->win_id, win->area_id, actual_w, actual_h, |
---|
| 2158 | + dsp_w, dsp_h, dsp_stx, dsp_sty, vop_plane_state->zpos, format_name.str, |
---|
| 2159 | + fb->modifier ? "[AFBC]" : "", &vop_plane_state->yrgb_mst, current->comm); |
---|
2147 | 2160 | /* |
---|
2148 | 2161 | * spi interface(vop_plane_state->yrgb_kvaddr, fb->pixel_format, |
---|
2149 | 2162 | * actual_w, actual_h) |
---|
.. | .. |
---|
2325 | 2338 | return; |
---|
2326 | 2339 | |
---|
2327 | 2340 | __drm_atomic_helper_plane_reset(plane, &vop_plane_state->base); |
---|
2328 | | - win->state.zpos = win->zpos; |
---|
| 2341 | + vop_plane_state->base.zpos = win->zpos; |
---|
2329 | 2342 | vop_plane_state->global_alpha = 0xff; |
---|
2330 | 2343 | } |
---|
2331 | 2344 | |
---|
.. | .. |
---|
2514 | 2527 | spin_unlock_irqrestore(&drm->event_lock, flags); |
---|
2515 | 2528 | } |
---|
2516 | 2529 | |
---|
2517 | | -static int vop_crtc_loader_protect(struct drm_crtc *crtc, bool on) |
---|
| 2530 | +static int vop_crtc_loader_protect(struct drm_crtc *crtc, bool on, void *data) |
---|
2518 | 2531 | { |
---|
2519 | 2532 | struct rockchip_drm_private *private = crtc->dev->dev_private; |
---|
2520 | 2533 | struct vop *vop = to_vop(crtc); |
---|
.. | .. |
---|
3078 | 3091 | { |
---|
3079 | 3092 | struct vop *vop = to_vop(crtc); |
---|
3080 | 3093 | const struct vop_data *vop_data = vop->data; |
---|
3081 | | - struct rockchip_crtc_state *s = |
---|
3082 | | - to_rockchip_crtc_state(crtc->state); |
---|
| 3094 | + struct drm_crtc_state *new_crtc_state = container_of(mode, struct drm_crtc_state, mode); |
---|
| 3095 | + struct rockchip_crtc_state *s = to_rockchip_crtc_state(new_crtc_state); |
---|
3083 | 3096 | |
---|
3084 | 3097 | if (mode->hdisplay > vop_data->max_output.width) |
---|
3085 | 3098 | return false; |
---|
.. | .. |
---|
3094 | 3107 | (VOP_MAJOR(vop->version) == 2 && VOP_MINOR(vop->version) >= 12 && |
---|
3095 | 3108 | s->output_if & VOP_OUTPUT_IF_BT656)) |
---|
3096 | 3109 | adj_mode->crtc_clock *= 2; |
---|
| 3110 | + |
---|
| 3111 | + if (vop->mcu_timing.mcu_pix_total) |
---|
| 3112 | + adj_mode->crtc_clock *= rockchip_drm_get_cycles_per_pixel(s->bus_format) * |
---|
| 3113 | + (vop->mcu_timing.mcu_pix_total + 1); |
---|
3097 | 3114 | |
---|
3098 | 3115 | adj_mode->crtc_clock = |
---|
3099 | 3116 | DIV_ROUND_UP(clk_round_rate(vop->dclk, adj_mode->crtc_clock * 1000), |
---|
.. | .. |
---|
3118 | 3135 | |
---|
3119 | 3136 | switch (s->bus_format) { |
---|
3120 | 3137 | case MEDIA_BUS_FMT_RGB565_1X16: |
---|
| 3138 | + case MEDIA_BUS_FMT_RGB565_2X8_LE: |
---|
3121 | 3139 | VOP_CTRL_SET(vop, dither_down_en, 1); |
---|
3122 | 3140 | VOP_CTRL_SET(vop, dither_down_mode, RGB888_TO_RGB565); |
---|
3123 | 3141 | break; |
---|
3124 | 3142 | case MEDIA_BUS_FMT_RGB666_1X18: |
---|
3125 | 3143 | case MEDIA_BUS_FMT_RGB666_1X24_CPADHI: |
---|
3126 | 3144 | case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: |
---|
| 3145 | + case MEDIA_BUS_FMT_RGB666_3X6: |
---|
3127 | 3146 | VOP_CTRL_SET(vop, dither_down_en, 1); |
---|
3128 | 3147 | VOP_CTRL_SET(vop, dither_down_mode, RGB888_TO_RGB666); |
---|
3129 | 3148 | break; |
---|
.. | .. |
---|
4023 | 4042 | spin_lock_irqsave(&vop->irq_lock, flags); |
---|
4024 | 4043 | vop->pre_overlay = s->hdr.pre_overlay; |
---|
4025 | 4044 | vop_cfg_done(vop); |
---|
| 4045 | + rockchip_drm_dbg(vop->dev, VOP_DEBUG_CFG_DONE, "cfg_done\n\n"); |
---|
4026 | 4046 | /* |
---|
4027 | 4047 | * rk322x and rk332x odd-even field will mistake when in interlace mode. |
---|
4028 | 4048 | * we must switch to frame effect before switch screen and switch to |
---|
.. | .. |
---|
4388 | 4408 | * frame effective, but actually it's effective immediately, so |
---|
4389 | 4409 | * we config this register at frame start. |
---|
4390 | 4410 | */ |
---|
| 4411 | + rockchip_drm_dbg(vop->dev, VOP_DEBUG_VSYNC, "vsync\n"); |
---|
4391 | 4412 | spin_lock_irqsave(&vop->irq_lock, flags); |
---|
4392 | 4413 | VOP_CTRL_SET(vop, level2_overlay_en, vop->pre_overlay); |
---|
4393 | 4414 | VOP_CTRL_SET(vop, alpha_hard_calc, vop->pre_overlay); |
---|