vop2_win_write(win, VOP2_WIN_CLUSTER_ENABLE, 0);
 }
 
+static u32 vop2_get_bpp(const struct drm_format_info *format)
+{
+       switch (format->format) {
+       case DRM_FORMAT_YUV420_8BIT:
+               return 12;
+       case DRM_FORMAT_YUV420_10BIT:
+               return 15;
+       case DRM_FORMAT_VUY101010:
+               return 30;
+       default:
+               return drm_format_info_bpp(format, 0);
+       }
+}
+
 static enum vop2_data_format vop2_convert_format(u32 format)
 {
        switch (format) {
 {
        struct drm_rect *src = &pstate->src;
        struct drm_framebuffer *fb = pstate->fb;
-       u32 bpp = fb->format->cpp[0] * 8;
+       u32 bpp = vop2_get_bpp(fb->format);
        u32 vir_width = (fb->pitches[0] << 3) / bpp;
        u32 width = drm_rect_width(src) >> 16;
        u32 height = drm_rect_height(src) >> 16;
        struct drm_display_mode *adjusted_mode = &crtc->state->adjusted_mode;
        struct vop2 *vop2 = win->vop2;
        struct drm_framebuffer *fb = pstate->fb;
-       u32 bpp = fb->format->cpp[0] * 8;
+       u32 bpp = vop2_get_bpp(fb->format);
        u32 actual_w, actual_h, dsp_w, dsp_h;
        u32 act_info, dsp_info;
        u32 format;