All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ville Syrjala <ville.syrjala@linux.intel.com>
To: intel-gfx@lists.freedesktop.org
Cc: Uma Shankar <uma.shankar@intel.com>,
	Gustavo Sousa <gustavo.sousa@intel.com>
Subject: [PATCH v2 01/14] drm/i915/cdclk: Fix CDCLK programming order when pipes are active
Date: Tue,  2 Apr 2024 18:50:03 +0300	[thread overview]
Message-ID: <20240402155016.13733-2-ville.syrjala@linux.intel.com> (raw)
In-Reply-To: <20240402155016.13733-1-ville.syrjala@linux.intel.com>

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Currently we always reprogram CDCLK from the
intel_set_cdclk_pre_plane_update() when using squash/crawl.
The code only works correctly for the cd2x update or full
modeset cases, and it was simply never updated to deal with
squash/crawl.

If the CDCLK frequency is increasing we must reprogram it
before we do anything else that might depend on the new
higher frequency, and conversely we must not decrease
the frequency until everything that might still depend
on the old higher frequency has been dealt with.

Since cdclk_state->pipe is only relevant when doing a cd2x
update we can't use it to determine the correct sequence
during squash/crawl. To that end introduce cdclk_state->disable_pipes
which simply indicates that we must perform the update
while the pipes are disable (ie. during
intel_set_cdclk_pre_plane_update()). Otherwise we use the
same old vs. new CDCLK frequency comparsiong as for cd2x
updates.

The only remaining problem case is when the voltage_level
needs to increase due to a DDI port, but the CDCLK frequency
is decreasing (and not all pipes are being disabled). The
current approach will not bump the voltage level up until
after the port has already been enabled, which is too late.
But we'll take care of that case separately.

v2: Don't break the "must disable pipes case"
v3: Keep the on stack 'pipe' for future use

Reviewed-by: Uma Shankar <uma.shankar@intel.com>
Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_cdclk.c | 7 +++++--
 drivers/gpu/drm/i915/display/intel_cdclk.h | 3 +++
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_cdclk.c b/drivers/gpu/drm/i915/display/intel_cdclk.c
index 31aaa9780dfc..3a04061fb100 100644
--- a/drivers/gpu/drm/i915/display/intel_cdclk.c
+++ b/drivers/gpu/drm/i915/display/intel_cdclk.c
@@ -2609,7 +2609,7 @@ intel_set_cdclk_pre_plane_update(struct intel_atomic_state *state)
 	if (IS_DG2(i915))
 		intel_cdclk_pcode_pre_notify(state);
 
