}
        }
 }
+
+static bool should_avoid_empty_tu(struct pipe_ctx *pipe_ctx)
+{
+       /* Calculate average pixel count per TU, return false if under ~2.00 to
+        * avoid empty TUs. This is only required for DPIA tunneling as empty TUs
+        * are legal to generate for native DP links. Assume TU size 64 as there
+        * is currently no scenario where it's reprogrammed from HW default.
+        * MTPs have no such limitation, so this does not affect MST use cases.
+        */
+       unsigned int pix_clk_mhz;
+       unsigned int symclk_mhz;
+       unsigned int avg_pix_per_tu_x1000;
+       unsigned int tu_size_bytes = 64;
+       struct dc_crtc_timing *timing = &pipe_ctx->stream->timing;
+       struct dc_link_settings *link_settings = &pipe_ctx->link_config.dp_link_settings;
+       const struct dc *dc = pipe_ctx->stream->link->dc;
+
+       if (pipe_ctx->stream->link->ep_type != DISPLAY_ENDPOINT_USB4_DPIA)
+               return false;
+
+       // Not necessary for MST configurations
+       if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST)
+               return false;
+
+       pix_clk_mhz = timing->pix_clk_100hz / 10000;
+
+       // If this is true, can't block due to dynamic ODM
+       if (pix_clk_mhz > dc->clk_mgr->bw_params->clk_table.entries[0].dispclk_mhz)
+               return false;
+
+       switch (link_settings->link_rate) {
+       case LINK_RATE_LOW:
+               symclk_mhz = 162;
+               break;
+       case LINK_RATE_HIGH:
+               symclk_mhz = 270;
+               break;
+       case LINK_RATE_HIGH2:
+               symclk_mhz = 540;
+               break;
+       case LINK_RATE_HIGH3:
+               symclk_mhz = 810;
+               break;
+       default:
+               // We shouldn't be tunneling any other rates, something is wrong
+               ASSERT(0);
+               return false;
+       }
+
+       avg_pix_per_tu_x1000 = (1000 * pix_clk_mhz * tu_size_bytes)
+               / (symclk_mhz * link_settings->lane_count);
+
+       // Add small empirically-decided margin to account for potential jitter
+       return (avg_pix_per_tu_x1000 < 2020);
+}
+
+bool dcn35_is_dp_dig_pixel_rate_div_policy(struct pipe_ctx *pipe_ctx)
+{
+       struct dc *dc = pipe_ctx->stream->ctx->dc;
+
+       if (!is_h_timing_divisible_by_2(pipe_ctx->stream))
+               return false;
+
+       if (should_avoid_empty_tu(pipe_ctx))
+               return false;
+
+       if (dc_is_dp_signal(pipe_ctx->stream->signal) && !dc->link_srv->dp_is_128b_132b_signal(pipe_ctx) &&
+               dc->debug.enable_dp_dig_pixel_rate_div_policy)
+               return true;
+
+       return false;
+}
 
        .setup_hpo_hw_control = dcn35_setup_hpo_hw_control,
        .calculate_dccg_k1_k2_values = dcn32_calculate_dccg_k1_k2_values,
        .resync_fifo_dccg_dio = dcn314_resync_fifo_dccg_dio,
-       .is_dp_dig_pixel_rate_div_policy = dcn32_is_dp_dig_pixel_rate_div_policy,
+       .is_dp_dig_pixel_rate_div_policy = dcn35_is_dp_dig_pixel_rate_div_policy,
        .dsc_pg_control = dcn35_dsc_pg_control,
        .dsc_pg_status = dcn32_dsc_pg_status,
        .enable_plane = dcn35_enable_plane,