From: "Jouni Högander" <jouni.hogander@intel.com>
To: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org
Cc: "Jouni Högander" <jouni.hogander@intel.com>
Subject: [PATCH 5/7] drm/i915/psr: Read all PSR capability registers at once
Date: Wed, 8 Apr 2026 17:00:57 +0300 [thread overview]
Message-ID: <20260408140059.252067-6-jouni.hogander@intel.com> (raw)
In-Reply-To: <20260408140059.252067-1-jouni.hogander@intel.com>
Currently we are reading PSR capability registers in three phases:
1. read PSR capability and support register
2. read PSR2 X granularity register
3. read PSR2 Y grnaularity register
instead read them on one go and cache them all in
intel_connector:psr_caps:psr_dpcd.
Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
---
drivers/gpu/drm/i915/display/intel_psr.c | 48 ++++++++----------------
1 file changed, 16 insertions(+), 32 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c
index a927b73c3f6e..0adaba7e8f7a 100644
--- a/drivers/gpu/drm/i915/display/intel_psr.c
+++ b/drivers/gpu/drm/i915/display/intel_psr.c
@@ -496,47 +496,31 @@ static u8 intel_dp_get_sink_sync_latency(struct intel_dp *intel_dp)
return val;
}
-static void _psr_compute_su_granularity(struct intel_dp *intel_dp,
- struct intel_connector *connector)
+static void _psr_compute_su_granularity(struct intel_connector *connector)
{
- struct intel_display *display = to_intel_display(intel_dp);
- ssize_t r;
- __le16 w;
+ u16 w;
u8 y;
/*
* If sink don't have specific granularity requirements set legacy
* ones.
*/
- if (!(connector->dp.psr_caps.dpcd[1] & DP_PSR2_SU_GRANULARITY_REQUIRED)) {
+ if (!(connector->dp.psr_caps.dpcd[INTEL_PSR_DPCD_INDEX(DP_PSR_CAPS)] & DP_PSR2_SU_GRANULARITY_REQUIRED)) {
/* As PSR2 HW sends full lines, we do not care about x granularity */
- w = cpu_to_le16(4);
+ w = 4;
y = 4;
goto exit;
}
- r = drm_dp_dpcd_read(&intel_dp->aux, DP_PSR2_SU_X_GRANULARITY, &w, sizeof(w));
- if (r != sizeof(w))
- drm_dbg_kms(display->drm,
- "Unable to read selective update x granularity\n");
/*
* Spec says that if the value read is 0 the default granularity should
* be used instead.
*/
- if (r != sizeof(w) || w == 0)
- w = cpu_to_le16(4);
-
- r = drm_dp_dpcd_read(&intel_dp->aux, DP_PSR2_SU_Y_GRANULARITY, &y, 1);
- if (r != 1) {
- drm_dbg_kms(display->drm,
- "Unable to read selective update y granularity\n");
- y = 4;
- }
- if (y == 0)
- y = 1;
+ w = le16_to_cpu(*(__le16 *)&connector->dp.psr_caps.dpcd[INTEL_PSR_DPCD_INDEX(DP_PSR2_SU_X_GRANULARITY)]) ? : 4;
+ y = connector->dp.psr_caps.dpcd[INTEL_PSR_DPCD_INDEX(DP_PSR2_SU_Y_GRANULARITY)] ? : 1;
exit:
- connector->dp.psr_caps.su_w_granularity = le16_to_cpu(w);
+ connector->dp.psr_caps.su_w_granularity = w;
connector->dp.psr_caps.su_y_granularity = y;
}
@@ -672,11 +656,11 @@ static void _psr_init_dpcd(struct intel_dp *intel_dp, struct intel_connector *co
if (ret < 0)
return;
- if (!connector->dp.psr_caps.dpcd[0])
+ if (!connector->dp.psr_caps.dpcd[INTEL_PSR_DPCD_INDEX(DP_PSR_SUPPORT)])
return;
drm_dbg_kms(display->drm, "eDP panel supports PSR version %x\n",
- connector->dp.psr_caps.dpcd[0]);
+ connector->dp.psr_caps.dpcd[INTEL_PSR_DPCD_INDEX(DP_PSR_SUPPORT)]);
if (drm_dp_has_quirk(&intel_dp->desc, DP_DPCD_QUIRK_NO_PSR)) {
drm_dbg_kms(display->drm,
@@ -696,8 +680,8 @@ static void _psr_init_dpcd(struct intel_dp *intel_dp, struct intel_connector *co
connector->dp.psr_caps.sync_latency = intel_dp_get_sink_sync_latency(intel_dp);
if (DISPLAY_VER(display) >= 9 &&
- connector->dp.psr_caps.dpcd[0] >= DP_PSR2_WITH_Y_COORD_IS_SUPPORTED) {
- bool y_req = connector->dp.psr_caps.dpcd[1] &
+ connector->dp.psr_caps.dpcd[INTEL_PSR_DPCD_INDEX(DP_PSR_SUPPORT)] >= DP_PSR2_WITH_Y_COORD_IS_SUPPORTED) {
+ bool y_req = connector->dp.psr_caps.dpcd[INTEL_PSR_DPCD_INDEX(DP_PSR_CAPS)] &
DP_PSR2_SU_Y_COORDINATE_REQUIRED;
/*
@@ -718,7 +702,7 @@ static void _psr_init_dpcd(struct intel_dp *intel_dp, struct intel_connector *co
}
if (connector->dp.psr_caps.su_support)
- _psr_compute_su_granularity(intel_dp, connector);
+ _psr_compute_su_granularity(connector);
}
void intel_psr_init_dpcd(struct intel_dp *intel_dp, struct intel_connector *connector)
@@ -777,7 +761,7 @@ static bool psr2_su_region_et_valid(struct intel_connector *connector, bool pane
return panel_replay ?
connector->dp.panel_replay_caps.dpcd[INTEL_PR_DPCD_INDEX(DP_PANEL_REPLAY_CAP_SUPPORT)] &
DP_PANEL_REPLAY_EARLY_TRANSPORT_SUPPORT :
- connector->dp.psr_caps.dpcd[0] == DP_PSR2_WITH_Y_COORD_ET_SUPPORTED;
+ connector->dp.psr_caps.dpcd[INTEL_PSR_DPCD_INDEX(DP_PSR_SUPPORT)] == DP_PSR2_WITH_Y_COORD_ET_SUPPORTED;
}
static void _panel_replay_enable_sink(struct intel_dp *intel_dp,
@@ -1415,7 +1399,7 @@ static int intel_psr_entry_setup_frames(struct intel_dp *intel_dp,
if (psr_setup_time < 0) {
drm_dbg_kms(display->drm,
"PSR condition failed: Invalid PSR setup time (0x%02x)\n",
- connector->dp.psr_caps.dpcd[1]);
+ connector->dp.psr_caps.dpcd[INTEL_PSR_DPCD_INDEX(DP_PSR_CAPS)]);
return -ETIME;
}
@@ -4222,8 +4206,8 @@ static void intel_psr_sink_capability(struct intel_connector *connector,
str_yes_no(connector->dp.psr_caps.support));
if (connector->dp.psr_caps.support)
- seq_printf(m, " [0x%02x]", connector->dp.psr_caps.dpcd[0]);
- if (connector->dp.psr_caps.dpcd[0] == DP_PSR2_WITH_Y_COORD_ET_SUPPORTED)
+ seq_printf(m, " [0x%02x]", connector->dp.psr_caps.dpcd[INTEL_PSR_DPCD_INDEX(DP_PSR_SUPPORT)]);
+ if (connector->dp.psr_caps.dpcd[INTEL_PSR_DPCD_INDEX(DP_PSR_SUPPORT)] == DP_PSR2_WITH_Y_COORD_ET_SUPPORTED)
seq_printf(m, " (Early Transport)");
seq_printf(m, ", Panel Replay = %s", str_yes_no(connector->dp.panel_replay_caps.support));
seq_printf(m, ", Panel Replay Selective Update = %s",
--
2.43.0
next prev parent reply other threads:[~2026-04-08 14:01 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-08 14:00 [PATCH 0/6] PSR/Panel Replay/ALPM logging improvements Jouni Högander
2026-04-08 14:00 ` [PATCH 1/7] drm/i915/psr: Improve PSR state information in crtc state dump Jouni Högander
2026-04-08 14:00 ` [PATCH 2/7] drm/i915/alpm: Dump out computed ALPM parameters " Jouni Högander
2026-04-08 14:00 ` [PATCH 3/7] drm/dp: Include PSR2 granularity registers into PSR capability size define Jouni Högander
2026-04-08 14:00 ` [PATCH 4/7] drm/i915/psr: Add new macro for accessing cached PSR DPCD registers Jouni Högander
2026-04-08 14:04 ` Jani Nikula
2026-04-08 14:00 ` Jouni Högander [this message]
2026-04-08 14:00 ` [PATCH 6/7] drm/i915/psr: Dump out PSR and Panel Replay " Jouni Högander
2026-04-08 14:00 ` [PATCH 7/7] drm/i915/alpm: Dump out ALPM capability DPCD register Jouni Högander
2026-04-08 14:09 ` ✗ CI.checkpatch: warning for PSR/Panel Replay/ALPM logging improvements Patchwork
2026-04-08 14:10 ` ✗ CI.KUnit: 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=20260408140059.252067-6-jouni.hogander@intel.com \
--to=jouni.hogander@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