From: Mika Kahola <mika.kahola@intel.com>
To: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org
Cc: imre.deak@intel.com, Mika Kahola <mika.kahola@intel.com>
Subject: [PATCH 2/2] drm/i915/display: Allow display PHYs to reset power state
Date: Wed, 29 Jan 2025 15:01:05 +0200 [thread overview]
Message-ID: <20250129130105.198817-3-mika.kahola@intel.com> (raw)
In-Reply-To: <20250129130105.198817-1-mika.kahola@intel.com>
The dedicated display PHYs reset to a power state that blocks S0ix,
increasing idle system power. After a system reset (cold boot,
S3/4/5, warm reset) if a dedicated PHY is not being brought up
shortly, use these steps to move the PHY to the lowest power state
to save power.
1. Follow the PLL Enable Sequence, using any valid frequency such as DP 1.62 GHz.
This brings lanes out of reset and enables the PLL to allow powerdown to be moved
to the Disable state.
2. Follow PLL Disable Sequence. This moves powerdown to the Disable state and disables the PLL.
Signed-off-by: Mika Kahola <mika.kahola@intel.com>
---
drivers/gpu/drm/i915/display/intel_cx0_phy.c | 35 +++++++++++++++++++
drivers/gpu/drm/i915/display/intel_cx0_phy.h | 1 +
.../drm/i915/display/intel_display_reset.c | 2 ++
drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 2 ++
4 files changed, 40 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
index bffe3d4bbe8b..0bd74e899221 100644
--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c
+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c
@@ -3559,3 +3559,38 @@ void intel_cx0pll_state_verify(struct intel_atomic_state *state,
else
intel_c20pll_state_verify(new_crtc_state, crtc, encoder, &mpll_hw_state.c20);
}
+
+/*
+ * WA 14022081154
+ * The dedicated display PHYs reset to a power state that blocks S0ix, increasing idle
+ * system power. After a system reset (cold boot, S3/4/5, warm reset) if a dedicated
+ * PHY is not being brought up shortly, use these steps to move the PHY to the lowest
+ * power state to save power.
+ *
+ * 1. Follow the PLL Enable Sequence, using any valid frequency such as DP 1.62 GHz.
+ * This brings lanes out of reset and enables the PLL to allow powerdown to be moved
+ * to the Disable state.
+ * 2. Follow PLL Disable Sequence. This moves powerdown to the Disable state and disables the PLL.
+ */
+void wa_14022081154(struct intel_display *display)
+{
+ struct intel_encoder *encoder;
+ u32 val;
+
+ if (DISPLAY_VER(display) < 30)
+ return;
+
+ for_each_intel_encoder(display->drm, encoder) {
+ if (encoder->port == PORT_A || encoder->port == PORT_B) {
+ val = intel_de_read(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port));
+
+ if (REG_FIELD_GET(XELPDP_DDI_CLOCK_SELECT_MASK, val) == XELPDP_DDI_CLOCK_SELECT_NONE) {
+ struct intel_cx0pll_state pll_state = {};
+ int port_clock = 162000;
+ intel_c10pll_calc_state_from_table(encoder, mtl_c10_edp_tables, port_clock, true, &pll_state);
+ __intel_cx0pll_enable(encoder, &pll_state, true, port_clock, 4);
+ intel_cx0pll_disable(encoder);
+ }
+ }
+ }
+}
diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.h b/drivers/gpu/drm/i915/display/intel_cx0_phy.h
index 573fa7d3e88f..abebe7fd2cf2 100644
--- a/drivers/gpu/drm/i915/display/intel_cx0_phy.h
+++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.h
@@ -42,5 +42,6 @@ bool intel_cx0pll_compare_hw_state(const struct intel_cx0pll_state *a,
void intel_cx0_phy_set_signal_levels(struct intel_encoder *encoder,
const struct intel_crtc_state *crtc_state);
int intel_mtl_tbt_calc_port_clock(struct intel_encoder *encoder);
+void wa_14022081154(struct intel_display *display);
#endif /* __INTEL_CX0_PHY_H__ */
diff --git a/drivers/gpu/drm/i915/display/intel_display_reset.c b/drivers/gpu/drm/i915/display/intel_display_reset.c
index 093b386c95e8..93b2697a0876 100644
--- a/drivers/gpu/drm/i915/display/intel_display_reset.c
+++ b/drivers/gpu/drm/i915/display/intel_display_reset.c
@@ -7,6 +7,7 @@
#include "i915_drv.h"
#include "intel_clock_gating.h"
+#include "intel_cx0_phy.h"
#include "intel_display_driver.h"
#include "intel_display_reset.h"
#include "intel_display_types.h"
@@ -116,6 +117,7 @@ void intel_display_reset_finish(struct drm_i915_private *i915)
intel_pps_unlock_regs_wa(display);
intel_display_driver_init_hw(display);
intel_clock_gating_init(i915);
+ wa_14022081154(display);
intel_hpd_init(i915);
ret = __intel_display_driver_resume(display, state, ctx);
diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
index b8fa04d3cd5c..76394411dd7a 100644
--- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
+++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c
@@ -27,6 +27,7 @@
#include "bxt_dpio_phy_regs.h"
#include "i915_drv.h"
#include "i915_reg.h"
+#include "intel_cx0_phy.h"
#include "intel_de.h"
#include "intel_display_types.h"
#include "intel_dkl_phy.h"
@@ -4552,6 +4553,7 @@ static void sanitize_dpll_state(struct drm_i915_private *i915,
return;
adlp_cmtg_clock_gating_wa(i915, pll);
+ wa_14022081154(&i915->display);
if (pll->active_mask)
return;
--
2.43.0
next prev parent reply other threads:[~2025-01-29 13:11 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-29 13:01 [PATCH 0/2] drm/i915/display: Allow display PHYs to reset power state Mika Kahola
2025-01-29 13:01 ` [PATCH 1/2] drm/i915/display: Drop crtc_state from C10/C20 pll programming Mika Kahola
2025-01-29 14:40 ` Jani Nikula
2025-01-30 9:26 ` Kahola, Mika
2025-01-30 13:26 ` Imre Deak
2025-01-29 13:01 ` Mika Kahola [this message]
2025-01-29 14:44 ` [PATCH 2/2] drm/i915/display: Allow display PHYs to reset power state Jani Nikula
2025-01-30 9:52 ` Kahola, Mika
2025-01-29 14:46 ` ✓ CI.Patch_applied: success for " Patchwork
2025-01-29 14:47 ` ✗ CI.checkpatch: warning " Patchwork
2025-01-29 14:48 ` ✓ CI.KUnit: success " Patchwork
2025-01-29 15:05 ` ✓ CI.Build: " Patchwork
2025-01-29 15:07 ` ✗ CI.Hooks: failure " Patchwork
2025-01-29 15:08 ` ✓ CI.checksparse: success " Patchwork
2025-01-29 15:35 ` ✓ Xe.CI.BAT: " Patchwork
2025-01-29 23:00 ` ✗ Xe.CI.Full: 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=20250129130105.198817-3-mika.kahola@intel.com \
--to=mika.kahola@intel.com \
--cc=imre.deak@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox