hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
....@@ -666,11 +666,13 @@
666666 static bool is_rb_swap(uint32_t bus_format, uint32_t output_mode)
667667 {
668668 /*
669
- * The default component order of serial rgb3x8 formats
669
+ * The default component order of serial formats
670670 * is BGR. So it is needed to enable RB swap.
671671 */
672672 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)
674676 return true;
675677 else
676678 return false;
....@@ -1871,6 +1873,9 @@
18711873 to_vop_plane_state(plane->state);
18721874 #endif
18731875
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
+
18741879 if (!old_state->crtc)
18751880 return;
18761881
....@@ -1980,6 +1985,7 @@
19801985 uint32_t val;
19811986 bool rb_swap, global_alpha_en;
19821987 int is_yuv = fb->format->is_yuv;
1988
+ struct drm_format_name_buf format_name;
19831989
19841990 #if defined(CONFIG_ROCKCHIP_DRM_DEBUG)
19851991 bool AFBC_flag = false;
....@@ -2144,6 +2150,13 @@
21442150 VOP_WIN_SET(vop, win, enable, 1);
21452151 VOP_WIN_SET(vop, win, gate, 1);
21462152 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);
21472160 /*
21482161 * spi interface(vop_plane_state->yrgb_kvaddr, fb->pixel_format,
21492162 * actual_w, actual_h)
....@@ -2325,7 +2338,7 @@
23252338 return;
23262339
23272340 __drm_atomic_helper_plane_reset(plane, &vop_plane_state->base);
2328
- win->state.zpos = win->zpos;
2341
+ vop_plane_state->base.zpos = win->zpos;
23292342 vop_plane_state->global_alpha = 0xff;
23302343 }
23312344
....@@ -2514,7 +2527,7 @@
25142527 spin_unlock_irqrestore(&drm->event_lock, flags);
25152528 }
25162529
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)
25182531 {
25192532 struct rockchip_drm_private *private = crtc->dev->dev_private;
25202533 struct vop *vop = to_vop(crtc);
....@@ -3078,8 +3091,8 @@
30783091 {
30793092 struct vop *vop = to_vop(crtc);
30803093 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);
30833096
30843097 if (mode->hdisplay > vop_data->max_output.width)
30853098 return false;
....@@ -3094,6 +3107,10 @@
30943107 (VOP_MAJOR(vop->version) == 2 && VOP_MINOR(vop->version) >= 12 &&
30953108 s->output_if & VOP_OUTPUT_IF_BT656))
30963109 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);
30973114
30983115 adj_mode->crtc_clock =
30993116 DIV_ROUND_UP(clk_round_rate(vop->dclk, adj_mode->crtc_clock * 1000),
....@@ -3118,12 +3135,14 @@
31183135
31193136 switch (s->bus_format) {
31203137 case MEDIA_BUS_FMT_RGB565_1X16:
3138
+ case MEDIA_BUS_FMT_RGB565_2X8_LE:
31213139 VOP_CTRL_SET(vop, dither_down_en, 1);
31223140 VOP_CTRL_SET(vop, dither_down_mode, RGB888_TO_RGB565);
31233141 break;
31243142 case MEDIA_BUS_FMT_RGB666_1X18:
31253143 case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
31263144 case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG:
3145
+ case MEDIA_BUS_FMT_RGB666_3X6:
31273146 VOP_CTRL_SET(vop, dither_down_en, 1);
31283147 VOP_CTRL_SET(vop, dither_down_mode, RGB888_TO_RGB666);
31293148 break;
....@@ -4023,6 +4042,7 @@
40234042 spin_lock_irqsave(&vop->irq_lock, flags);
40244043 vop->pre_overlay = s->hdr.pre_overlay;
40254044 vop_cfg_done(vop);
4045
+ rockchip_drm_dbg(vop->dev, VOP_DEBUG_CFG_DONE, "cfg_done\n\n");
40264046 /*
40274047 * rk322x and rk332x odd-even field will mistake when in interlace mode.
40284048 * we must switch to frame effect before switch screen and switch to
....@@ -4388,6 +4408,7 @@
43884408 * frame effective, but actually it's effective immediately, so
43894409 * we config this register at frame start.
43904410 */
4411
+ rockchip_drm_dbg(vop->dev, VOP_DEBUG_VSYNC, "vsync\n");
43914412 spin_lock_irqsave(&vop->irq_lock, flags);
43924413 VOP_CTRL_SET(vop, level2_overlay_en, vop->pre_overlay);
43934414 VOP_CTRL_SET(vop, alpha_hard_calc, vop->pre_overlay);