Commit 9941b5bc authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm-intel-fixes-2024-08-29' of...

Merge tag 'drm-intel-fixes-2024-08-29' of https://gitlab.freedesktop.org/drm/i915/kernel

 into drm-fixes

- Fix #11195: The external display connect via USB type-C dock stays blank after re-connect the dock
- Make DSI backlight work for 2G version of Lenovo Yoga Tab 3 X90F
. Move ARL GuC firmware to correct version
-

Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
From: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/ZtAd8WTw1xiSu_TS@jlahtine-mobl.ger.corp.intel.com
parents bd3755c1 a2ccc33b
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -5935,6 +5935,18 @@ intel_dp_detect(struct drm_connector *connector,
	else
		status = connector_status_disconnected;

	if (status != connector_status_disconnected &&
	    !intel_dp_mst_verify_dpcd_state(intel_dp))
		/*
		 * This requires retrying detection for instance to re-enable
		 * the MST mode that got reset via a long HPD pulse. The retry
		 * will happen either via the hotplug handler's retry logic,
		 * ensured by setting the connector here to SST/disconnected,
		 * or via a userspace connector probing in response to the
		 * hotplug uevent sent when removing the MST connectors.
		 */
		status = connector_status_disconnected;

	if (status == connector_status_disconnected) {
		memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
		memset(intel_connector->dp.dsc_dpcd, 0, sizeof(intel_connector->dp.dsc_dpcd));
+40 −0
Original line number Diff line number Diff line
@@ -1998,3 +1998,43 @@ bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,

	return false;
}

/*
 * intel_dp_mst_verify_dpcd_state - verify the MST SW enabled state wrt. the DPCD
 * @intel_dp: DP port object
 *
 * Verify if @intel_dp's MST enabled SW state matches the corresponding DPCD
 * state. A long HPD pulse - not long enough to be detected as a disconnected
 * state - could've reset the DPCD state, which requires tearing
 * down/recreating the MST topology.
 *
 * Returns %true if the SW MST enabled and DPCD states match, %false
 * otherwise.
 */
bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp)
{
	struct intel_display *display = to_intel_display(intel_dp);
	struct intel_connector *connector = intel_dp->attached_connector;
	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
	struct intel_encoder *encoder = &dig_port->base;
	int ret;
	u8 val;

	if (!intel_dp->is_mst)
		return true;

	ret = drm_dp_dpcd_readb(intel_dp->mst_mgr.aux, DP_MSTM_CTRL, &val);

	/* Adjust the expected register value for SST + SideBand. */
	if (ret < 0 || val != (DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC)) {
		drm_dbg_kms(display->drm,
			    "[CONNECTOR:%d:%s][ENCODER:%d:%s] MST mode got reset, removing topology (ret=%d, ctrl=0x%02x)\n",
			    connector->base.base.id, connector->base.name,
			    encoder->base.base.id, encoder->base.name,
			    ret, val);

		return false;
	}

	return true;
}
+1 −0
Original line number Diff line number Diff line
@@ -27,5 +27,6 @@ int intel_dp_mst_atomic_check_link(struct intel_atomic_state *state,
				   struct intel_link_bw_limits *limits);
bool intel_dp_mst_crtc_needs_modeset(struct intel_atomic_state *state,
				     struct intel_crtc *crtc);
bool intel_dp_mst_verify_dpcd_state(struct intel_dp *intel_dp);

#endif /* __INTEL_DP_MST_H__ */
+0 −1
Original line number Diff line number Diff line
@@ -1870,7 +1870,6 @@ static const struct dmi_system_id vlv_dsi_dmi_quirk_table[] = {
		/* Lenovo Yoga Tab 3 Pro YT3-X90F */
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"),
			DMI_MATCH(DMI_PRODUCT_NAME, "CHERRYVIEW D1 PLATFORM"),
			DMI_MATCH(DMI_PRODUCT_VERSION, "Blade3-10A-001"),
		},
		.driver_data = (void *)vlv_dsi_lenovo_yoga_tab3_backlight_fixup,
+31 −0
Original line number Diff line number Diff line
@@ -212,6 +212,37 @@ int intel_gsc_fw_get_binary_info(struct intel_uc_fw *gsc_fw, const void *data, s
		}
	}

	if (IS_ARROWLAKE(gt->i915)) {
		bool too_old = false;

		/*
		 * ARL requires a newer firmware than MTL did (102.0.10.1878) but the
		 * firmware is actually common. So, need to do an explicit version check
		 * here rather than using a separate table entry. And if the older
		 * MTL-only version is found, then just don't use GSC rather than aborting
		 * the driver load.
		 */
		if (gsc->release.major < 102) {
			too_old = true;
		} else if (gsc->release.major == 102) {
			if (gsc->release.minor == 0) {
				if (gsc->release.patch < 10) {
					too_old = true;
				} else if (gsc->release.patch == 10) {
					if (gsc->release.build < 1878)
						too_old = true;
				}
			}
		}

		if (too_old) {
			gt_info(gt, "GSC firmware too old for ARL, got %d.%d.%d.%d but need at least 102.0.10.1878",
				gsc->release.major, gsc->release.minor,
				gsc->release.patch, gsc->release.build);
			return -EINVAL;
		}
	}

	return 0;
}

Loading