-	if (pipe == INVALID_PIPE ||
+	if (new_cdclk_state->disable_pipes ||
 	    old_cdclk_state->actual.cdclk <= new_cdclk_state->actual.cdclk) {
 		drm_WARN_ON(&i915->drm, !new_cdclk_state->base.changed);
 
@@ -2641,7 +2641,7 @@ intel_set_cdclk_post_plane_update(struct intel_atomic_state *state)
 	if (IS_DG2(i915))
 		intel_cdclk_pcode_post_notify(state);
 
-	if (pipe != INVALID_PIPE &&
+	if (!new_cdclk_state->disable_pipes &&
 	    old_cdclk_state->actual.cdclk > new_cdclk_state->actual.cdclk) {
 		drm_WARN_ON(&i915->drm, !new_cdclk_state->base.changed);
 
@@ -3124,6 +3124,7 @@ static struct intel_global_state *intel_cdclk_duplicate_state(struct intel_globa
 		return NULL;
 
 	cdclk_state->pipe = INVALID_PIPE;
+	cdclk_state->disable_pipes = false;
 
 	return &cdclk_state->base;
 }
@@ -3316,6 +3317,8 @@ int intel_modeset_calc_cdclk(struct intel_atomic_state *state)
 		if (ret)
 			return ret;
 
+		new_cdclk_state->disable_pipes = true;
+
 		drm_dbg_kms(&dev_priv->drm,
 			    "Modeset required for cdclk change\n");
 	}
diff --git a/drivers/gpu/drm/i915/display/intel_cdclk.h b/drivers/gpu/drm/i915/display/intel_cdclk.h
index bc8f86e292d8..2843fc091086 100644
--- a/drivers/gpu/drm/i915/display/intel_cdclk.h
+++ b/drivers/gpu/drm/i915/display/intel_cdclk.h
@@ -53,6 +53,9 @@ struct intel_cdclk_state {
 
 	/* bitmask of active pipes */
 	u8 active_pipes;
+
+	/* update cdclk with pipes disabled */
+	bool disable_pipes;
 };
 
 int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state);
-- 
2.43.2


  reply	other threads:[~2024-04-02 15:50 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-02 15:50 [PATCH v2 00/14] drm/i915: Implemnt vblank sycnhronized mbus joining changes Ville Syrjala
2024-04-02 15:50 ` Ville Syrjala [this message]
2024-04-02 15:50 ` [PATCH v2 02/14] drm/i915/cdclk: Fix voltage_level programming edge case Ville Syrjala
2024-04-02 15:50 ` [PATCH v2 03/14] drm/i915/cdclk: Drop tgl/dg2 cdclk bump hacks Ville Syrjala
2024-04-02 15:50 ` [PATCH v2 04/14] drm/i915/cdclk: Indicate whether CDCLK change happens during pre or post plane update Ville Syrjala
2024-04-02 15:50 ` [PATCH v2 05/14] drm/i915: Loop over all active pipes in intel_mbus_dbox_update Ville Syrjala
2024-04-02 15:50 ` [PATCH v2 06/14] drm/i915: Relocate intel_mbus_dbox_update() Ville Syrjala
2024-04-02 15:50 ` [PATCH v2 07/14] drm/i915: Extract intel_dbuf_mbus_join_update() Ville Syrjala
2024-04-02 15:50 ` [PATCH v2 08/14] drm/i915: Extract intel_dbuf_mdclk_min_tracker_update() Ville Syrjala
2024-04-02 15:50 ` [PATCH v2 09/14] drm/i915: Add debugs for mbus joining and dbuf ratio programming Ville Syrjala
2024-04-02 15:50 ` [PATCH v2 10/14] drm/i915: Use old mbus_join value when increasing CDCLK Ville Syrjala
2024-04-02 15:50 ` [PATCH v2 11/14] drm/i915: Use the correct mdclk/cdclk ratio in MBUS updates Ville Syrjala
2024-04-02 15:50 ` [PATCH v2 12/14] drm/i915: Implement vblank synchronized MBUS join changes Ville Syrjala
2024-04-02 15:50 ` [PATCH v2 13/14] drm/i915: Use a plain old int for the cdclk/mdclk ratio Ville Syrjala
2024-04-02 15:50 ` [PATCH v2 14/14] drm/i915: Optimize out redundant dbuf slice updates Ville Syrjala
2024-04-02 17:47 ` ✗ Fi.CI.SPARSE: warning for drm/i915: Implemnt vblank sycnhronized mbus joining changes (rev3) Patchwork
2024-04-02 17:53 ` ✓ Fi.CI.BAT: success " Patchwork
2024-04-03  3:54 ` ✗ Fi.CI.IGT: failure " Patchwork
2024-04-03 13:39 ` ✗ Fi.CI.SPARSE: warning for drm/i915: Implemnt vblank sycnhronized mbus joining changes (rev4) Patchwork
2024-04-04  6:19 ` ✓ Fi.CI.BAT: success " Patchwork
2024-04-04  7:31 ` ✗ Fi.CI.IGT: failure " Patchwork

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=20240402155016.13733-2-ville.syrjala@linux.intel.com \
    --to=ville.syrjala@linux.intel.com \
    --cc=gustavo.sousa@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=uma.shankar@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.