uint32_t cache_line_size;
        uint32_t cache_num_ways;
        uint16_t subvp_fw_processing_delay_us;
+       uint8_t subvp_drr_max_vblank_margin_us;
        uint16_t subvp_prefetch_end_to_mall_start_us;
        uint8_t subvp_swath_height_margin_lines; // subvp start line must be aligned to 2 x swath height
        uint16_t subvp_pstate_allow_width_us;
 
                        (((uint64_t)main_timing->pix_clk_100hz * 100)));
        drr_active_us = div64_u64(((uint64_t)drr_timing->v_addressable * drr_timing->h_total * 1000000),
                        (((uint64_t)drr_timing->pix_clk_100hz * 100)));
-       max_drr_vblank_us = div64_u64((subvp_active_us - prefetch_us - drr_active_us), 2) + drr_active_us;
-       max_drr_mallregion_us = subvp_active_us - prefetch_us - mall_region_us;
+       max_drr_vblank_us = div64_u64((subvp_active_us - prefetch_us -
+                       dc->caps.subvp_fw_processing_delay_us - drr_active_us), 2) + drr_active_us;
+       max_drr_mallregion_us = subvp_active_us - prefetch_us - mall_region_us - dc->caps.subvp_fw_processing_delay_us;
        max_drr_supported_us = max_drr_vblank_us > max_drr_mallregion_us ? max_drr_vblank_us : max_drr_mallregion_us;
        max_vtotal_supported = div64_u64(((uint64_t)drr_timing->pix_clk_100hz * 100 * max_drr_supported_us),
                        (((uint64_t)drr_timing->h_total * 1000000)));
 
+       /* When calculating the max vtotal supported for SubVP + DRR cases, add
+        * margin due to possible rounding errors (being off by 1 line in the
+        * FW calculation can incorrectly push the P-State switch to wait 1 frame
+        * longer).
+        */
+       max_vtotal_supported = max_vtotal_supported - dc->caps.subvp_drr_max_vblank_margin_us;
+
        pipe_data->pipe_config.vblank_data.drr_info.min_vtotal_supported = min_vtotal_supported;
        pipe_data->pipe_config.vblank_data.drr_info.max_vtotal_supported = max_vtotal_supported;
 }
 
        dc->caps.cache_num_ways = 16;
        dc->caps.max_cab_allocation_bytes = 67108864; // 64MB = 1024 * 1024 * 64
        dc->caps.subvp_fw_processing_delay_us = 15;
+       dc->caps.subvp_drr_max_vblank_margin_us = 40;
        dc->caps.subvp_prefetch_end_to_mall_start_us = 15;
        dc->caps.subvp_swath_height_margin_lines = 16;
        dc->caps.subvp_pstate_allow_width_us = 20;
 
        dc->caps.cache_num_ways = 16;
        dc->caps.max_cab_allocation_bytes = 33554432; // 32MB = 1024 * 1024 * 32
        dc->caps.subvp_fw_processing_delay_us = 15;
+       dc->caps.subvp_drr_max_vblank_margin_us = 40;
        dc->caps.subvp_prefetch_end_to_mall_start_us = 15;
        dc->caps.subvp_swath_height_margin_lines = 16;
        dc->caps.subvp_pstate_allow_width_us = 20;