// In general cases we want to keep the dram clock change requirement
        // (prefer configs that support MCLK switch). Only override to false
        // for SubVP
-       if (subvp_in_use)
+       if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching || subvp_in_use)
                context->bw_ctx.dml.soc.dram_clock_change_requirement_final = false;
        else
                context->bw_ctx.dml.soc.dram_clock_change_requirement_final = true;
 
        dc_assert_fp_enabled();
 
        if (dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].valid) {
-               context->bw_ctx.dml.soc.dram_clock_change_latency_us = dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.pstate_latency_us;
+               if (!context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching ||
+                               context->bw_ctx.dml.soc.dram_clock_change_latency_us == 0)
+                       context->bw_ctx.dml.soc.dram_clock_change_latency_us = dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.pstate_latency_us;
                context->bw_ctx.dml.soc.sr_enter_plus_exit_time_us = dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.sr_enter_plus_exit_time_us;
                context->bw_ctx.dml.soc.sr_exit_time_us = dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.sr_exit_time_us;
        }
                pipe_idx++;
        }
 
+       // WA: restrict FPO to use first non-strobe mode (NV24 BW issue)
+       if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching &&
+                       dc->dml.soc.num_chans <= 4 &&
+                       context->bw_ctx.dml.vba.DRAMSpeed <= 1700 &&
+                       context->bw_ctx.dml.vba.DRAMSpeed >= 1500) {
+
+               for (i = 0; i < dc->dml.soc.num_states; i++) {
+                       if (dc->dml.soc.clock_limits[i].dram_speed_mts > 1700) {
+                               context->bw_ctx.dml.vba.DRAMSpeed = dc->dml.soc.clock_limits[i].dram_speed_mts;
+                               break;
+                       }
+               }
+       }
+
        dcn20_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel);
 
        if (!pstate_en)