]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/i915: Disable intel HPD poll after DRM poll init/enable
authorImre Deak <imre.deak@intel.com>
Thu, 4 Jan 2024 08:30:00 +0000 (10:30 +0200)
committerImre Deak <imre.deak@intel.com>
Mon, 8 Jan 2024 16:51:31 +0000 (18:51 +0200)
The only purpose of intel_hpd_poll_disable() during driver loading and
system resume - at which point polling should be disabled anyway, except
for connectors in an IRQ storm, for which the polling will stay enabled -
is to force-detect all the connectors. However this detection in
i915_hpd_poll_init_work() depends on drm.mode_config.poll_enabled, which
will get set in drm_kms_helper_poll_init(), possibly after
i915_hpd_poll_init_work() is scheduled. Hence the initial detection of
connectors during driver loading may not happen.

Fix the above by moving intel_hpd_poll_disable() after
i915_hpd_poll_init_work(), the proper place anyway for doing the above
detection after all the HW initialization steps are complete. Change the
order the same way during system resume as well. The above race
condition shouldn't matter here - as drm.mode_config.poll_enabled will
be set - but the detection should happen here as well after the HW init
steps are done.

Link: https://patchwork.freedesktop.org/patch/msgid/20240104083008.2715733-5-imre.deak@intel.com
Reviewed-by: Jouni Högander <jouni.hogander@intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
drivers/gpu/drm/i915/display/intel_display_driver.c
drivers/gpu/drm/i915/i915_driver.c

index da549962feccd0d4863b0a86edc307206b00b965..1974f2394a5182141c202fc4c1287fd0be3735a1 100644 (file)
@@ -374,7 +374,6 @@ int intel_display_driver_probe(struct drm_i915_private *i915)
 
        /* Only enable hotplug handling once the fbdev is fully set up. */
        intel_hpd_init(i915);
-       intel_hpd_poll_disable(i915);
 
        skl_watermark_ipc_init(i915);
 
@@ -412,6 +411,7 @@ void intel_display_driver_register(struct drm_i915_private *i915)
         * fbdev->async_cookie.
         */
        drm_kms_helper_poll_init(&i915->drm);
+       intel_hpd_poll_disable(i915);
 
        intel_display_device_info_print(DISPLAY_INFO(i915),
                                        DISPLAY_RUNTIME_INFO(i915), &p);
index 8dead878e51ab97deebfd2536cb83d41764fe080..55badc20a10f4843bb4d8171d9c04e78540549f8 100644 (file)
@@ -1248,9 +1248,9 @@ static int i915_drm_resume(struct drm_device *dev)
        intel_dp_mst_resume(dev_priv);
        intel_display_driver_resume(dev_priv);
 
-       intel_hpd_poll_disable(dev_priv);
        if (HAS_DISPLAY(dev_priv))
                drm_kms_helper_poll_enable(dev);
+       intel_hpd_poll_disable(dev_priv);
 
        intel_opregion_resume(dev_priv);