struct drm_dp_mst_topology_mgr *mgr = &intel_dp->mst.mgr;
struct drm_dp_mst_port *port = connector->mst.port;
const int min_bpp = 18;
- int max_dotclk = display->cdclk.max_dotclk_freq;
int max_rate, mode_rate, max_lanes, max_link_clock;
unsigned long bw_overhead_flags =
DRM_DP_BW_OVERHEAD_MST | DRM_DP_BW_OVERHEAD_SSC_REF_CLK;
return 0;
}
- num_joined_pipes = intel_dp_num_joined_pipes(intel_dp, connector,
- mode->hdisplay, target_clock);
+ *status = MODE_CLOCK_HIGH;
+ for (num_joined_pipes = 1; num_joined_pipes <= I915_MAX_PIPES; num_joined_pipes++) {
+ int max_dotclk = display->cdclk.max_dotclk_freq;
- if (intel_dp_has_dsc(connector) && drm_dp_sink_supports_fec(connector->dp.fec_capability)) {
- /*
- * TBD pass the connector BPC,
- * for now U8_MAX so that max BPC on that platform would be picked
- */
- int pipe_bpp = intel_dp_dsc_compute_max_bpp(connector, U8_MAX);
+ if (connector->force_joined_pipes &&
+ num_joined_pipes != connector->force_joined_pipes)
+ continue;
- if (!drm_dp_is_uhbr_rate(max_link_clock))
- bw_overhead_flags |= DRM_DP_BW_OVERHEAD_FEC;
+ if (!intel_dp_can_join(display, num_joined_pipes))
+ continue;
- dsc = intel_dp_mode_valid_with_dsc(connector,
- max_link_clock, max_lanes,
- target_clock, mode->hdisplay,
- num_joined_pipes,
- INTEL_OUTPUT_FORMAT_RGB, pipe_bpp,
- bw_overhead_flags);
- }
+ if (mode->hdisplay > num_joined_pipes * intel_dp_max_hdisplay_per_pipe(display))
+ continue;
- if (intel_dp_joiner_needs_dsc(display, num_joined_pipes) && !dsc) {
- *status = MODE_CLOCK_HIGH;
- return 0;
- }
+ if (intel_dp_has_dsc(connector) &&
+ drm_dp_sink_supports_fec(connector->dp.fec_capability)) {
+ /*
+ * TBD pass the connector BPC,
+ * for now U8_MAX so that max BPC on that platform would be picked
+ */
+ int pipe_bpp = intel_dp_dsc_compute_max_bpp(connector, U8_MAX);
- if (mode_rate > max_rate && !dsc) {
- *status = MODE_CLOCK_HIGH;
- return 0;
- }
+ if (!drm_dp_is_uhbr_rate(max_link_clock))
+ bw_overhead_flags |= DRM_DP_BW_OVERHEAD_FEC;
- *status = intel_mode_valid_max_plane_size(display, mode, num_joined_pipes);
+ dsc = intel_dp_mode_valid_with_dsc(connector,
+ max_link_clock, max_lanes,
+ target_clock, mode->hdisplay,
+ num_joined_pipes,
+ INTEL_OUTPUT_FORMAT_RGB, pipe_bpp,
+ bw_overhead_flags);
+ }
- if (*status != MODE_OK)
- return 0;
+ if (intel_dp_joiner_needs_dsc(display, num_joined_pipes) && !dsc) {
+ *status = MODE_CLOCK_HIGH;
+ continue;
+ }
- max_dotclk *= num_joined_pipes;
+ if (mode_rate > max_rate && !dsc) {
+ *status = MODE_CLOCK_HIGH;
+ continue;
+ }
- if (mode->clock > max_dotclk)
- *status = MODE_CLOCK_HIGH;
+ *status = intel_mode_valid_max_plane_size(display, mode, num_joined_pipes);
+
+ if (*status != MODE_OK)
+ continue;
+
+ max_dotclk *= num_joined_pipes;
+
+ if (mode->clock > max_dotclk) {
+ *status = MODE_CLOCK_HIGH;
+ continue;
+ }
+
+ break;
+ }
return 0;
}