diff mbox series

[12/28] drm/i915/tgl: Add TRANSCODER_A_VDSC power domain

Message ID 20190625175437.14840-13-lucas.demarchi@intel.com (mailing list archive)
State New, archived
Headers show
Series Initial support for Tiger Lake | expand

Commit Message

Lucas De Marchi June 25, 2019, 5:54 p.m. UTC
From: José Roberto de Souza <jose.souza@intel.com>

On TGL the special EDP transcoder is gone and it should be handled by
transcoder A. Add POWER_DOMAIN_TRANSCODER_A_VDSC to make this
distinction clear and update vdsc code path.

Cc: Imre Deak <imre.deak@intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display_power.c |  2 ++
 drivers/gpu/drm/i915/display/intel_display_power.h |  1 +
 drivers/gpu/drm/i915/display/intel_vdsc.c          | 11 ++++++++---
 3 files changed, 11 insertions(+), 3 deletions(-)

Comments

Navare, Manasi June 27, 2019, 7:16 p.m. UTC | #1
On Tue, Jun 25, 2019 at 10:54:21AM -0700, Lucas De Marchi wrote:
> From: José Roberto de Souza <jose.souza@intel.com>
> 
> On TGL the special EDP transcoder is gone and it should be handled by
> transcoder A. Add POWER_DOMAIN_TRANSCODER_A_VDSC to make this
> distinction clear and update vdsc code path.
> 
> Cc: Imre Deak <imre.deak@intel.com>
> Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>

Looks good to me.

Reviewed-by: Manasi Navare <manasi.d.navare@intel.com>

Manasi

