Introduce for_each_joiner_candidate(), intel_dp_pick_joiner_candidate() and intel_dp_joiner_candidate_valid() to remove duplicated joiner enumeration and validity checks across DP SST and MST paths.
Signed-off-by: Ankit Nautiyal <[email protected]> --- drivers/gpu/drm/i915/display/intel_dp.c | 37 ++++++++------------- drivers/gpu/drm/i915/display/intel_dp.h | 31 +++++++++++++++++ drivers/gpu/drm/i915/display/intel_dp_mst.c | 37 ++++++++------------- 3 files changed, 59 insertions(+), 46 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index c1ff92367808..9eba8f90bc90 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -1529,23 +1529,19 @@ intel_dp_mode_valid(struct drm_connector *_connector, * Because of this dependency cycle, the only correct approach is to iterate * over candidate pipe counts and evaluate each combination. */ - for (num_pipes = 0; num_pipes < I915_MAX_PIPES; num_pipes++) { + for_each_joiner_candidate(num_pipes) { int dsc_slice_count = 0; status = MODE_CLOCK_HIGH; - if (num_pipes == 0) { - if (!connector->force_joined_pipes) - continue; - num_joined_pipes = connector->force_joined_pipes; - } else { - num_joined_pipes = num_pipes; - } - - if (!intel_dp_can_join(display, num_joined_pipes)) + if (!intel_dp_pick_joiner_candidate(num_pipes, + connector->force_joined_pipes, + &num_joined_pipes)) continue; - if (mode->hdisplay > num_joined_pipes * intel_dp_max_hdisplay_per_pipe(display)) + if (!intel_dp_joiner_candidate_valid(display, + mode->hdisplay, + num_joined_pipes)) continue; status = intel_pfit_mode_valid(display, mode, output_format, num_joined_pipes); @@ -2938,20 +2934,15 @@ intel_dp_compute_link_config(struct intel_encoder *encoder, !intel_dp_supports_fec(intel_dp, connector, crtc_state)) return -EINVAL; - for (num_pipes = 0; num_pipes < I915_MAX_PIPES; num_pipes++) { - if (num_pipes == 0) { - if (!connector->force_joined_pipes) - continue; - num_joined_pipes = connector->force_joined_pipes; - } else { - num_joined_pipes = num_pipes; - } - - if (!intel_dp_can_join(display, num_joined_pipes)) + for_each_joiner_candidate(num_pipes) { + if (!intel_dp_pick_joiner_candidate(num_pipes, + connector->force_joined_pipes, + &num_joined_pipes)) continue; - if (adjusted_mode->hdisplay > - num_joined_pipes * intel_dp_max_hdisplay_per_pipe(display)) + if (!intel_dp_joiner_candidate_valid(display, + adjusted_mode->hdisplay, + num_joined_pipes)) continue; /* diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h index beef480b7672..111a5d4b3992 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.h +++ b/drivers/gpu/drm/i915/display/intel_dp.h @@ -234,4 +234,35 @@ bool intel_dp_dotclk_valid(struct intel_display *display, int dsc_slice_count, int num_joined_pipes); +#define for_each_joiner_candidate(__num_pipes) \ + for ((__num_pipes) = 0; (__num_pipes) < (I915_MAX_PIPES); (__num_pipes)++) + +static inline bool intel_dp_pick_joiner_candidate(int num_pipes, + int force_joined_pipes, + int *num_joined_pipes) +{ + if (num_pipes == 0) { + if (!force_joined_pipes) + return false; + *num_joined_pipes = force_joined_pipes; + } else { + *num_joined_pipes = num_pipes; + } + + return true; +} + +static inline bool intel_dp_joiner_candidate_valid(struct intel_display *display, + int hdisplay, + int num_joined_pipes) +{ + if (!intel_dp_can_join(display, num_joined_pipes)) + return false; + + if (hdisplay > num_joined_pipes * intel_dp_max_hdisplay_per_pipe(display)) + return false; + + return true; +} + #endif /* __INTEL_DP_H__ */ diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c index bdf2f09fa03e..005efcb5d2bf 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c @@ -701,24 +701,19 @@ static int mst_stream_compute_config(struct intel_encoder *encoder, pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB; pipe_config->has_pch_encoder = false; - for (num_pipes = 0; num_pipes < I915_MAX_PIPES; num_pipes++) { + for_each_joiner_candidate(num_pipes) { int dsc_slice_count = 0; ret = -EINVAL; - if (num_pipes == 0) { - if (!connector->force_joined_pipes) - continue; - num_joined_pipes = connector->force_joined_pipes; - } else { - num_joined_pipes = num_pipes; - } - - if (!intel_dp_can_join(display, num_joined_pipes)) + if (!intel_dp_pick_joiner_candidate(num_pipes, + connector->force_joined_pipes, + &num_joined_pipes)) continue; - if (adjusted_mode->hdisplay > - num_joined_pipes * intel_dp_max_hdisplay_per_pipe(display)) + if (!intel_dp_joiner_candidate_valid(display, + adjusted_mode->hdisplay, + num_joined_pipes)) continue; if (num_joined_pipes > 1) @@ -1535,23 +1530,19 @@ mst_connector_mode_valid_ctx(struct drm_connector *_connector, return 0; } - for (num_pipes = 0; num_pipes < I915_MAX_PIPES; num_pipes++) { + for_each_joiner_candidate(num_pipes) { int dsc_slice_count = 0; *status = MODE_CLOCK_HIGH; - if (num_pipes == 0) { - if (!connector->force_joined_pipes) - continue; - num_joined_pipes = connector->force_joined_pipes; - } else { - num_joined_pipes = num_pipes; - } - - if (!intel_dp_can_join(display, num_joined_pipes)) + if (!intel_dp_pick_joiner_candidate(num_pipes, + connector->force_joined_pipes, + &num_joined_pipes)) continue; - if (mode->hdisplay > num_joined_pipes * intel_dp_max_hdisplay_per_pipe(display)) + if (!intel_dp_joiner_candidate_valid(display, + mode->hdisplay, + num_joined_pipes)) continue; if (intel_dp_has_dsc(connector) && -- 2.45.2
