Commit 7a687f70 authored by Ankit Nautiyal's avatar Ankit Nautiyal
Browse files

drm/i915/dp: Introduce helper to check pixel rate against dotclock limits



Add intel_dp_dotclk_valid() helper, that checks the required pixel rate
against platform dotclock limit. With joined pipes the effective dotclock
limit depends upon the number of joined pipes.

Call the helper from the mode_valid phase and from the compute_config
phase where we need to check the limits for the given target clock for a
given joiner candidate.

v2: Rename the helper to intel_dp_dotclk_valid(). (Imre)

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-13-ankit.k.nautiyal@intel.com
parent 87860a1c
Loading
Loading
Loading
Loading
+22 −9
Original line number Diff line number Diff line
@@ -1412,6 +1412,18 @@ bool intel_dp_can_join(struct intel_display *display,
	}
}

bool intel_dp_dotclk_valid(struct intel_display *display,
			   int target_clock,
			   int num_joined_pipes)
{
	int max_dotclk = display->cdclk.max_dotclk_freq;
	int effective_dotclk_limit;

	effective_dotclk_limit = max_dotclk * num_joined_pipes;

	return target_clock <= effective_dotclk_limit;
}

static enum drm_mode_status
intel_dp_mode_valid(struct drm_connector *_connector,
		    const struct drm_display_mode *mode)
@@ -1474,8 +1486,6 @@ intel_dp_mode_valid(struct drm_connector *_connector,
	 */
	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 (connector->force_joined_pipes &&
		    num_joined_pipes != connector->force_joined_pipes)
			continue;
@@ -1543,9 +1553,9 @@ intel_dp_mode_valid(struct drm_connector *_connector,
		if (status != MODE_OK)
			continue;

		max_dotclk *= num_joined_pipes;

		if (target_clock > max_dotclk) {
		if (!intel_dp_dotclk_valid(display,
					   target_clock,
					   num_joined_pipes)) {
			status = MODE_CLOCK_HIGH;
			continue;
		}
@@ -2776,12 +2786,10 @@ intel_dp_compute_link_for_joined_pipes(struct intel_encoder *encoder,
	const struct drm_display_mode *adjusted_mode =
		&pipe_config->hw.adjusted_mode;
	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
	int max_dotclk = display->cdclk.max_dotclk_freq;
	struct link_config_limits limits;
	bool dsc_needed, joiner_needs_dsc;
	int ret = 0;

	max_dotclk *= num_joined_pipes;
	joiner_needs_dsc = intel_dp_joiner_needs_dsc(display, num_joined_pipes);

	dsc_needed = joiner_needs_dsc || intel_dp->force_dsc_en ||
@@ -2805,7 +2813,10 @@ intel_dp_compute_link_for_joined_pipes(struct intel_encoder *encoder,
							     fxp_q4_from_int(pipe_config->pipe_bpp),
							     0, false);

		if (ret || adjusted_mode->crtc_clock > max_dotclk)
		if (ret ||
		    !intel_dp_dotclk_valid(display,
					   adjusted_mode->crtc_clock,
					   num_joined_pipes))
			dsc_needed = true;
	}

@@ -2831,7 +2842,9 @@ intel_dp_compute_link_for_joined_pipes(struct intel_encoder *encoder,
		if (ret < 0)
			return ret;

		if (adjusted_mode->crtc_clock > max_dotclk)
		if (!intel_dp_dotclk_valid(display,
					   adjusted_mode->crtc_clock,
					   num_joined_pipes))
			return -EINVAL;
	}

+3 −0
Original line number Diff line number Diff line
@@ -224,5 +224,8 @@ int intel_dp_sdp_min_guardband(const struct intel_crtc_state *crtc_state,
int intel_dp_max_hdisplay_per_pipe(struct intel_display *display);
bool intel_dp_can_join(struct intel_display *display,
		       int num_joined_pipes);
bool intel_dp_dotclk_valid(struct intel_display *display,
			   int target_clock,
			   int num_joined_pipes);

#endif /* __INTEL_DP_H__ */
+10 −9
Original line number Diff line number Diff line
@@ -606,12 +606,10 @@ static int mst_stream_compute_link_for_joined_pipes(struct intel_encoder *encode
		&pipe_config->hw.adjusted_mode;
	struct intel_connector *connector =
		to_intel_connector(conn_state->connector);
	int max_dotclk = display->cdclk.max_dotclk_freq;
	struct link_config_limits limits;
	bool dsc_needed, joiner_needs_dsc;
	int ret = 0;

	max_dotclk *= num_joined_pipes;
	joiner_needs_dsc = intel_dp_joiner_needs_dsc(display, num_joined_pipes);

	dsc_needed = joiner_needs_dsc || intel_dp->force_dsc_en ||
@@ -625,7 +623,10 @@ static int mst_stream_compute_link_for_joined_pipes(struct intel_encoder *encode
		if (ret == -EDEADLK)
			return ret;

		if (ret || adjusted_mode->clock > max_dotclk)
		if (ret ||
		    !intel_dp_dotclk_valid(display,
					   adjusted_mode->clock,
					   num_joined_pipes))
			dsc_needed = true;
	}

@@ -669,7 +670,9 @@ static int mst_stream_compute_link_for_joined_pipes(struct intel_encoder *encode
		if (ret)
			return ret;

		if (adjusted_mode->clock > max_dotclk)
		if (!intel_dp_dotclk_valid(display,
					   adjusted_mode->clock,
					   num_joined_pipes))
			return -EINVAL;
	}

@@ -1525,8 +1528,6 @@ 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++) {
		int max_dotclk = display->cdclk.max_dotclk_freq;

		if (connector->force_joined_pipes &&
		    num_joined_pipes != connector->force_joined_pipes)
			continue;
@@ -1571,9 +1572,9 @@ mst_connector_mode_valid_ctx(struct drm_connector *_connector,
		if (*status != MODE_OK)
			continue;

		max_dotclk *= num_joined_pipes;

		if (mode->clock > max_dotclk) {
		if (!intel_dp_dotclk_valid(display,
					   mode->clock,
					   num_joined_pipes)) {
			*status = MODE_CLOCK_HIGH;
			continue;
		}