> ---
>  drivers/gpu/drm/i915/display/intel_display_power.c |  2 ++
>  drivers/gpu/drm/i915/display/intel_display_power.h |  1 +
>  drivers/gpu/drm/i915/display/intel_vdsc.c          | 11 ++++++++---
>  3 files changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c b/drivers/gpu/drm/i915/display/intel_display_power.c
> index 0c7d4a363deb..15582841fefc 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_power.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_power.c
> @@ -58,6 +58,8 @@ intel_display_power_domain_str(struct drm_i915_private *i915,
>  		return "TRANSCODER_EDP";
>  	case POWER_DOMAIN_TRANSCODER_EDP_VDSC:
>  		return "TRANSCODER_EDP_VDSC";
> +	case POWER_DOMAIN_TRANSCODER_A_VDSC:
> +		return "TRANSCODER_A_VDSC";
>  	case POWER_DOMAIN_TRANSCODER_DSI_A:
>  		return "TRANSCODER_DSI_A";
>  	case POWER_DOMAIN_TRANSCODER_DSI_C:
> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.h b/drivers/gpu/drm/i915/display/intel_display_power.h
> index 79262a5bceb4..7761b493608a 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_power.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_power.h
> @@ -29,6 +29,7 @@ enum intel_display_power_domain {
>  	POWER_DOMAIN_TRANSCODER_D,
>  	POWER_DOMAIN_TRANSCODER_EDP,
>  	POWER_DOMAIN_TRANSCODER_EDP_VDSC,
> +	POWER_DOMAIN_TRANSCODER_A_VDSC,
>  	POWER_DOMAIN_TRANSCODER_DSI_A,
>  	POWER_DOMAIN_TRANSCODER_DSI_C,
>  	POWER_DOMAIN_PORT_DDI_A_LANES,
> diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c b/drivers/gpu/drm/i915/display/intel_vdsc.c
> index ffec807b8960..0c75b408d6ba 100644
> --- a/drivers/gpu/drm/i915/display/intel_vdsc.c
> +++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
> @@ -459,16 +459,21 @@ int intel_dp_compute_dsc_params(struct intel_dp *intel_dp,
>  enum intel_display_power_domain
>  intel_dsc_power_domain(const struct intel_crtc_state *crtc_state)
>  {
> +	struct drm_i915_private *dev_priv = to_i915(crtc_state->base.state->dev);
>  	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
>  
>  	/*
> -	 * On ICL VDSC/joining for eDP transcoder uses a separate power well PW2
> -	 * This requires POWER_DOMAIN_TRANSCODER_EDP_VDSC power domain.
> +	 * On ICL+ VDSC/joining for eDP/A transcoder uses a separate power well
> +	 * PW2. This requires
> +	 * POWER_DOMAIN_TRANSCODER_EDP_VDSC/POWER_DOMAIN_TRANSCODER_A_VDSC power
> +	 * domain.
>  	 * For any other transcoder, VDSC/joining uses the power well associated
>  	 * with the pipe/transcoder in use. Hence another reference on the
>  	 * transcoder power domain will suffice.
>  	 */
> -	if (cpu_transcoder == TRANSCODER_EDP)
> +	if (INTEL_GEN(dev_priv) >= 12 && cpu_transcoder == TRANSCODER_A)
> +		return POWER_DOMAIN_TRANSCODER_A_VDSC;
> +	else if (cpu_transcoder == TRANSCODER_EDP)
>  		return POWER_DOMAIN_TRANSCODER_EDP_VDSC;
>  	else
>  		return POWER_DOMAIN_TRANSCODER(cpu_transcoder);
> -- 
> 2.21.0
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Souza, Jose June 27, 2019, 7:28 p.m. UTC | #2
On Tue, 2019-06-25 at 10:54 -0700, Lucas De Marchi wrote:
> From: José Roberto de Souza <jose.souza@intel.com>
> 
> On TGL the special EDP transcoder is gone and it should be handled by
> transcoder A. Add POWER_DOMAIN_TRANSCODER_A_VDSC to make this
> distinction clear and update vdsc code path.
> 
> Cc: Imre Deak <imre.deak@intel.com>
> Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_display_power.c |  2 ++
>  drivers/gpu/drm/i915/display/intel_display_power.h |  1 +
>  drivers/gpu/drm/i915/display/intel_vdsc.c          | 11 ++++++++---
>  3 files changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c
> b/drivers/gpu/drm/i915/display/intel_display_power.c
> index 0c7d4a363deb..15582841fefc 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_power.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_power.c
> @@ -58,6 +58,8 @@ intel_display_power_domain_str(struct
> drm_i915_private *i915,
>  		return "TRANSCODER_EDP";
>  	case POWER_DOMAIN_TRANSCODER_EDP_VDSC:
>  		return "TRANSCODER_EDP_VDSC";
> +	case POWER_DOMAIN_TRANSCODER_A_VDSC:
> +		return "TRANSCODER_A_VDSC";
>  	case POWER_DOMAIN_TRANSCODER_DSI_A:
>  		return "TRANSCODER_DSI_A";
>  	case POWER_DOMAIN_TRANSCODER_DSI_C:
> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.h
> b/drivers/gpu/drm/i915/display/intel_display_power.h
> index 79262a5bceb4..7761b493608a 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_power.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_power.h
> @@ -29,6 +29,7 @@ enum intel_display_power_domain {
>  	POWER_DOMAIN_TRANSCODER_D,
>  	POWER_DOMAIN_TRANSCODER_EDP,
>  	POWER_DOMAIN_TRANSCODER_EDP_VDSC,
> +	POWER_DOMAIN_TRANSCODER_A_VDSC,
>  	POWER_DOMAIN_TRANSCODER_DSI_A,
>  	POWER_DOMAIN_TRANSCODER_DSI_C,
>  	POWER_DOMAIN_PORT_DDI_A_LANES,
> diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c
> b/drivers/gpu/drm/i915/display/intel_vdsc.c
> index ffec807b8960..0c75b408d6ba 100644
> --- a/drivers/gpu/drm/i915/display/intel_vdsc.c
> +++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
> @@ -459,16 +459,21 @@ int intel_dp_compute_dsc_params(struct intel_dp
> *intel_dp,
>  enum intel_display_power_domain
>  intel_dsc_power_domain(const struct intel_crtc_state *crtc_state)
>  {
> +	struct drm_i915_private *dev_priv = to_i915(crtc_state-
> >base.state->dev);
>  	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
>  
>  	/*
> -	 * On ICL VDSC/joining for eDP transcoder uses a separate power
> well PW2
> -	 * This requires POWER_DOMAIN_TRANSCODER_EDP_VDSC power domain.
> +	 * On ICL+ VDSC/joining for eDP/A transcoder uses a separate
> power well
> +	 * PW2. This requires
> +	 *
> POWER_DOMAIN_TRANSCODER_EDP_VDSC/POWER_DOMAIN_TRANSCODER_A_VDSC power
> +	 * domain.
>  	 * For any other transcoder, VDSC/joining uses the power well
> associated
>  	 * with the pipe/transcoder in use. Hence another reference on
> the
>  	 * transcoder power domain will suffice.
>  	 */
> -	if (cpu_transcoder == TRANSCODER_EDP)
> +	if (INTEL_GEN(dev_priv) >= 12 && cpu_transcoder ==
> TRANSCODER_A)
> +		return POWER_DOMAIN_TRANSCODER_A_VDSC;
> +	else if (cpu_transcoder == TRANSCODER_EDP)
>  		return POWER_DOMAIN_TRANSCODER_EDP_VDSC;
>  	else
>  		return POWER_DOMAIN_TRANSCODER(cpu_transcoder);


This is missing the change adding POWER_DOMAIN_TRANSCODER_EDP_VDSC to
TGL_PW_2_POWER_DOMAINS.
Souza, Jose June 27, 2019, 7:30 p.m. UTC | #3
On Thu, 2019-06-27 at 12:28 -0700, José Roberto de Souza wrote:
> On Tue, 2019-06-25 at 10:54 -0700, Lucas De Marchi wrote:
> > From: José Roberto de Souza <jose.souza@intel.com>
> > 
> > On TGL the special EDP transcoder is gone and it should be handled
> > by
> > transcoder A. Add POWER_DOMAIN_TRANSCODER_A_VDSC to make this
> > distinction clear and update vdsc code path.
> > 
> > Cc: Imre Deak <imre.deak@intel.com>
> > Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> > Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_display_power.c |  2 ++
> >  drivers/gpu/drm/i915/display/intel_display_power.h |  1 +
> >  drivers/gpu/drm/i915/display/intel_vdsc.c          | 11 ++++++++
> > ---
> >  3 files changed, 11 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c
> > b/drivers/gpu/drm/i915/display/intel_display_power.c
> > index 0c7d4a363deb..15582841fefc 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_power.c
> > +++ b/drivers/gpu/drm/i915/display/intel_display_power.c
> > @@ -58,6 +58,8 @@ intel_display_power_domain_str(struct
> > drm_i915_private *i915,
> >  		return "TRANSCODER_EDP";
> >  	case POWER_DOMAIN_TRANSCODER_EDP_VDSC:
> >  		return "TRANSCODER_EDP_VDSC";
> > +	case POWER_DOMAIN_TRANSCODER_A_VDSC:
> > +		return "TRANSCODER_A_VDSC";
> >  	case POWER_DOMAIN_TRANSCODER_DSI_A:
> >  		return "TRANSCODER_DSI_A";
> >  	case POWER_DOMAIN_TRANSCODER_DSI_C:
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_power.h
> > b/drivers/gpu/drm/i915/display/intel_display_power.h
> > index 79262a5bceb4..7761b493608a 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_power.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display_power.h
> > @@ -29,6 +29,7 @@ enum intel_display_power_domain {
> >  	POWER_DOMAIN_TRANSCODER_D,
> >  	POWER_DOMAIN_TRANSCODER_EDP,
> >  	POWER_DOMAIN_TRANSCODER_EDP_VDSC,
> > +	POWER_DOMAIN_TRANSCODER_A_VDSC,
> >  	POWER_DOMAIN_TRANSCODER_DSI_A,
> >  	POWER_DOMAIN_TRANSCODER_DSI_C,
> >  	POWER_DOMAIN_PORT_DDI_A_LANES,
> > diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c
> > b/drivers/gpu/drm/i915/display/intel_vdsc.c
> > index ffec807b8960..0c75b408d6ba 100644
> > --- a/drivers/gpu/drm/i915/display/intel_vdsc.c
> > +++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
> > @@ -459,16 +459,21 @@ int intel_dp_compute_dsc_params(struct
> > intel_dp
> > *intel_dp,
> >  enum intel_display_power_domain
> >  intel_dsc_power_domain(const struct intel_crtc_state *crtc_state)
> >  {
> > +	struct drm_i915_private *dev_priv = to_i915(crtc_state-
> > > base.state->dev);
> >  	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
> >  
> >  	/*
> > -	 * On ICL VDSC/joining for eDP transcoder uses a separate power
> > well PW2
> > -	 * This requires POWER_DOMAIN_TRANSCODER_EDP_VDSC power domain.
> > +	 * On ICL+ VDSC/joining for eDP/A transcoder uses a separate
> > power well
> > +	 * PW2. This requires
> > +	 *
> > POWER_DOMAIN_TRANSCODER_EDP_VDSC/POWER_DOMAIN_TRANSCODER_A_VDSC
> > power
> > +	 * domain.
> >  	 * For any other transcoder, VDSC/joining uses the power well
> > associated
> >  	 * with the pipe/transcoder in use. Hence another reference on
> > the
> >  	 * transcoder power domain will suffice.
> >  	 */
> > -	if (cpu_transcoder == TRANSCODER_EDP)
> > +	if (INTEL_GEN(dev_priv) >= 12 && cpu_transcoder ==
> > TRANSCODER_A)
> > +		return POWER_DOMAIN_TRANSCODER_A_VDSC;
> > +	else if (cpu_transcoder == TRANSCODER_EDP)
> >  		return POWER_DOMAIN_TRANSCODER_EDP_VDSC;
> >  	else
> >  		return POWER_DOMAIN_TRANSCODER(cpu_transcoder);
> 
> This is missing the change adding POWER_DOMAIN_TRANSCODER_EDP_VDSC to
> TGL_PW_2_POWER_DOMAINS.


* TRANSCODER_A_VDSC *
Missing the change adding TRANSCODER_A_VDSC to TGL_PW_2_POWER_DOMAINS
Navare, Manasi June 27, 2019, 7:33 p.m. UTC | #4
On Thu, Jun 27, 2019 at 07:28:15PM +0000, Souza, Jose wrote:
> On Tue, 2019-06-25 at 10:54 -0700, Lucas De Marchi wrote:
> > From: José Roberto de Souza <jose.souza@intel.com>
> > 
> > On TGL the special EDP transcoder is gone and it should be handled by
> > transcoder A. Add POWER_DOMAIN_TRANSCODER_A_VDSC to make this
> > distinction clear and update vdsc code path.
> > 
> > Cc: Imre Deak <imre.deak@intel.com>
> > Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> > Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_display_power.c |  2 ++
> >  drivers/gpu/drm/i915/display/intel_display_power.h |  1 +
> >  drivers/gpu/drm/i915/display/intel_vdsc.c          | 11 ++++++++---
> >  3 files changed, 11 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c
> > b/drivers/gpu/drm/i915/display/intel_display_power.c
> > index 0c7d4a363deb..15582841fefc 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_power.c
> > +++ b/drivers/gpu/drm/i915/display/intel_display_power.c
> > @@ -58,6 +58,8 @@ intel_display_power_domain_str(struct
> > drm_i915_private *i915,
> >  		return "TRANSCODER_EDP";
> >  	case POWER_DOMAIN_TRANSCODER_EDP_VDSC:
> >  		return "TRANSCODER_EDP_VDSC";
> > +	case POWER_DOMAIN_TRANSCODER_A_VDSC:
> > +		return "TRANSCODER_A_VDSC";
> >  	case POWER_DOMAIN_TRANSCODER_DSI_A:
> >  		return "TRANSCODER_DSI_A";
> >  	case POWER_DOMAIN_TRANSCODER_DSI_C:
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_power.h
> > b/drivers/gpu/drm/i915/display/intel_display_power.h
> > index 79262a5bceb4..7761b493608a 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_power.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display_power.h
> > @@ -29,6 +29,7 @@ enum intel_display_power_domain {
> >  	POWER_DOMAIN_TRANSCODER_D,
> >  	POWER_DOMAIN_TRANSCODER_EDP,
> >  	POWER_DOMAIN_TRANSCODER_EDP_VDSC,
> > +	POWER_DOMAIN_TRANSCODER_A_VDSC,
> >  	POWER_DOMAIN_TRANSCODER_DSI_A,
> >  	POWER_DOMAIN_TRANSCODER_DSI_C,
> >  	POWER_DOMAIN_PORT_DDI_A_LANES,
> > diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c
> > b/drivers/gpu/drm/i915/display/intel_vdsc.c
> > index ffec807b8960..0c75b408d6ba 100644
> > --- a/drivers/gpu/drm/i915/display/intel_vdsc.c
> > +++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
> > @@ -459,16 +459,21 @@ int intel_dp_compute_dsc_params(struct intel_dp
> > *intel_dp,
> >  enum intel_display_power_domain
> >  intel_dsc_power_domain(const struct intel_crtc_state *crtc_state)
> >  {
> > +	struct drm_i915_private *dev_priv = to_i915(crtc_state-
> > >base.state->dev);
> >  	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
> >  
> >  	/*
> > -	 * On ICL VDSC/joining for eDP transcoder uses a separate power
> > well PW2
> > -	 * This requires POWER_DOMAIN_TRANSCODER_EDP_VDSC power domain.
> > +	 * On ICL+ VDSC/joining for eDP/A transcoder uses a separate
> > power well
> > +	 * PW2. This requires
> > +	 *
> > POWER_DOMAIN_TRANSCODER_EDP_VDSC/POWER_DOMAIN_TRANSCODER_A_VDSC power
> > +	 * domain.
> >  	 * For any other transcoder, VDSC/joining uses the power well
> > associated
> >  	 * with the pipe/transcoder in use. Hence another reference on
> > the
> >  	 * transcoder power domain will suffice.
> >  	 */
> > -	if (cpu_transcoder == TRANSCODER_EDP)
> > +	if (INTEL_GEN(dev_priv) >= 12 && cpu_transcoder ==
> > TRANSCODER_A)
> > +		return POWER_DOMAIN_TRANSCODER_A_VDSC;
> > +	else if (cpu_transcoder == TRANSCODER_EDP)
> >  		return POWER_DOMAIN_TRANSCODER_EDP_VDSC;
> >  	else
> >  		return POWER_DOMAIN_TRANSCODER(cpu_transcoder);
> 
> 
> This is missing the change adding POWER_DOMAIN_TRANSCODER_EDP_VDSC to
> TGL_PW_2_POWER_DOMAINS.

You mean POWER_DOMAIN_TRANSCODER_A_VDSC?

Manasi

> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Ville Syrjälä June 28, 2019, 9:55 a.m. UTC | #5
On Tue, Jun 25, 2019 at 10:54:21AM -0700, Lucas De Marchi wrote:
> From: José Roberto de Souza <jose.souza@intel.com>
> 
> On TGL the special EDP transcoder is gone and it should be handled by
> transcoder A. Add POWER_DOMAIN_TRANSCODER_A_VDSC to make this
> distinction clear and update vdsc code path.
> 
> Cc: Imre Deak <imre.deak@intel.com>
> Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_display_power.c |  2 ++
>  drivers/gpu/drm/i915/display/intel_display_power.h |  1 +
>  drivers/gpu/drm/i915/display/intel_vdsc.c          | 11 ++++++++---
>  3 files changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c b/drivers/gpu/drm/i915/display/intel_display_power.c
> index 0c7d4a363deb..15582841fefc 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_power.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_power.c
> @@ -58,6 +58,8 @@ intel_display_power_domain_str(struct drm_i915_private *i915,
>  		return "TRANSCODER_EDP";
>  	case POWER_DOMAIN_TRANSCODER_EDP_VDSC:
>  		return "TRANSCODER_EDP_VDSC";
> +	case POWER_DOMAIN_TRANSCODER_A_VDSC:
> +		return "TRANSCODER_A_VDSC";
>  	case POWER_DOMAIN_TRANSCODER_DSI_A:
>  		return "TRANSCODER_DSI_A";
>  	case POWER_DOMAIN_TRANSCODER_DSI_C:
> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.h b/drivers/gpu/drm/i915/display/intel_display_power.h
> index 79262a5bceb4..7761b493608a 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_power.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_power.h
> @@ -29,6 +29,7 @@ enum intel_display_power_domain {
>  	POWER_DOMAIN_TRANSCODER_D,
>  	POWER_DOMAIN_TRANSCODER_EDP,
>  	POWER_DOMAIN_TRANSCODER_EDP_VDSC,
> +	POWER_DOMAIN_TRANSCODER_A_VDSC,

Two power domains for essentially the same thing seems a bit wasteful.

>  	POWER_DOMAIN_TRANSCODER_DSI_A,
>  	POWER_DOMAIN_TRANSCODER_DSI_C,
>  	POWER_DOMAIN_PORT_DDI_A_LANES,
> diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c b/drivers/gpu/drm/i915/display/intel_vdsc.c
> index ffec807b8960..0c75b408d6ba 100644
> --- a/drivers/gpu/drm/i915/display/intel_vdsc.c
> +++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
> @@ -459,16 +459,21 @@ int intel_dp_compute_dsc_params(struct intel_dp *intel_dp,
>  enum intel_display_power_domain
>  intel_dsc_power_domain(const struct intel_crtc_state *crtc_state)
>  {
> +	struct drm_i915_private *dev_priv = to_i915(crtc_state->base.state->dev);
>  	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
>  
>  	/*
> -	 * On ICL VDSC/joining for eDP transcoder uses a separate power well PW2
> -	 * This requires POWER_DOMAIN_TRANSCODER_EDP_VDSC power domain.
> +	 * On ICL+ VDSC/joining for eDP/A transcoder uses a separate power well
> +	 * PW2. This requires
> +	 * POWER_DOMAIN_TRANSCODER_EDP_VDSC/POWER_DOMAIN_TRANSCODER_A_VDSC power
> +	 * domain.
>  	 * For any other transcoder, VDSC/joining uses the power well associated
>  	 * with the pipe/transcoder in use. Hence another reference on the
>  	 * transcoder power domain will suffice.
>  	 */
> -	if (cpu_transcoder == TRANSCODER_EDP)
> +	if (INTEL_GEN(dev_priv) >= 12 && cpu_transcoder == TRANSCODER_A)
> +		return POWER_DOMAIN_TRANSCODER_A_VDSC;
> +	else if (cpu_transcoder == TRANSCODER_EDP)
>  		return POWER_DOMAIN_TRANSCODER_EDP_VDSC;
>  	else
>  		return POWER_DOMAIN_TRANSCODER(cpu_transcoder);
> -- 
> 2.21.0
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Lucas De Marchi June 28, 2019, 4:31 p.m. UTC | #6
On Fri, Jun 28, 2019 at 12:55:17PM +0300, Ville Syrjälä wrote:
>On Tue, Jun 25, 2019 at 10:54:21AM -0700, Lucas De Marchi wrote:
>> From: José Roberto de Souza <jose.souza@intel.com>
>>
>> On TGL the special EDP transcoder is gone and it should be handled by
>> transcoder A. Add POWER_DOMAIN_TRANSCODER_A_VDSC to make this
>> distinction clear and update vdsc code path.
>>
>> Cc: Imre Deak <imre.deak@intel.com>
>> Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
>> Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
>> ---
>>  drivers/gpu/drm/i915/display/intel_display_power.c |  2 ++
>>  drivers/gpu/drm/i915/display/intel_display_power.h |  1 +
>>  drivers/gpu/drm/i915/display/intel_vdsc.c          | 11 ++++++++---
>>  3 files changed, 11 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c b/drivers/gpu/drm/i915/display/intel_display_power.c
>> index 0c7d4a363deb..15582841fefc 100644
>> --- a/drivers/gpu/drm/i915/display/intel_display_power.c
>> +++ b/drivers/gpu/drm/i915/display/intel_display_power.c
>> @@ -58,6 +58,8 @@ intel_display_power_domain_str(struct drm_i915_private *i915,
>>  		return "TRANSCODER_EDP";
>>  	case POWER_DOMAIN_TRANSCODER_EDP_VDSC:
>>  		return "TRANSCODER_EDP_VDSC";
>> +	case POWER_DOMAIN_TRANSCODER_A_VDSC:
>> +		return "TRANSCODER_A_VDSC";
>>  	case POWER_DOMAIN_TRANSCODER_DSI_A:
>>  		return "TRANSCODER_DSI_A";
>>  	case POWER_DOMAIN_TRANSCODER_DSI_C:
>> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.h b/drivers/gpu/drm/i915/display/intel_display_power.h
>> index 79262a5bceb4..7761b493608a 100644
>> --- a/drivers/gpu/drm/i915/display/intel_display_power.h
>> +++ b/drivers/gpu/drm/i915/display/intel_display_power.h
>> @@ -29,6 +29,7 @@ enum intel_display_power_domain {
>>  	POWER_DOMAIN_TRANSCODER_D,
>>  	POWER_DOMAIN_TRANSCODER_EDP,
>>  	POWER_DOMAIN_TRANSCODER_EDP_VDSC,
>> +	POWER_DOMAIN_TRANSCODER_A_VDSC,
>
>Two power domains for essentially the same thing seems a bit wasteful.

just reuse the name then?

and on gen12+ check for TRANSCODER_A like below?

Lucas De Marchi

>
>>  	POWER_DOMAIN_TRANSCODER_DSI_A,
>>  	POWER_DOMAIN_TRANSCODER_DSI_C,
>>  	POWER_DOMAIN_PORT_DDI_A_LANES,
>> diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c b/drivers/gpu/drm/i915/display/intel_vdsc.c
>> index ffec807b8960..0c75b408d6ba 100644
>> --- a/drivers/gpu/drm/i915/display/intel_vdsc.c
>> +++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
>> @@ -459,16 +459,21 @@ int intel_dp_compute_dsc_params(struct intel_dp *intel_dp,
>>  enum intel_display_power_domain
>>  intel_dsc_power_domain(const struct intel_crtc_state *crtc_state)
>>  {
>> +	struct drm_i915_private *dev_priv = to_i915(crtc_state->base.state->dev);
>>  	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
>>
>>  	/*
>> -	 * On ICL VDSC/joining for eDP transcoder uses a separate power well PW2
>> -	 * This requires POWER_DOMAIN_TRANSCODER_EDP_VDSC power domain.
>> +	 * On ICL+ VDSC/joining for eDP/A transcoder uses a separate power well
>> +	 * PW2. This requires
>> +	 * POWER_DOMAIN_TRANSCODER_EDP_VDSC/POWER_DOMAIN_TRANSCODER_A_VDSC power
>> +	 * domain.
>>  	 * For any other transcoder, VDSC/joining uses the power well associated
>>  	 * with the pipe/transcoder in use. Hence another reference on the
>>  	 * transcoder power domain will suffice.
>>  	 */
>> -	if (cpu_transcoder == TRANSCODER_EDP)
>> +	if (INTEL_GEN(dev_priv) >= 12 && cpu_transcoder == TRANSCODER_A)
>> +		return POWER_DOMAIN_TRANSCODER_A_VDSC;
>> +	else if (cpu_transcoder == TRANSCODER_EDP)
>>  		return POWER_DOMAIN_TRANSCODER_EDP_VDSC;
>>  	else
>>  		return POWER_DOMAIN_TRANSCODER(cpu_transcoder);
>> --
>> 2.21.0
>>
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
>-- 
>Ville Syrjälä
>Intel
Ville Syrjälä July 1, 2019, 5:32 p.m. UTC | #7
On Fri, Jun 28, 2019 at 09:31:04AM -0700, Lucas De Marchi wrote:
> On Fri, Jun 28, 2019 at 12:55:17PM +0300, Ville Syrjälä wrote:
> >On Tue, Jun 25, 2019 at 10:54:21AM -0700, Lucas De Marchi wrote:
> >> From: José Roberto de Souza <jose.souza@intel.com>
> >>
> >> On TGL the special EDP transcoder is gone and it should be handled by
> >> transcoder A. Add POWER_DOMAIN_TRANSCODER_A_VDSC to make this
> >> distinction clear and update vdsc code path.
> >>
> >> Cc: Imre Deak <imre.deak@intel.com>
> >> Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> >> Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
> >> ---
> >>  drivers/gpu/drm/i915/display/intel_display_power.c |  2 ++
> >>  drivers/gpu/drm/i915/display/intel_display_power.h |  1 +
> >>  drivers/gpu/drm/i915/display/intel_vdsc.c          | 11 ++++++++---
> >>  3 files changed, 11 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c b/drivers/gpu/drm/i915/display/intel_display_power.c
> >> index 0c7d4a363deb..15582841fefc 100644
> >> --- a/drivers/gpu/drm/i915/display/intel_display_power.c
> >> +++ b/drivers/gpu/drm/i915/display/intel_display_power.c
> >> @@ -58,6 +58,8 @@ intel_display_power_domain_str(struct drm_i915_private *i915,
> >>  		return "TRANSCODER_EDP";
> >>  	case POWER_DOMAIN_TRANSCODER_EDP_VDSC:
> >>  		return "TRANSCODER_EDP_VDSC";
> >> +	case POWER_DOMAIN_TRANSCODER_A_VDSC:
> >> +		return "TRANSCODER_A_VDSC";
> >>  	case POWER_DOMAIN_TRANSCODER_DSI_A:
> >>  		return "TRANSCODER_DSI_A";
> >>  	case POWER_DOMAIN_TRANSCODER_DSI_C:
> >> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.h b/drivers/gpu/drm/i915/display/intel_display_power.h
> >> index 79262a5bceb4..7761b493608a 100644
> >> --- a/drivers/gpu/drm/i915/display/intel_display_power.h
> >> +++ b/drivers/gpu/drm/i915/display/intel_display_power.h
> >> @@ -29,6 +29,7 @@ enum intel_display_power_domain {
> >>  	POWER_DOMAIN_TRANSCODER_D,
> >>  	POWER_DOMAIN_TRANSCODER_EDP,
> >>  	POWER_DOMAIN_TRANSCODER_EDP_VDSC,
> >> +	POWER_DOMAIN_TRANSCODER_A_VDSC,
> >
> >Two power domains for essentially the same thing seems a bit wasteful.
> 
> just reuse the name then?
> 
> and on gen12+ check for TRANSCODER_A like below?

That was my initial idea yes. In theory it would be nice to have fully
abstracted power domains but that would lead to a lot of bits getting
used. I suspect we might have to switch to using the kernel bitmask
stuff in that case. Not sure how many bits we have free ATM.

> 
> Lucas De Marchi
> 
> >
> >>  	POWER_DOMAIN_TRANSCODER_DSI_A,
> >>  	POWER_DOMAIN_TRANSCODER_DSI_C,
> >>  	POWER_DOMAIN_PORT_DDI_A_LANES,
> >> diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c b/drivers/gpu/drm/i915/display/intel_vdsc.c
> >> index ffec807b8960..0c75b408d6ba 100644
> >> --- a/drivers/gpu/drm/i915/display/intel_vdsc.c
> >> +++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
> >> @@ -459,16 +459,21 @@ int intel_dp_compute_dsc_params(struct intel_dp *intel_dp,
> >>  enum intel_display_power_domain
> >>  intel_dsc_power_domain(const struct intel_crtc_state *crtc_state)
> >>  {
> >> +	struct drm_i915_private *dev_priv = to_i915(crtc_state->base.state->dev);
> >>  	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
> >>
> >>  	/*
> >> -	 * On ICL VDSC/joining for eDP transcoder uses a separate power well PW2
> >> -	 * This requires POWER_DOMAIN_TRANSCODER_EDP_VDSC power domain.
> >> +	 * On ICL+ VDSC/joining for eDP/A transcoder uses a separate power well
> >> +	 * PW2. This requires
> >> +	 * POWER_DOMAIN_TRANSCODER_EDP_VDSC/POWER_DOMAIN_TRANSCODER_A_VDSC power
> >> +	 * domain.
> >>  	 * For any other transcoder, VDSC/joining uses the power well associated
> >>  	 * with the pipe/transcoder in use. Hence another reference on the
> >>  	 * transcoder power domain will suffice.
> >>  	 */
> >> -	if (cpu_transcoder == TRANSCODER_EDP)
> >> +	if (INTEL_GEN(dev_priv) >= 12 && cpu_transcoder == TRANSCODER_A)
> >> +		return POWER_DOMAIN_TRANSCODER_A_VDSC;
> >> +	else if (cpu_transcoder == TRANSCODER_EDP)
> >>  		return POWER_DOMAIN_TRANSCODER_EDP_VDSC;
> >>  	else
> >>  		return POWER_DOMAIN_TRANSCODER(cpu_transcoder);
> >> --
> >> 2.21.0
> >>
> >> _______________________________________________
> >> Intel-gfx mailing list
> >> Intel-gfx@lists.freedesktop.org
> >> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
> >
> >-- 
> >Ville Syrjälä
> >Intel
Ville Syrjälä July 1, 2019, 5:36 p.m. UTC | #8
On Mon, Jul 01, 2019 at 08:32:59PM +0300, Ville Syrjälä wrote:
> On Fri, Jun 28, 2019 at 09:31:04AM -0700, Lucas De Marchi wrote:
> > On Fri, Jun 28, 2019 at 12:55:17PM +0300, Ville Syrjälä wrote:
> > >On Tue, Jun 25, 2019 at 10:54:21AM -0700, Lucas De Marchi wrote:
> > >> From: José Roberto de Souza <jose.souza@intel.com>
> > >>
> > >> On TGL the special EDP transcoder is gone and it should be handled by
> > >> transcoder A. Add POWER_DOMAIN_TRANSCODER_A_VDSC to make this
> > >> distinction clear and update vdsc code path.
> > >>
> > >> Cc: Imre Deak <imre.deak@intel.com>
> > >> Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> > >> Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
> > >> ---
> > >>  drivers/gpu/drm/i915/display/intel_display_power.c |  2 ++
> > >>  drivers/gpu/drm/i915/display/intel_display_power.h |  1 +
> > >>  drivers/gpu/drm/i915/display/intel_vdsc.c          | 11 ++++++++---
> > >>  3 files changed, 11 insertions(+), 3 deletions(-)
> > >>
> > >> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c b/drivers/gpu/drm/i915/display/intel_display_power.c
> > >> index 0c7d4a363deb..15582841fefc 100644
> > >> --- a/drivers/gpu/drm/i915/display/intel_display_power.c
> > >> +++ b/drivers/gpu/drm/i915/display/intel_display_power.c
> > >> @@ -58,6 +58,8 @@ intel_display_power_domain_str(struct drm_i915_private *i915,
> > >>  		return "TRANSCODER_EDP";
> > >>  	case POWER_DOMAIN_TRANSCODER_EDP_VDSC:
> > >>  		return "TRANSCODER_EDP_VDSC";
> > >> +	case POWER_DOMAIN_TRANSCODER_A_VDSC:
> > >> +		return "TRANSCODER_A_VDSC";
> > >>  	case POWER_DOMAIN_TRANSCODER_DSI_A:
> > >>  		return "TRANSCODER_DSI_A";
> > >>  	case POWER_DOMAIN_TRANSCODER_DSI_C:
> > >> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.h b/drivers/gpu/drm/i915/display/intel_display_power.h
> > >> index 79262a5bceb4..7761b493608a 100644
> > >> --- a/drivers/gpu/drm/i915/display/intel_display_power.h
> > >> +++ b/drivers/gpu/drm/i915/display/intel_display_power.h
> > >> @@ -29,6 +29,7 @@ enum intel_display_power_domain {
> > >>  	POWER_DOMAIN_TRANSCODER_D,
> > >>  	POWER_DOMAIN_TRANSCODER_EDP,
> > >>  	POWER_DOMAIN_TRANSCODER_EDP_VDSC,
> > >> +	POWER_DOMAIN_TRANSCODER_A_VDSC,
> > >
> > >Two power domains for essentially the same thing seems a bit wasteful.
> > 
> > just reuse the name then?
> > 
> > and on gen12+ check for TRANSCODER_A like below?
> 
> That was my initial idea yes. In theory it would be nice to have fully
> abstracted power domains but that would lead to a lot of bits getting
> used. I suspect we might have to switch to using the kernel bitmask
> stuff in that case. Not sure how many bits we have free ATM.

I've also pondered about shaving off a few bits by special casing the
HSW panel fitter stuff in a similar fashion.
Lucas De Marchi July 8, 2019, 9:05 p.m. UTC | #9
On Mon, Jul 01, 2019 at 08:32:59PM +0300, Ville Syrjälä wrote:
>On Fri, Jun 28, 2019 at 09:31:04AM -0700, Lucas De Marchi wrote:
>> On Fri, Jun 28, 2019 at 12:55:17PM +0300, Ville Syrjälä wrote:
>> >On Tue, Jun 25, 2019 at 10:54:21AM -0700, Lucas De Marchi wrote:
>> >> From: José Roberto de Souza <jose.souza@intel.com>
>> >>
>> >> On TGL the special EDP transcoder is gone and it should be handled by
>> >> transcoder A. Add POWER_DOMAIN_TRANSCODER_A_VDSC to make this
>> >> distinction clear and update vdsc code path.
>> >>
>> >> Cc: Imre Deak <imre.deak@intel.com>
>> >> Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
>> >> Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
>> >> ---
>> >>  drivers/gpu/drm/i915/display/intel_display_power.c |  2 ++
>> >>  drivers/gpu/drm/i915/display/intel_display_power.h |  1 +
>> >>  drivers/gpu/drm/i915/display/intel_vdsc.c          | 11 ++++++++---
>> >>  3 files changed, 11 insertions(+), 3 deletions(-)
>> >>
>> >> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c b/drivers/gpu/drm/i915/display/intel_display_power.c
>> >> index 0c7d4a363deb..15582841fefc 100644
>> >> --- a/drivers/gpu/drm/i915/display/intel_display_power.c
>> >> +++ b/drivers/gpu/drm/i915/display/intel_display_power.c
>> >> @@ -58,6 +58,8 @@ intel_display_power_domain_str(struct drm_i915_private *i915,
>> >>  		return "TRANSCODER_EDP";
>> >>  	case POWER_DOMAIN_TRANSCODER_EDP_VDSC:
>> >>  		return "TRANSCODER_EDP_VDSC";
>> >> +	case POWER_DOMAIN_TRANSCODER_A_VDSC:
>> >> +		return "TRANSCODER_A_VDSC";
>> >>  	case POWER_DOMAIN_TRANSCODER_DSI_A:
>> >>  		return "TRANSCODER_DSI_A";
>> >>  	case POWER_DOMAIN_TRANSCODER_DSI_C:
>> >> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.h b/drivers/gpu/drm/i915/display/intel_display_power.h
>> >> index 79262a5bceb4..7761b493608a 100644
>> >> --- a/drivers/gpu/drm/i915/display/intel_display_power.h
>> >> +++ b/drivers/gpu/drm/i915/display/intel_display_power.h
>> >> @@ -29,6 +29,7 @@ enum intel_display_power_domain {
>> >>  	POWER_DOMAIN_TRANSCODER_D,
>> >>  	POWER_DOMAIN_TRANSCODER_EDP,
>> >>  	POWER_DOMAIN_TRANSCODER_EDP_VDSC,
>> >> +	POWER_DOMAIN_TRANSCODER_A_VDSC,
>> >
>> >Two power domains for essentially the same thing seems a bit wasteful.
>>
>> just reuse the name then?
>>
>> and on gen12+ check for TRANSCODER_A like below?
>
>That was my initial idea yes. In theory it would be nice to have fully
>abstracted power domains but that would lead to a lot of bits getting
>used. I suspect we might have to switch to using the kernel bitmask
>stuff in that case. Not sure how many bits we have free ATM.

we are currently using 45 and with TGL we will jump to 60. 4 more until
we have to swap out that logic in favor of bitmap.h

Lucas De Marchi

>
>>
>> Lucas De Marchi
>>
>> >
>> >>  	POWER_DOMAIN_TRANSCODER_DSI_A,
>> >>  	POWER_DOMAIN_TRANSCODER_DSI_C,
>> >>  	POWER_DOMAIN_PORT_DDI_A_LANES,
>> >> diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c b/drivers/gpu/drm/i915/display/intel_vdsc.c
>> >> index ffec807b8960..0c75b408d6ba 100644
>> >> --- a/drivers/gpu/drm/i915/display/intel_vdsc.c
>> >> +++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
>> >> @@ -459,16 +459,21 @@ int intel_dp_compute_dsc_params(struct intel_dp *intel_dp,
>> >>  enum intel_display_power_domain
>> >>  intel_dsc_power_domain(const struct intel_crtc_state *crtc_state)
>> >>  {
>> >> +	struct drm_i915_private *dev_priv = to_i915(crtc_state->base.state->dev);
>> >>  	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
>> >>
>> >>  	/*
>> >> -	 * On ICL VDSC/joining for eDP transcoder uses a separate power well PW2
>> >> -	 * This requires POWER_DOMAIN_TRANSCODER_EDP_VDSC power domain.
>> >> +	 * On ICL+ VDSC/joining for eDP/A transcoder uses a separate power well
>> >> +	 * PW2. This requires
>> >> +	 * POWER_DOMAIN_TRANSCODER_EDP_VDSC/POWER_DOMAIN_TRANSCODER_A_VDSC power
>> >> +	 * domain.
>> >>  	 * For any other transcoder, VDSC/joining uses the power well associated
>> >>  	 * with the pipe/transcoder in use. Hence another reference on the
>> >>  	 * transcoder power domain will suffice.
>> >>  	 */
>> >> -	if (cpu_transcoder == TRANSCODER_EDP)
>> >> +	if (INTEL_GEN(dev_priv) >= 12 && cpu_transcoder == TRANSCODER_A)
>> >> +		return POWER_DOMAIN_TRANSCODER_A_VDSC;
>> >> +	else if (cpu_transcoder == TRANSCODER_EDP)
>> >>  		return POWER_DOMAIN_TRANSCODER_EDP_VDSC;
>> >>  	else
>> >>  		return POWER_DOMAIN_TRANSCODER(cpu_transcoder);
>> >> --
>> >> 2.21.0
>> >>
>> >> _______________________________________________
>> >> Intel-gfx mailing list
>> >> Intel-gfx@lists.freedesktop.org
>> >> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
>> >
>> >--
>> >Ville Syrjälä
>> >Intel
>
>-- 
>Ville Syrjälä
>Intel
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c b/drivers/gpu/drm/i915/display/intel_display_power.c
index 0c7d4a363deb..15582841fefc 100644
--- a/drivers/gpu/drm/i915/display/intel_display_power.c
+++ b/drivers/gpu/drm/i915/display/intel_display_power.c
@@ -58,6 +58,8 @@  intel_display_power_domain_str(struct drm_i915_private *i915,
 		return "TRANSCODER_EDP";
 	case POWER_DOMAIN_TRANSCODER_EDP_VDSC:
 		return "TRANSCODER_EDP_VDSC";
+	case POWER_DOMAIN_TRANSCODER_A_VDSC:
+		return "TRANSCODER_A_VDSC";
 	case POWER_DOMAIN_TRANSCODER_DSI_A:
 		return "TRANSCODER_DSI_A";
 	case POWER_DOMAIN_TRANSCODER_DSI_C:
diff --git a/drivers/gpu/drm/i915/display/intel_display_power.h b/drivers/gpu/drm/i915/display/intel_display_power.h
index 79262a5bceb4..7761b493608a 100644
--- a/drivers/gpu/drm/i915/display/intel_display_power.h
+++ b/drivers/gpu/drm/i915/display/intel_display_power.h
@@ -29,6 +29,7 @@  enum intel_display_power_domain {
 	POWER_DOMAIN_TRANSCODER_D,
 	POWER_DOMAIN_TRANSCODER_EDP,
 	POWER_DOMAIN_TRANSCODER_EDP_VDSC,
+	POWER_DOMAIN_TRANSCODER_A_VDSC,
 	POWER_DOMAIN_TRANSCODER_DSI_A,
 	POWER_DOMAIN_TRANSCODER_DSI_C,
 	POWER_DOMAIN_PORT_DDI_A_LANES,
diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c b/drivers/gpu/drm/i915/display/intel_vdsc.c
index ffec807b8960..0c75b408d6ba 100644
--- a/drivers/gpu/drm/i915/display/intel_vdsc.c
+++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
@@ -459,16 +459,21 @@  int intel_dp_compute_dsc_params(struct intel_dp *intel_dp,
 enum intel_display_power_domain
 intel_dsc_power_domain(const struct intel_crtc_state *crtc_state)
 {
+	struct drm_i915_private *dev_priv = to_i915(crtc_state->base.state->dev);
 	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
 
 	/*
-	 * On ICL VDSC/joining for eDP transcoder uses a separate power well PW2
-	 * This requires POWER_DOMAIN_TRANSCODER_EDP_VDSC power domain.
+	 * On ICL+ VDSC/joining for eDP/A transcoder uses a separate power well
+	 * PW2. This requires
+	 * POWER_DOMAIN_TRANSCODER_EDP_VDSC/POWER_DOMAIN_TRANSCODER_A_VDSC power
+	 * domain.
 	 * For any other transcoder, VDSC/joining uses the power well associated
 	 * with the pipe/transcoder in use. Hence another reference on the
 	 * transcoder power domain will suffice.
 	 */
-	if (cpu_transcoder == TRANSCODER_EDP)
+	if (INTEL_GEN(dev_priv) >= 12 && cpu_transcoder == TRANSCODER_A)
+		return POWER_DOMAIN_TRANSCODER_A_VDSC;
+	else if (cpu_transcoder == TRANSCODER_EDP)
 		return POWER_DOMAIN_TRANSCODER_EDP_VDSC;
 	else
 		return POWER_DOMAIN_TRANSCODER(cpu_transcoder);