diff mbox series

[v3,3/6] drm/i915/psr: Calculate aux less wake time

Message ID 20240306104513.2129442-4-jouni.hogander@intel.com (mailing list archive)
State New, archived
Headers show
Series ALPM AUX-Less | expand

Commit Message

Hogander, Jouni March 6, 2024, 10:45 a.m. UTC
Calculate aux less wake time and store it into alpm_params struct

Bspec: 71477

v3:
  - use ALPM_CTL_AUX_LESS_WAKE_TIME_MASK instead of value 63
v2:
  - use variables instead of values directly
  - fix max value
  - move converting port clock to Mhz into _lnl_compute_aux_less_wake_time

Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
---
 .../drm/i915/display/intel_display_types.h    |  1 +
 drivers/gpu/drm/i915/display/intel_psr.c      | 60 +++++++++++++++++++
 2 files changed, 61 insertions(+)

Comments

Animesh Manna March 13, 2024, 11:14 a.m. UTC | #1
> -----Original Message-----
> From: Hogander, Jouni <jouni.hogander@intel.com>
> Sent: Wednesday, March 6, 2024 4:15 PM
> To: intel-gfx@lists.freedesktop.org
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>; Manna, Animesh
> <animesh.manna@intel.com>; Murthy, Arun R <arun.r.murthy@intel.com>;
> Hogander, Jouni <jouni.hogander@intel.com>
> Subject: [PATCH v3 3/6] drm/i915/psr: Calculate aux less wake time
> 
> Calculate aux less wake time and store it into alpm_params struct
> 
> Bspec: 71477
> 
> v3:
>   - use ALPM_CTL_AUX_LESS_WAKE_TIME_MASK instead of value 63
> v2:
>   - use variables instead of values directly
>   - fix max value
>   - move converting port clock to Mhz into
> _lnl_compute_aux_less_wake_time
> 
> Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
> ---
>  .../drm/i915/display/intel_display_types.h    |  1 +
>  drivers/gpu/drm/i915/display/intel_psr.c      | 60 +++++++++++++++++++
>  2 files changed, 61 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> b/drivers/gpu/drm/i915/display/intel_display_types.h
> index e67cd5b02e84..928317acc1bd 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1737,6 +1737,7 @@ struct intel_psr {
> 
>  		/* LNL and beyond */
>  		u8 check_entry_lines;
> +		u8 aux_less_wake_lines;

As aux-wake or aux-less is mutually exclusive can we use existing wake-line variable for aux-less as well.

Regards,
Animesh

>  	} alpm_parameters;
> 
>  	ktime_t last_entry_attempt;
> diff --git a/drivers/gpu/drm/i915/display/intel_psr.c
> b/drivers/gpu/drm/i915/display/intel_psr.c
> index 6927785fd6ff..c545ee229684 100644
> --- a/drivers/gpu/drm/i915/display/intel_psr.c
> +++ b/drivers/gpu/drm/i915/display/intel_psr.c
> @@ -1126,6 +1126,63 @@ static bool
> _compute_psr2_sdp_prior_scanline_indication(struct intel_dp *intel_d
>  	return true;
>  }
> 
> +/*
> + * AUX-Less Wake Time = CEILING( ((PHY P2 to P0) + tLFPS_Period, Max+
> + * tSilence, Max+ tPHY Establishment + tCDS) / tline)
> + * For the "PHY P2 to P0" latency see the PHY Power Control page
> + * (PHY P2 to P0) :
> +https://gfxspecs.intel.com/Predator/Home/Index/68965
> + * : 12 us
> + * The tLFPS_Period, Max term is 800ns
> + * The tSilence, Max term is 180ns
> + * The tPHY Establishment (a.k.a. t1) term is 50us
> + * The tCDS term is 1 or 2 times t2
> + * t2 = Number ML_PHY_LOCK * tML_PHY_LOCK
> + * Number ML_PHY_LOCK = ( 7 + CEILING( 6.5us / tML_PHY_LOCK ) + 1)
> + * Rounding up the 6.5us padding to the next ML_PHY_LOCK boundary and
> + * adding the "+ 1" term ensures all ML_PHY_LOCK sequences that start
> + * within the CDS period complete within the CDS period regardless of
> + * entry into the period
> + * tML_PHY_LOCK = TPS4 Length * ( 10 / (Link Rate in MHz) )
> + * TPS4 Length = 252 Symbols
> + */
> +static int _lnl_compute_aux_less_wake_time(int port_clock) {
> +	int tphy2_p2_to_p0 = 12 * 1000;
> +	int tlfps_period_max = 800;
> +	int tsilence_max = 180;
> +	int t1 = 50 * 1000;
> +	int tps4 = 252;
> +	int tml_phy_lock = 1000 * 1000 * tps4 * 10 / port_clock;
> +	int num_ml_phy_lock = 7 + DIV_ROUND_UP(6500, tml_phy_lock) + 1;
> +	int t2 = num_ml_phy_lock * tml_phy_lock;
> +	int tcds = 1 * t2;
> +
> +	return DIV_ROUND_UP(tphy2_p2_to_p0 + tlfps_period_max +
> tsilence_max +
> +			    t1 + tcds, 1000);
> +}
> +
> +static int _lnl_compute_aux_less_alpm_params(struct intel_dp *intel_dp,
> +					     struct intel_crtc_state *crtc_state)
> {
> +	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
> +	int aux_less_wake_time, aux_less_wake_lines;
> +
> +	aux_less_wake_time =
> +		_lnl_compute_aux_less_wake_time(crtc_state->port_clock);
> +	aux_less_wake_lines = intel_usecs_to_scanlines(&crtc_state-
> >hw.adjusted_mode,
> +						       aux_less_wake_time);
> +
> +	if (aux_less_wake_lines > ALPM_CTL_AUX_LESS_WAKE_TIME_MASK)
> +		return false;
> +
> +	if (i915->display.params.psr_safest_params)
> +		aux_less_wake_lines = 63;
> +
> +	intel_dp->psr.alpm_parameters.aux_less_wake_lines =
> +aux_less_wake_lines;
> +
> +	return true;
> +}
> +
>  static bool _lnl_compute_alpm_params(struct intel_dp *intel_dp,
>  				     struct intel_crtc_state *crtc_state)  { @@ -
> 1142,6 +1199,9 @@ static bool _lnl_compute_alpm_params(struct intel_dp
> *intel_dp,
>  	if (check_entry_lines > 15)
>  		return false;
> 
> +	if (!_lnl_compute_aux_less_alpm_params(intel_dp, crtc_state))
> +		return false;
> +
>  	if (i915->display.params.psr_safest_params)
>  		check_entry_lines = 15;
> 
> --
> 2.34.1
Hogander, Jouni March 13, 2024, 12:11 p.m. UTC | #2
On Wed, 2024-03-13 at 11:14 +0000, Manna, Animesh wrote:
> 
> 
> > -----Original Message-----
> > From: Hogander, Jouni <jouni.hogander@intel.com>
> > Sent: Wednesday, March 6, 2024 4:15 PM
> > To: intel-gfx@lists.freedesktop.org
> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>; Manna, Animesh
> > <animesh.manna@intel.com>; Murthy, Arun R
> > <arun.r.murthy@intel.com>;
> > Hogander, Jouni <jouni.hogander@intel.com>
> > Subject: [PATCH v3 3/6] drm/i915/psr: Calculate aux less wake time
> > 
> > Calculate aux less wake time and store it into alpm_params struct
> > 
> > Bspec: 71477
> > 
> > v3:
> >   - use ALPM_CTL_AUX_LESS_WAKE_TIME_MASK instead of value 63
> > v2:
> >   - use variables instead of values directly
> >   - fix max value
> >   - move converting port clock to Mhz into
> > _lnl_compute_aux_less_wake_time
> > 
> > Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
> > ---
> >  .../drm/i915/display/intel_display_types.h    |  1 +
> >  drivers/gpu/drm/i915/display/intel_psr.c      | 60
> > +++++++++++++++++++
> >  2 files changed, 61 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> > b/drivers/gpu/drm/i915/display/intel_display_types.h
> > index e67cd5b02e84..928317acc1bd 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> > @@ -1737,6 +1737,7 @@ struct intel_psr {
> > 
> >                 /* LNL and beyond */
> >                 u8 check_entry_lines;
> > +               u8 aux_less_wake_lines;
> 
> As aux-wake or aux-less is mutually exclusive can we use existing
> wake-line variable for aux-less as well.

I do not have any objections here. I can do this change.

BR,

Jouni Högander

> 
> Regards,
> Animesh
> 
> >         } alpm_parameters;
> > 
> >         ktime_t last_entry_attempt;
> > diff --git a/drivers/gpu/drm/i915/display/intel_psr.c
> > b/drivers/gpu/drm/i915/display/intel_psr.c
> > index 6927785fd6ff..c545ee229684 100644
> > --- a/drivers/gpu/drm/i915/display/intel_psr.c
> > +++ b/drivers/gpu/drm/i915/display/intel_psr.c
> > @@ -1126,6 +1126,63 @@ static bool
> > _compute_psr2_sdp_prior_scanline_indication(struct intel_dp
> > *intel_d
> >         return true;
> >  }
> > 
> > +/*
> > + * AUX-Less Wake Time = CEILING( ((PHY P2 to P0) + tLFPS_Period,
> > Max+
> > + * tSilence, Max+ tPHY Establishment + tCDS) / tline)
> > + * For the "PHY P2 to P0" latency see the PHY Power Control page
> > + * (PHY P2 to P0) :
> > +https://gfxspecs.intel.com/Predator/Home/Index/68965
> > + * : 12 us
> > + * The tLFPS_Period, Max term is 800ns
> > + * The tSilence, Max term is 180ns
> > + * The tPHY Establishment (a.k.a. t1) term is 50us
> > + * The tCDS term is 1 or 2 times t2
> > + * t2 = Number ML_PHY_LOCK * tML_PHY_LOCK
> > + * Number ML_PHY_LOCK = ( 7 + CEILING( 6.5us / tML_PHY_LOCK ) + 1)
> > + * Rounding up the 6.5us padding to the next ML_PHY_LOCK boundary
> > and
> > + * adding the "+ 1" term ensures all ML_PHY_LOCK sequences that
> > start
> > + * within the CDS period complete within the CDS period regardless
> > of
> > + * entry into the period
> > + * tML_PHY_LOCK = TPS4 Length * ( 10 / (Link Rate in MHz) )
> > + * TPS4 Length = 252 Symbols
> > + */
> > +static int _lnl_compute_aux_less_wake_time(int port_clock) {
> > +       int tphy2_p2_to_p0 = 12 * 1000;
> > +       int tlfps_period_max = 800;
> > +       int tsilence_max = 180;
> > +       int t1 = 50 * 1000;
> > +       int tps4 = 252;
> > +       int tml_phy_lock = 1000 * 1000 * tps4 * 10 / port_clock;
> > +       int num_ml_phy_lock = 7 + DIV_ROUND_UP(6500, tml_phy_lock)
> > + 1;
> > +       int t2 = num_ml_phy_lock * tml_phy_lock;
> > +       int tcds = 1 * t2;
> > +
> > +       return DIV_ROUND_UP(tphy2_p2_to_p0 + tlfps_period_max +
> > tsilence_max +
> > +                           t1 + tcds, 1000);
> > +}
> > +
> > +static int _lnl_compute_aux_less_alpm_params(struct intel_dp
> > *intel_dp,
> > +                                            struct
> > intel_crtc_state *crtc_state)
> > {
> > +       struct drm_i915_private *i915 = dp_to_i915(intel_dp);
> > +       int aux_less_wake_time, aux_less_wake_lines;
> > +
> > +       aux_less_wake_time =
> > +               _lnl_compute_aux_less_wake_time(crtc_state-
> > >port_clock);
> > +       aux_less_wake_lines = intel_usecs_to_scanlines(&crtc_state-
> > > hw.adjusted_mode,
> > +                                                     
> > aux_less_wake_time);
> > +
> > +       if (aux_less_wake_lines > ALPM_CTL_AUX_LESS_WAKE_TIME_MASK)
> > +               return false;
> > +
> > +       if (i915->display.params.psr_safest_params)
> > +               aux_less_wake_lines = 63;
> > +
> > +       intel_dp->psr.alpm_parameters.aux_less_wake_lines =
> > +aux_less_wake_lines;
> > +
> > +       return true;
> > +}
> > +
> >  static bool _lnl_compute_alpm_params(struct intel_dp *intel_dp,
> >                                      struct intel_crtc_state
> > *crtc_state)  { @@ -
> > 1142,6 +1199,9 @@ static bool _lnl_compute_alpm_params(struct
> > intel_dp
> > *intel_dp,
> >         if (check_entry_lines > 15)
> >                 return false;
> > 
> > +       if (!_lnl_compute_aux_less_alpm_params(intel_dp,
> > crtc_state))
> > +               return false;
> > +
> >         if (i915->display.params.psr_safest_params)
> >                 check_entry_lines = 15;
> > 
> > --
> > 2.34.1
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index e67cd5b02e84..928317acc1bd 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1737,6 +1737,7 @@  struct intel_psr {
 
 		/* LNL and beyond */
 		u8 check_entry_lines;
+		u8 aux_less_wake_lines;
 	} alpm_parameters;
 
 	ktime_t last_entry_attempt;
diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c
index 6927785fd6ff..c545ee229684 100644
--- a/drivers/gpu/drm/i915/display/intel_psr.c
+++ b/drivers/gpu/drm/i915/display/intel_psr.c
@@ -1126,6 +1126,63 @@  static bool _compute_psr2_sdp_prior_scanline_indication(struct intel_dp *intel_d
 	return true;
 }
 
+/*
+ * AUX-Less Wake Time = CEILING( ((PHY P2 to P0) + tLFPS_Period, Max+
+ * tSilence, Max+ tPHY Establishment + tCDS) / tline)
+ * For the "PHY P2 to P0" latency see the PHY Power Control page
+ * (PHY P2 to P0) : https://gfxspecs.intel.com/Predator/Home/Index/68965
+ * : 12 us
+ * The tLFPS_Period, Max term is 800ns
+ * The tSilence, Max term is 180ns
+ * The tPHY Establishment (a.k.a. t1) term is 50us
+ * The tCDS term is 1 or 2 times t2
+ * t2 = Number ML_PHY_LOCK * tML_PHY_LOCK
+ * Number ML_PHY_LOCK = ( 7 + CEILING( 6.5us / tML_PHY_LOCK ) + 1)
+ * Rounding up the 6.5us padding to the next ML_PHY_LOCK boundary and
+ * adding the "+ 1" term ensures all ML_PHY_LOCK sequences that start
+ * within the CDS period complete within the CDS period regardless of
+ * entry into the period
+ * tML_PHY_LOCK = TPS4 Length * ( 10 / (Link Rate in MHz) )
+ * TPS4 Length = 252 Symbols
+ */
+static int _lnl_compute_aux_less_wake_time(int port_clock)
+{
+	int tphy2_p2_to_p0 = 12 * 1000;
+	int tlfps_period_max = 800;
+	int tsilence_max = 180;
+	int t1 = 50 * 1000;
+	int tps4 = 252;
+	int tml_phy_lock = 1000 * 1000 * tps4 * 10 / port_clock;
+	int num_ml_phy_lock = 7 + DIV_ROUND_UP(6500, tml_phy_lock) + 1;
+	int t2 = num_ml_phy_lock * tml_phy_lock;
+	int tcds = 1 * t2;
+
+	return DIV_ROUND_UP(tphy2_p2_to_p0 + tlfps_period_max + tsilence_max +
+			    t1 + tcds, 1000);
+}
+
+static int _lnl_compute_aux_less_alpm_params(struct intel_dp *intel_dp,
+					     struct intel_crtc_state *crtc_state)
+{
+	struct drm_i915_private *i915 = dp_to_i915(intel_dp);
+	int aux_less_wake_time, aux_less_wake_lines;
+
+	aux_less_wake_time =
+		_lnl_compute_aux_less_wake_time(crtc_state->port_clock);
+	aux_less_wake_lines = intel_usecs_to_scanlines(&crtc_state->hw.adjusted_mode,
+						       aux_less_wake_time);
+
+	if (aux_less_wake_lines > ALPM_CTL_AUX_LESS_WAKE_TIME_MASK)
+		return false;
+
+	if (i915->display.params.psr_safest_params)
+		aux_less_wake_lines = 63;
+
+	intel_dp->psr.alpm_parameters.aux_less_wake_lines = aux_less_wake_lines;
+
+	return true;
+}
+
 static bool _lnl_compute_alpm_params(struct intel_dp *intel_dp,
 				     struct intel_crtc_state *crtc_state)
 {
@@ -1142,6 +1199,9 @@  static bool _lnl_compute_alpm_params(struct intel_dp *intel_dp,
 	if (check_entry_lines > 15)
 		return false;
 
+	if (!_lnl_compute_aux_less_alpm_params(intel_dp, crtc_state))
+		return false;
+
 	if (i915->display.params.psr_safest_params)
 		check_entry_lines = 15;