Commit a049ced8 authored by Ankit Nautiyal's avatar Ankit Nautiyal
Browse files

drm/i915/dp: Add helpers for joiner candidate loops



Introduce for_each_joiner_candidate(), intel_dp_joiner_candidate_valid()
and intel_dp_joiner_candidate_valid() to remove duplicated joiner
enumeration and validity checks across DP SST and MST paths.

Suggested-by: default avatarImre Deak <imre.deak@intel.com>
Signed-off-by: default avatarAnkit Nautiyal <ankit.k.nautiyal@intel.com>
Reviewed-by: default avatarImre Deak <imre.deak@intel.com>
Link: https://patch.msgid.link/20260202103731.357416-16-ankit.k.nautiyal@intel.com
parent 5ec260d7
Loading
Loading
Loading
Loading
+20 −24
Original line number Diff line number Diff line
@@ -1492,19 +1492,9 @@ intel_dp_mode_valid(struct drm_connector *_connector,
	 * over candidate pipe counts and evaluate each combination.
	 */
	status = MODE_CLOCK_HIGH;
	for (num_joined_pipes = 1; num_joined_pipes <= I915_MAX_PIPES; num_joined_pipes++) {
	for_each_joiner_candidate(connector, mode, num_joined_pipes) {
		int dsc_slice_count = 0;

		if (connector->force_joined_pipes &&
		    num_joined_pipes != connector->force_joined_pipes)
			continue;

		if (!intel_dp_can_join(display, num_joined_pipes))
			continue;

		if (mode->hdisplay > num_joined_pipes * intel_dp_max_hdisplay_per_pipe(display))
			continue;

		status = intel_pfit_mode_valid(display, mode, output_format, num_joined_pipes);
		if (status != MODE_OK)
			continue;
@@ -2888,7 +2878,6 @@ intel_dp_compute_link_config(struct intel_encoder *encoder,
			     struct drm_connector_state *conn_state,
			     bool respect_downstream_limits)
{
	struct intel_display *display = to_intel_display(encoder);
	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
	struct intel_connector *connector =
		to_intel_connector(conn_state->connector);
@@ -2902,18 +2891,7 @@ intel_dp_compute_link_config(struct intel_encoder *encoder,
	    !intel_dp_supports_fec(intel_dp, connector, crtc_state))
		return -EINVAL;

	for (num_joined_pipes = 1; num_joined_pipes <= I915_MAX_PIPES; num_joined_pipes++) {
		if (connector->force_joined_pipes &&
		    num_joined_pipes != connector->force_joined_pipes)
			continue;

		if (!intel_dp_can_join(display, num_joined_pipes))
			continue;

		if (adjusted_mode->hdisplay >
		    num_joined_pipes * intel_dp_max_hdisplay_per_pipe(display))
			continue;

	for_each_joiner_candidate(connector, adjusted_mode, num_joined_pipes) {
		/*
		 * NOTE:
		 * The crtc_state->joiner_pipes should have been set at the end
@@ -7230,3 +7208,21 @@ int intel_dp_sdp_min_guardband(const struct intel_crtc_state *crtc_state,

	return sdp_guardband;
}

bool intel_dp_joiner_candidate_valid(struct intel_connector *connector,
				     int hdisplay,
				     int num_joined_pipes)
{
	struct intel_display *display = to_intel_display(connector);

	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;

	if (connector->force_joined_pipes && connector->force_joined_pipes != num_joined_pipes)
		return false;

	return true;
}
+7 −0
Original line number Diff line number Diff line
@@ -229,5 +229,12 @@ bool intel_dp_dotclk_valid(struct intel_display *display,
			   int htotal,
			   int dsc_slice_count,
			   int num_joined_pipes);
bool intel_dp_joiner_candidate_valid(struct intel_connector *connector,
				     int hdisplay,
				     int num_joined_pipes);

#define for_each_joiner_candidate(__connector, __mode, __num_joined_pipes) \
	for ((__num_joined_pipes) = 1; (__num_joined_pipes) <= (I915_MAX_PIPES); (__num_joined_pipes)++) \
		for_each_if(intel_dp_joiner_candidate_valid(__connector, (__mode)->hdisplay, __num_joined_pipes))

#endif /* __INTEL_DP_H__ */
+2 −23
Original line number Diff line number Diff line
@@ -720,18 +720,7 @@ 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_joined_pipes = 1; num_joined_pipes <= I915_MAX_PIPES; num_joined_pipes++) {
		if (connector->force_joined_pipes &&
		    num_joined_pipes != connector->force_joined_pipes)
			continue;

		if (!intel_dp_can_join(display, num_joined_pipes))
			continue;

		if (adjusted_mode->hdisplay >
		    num_joined_pipes * intel_dp_max_hdisplay_per_pipe(display))
			continue;

	for_each_joiner_candidate(connector, adjusted_mode, num_joined_pipes) {
		if (num_joined_pipes > 1)
			pipe_config->joiner_pipes = GENMASK(crtc->pipe + num_joined_pipes - 1,
							    crtc->pipe);
@@ -1535,19 +1524,9 @@ mst_connector_mode_valid_ctx(struct drm_connector *_connector,
	}

	*status = MODE_CLOCK_HIGH;
	for (num_joined_pipes = 1; num_joined_pipes <= I915_MAX_PIPES; num_joined_pipes++) {
	for_each_joiner_candidate(connector, mode, num_joined_pipes) {
		int dsc_slice_count = 0;

		if (connector->force_joined_pipes &&
		    num_joined_pipes != connector->force_joined_pipes)
			continue;

		if (!intel_dp_can_join(display, num_joined_pipes))
			continue;

		if (mode->hdisplay > num_joined_pipes * intel_dp_max_hdisplay_per_pipe(display))
			continue;

		if (intel_dp_has_dsc(connector) &&
		    drm_dp_sink_supports_fec(connector->dp.fec_capability)) {
			/*