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

drm/i915: Put fixed modes directly onto the panel's fixed_modes list



Rather than having the connector init get the fixed mode back from
intel_panel and then feed it straight back into intel_panel_init()
let's just make the fixed mode lookup put the mode directly onto
the panel's fixed_modes list. Avoids the pointless round trip and
opens the door for further enhancements to the fixed mode handling.

v2: Make the debug message correct by using intel_panel_drrs_type() (Jani)

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


Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
parent 1c05183a
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -1993,7 +1993,6 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
	struct intel_encoder *encoder;
	struct intel_connector *intel_connector;
	struct drm_connector *connector;
	struct drm_display_mode *fixed_mode;
	enum port port;

	if (!intel_bios_is_dsi_present(dev_priv, &port))
@@ -2050,15 +2049,16 @@ void icl_dsi_init(struct drm_i915_private *dev_priv)
	intel_connector_attach_encoder(intel_connector, encoder);

	mutex_lock(&dev->mode_config.mutex);
	fixed_mode = intel_panel_vbt_lfp_fixed_mode(intel_connector);
	intel_panel_add_vbt_lfp_fixed_mode(intel_connector);
	mutex_unlock(&dev->mode_config.mutex);

	if (!fixed_mode) {
	if (!intel_panel_preferred_fixed_mode(intel_connector)) {
		drm_err(&dev_priv->drm, "DSI fixed mode info missing\n");
		goto err;
	}

	intel_panel_init(intel_connector, fixed_mode, NULL);
	intel_panel_init(intel_connector);

	intel_backlight_setup(intel_connector, INVALID_PIPE);

	if (dev_priv->vbt.dsi.config->dual_link)
+12 −10
Original line number Diff line number Diff line
@@ -5015,8 +5015,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
	struct drm_device *dev = &dev_priv->drm;
	struct drm_connector *connector = &intel_connector->base;
	struct drm_display_mode *fixed_mode = NULL;
	struct drm_display_mode *downclock_mode = NULL;
	struct drm_display_mode *fixed_mode;
	bool has_dpcd;
	enum pipe pipe = INVALID_PIPE;
	struct edid *edid;
@@ -5073,20 +5072,22 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
	}
	intel_connector->edid = edid;

	fixed_mode = intel_panel_edid_fixed_mode(intel_connector);
	if (fixed_mode && intel_edp_has_drrs(intel_dp))
		downclock_mode = intel_drrs_init(intel_connector, fixed_mode);
	intel_panel_add_edid_fixed_mode(intel_connector);
	if (intel_panel_preferred_fixed_mode(intel_connector) &&
	    intel_edp_has_drrs(intel_dp))
		intel_drrs_init(intel_connector);

	/* MSO requires information from the EDID */
	intel_edp_mso_init(intel_dp);

	/* multiply the mode clock and horizontal timings for MSO */
	list_for_each_entry(fixed_mode, &intel_connector->panel.fixed_modes, head)
		intel_edp_mso_mode_fixup(intel_connector, fixed_mode);
	intel_edp_mso_mode_fixup(intel_connector, downclock_mode);

	/* fallback to VBT if available for eDP */
	if (!fixed_mode)
		fixed_mode = intel_panel_vbt_lfp_fixed_mode(intel_connector);
	if (!intel_panel_preferred_fixed_mode(intel_connector))
		intel_panel_add_vbt_lfp_fixed_mode(intel_connector);

	mutex_unlock(&dev->mode_config.mutex);

	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
@@ -5108,7 +5109,8 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
			    pipe_name(pipe));
	}

	intel_panel_init(intel_connector, fixed_mode, downclock_mode);
	intel_panel_init(intel_connector);

	if (!(dev_priv->quirks & QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK))
		intel_connector->panel.backlight.power = intel_pps_backlight_power;
	intel_backlight_setup(intel_connector, pipe);
+5 −17
Original line number Diff line number Diff line
@@ -358,7 +358,6 @@ void intel_crtc_drrs_init(struct intel_crtc *crtc)
/**
 * intel_drrs_init - Init DRRS for eDP connector
 * @connector: eDP connector
 * @fixed_mode: preferred mode of panel
 *
 * This function is called only once at driver load to initialize
 * DRRS support for the connector.
@@ -368,25 +367,14 @@ void intel_crtc_drrs_init(struct intel_crtc *crtc)
 * DRRS support is determined by the presence of downclock mode (apart
 * from VBT setting).
 */
struct drm_display_mode *
intel_drrs_init(struct intel_connector *connector,
		const struct drm_display_mode *fixed_mode)
void intel_drrs_init(struct intel_connector *connector)
{
	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
	struct drm_display_mode *downclock_mode;

	downclock_mode = intel_panel_edid_downclock_mode(connector, fixed_mode);
	if (!downclock_mode) {
		drm_dbg_kms(&dev_priv->drm,
			    "[CONNECTOR:%d:%s] DRRS not supported due to lack of downclock mode\n",
			    connector->base.base.id, connector->base.name);
		return NULL;
	}
	intel_panel_add_edid_downclock_mode(connector);

	drm_dbg_kms(&dev_priv->drm,
		    "[CONNECTOR:%d:%s] %s DRRS supported\n",
		    "[CONNECTOR:%d:%s] DRRS type: %s\n",
		    connector->base.base.id, connector->base.name,
		    intel_drrs_type_str(dev_priv->vbt.drrs_type));

	return downclock_mode;
		    intel_drrs_type_str(intel_panel_drrs_type(connector)));
}
+1 −2
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ void intel_drrs_compute_config(struct intel_connector *connector,
			       struct intel_crtc_state *pipe_config,
			       int output_bpp, bool constant_n);
void intel_crtc_drrs_init(struct intel_crtc *crtc);
struct drm_display_mode *intel_drrs_init(struct intel_connector *connector,
					 const struct drm_display_mode *fixed_mode);
void intel_drrs_init(struct intel_connector *connector);

#endif /* __INTEL_DRRS_H__ */
+4 −5
Original line number Diff line number Diff line
@@ -520,8 +520,6 @@ void intel_dvo_init(struct drm_i915_private *dev_priv)

		intel_connector_attach_encoder(intel_connector, intel_encoder);
		if (dvo->type == INTEL_DVO_CHIP_LVDS) {
			struct drm_display_mode *fixed_mode;

			/*
			 * For our LVDS chipsets, we should hopefully be able
			 * to dig the fixed panel mode out of the BIOS data.
@@ -530,10 +528,11 @@ void intel_dvo_init(struct drm_i915_private *dev_priv)
			 * headers, likely), so for now, just get the current
			 * mode being output through DVO.
			 */
			fixed_mode = intel_panel_encoder_fixed_mode(intel_connector,
			intel_panel_add_encoder_fixed_mode(intel_connector,
							   intel_encoder);

			intel_panel_init(intel_connector, fixed_mode, NULL);
			intel_panel_init(intel_connector);

			intel_dvo->panel_wants_dither = true;
		}

Loading