]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
drm/i915/edp: wait power off delay at driver remove to optimize probe
authorJani Nikula <jani.nikula@intel.com>
Wed, 16 Nov 2022 15:06:57 +0000 (17:06 +0200)
committerJani Nikula <jani.nikula@intel.com>
Thu, 17 Nov 2022 11:29:01 +0000 (13:29 +0200)
Panel power off delay is the time the panel power needs to remain off
after being switched off, before it can be switched on again.

For the purpose of respecting panel power off delay at driver probe,
assuming the panel was last switched off at driver probe is overly
pessimistic. If the panel was never on, we'd end up waiting for no
reason.

We don't know what has happened before kernel boot, but we can make some
assumptions:

- The panel may have been switched off right before kernel boot by some
  pre-os environment.

- After kernel boot, the panel may only be switched off by i915.

- At i915 driver probe, only a previously loaded and removed i915 may
  have switched the panel power off.

With these assumptions, we can initialize the last power off time to
kernel boot time, if we also ensure i915 driver remove waits for the
panel power off delay after switching panel power off.

This shaves off the time it takes from kernel boot to i915 probe from
the first panel enable, if (and only if) the panel was not already
enabled at boot.

The encoder destroy hook is pretty much the last place where we can
wait, right after we've ensured the panel power has been switched off,
and before the whole encoder is destroyed.

Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/7417
Cc: Lee Shawn C <shawn.c.lee@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Tested-by: Lee Shawn C <shawn.c.lee@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221116150657.1347504-1-jani.nikula@intel.com
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/intel_pps.c

index 914161d7d122f6275481386263043633908960dd..67089711d9e25d265ccf0e6d6bf663e7a2a64bae 100644 (file)
@@ -4877,6 +4877,12 @@ void intel_dp_encoder_flush_work(struct drm_encoder *encoder)
 
        intel_pps_vdd_off_sync(intel_dp);
 
+       /*
+        * Ensure power off delay is respected on module remove, so that we can
+        * reduce delays at driver probe. See pps_init_timestamps().
+        */
+       intel_pps_wait_power_cycle(intel_dp);
+
        intel_dp_aux_fini(intel_dp);
 }
 
index 81ee7f3aadf6424eb9133415cc3c88d48b3da711..9bbf41a076f7287ec98b2a057bd6ebe41849ea12 100644 (file)
@@ -1100,7 +1100,13 @@ bool intel_pps_have_panel_power_or_vdd(struct intel_dp *intel_dp)
 
 static void pps_init_timestamps(struct intel_dp *intel_dp)
 {
-       intel_dp->pps.panel_power_off_time = ktime_get_boottime();
+       /*
+        * Initialize panel power off time to 0, assuming panel power could have
+        * been toggled between kernel boot and now only by a previously loaded
+        * and removed i915, which has already ensured sufficient power off
+        * delay at module remove.
+        */
+       intel_dp->pps.panel_power_off_time = 0;
        intel_dp->pps.last_power_on = jiffies;
        intel_dp->pps.last_backlight_off = jiffies;
 }