diff mbox

drm/i915/ddi: Simplify get_encoder_power_domains()

Message ID 20180705122654.17072-1-imre.deak@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Imre Deak July 5, 2018, 12:26 p.m. UTC
We can simplify the encoder's get_power_domains() hook by calling it
only if the encoder is active. That way the hook can return its power
domains unconditionally without checking the active state by calling
encoder::get_hw_state(). This get_hw_state() query is in fact
redundant since it's already done by intel_modeset_readout_hw_state()
setting the encoder's crtc or leaving it NULL accordingly. Let's use
this fact to decide if the encoder is active.

While at it clarify the comment in intel_ddi_get_power_domains() about
primary vs. fake MST encoders and make sure we never do an incorrect
encoder->dig_port cast for fake MST encoders.

Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/intel_ddi.c     | 19 +++++++------------
 drivers/gpu/drm/i915/intel_display.c | 11 +++++------
 2 files changed, 12 insertions(+), 18 deletions(-)

Comments

Ville Syrjälä July 5, 2018, 12:44 p.m. UTC | #1
On Thu, Jul 05, 2018 at 03:26:54PM +0300, Imre Deak wrote:
> We can simplify the encoder's get_power_domains() hook by calling it
> only if the encoder is active. That way the hook can return its power
> domains unconditionally without checking the active state by calling
> encoder::get_hw_state(). This get_hw_state() query is in fact
> redundant since it's already done by intel_modeset_readout_hw_state()
> setting the encoder's crtc or leaving it NULL accordingly. Let's use
> this fact to decide if the encoder is active.
> 
> While at it clarify the comment in intel_ddi_get_power_domains() about
> primary vs. fake MST encoders and make sure we never do an incorrect
> encoder->dig_port cast for fake MST encoders.
> 
> Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Imre Deak <imre.deak@intel.com>

Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

