[Intel-gfx] [PATCH] drm/i915: edp resume/On time optimization.

Kumar, Shobhit shobhit.kumar at linux.intel.com
Wed Dec 16 02:41:16 PST 2015


On 12/16/2015 03:46 AM, abhay.kumar at intel.com wrote:
> From: Abhay Kumar <abhay.kumar at intel.com>
>
> Make resume codepath not to wait for panel_power_cycle_delay(t11_t12)
> if this time is already spent in suspend/poweron time.
>
> Signed-off-by: Abhay Kumar <abhay.kumar at intel.com>
> ---
>   drivers/gpu/drm/i915/intel_ddi.c |  3 +++
>   drivers/gpu/drm/i915/intel_dp.c  | 18 ++++++++++++++++++
>   drivers/gpu/drm/i915/intel_drv.h |  2 ++
>   3 files changed, 23 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
> index f00a3c9..d2a5a89 100644
> --- a/drivers/gpu/drm/i915/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/intel_ddi.c
> @@ -2395,6 +2395,9 @@ static void intel_ddi_post_disable(struct intel_encoder *intel_encoder)
>   		intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
>   		intel_edp_panel_vdd_on(intel_dp);
>   		intel_edp_panel_off(intel_dp);
> +
> +		/* storing panel power off time */
> +		do_gettimeofday(&intel_dp->panel_power_off_timestamp);

Store this in edp_panel_off where "last_power_cycle" is initialized. 
This would be generic optimization and not specific only to ddi.

>   	}
>
>   	if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 0f1eb96..1ca01b1 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -2032,6 +2032,9 @@ static void edp_panel_on(struct intel_dp *intel_dp)
>   	struct drm_i915_private *dev_priv = dev->dev_private;
>   	u32 pp;
>   	i915_reg_t pp_ctrl_reg;
> +	u32 panel_power_off_duration;
> +	u32 temp_power_cycle_delay;
> +
>
>   	lockdep_assert_held(&dev_priv->pps_mutex);
>
> @@ -2045,8 +2048,22 @@ static void edp_panel_on(struct intel_dp *intel_dp)
>   		 "eDP port %c panel power already on\n",
>   		 port_name(dp_to_dig_port(intel_dp)->port)))
>   		return;
> +	/* taking the diffrence of currrent time and panel power off time
> +	   and then make panel to wait for T12 if needed */
> +	do_gettimeofday(&intel_dp->panel_power_on_timestamp);
> +
> +	panel_power_off_duration  = (intel_dp->panel_power_on_timestamp.tv_sec-intel_dp->panel_power_off_timestamp.tv_sec) * 1000000 +  intel_dp->panel_power_on_timestamp.tv_usec-intel_dp->panel_power_off_timestamp.tv_usec;
> +	panel_power_off_duration = panel_power_off_duration / 1000 ;
> +	temp_power_cycle_delay = intel_dp->panel_power_cycle_delay;
> +
> +	if(panel_power_off_duration >= intel_dp->panel_power_cycle_delay) {
> +		intel_dp->panel_power_cycle_delay = 0;
> +	} else {
> +		intel_dp->panel_power_cycle_delay = intel_dp->panel_power_cycle_delay - panel_power_off_duration;
> +	}
>

Moving all adjustment inside wait_panel_power_cycle looks better to me. 
Also checkout timeval_to_jiffies to simplify the code.

>   	wait_panel_power_cycle(intel_dp);
> +	intel_dp->panel_power_cycle_delay = temp_power_cycle_delay;
>
>   	pp_ctrl_reg = _pp_ctrl_reg(intel_dp);
>   	pp = ironlake_get_pp_control(intel_dp);
> @@ -5127,6 +5144,7 @@ static void intel_dp_init_panel_power_timestamps(struct intel_dp *intel_dp)
>   	intel_dp->last_power_cycle = jiffies;
>   	intel_dp->last_power_on = jiffies;
>   	intel_dp->last_backlight_off = jiffies;
> +	do_gettimeofday(&intel_dp->panel_power_off_timestamp);
>   }
>
>   static void
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 76dfa28..66ed2cb 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -769,6 +769,8 @@ struct intel_dp {
>   	unsigned long last_power_cycle;
>   	unsigned long last_power_on;
>   	unsigned long last_backlight_off;
> +	struct timeval panel_power_off_timestamp;
> +	struct timeval panel_power_on_timestamp;

panel_power_on_timestamp is not needed to be stored in the structure. 
What we need is current time which can be locally obtained and consumed 
in wait_panel_power_cycle

Regards
Shobhit
>
>   	struct notifier_block edp_notifier;
>
>


More information about the Intel-gfx mailing list