From: Jani Nikula <jani.nikula@linux.intel.com>
To: Ville Syrjala <ville.syrjala@linux.intel.com>,
intel-gfx@lists.freedesktop.org
Subject: Re: [Intel-gfx] [PATCH 4/7] drm/i915: Move the IPS code to its own file
Date: Wed, 09 Feb 2022 15:34:28 +0200 [thread overview]
Message-ID: <87tud8noyj.fsf@intel.com> (raw)
In-Reply-To: <20220209113526.7595-4-ville.syrjala@linux.intel.com>
On Wed, 09 Feb 2022, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@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@linux.intel.com>
Reviewed-by: Jani Nikula <jani.nikula@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
next prev parent reply other threads:[~2022-02-09 13:34 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-09 11:35 [Intel-gfx] [PATCH 1/7] drm/i915: Move vblank waits out from IPS code Ville Syrjala
2022-02-09 11:35 ` [Intel-gfx] [PATCH 2/7] drm/i915: Change IPS calling convention Ville Syrjala
2022-02-09 13:17 ` Jani Nikula
2022-02-09 11:35 ` [Intel-gfx] [PATCH 3/7] drm/i915: Hoover the IPS enable/disable calls into the pre/post update hooks Ville Syrjala
2022-02-09 13:25 ` Jani Nikula
2022-02-09 11:35 ` [Intel-gfx] [PATCH 4/7] drm/i915: Move the IPS code to its own file Ville Syrjala
2022-02-09 13:34 ` Jani Nikula [this message]
2022-02-09 11:35 ` [Intel-gfx] [PATCH 5/7] drm/i915: Extract hsw_ips_get_config() Ville Syrjala
2022-02-09 13:35 ` Jani Nikula
2022-02-09 11:35 ` [Intel-gfx] [PATCH 6/7] drm/i915: Fix IPS disable in intel_plane_disable_noatomic() Ville Syrjala
2022-02-09 13:41 ` Jani Nikula
2022-02-09 11:35 ` [Intel-gfx] [PATCH 7/7] drm/i915: Consolidate all pre plane update vblank waits Ville Syrjala
2022-02-09 13:39 ` Jani Nikula
2022-02-09 16:36 ` Murthy, Arun R
2022-02-09 13:15 ` [Intel-gfx] [PATCH 1/7] drm/i915: Move vblank waits out from IPS code Jani Nikula
2022-02-09 14:06 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for series starting with [1/7] " Patchwork
2022-02-09 14:08 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2022-02-09 14:39 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2022-02-09 17:36 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
2022-02-09 19:13 ` Ville Syrjälä
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87tud8noyj.fsf@intel.com \
--to=jani.nikula@linux.intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=ville.syrjala@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.