VOP_REG_SET(vop, common, cfg_done, 1);
 }
 
-static bool has_rb_swapped(uint32_t format)
+static bool has_rb_swapped(uint32_t version, uint32_t format)
 {
        switch (format) {
        case DRM_FORMAT_XBGR8888:
        case DRM_FORMAT_ABGR8888:
-       case DRM_FORMAT_BGR888:
        case DRM_FORMAT_BGR565:
                return true;
+       /*
+        * full framework (IP version 3.x) only need rb swapped for RGB888 and
+        * little framework (IP version 2.x) only need rb swapped for BGR888,
+        * check for 3.x to also only rb swap BGR888 for unknown vop version
+        */
+       case DRM_FORMAT_RGB888:
+               return VOP_MAJOR(version) == 3;
+       case DRM_FORMAT_BGR888:
+               return VOP_MAJOR(version) != 3;
        default:
                return false;
        }
        VOP_WIN_SET(vop, win, dsp_info, dsp_info);
        VOP_WIN_SET(vop, win, dsp_st, dsp_st);
 
-       rb_swap = has_rb_swapped(fb->format->format);
+       rb_swap = has_rb_swapped(vop->data->version, fb->format->format);
        VOP_WIN_SET(vop, win, rb_swap, rb_swap);
 
        /*