[Intel-gfx] [PATCH 4/7] drm/i915: Move the IPS code to its own file

Jani Nikula jani.nikula at linux.intel.com
Wed Feb 9 13:34:28 UTC 2022


On Wed, 09 Feb 2022, Ville Syrjala <ville.syrjala at linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> IPS is a prety well isolated feature. Move the relevant code

*pretty

> to a separate file from polluting intel_display.c.
>
> I stuck to the hsw_ips since that's what the function were already
> using, and also to avoid confusion with the ILK
> "Intelligen Power Sharing"/intel_ips GPU turbo stuff.
>
> And let's also do the s/dev_priv/i915/ rename while touching
> most of the code.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

Reviewed-by: Jani Nikula <jani.nikula at intel.com>

> ---
>  drivers/gpu/drm/i915/Makefile                |   1 +
>  drivers/gpu/drm/i915/display/hsw_ips.c       | 251 +++++++++++++++++++
>  drivers/gpu/drm/i915/display/hsw_ips.h       |  25 ++
>  drivers/gpu/drm/i915/display/intel_cdclk.c   |   1 +
>  drivers/gpu/drm/i915/display/intel_display.c | 239 +-----------------
>  drivers/gpu/drm/i915/display/intel_display.h |   1 -
>  6 files changed, 279 insertions(+), 239 deletions(-)
>  create mode 100644 drivers/gpu/drm/i915/display/hsw_ips.c
>  create mode 100644 drivers/gpu/drm/i915/display/hsw_ips.h
>
> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
> index a26e6736bebb..226dbef5f64a 100644
> --- a/drivers/gpu/drm/i915/Makefile
> +++ b/drivers/gpu/drm/i915/Makefile
> @@ -197,6 +197,7 @@ i915-y += gt/uc/intel_uc.o \
>  
>  # modesetting core code
>  i915-y += \
> +	display/hsw_ips.o \
>  	display/intel_atomic.o \
>  	display/intel_atomic_plane.o \
>  	display/intel_audio.o \
> diff --git a/drivers/gpu/drm/i915/display/hsw_ips.c b/drivers/gpu/drm/i915/display/hsw_ips.c
> new file mode 100644
> index 000000000000..fb34ef615025
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/hsw_ips.c
> @@ -0,0 +1,251 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2022 Intel Corporation
> + */
> +
> +#include "hsw_ips.h"
> +#include "i915_drv.h"
> +#include "i915_reg.h"
> +#include "intel_de.h"
> +#include "intel_display_types.h"
> +#include "intel_pcode.h"
> +
> +static void hsw_ips_enable(const struct intel_crtc_state *crtc_state)
> +{
> +	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> +	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
> +
> +	if (!crtc_state->ips_enabled)
> +		return;
> +
> +	/*
> +	 * We can only enable IPS after we enable a plane and wait for a vblank
> +	 * This function is called from post_plane_update, which is run after
> +	 * a vblank wait.
> +	 */
> +	drm_WARN_ON(&i915->drm,
> +		    !(crtc_state->active_planes & ~BIT(PLANE_CURSOR)));
> +
> +	if (IS_BROADWELL(i915)) {
> +		drm_WARN_ON(&i915->drm,
> +			    snb_pcode_write(i915, DISPLAY_IPS_CONTROL,
> +					    IPS_ENABLE | IPS_PCODE_CONTROL));
> +		/*
> +		 * Quoting Art Runyan: "its not safe to expect any particular
> +		 * value in IPS_CTL bit 31 after enabling IPS through the
> +		 * mailbox." Moreover, the mailbox may return a bogus state,
> +		 * so we need to just enable it and continue on.
> +		 */
> +	} else {
> +		intel_de_write(i915, IPS_CTL, IPS_ENABLE);
> +		/*
> +		 * The bit only becomes 1 in the next vblank, so this wait here
> +		 * is essentially intel_wait_for_vblank. If we don't have this
> +		 * and don't wait for vblanks until the end of crtc_enable, then
> +		 * the HW state readout code will complain that the expected
> +		 * IPS_CTL value is not the one we read.
> +		 */
> +		if (intel_de_wait_for_set(i915, IPS_CTL, IPS_ENABLE, 50))
> +			drm_err(&i915->drm,
> +				"Timed out waiting for IPS enable\n");
> +	}
> +}
> +
> +bool hsw_ips_disable(const struct intel_crtc_state *crtc_state)
> +{
> +	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> +	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
> +	bool need_vblank_wait = false;
> +
> +	if (!crtc_state->ips_enabled)
> +		return need_vblank_wait;
> +
> +	if (IS_BROADWELL(i915)) {
> +		drm_WARN_ON(&i915->drm,
> +			    snb_pcode_write(i915, DISPLAY_IPS_CONTROL, 0));
> +		/*
> +		 * Wait for PCODE to finish disabling IPS. The BSpec specified
> +		 * 42ms timeout value leads to occasional timeouts so use 100ms
> +		 * instead.
> +		 */
> +		if (intel_de_wait_for_clear(i915, IPS_CTL, IPS_ENABLE, 100))
> +			drm_err(&i915->drm,
> +				"Timed out waiting for IPS disable\n");
> +	} else {
> +		intel_de_write(i915, IPS_CTL, 0);
> +		intel_de_posting_read(i915, IPS_CTL);
> +	}
> +
> +	/* We need to wait for a vblank before we can disable the plane. */
> +	need_vblank_wait = true;
> +
> +	return need_vblank_wait;
> +}
> +
> +static bool hsw_ips_need_disable(struct intel_atomic_state *state,
> +				 struct intel_crtc *crtc)
> +{
> +	struct drm_i915_private *i915 = to_i915(state->base.dev);
> +	const struct intel_crtc_state *old_crtc_state =
> +		intel_atomic_get_old_crtc_state(state, crtc);
> +	const struct intel_crtc_state *new_crtc_state =
> +		intel_atomic_get_new_crtc_state(state, crtc);
> +
> +	if (!old_crtc_state->ips_enabled)
> +		return false;
> +
> +	if (intel_crtc_needs_modeset(new_crtc_state))
> +		return true;
> +
> +	/*
> +	 * Workaround : Do not read or write the pipe palette/gamma data while
> +	 * GAMMA_MODE is configured for split gamma and IPS_CTL has IPS enabled.
> +	 *
> +	 * Disable IPS before we program the LUT.
> +	 */
> +	if (IS_HASWELL(i915) &&
> +	    (new_crtc_state->uapi.color_mgmt_changed ||
> +	     new_crtc_state->update_pipe) &&
> +	    new_crtc_state->gamma_mode == GAMMA_MODE_MODE_SPLIT)
> +		return true;
> +
> +	return !new_crtc_state->ips_enabled;
> +}
> +
> +bool hsw_ips_pre_update(struct intel_atomic_state *state,
> +			struct intel_crtc *crtc)
> +{
> +	const struct intel_crtc_state *old_crtc_state =
> +		intel_atomic_get_old_crtc_state(state, crtc);
> +
> +	if (!hsw_ips_need_disable(state, crtc))
> +		return false;
> +
> +	return hsw_ips_disable(old_crtc_state);
> +}
> +
> +static bool hsw_ips_need_enable(struct intel_atomic_state *state,
> +				struct intel_crtc *crtc)
> +{
> +	struct drm_i915_private *i915 = to_i915(state->base.dev);
> +	const struct intel_crtc_state *old_crtc_state =
> +		intel_atomic_get_old_crtc_state(state, crtc);
> +	const struct intel_crtc_state *new_crtc_state =
> +		intel_atomic_get_new_crtc_state(state, crtc);
> +
> +	if (!new_crtc_state->ips_enabled)
> +		return false;
> +
> +	if (intel_crtc_needs_modeset(new_crtc_state))
> +		return true;
> +
> +	/*
> +	 * Workaround : Do not read or write the pipe palette/gamma data while
> +	 * GAMMA_MODE is configured for split gamma and IPS_CTL has IPS enabled.
> +	 *
> +	 * Re-enable IPS after the LUT has been programmed.
> +	 */
> +	if (IS_HASWELL(i915) &&
> +	    (new_crtc_state->uapi.color_mgmt_changed ||
> +	     new_crtc_state->update_pipe) &&
> +	    new_crtc_state->gamma_mode == GAMMA_MODE_MODE_SPLIT)
> +		return true;
> +
> +	/*
> +	 * We can't read out IPS on broadwell, assume the worst and
> +	 * forcibly enable IPS on the first fastset.
> +	 */
> +	if (new_crtc_state->update_pipe && old_crtc_state->inherited)
> +		return true;
> +
> +	return !old_crtc_state->ips_enabled;
> +}
> +
> +void hsw_ips_post_update(struct intel_atomic_state *state,
> +			 struct intel_crtc *crtc)
> +{
> +	const struct intel_crtc_state *new_crtc_state =
> +		intel_atomic_get_new_crtc_state(state, crtc);
> +
> +	if (!hsw_ips_need_enable(state, crtc))
> +		return;
> +
> +	hsw_ips_enable(new_crtc_state);
> +}
> +
> +/* IPS only exists on ULT machines and is tied to pipe A. */
> +bool hsw_crtc_supports_ips(struct intel_crtc *crtc)
> +{
> +	return HAS_IPS(to_i915(crtc->base.dev)) && crtc->pipe == PIPE_A;
> +}
> +
> +bool hsw_crtc_state_ips_capable(const struct intel_crtc_state *crtc_state)
> +{
> +	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> +	struct drm_i915_private *i915 = to_i915(crtc->base.dev);
> +
> +	/* IPS only exists on ULT machines and is tied to pipe A. */
> +	if (!hsw_crtc_supports_ips(crtc))
> +		return false;
> +
> +	if (!i915->params.enable_ips)
> +		return false;
> +
> +	if (crtc_state->pipe_bpp > 24)
> +		return false;
> +
> +	/*
> +	 * We compare against max which means we must take
> +	 * the increased cdclk requirement into account when
> +	 * calculating the new cdclk.
> +	 *
> +	 * Should measure whether using a lower cdclk w/o IPS
> +	 */
> +	if (IS_BROADWELL(i915) &&
> +	    crtc_state->pixel_rate > i915->max_cdclk_freq * 95 / 100)
> +		return false;
> +
> +	return true;
> +}
> +
> +int hsw_ips_compute_config(struct intel_atomic_state *state,
> +			   struct intel_crtc *crtc)
> +{
> +	struct drm_i915_private *i915 = to_i915(state->base.dev);
> +	struct intel_crtc_state *crtc_state =
> +		intel_atomic_get_new_crtc_state(state, crtc);
> +
> +	crtc_state->ips_enabled = false;
> +
> +	if (!hsw_crtc_state_ips_capable(crtc_state))
> +		return 0;
> +
> +	/*
> +	 * When IPS gets enabled, the pipe CRC changes. Since IPS gets
> +	 * enabled and disabled dynamically based on package C states,
> +	 * user space can't make reliable use of the CRCs, so let's just
> +	 * completely disable it.
> +	 */
> +	if (crtc_state->crc_enabled)
> +		return 0;
> +
> +	/* IPS should be fine as long as at least one plane is enabled. */
> +	if (!(crtc_state->active_planes & ~BIT(PLANE_CURSOR)))
> +		return 0;
> +
> +	if (IS_BROADWELL(i915)) {
> +		const struct intel_cdclk_state *cdclk_state;
> +
> +		cdclk_state = intel_atomic_get_cdclk_state(state);
> +		if (IS_ERR(cdclk_state))
> +			return PTR_ERR(cdclk_state);
> +
> +		/* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
> +		if (crtc_state->pixel_rate > cdclk_state->logical.cdclk * 95 / 100)
> +			return 0;
> +	}
> +
> +	crtc_state->ips_enabled = true;
> +
> +	return 0;
> +}
> diff --git a/drivers/gpu/drm/i915/display/hsw_ips.h b/drivers/gpu/drm/i915/display/hsw_ips.h
> new file mode 100644
> index 000000000000..d63bdef5100a
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/hsw_ips.h
> @@ -0,0 +1,25 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2022 Intel Corporation
> + */
> +
> +#ifndef __HSW_IPS_H__
> +#define __HSW_IPS_H__
> +
> +#include <linux/types.h>
> +
> +struct intel_atomic_state;
> +struct intel_crtc;
> +struct intel_crtc_state;
> +
> +bool hsw_ips_disable(const struct intel_crtc_state *crtc_state);
> +bool hsw_ips_pre_update(struct intel_atomic_state *state,
> +			struct intel_crtc *crtc);
> +void hsw_ips_post_update(struct intel_atomic_state *state,
> +			 struct intel_crtc *crtc);
> +bool hsw_crtc_supports_ips(struct intel_crtc *crtc);
> +bool hsw_crtc_state_ips_capable(const struct intel_crtc_state *crtc_state);
> +int hsw_ips_compute_config(struct intel_atomic_state *state,
> +			   struct intel_crtc *crtc);
> +
> +#endif /* __HSW_IPS_H__ */
> diff --git a/drivers/gpu/drm/i915/display/intel_cdclk.c b/drivers/gpu/drm/i915/display/intel_cdclk.c
> index 4b140a014ca8..118ef391b560 100644
> --- a/drivers/gpu/drm/i915/display/intel_cdclk.c
> +++ b/drivers/gpu/drm/i915/display/intel_cdclk.c
> @@ -23,6 +23,7 @@
>  
>  #include <linux/time.h>
>  
> +#include "hsw_ips.h"
>  #include "intel_atomic.h"
>  #include "intel_atomic_plane.h"
>  #include "intel_audio.h"
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> index 08c59fdb24e5..134527981e2b 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -74,6 +74,7 @@
>  
>  #include "g4x_dp.h"
>  #include "g4x_hdmi.h"
> +#include "hsw_ips.h"
>  #include "i915_drv.h"
>  #include "icl_dsi.h"
>  #include "intel_acpi.h"
> @@ -125,7 +126,6 @@ static void bdw_set_pipemisc(const struct intel_crtc_state *crtc_state);
>  static void ilk_pfit_enable(const struct intel_crtc_state *crtc_state);
>  static void intel_modeset_setup_hw_state(struct drm_device *dev,
>  					 struct drm_modeset_acquire_ctx *ctx);
> -static bool hsw_ips_disable(const struct intel_crtc_state *crtc_state);
>  
>  /**
>   * intel_update_watermarks - update FIFO watermark values based on current modes
> @@ -1092,75 +1092,6 @@ static void ilk_pfit_enable(const struct intel_crtc_state *crtc_state)
>  	intel_de_write(dev_priv, PF_WIN_SZ(pipe), width << 16 | height);
>  }
>  
> -static void hsw_ips_enable(const struct intel_crtc_state *crtc_state)
> -{
> -	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> -	struct drm_device *dev = crtc->base.dev;
> -	struct drm_i915_private *dev_priv = to_i915(dev);
> -
> -	if (!crtc_state->ips_enabled)
> -		return;
> -
> -	/*
> -	 * We can only enable IPS after we enable a plane and wait for a vblank
> -	 * This function is called from post_plane_update, which is run after
> -	 * a vblank wait.
> -	 */
> -	drm_WARN_ON(dev, !(crtc_state->active_planes & ~BIT(PLANE_CURSOR)));
> -
> -	if (IS_BROADWELL(dev_priv)) {
> -		drm_WARN_ON(dev, snb_pcode_write(dev_priv, DISPLAY_IPS_CONTROL,
> -						 IPS_ENABLE | IPS_PCODE_CONTROL));
> -		/* Quoting Art Runyan: "its not safe to expect any particular
> -		 * value in IPS_CTL bit 31 after enabling IPS through the
> -		 * mailbox." Moreover, the mailbox may return a bogus state,
> -		 * so we need to just enable it and continue on.
> -		 */
> -	} else {
> -		intel_de_write(dev_priv, IPS_CTL, IPS_ENABLE);
> -		/* The bit only becomes 1 in the next vblank, so this wait here
> -		 * is essentially intel_wait_for_vblank. If we don't have this
> -		 * and don't wait for vblanks until the end of crtc_enable, then
> -		 * the HW state readout code will complain that the expected
> -		 * IPS_CTL value is not the one we read. */
> -		if (intel_de_wait_for_set(dev_priv, IPS_CTL, IPS_ENABLE, 50))
> -			drm_err(&dev_priv->drm,
> -				"Timed out waiting for IPS enable\n");
> -	}
> -}
> -
> -static bool hsw_ips_disable(const struct intel_crtc_state *crtc_state)
> -{
> -	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> -	struct drm_device *dev = crtc->base.dev;
> -	struct drm_i915_private *dev_priv = to_i915(dev);
> -	bool need_vblank_wait = false;
> -
> -	if (!crtc_state->ips_enabled)
> -		return need_vblank_wait;
> -
> -	if (IS_BROADWELL(dev_priv)) {
> -		drm_WARN_ON(dev,
> -			    snb_pcode_write(dev_priv, DISPLAY_IPS_CONTROL, 0));
> -		/*
> -		 * Wait for PCODE to finish disabling IPS. The BSpec specified
> -		 * 42ms timeout value leads to occasional timeouts so use 100ms
> -		 * instead.
> -		 */
> -		if (intel_de_wait_for_clear(dev_priv, IPS_CTL, IPS_ENABLE, 100))
> -			drm_err(&dev_priv->drm,
> -				"Timed out waiting for IPS disable\n");
> -	} else {
> -		intel_de_write(dev_priv, IPS_CTL, 0);
> -		intel_de_posting_read(dev_priv, IPS_CTL);
> -	}
> -
> -	/* We need to wait for a vblank before we can disable the plane. */
> -	need_vblank_wait = true;
> -
> -	return need_vblank_wait;
> -}
> -
>  static void intel_crtc_dpms_overlay_disable(struct intel_crtc *crtc)
>  {
>  	if (crtc->overlay)
> @@ -1171,97 +1102,6 @@ static void intel_crtc_dpms_overlay_disable(struct intel_crtc *crtc)
>  	 */
>  }
>  
> -static bool hsw_ips_need_disable(struct intel_atomic_state *state,
> -				 struct intel_crtc *crtc)
> -{
> -	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
> -	const struct intel_crtc_state *old_crtc_state =
> -		intel_atomic_get_old_crtc_state(state, crtc);
> -	const struct intel_crtc_state *new_crtc_state =
> -		intel_atomic_get_new_crtc_state(state, crtc);
> -
> -	if (!old_crtc_state->ips_enabled)
> -		return false;
> -
> -	if (intel_crtc_needs_modeset(new_crtc_state))
> -		return true;
> -
> -	/*
> -	 * Workaround : Do not read or write the pipe palette/gamma data while
> -	 * GAMMA_MODE is configured for split gamma and IPS_CTL has IPS enabled.
> -	 *
> -	 * Disable IPS before we program the LUT.
> -	 */
> -	if (IS_HASWELL(dev_priv) &&
> -	    (new_crtc_state->uapi.color_mgmt_changed ||
> -	     new_crtc_state->update_pipe) &&
> -	    new_crtc_state->gamma_mode == GAMMA_MODE_MODE_SPLIT)
> -		return true;
> -
> -	return !new_crtc_state->ips_enabled;
> -}
> -
> -static bool hsw_ips_pre_update(struct intel_atomic_state *state,
> -			       struct intel_crtc *crtc)
> -{
> -	const struct intel_crtc_state *old_crtc_state =
> -		intel_atomic_get_old_crtc_state(state, crtc);
> -
> -	if (!hsw_ips_need_disable(state, crtc))
> -		return false;
> -
> -	return hsw_ips_disable(old_crtc_state);
> -}
> -
> -static bool hsw_ips_need_enable(struct intel_atomic_state *state,
> -				struct intel_crtc *crtc)
> -{
> -	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
> -	const struct intel_crtc_state *old_crtc_state =
> -		intel_atomic_get_old_crtc_state(state, crtc);
> -	const struct intel_crtc_state *new_crtc_state =
> -		intel_atomic_get_new_crtc_state(state, crtc);
> -
> -	if (!new_crtc_state->ips_enabled)
> -		return false;
> -
> -	if (intel_crtc_needs_modeset(new_crtc_state))
> -		return true;
> -
> -	/*
> -	 * Workaround : Do not read or write the pipe palette/gamma data while
> -	 * GAMMA_MODE is configured for split gamma and IPS_CTL has IPS enabled.
> -	 *
> -	 * Re-enable IPS after the LUT has been programmed.
> -	 */
> -	if (IS_HASWELL(dev_priv) &&
> -	    (new_crtc_state->uapi.color_mgmt_changed ||
> -	     new_crtc_state->update_pipe) &&
> -	    new_crtc_state->gamma_mode == GAMMA_MODE_MODE_SPLIT)
> -		return true;
> -
> -	/*
> -	 * We can't read out IPS on broadwell, assume the worst and
> -	 * forcibly enable IPS on the first fastset.
> -	 */
> -	if (new_crtc_state->update_pipe && old_crtc_state->inherited)
> -		return true;
> -
> -	return !old_crtc_state->ips_enabled;
> -}
> -
> -static void hsw_ips_post_update(struct intel_atomic_state *state,
> -				struct intel_crtc *crtc)
> -{
> -	const struct intel_crtc_state *new_crtc_state =
> -		intel_atomic_get_new_crtc_state(state, crtc);
> -
> -	if (!hsw_ips_need_enable(state, crtc))
> -		return;
> -
> -	hsw_ips_enable(new_crtc_state);
> -}
> -
>  static bool needs_nv12_wa(const struct intel_crtc_state *crtc_state)
>  {
>  	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
> @@ -1938,12 +1778,6 @@ static void ilk_crtc_enable(struct intel_atomic_state *state,
>  	intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, true);
>  }
>  
> -/* IPS only exists on ULT machines and is tied to pipe A. */
> -static bool hsw_crtc_supports_ips(struct intel_crtc *crtc)
> -{
> -	return HAS_IPS(to_i915(crtc->base.dev)) && crtc->pipe == PIPE_A;
> -}
> -
>  static void glk_pipe_scaler_clock_gating_wa(struct drm_i915_private *dev_priv,
>  					    enum pipe pipe, bool apply)
>  {
> @@ -2811,77 +2645,6 @@ static void intel_connector_verify_state(struct intel_crtc_state *crtc_state,
>  	}
>  }
>  
> -bool hsw_crtc_state_ips_capable(const struct intel_crtc_state *crtc_state)
> -{
> -	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> -	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> -
> -	/* IPS only exists on ULT machines and is tied to pipe A. */
> -	if (!hsw_crtc_supports_ips(crtc))
> -		return false;
> -
> -	if (!dev_priv->params.enable_ips)
> -		return false;
> -
> -	if (crtc_state->pipe_bpp > 24)
> -		return false;
> -
> -	/*
> -	 * We compare against max which means we must take
> -	 * the increased cdclk requirement into account when
> -	 * calculating the new cdclk.
> -	 *
> -	 * Should measure whether using a lower cdclk w/o IPS
> -	 */
> -	if (IS_BROADWELL(dev_priv) &&
> -	    crtc_state->pixel_rate > dev_priv->max_cdclk_freq * 95 / 100)
> -		return false;
> -
> -	return true;
> -}
> -
> -static int hsw_ips_compute_config(struct intel_atomic_state *state,
> -				  struct intel_crtc *crtc)
> -{
> -	struct drm_i915_private *dev_priv = to_i915(state->base.dev);
> -	struct intel_crtc_state *crtc_state =
> -		intel_atomic_get_new_crtc_state(state, crtc);
> -
> -	crtc_state->ips_enabled = false;
> -
> -	if (!hsw_crtc_state_ips_capable(crtc_state))
> -		return 0;
> -
> -	/*
> -	 * When IPS gets enabled, the pipe CRC changes. Since IPS gets
> -	 * enabled and disabled dynamically based on package C states,
> -	 * user space can't make reliable use of the CRCs, so let's just
> -	 * completely disable it.
> -	 */
> -	if (crtc_state->crc_enabled)
> -		return 0;
> -
> -	/* IPS should be fine as long as at least one plane is enabled. */
> -	if (!(crtc_state->active_planes & ~BIT(PLANE_CURSOR)))
> -		return 0;
> -
> -	if (IS_BROADWELL(dev_priv)) {
> -		const struct intel_cdclk_state *cdclk_state;
> -
> -		cdclk_state = intel_atomic_get_cdclk_state(state);
> -		if (IS_ERR(cdclk_state))
> -			return PTR_ERR(cdclk_state);
> -
> -		/* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
> -		if (crtc_state->pixel_rate > cdclk_state->logical.cdclk * 95 / 100)
> -			return 0;
> -	}
> -
> -	crtc_state->ips_enabled = true;
> -
> -	return 0;
> -}
> -
>  static bool intel_crtc_supports_double_wide(const struct intel_crtc *crtc)
>  {
>  	const struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h
> index 2315088a280d..b8455e2b2373 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.h
> +++ b/drivers/gpu/drm/i915/display/intel_display.h
> @@ -632,7 +632,6 @@ void intel_cpu_transcoder_get_m2_n2(struct intel_crtc *crtc,
>  void i9xx_crtc_clock_get(struct intel_crtc *crtc,
>  			 struct intel_crtc_state *pipe_config);
>  int intel_dotclock_calculate(int link_freq, const struct intel_link_m_n *m_n);
> -bool hsw_crtc_state_ips_capable(const struct intel_crtc_state *crtc_state);
>  enum intel_display_power_domain intel_port_to_power_domain(enum port port);
>  enum intel_display_power_domain
>  intel_aux_power_domain(struct intel_digital_port *dig_port);

-- 
Jani Nikula, Intel Open Source Graphics Center


More information about the Intel-gfx mailing list