[Intel-gfx] [PATCH 1/2] drm/i915: Get transcoder power domain before reading its register
Lucas De Marchi
lucas.demarchi at intel.com
Fri Aug 2 00:41:06 UTC 2019
On Thu, Aug 01, 2019 at 04:28:11PM -0700, Jose Souza wrote:
>When getting the pipes attached to encoder if it is not a eDP encoder
>it iterates over all pipes and read a transcoder register.
>But it should not read a transcoder register before get its power
>domain.
>
>It was not a issue in gens older than 12 because if it only had
>port A connected it would be attached to EDP and it would skip all
>the transcoders readout, if it had more than one port connected,
>pipe B would cause PG3 to be on and it contains all other
>transcoders.
>
>But on gen 12 there is no EDP transcoder so it is always iterating
>over all pipes and if only one sink is connected, PG3 is kept off
>and reading other transcoders registers would cause a
>unclaimed read warning.
>
>So here getting the power domain of the transcoder only if it is
>enabled, otherwise it is not connected to the DDI.
>
>Cc: Lucas De Marchi <lucas.demarchi at intel.com>
>Signed-off-by: José Roberto de Souza <jose.souza at intel.com>
>---
> drivers/gpu/drm/i915/display/intel_ddi.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
>diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
>index fb58845020dc..660bb001be35 100644
>--- a/drivers/gpu/drm/i915/display/intel_ddi.c
>+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
>@@ -2015,6 +2015,12 @@ static void intel_ddi_get_encoder_pipes(struct intel_encoder *encoder,
> for_each_pipe(dev_priv, p) {
> enum transcoder cpu_transcoder = (enum transcoder)p;
> unsigned int port_mask, ddi_select;
>+ intel_wakeref_t trans_wakeref;
>+
>+ trans_wakeref = intel_display_power_get_if_enabled(dev_priv,
>+ POWER_DOMAIN_TRANSCODER(cpu_transcoder));
And on Tiger Lake POWER_DOMAIN_TRANSCODER_B, POWER_DOMAIN_TRANSCODER_C
and POWER_DOMAIN_TRANSCODER_D are on PW3. POWER_DOMAIN_TRANSCODER_A is
on PW1.
Looks correct.
Reviewed-by: Lucas De Marchi <lucas.demarchi at intel.com>
Are the warnings now fixed?
thanks
Lucas De Marchi
>+ if (!trans_wakeref)
>+ continue;
>
> if (INTEL_GEN(dev_priv) >= 12) {
> port_mask = TGL_TRANS_DDI_PORT_MASK;
>@@ -2025,6 +2031,8 @@ static void intel_ddi_get_encoder_pipes(struct intel_encoder *encoder,
> }
>
> tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
>+ intel_display_power_put(dev_priv, POWER_DOMAIN_TRANSCODER(cpu_transcoder),
>+ trans_wakeref);
>
> if ((tmp & port_mask) != ddi_select)
> continue;
>--
>2.22.0
>
More information about the Intel-gfx
mailing list