struct drm_plane *plane)
 {
        struct drm_plane_state *state = plane->state;
+       struct drm_framebuffer *fb = state->fb;
+       uint32_t luma_width, luma_height;
+       uint32_t chroma_width, chroma_height;
 
        /* Set height and width */
        DRM_DEBUG_DRIVER("Frontend size W: %u H: %u\n",
                         state->crtc_w, state->crtc_h);
+
+       luma_width = state->src_w >> 16;
+       luma_height = state->src_h >> 16;
+
+       chroma_width = DIV_ROUND_UP(luma_width, fb->format->hsub);
+       chroma_height = DIV_ROUND_UP(luma_height, fb->format->vsub);
+
        regmap_write(frontend->regs, SUN4I_FRONTEND_CH0_INSIZE_REG,
-                    SUN4I_FRONTEND_INSIZE(state->src_h >> 16,
-                                          state->src_w >> 16));
+                    SUN4I_FRONTEND_INSIZE(luma_height, luma_width));
        regmap_write(frontend->regs, SUN4I_FRONTEND_CH1_INSIZE_REG,
-                    SUN4I_FRONTEND_INSIZE(state->src_h >> 16,
-                                          state->src_w >> 16));
+                    SUN4I_FRONTEND_INSIZE(chroma_height, chroma_width));
 
        regmap_write(frontend->regs, SUN4I_FRONTEND_CH0_OUTSIZE_REG,
                     SUN4I_FRONTEND_OUTSIZE(state->crtc_h, state->crtc_w));
                     SUN4I_FRONTEND_OUTSIZE(state->crtc_h, state->crtc_w));
 
        regmap_write(frontend->regs, SUN4I_FRONTEND_CH0_HORZFACT_REG,
-                    state->src_w / state->crtc_w);
+                    (luma_width << 16) / state->crtc_w);
        regmap_write(frontend->regs, SUN4I_FRONTEND_CH1_HORZFACT_REG,
-                    state->src_w / state->crtc_w);
+                    (chroma_width << 16) / state->crtc_w);
 
        regmap_write(frontend->regs, SUN4I_FRONTEND_CH0_VERTFACT_REG,
-                    state->src_h / state->crtc_h);
+                    (luma_height << 16) / state->crtc_h);
        regmap_write(frontend->regs, SUN4I_FRONTEND_CH1_VERTFACT_REG,
-                    state->src_h / state->crtc_h);
+                    (chroma_height << 16) / state->crtc_h);
 
        regmap_write_bits(frontend->regs, SUN4I_FRONTEND_FRM_CTRL_REG,
                          SUN4I_FRONTEND_FRM_CTRL_REG_RDY,