From: Jani Nikula <jani.nikula@linux.intel.com>
To: Vinod Govindapillai <vinod.govindapillai@intel.com>,
intel-xe@lists.freedesktop.org, intel-gfx@lists.freedesktop.org
Cc: vinod.govindapillai@intel.com, imre.deak@intel.com,
jouni.hogander@intel.com
Subject: Re: [PATCH v2 5/5] drm/xe/pm: handle the PME capability and runtime pm routines
Date: Fri, 04 Sep 2026 13:03:25 +0300 [thread overview]
Message-ID: <f5e074540e36b2c9fee11a9bfd14beabcc8cf016@intel.com> (raw)
In-Reply-To: <20260903080410.489411-6-vinod.govindapillai@intel.com>
On Thu, 03 Sep 2026, Vinod Govindapillai <vinod.govindapillai@intel.com> wrote:
> During the runtime suspend, check if device is capable of wakeup
> from PME. If yes update the helper so that IRQ reset and HPD
> polling can be handled accordingly. For PME capable devices,
> HPD related IRQs are not reset during runtime suspend and
> do not start polling for HPDs every 10s. Instead PME can be
> generated from HPDs and corresponding runtime resume calls
> can be invoked by PME.
>
> Bspec: 52979, 52980, 68857, 68867, 68970
> Assisted-by: GitHub_Copilot:claude-opus-5
> Signed-off-by: Vinod Govindapillai <vinod.govindapillai@intel.com>
> ---
> drivers/gpu/drm/xe/display/xe_display.c | 10 ++++++++++
> drivers/gpu/drm/xe/display/xe_display.h | 4 ++++
> drivers/gpu/drm/xe/xe_pci.c | 16 +++++++++++++++-
> 3 files changed, 29 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 7b25c0814674..ff4a74c5c763 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -236,6 +236,16 @@ void xe_display_irq_postinstall(struct xe_device *xe)
> intel_display_irq_postinstall(display);
> }
>
> +void xe_display_set_pme_capable(struct xe_device *xe, bool pme_from_hpd)
> +{
> + struct intel_display *display = xe->display;
> +
> + if (!xe->info.probe_display)
> + return;
> +
> + intel_hpd_set_pme_capable(display, pme_from_hpd);
The downside with this is that I've been trying hard to *reduce* the
number of direct low-level calls from i915 and xe core to display.
There are 100+ calls already. IMO we need to drop them to the ballpark
of less than half.
This would go directly to a TODO list of things to refactor and clean
up.
Feels like it would be more clean with a parent interface for the
display to ask if pme is available, when needed, even though the parent
interface is also too big...
BR,
Jani.
> +}
> +
> static bool suspend_to_idle(void)
> {
> #if IS_ENABLED(CONFIG_ACPI_SLEEP)
> diff --git a/drivers/gpu/drm/xe/display/xe_display.h b/drivers/gpu/drm/xe/display/xe_display.h
> index 0babb50bfc77..a77a8fa1d802 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.h
> +++ b/drivers/gpu/drm/xe/display/xe_display.h
> @@ -37,6 +37,8 @@ void xe_display_irq_enable(struct xe_device *xe, u32 gu_misc_iir);
> void xe_display_irq_reset(struct xe_device *xe);
> void xe_display_irq_postinstall(struct xe_device *xe);
>
> +void xe_display_set_pme_capable(struct xe_device *xe, bool pme_from_hpd);
> +
> void xe_display_pm_suspend(struct xe_device *xe);
> void xe_display_pm_suspend_late(struct xe_device *xe);
> void xe_display_pm_resume_early(struct xe_device *xe);
> @@ -75,6 +77,8 @@ static inline void xe_display_irq_enable(struct xe_device *xe, u32 gu_misc_iir)
> static inline void xe_display_irq_reset(struct xe_device *xe) {}
> static inline void xe_display_irq_postinstall(struct xe_device *xe) {}
>
> +static inline void xe_display_set_pme_capable(struct xe_device *xe, bool pme_from_hpd) {}
> +
> static inline void xe_display_pm_suspend(struct xe_device *xe) {}
> static inline void xe_display_pm_suspend_late(struct xe_device *xe) {}
> static inline void xe_display_pm_resume_early(struct xe_device *xe) {}
> diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
> index f8e16aefd2f8..46a33956c5b4 100644
> --- a/drivers/gpu/drm/xe/xe_pci.c
> +++ b/drivers/gpu/drm/xe/xe_pci.c
> @@ -1385,6 +1385,8 @@ static int xe_pci_runtime_suspend(struct device *dev)
> {
> struct pci_dev *pdev = to_pci_dev(dev);
> struct xe_device *xe = pdev_to_xe_device(pdev);
> + pci_power_t state = xe->d3cold.allowed ? PCI_D3cold : PCI_D3hot;
> + bool pme_capable = pci_enable_wake(pdev, state, true) == 0;
> int err;
>
> /*
> @@ -1396,9 +1398,17 @@ static int xe_pci_runtime_suspend(struct device *dev)
> xe_assert(xe, !IS_SRIOV_VF(xe));
> xe_assert(xe, !pci_num_vf(pdev));
>
> + xe_display_set_pme_capable(xe, pme_capable);
> +
> err = xe_pm_runtime_suspend(xe);
> - if (err)
> + if (err) {
> + if (pme_capable) {
> + pci_enable_wake(pdev, state, false);
> + xe_display_set_pme_capable(xe, false);
> + }
> +
> return err;
> + }
>
> pci_save_state(pdev);
>
> @@ -1419,12 +1429,16 @@ static int xe_pci_runtime_resume(struct device *dev)
> {
> struct pci_dev *pdev = to_pci_dev(dev);
> struct xe_device *xe = pdev_to_xe_device(pdev);
> + pci_power_t state = xe->d3cold.allowed ? PCI_D3cold : PCI_D3hot;
> int err;
>
> err = pci_set_power_state(pdev, PCI_D0);
> if (err)
> return err;
>
> + pci_enable_wake(pdev, state, false);
> + xe_display_set_pme_capable(xe, false);
> +
> pci_restore_state(pdev);
>
> if (xe->d3cold.allowed) {
--
Jani Nikula, Intel
next prev parent reply other threads:[~2026-09-04 10:03 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-03 8:04 [PATCH v2 0/5] PM_PME support on display hotplug Vinod Govindapillai
2026-09-03 8:04 ` [PATCH v2 1/5] drm/xe/pm: initialize the device's system wakeup capabilities Vinod Govindapillai
2026-09-03 8:15 ` sashiko-bot
2026-09-03 8:04 ` [PATCH v2 2/5] drm/i915/hotplug: add helpers to track HPDs can generate PME Vinod Govindapillai
2026-09-03 8:04 ` [PATCH v2 3/5] drm/i915/irq: conditional HPD IRQ resets based on PME capability Vinod Govindapillai
2026-09-03 8:32 ` sashiko-bot
2026-09-04 9:56 ` Jani Nikula
2026-09-04 12:12 ` Govindapillai, Vinod
2026-09-03 8:04 ` [PATCH v2 4/5] drm/i915/hotplug: avoid HPD polling if the device is PME capable Vinod Govindapillai
2026-09-03 8:04 ` [PATCH v2 5/5] drm/xe/pm: handle the PME capability and runtime pm routines Vinod Govindapillai
2026-09-03 12:36 ` [PATCH v3 " Vinod Govindapillai
2026-09-04 10:03 ` Jani Nikula [this message]
2026-09-08 6:19 ` [PATCH v2 " Hogander, Jouni
2026-09-08 7:41 ` Govindapillai, Vinod
2026-09-11 8:10 ` Govindapillai, Vinod
2026-09-11 12:47 ` Jani Nikula
2026-09-03 8:13 ` ✓ CI.KUnit: success for pm_pme support on display hotplug (rev3) Patchwork
2026-09-03 8:52 ` ✓ Xe.CI.BAT: " Patchwork
2026-09-03 10:26 ` ✓ i915.CI.BAT: " Patchwork
2026-09-03 12:45 ` ✓ CI.KUnit: success for pm_pme support on display hotplug (rev4) Patchwork
2026-09-03 13:46 ` ✓ Xe.CI.BAT: " Patchwork
2026-09-03 14:15 ` ✗ i915.CI.BAT: failure " Patchwork
2026-09-04 0:04 ` ✗ 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=f5e074540e36b2c9fee11a9bfd14beabcc8cf016@intel.com \
--to=jani.nikula@linux.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=vinod.govindapillai@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.