> ---
>  drivers/gpu/drm/i915/intel_ddi.c     | 19 +++++++------------
>  drivers/gpu/drm/i915/intel_display.c | 11 +++++------
>  2 files changed, 12 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
> index 0319825b725b..6b74eee5a3ac 100644
> --- a/drivers/gpu/drm/i915/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/intel_ddi.c
> @@ -2005,24 +2005,19 @@ intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
>  static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder,
>  				       struct intel_crtc_state *crtc_state)
>  {
> -	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
> -	enum pipe pipe;
> +	struct intel_digital_port *dig_port;
>  	u64 domains;
>  
> -	if (!intel_ddi_get_hw_state(encoder, &pipe))
> -		return 0;
> -
> -	domains = BIT_ULL(dig_port->ddi_io_power_domain);
> -	if (!crtc_state)
> -		return domains;
> -
>  	/*
>  	 * TODO: Add support for MST encoders. Atm, the following should never
> -	 * happen since this function will be called only for the primary
> -	 * encoder which doesn't have its own pipe/crtc_state.
> +	 * happen since fake-MST encoders don't set their get_power_domains()
> +	 * hook.
>  	 */
>  	if (WARN_ON(intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST)))
> -		return domains;
> +		return 0;
> +
> +	dig_port = enc_to_dig_port(&encoder->base);
> +	domains = BIT_ULL(dig_port->ddi_io_power_domain);
>  
>  	/* AUX power is only needed for (e)DP mode, not for HDMI. */
>  	if (intel_crtc_has_dp_encoder(crtc_state)) {
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 681e0710a467..a61dbdf2f612 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -15705,14 +15705,13 @@ get_encoder_power_domains(struct drm_i915_private *dev_priv)
>  			continue;
>  
>  		/*
> -		 * For MST and inactive encoders we don't have a crtc state.
> -		 * FIXME: no need to call get_power_domains in such cases, it
> -		 * will always return 0.
> +		 * MST-primary and inactive encoders don't have a crtc state
> +		 * and neither of these require any power domain references.
>  		 */
> -		crtc_state = encoder->base.crtc ?
> -			     to_intel_crtc_state(encoder->base.crtc->state) :
> -			     NULL;
> +		if (!encoder->base.crtc)
> +			continue;
>  
> +		crtc_state = to_intel_crtc_state(encoder->base.crtc->state);
>  		get_domains = encoder->get_power_domains(encoder, crtc_state);
>  		for_each_power_domain(domain, get_domains)
>  			intel_display_power_get(dev_priv, domain);
> -- 
> 2.13.2
Imre Deak July 6, 2018, 1:02 p.m. UTC | #2
On Thu, Jul 05, 2018 at 04:33:50PM +0000, Patchwork wrote:
> == Series Details ==
> 
> Series: drm/i915/ddi: Simplify get_encoder_power_domains()
> URL   : https://patchwork.freedesktop.org/series/45980/
> State : success

Pushed to -dinq, thanks for the review.

> 
> == Summary ==
> 
> = CI Bug Log - changes from CI_DRM_4431_full -> Patchwork_9537_full =
> 
> == Summary - WARNING ==
> 
>   Minor unknown changes coming with Patchwork_9537_full need to be verified
>   manually.
>   
>   If you think the reported changes have nothing to do with the changes
>   introduced in Patchwork_9537_full, please notify your bug team to allow them
>   to document this new failure mode, which will reduce false positives in CI.
> 
>   
> 
> == Possible new issues ==
> 
>   Here are the unknown changes that may have been introduced in Patchwork_9537_full:
> 
>   === IGT changes ===
> 
>     ==== Warnings ====
> 
>     igt@gem_exec_schedule@deep-bsd2:
>       shard-kbl:          PASS -> SKIP +2
> 
>     igt@gem_mocs_settings@mocs-rc6-vebox:
>       shard-kbl:          SKIP -> PASS +2
> 
>     
> == Known issues ==
> 
>   Here are the changes found in Patchwork_9537_full that come from known issues:
> 
>   === IGT changes ===
> 
>     ==== Issues hit ====
> 
>     igt@drv_selftest@live_gtt:
>       shard-glk:          PASS -> FAIL (fdo#107127, fdo#105347)
> 
>     igt@gem_softpin@noreloc-s3:
>       shard-glk:          PASS -> FAIL (fdo#103375)
> 
>     igt@kms_cursor_legacy@cursora-vs-flipb-toggle:
>       shard-glk:          PASS -> FAIL (fdo#106765)
> 
>     igt@kms_flip@2x-plain-flip-ts-check:
>       shard-glk:          PASS -> FAIL (fdo#100368)
> 
>     igt@kms_flip_tiling@flip-to-x-tiled:
>       shard-glk:          PASS -> FAIL (fdo#103822) +1
> 
>     igt@kms_setmode@basic:
>       shard-kbl:          PASS -> FAIL (fdo#99912)
> 
>     igt@perf_pmu@other-read-4:
>       shard-snb:          PASS -> INCOMPLETE (fdo#105411)
> 
>     
>     ==== Possible fixes ====
> 
>     igt@drv_suspend@shrink:
>       shard-kbl:          INCOMPLETE (fdo#103665, fdo#106886) -> PASS
> 
>     igt@kms_chv_cursor_fail@pipe-a-64x64-left-edge:
>       shard-kbl:          FAIL (fdo#104671) -> PASS
> 
>     igt@kms_cursor_legacy@2x-long-cursor-vs-flip-legacy:
>       shard-hsw:          FAIL (fdo#105767) -> PASS
> 
>     igt@kms_flip_tiling@flip-to-y-tiled:
>       shard-glk:          FAIL -> PASS
> 
>     igt@kms_flip_tiling@flip-x-tiled:
>       shard-glk:          FAIL (fdo#103822) -> PASS
> 
>     igt@kms_setmode@basic:
>       shard-apl:          FAIL (fdo#99912) -> PASS
> 
>     igt@perf@rc6-disable:
>       shard-kbl:          FAIL (fdo#103179) -> PASS
> 
>     
>     ==== Warnings ====
> 
>     igt@drv_selftest@live_gtt:
>       shard-apl:          INCOMPLETE (fdo#103927) -> FAIL (fdo#107127, fdo#105347)
> 
>     
>   fdo#100368 https://bugs.freedesktop.org/show_bug.cgi?id=100368
>   fdo#103179 https://bugs.freedesktop.org/show_bug.cgi?id=103179
>   fdo#103375 https://bugs.freedesktop.org/show_bug.cgi?id=103375
>   fdo#103665 https://bugs.freedesktop.org/show_bug.cgi?id=103665
>   fdo#103822 https://bugs.freedesktop.org/show_bug.cgi?id=103822
>   fdo#103927 https://bugs.freedesktop.org/show_bug.cgi?id=103927
>   fdo#104671 https://bugs.freedesktop.org/show_bug.cgi?id=104671
>   fdo#105347 https://bugs.freedesktop.org/show_bug.cgi?id=105347
>   fdo#105411 https://bugs.freedesktop.org/show_bug.cgi?id=105411
>   fdo#105767 https://bugs.freedesktop.org/show_bug.cgi?id=105767
>   fdo#106765 https://bugs.freedesktop.org/show_bug.cgi?id=106765
>   fdo#106886 https://bugs.freedesktop.org/show_bug.cgi?id=106886
>   fdo#107127 https://bugs.freedesktop.org/show_bug.cgi?id=107127
>   fdo#99912 https://bugs.freedesktop.org/show_bug.cgi?id=99912
> 
> 
> == Participating hosts (5 -> 5) ==
> 
>   No changes in participating hosts
> 
> 
> == Build changes ==
> 
>     * Linux: CI_DRM_4431 -> Patchwork_9537
> 
>   CI_DRM_4431: b9bf725e2d248638a834b4b4db5b684098216b86 @ git://anongit.freedesktop.org/gfx-ci/linux
>   IGT_4537: 5a160e9e1fe19c67e58e9c298303cb94c96aeb7d @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
>   Patchwork_9537: a91699cb337092c140ca4433445fa66e48d93ded @ git://anongit.freedesktop.org/gfx-ci/linux
>   piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit
> 
> == Logs ==
> 
> For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_9537/shards.html
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 0319825b725b..6b74eee5a3ac 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -2005,24 +2005,19 @@  intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
 static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder,
 				       struct intel_crtc_state *crtc_state)
 {
-	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
-	enum pipe pipe;
+	struct intel_digital_port *dig_port;
 	u64 domains;
 
-	if (!intel_ddi_get_hw_state(encoder, &pipe))
-		return 0;
-
-	domains = BIT_ULL(dig_port->ddi_io_power_domain);
-	if (!crtc_state)
-		return domains;
-
 	/*
 	 * TODO: Add support for MST encoders. Atm, the following should never
-	 * happen since this function will be called only for the primary
-	 * encoder which doesn't have its own pipe/crtc_state.
+	 * happen since fake-MST encoders don't set their get_power_domains()
+	 * hook.
 	 */
 	if (WARN_ON(intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST)))
-		return domains;
+		return 0;
+
+	dig_port = enc_to_dig_port(&encoder->base);
+	domains = BIT_ULL(dig_port->ddi_io_power_domain);
 
 	/* AUX power is only needed for (e)DP mode, not for HDMI. */
 	if (intel_crtc_has_dp_encoder(crtc_state)) {
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 681e0710a467..a61dbdf2f612 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -15705,14 +15705,13 @@  get_encoder_power_domains(struct drm_i915_private *dev_priv)
 			continue;
 
 		/*
-		 * For MST and inactive encoders we don't have a crtc state.
-		 * FIXME: no need to call get_power_domains in such cases, it
-		 * will always return 0.
+		 * MST-primary and inactive encoders don't have a crtc state
+		 * and neither of these require any power domain references.
 		 */
-		crtc_state = encoder->base.crtc ?
-			     to_intel_crtc_state(encoder->base.crtc->state) :
-			     NULL;
+		if (!encoder->base.crtc)
+			continue;
 
+		crtc_state = to_intel_crtc_state(encoder->base.crtc->state);
 		get_domains = encoder->get_power_domains(encoder, crtc_state);
 		for_each_power_domain(domain, get_domains)
 			intel_display_power_get(dev_priv, domain);