From: Dibin Moolakadan Subrahmanian <dibin.moolakadan.subrahmanian@intel.com>
To: "Hogander, Jouni" <jouni.hogander@intel.com>,
"intel-xe@lists.freedesktop.org" <intel-xe@lists.freedesktop.org>,
"intel-gfx@lists.freedesktop.org"
<intel-gfx@lists.freedesktop.org>
Cc: "Shankar, Uma" <uma.shankar@intel.com>,
"Manna, Animesh" <animesh.manna@intel.com>,
"Deak, Imre" <imre.deak@intel.com>
Subject: Re: [PATCH 9/9] drm/i915/display: Add DC3CO disable handling for psr2
Date: Wed, 17 Dec 2025 13:20:13 +0530 [thread overview]
Message-ID: <7fbc8061-6e43-4fa6-9752-ab1f94f57a84@intel.com> (raw)
In-Reply-To: <ad4e1829187881b80784fa951d73f07a490ff16f.camel@intel.com>
[-- Attachment #1: Type: text/plain, Size: 7004 bytes --]
On 16-12-2025 14:00, Hogander, Jouni wrote:
> On Tue, 2025-12-16 at 13:54 +0530, Dibin Moolakadan Subrahmanian wrote:
> >
> >
> > On 12-12-2025 12:41, Hogander, Jouni wrote:
> >
> >> On Tue, 2025-12-09 at 17:03 +0530, Dibin Moolakadan Subrahmanian wrote:
> >>
> >>> dc6 should be enabled instead of dc3co after 6 idle frames
> >>> while in psr2.(re enable part of tgl dc3co handling)
> >> This is for PSR and pretty much following existing (disabled) TGL DC3CO
> >> control. What is your idea how selection between DC6 and DC3CO will be
> >> done in case of LOBF?
> > For both LOBF and PSR dc3co will be enabled from intel_atomic_commit_tail() it self.
> > This patch selects DC6 after 6 idle frames for PSR.
>
> But how you are planning to do the same for LOBF? I think they should have
> common control.
Planning not to enable DC6 for LOBF, only DC3CO will be enabled in LOBF.
> BR,
> Jouni Högander
>
> >
> >> BR,
> >>
> >> Jouni Högander
> >>
> >>
> >>> Signed-off-by: Dibin Moolakadan Subrahmanian
> >>> <dibin.moolakadan.subrahmanian@intel.com>
> >>> ---
> >>> .../drm/i915/display/intel_display_types.h | 1 +
> >>> drivers/gpu/drm/i915/display/intel_psr.c | 78
> >>> ++++++++++++++++++-
> >>> 2 files changed, 78 insertions(+), 1 deletion(-)
> >>>
> >>> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> >>> b/drivers/gpu/drm/i915/display/intel_display_types.h
> >>> index 27f69df7ee9c..6ff53cd58052 100644
> >>> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> >>> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> >>> @@ -1759,6 +1759,7 @@ struct intel_psr {
> >>> bool panel_replay_enabled;
> >>> u32 dc3co_exitline;
> >>> u32 dc3co_exit_delay;
> >>> + struct delayed_work dc3co_work;
> >>> u8 entry_setup_frames;
> >>>
> >>> u8 io_wake_lines;
> >>> diff --git a/drivers/gpu/drm/i915/display/intel_psr.c
> >>> b/drivers/gpu/drm/i915/display/intel_psr.c
> >>> index 18bf45455ea2..4be709d1d324 100644
> >>> --- a/drivers/gpu/drm/i915/display/intel_psr.c
> >>> +++ b/drivers/gpu/drm/i915/display/intel_psr.c
> >>> @@ -1157,6 +1157,78 @@ static void psr2_program_idle_frames(struct
> >>> intel_dp *intel_dp,
> >>> EDP_PSR2_IDLE_FRAMES(idle_frames));
> >>> }
> >>>
> >>> +static void psr2_dc3co_disable(struct intel_dp *intel_dp)
> >>> +{
> >>> + struct intel_display *display = to_intel_display(intel_dp);
> >>> + struct i915_power_domains *power_domains = &display-
> >>>
> >>>> power.domains;
> >>> +
> >>> + if ((power_domains->allowed_dc_mask &
> >>> DC_STATE_EN_UPTO_DC3CO) != DC_STATE_EN_UPTO_DC3CO)
> >>> + return;
> >>> +
> >>> + intel_display_power_set_target_dc_state(display,
> >>> DC_STATE_EN_UPTO_DC6);
> >>> + /* Todo restore PSR2 idle frames , ALPM control*/
> >>> +}
> >>> +
> >>> +static void psr2_dc3co_disable_on_exit(struct intel_dp *intel_dp)
> >>> +{
> >>> + struct intel_display *display = to_intel_display(intel_dp);
> >>> + struct i915_power_domains *power_domains = &display-
> >>>
> >>>> power.domains;
> >>> +
> >>> + if ((power_domains->allowed_dc_mask &
> >>> DC_STATE_EN_UPTO_DC3CO) != DC_STATE_EN_UPTO_DC3CO)
> >>> + return;
> >>> +
> >>> + cancel_delayed_work(&intel_dp->psr.dc3co_work);
> >>> + intel_dc3co_source_unset(display, DC3CO_SOURCE_PSR2);
> >>> +}
> >>> +
> >>> +static void psr2_dc3co_disable_work(struct work_struct *work)
> >>> +{
> >>> + struct intel_dp *intel_dp =
> >>> + container_of(work, typeof(*intel_dp),
> >>> psr.dc3co_work.work);
> >>> +
> >>> + mutex_lock(&intel_dp->psr.lock);
> >>> + /* If delayed work is pending, it is not idle */
> >>> + if (delayed_work_pending(&intel_dp->psr.dc3co_work))
> >>> + goto unlock;
> >>> + /* enable DC6 after idle frames*/
> >>> + psr2_dc3co_disable(intel_dp);
> >>> +
> >>> +unlock:
> >>> + mutex_unlock(&intel_dp->psr.lock);
> >>> +}
> >>> +
> >>> +/*
> >>> + * When we will be completely rely on PSR2 S/W tracking in future,
> >>> + * intel_psr_flush() will invalidate and flush the PSR for
> >>> ORIGIN_FLIP
> >>> + * event also therefore psr2_dc3co_flush_locked() require to be
> >>> changed
> >>> + * accordingly in future.
> >>> + */
> >>> +
> >>> +static void
> >>> +psr2_dc3co_flush_locked(struct intel_dp *intel_dp, unsigned int
> >>> frontbuffer_bits,
> >>> + enum fb_op_origin origin)
> >>> +{
> >>> + struct intel_display *display = to_intel_display(intel_dp);
> >>> + struct i915_power_domains *power_domains = &display-
> >>>
> >>>> power.domains;
> >>> +
> >>> + if (!(power_domains->allowed_dc_mask &
> >>> DC_STATE_EN_UPTO_DC3CO))
> >>> + return;
> >>> +
> >>> + if (!intel_dp->psr.sel_update_enabled ||
> >>> + !intel_dp->psr.active)
> >>> + return;
> >>> + /*
> >>> + * At every frontbuffer flush flip event modified delay of
> >>> delayed work,
> >>> + * when delayed work schedules that means display has been
> >>> idle.
> >>> + */
> >>> + if (!(frontbuffer_bits &
> >>> + INTEL_FRONTBUFFER_ALL_MASK(intel_dp->psr.pipe)))
> >>> + return;
> >>> +
> >>> + mod_delayed_work(display->wq.unordered, &intel_dp-
> >>>
> >>>> psr.dc3co_work,
> >>> + intel_dp->psr.dc3co_exit_delay);
> >>> +}
> >>> +
> >>> static bool intel_psr2_sel_fetch_config_valid(struct intel_dp
> >>> *intel_dp,
> >>> struct
> >>> intel_crtc_state *crtc_state)
> >>> {
> >>> @@ -2117,7 +2189,7 @@ static void intel_psr_exit(struct intel_dp
> >>> *intel_dp)
> >>> intel_de_rmw(display, TRANS_DP2_CTL(intel_dp-
> >>>
> >>>> psr.transcoder),
> >>> TRANS_DP2_PANEL_REPLAY_ENABLE, 0);
> >>> } else if (intel_dp->psr.sel_update_enabled) {
> >>> -
> >>> + psr2_dc3co_disable_on_exit(intel_dp);
> >>> val = intel_de_rmw(display,
> >>> EDP_PSR2_CTL(display,
> >>> cpu_transcoder),
> >>> EDP_PSR2_ENABLE, 0);
> >>> @@ -2259,6 +2331,7 @@ void intel_psr_disable(struct intel_dp
> >>> *intel_dp,
> >>>
> >>> mutex_unlock(&intel_dp->psr.lock);
> >>> cancel_work_sync(&intel_dp->psr.work);
> >>> + cancel_delayed_work_sync(&intel_dp->psr.dc3co_work);
> >>> }
> >>>
> >>> /**
> >>> @@ -2289,6 +2362,7 @@ void intel_psr_pause(struct intel_dp *intel_dp)
> >>> mutex_unlock(&psr->lock);
> >>>
> >>> cancel_work_sync(&psr->work);
> >>> + cancel_delayed_work_sync(&psr->dc3co_work);
> >>> }
> >>>
> >>> /**
> >>> @@ -3475,6 +3549,7 @@ void intel_psr_flush(struct intel_display
> >>> *display,
> >>> if (origin == ORIGIN_FLIP ||
> >>> (origin == ORIGIN_CURSOR_UPDATE &&
> >>> !intel_dp->psr.psr2_sel_fetch_enabled)) {
> >>> + psr2_dc3co_flush_locked(intel_dp,
> >>> frontbuffer_bits, origin);
> >>> goto unlock;
> >>> }
> >>>
> >>> @@ -3533,6 +3608,7 @@ void intel_psr_init(struct intel_dp *intel_dp)
> >>> intel_dp->psr.link_standby = connector-
> >>>
> >>>> panel.vbt.psr.full_link;
> >>>
> >>> INIT_WORK(&intel_dp->psr.work, intel_psr_work);
> >>> + INIT_DELAYED_WORK(&intel_dp->psr.dc3co_work,
> >>> psr2_dc3co_disable_work);
> >>> mutex_init(&intel_dp->psr.lock);
> >>> }
> >>>
>
[-- Attachment #2: Type: text/html, Size: 9119 bytes --]
next prev parent reply other threads:[~2025-12-17 7:50 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-09 11:33 [RFC PATCH 0/9] drm/i915/display: DC3CO support Dibin Moolakadan Subrahmanian
2025-12-09 11:33 ` [PATCH 1/9] drm/i915/display: Remove TGL " Dibin Moolakadan Subrahmanian
2025-12-09 11:33 ` [PATCH 2/9] drm/i915/display: Replace DC_STATE_EN_DC3CO with DC_STATE_EN_UPTO_DC3CO Dibin Moolakadan Subrahmanian
2026-01-05 12:45 ` Jani Nikula
2026-01-06 10:40 ` Dibin Moolakadan Subrahmanian
2025-12-09 11:33 ` [PATCH 3/9] drm/i915/display: Add DC3CO enable/disable support Dibin Moolakadan Subrahmanian
2025-12-09 11:33 ` [PATCH 4/9] drm/i915/display: Add DC3CO eligibility logic Dibin Moolakadan Subrahmanian
2026-01-05 12:55 ` Jani Nikula
2026-01-06 12:58 ` Dibin Moolakadan Subrahmanian
2026-01-07 9:14 ` Jani Nikula
2025-12-09 11:33 ` [PATCH 5/9] drm/i915/display: Track DC3CO enable source Dibin Moolakadan Subrahmanian
2026-01-05 12:56 ` Jani Nikula
2025-12-09 11:33 ` [PATCH 6/9] drm/i915/display: alpm enable DC3CO support Dibin Moolakadan Subrahmanian
2025-12-12 7:37 ` Hogander, Jouni
2025-12-16 6:08 ` Dibin Moolakadan Subrahmanian
2025-12-09 11:33 ` [PATCH 7/9] drm/i915/display: psr " Dibin Moolakadan Subrahmanian
2026-01-05 13:02 ` Jani Nikula
2026-01-06 13:10 ` Dibin Moolakadan Subrahmanian
2025-12-09 11:33 ` [PATCH 8/9] drm/i915/display: Add intel_dc3co_can_enable() helper Dibin Moolakadan Subrahmanian
2026-01-05 12:56 ` Jani Nikula
2025-12-09 11:33 ` [PATCH 9/9] drm/i915/display: Add DC3CO disable handling for psr2 Dibin Moolakadan Subrahmanian
2025-12-12 7:11 ` Hogander, Jouni
2025-12-16 8:24 ` Dibin Moolakadan Subrahmanian
2025-12-16 8:30 ` Hogander, Jouni
2025-12-17 7:50 ` Dibin Moolakadan Subrahmanian [this message]
2026-01-05 13:01 ` Jani Nikula
2026-01-06 13:28 ` Dibin Moolakadan Subrahmanian
2025-12-09 12:31 ` ✓ CI.KUnit: success for drm/i915/display: DC3CO support Patchwork
2025-12-09 12:46 ` ✗ CI.checksparse: warning " Patchwork
2025-12-09 13:36 ` ✗ Xe.CI.BAT: failure " Patchwork
2025-12-09 14:36 ` ✗ i915.CI.BAT: " Patchwork
2025-12-09 18:34 ` ✗ Xe.CI.Full: " 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=7fbc8061-6e43-4fa6-9752-ab1f94f57a84@intel.com \
--to=dibin.moolakadan.subrahmanian@intel.com \
--cc=animesh.manna@intel.com \
--cc=imre.deak@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=jouni.hogander@intel.com \
--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.