Commit 698236f5 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm-intel-fixes-2024-03-07' of...

Merge tag 'drm-intel-fixes-2024-03-07' of https://anongit.freedesktop.org/git/drm/drm-intel

 into drm-fixes

- Fix for #10184: Kernel crash on UHD Graphics 730 (Cc stable)
. Fix for #10284: Boot delay regresion with PSR
- Fix DP connector DSC HW state readout
- Selftest fix to convert msecs to jiffies

Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
From: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/Zel4jMpJ2Fay5VeJ@jlahtine-mobl.ger.corp.intel.com
parents d6a209dd 984318aa
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -246,7 +246,14 @@ static enum phy icl_aux_pw_to_phy(struct drm_i915_private *i915,
	enum aux_ch aux_ch = icl_aux_pw_to_ch(power_well);
	struct intel_digital_port *dig_port = aux_ch_to_digital_port(i915, aux_ch);

	return intel_port_to_phy(i915, dig_port->base.port);
	/*
	 * FIXME should we care about the (VBT defined) dig_port->aux_ch
	 * relationship or should this be purely defined by the hardware layout?
	 * Currently if the port doesn't appear in the VBT, or if it's declared
	 * as HDMI-only and routed to a combo PHY, the encoder either won't be
	 * present at all or it will not have an aux_ch assigned.
	 */
	return dig_port ? intel_port_to_phy(i915, dig_port->base.port) : PHY_NONE;
}

static void hsw_wait_for_power_well_enable(struct drm_i915_private *dev_priv,
@@ -414,7 +421,8 @@ icl_combo_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,

	intel_de_rmw(dev_priv, regs->driver, 0, HSW_PWR_WELL_CTL_REQ(pw_idx));

	if (DISPLAY_VER(dev_priv) < 12)
	/* FIXME this is a mess */
	if (phy != PHY_NONE)
		intel_de_rmw(dev_priv, ICL_PORT_CL_DW12(phy),
			     0, ICL_LANE_ENABLE_AUX);

@@ -437,7 +445,10 @@ icl_combo_phy_aux_power_well_disable(struct drm_i915_private *dev_priv,

	drm_WARN_ON(&dev_priv->drm, !IS_ICELAKE(dev_priv));

	intel_de_rmw(dev_priv, ICL_PORT_CL_DW12(phy), ICL_LANE_ENABLE_AUX, 0);
	/* FIXME this is a mess */
	if (phy != PHY_NONE)
		intel_de_rmw(dev_priv, ICL_PORT_CL_DW12(phy),
			     ICL_LANE_ENABLE_AUX, 0);

	intel_de_rmw(dev_priv, regs->driver, HSW_PWR_WELL_CTL_REQ(pw_idx), 0);

+7 −0
Original line number Diff line number Diff line
@@ -609,6 +609,13 @@ struct intel_connector {
	 * and active (i.e. dpms ON state). */
	bool (*get_hw_state)(struct intel_connector *);

	/*
	 * Optional hook called during init/resume to sync any state
	 * stored in the connector (eg. DSC state) wrt. the HW state.
	 */
	void (*sync_state)(struct intel_connector *connector,
			   const struct intel_crtc_state *crtc_state);

	/* Panel info for eDP and LVDS */
	struct intel_panel panel;

+16 −0
Original line number Diff line number Diff line
@@ -5699,6 +5699,9 @@ intel_dp_detect(struct drm_connector *connector,
		goto out;
	}

	if (!intel_dp_is_edp(intel_dp))
		intel_psr_init_dpcd(intel_dp);

	intel_dp_detect_dsc_caps(intel_dp, intel_connector);

	intel_dp_configure_mst(intel_dp);
@@ -5859,6 +5862,19 @@ intel_dp_connector_unregister(struct drm_connector *connector)
	intel_connector_unregister(connector);
}

void intel_dp_connector_sync_state(struct intel_connector *connector,
				   const struct intel_crtc_state *crtc_state)
{
	struct drm_i915_private *i915 = to_i915(connector->base.dev);

	if (crtc_state && crtc_state->dsc.compression_enable) {
		drm_WARN_ON(&i915->drm, !connector->dp.dsc_decompression_aux);
		connector->dp.dsc_decompression_enabled = true;
	} else {
		connector->dp.dsc_decompression_enabled = false;
	}
}

void intel_dp_encoder_flush_work(struct drm_encoder *encoder)
{
	struct intel_digital_port *dig_port = enc_to_dig_port(to_intel_encoder(encoder));
+2 −0
Original line number Diff line number Diff line
@@ -45,6 +45,8 @@ bool intel_dp_limited_color_range(const struct intel_crtc_state *crtc_state,
int intel_dp_min_bpp(enum intel_output_format output_format);
bool intel_dp_init_connector(struct intel_digital_port *dig_port,
			     struct intel_connector *intel_connector);
void intel_dp_connector_sync_state(struct intel_connector *connector,
				   const struct intel_crtc_state *crtc_state);
void intel_dp_set_link_params(struct intel_dp *intel_dp,
			      int link_rate, int lane_count);
int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
+1 −0
Original line number Diff line number Diff line
@@ -1534,6 +1534,7 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo
		return NULL;

	intel_connector->get_hw_state = intel_dp_mst_get_hw_state;
	intel_connector->sync_state = intel_dp_connector_sync_state;
	intel_connector->mst_port = intel_dp;
	intel_connector->port = port;
	drm_dp_mst_get_port_malloc(port);
Loading