[Intel-gfx] [PATCH] drm/i915/edp: wait power off delay at driver remove to optimize probe

Jani Nikula jani.nikula at intel.com
Thu Nov 17 11:35:45 UTC 2022


On Wed, 16 Nov 2022, Ville Syrjälä <ville.syrjala at linux.intel.com> wrote:
> On Wed, Nov 16, 2022 at 05:06:57PM +0200, Jani Nikula wrote:
>> 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 encode is destroyed.
>
> Yeah, the fact that we have the vdd_off_sync() in there at least
> theoretically means the vdd might be on at any point before that.
>
> I was also pondering about doing this for all encoder types.
> Though the benefits are slightly less pronounced I guess:
> a) we don't need to power the panel for the output probe on those,
>    so a bit more time will have elapsed anyway before we have to
>    power the panel on during the first modeset
> b) for LVDS we rely 100% on the pps state machine so the initial
>    boot case is already as optimal as possible. Adding the explicit
>    wait into the unload path could thus only help the speed of
>    of the first modeset during module reload
>
> But maybe we'd stil want to do that, for consistency if nothing else?
>
> Either way, this patch is
> Reviewed-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

Thanks for the review and testing, pushed to drm-intel-next.

BR,
Jani.

>
>> 
>> Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/7417
>> Cc: Lee Shawn C <shawn.c.lee at intel.com>
>> Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
>> Signed-off-by: Jani Nikula <jani.nikula at intel.com>
>> ---
>>  drivers/gpu/drm/i915/display/intel_dp.c  | 6 ++++++
>>  drivers/gpu/drm/i915/display/intel_pps.c | 8 +++++++-
>>  2 files changed, 13 insertions(+), 1 deletion(-)
>> 
>> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
>> index 914161d7d122..67089711d9e2 100644
>> --- a/drivers/gpu/drm/i915/display/intel_dp.c
>> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
>> @@ -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);
>>  }
>>  
>> diff --git a/drivers/gpu/drm/i915/display/intel_pps.c b/drivers/gpu/drm/i915/display/intel_pps.c
>> index 81ee7f3aadf6..9bbf41a076f7 100644
>> --- a/drivers/gpu/drm/i915/display/intel_pps.c
>> +++ b/drivers/gpu/drm/i915/display/intel_pps.c
>> @@ -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;
>>  }
>> -- 
>> 2.34.1

-- 
Jani Nikula, Intel Open Source Graphics Center


More information about the Intel-gfx mailing list