Commit cff4c2c6 authored by Ville Syrjälä's avatar Ville Syrjälä
Browse files

drm/i915: Introduce intel_panel_compute_config()



Let's introduce a compute_config() helper for fixed mode panels.
For now all it does is the fixed_mode->adjusted_mode copy.

Note that with sDVO we have to ask the external encoder chip
to spit out our actual display timings for us, so the fixed_mode
to adjusted_mode copy done by intel_panel_compute_config() is
redundant, but we still want to use it to do other checks for us
later. We'll be fine so long as we only call it before
intel_sdvo_get_preferred_input_mode() overwrites adjusted_mode
with the timings from the encoder.

v2: Use intel_panel_compute_config() with sDVO

Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210927185207.13620-1-ville.syrjala@linux.intel.com


Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
parent 00fc3787
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -1672,14 +1672,15 @@ static int gen11_dsi_compute_config(struct intel_encoder *encoder,
	struct intel_dsi *intel_dsi = container_of(encoder, struct intel_dsi,
						   base);
	struct intel_connector *intel_connector = intel_dsi->attached_connector;
	const struct drm_display_mode *fixed_mode =
		intel_connector->panel.fixed_mode;
	struct drm_display_mode *adjusted_mode =
		&pipe_config->hw.adjusted_mode;
	int ret;

	pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
	intel_panel_fixed_mode(fixed_mode, adjusted_mode);

	ret = intel_panel_compute_config(intel_connector, adjusted_mode);
	if (ret)
		return ret;

	ret = intel_panel_fitting(pipe_config, conn_state);
	if (ret)
+3 −2
Original line number Diff line number Diff line
@@ -1757,8 +1757,9 @@ intel_dp_compute_config(struct intel_encoder *encoder,
		pipe_config->has_audio = intel_conn_state->force_audio == HDMI_AUDIO_ON;

	if (intel_dp_is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
		intel_panel_fixed_mode(intel_connector->panel.fixed_mode,
				       adjusted_mode);
		ret = intel_panel_compute_config(intel_connector, adjusted_mode);
		if (ret)
			return ret;

		ret = intel_panel_fitting(pipe_config, conn_state);
		if (ret)
+8 −2
Original line number Diff line number Diff line
@@ -256,6 +256,7 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder,
				    struct drm_connector_state *conn_state)
{
	struct intel_dvo *intel_dvo = enc_to_dvo(encoder);
	struct intel_connector *connector = to_intel_connector(conn_state->connector);
	const struct drm_display_mode *fixed_mode =
		intel_dvo->attached_connector->panel.fixed_mode;
	struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
@@ -266,8 +267,13 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder,
	 * with the panel scaling set up to source from the H/VDisplay
	 * of the original mode.
	 */
	if (fixed_mode)
		intel_panel_fixed_mode(fixed_mode, adjusted_mode);
	if (fixed_mode) {
		int ret;

		ret = intel_panel_compute_config(connector, adjusted_mode);
		if (ret)
			return ret;
	}

	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
		return -EINVAL;
+3 −2
Original line number Diff line number Diff line
@@ -444,8 +444,9 @@ static int intel_lvds_compute_config(struct intel_encoder *intel_encoder,
	 * with the panel scaling set up to source from the H/VDisplay
	 * of the original mode.
	 */
	intel_panel_fixed_mode(intel_connector->panel.fixed_mode,
			       adjusted_mode);
	ret = intel_panel_compute_config(intel_connector, adjusted_mode);
	if (ret)
		return ret;

	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
		return -EINVAL;
+9 −2
Original line number Diff line number Diff line
@@ -45,12 +45,19 @@ bool intel_panel_use_ssc(struct drm_i915_private *i915)
		&& !(i915->quirks & QUIRK_LVDS_SSC_DISABLE);
}

void intel_panel_fixed_mode(const struct drm_display_mode *fixed_mode,
int intel_panel_compute_config(struct intel_connector *connector,
			       struct drm_display_mode *adjusted_mode)
{
	const struct drm_display_mode *fixed_mode = connector->panel.fixed_mode;

	if (!fixed_mode)
		return 0;

	drm_mode_copy(adjusted_mode, fixed_mode);

	drm_mode_set_crtcinfo(adjusted_mode, 0);

	return 0;
}

static bool is_downclock_mode(const struct drm_display_mode *downclock_mode,
Loading