[PATCH] drm/probe-helper: honour connector->force in drm_helper_probe_detect()
From: Paul Menzel
Date: Tue May 26 2026 - 11:52:35 EST
With `video=DP-2:d drm.debug=0x04` the connectors are correctly forced
off at init time:
[9.742468] [drm] forcing DP-2 connector off
but `intel_dp_detect()` is still called immediately after:
[9.908738] [drm:intel_dp_detect] [CONNECTOR:130:DP-2]
[9.912982] [drm:intel_hotplug_detect_connector] [CONNECTOR:130:DP-2] status updated from unknown to unknown (epoch counter 0->1)
`drm_helper_probe_single_connector_modes()` already short-circuits when
`connector->force` is set, returning the forced status without calling
any detect callbacks. `drm_helper_probe_detect()` however has no such
guard, so callers that go through it directly – such as i915's
`intel_hotplug_detect_connector()` – still run the full hardware probe
(AUX DPCD read, GMBus DDC transaction, …) even when the user has
forced a connector off via the `video=` command-line parameter.
Add the same connector->force check at the top of
`drm_helper_probe_detect()`, so that the hardware probe is skipped
regardless of the entry point. This makes `video=<connector>:d`
effective at boot time, not just for userspace `GETCONNECTOR` ioctls.
This is tested on a Dell XPS 13 9360 (Intel Kaby Lake-U GT2 [HD Graphics
620] [8086:5916]). With `video=DP-2:d drm.debug=0x04`, Linux logs:
[ 11.701243] [drm] forcing DP-2 connector off
[ 11.701245] [drm:drm_connector_init_only [drm]] cmdline mode for connector DP-2 0x0@60Hz
[…]
[ 12.102009] i915 0000:00:02.0: [drm:drm_helper_probe_detect [drm_kms_helper]] [CONNECTOR:130:DP-2] force=1, skipping detect
Assisted-by: Claude Sonnet 4.6
Signed-off-by: Paul Menzel <pmenzel@xxxxxxxxxxxxx>
---
drivers/gpu/drm/drm_probe_helper.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
index d4dc8cb45bce..bc513f24bc28 100644
--- a/drivers/gpu/drm/drm_probe_helper.c
+++ b/drivers/gpu/drm/drm_probe_helper.c
@@ -401,6 +401,17 @@ drm_helper_probe_detect(struct drm_connector *connector,
struct drm_device *dev = connector->dev;
int ret;
+ if (connector->force) {
+ drm_dbg_kms(dev, "[CONNECTOR:%d:%s] force=%d, skipping detect\n",
+ connector->base.id, connector->name,
+ connector->force);
+ if (connector->force == DRM_FORCE_ON ||
+ connector->force == DRM_FORCE_ON_DIGITAL)
+ return connector_status_connected;
+ else
+ return connector_status_disconnected;
+ }
+
if (!ctx)
return drm_helper_probe_detect_ctx(connector, force);
--
2.53.0