mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 17:30:02 +00:00
drm/i915/edp: wait power off delay at driver remove to optimize probe
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
This commit is contained in:
parent
c27a2b527d
commit
36d3571698
2 changed files with 13 additions and 1 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue