On Tue, 26 May 2026, Paul Menzel <[email protected]> wrote: > 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.
Note that drm_helper_probe_single_connector_modes() still calls the ->force hook, which is crucial. Returning early for force off may be fine, but force on will still need to try to read the EDID. And the EDID reads return early for force off. Side note, please drop the excessive backticks and the ellipsis from commit messages. BR, Jani. > > 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 <[email protected]> > --- > 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); -- Jani Nikula, Intel
