bool out = false;
 
        int pipe_cnt, i, pipe_idx, vlevel, vlevel_unsplit;
-       bool odm_capable = context->bw_ctx.dml.ip.odm_capable;
        bool force_split = false;
-#ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
-       bool failed_non_odm_dsc = false;
-#endif
        int split_threshold = dc->res_pool->pipe_count / 2;
        bool avoid_split = dc->debug.pipe_split_policy != MPC_SPLIT_DYNAMIC;
 
                goto validate_out;
        }
 
-       context->bw_ctx.dml.ip.odm_capable = 0;
-
        vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);
 
-       context->bw_ctx.dml.ip.odm_capable = odm_capable;
-
-#ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
-       /* 1 dsc per stream dsc validation */
-       if (vlevel <= context->bw_ctx.dml.soc.num_states)
-               if (!dcn20_validate_dsc(dc, context)) {
-                       failed_non_odm_dsc = true;
-                       vlevel = context->bw_ctx.dml.soc.num_states + 1;
-               }
-#endif
-
-       if (vlevel > context->bw_ctx.dml.soc.num_states && odm_capable)
-               vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);
-
        if (vlevel > context->bw_ctx.dml.soc.num_states)
                goto validate_fail;
 
        }
 #ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
        /* Actual dsc count per stream dsc validation*/
-       if (failed_non_odm_dsc && !dcn20_validate_dsc(dc, context)) {
+       if (!dcn20_validate_dsc(dc, context)) {
                context->bw_ctx.dml.vba.ValidationStatus[context->bw_ctx.dml.vba.soc.num_states] =
                                DML_FAIL_DSC_VALIDATION_FAILURE;
                goto validate_fail;
 
 
 #define BPP_INVALID 0
 #define BPP_BLENDED_PIPE 0xffffffff
+#define DCN20_MAX_DSC_IMAGE_WIDTH 5184
 
 static double adjust_ReturnBW(
                struct display_mode_lib *mode_lib,
                                mode_lib->vba.MaximumSwathWidthInLineBuffer);
        }
        for (i = 0; i <= mode_lib->vba.soc.num_states; i++) {
+               double MaxMaxDispclkRoundedDown = RoundToDFSGranularityDown(
+                       mode_lib->vba.MaxDispclk[mode_lib->vba.soc.num_states],
+                       mode_lib->vba.DISPCLKDPPCLKVCOSpeed);
+
                for (j = 0; j < 2; j++) {
                        mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity = RoundToDFSGranularityDown(
                                mode_lib->vba.MaxDispclk[i],
                                                && i == mode_lib->vba.soc.num_states)
                                        mode_lib->vba.PlaneRequiredDISPCLKWithODMCombine = mode_lib->vba.PixelClock[k] / 2
                                                        * (1 + mode_lib->vba.DISPCLKDPPCLKDSCCLKDownSpreading / 100.0);
-                               if (mode_lib->vba.ODMCapability == false || mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine <= mode_lib->vba.MaxDispclkRoundedDownToDFSGranularity) {
+                               if (mode_lib->vba.ODMCapability == false ||
+                                               (locals->PlaneRequiredDISPCLKWithoutODMCombine <= MaxMaxDispclkRoundedDown
+                                                       && (!locals->DSCEnabled[k] || locals->HActive[k] <= DCN20_MAX_DSC_IMAGE_WIDTH))) {
                                        locals->ODMCombineEnablePerState[i][k] = false;
                                        mode_lib->vba.PlaneRequiredDISPCLK = mode_lib->vba.PlaneRequiredDISPCLKWithoutODMCombine;
                                } else {