diff mbox series

[v4,2/8] drm/i915/lobf: Disintegrate alpm_disable from psr_disable

Message ID 20250224080847.326350-3-animesh.manna@intel.com (mailing list archive)
State New
Headers show
Series LOBF enablement fix | expand

Commit Message

Manna, Animesh Feb. 24, 2025, 8:08 a.m. UTC
Currently clearing of alpm registers is done through psr_disable()
which is always not correct, without psr also alpm can exist. So
dis-integrate alpm_disable() from psr_disable().

Signed-off-by: Animesh Manna <animesh.manna@intel.com>
---
 drivers/gpu/drm/i915/display/intel_alpm.c     | 21 +++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_alpm.h     |  1 +
 drivers/gpu/drm/i915/display/intel_ddi.c      |  2 ++
 .../drm/i915/display/intel_display_types.h    |  1 +
 drivers/gpu/drm/i915/display/intel_psr.c      | 11 ----------
 5 files changed, 25 insertions(+), 11 deletions(-)

Comments

Jani Nikula Feb. 24, 2025, 10:45 a.m. UTC | #1
On Mon, 24 Feb 2025, Animesh Manna <animesh.manna@intel.com> wrote:
> Currently clearing of alpm registers is done through psr_disable()
> which is always not correct, without psr also alpm can exist. So
> dis-integrate alpm_disable() from psr_disable().
>
> Signed-off-by: Animesh Manna <animesh.manna@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_alpm.c     | 21 +++++++++++++++++++
>  drivers/gpu/drm/i915/display/intel_alpm.h     |  1 +
>  drivers/gpu/drm/i915/display/intel_ddi.c      |  2 ++
>  .../drm/i915/display/intel_display_types.h    |  1 +
>  drivers/gpu/drm/i915/display/intel_psr.c      | 11 ----------
>  5 files changed, 25 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_alpm.c b/drivers/gpu/drm/i915/display/intel_alpm.c
> index a53ed83f6b22..d94c96ba46b1 100644
> --- a/drivers/gpu/drm/i915/display/intel_alpm.c
> +++ b/drivers/gpu/drm/i915/display/intel_alpm.c
> @@ -365,6 +365,7 @@ void intel_alpm_configure(struct intel_dp *intel_dp,
>  			  const struct intel_crtc_state *crtc_state)
>  {
>  	lnl_alpm_configure(intel_dp, crtc_state);
> +	intel_dp->alpm_parameters.transcoder = crtc_state->cpu_transcoder;

Why do we need to store this?

>  }
>  
>  void intel_alpm_post_plane_update(struct intel_atomic_state *state,
> @@ -440,3 +441,23 @@ void intel_alpm_lobf_debugfs_add(struct intel_connector *connector)
>  	debugfs_create_file("i915_edp_lobf_info", 0444, root,
>  			    connector, &i915_edp_lobf_info_fops);
>  }
> +
> +void intel_alpm_disable(struct intel_dp *intel_dp)
> +{
> +	struct intel_display *display = to_intel_display(intel_dp);
> +	enum transcoder cpu_transcoder = intel_dp->alpm_parameters.transcoder;
> +
> +	if (DISPLAY_VER(display) < 20)
> +		return;
> +
> +	if (!(intel_de_read(display, ALPM_CTL(display, cpu_transcoder)) & ALPM_CTL_ALPM_ENABLE))
> +		return;

Why are we checking the hardware state here? We should know what state
the hardware is in, right?

> +
> +	intel_de_rmw(display, ALPM_CTL(display, cpu_transcoder),
> +		     ALPM_CTL_ALPM_ENABLE | ALPM_CTL_LOBF_ENABLE |
> +		     ALPM_CTL_ALPM_AUX_LESS_ENABLE, 0);
> +
> +	intel_de_rmw(display,
> +		     PORT_ALPM_CTL(cpu_transcoder),
> +		     PORT_ALPM_CTL_ALPM_AUX_LESS_ENABLE, 0);
> +}
> diff --git a/drivers/gpu/drm/i915/display/intel_alpm.h b/drivers/gpu/drm/i915/display/intel_alpm.h
> index 2f862b0476a8..91f51fb24f98 100644
> --- a/drivers/gpu/drm/i915/display/intel_alpm.h
> +++ b/drivers/gpu/drm/i915/display/intel_alpm.h
> @@ -28,4 +28,5 @@ void intel_alpm_post_plane_update(struct intel_atomic_state *state,
>  void intel_alpm_lobf_debugfs_add(struct intel_connector *connector);
>  bool intel_alpm_aux_wake_supported(struct intel_dp *intel_dp);
>  bool intel_alpm_aux_less_wake_supported(struct intel_dp *intel_dp);
> +void intel_alpm_disable(struct intel_dp *intel_dp);
>  #endif
> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> index 7937f4de66cb..26aa32d4d50e 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> @@ -35,6 +35,7 @@
>  #include "i915_drv.h"
>  #include "i915_reg.h"
>  #include "icl_dsi.h"
> +#include "intel_alpm.h"
>  #include "intel_audio.h"
>  #include "intel_audio_regs.h"
>  #include "intel_backlight.h"
> @@ -3570,6 +3571,7 @@ static void intel_ddi_disable_dp(struct intel_atomic_state *state,
>  	intel_dp->link_trained = false;
>  
>  	intel_psr_disable(intel_dp, old_crtc_state);
> +	intel_alpm_disable(intel_dp);

We have old crtc state here, why do we save the transcoder to intel_dp
and use that?

>  	intel_edp_backlight_off(old_conn_state);
>  	/* Disable the decompression in DP Sink */
>  	intel_dp_sink_disable_decompression(state,
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 4440521e3e9e..b78721c451b8 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1801,6 +1801,7 @@ struct intel_dp {
>  	struct {
>  		u8 io_wake_lines;
>  		u8 fast_wake_lines;
> +		enum transcoder transcoder;
>  
>  		/* LNL and beyond */
>  		u8 check_entry_lines;
> diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c
> index c1dd9c739fd4..1d202f2eb356 100644
> --- a/drivers/gpu/drm/i915/display/intel_psr.c
> +++ b/drivers/gpu/drm/i915/display/intel_psr.c
> @@ -2141,17 +2141,6 @@ static void intel_psr_disable_locked(struct intel_dp *intel_dp)
>  	if (intel_dp_is_edp(intel_dp))
>  		intel_snps_phy_update_psr_power_state(&dp_to_dig_port(intel_dp)->base, false);
>  
> -	/* Panel Replay on eDP is always using ALPM aux less. */
> -	if (intel_dp->psr.panel_replay_enabled && intel_dp_is_edp(intel_dp)) {
> -		intel_de_rmw(display, ALPM_CTL(display, cpu_transcoder),
> -			     ALPM_CTL_ALPM_ENABLE |
> -			     ALPM_CTL_ALPM_AUX_LESS_ENABLE, 0);
> -
> -		intel_de_rmw(display,
> -			     PORT_ALPM_CTL(cpu_transcoder),
> -			     PORT_ALPM_CTL_ALPM_AUX_LESS_ENABLE, 0);
> -	}
> -
>  	/* Disable PSR on Sink */
>  	if (!intel_dp->psr.panel_replay_enabled) {
>  		drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_EN_CFG, 0);
Manna, Animesh Feb. 25, 2025, 9:02 a.m. UTC | #2
> -----Original Message-----
> From: Nikula, Jani <jani.nikula@intel.com>
> Sent: Monday, February 24, 2025 4:15 PM
> To: Manna, Animesh <animesh.manna@intel.com>; intel-
> gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Cc: Hogander, Jouni <jouni.hogander@intel.com>; B, Jeevan
> <jeevan.b@intel.com>; Manna, Animesh <animesh.manna@intel.com>
> Subject: Re: [PATCH v4 2/8] drm/i915/lobf: Disintegrate alpm_disable from
> psr_disable
> 
> On Mon, 24 Feb 2025, Animesh Manna <animesh.manna@intel.com> wrote:
> > Currently clearing of alpm registers is done through psr_disable()
> > which is always not correct, without psr also alpm can exist. So
> > dis-integrate alpm_disable() from psr_disable().
> >
> > Signed-off-by: Animesh Manna <animesh.manna@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_alpm.c     | 21 +++++++++++++++++++
> >  drivers/gpu/drm/i915/display/intel_alpm.h     |  1 +
> >  drivers/gpu/drm/i915/display/intel_ddi.c      |  2 ++
> >  .../drm/i915/display/intel_display_types.h    |  1 +
> >  drivers/gpu/drm/i915/display/intel_psr.c      | 11 ----------
> >  5 files changed, 25 insertions(+), 11 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_alpm.c
> > b/drivers/gpu/drm/i915/display/intel_alpm.c
> > index a53ed83f6b22..d94c96ba46b1 100644
> > --- a/drivers/gpu/drm/i915/display/intel_alpm.c
> > +++ b/drivers/gpu/drm/i915/display/intel_alpm.c
> > @@ -365,6 +365,7 @@ void intel_alpm_configure(struct intel_dp
> *intel_dp,
> >  			  const struct intel_crtc_state *crtc_state)  {
> >  	lnl_alpm_configure(intel_dp, crtc_state);
> > +	intel_dp->alpm_parameters.transcoder = crtc_state-
> >cpu_transcoder;
> 
> Why do we need to store this?

While refactoring found that some places where we don't have access to crtc_state and only intel_dp is passed, using cpu_transcoder we can access ALPM register, will relook again and try to drop the saving of transcoder in intel_dp. 

> 
> >  }
> >
> >  void intel_alpm_post_plane_update(struct intel_atomic_state *state,
> > @@ -440,3 +441,23 @@ void intel_alpm_lobf_debugfs_add(struct
> intel_connector *connector)
> >  	debugfs_create_file("i915_edp_lobf_info", 0444, root,
> >  			    connector, &i915_edp_lobf_info_fops);  }
> > +
> > +void intel_alpm_disable(struct intel_dp *intel_dp) {
> > +	struct intel_display *display = to_intel_display(intel_dp);
> > +	enum transcoder cpu_transcoder =
> > +intel_dp->alpm_parameters.transcoder;
> > +
> > +	if (DISPLAY_VER(display) < 20)
> > +		return;
> > +
> > +	if (!(intel_de_read(display, ALPM_CTL(display, cpu_transcoder)) &
> ALPM_CTL_ALPM_ENABLE))
> > +		return;
> 
> Why are we checking the hardware state here? We should know what state
> the hardware is in, right?
> 

Agree, we can drop the above read.

> > +
> > +	intel_de_rmw(display, ALPM_CTL(display, cpu_transcoder),
> > +		     ALPM_CTL_ALPM_ENABLE | ALPM_CTL_LOBF_ENABLE |
> > +		     ALPM_CTL_ALPM_AUX_LESS_ENABLE, 0);
> > +
> > +	intel_de_rmw(display,
> > +		     PORT_ALPM_CTL(cpu_transcoder),
> > +		     PORT_ALPM_CTL_ALPM_AUX_LESS_ENABLE, 0); }
> > diff --git a/drivers/gpu/drm/i915/display/intel_alpm.h
> > b/drivers/gpu/drm/i915/display/intel_alpm.h
> > index 2f862b0476a8..91f51fb24f98 100644
> > --- a/drivers/gpu/drm/i915/display/intel_alpm.h
> > +++ b/drivers/gpu/drm/i915/display/intel_alpm.h
> > @@ -28,4 +28,5 @@ void intel_alpm_post_plane_update(struct
> > intel_atomic_state *state,  void intel_alpm_lobf_debugfs_add(struct
> > intel_connector *connector);  bool
> > intel_alpm_aux_wake_supported(struct intel_dp *intel_dp);  bool
> > intel_alpm_aux_less_wake_supported(struct intel_dp *intel_dp);
> > +void intel_alpm_disable(struct intel_dp *intel_dp);
> >  #endif
> > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c
> > b/drivers/gpu/drm/i915/display/intel_ddi.c
> > index 7937f4de66cb..26aa32d4d50e 100644
> > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > @@ -35,6 +35,7 @@
> >  #include "i915_drv.h"
> >  #include "i915_reg.h"
> >  #include "icl_dsi.h"
> > +#include "intel_alpm.h"
> >  #include "intel_audio.h"
> >  #include "intel_audio_regs.h"
> >  #include "intel_backlight.h"
> > @@ -3570,6 +3571,7 @@ static void intel_ddi_disable_dp(struct
> intel_atomic_state *state,
> >  	intel_dp->link_trained = false;
> >
> >  	intel_psr_disable(intel_dp, old_crtc_state);
> > +	intel_alpm_disable(intel_dp);
> 
> We have old crtc state here, why do we save the transcoder to intel_dp and
> use that?

Got it, we can drop saving of transcoder in intel_dp here. 

Regards,
Animesh

> 
> >  	intel_edp_backlight_off(old_conn_state);
> >  	/* Disable the decompression in DP Sink */
> >  	intel_dp_sink_disable_decompression(state,
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> > b/drivers/gpu/drm/i915/display/intel_display_types.h
> > index 4440521e3e9e..b78721c451b8 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> > @@ -1801,6 +1801,7 @@ struct intel_dp {
> >  	struct {
> >  		u8 io_wake_lines;
> >  		u8 fast_wake_lines;
> > +		enum transcoder transcoder;
> >
> >  		/* LNL and beyond */
> >  		u8 check_entry_lines;
> > diff --git a/drivers/gpu/drm/i915/display/intel_psr.c
> > b/drivers/gpu/drm/i915/display/intel_psr.c
> > index c1dd9c739fd4..1d202f2eb356 100644
> > --- a/drivers/gpu/drm/i915/display/intel_psr.c
> > +++ b/drivers/gpu/drm/i915/display/intel_psr.c
> > @@ -2141,17 +2141,6 @@ static void intel_psr_disable_locked(struct
> intel_dp *intel_dp)
> >  	if (intel_dp_is_edp(intel_dp))
> >
> > intel_snps_phy_update_psr_power_state(&dp_to_dig_port(intel_dp)-
> >base,
> > false);
> >
> > -	/* Panel Replay on eDP is always using ALPM aux less. */
> > -	if (intel_dp->psr.panel_replay_enabled &&
> intel_dp_is_edp(intel_dp)) {
> > -		intel_de_rmw(display, ALPM_CTL(display, cpu_transcoder),
> > -			     ALPM_CTL_ALPM_ENABLE |
> > -			     ALPM_CTL_ALPM_AUX_LESS_ENABLE, 0);
> > -
> > -		intel_de_rmw(display,
> > -			     PORT_ALPM_CTL(cpu_transcoder),
> > -			     PORT_ALPM_CTL_ALPM_AUX_LESS_ENABLE, 0);
> > -	}
> > -
> >  	/* Disable PSR on Sink */
> >  	if (!intel_dp->psr.panel_replay_enabled) {
> >  		drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_EN_CFG, 0);
> 
> --
> Jani Nikula, Intel
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/display/intel_alpm.c b/drivers/gpu/drm/i915/display/intel_alpm.c
index a53ed83f6b22..d94c96ba46b1 100644
--- a/drivers/gpu/drm/i915/display/intel_alpm.c
+++ b/drivers/gpu/drm/i915/display/intel_alpm.c
@@ -365,6 +365,7 @@  void intel_alpm_configure(struct intel_dp *intel_dp,
 			  const struct intel_crtc_state *crtc_state)
 {
 	lnl_alpm_configure(intel_dp, crtc_state);
+	intel_dp->alpm_parameters.transcoder = crtc_state->cpu_transcoder;
 }
 
 void intel_alpm_post_plane_update(struct intel_atomic_state *state,
@@ -440,3 +441,23 @@  void intel_alpm_lobf_debugfs_add(struct intel_connector *connector)
 	debugfs_create_file("i915_edp_lobf_info", 0444, root,
 			    connector, &i915_edp_lobf_info_fops);
 }
+
+void intel_alpm_disable(struct intel_dp *intel_dp)
+{
+	struct intel_display *display = to_intel_display(intel_dp);
+	enum transcoder cpu_transcoder = intel_dp->alpm_parameters.transcoder;
+
+	if (DISPLAY_VER(display) < 20)
+		return;
+
+	if (!(intel_de_read(display, ALPM_CTL(display, cpu_transcoder)) & ALPM_CTL_ALPM_ENABLE))
+		return;
+
+	intel_de_rmw(display, ALPM_CTL(display, cpu_transcoder),
+		     ALPM_CTL_ALPM_ENABLE | ALPM_CTL_LOBF_ENABLE |
+		     ALPM_CTL_ALPM_AUX_LESS_ENABLE, 0);
+
+	intel_de_rmw(display,
+		     PORT_ALPM_CTL(cpu_transcoder),
+		     PORT_ALPM_CTL_ALPM_AUX_LESS_ENABLE, 0);
+}
diff --git a/drivers/gpu/drm/i915/display/intel_alpm.h b/drivers/gpu/drm/i915/display/intel_alpm.h
index 2f862b0476a8..91f51fb24f98 100644
--- a/drivers/gpu/drm/i915/display/intel_alpm.h
+++ b/drivers/gpu/drm/i915/display/intel_alpm.h
@@ -28,4 +28,5 @@  void intel_alpm_post_plane_update(struct intel_atomic_state *state,
 void intel_alpm_lobf_debugfs_add(struct intel_connector *connector);
 bool intel_alpm_aux_wake_supported(struct intel_dp *intel_dp);
 bool intel_alpm_aux_less_wake_supported(struct intel_dp *intel_dp);
+void intel_alpm_disable(struct intel_dp *intel_dp);
 #endif
diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
index 7937f4de66cb..26aa32d4d50e 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -35,6 +35,7 @@ 
 #include "i915_drv.h"
 #include "i915_reg.h"
 #include "icl_dsi.h"
+#include "intel_alpm.h"
 #include "intel_audio.h"
 #include "intel_audio_regs.h"
 #include "intel_backlight.h"
@@ -3570,6 +3571,7 @@  static void intel_ddi_disable_dp(struct intel_atomic_state *state,
 	intel_dp->link_trained = false;
 
 	intel_psr_disable(intel_dp, old_crtc_state);
+	intel_alpm_disable(intel_dp);
 	intel_edp_backlight_off(old_conn_state);
 	/* Disable the decompression in DP Sink */
 	intel_dp_sink_disable_decompression(state,
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 4440521e3e9e..b78721c451b8 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1801,6 +1801,7 @@  struct intel_dp {
 	struct {
 		u8 io_wake_lines;
 		u8 fast_wake_lines;
+		enum transcoder transcoder;
 
 		/* LNL and beyond */
 		u8 check_entry_lines;
diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c
index c1dd9c739fd4..1d202f2eb356 100644
--- a/drivers/gpu/drm/i915/display/intel_psr.c
+++ b/drivers/gpu/drm/i915/display/intel_psr.c
@@ -2141,17 +2141,6 @@  static void intel_psr_disable_locked(struct intel_dp *intel_dp)
 	if (intel_dp_is_edp(intel_dp))
 		intel_snps_phy_update_psr_power_state(&dp_to_dig_port(intel_dp)->base, false);
 
-	/* Panel Replay on eDP is always using ALPM aux less. */
-	if (intel_dp->psr.panel_replay_enabled && intel_dp_is_edp(intel_dp)) {
-		intel_de_rmw(display, ALPM_CTL(display, cpu_transcoder),
-			     ALPM_CTL_ALPM_ENABLE |
-			     ALPM_CTL_ALPM_AUX_LESS_ENABLE, 0);
-
-		intel_de_rmw(display,
-			     PORT_ALPM_CTL(cpu_transcoder),
-			     PORT_ALPM_CTL_ALPM_AUX_LESS_ENABLE, 0);
-	}
-
 	/* Disable PSR on Sink */
 	if (!intel_dp->psr.panel_replay_enabled) {
 		drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_EN_CFG, 0);