From: Matthew Auld <matthew.auld@intel.com>
To: intel-xe@lists.freedesktop.org
Subject: [CI 2/2] drm/xe/pm: skip BO eviction on iGPU for non-hibernation sleep
Date: Thu, 5 Nov 2026 14:35:49 +0000 [thread overview]
Message-ID: <20261105143547.1089207-4-matthew.auld@intel.com> (raw)
In-Reply-To: <20261105143547.1089207-3-matthew.auld@intel.com>
On iGPU platforms, system RAM and graphics stolen memory remain powered
during S2idle and S3 (< S4) suspend, so evicting user buffers or
preparing pinned BOs is unnecessary and needlessly purges DONTNEED
buffers in userspace caches.
Distinguish S4 hibernation (.freeze and PM_HIBERNATION_PREPARE) from
< S4 suspend (.suspend and PM_SUSPEND_PREPARE), and skip BO eviction on
iGPU when not creating a hibernation image.
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
---
drivers/gpu/drm/xe/xe_pci.c | 21 ++++++++++++++++++---
drivers/gpu/drm/xe/xe_pm.c | 25 +++++++++++++++++++------
drivers/gpu/drm/xe/xe_pm.h | 2 +-
3 files changed, 38 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
index ba23ec60477b..67be6e707361 100644
--- a/drivers/gpu/drm/xe/xe_pci.c
+++ b/drivers/gpu/drm/xe/xe_pci.c
@@ -1335,7 +1335,7 @@ static void d3cold_toggle(struct pci_dev *pdev, enum toggle_d3cold toggle)
}
}
-static int xe_pci_suspend(struct device *dev)
+static int __xe_pci_suspend(struct device *dev, bool hibernate)
{
struct pci_dev *pdev = to_pci_dev(dev);
struct xe_device *xe = pdev_to_xe_device(pdev);
@@ -1344,7 +1344,7 @@ static int xe_pci_suspend(struct device *dev)
if (xe_survivability_mode_is_boot_enabled(xe))
return -EBUSY;
- err = xe_pm_suspend(xe);
+ err = xe_pm_suspend(xe, hibernate);
if (err)
return err;
@@ -1362,6 +1362,16 @@ static int xe_pci_suspend(struct device *dev)
return 0;
}
+static int xe_pci_suspend(struct device *dev)
+{
+ return __xe_pci_suspend(dev, false);
+}
+
+static int xe_pci_freeze(struct device *dev)
+{
+ return __xe_pci_suspend(dev, true);
+}
+
static int xe_pci_resume(struct device *dev)
{
struct pci_dev *pdev = to_pci_dev(dev);
@@ -1491,7 +1501,12 @@ static int xe_pci_runtime_idle(struct device *dev)
}
static const struct dev_pm_ops xe_pm_ops = {
- SET_SYSTEM_SLEEP_PM_OPS(xe_pci_suspend, xe_pci_resume)
+ .suspend = pm_sleep_ptr(xe_pci_suspend),
+ .resume = pm_sleep_ptr(xe_pci_resume),
+ .freeze = pm_sleep_ptr(xe_pci_freeze),
+ .thaw = pm_sleep_ptr(xe_pci_resume),
+ .poweroff = pm_sleep_ptr(xe_pci_suspend),
+ .restore = pm_sleep_ptr(xe_pci_resume),
SET_RUNTIME_PM_OPS(xe_pci_runtime_suspend, xe_pci_runtime_resume, xe_pci_runtime_idle)
};
#endif
diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
index f483b565d323..a24424b0d1dd 100644
--- a/drivers/gpu/drm/xe/xe_pm.c
+++ b/drivers/gpu/drm/xe/xe_pm.c
@@ -166,13 +166,19 @@ static void xe_rpm_lockmap_release(const struct xe_device *xe)
&xe_pm_runtime_d3cold_map);
}
+static bool xe_pm_needs_bo_evict(struct xe_device *xe, bool hibernate)
+{
+ return IS_DGFX(xe) || hibernate;
+}
+
/**
- * xe_pm_suspend - Helper for System suspend, i.e. S0->S3 / S0->S2idle
+ * xe_pm_suspend - Helper for System suspend, i.e. S0->S3 / S0->S2idle / S0->S4
* @xe: xe device instance
+ * @hibernate: true if preparing for S4 hibernation, false for < S4 suspend
*
* Return: 0 on success
*/
-int xe_pm_suspend(struct xe_device *xe)
+int xe_pm_suspend(struct xe_device *xe, bool hibernate)
{
struct xe_gt *gt;
u8 id;
@@ -193,10 +199,12 @@ int xe_pm_suspend(struct xe_device *xe)
xe_display_pm_suspend(xe);
- /* FIXME: Super racey... */
- err = xe_bo_evict_all(xe);
- if (err)
- goto err_display;
+ if (xe_pm_needs_bo_evict(xe, hibernate)) {
+ /* FIXME: Super racey... */
+ err = xe_bo_evict_all(xe);
+ if (err)
+ goto err_display;
+ }
for_each_gt(gt, xe, id) {
err = xe_gt_suspend(gt);
@@ -452,8 +460,13 @@ static int xe_pm_notifier_callback(struct notifier_block *nb,
unsigned long action, void *data)
{
struct xe_device *xe = container_of(nb, struct xe_device, pm_notifier);
+ bool hibernate = (action == PM_HIBERNATION_PREPARE ||
+ action == PM_POST_HIBERNATION);
int err = 0;
+ if (!xe_pm_needs_bo_evict(xe, hibernate))
+ return NOTIFY_DONE;
+
switch (action) {
case PM_HIBERNATION_PREPARE:
case PM_SUSPEND_PREPARE:
diff --git a/drivers/gpu/drm/xe/xe_pm.h b/drivers/gpu/drm/xe/xe_pm.h
index 16d4e6c629f1..af81f2a2975f 100644
--- a/drivers/gpu/drm/xe/xe_pm.h
+++ b/drivers/gpu/drm/xe/xe_pm.h
@@ -13,7 +13,7 @@
struct xe_device;
-int xe_pm_suspend(struct xe_device *xe);
+int xe_pm_suspend(struct xe_device *xe, bool hibernate);
int xe_pm_resume(struct xe_device *xe);
int xe_pm_init_early(struct xe_device *xe);
--
2.56.0
next prev parent reply other threads:[~2026-11-05 14:36 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-05 14:35 [CI 1/2] drm/xe: only evict CCS buffers from TT on iGPU Matthew Auld
2026-11-05 14:35 ` Matthew Auld [this message]
2026-11-05 15:06 ` [CI 2/2] drm/xe/pm: skip BO eviction on iGPU for non-hibernation sleep sashiko-bot
2026-11-05 16:39 ` Matthew Auld
2026-11-05 14:53 ` ✓ CI.KUnit: success for series starting with [CI,1/2] drm/xe: only evict CCS buffers from TT on iGPU Patchwork
2026-11-05 15:38 ` ✓ Xe.CI.BAT: " Patchwork
2026-11-06 13:59 ` ✓ 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=20261105143547.1089207-4-matthew.auld@intel.com \
--to=matthew.auld@intel.com \
--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 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.